Store hash instead of full strings for SW & HW version

This commit is contained in:
Kynos 2014-06-16 15:35:38 +02:00
parent 243db01a37
commit 0ffb123701
2 changed files with 45 additions and 11 deletions

View File

@ -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;
}

View File

@ -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_ */