Read the entire data packet in a single operation
Refactor the packet receiving code to read the ack byte, the payload data and the checksum all at once, with just a single read operation. This is not only a bit more efficient, but will also simplify the BLE support.
This commit is contained in:
parent
437db813d5
commit
4923d3761e
@ -38,6 +38,7 @@
|
|||||||
#define I770R 0x4651
|
#define I770R 0x4651
|
||||||
#define GEO40 0x4653
|
#define GEO40 0x4653
|
||||||
|
|
||||||
|
#define MAXPACKET 256
|
||||||
#define MAXRETRIES 2
|
#define MAXRETRIES 2
|
||||||
#define MAXDELAY 16
|
#define MAXDELAY 16
|
||||||
#define INVALID 0xFFFFFFFF
|
#define INVALID 0xFFFFFFFF
|
||||||
@ -539,6 +540,14 @@ oceanic_atom2_packet (oceanic_atom2_device_t *device, const unsigned char comman
|
|||||||
dc_status_t status = DC_STATUS_SUCCESS;
|
dc_status_t status = DC_STATUS_SUCCESS;
|
||||||
dc_device_t *abstract = (dc_device_t *) device;
|
dc_device_t *abstract = (dc_device_t *) device;
|
||||||
|
|
||||||
|
if (asize > MAXPACKET) {
|
||||||
|
return DC_STATUS_INVALIDARGS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (crc_size > 2 || (crc_size != 0 && asize == 0)) {
|
||||||
|
return DC_STATUS_INVALIDARGS;
|
||||||
|
}
|
||||||
|
|
||||||
if (device_is_cancelled (abstract))
|
if (device_is_cancelled (abstract))
|
||||||
return DC_STATUS_CANCELLED;
|
return DC_STATUS_CANCELLED;
|
||||||
|
|
||||||
@ -553,41 +562,36 @@ oceanic_atom2_packet (oceanic_atom2_device_t *device, const unsigned char comman
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Receive the response (ACK/NAK) of the dive computer.
|
// Receive the answer of the dive computer.
|
||||||
unsigned char response = 0;
|
unsigned char packet[1 + MAXPACKET + 2];
|
||||||
status = dc_iostream_read (device->iostream, &response, 1, NULL);
|
status = dc_iostream_read (device->iostream, packet, 1 + asize + crc_size, NULL);
|
||||||
if (status != DC_STATUS_SUCCESS) {
|
if (status != DC_STATUS_SUCCESS) {
|
||||||
ERROR (abstract->context, "Failed to receive the answer.");
|
ERROR (abstract->context, "Failed to receive the answer.");
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Verify the response of the dive computer.
|
// Verify the ACK byte of the answer.
|
||||||
if (response != ack) {
|
if (packet[0] != ack) {
|
||||||
ERROR (abstract->context, "Unexpected answer start byte(s).");
|
ERROR (abstract->context, "Unexpected answer start byte(s).");
|
||||||
return DC_STATUS_PROTOCOL;
|
return DC_STATUS_PROTOCOL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (asize) {
|
if (asize) {
|
||||||
// Receive the answer of the dive computer.
|
|
||||||
status = dc_iostream_read (device->iostream, answer, asize, NULL);
|
|
||||||
if (status != DC_STATUS_SUCCESS) {
|
|
||||||
ERROR (abstract->context, "Failed to receive the answer.");
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Verify the checksum of the answer.
|
// Verify the checksum of the answer.
|
||||||
unsigned short crc, ccrc;
|
unsigned short crc, ccrc;
|
||||||
if (crc_size == 2) {
|
if (crc_size == 2) {
|
||||||
crc = array_uint16_le (answer + asize - 2);
|
crc = array_uint16_le (packet + 1 + asize);
|
||||||
ccrc = checksum_add_uint16 (answer, asize - 2, 0x0000);
|
ccrc = checksum_add_uint16 (packet + 1, asize, 0x0000);
|
||||||
} else {
|
} else {
|
||||||
crc = answer[asize - 1];
|
crc = packet[1 + asize];
|
||||||
ccrc = checksum_add_uint8 (answer, asize - 1, 0x00);
|
ccrc = checksum_add_uint8 (packet + 1, asize, 0x00);
|
||||||
}
|
}
|
||||||
if (crc != ccrc) {
|
if (crc != ccrc) {
|
||||||
ERROR (abstract->context, "Unexpected answer checksum.");
|
ERROR (abstract->context, "Unexpected answer checksum.");
|
||||||
return DC_STATUS_PROTOCOL;
|
return DC_STATUS_PROTOCOL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
memcpy (answer, packet + 1, asize);
|
||||||
}
|
}
|
||||||
|
|
||||||
return DC_STATUS_SUCCESS;
|
return DC_STATUS_SUCCESS;
|
||||||
@ -847,14 +851,11 @@ oceanic_atom2_device_version (dc_device_t *abstract, unsigned char data[], unsig
|
|||||||
if (size < PAGESIZE)
|
if (size < PAGESIZE)
|
||||||
return DC_STATUS_INVALIDARGS;
|
return DC_STATUS_INVALIDARGS;
|
||||||
|
|
||||||
unsigned char answer[PAGESIZE + 1] = {0};
|
|
||||||
unsigned char command[] = {CMD_VERSION};
|
unsigned char command[] = {CMD_VERSION};
|
||||||
dc_status_t rc = oceanic_atom2_transfer (device, command, sizeof (command), ACK, answer, sizeof (answer), 1);
|
dc_status_t rc = oceanic_atom2_transfer (device, command, sizeof (command), ACK, data, PAGESIZE, 1);
|
||||||
if (rc != DC_STATUS_SUCCESS)
|
if (rc != DC_STATUS_SUCCESS)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
memcpy (data, answer, PAGESIZE);
|
|
||||||
|
|
||||||
return DC_STATUS_SUCCESS;
|
return DC_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -912,17 +913,15 @@ oceanic_atom2_device_read (dc_device_t *abstract, unsigned int address, unsigned
|
|||||||
if (page != device->cached_page || highmem != device->cached_highmem) {
|
if (page != device->cached_page || highmem != device->cached_highmem) {
|
||||||
// Read the package.
|
// Read the package.
|
||||||
unsigned int number = highmem ? page : page * device->bigpage; // This is always PAGESIZE, even in big page mode.
|
unsigned int number = highmem ? page : page * device->bigpage; // This is always PAGESIZE, even in big page mode.
|
||||||
unsigned char answer[256 + 2] = {0}; // Maximum we support for the known commands.
|
|
||||||
unsigned char command[] = {read_cmd,
|
unsigned char command[] = {read_cmd,
|
||||||
(number >> 8) & 0xFF, // high
|
(number >> 8) & 0xFF, // high
|
||||||
(number ) & 0xFF, // low
|
(number ) & 0xFF, // low
|
||||||
};
|
};
|
||||||
dc_status_t rc = oceanic_atom2_transfer (device, command, sizeof (command), ACK, answer, pagesize + crc_size, crc_size);
|
dc_status_t rc = oceanic_atom2_transfer (device, command, sizeof (command), ACK, device->cache, pagesize, crc_size);
|
||||||
if (rc != DC_STATUS_SUCCESS)
|
if (rc != DC_STATUS_SUCCESS)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
// Cache the page.
|
// Cache the page.
|
||||||
memcpy (device->cache, answer, pagesize);
|
|
||||||
device->cached_page = page;
|
device->cached_page = page;
|
||||||
device->cached_highmem = highmem;
|
device->cached_highmem = highmem;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user