Add support for some additinal OSTC features.
This commit is contained in:
parent
5942215cda
commit
57615abc0c
181
src/hw_ostc.c
181
src/hw_ostc.c
@ -36,6 +36,8 @@
|
|||||||
|
|
||||||
#define FW_190 0x015A
|
#define FW_190 0x015A
|
||||||
|
|
||||||
|
#define SZ_MD2HASH 18
|
||||||
|
#define SZ_EEPROM 256
|
||||||
#define SZ_HEADER 266
|
#define SZ_HEADER 266
|
||||||
#define SZ_FW_190 0x8000
|
#define SZ_FW_190 0x8000
|
||||||
#define SZ_FW_NEW 0x10000
|
#define SZ_FW_NEW 0x10000
|
||||||
@ -73,6 +75,37 @@ device_is_hw_ostc (device_t *abstract)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static device_status_t
|
||||||
|
hw_ostc_send (hw_ostc_device_t *device, unsigned char cmd, unsigned int echo)
|
||||||
|
{
|
||||||
|
// Send the command.
|
||||||
|
unsigned char command[1] = {cmd};
|
||||||
|
int n = serial_write (device->port, command, sizeof (command));
|
||||||
|
if (n != sizeof (command)) {
|
||||||
|
WARNING ("Failed to send the command.");
|
||||||
|
return EXITCODE (n);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (echo) {
|
||||||
|
// Read the echo.
|
||||||
|
unsigned char answer[1] = {0};
|
||||||
|
n = serial_read (device->port, answer, sizeof (answer));
|
||||||
|
if (n != sizeof (answer)) {
|
||||||
|
WARNING ("Failed to receive the echo.");
|
||||||
|
return EXITCODE (n);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify the echo.
|
||||||
|
if (memcmp (answer, command, sizeof (command)) != 0) {
|
||||||
|
WARNING ("Unexpected echo.");
|
||||||
|
return DEVICE_STATUS_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return DEVICE_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
device_status_t
|
device_status_t
|
||||||
hw_ostc_device_open (device_t **out, const char* name)
|
hw_ostc_device_open (device_t **out, const char* name)
|
||||||
{
|
{
|
||||||
@ -295,6 +328,154 @@ hw_ostc_device_foreach (device_t *abstract, dive_callback_t callback, void *user
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
device_status_t
|
||||||
|
hw_ostc_device_md2hash (device_t *abstract, unsigned char data[], unsigned int size)
|
||||||
|
{
|
||||||
|
hw_ostc_device_t *device = (hw_ostc_device_t *) abstract;
|
||||||
|
|
||||||
|
if (! device_is_hw_ostc (abstract))
|
||||||
|
return DEVICE_STATUS_TYPE_MISMATCH;
|
||||||
|
|
||||||
|
if (size < SZ_MD2HASH) {
|
||||||
|
WARNING ("Insufficient buffer space available.");
|
||||||
|
return DEVICE_STATUS_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send the command.
|
||||||
|
device_status_t rc = hw_ostc_send (device, 'e', 0);
|
||||||
|
if (rc != DEVICE_STATUS_SUCCESS)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
// Read the answer.
|
||||||
|
int n = serial_read (device->port, data, SZ_MD2HASH);
|
||||||
|
if (n != SZ_MD2HASH) {
|
||||||
|
WARNING ("Failed to receive the answer.");
|
||||||
|
return EXITCODE (n);
|
||||||
|
}
|
||||||
|
|
||||||
|
return DEVICE_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
device_status_t
|
||||||
|
hw_ostc_device_clock (device_t *abstract, const dc_datetime_t *datetime)
|
||||||
|
{
|
||||||
|
hw_ostc_device_t *device = (hw_ostc_device_t *) abstract;
|
||||||
|
|
||||||
|
if (! device_is_hw_ostc (abstract))
|
||||||
|
return DEVICE_STATUS_TYPE_MISMATCH;
|
||||||
|
|
||||||
|
if (datetime == NULL) {
|
||||||
|
WARNING ("Invalid parameter specified.");
|
||||||
|
return DEVICE_STATUS_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send the command.
|
||||||
|
device_status_t rc = hw_ostc_send (device, 'b', 1);
|
||||||
|
if (rc != DEVICE_STATUS_SUCCESS)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
// Send the data packet.
|
||||||
|
unsigned char packet[6] = {
|
||||||
|
datetime->hour, datetime->minute, datetime->second,
|
||||||
|
datetime->month, datetime->day, datetime->year - 2000};
|
||||||
|
int n = serial_write (device->port, packet, sizeof (packet));
|
||||||
|
if (n != sizeof (packet)) {
|
||||||
|
WARNING ("Failed to send the data packet.");
|
||||||
|
return EXITCODE (n);
|
||||||
|
}
|
||||||
|
|
||||||
|
return DEVICE_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
device_status_t
|
||||||
|
hw_ostc_device_eeprom_read (device_t *abstract, unsigned int bank, unsigned char data[], unsigned int size)
|
||||||
|
{
|
||||||
|
hw_ostc_device_t *device = (hw_ostc_device_t *) abstract;
|
||||||
|
|
||||||
|
if (! device_is_hw_ostc (abstract))
|
||||||
|
return DEVICE_STATUS_TYPE_MISMATCH;
|
||||||
|
|
||||||
|
if (bank > 1) {
|
||||||
|
WARNING ("Invalid eeprom bank specified.");
|
||||||
|
return DEVICE_STATUS_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (size < SZ_EEPROM) {
|
||||||
|
WARNING ("Insufficient buffer space available.");
|
||||||
|
return DEVICE_STATUS_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send the command.
|
||||||
|
unsigned char command = (bank == 0) ? 'g' : 'j';
|
||||||
|
device_status_t rc = hw_ostc_send (device, command, 0);
|
||||||
|
if (rc != DEVICE_STATUS_SUCCESS)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
// Read the answer.
|
||||||
|
int n = serial_read (device->port, data, SZ_EEPROM);
|
||||||
|
if (n != SZ_EEPROM) {
|
||||||
|
WARNING ("Failed to receive the answer.");
|
||||||
|
return EXITCODE (n);
|
||||||
|
}
|
||||||
|
|
||||||
|
return DEVICE_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
device_status_t
|
||||||
|
hw_ostc_device_eeprom_write (device_t *abstract, unsigned int bank, const unsigned char data[], unsigned int size)
|
||||||
|
{
|
||||||
|
hw_ostc_device_t *device = (hw_ostc_device_t *) abstract;
|
||||||
|
|
||||||
|
if (! device_is_hw_ostc (abstract))
|
||||||
|
return DEVICE_STATUS_TYPE_MISMATCH;
|
||||||
|
|
||||||
|
if (bank > 1) {
|
||||||
|
WARNING ("Invalid eeprom bank specified.");
|
||||||
|
return DEVICE_STATUS_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (size != SZ_EEPROM) {
|
||||||
|
WARNING ("Insufficient buffer space available.");
|
||||||
|
return DEVICE_STATUS_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send the command.
|
||||||
|
unsigned char command = (bank == 0) ? 'd' : 'i';
|
||||||
|
device_status_t rc = hw_ostc_send (device, command, 1);
|
||||||
|
if (rc != DEVICE_STATUS_SUCCESS)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
for (unsigned int i = 4; i < SZ_EEPROM; ++i) {
|
||||||
|
// Send the data byte.
|
||||||
|
rc = hw_ostc_send (device, data[i], 1);
|
||||||
|
if (rc != DEVICE_STATUS_SUCCESS)
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
return DEVICE_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
device_status_t
|
||||||
|
hw_ostc_device_reset (device_t *abstract)
|
||||||
|
{
|
||||||
|
hw_ostc_device_t *device = (hw_ostc_device_t *) abstract;
|
||||||
|
|
||||||
|
if (! device_is_hw_ostc (abstract))
|
||||||
|
return DEVICE_STATUS_TYPE_MISMATCH;
|
||||||
|
|
||||||
|
// Send the command.
|
||||||
|
device_status_t rc = hw_ostc_send (device, 'h', 1);
|
||||||
|
if (rc != DEVICE_STATUS_SUCCESS)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
return DEVICE_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
device_status_t
|
device_status_t
|
||||||
hw_ostc_extract_dives (device_t *abstract, const unsigned char data[], unsigned int size, dive_callback_t callback, void *userdata)
|
hw_ostc_extract_dives (device_t *abstract, const unsigned char data[], unsigned int size, dive_callback_t callback, void *userdata)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -24,6 +24,7 @@
|
|||||||
|
|
||||||
#include "device.h"
|
#include "device.h"
|
||||||
#include "parser.h"
|
#include "parser.h"
|
||||||
|
#include "buffer.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
@ -32,6 +33,21 @@ extern "C" {
|
|||||||
device_status_t
|
device_status_t
|
||||||
hw_ostc_device_open (device_t **device, const char* name);
|
hw_ostc_device_open (device_t **device, const char* name);
|
||||||
|
|
||||||
|
device_status_t
|
||||||
|
hw_ostc_device_md2hash (device_t *abstract, unsigned char data[], unsigned int size);
|
||||||
|
|
||||||
|
device_status_t
|
||||||
|
hw_ostc_device_clock (device_t *abstract, const dc_datetime_t *datetime);
|
||||||
|
|
||||||
|
device_status_t
|
||||||
|
hw_ostc_device_eeprom_read (device_t *abstract, unsigned int bank, unsigned char data[], unsigned int size);
|
||||||
|
|
||||||
|
device_status_t
|
||||||
|
hw_ostc_device_eeprom_write (device_t *abstract, unsigned int bank, const unsigned char data[], unsigned int size);
|
||||||
|
|
||||||
|
device_status_t
|
||||||
|
hw_ostc_device_reset (device_t *abstract);
|
||||||
|
|
||||||
device_status_t
|
device_status_t
|
||||||
hw_ostc_extract_dives (device_t *abstract, const unsigned char data[], unsigned int size, dive_callback_t callback, void *userdata);
|
hw_ostc_extract_dives (device_t *abstract, const unsigned char data[], unsigned int size, dive_callback_t callback, void *userdata);
|
||||||
|
|
||||||
|
|||||||
@ -114,6 +114,11 @@ uwatec_smart_device_open
|
|||||||
uwatec_smart_device_set_timestamp
|
uwatec_smart_device_set_timestamp
|
||||||
uwatec_smart_extract_dives
|
uwatec_smart_extract_dives
|
||||||
hw_ostc_device_open
|
hw_ostc_device_open
|
||||||
|
hw_ostc_device_md2hash
|
||||||
|
hw_ostc_device_clock
|
||||||
|
hw_ostc_device_eeprom_read
|
||||||
|
hw_ostc_device_eeprom_write
|
||||||
|
hw_ostc_device_reset
|
||||||
hw_ostc_extract_dives
|
hw_ostc_extract_dives
|
||||||
zeagle_n2ition3_device_open
|
zeagle_n2ition3_device_open
|
||||||
atomics_cobalt_device_open
|
atomics_cobalt_device_open
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user