forked from Archive/PX4-Autopilot
Store hash instead of full strings for SW & HW version
This commit is contained in:
parent
243db01a37
commit
0ffb123701
|
@ -72,6 +72,10 @@
|
||||||
#define MIN(X,Y) ((X) < (Y) ? (X) : (Y))
|
#define MIN(X,Y) ((X) < (Y) ? (X) : (Y))
|
||||||
#define SWAP16(X) ((((X) >> 8) & 0x00ff) | (((X) << 8) & 0xff00))
|
#define SWAP16(X) ((((X) >> 8) & 0x00ff) | (((X) << 8) & 0xff00))
|
||||||
|
|
||||||
|
#define FNV1_32_INIT ((uint32_t)0x811c9dc5) // init value for FNV1 hash algorithm
|
||||||
|
#define FNV1_32_PRIME ((uint32_t)0x01000193) // magic prime for FNV1 hash algorithm
|
||||||
|
|
||||||
|
|
||||||
/**** Trace macros, disable for production builds */
|
/**** Trace macros, disable for production builds */
|
||||||
#define UBX_TRACE_PARSER(s, ...) {/*printf(s, ## __VA_ARGS__);*/} /* decoding progress in parse_char() */
|
#define UBX_TRACE_PARSER(s, ...) {/*printf(s, ## __VA_ARGS__);*/} /* decoding progress in parse_char() */
|
||||||
#define UBX_TRACE_RXMSG(s, ...) {/*printf(s, ## __VA_ARGS__);*/} /* Rx msgs in payload_rx_done() */
|
#define UBX_TRACE_RXMSG(s, ...) {/*printf(s, ## __VA_ARGS__);*/} /* Rx msgs in payload_rx_done() */
|
||||||
|
@ -90,11 +94,10 @@ UBX::UBX(const int &fd, struct vehicle_gps_position_s *gps_position, struct sate
|
||||||
_got_posllh(false),
|
_got_posllh(false),
|
||||||
_got_velned(false),
|
_got_velned(false),
|
||||||
_disable_cmd_last(0),
|
_disable_cmd_last(0),
|
||||||
_ack_waiting_msg(0)
|
_ack_waiting_msg(0),
|
||||||
|
_ubx_version(0)
|
||||||
{
|
{
|
||||||
decode_init();
|
decode_init();
|
||||||
memset(_ubx_sw_version, 0, sizeof(_ubx_sw_version));
|
|
||||||
memset(_ubx_hw_version, 0, sizeof(_ubx_hw_version));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
UBX::~UBX()
|
UBX::~UBX()
|
||||||
|
@ -633,18 +636,19 @@ UBX::payload_rx_add_mon_ver(const uint8_t b)
|
||||||
_buf.raw[_rx_payload_index] = b;
|
_buf.raw[_rx_payload_index] = b;
|
||||||
} else {
|
} else {
|
||||||
if (_rx_payload_index == sizeof(ubx_payload_rx_mon_ver_part1_t)) {
|
if (_rx_payload_index == sizeof(ubx_payload_rx_mon_ver_part1_t)) {
|
||||||
// Part 1 complete: decode Part 1 buffer
|
// Part 1 complete: decode Part 1 buffer and calculate hash for SW&HW version strings
|
||||||
strncpy(_ubx_sw_version, (char*)_buf.payload_rx_mon_ver_part1.swVersion, sizeof(_ubx_sw_version));
|
_ubx_version = fnv1_32_str(_buf.payload_rx_mon_ver_part1.swVersion, FNV1_32_INIT);
|
||||||
strncpy(_ubx_hw_version, (char*)_buf.payload_rx_mon_ver_part1.hwVersion, sizeof(_ubx_hw_version));
|
_ubx_version = fnv1_32_str(_buf.payload_rx_mon_ver_part1.hwVersion, _ubx_version);
|
||||||
UBX_WARN("VER sw %30s", _ubx_sw_version);
|
UBX_WARN("VER hash 0x%08x", _ubx_version);
|
||||||
UBX_WARN("VER hw %10s", _ubx_hw_version);
|
UBX_WARN("VER hw \"%10s\"", _buf.payload_rx_mon_ver_part1.hwVersion);
|
||||||
|
UBX_WARN("VER sw \"%30s\"", _buf.payload_rx_mon_ver_part1.swVersion);
|
||||||
}
|
}
|
||||||
// fill Part 2 buffer
|
// fill Part 2 buffer
|
||||||
unsigned buf_index = (_rx_payload_index - sizeof(ubx_payload_rx_mon_ver_part1_t)) % sizeof(ubx_payload_rx_mon_ver_part2_t);
|
unsigned buf_index = (_rx_payload_index - sizeof(ubx_payload_rx_mon_ver_part1_t)) % sizeof(ubx_payload_rx_mon_ver_part2_t);
|
||||||
_buf.raw[buf_index] = b;
|
_buf.raw[buf_index] = b;
|
||||||
if (buf_index == sizeof(ubx_payload_rx_mon_ver_part2_t) - 1) {
|
if (buf_index == sizeof(ubx_payload_rx_mon_ver_part2_t) - 1) {
|
||||||
// Part 2 complete: decode Part 2 buffer
|
// Part 2 complete: decode Part 2 buffer
|
||||||
UBX_WARN("VER ext %30s", _buf.payload_rx_mon_ver_part2.extension);
|
UBX_WARN("VER ext \" %30s\"", _buf.payload_rx_mon_ver_part2.extension);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -877,3 +881,29 @@ UBX::send_message(const uint16_t msg, const uint8_t *payload, const uint16_t len
|
||||||
write(_fd, (const void *)payload, length);
|
write(_fd, (const void *)payload, length);
|
||||||
write(_fd, (const void *)&checksum, sizeof(checksum));
|
write(_fd, (const void *)&checksum, sizeof(checksum));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t
|
||||||
|
UBX::fnv1_32_str(uint8_t *str, uint32_t hval)
|
||||||
|
{
|
||||||
|
uint8_t *s = str;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FNV-1 hash each octet in the buffer
|
||||||
|
*/
|
||||||
|
while (*s) {
|
||||||
|
|
||||||
|
/* multiply by the 32 bit FNV magic prime mod 2^32 */
|
||||||
|
#if defined(NO_FNV_GCC_OPTIMIZATION)
|
||||||
|
hval *= FNV1_32_PRIME;
|
||||||
|
#else
|
||||||
|
hval += (hval<<1) + (hval<<4) + (hval<<7) + (hval<<8) + (hval<<24);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* xor the bottom with the current octet */
|
||||||
|
hval ^= (uint32_t)*s++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* return our new hash value */
|
||||||
|
return hval;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -452,6 +452,11 @@ private:
|
||||||
*/
|
*/
|
||||||
int wait_for_ack(const uint16_t msg, const unsigned timeout, const bool report);
|
int wait_for_ack(const uint16_t msg, const unsigned timeout, const bool report);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculate FNV1 hash
|
||||||
|
*/
|
||||||
|
uint32_t fnv1_32_str(uint8_t *str, uint32_t hval);
|
||||||
|
|
||||||
int _fd;
|
int _fd;
|
||||||
struct vehicle_gps_position_s *_gps_position;
|
struct vehicle_gps_position_s *_gps_position;
|
||||||
struct satellite_info_s *_satellite_info;
|
struct satellite_info_s *_satellite_info;
|
||||||
|
@ -470,8 +475,7 @@ private:
|
||||||
hrt_abstime _disable_cmd_last;
|
hrt_abstime _disable_cmd_last;
|
||||||
uint16_t _ack_waiting_msg;
|
uint16_t _ack_waiting_msg;
|
||||||
ubx_buf_t _buf;
|
ubx_buf_t _buf;
|
||||||
char _ubx_sw_version[30];
|
uint32_t _ubx_version;
|
||||||
char _ubx_hw_version[10];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* UBX_H_ */
|
#endif /* UBX_H_ */
|
||||||
|
|
Loading…
Reference in New Issue