Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: NEOM9N_thread.cpp
- Revision:
- 72:b749014457b7
- Parent:
- 71:4bc51407bff0
--- a/NEOM9N_thread.cpp Sat Jun 18 18:36:19 2022 +0200
+++ b/NEOM9N_thread.cpp Sat Jun 18 21:39:32 2022 +0200
@@ -117,7 +117,7 @@
{
static char buffer[256]; // buffer to readout from the SerialBuffer
static char check_buffer[4]; // buffer to check if a seuenz is starting
- const static int msg_buffer_len = 96; // message length 94 + 2 (UBX_PAYLOAD_INDEX), do not know why +2, do not care
+ const static int msg_buffer_len = 100; // message length 94 + 2 (UBX_PAYLOAD_INDEX), do not know why +2, do not care
static char msg_buffer[msg_buffer_len]; // buffer to decode message
// ? | ? | PAYLOAD 92 | CK_A | CK_B
static uint8_t msg_buffer_cntr = 0;
@@ -133,64 +133,68 @@
for (uint32_t i = 0; i < read_len; i++) {
if (is_msg_sequenz) {
msg_buffer[msg_buffer_cntr++] = buffer[i];
- if (msg_buffer_cntr == msg_buffer_len) {
- ubxNavPVT_t ubxNavPVT = decodeUbxNavPVTmsg(msg_buffer);
- // update fixType and numSV always
- m_ubxNavPVT.fixType = ubxNavPVT.fixType;
- m_ubxNavPVT.numSV = ubxNavPVT.numSV;
- if(ubxNavPVT.fixType == 3 && ubxNavPVT.numSV >= M_MIN_SATS) {
- m_ubxNavPVT = ubxNavPVT;
- static bool is_reset_local_internal = false;
- if (!is_reset_local_internal) {
- reset_local();
- is_reset_local_internal = true;
- }
- m_pos_ecef = transformWGS84ToECEF(m_ubxNavPVT);
- m_pos_enu = m_R_ecefToLocal_0 * ( m_pos_ecef - m_pos_ecef_0 );
+ if (msg_buffer_cntr == msg_buffer_len) {
+ // checksum, we need to set those values because B5 62 01 07 are at the end of the message and we also need 01 and 07
+ uint8_t CK_A = 0x08; // 0x01 + 0x07
+ uint8_t CK_B = 0x09; // 0x01 + 0x01 + 0x07;
+ for (int i = 0; i < msg_buffer_len - 2 - 4; i++) {
+ CK_A += msg_buffer[i];
+ CK_B += CK_A;
}
- is_msg_sequenz = false;
- // HACK: update float sens_GPS[13]; // pos_enu(3), vel_enu(3), headMot, numSV, hAcc, vAcc, sAcc, headAcc, timestamp
- /*
- data.sens_GPS[0] = m_pos_enu(0);
- data.sens_GPS[1] = m_pos_enu(1);
- data.sens_GPS[2] = m_pos_enu(2);
- Eigen::Vector3f vel_enu = GetVelENU();
- data.sens_GPS[3] = vel_enu(0);
- data.sens_GPS[4] = vel_enu(1);
- data.sens_GPS[5] = vel_enu(2);
- data.sens_GPS[6] = GetHeadMot();
- data.sens_GPS[7] = (float)GetNumSV();
- data.sens_GPS[8] = GethAcc();
- data.sens_GPS[9] = GetvAcc();
- data.sens_GPS[10] = GetsAcc();
- data.sens_GPS[11] = GetHeadAcc();
- data.sens_GPS[12] = global_timer.read();
- */
+ // proceed if checksum is valid
+ if (CK_A == msg_buffer[msg_buffer_len - 2 - 4] && CK_B == msg_buffer[msg_buffer_len - 1 - 4]) {
+ ubxNavPVT_t ubxNavPVT = decodeUbxNavPVTmsg(msg_buffer);
+ // update fixType and numSV always
+ m_ubxNavPVT.fixType = ubxNavPVT.fixType;
+ m_ubxNavPVT.numSV = ubxNavPVT.numSV;
+ // update if fixtype 3 and numSV sufficent
+ if(ubxNavPVT.fixType == 3 && ubxNavPVT.numSV >= M_MIN_SATS) {
+ m_ubxNavPVT = ubxNavPVT;
+ static bool is_reset_local_internal = false;
+ if (!is_reset_local_internal) {
+ reset_local();
+ is_reset_local_internal = true;
+ }
+ m_pos_ecef = transformWGS84ToECEF(m_ubxNavPVT);
+ m_pos_enu = m_R_ecefToLocal_0 * ( m_pos_ecef - m_pos_ecef_0 );
+ }
+ is_msg_sequenz = false;
+ // HACK: update float sens_GPS[13]; // pos_enu(3), vel_enu(3), headMot, numSV, hAcc, vAcc, sAcc, headAcc, timestamp
+ /*
+ data.sens_GPS[0] = m_pos_enu(0);
+ data.sens_GPS[1] = m_pos_enu(1);
+ data.sens_GPS[2] = m_pos_enu(2);
+ Eigen::Vector3f vel_enu = GetVelENU();
+ data.sens_GPS[3] = vel_enu(0);
+ data.sens_GPS[4] = vel_enu(1);
+ data.sens_GPS[5] = vel_enu(2);
+ data.sens_GPS[6] = GetHeadMot();
+ data.sens_GPS[7] = (float)GetNumSV();
+ data.sens_GPS[8] = GethAcc();
+ data.sens_GPS[9] = GetvAcc();
+ data.sens_GPS[10] = GetsAcc();
+ data.sens_GPS[11] = GetHeadAcc();
+ data.sens_GPS[12] = global_timer.read();
+ */
#if PRINT_FOR_DEBUG
- printf("%d, %d, %d, %d\r\n", ubxNavPVT.numSV, ubxNavPVT.lon, ubxNavPVT.lat, ubxNavPVT.height);
-#endif
+ printf("%d, %d, %d, %d\r\n", ubxNavPVT.numSV, ubxNavPVT.lon, ubxNavPVT.lat, ubxNavPVT.height);
+#endif
+ }
}
}
// shift past readings and check if a message starts
- check_buffer[3] = check_buffer[2]; // UBX_PVT_HEADER_0
- check_buffer[2] = check_buffer[1]; // UBX_PVT_HEADER_1
- check_buffer[1] = check_buffer[0]; // UBX_PVT_CLASS
- check_buffer[0] = buffer[i]; // UBX_PVT_ID
+ check_buffer[3] = check_buffer[2]; // UBX_PVT_HEADER_0: 0xB5
+ check_buffer[2] = check_buffer[1]; // UBX_PVT_HEADER_1: 0x62
+ check_buffer[1] = check_buffer[0]; // UBX_PVT_CLASS : 0x01
+ check_buffer[0] = buffer[i]; // UBX_PVT_ID : 0x07
if(check_buffer[3] == UBX_PVT_HEADER_0 && check_buffer[2] == UBX_PVT_HEADER_1 && check_buffer[1] == UBX_PVT_CLASS && check_buffer[0] == UBX_PVT_ID) {
#if PRINT_FOR_DEBUG
int run_time = std::chrono::duration_cast<std::chrono::microseconds>(m_run_timer.elapsed_time()).count();
m_run_timer.reset();
printf("Time since last received package: %d, MSG len: %d\r\n", run_time, msg_buffer_cntr);
- /*
- printf("%02x, %02x, %02x, %02x\r\n", msg_buffer[msg_buffer_len-4], // this makes only sense if you use msg_buffer_len = 100
- msg_buffer[msg_buffer_len-3],
- msg_buffer[msg_buffer_len-2],
- msg_buffer[msg_buffer_len-1]);
- */
#endif
is_msg_sequenz = true;
msg_buffer_cntr = 0;
- //memset(msg_buffer, 0, sizeof(msg_buffer));
}
}
}