Use the ACK/NAK error correction for all commands.

This commit is contained in:
Jef Driesen 2010-01-15 09:32:16 +00:00
parent 067a6c630a
commit cf009cf18b
2 changed files with 45 additions and 75 deletions

View File

@ -105,8 +105,6 @@ oceanic_veo250_send (oceanic_veo250_device_t *device, const unsigned char comman
static device_status_t
oceanic_veo250_transfer (oceanic_veo250_device_t *device, const unsigned char command[], unsigned int csize, unsigned char answer[], unsigned int asize)
{
assert (asize == OCEANIC_VEO250_PACKET_SIZE + 2);
// Send the command to the device. If the device responds with an
// ACK byte, the command was received successfully and the answer
// (if any) follows after the ACK byte. If the device responds with
@ -147,22 +145,14 @@ oceanic_veo250_transfer (oceanic_veo250_device_t *device, const unsigned char co
}
// Receive the answer of the dive computer.
int n = serial_read (device->port, answer, OCEANIC_VEO250_PACKET_SIZE + 2);
if (n != OCEANIC_VEO250_PACKET_SIZE + 2) {
int n = serial_read (device->port, answer, asize);
if (n != asize) {
WARNING ("Failed to receive the answer.");
return EXITCODE (n);
}
// Verify the checksum of the answer.
unsigned char crc = answer[OCEANIC_VEO250_PACKET_SIZE];
unsigned char ccrc = checksum_add_uint8 (answer, OCEANIC_VEO250_PACKET_SIZE, 0x00);
if (crc != ccrc) {
WARNING ("Unexpected answer CRC.");
return DEVICE_STATUS_PROTOCOL;
}
// Verify the last byte of the answer.
if (answer[OCEANIC_VEO250_PACKET_SIZE + 1] != NAK) {
if (answer[asize - 1] != NAK) {
WARNING ("Unexpected answer byte.");
return DEVICE_STATUS_PROTOCOL;
}
@ -337,27 +327,17 @@ oceanic_veo250_device_keepalive (device_t *abstract)
if (! device_is_oceanic_veo250 (abstract))
return DEVICE_STATUS_TYPE_MISMATCH;
// Send the command to the dive computer.
unsigned char answer[2] = {0};
unsigned char command[4] = {0x91,
(device->last ) & 0xFF, // low
(device->last >> 8) & 0xFF, // high
0x00};
device_status_t rc = oceanic_veo250_send (device, command, sizeof (command));
if (rc != DEVICE_STATUS_SUCCESS) {
WARNING ("Failed to send the command.");
device_status_t rc = oceanic_veo250_transfer (device, command, sizeof (command), answer, sizeof (answer));
if (rc != DEVICE_STATUS_SUCCESS)
return rc;
}
// Receive the answer of the dive computer.
unsigned char answer[3] = {0};
int n = serial_read (device->port, answer, sizeof (answer));
if (n != sizeof (answer)) {
WARNING ("Failed to receive the answer.");
return EXITCODE (n);
}
// Verify the answer.
if (answer[0] != ACK || answer[1] != NAK || answer[2] != NAK) {
if (answer[0] != NAK) {
WARNING ("Unexpected answer byte(s).");
return DEVICE_STATUS_PROTOCOL;
}
@ -383,6 +363,14 @@ oceanic_veo250_device_version (device_t *abstract, unsigned char data[], unsigne
if (rc != DEVICE_STATUS_SUCCESS)
return rc;
// Verify the checksum of the answer.
unsigned char crc = answer[OCEANIC_VEO250_PACKET_SIZE];
unsigned char ccrc = checksum_add_uint8 (answer, OCEANIC_VEO250_PACKET_SIZE, 0x00);
if (crc != ccrc) {
WARNING ("Unexpected answer CRC.");
return DEVICE_STATUS_PROTOCOL;
}
memcpy (data, answer, OCEANIC_VEO250_PACKET_SIZE);
#ifndef NDEBUG
@ -423,10 +411,18 @@ oceanic_veo250_device_read (device_t *abstract, unsigned int address, unsigned c
if (rc != DEVICE_STATUS_SUCCESS)
return rc;
memcpy (data, answer, OCEANIC_VEO250_PACKET_SIZE);
device->last = number;
// Verify the checksum of the answer.
unsigned char crc = answer[OCEANIC_VEO250_PACKET_SIZE];
unsigned char ccrc = checksum_add_uint8 (answer, OCEANIC_VEO250_PACKET_SIZE, 0x00);
if (crc != ccrc) {
WARNING ("Unexpected answer CRC.");
return DEVICE_STATUS_PROTOCOL;
}
memcpy (data, answer, OCEANIC_VEO250_PACKET_SIZE);
#ifndef NDEBUG
message ("VEO250Read(0x%04x,%d)=\"", address, OCEANIC_VEO250_PACKET_SIZE);
for (unsigned int i = 0; i < OCEANIC_VEO250_PACKET_SIZE; ++i) {

View File

@ -40,6 +40,7 @@
#define ACK 0x5A
#define NAK 0xA5
#define END 0x51
typedef struct oceanic_vtpro_device_t {
oceanic_common_device_t base;
@ -187,23 +188,14 @@ static device_status_t
oceanic_vtpro_quit (oceanic_vtpro_device_t *device)
{
// Send the command to the dive computer.
unsigned char answer[1] = {0};
unsigned char command[4] = {0x6A, 0x05, 0xA5, 0x00};
device_status_t rc = oceanic_vtpro_send (device, command, sizeof (command));
if (rc != DEVICE_STATUS_SUCCESS) {
WARNING ("Failed to send the command.");
device_status_t rc = oceanic_vtpro_transfer (device, command, sizeof (command), answer, sizeof (answer));
if (rc != DEVICE_STATUS_SUCCESS)
return rc;
}
// Receive the answer of the dive computer.
unsigned char answer[2] = {0};
int n = serial_read (device->port, answer, sizeof (answer));
if (n != sizeof (answer)) {
WARNING ("Failed to receive the answer.");
return EXITCODE (n);
}
// Verify the answer.
if (answer[0] != 0x5A || answer[1] != 0x51) {
// Verify the last byte of the answer.
if (answer[0] != END) {
WARNING ("Unexpected answer byte(s).");
return DEVICE_STATUS_PROTOCOL;
}
@ -216,27 +208,18 @@ static device_status_t
oceanic_vtpro_calibrate (oceanic_vtpro_device_t *device)
{
// Send the command to the dive computer.
// The timeout is temporary increased, because the
// device needs approximately 6 seconds to respond.
unsigned char answer[2] = {0};
unsigned char command[2] = {0x18, 0x00};
device_status_t rc = oceanic_vtpro_send (device, command, sizeof (command));
if (rc != DEVICE_STATUS_SUCCESS) {
WARNING ("Failed to send the command.");
return rc;
}
// Receive the answer of the dive computer. The timeout
// is temporary increased, because the device needs
// approximately 6 seconds to respond.
unsigned char answer[3] = {0};
serial_set_timeout (device->port, 9000);
int n = serial_read (device->port, answer, sizeof (answer));
device_status_t rc = oceanic_vtpro_transfer (device, command, sizeof (command), answer, sizeof (answer));
serial_set_timeout (device->port, 3000);
if (n != sizeof (answer)) {
WARNING ("Failed to receive the answer.");
return EXITCODE (n);
}
if (rc != DEVICE_STATUS_SUCCESS)
return rc;
// Verify the answer.
if (answer[0] != ACK || answer[2] != 0x00) {
// Verify the last byte of the answer.
if (answer[1] != 0x00) {
WARNING ("Unexpected answer byte(s).");
return DEVICE_STATUS_PROTOCOL;
}
@ -368,23 +351,14 @@ oceanic_vtpro_device_keepalive (device_t *abstract)
return DEVICE_STATUS_TYPE_MISMATCH;
// Send the command to the dive computer.
unsigned char answer[1] = {0};
unsigned char command[4] = {0x6A, 0x08, 0x00, 0x00};
device_status_t rc = oceanic_vtpro_send (device, command, sizeof (command));
if (rc != DEVICE_STATUS_SUCCESS) {
WARNING ("Failed to send the command.");
device_status_t rc = oceanic_vtpro_transfer (device, command, sizeof (command), answer, sizeof (answer));
if (rc != DEVICE_STATUS_SUCCESS)
return rc;
}
// Receive the answer of the dive computer.
unsigned char answer[2] = {0};
int n = serial_read (device->port, answer, sizeof (answer));
if (n != sizeof (answer)) {
WARNING ("Failed to receive the answer.");
return EXITCODE (n);
}
// Verify the answer.
if (answer[0] != ACK || answer[1] != 0x51) {
// Verify the last byte of the answer.
if (answer[0] != END) {
WARNING ("Unexpected answer byte(s).");
return DEVICE_STATUS_PROTOCOL;
}
@ -446,7 +420,7 @@ oceanic_vtpro_device_version (device_t *abstract, unsigned char data[], unsigned
}
// Verify the last byte of the answer.
if (answer[OCEANIC_VTPRO_PACKET_SIZE / 2 + 1] != 0x51) {
if (answer[OCEANIC_VTPRO_PACKET_SIZE / 2 + 1] != END) {
WARNING ("Unexpected answer byte.");
return DEVICE_STATUS_PROTOCOL;
}