mirror of
https://github.com/paparazzi/paparazzi.git
synced 2026-06-04 13:55:40 +08:00
[ubx] improve ubx parser and ubx_ucenter module
- configurable data output rate - configurable baud rate (taken from GPS_BAUD variable) - add support of double and float to ubx parser - add option to configure RXM_RAW messages (on LEA-T versions)
This commit is contained in:
@@ -4,7 +4,9 @@
|
|||||||
<!DOCTYPE ubx SYSTEM "ubx.dtd">
|
<!DOCTYPE ubx SYSTEM "ubx.dtd">
|
||||||
|
|
||||||
<ubx>
|
<ubx>
|
||||||
|
|
||||||
<class name="NAV" ID="0x01">
|
<class name="NAV" ID="0x01">
|
||||||
|
|
||||||
<message name="POSLLH" ID="0x02" length="28">
|
<message name="POSLLH" ID="0x02" length="28">
|
||||||
<field name="ITOW" format="U4" unit="ms"/>
|
<field name="ITOW" format="U4" unit="ms"/>
|
||||||
<field name="LON" format="I4" scaling="1e-7" unit="deg"/>
|
<field name="LON" format="I4" scaling="1e-7" unit="deg"/>
|
||||||
@@ -93,6 +95,7 @@
|
|||||||
<field name="PRRes" format="I4" unit="cm"/>
|
<field name="PRRes" format="I4" unit="cm"/>
|
||||||
</block>
|
</block>
|
||||||
</message>
|
</message>
|
||||||
|
|
||||||
</class>
|
</class>
|
||||||
|
|
||||||
<class name="CFG" ID="0x06">
|
<class name="CFG" ID="0x06">
|
||||||
@@ -190,6 +193,7 @@
|
|||||||
<field name="res3" format="U4"/>
|
<field name="res3" format="U4"/>
|
||||||
<field name="res4" format="U4"/>
|
<field name="res4" format="U4"/>
|
||||||
</message>
|
</message>
|
||||||
|
|
||||||
</class>
|
</class>
|
||||||
|
|
||||||
<class name="ACK" ID="0x05">
|
<class name="ACK" ID="0x05">
|
||||||
@@ -198,6 +202,7 @@
|
|||||||
<field name="ClsID" format="U1"/>
|
<field name="ClsID" format="U1"/>
|
||||||
<field name="MsgID" format="U1"/>
|
<field name="MsgID" format="U1"/>
|
||||||
</message>
|
</message>
|
||||||
|
|
||||||
<message name="NAK" ID="0x00" length="2">
|
<message name="NAK" ID="0x00" length="2">
|
||||||
<field name="ClsID" format="U1"/>
|
<field name="ClsID" format="U1"/>
|
||||||
<field name="MsgID" format="U1"/>
|
<field name="MsgID" format="U1"/>
|
||||||
@@ -205,6 +210,26 @@
|
|||||||
|
|
||||||
</class>
|
</class>
|
||||||
|
|
||||||
|
<class name="RXM" ID="0x02">
|
||||||
|
|
||||||
|
<message name="RAW" ID="0x10">
|
||||||
|
<field name="iTOW" format="I4" unit="ms"/>
|
||||||
|
<field name="week" format="I2" unit="weeks"/>
|
||||||
|
<field name="numSV" format="U1"/>
|
||||||
|
<field name="reserverd1" format="U1"/>
|
||||||
|
<block length="24">
|
||||||
|
<field name="cpMes" format="R8" unit="cycles"/>
|
||||||
|
<field name="prMes" format="R8" unit="m"/>
|
||||||
|
<field name="doMes" format="R4" unit="Hz"/>
|
||||||
|
<field name="sv" format="U1"/>
|
||||||
|
<field name="mesQI" format="I1"/>
|
||||||
|
<field name="cno" format="I1" unit="dbHz"/>
|
||||||
|
<field name="lli" format="U1"/>
|
||||||
|
</block>
|
||||||
|
</message>
|
||||||
|
|
||||||
|
</class>
|
||||||
|
|
||||||
<class name="MON" ID="0x0A">
|
<class name="MON" ID="0x0A">
|
||||||
|
|
||||||
<message name="GET_VER" ID="0x04" length="0">
|
<message name="GET_VER" ID="0x04" length="0">
|
||||||
|
|||||||
@@ -285,6 +285,10 @@ static inline void gps_ubx_ucenter_config_nav(void)
|
|||||||
#define _UBX_GPS_BAUD(_u) __UBX_GPS_BAUD(_u)
|
#define _UBX_GPS_BAUD(_u) __UBX_GPS_BAUD(_u)
|
||||||
#define UBX_GPS_BAUD _UBX_GPS_BAUD(GPS_LINK)
|
#define UBX_GPS_BAUD _UBX_GPS_BAUD(GPS_LINK)
|
||||||
|
|
||||||
|
#ifndef GPS_UBX_UCENTER_RATE
|
||||||
|
#define GPS_UBX_UCENTER_RATE 0x00FA
|
||||||
|
#endif
|
||||||
|
|
||||||
static inline void gps_ubx_ucenter_config_port(void)
|
static inline void gps_ubx_ucenter_config_port(void)
|
||||||
{
|
{
|
||||||
// I2C Interface
|
// I2C Interface
|
||||||
@@ -293,7 +297,7 @@ static inline void gps_ubx_ucenter_config_port(void)
|
|||||||
#endif
|
#endif
|
||||||
// UART Interface
|
// UART Interface
|
||||||
#if GPS_PORT_ID == GPS_PORT_UART1 || GPS_PORT_ID == GPS_PORT_UART2
|
#if GPS_PORT_ID == GPS_PORT_UART1 || GPS_PORT_ID == GPS_PORT_UART2
|
||||||
UbxSend_CFG_PRT(GPS_PORT_ID, 0x0, 0x0, 0x000008D0, 38400, UBX_PROTO_MASK, UBX_PROTO_MASK, 0x0, 0x0);
|
UbxSend_CFG_PRT(GPS_PORT_ID, 0x0, 0x0, 0x000008D0, UBX_GPS_BAUD, UBX_PROTO_MASK, UBX_PROTO_MASK, 0x0, 0x0);
|
||||||
#endif
|
#endif
|
||||||
#if GPS_PORT_ID == GPS_PORT_USB
|
#if GPS_PORT_ID == GPS_PORT_USB
|
||||||
UbxSend_CFG_PRT(GPS_PORT_ID, 0x0, 0x0, 0x0, 0, UBX_PROTO_MASK, UBX_PROTO_MASK, 0x0, 0x0);
|
UbxSend_CFG_PRT(GPS_PORT_ID, 0x0, 0x0, 0x0, 0, UBX_PROTO_MASK, UBX_PROTO_MASK, 0x0, 0x0);
|
||||||
@@ -374,8 +378,8 @@ static bool_t gps_ubx_ucenter_configure(uint8_t nr)
|
|||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
// Now the GPS baudrate should have changed
|
// Now the GPS baudrate should have changed
|
||||||
GpsUartSetBaudrate(B38400);
|
GpsUartSetBaudrate(UBX_GPS_BAUD);
|
||||||
gps_ubx_ucenter.baud_run = 38400;
|
gps_ubx_ucenter.baud_run = UBX_GPS_BAUD;
|
||||||
gps_ubx_ucenter_config_nav();
|
gps_ubx_ucenter_config_nav();
|
||||||
break;
|
break;
|
||||||
case 7:
|
case 7:
|
||||||
@@ -405,13 +409,18 @@ static bool_t gps_ubx_ucenter_configure(uint8_t nr)
|
|||||||
gps_ubx_ucenter_config_sbas();
|
gps_ubx_ucenter_config_sbas();
|
||||||
break;
|
break;
|
||||||
case 14:
|
case 14:
|
||||||
UbxSend_CFG_RATE(0x00FA, 0x0001, 0x0000);
|
UbxSend_CFG_RATE(GPS_UBX_UCENTER_RATE, 0x0001, 0x0000);
|
||||||
break;
|
break;
|
||||||
case 15:
|
case 15:
|
||||||
|
#if USE_GPS_UBX_RXM_RAW
|
||||||
|
gps_ubx_ucenter_enable_msg(UBX_RXM_ID, UBX_RXM_RAW_ID, 1);
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
case 16:
|
||||||
// Try to save on non-ROM devices...
|
// Try to save on non-ROM devices...
|
||||||
UbxSend_CFG_CFG(0x00000000,0xffffffff,0x00000000);
|
UbxSend_CFG_CFG(0x00000000,0xffffffff,0x00000000);
|
||||||
break;
|
break;
|
||||||
case 16:
|
case 17:
|
||||||
#if DEBUG_GPS_UBX_UCENTER
|
#if DEBUG_GPS_UBX_UCENTER
|
||||||
// Debug Downlink the result of all configuration steps: see messages
|
// Debug Downlink the result of all configuration steps: see messages
|
||||||
DOWNLINK_SEND_DEBUG(DefaultChannel, DefaultDevice,GPS_UBX_UCENTER_CONFIG_STEPS,gps_ubx_ucenter.replies);
|
DOWNLINK_SEND_DEBUG(DefaultChannel, DefaultDevice,GPS_UBX_UCENTER_CONFIG_STEPS,gps_ubx_ucenter.replies);
|
||||||
|
|||||||
@@ -31,7 +31,7 @@
|
|||||||
#include "std.h"
|
#include "std.h"
|
||||||
|
|
||||||
/** U-Center Variables */
|
/** U-Center Variables */
|
||||||
#define GPS_UBX_UCENTER_CONFIG_STEPS 17
|
#define GPS_UBX_UCENTER_CONFIG_STEPS 18
|
||||||
|
|
||||||
struct gps_ubx_ucenter_struct
|
struct gps_ubx_ucenter_struct
|
||||||
{
|
{
|
||||||
@@ -39,8 +39,8 @@ struct gps_ubx_ucenter_struct
|
|||||||
uint8_t reply;
|
uint8_t reply;
|
||||||
uint8_t cnt;
|
uint8_t cnt;
|
||||||
|
|
||||||
uint16_t baud_init;
|
uint32_t baud_init;
|
||||||
uint16_t baud_run;
|
uint32_t baud_run;
|
||||||
|
|
||||||
uint8_t sw_ver_h;
|
uint8_t sw_ver_h;
|
||||||
uint8_t sw_ver_l;
|
uint8_t sw_ver_l;
|
||||||
|
|||||||
@@ -57,6 +57,10 @@
|
|||||||
|
|
||||||
struct GpsUbx gps_ubx;
|
struct GpsUbx gps_ubx;
|
||||||
|
|
||||||
|
#if USE_GPS_UBX_RXM_RAW
|
||||||
|
struct GpsUbxRaw gps_ubx_raw;
|
||||||
|
#endif
|
||||||
|
|
||||||
void gps_impl_init(void) {
|
void gps_impl_init(void) {
|
||||||
gps_ubx.status = UNINIT;
|
gps_ubx.status = UNINIT;
|
||||||
gps_ubx.msg_available = FALSE;
|
gps_ubx.msg_available = FALSE;
|
||||||
@@ -161,6 +165,25 @@ void gps_ubx_read_message(void) {
|
|||||||
gps_ubx.sol_flags = UBX_NAV_SOL_Flags(gps_ubx.msg_buf);
|
gps_ubx.sol_flags = UBX_NAV_SOL_Flags(gps_ubx.msg_buf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#if USE_GPS_UBX_RXM_RAW
|
||||||
|
else if (gps_ubx.msg_class == UBX_RXM_ID) {
|
||||||
|
if (gps_ubx.msg_id == UBX_RXM_RAW_ID) {
|
||||||
|
gps_ubx_raw.iTOW = UBX_RXM_RAW_iTOW(gps_ubx.msg_buf);
|
||||||
|
gps_ubx_raw.week = UBX_RXM_RAW_week(gps_ubx.msg_buf);
|
||||||
|
gps_ubx_raw.numSV = UBX_RXM_RAW_numSV(gps_ubx.msg_buf);
|
||||||
|
uint8_t i;
|
||||||
|
for (i = 0; i < gps_ubx_raw.numSV; i++) {
|
||||||
|
gps_ubx_raw.measures[i].cpMes = UBX_RXM_RAW_cpMes(gps_ubx.msg_buf, i);
|
||||||
|
gps_ubx_raw.measures[i].prMes = UBX_RXM_RAW_prMes(gps_ubx.msg_buf, i);
|
||||||
|
gps_ubx_raw.measures[i].doMes = UBX_RXM_RAW_doMes(gps_ubx.msg_buf, i);
|
||||||
|
gps_ubx_raw.measures[i].sv = UBX_RXM_RAW_sv(gps_ubx.msg_buf, i);
|
||||||
|
gps_ubx_raw.measures[i].mesQI = UBX_RXM_RAW_mesQI(gps_ubx.msg_buf, i);
|
||||||
|
gps_ubx_raw.measures[i].cno = UBX_RXM_RAW_cno(gps_ubx.msg_buf, i);
|
||||||
|
gps_ubx_raw.measures[i].lli = UBX_RXM_RAW_lli(gps_ubx.msg_buf, i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -56,10 +56,31 @@ struct GpsUbx {
|
|||||||
uint8_t status_flags;
|
uint8_t status_flags;
|
||||||
uint8_t sol_flags;
|
uint8_t sol_flags;
|
||||||
uint8_t have_velned;
|
uint8_t have_velned;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct GpsUbx gps_ubx;
|
extern struct GpsUbx gps_ubx;
|
||||||
|
|
||||||
|
#if USE_GPS_UBX_RXM_RAW
|
||||||
|
struct GpsUbxRawMes {
|
||||||
|
double cpMes;
|
||||||
|
double prMes;
|
||||||
|
float doMes;
|
||||||
|
uint8_t sv;
|
||||||
|
int8_t mesQI;
|
||||||
|
int8_t cno;
|
||||||
|
uint8_t lli;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GpsUbxRaw {
|
||||||
|
int32_t iTOW;
|
||||||
|
int16_t week;
|
||||||
|
uint8_t numSV;
|
||||||
|
struct GpsUbxRawMes measures[GPS_NB_CHANNELS];
|
||||||
|
};
|
||||||
|
|
||||||
|
extern struct GpsUbxRaw gps_ubx_raw;
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This part is used by the autopilot to read data from a uart
|
* This part is used by the autopilot to read data from a uart
|
||||||
|
|||||||
+15
-5
@@ -27,7 +27,8 @@ open Printf
|
|||||||
let out = stdout
|
let out = stdout
|
||||||
|
|
||||||
let sizeof = function
|
let sizeof = function
|
||||||
"U4" | "I4" -> 4
|
| "R8" -> 8
|
||||||
|
| "U4" | "I4" | "R4" -> 4
|
||||||
| "U2" | "I2" -> 2
|
| "U2" | "I2" -> 2
|
||||||
| "U1" | "I1" -> 1
|
| "U1" | "I1" -> 1
|
||||||
| x -> failwith (sprintf "sizeof: unknown format '%s'" x)
|
| x -> failwith (sprintf "sizeof: unknown format '%s'" x)
|
||||||
@@ -36,12 +37,14 @@ let (+=) = fun r x -> r := !r + x
|
|||||||
|
|
||||||
let c_type = fun format ->
|
let c_type = fun format ->
|
||||||
match format with
|
match format with
|
||||||
"I2" -> "int16_t"
|
| "R8" -> "double"
|
||||||
|
| "R4" -> "float"
|
||||||
| "I4" -> "int32_t"
|
| "I4" -> "int32_t"
|
||||||
| "U2" -> "uint16_t"
|
|
||||||
| "U4" -> "uint32_t"
|
| "U4" -> "uint32_t"
|
||||||
| "U1" -> "uint8_t"
|
| "I2" -> "int16_t"
|
||||||
|
| "U2" -> "uint16_t"
|
||||||
| "I1" -> "int8_t"
|
| "I1" -> "int8_t"
|
||||||
|
| "U1" -> "uint8_t"
|
||||||
| _ -> failwith (sprintf "Gen_ubx.c_type: unknown format '%s'" format)
|
| _ -> failwith (sprintf "Gen_ubx.c_type: unknown format '%s'" format)
|
||||||
|
|
||||||
let get_at = fun offset format block_size ->
|
let get_at = fun offset format block_size ->
|
||||||
@@ -49,7 +52,14 @@ let get_at = fun offset format block_size ->
|
|||||||
let block_offset =
|
let block_offset =
|
||||||
if block_size = 0 then "" else sprintf "+%d*_ubx_block" block_size in
|
if block_size = 0 then "" else sprintf "+%d*_ubx_block" block_size in
|
||||||
match format with
|
match format with
|
||||||
"U4" | "I4" -> sprintf "(%s)(*((uint8_t*)_ubx_payload+%d%s)|*((uint8_t*)_ubx_payload+1+%d%s)<<8|((%s)*((uint8_t*)_ubx_payload+2+%d%s))<<16|((%s)*((uint8_t*)_ubx_payload+3+%d%s))<<24)" t offset block_offset offset block_offset t offset block_offset t offset block_offset
|
| "R8" ->
|
||||||
|
let s = ref (sprintf "*((uint8_t*)_ubx_payload+%d%s)" offset block_offset) in
|
||||||
|
for i = 1 to 7 do
|
||||||
|
s := !s ^ sprintf "|((uint64_t)*((uint8_t*)_ubx_payload+%d+%d%s))<<%d" i offset block_offset (8*i)
|
||||||
|
done;
|
||||||
|
sprintf "({ union { uint64_t u; double f; } _f; _f.u = (uint64_t)(%s); /*Swap32IfBigEndian(_f.u)*/; _f.f; })" !s
|
||||||
|
| "R4" -> sprintf "({ union { uint32_t u; float f; } _f; _f.u = (uint32_t)(*((uint8_t*)_ubx_payload+%d%s)|*((uint8_t*)_ubx_payload+1+%d%s)<<8|((uint32_t)*((uint8_t*)_ubx_payload+2+%d%s))<<16|((uint32_t)*((uint8_t*)_ubx_payload+3+%d%s))<<24); _f.f; })" offset block_offset offset block_offset offset block_offset offset block_offset
|
||||||
|
| "U4" | "I4" -> sprintf "(%s)(*((uint8_t*)_ubx_payload+%d%s)|*((uint8_t*)_ubx_payload+1+%d%s)<<8|((%s)*((uint8_t*)_ubx_payload+2+%d%s))<<16|((%s)*((uint8_t*)_ubx_payload+3+%d%s))<<24)" t offset block_offset offset block_offset t offset block_offset t offset block_offset
|
||||||
| "U2" | "I2" -> sprintf "(%s)(*((uint8_t*)_ubx_payload+%d%s)|*((uint8_t*)_ubx_payload+1+%d%s)<<8)" t offset block_offset offset block_offset
|
| "U2" | "I2" -> sprintf "(%s)(*((uint8_t*)_ubx_payload+%d%s)|*((uint8_t*)_ubx_payload+1+%d%s)<<8)" t offset block_offset offset block_offset
|
||||||
| "U1" | "I1" -> sprintf "(%s)(*((uint8_t*)_ubx_payload+%d%s))" t offset block_offset
|
| "U1" | "I1" -> sprintf "(%s)(*((uint8_t*)_ubx_payload+%d%s))" t offset block_offset
|
||||||
| _ -> failwith (sprintf "Gen_ubx.c_type: unknown format '%s'" format)
|
| _ -> failwith (sprintf "Gen_ubx.c_type: unknown format '%s'" format)
|
||||||
|
|||||||
Reference in New Issue
Block a user