Added a checksum function for the Oceanic VT Pro version string.
This commit is contained in:
parent
fe78347584
commit
e5fea5a370
@ -21,6 +21,20 @@
|
|||||||
|
|
||||||
#include "checksum.h"
|
#include "checksum.h"
|
||||||
|
|
||||||
|
|
||||||
|
unsigned char
|
||||||
|
checksum_add_uint4 (const unsigned char data[], unsigned int size, unsigned char init)
|
||||||
|
{
|
||||||
|
unsigned char crc = init;
|
||||||
|
for (unsigned int i = 0; i < size; ++i) {
|
||||||
|
crc += (data[i] & 0xF0) >> 4;
|
||||||
|
crc += (data[i] & 0x0F);
|
||||||
|
}
|
||||||
|
|
||||||
|
return crc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
unsigned char
|
unsigned char
|
||||||
checksum_add_uint8 (const unsigned char data[], unsigned int size, unsigned char init)
|
checksum_add_uint8 (const unsigned char data[], unsigned int size, unsigned char init)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -26,6 +26,9 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
unsigned char
|
||||||
|
checksum_add_uint4 (const unsigned char data[], unsigned int size, unsigned char init);
|
||||||
|
|
||||||
unsigned char
|
unsigned char
|
||||||
checksum_add_uint8 (const unsigned char data[], unsigned int size, unsigned char init);
|
checksum_add_uint8 (const unsigned char data[], unsigned int size, unsigned char init);
|
||||||
|
|
||||||
|
|||||||
@ -396,8 +396,13 @@ oceanic_vtpro_device_version (device_t *abstract, unsigned char data[], unsigned
|
|||||||
if (rc != DEVICE_STATUS_SUCCESS)
|
if (rc != DEVICE_STATUS_SUCCESS)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
// FIXME: The answer seems to contain a checksum byte,
|
// Verify the checksum of the answer.
|
||||||
// but the correct checksum function is not known.
|
unsigned char crc = ans[OCEANIC_VTPRO_PACKET_SIZE / 2];
|
||||||
|
unsigned char ccrc = checksum_add_uint4 (ans, OCEANIC_VTPRO_PACKET_SIZE / 2, 0x00);
|
||||||
|
if (crc != ccrc) {
|
||||||
|
WARNING ("Unexpected answer CRC.");
|
||||||
|
return DEVICE_STATUS_PROTOCOL;
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
ans[OCEANIC_VTPRO_PACKET_SIZE / 2] = 0;
|
ans[OCEANIC_VTPRO_PACKET_SIZE / 2] = 0;
|
||||||
@ -414,8 +419,13 @@ oceanic_vtpro_device_version (device_t *abstract, unsigned char data[], unsigned
|
|||||||
if (rc != DEVICE_STATUS_SUCCESS)
|
if (rc != DEVICE_STATUS_SUCCESS)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
// FIXME: The answer seems to contain a checksum byte,
|
// Verify the checksum of the answer.
|
||||||
// but the correct checksum function is not known.
|
unsigned char crc = answer[OCEANIC_VTPRO_PACKET_SIZE / 2];
|
||||||
|
unsigned char ccrc = checksum_add_uint4 (answer, OCEANIC_VTPRO_PACKET_SIZE / 2, 0x00);
|
||||||
|
if (crc != ccrc) {
|
||||||
|
WARNING ("Unexpected answer CRC.");
|
||||||
|
return DEVICE_STATUS_PROTOCOL;
|
||||||
|
}
|
||||||
|
|
||||||
// Verify the last byte of the answer.
|
// Verify the last byte of the answer.
|
||||||
if (answer[OCEANIC_VTPRO_PACKET_SIZE / 2 + 1] != 0x51) {
|
if (answer[OCEANIC_VTPRO_PACKET_SIZE / 2 + 1] != 0x51) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user