Skip to content

Commit

Permalink
gps: extract Septentrio GPS driver into separate module
Browse files Browse the repository at this point in the history
Having a generic interface over the GPS drivers makes dedicated
functionality for each driver harder. Move the Septentrio driver into
its own module under the `gnss` driver directory, and let it have its
own parameters for only the functionality it requires. This also helps
with adding new features because they only need to be implemented for
the driver that wants it, simplifying testing.
  • Loading branch information
flyingthingsintothings authored and AlexKlimaj committed May 7, 2024
1 parent df17655 commit 13a1cf1
Show file tree
Hide file tree
Showing 11 changed files with 2,342 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/drivers/gnss/Kconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
rsource "*/Kconfig"
45 changes: 45 additions & 0 deletions src/drivers/gnss/septentrio/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
############################################################################
#
# Copyright (c) 2024 PX4 Development Team. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in
# the documentation and/or other materials provided with the
# distribution.
# 3. Neither the name PX4 nor the names of its contributors may be
# used to endorse or promote products derived from this software
# without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
############################################################################

px4_add_module(
MODULE driver__septentrio
MAIN septentrio
COMPILE_FLAGS
-Wno-stringop-overflow # due to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91707
SRCS
septentrio.cpp
util.cpp
rtcm.cpp
MODULE_CONFIG
module.yaml
)
5 changes: 5 additions & 0 deletions src/drivers/gnss/septentrio/Kconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
menuconfig DRIVERS_GNSS_SEPTENTRIO
bool "Septentrio GNSS receivers"
default n
---help---
Enable support for Septentrio receivers
75 changes: 75 additions & 0 deletions src/drivers/gnss/septentrio/module.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
module_name: Septentrio

serial_config:
- command: septentrio start -d ${SERIAL_DEV}
port_config_param:
name: SEP_PORT_CONFIG
group: Septentrio GNSS Receiver
default: GPS1
label: GPS Port

parameters:
- group: Septentrio GNSS Receiver
definitions:
SEP_YAW_OFFS:
description:
short: Heading/Yaw offset for dual antenna GPS
long: |
Heading offset angle for dual antenna GPS setups that support heading estimation.
Set this to 0 if the antennas are parallel to the forward-facing direction
of the vehicle and the rover antenna is in front.
The offset angle increases clockwise.
Set this to 90 if the rover antenna is placed on the
right side of the vehicle and the moving base antenna is on the left side.
type: float
decimal: 3
default: 0
min: 0
max: 360
unit: deg
reboot_required: true
SEP_SAT_INFO:
description:
short: Enable sat info
long: |
Enable publication of satellite info (ORB_ID(satellite_info)) if possible.
type: boolean
default: 0
reboot_required: true
SEP_PITCH_OFFS:
description:
short: Pitch offset for dual antenna GPS
long: |
Vertical offsets can be compensated for by adjusting the Pitch offset.
Note that this can be interpreted as the "roll" angle in case the antennas are aligned along the perpendicular axis.
This occurs in situations where the two antenna ARPs may not be exactly at the same height in the vehicle reference frame.
Since pitch is defined as the right-handed rotation about the vehicle Y axis,
a situation where the main antenna is mounted lower than the aux antenna (assuming the default antenna setup) will result in a positive pitch.
type: float
decimal: 3
default: 0
min: -90
max: 90
unit: deg
reboot_required: true
SEP_DUMP_COMM:
description:
short: Log GPS communication data
long: |
If this is set to 1, all GPS communication data will be published via uORB,
and written to the log file as gps_dump message.
If this is set to 2, the main GPS is configured to output RTCM data,
which is then logged as gps_dump and can be used for PPK.
type: enum
default: 0
min: 0
max: 2
values:
0: Disable
1: Full communication
2: RTCM output (PPK)
87 changes: 87 additions & 0 deletions src/drivers/gnss/septentrio/rtcm.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
/****************************************************************************
*
* Copyright (c) 2018 PX4 Development Team. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name PX4 nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/

#include "rtcm.h"
#include <cstring>

RTCMParsing::RTCMParsing()
{
reset();
}

RTCMParsing::~RTCMParsing()
{
delete[] _buffer;
}

void RTCMParsing::reset()
{
if (!_buffer) {
_buffer = new uint8_t[RTCM_INITIAL_BUFFER_LENGTH];
_buffer_len = RTCM_INITIAL_BUFFER_LENGTH;
}

_pos = 0;
_message_length = _buffer_len;
}

bool RTCMParsing::addByte(uint8_t b)
{
if (!_buffer) {
return false;
}

_buffer[_pos++] = b;

if (_pos == 3) {
_message_length = (((uint16_t)_buffer[1] & 3) << 8) | (_buffer[2]);

if (_message_length + 6 > _buffer_len) {
uint16_t new_buffer_len = _message_length + 6;
uint8_t *new_buffer = new uint8_t[new_buffer_len];

if (!new_buffer) {
delete[](_buffer);
_buffer = nullptr;
return false;
}

memcpy(new_buffer, _buffer, 3);
delete[](_buffer);
_buffer = new_buffer;
_buffer_len = new_buffer_len;
}
}

return _message_length + 6 == _pos;
}
70 changes: 70 additions & 0 deletions src/drivers/gnss/septentrio/rtcm.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
/****************************************************************************
*
* Copyright (c) 2018 PX4 Development Team. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name PX4 nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/

#pragma once

#include <cstdint>

/* RTCM3 */
#define RTCM3_PREAMBLE 0xD3
#define RTCM_INITIAL_BUFFER_LENGTH 300 /**< initial maximum message length of an RTCM message */


class RTCMParsing
{
public:
RTCMParsing();
~RTCMParsing();

/**
* reset the parsing state
*/
void reset();

/**
* add a byte to the message
* @param b
* @return true if message complete (use @message to get it)
*/
bool addByte(uint8_t b);

uint8_t *message() const { return _buffer; }
uint16_t messageLength() const { return _pos; }
uint16_t messageId() const { return (_buffer[3] << 4) | (_buffer[4] >> 4); }

private:
uint8_t *_buffer{nullptr};
uint16_t _buffer_len{};
uint16_t _pos{}; ///< next position in buffer
uint16_t _message_length{}; ///< message length without header & CRC (both 3 bytes)
};
Loading

0 comments on commit 13a1cf1

Please sign in to comment.