Cache the header data internally.
This commit is contained in:
parent
b832f4cf1b
commit
391de65d16
@ -50,13 +50,6 @@
|
|||||||
#define OSTC3_GAUGE 2
|
#define OSTC3_GAUGE 2
|
||||||
#define OSTC3_APNEA 3
|
#define OSTC3_APNEA 3
|
||||||
|
|
||||||
typedef struct hw_ostc_parser_t hw_ostc_parser_t;
|
|
||||||
|
|
||||||
struct hw_ostc_parser_t {
|
|
||||||
dc_parser_t base;
|
|
||||||
unsigned int frog;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct hw_ostc_sample_info_t {
|
typedef struct hw_ostc_sample_info_t {
|
||||||
unsigned int type;
|
unsigned int type;
|
||||||
unsigned int divisor;
|
unsigned int divisor;
|
||||||
@ -79,6 +72,16 @@ typedef struct hw_ostc_gasmix_t {
|
|||||||
unsigned int helium;
|
unsigned int helium;
|
||||||
} hw_ostc_gasmix_t;
|
} hw_ostc_gasmix_t;
|
||||||
|
|
||||||
|
typedef struct hw_ostc_parser_t {
|
||||||
|
dc_parser_t base;
|
||||||
|
unsigned int frog;
|
||||||
|
// Cached fields.
|
||||||
|
unsigned int cached;
|
||||||
|
unsigned int version;
|
||||||
|
unsigned int header;
|
||||||
|
const hw_ostc_layout_t *layout;
|
||||||
|
} hw_ostc_parser_t;
|
||||||
|
|
||||||
static dc_status_t hw_ostc_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size);
|
static dc_status_t hw_ostc_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size);
|
||||||
static dc_status_t hw_ostc_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime);
|
static dc_status_t hw_ostc_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime);
|
||||||
static dc_status_t hw_ostc_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value);
|
static dc_status_t hw_ostc_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value);
|
||||||
@ -127,54 +130,17 @@ static const hw_ostc_layout_t hw_ostc_layout_ostc3 = {
|
|||||||
22, /* temperature */
|
22, /* temperature */
|
||||||
};
|
};
|
||||||
|
|
||||||
dc_status_t
|
|
||||||
hw_ostc_parser_create (dc_parser_t **out, dc_context_t *context, unsigned int frog)
|
|
||||||
{
|
|
||||||
if (out == NULL)
|
|
||||||
return DC_STATUS_INVALIDARGS;
|
|
||||||
|
|
||||||
// Allocate memory.
|
|
||||||
hw_ostc_parser_t *parser = (hw_ostc_parser_t *) malloc (sizeof (hw_ostc_parser_t));
|
|
||||||
if (parser == NULL) {
|
|
||||||
ERROR (context, "Failed to allocate memory.");
|
|
||||||
return DC_STATUS_NOMEMORY;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Initialize the base class.
|
|
||||||
parser_init (&parser->base, context, &hw_ostc_parser_vtable);
|
|
||||||
|
|
||||||
parser->frog = frog;
|
|
||||||
|
|
||||||
*out = (dc_parser_t *) parser;
|
|
||||||
|
|
||||||
return DC_STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static dc_status_t
|
static dc_status_t
|
||||||
hw_ostc_parser_destroy (dc_parser_t *abstract)
|
hw_ostc_parser_cache (hw_ostc_parser_t *parser)
|
||||||
{
|
{
|
||||||
// Free memory.
|
dc_parser_t *abstract = (dc_parser_t *) parser;
|
||||||
free (abstract);
|
|
||||||
|
|
||||||
return DC_STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static dc_status_t
|
|
||||||
hw_ostc_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size)
|
|
||||||
{
|
|
||||||
return DC_STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static dc_status_t
|
|
||||||
hw_ostc_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime)
|
|
||||||
{
|
|
||||||
hw_ostc_parser_t *parser = (hw_ostc_parser_t *) abstract;
|
|
||||||
const unsigned char *data = abstract->data;
|
const unsigned char *data = abstract->data;
|
||||||
unsigned int size = abstract->size;
|
unsigned int size = abstract->size;
|
||||||
|
|
||||||
|
if (parser->cached) {
|
||||||
|
return DC_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
if (size < 9) {
|
if (size < 9) {
|
||||||
ERROR(abstract->context, "Header too small.");
|
ERROR(abstract->context, "Header too small.");
|
||||||
return DC_STATUS_DATAFORMAT;
|
return DC_STATUS_DATAFORMAT;
|
||||||
@ -211,6 +177,84 @@ hw_ostc_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime)
|
|||||||
return DC_STATUS_DATAFORMAT;
|
return DC_STATUS_DATAFORMAT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Cache the data for later use.
|
||||||
|
parser->version = version;
|
||||||
|
parser->header = header;
|
||||||
|
parser->layout = layout;
|
||||||
|
parser->cached = 1;
|
||||||
|
|
||||||
|
return DC_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
dc_status_t
|
||||||
|
hw_ostc_parser_create (dc_parser_t **out, dc_context_t *context, unsigned int frog)
|
||||||
|
{
|
||||||
|
if (out == NULL)
|
||||||
|
return DC_STATUS_INVALIDARGS;
|
||||||
|
|
||||||
|
// Allocate memory.
|
||||||
|
hw_ostc_parser_t *parser = (hw_ostc_parser_t *) malloc (sizeof (hw_ostc_parser_t));
|
||||||
|
if (parser == NULL) {
|
||||||
|
ERROR (context, "Failed to allocate memory.");
|
||||||
|
return DC_STATUS_NOMEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialize the base class.
|
||||||
|
parser_init (&parser->base, context, &hw_ostc_parser_vtable);
|
||||||
|
|
||||||
|
// Set the default values.
|
||||||
|
parser->frog = frog;
|
||||||
|
parser->cached = 0;
|
||||||
|
parser->version = 0;
|
||||||
|
parser->header = 0;
|
||||||
|
parser->layout = NULL;
|
||||||
|
|
||||||
|
*out = (dc_parser_t *) parser;
|
||||||
|
|
||||||
|
return DC_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static dc_status_t
|
||||||
|
hw_ostc_parser_destroy (dc_parser_t *abstract)
|
||||||
|
{
|
||||||
|
// Free memory.
|
||||||
|
free (abstract);
|
||||||
|
|
||||||
|
return DC_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static dc_status_t
|
||||||
|
hw_ostc_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size)
|
||||||
|
{
|
||||||
|
hw_ostc_parser_t *parser = (hw_ostc_parser_t *) abstract;
|
||||||
|
|
||||||
|
// Reset the cache.
|
||||||
|
parser->cached = 0;
|
||||||
|
parser->version = 0;
|
||||||
|
parser->header = 0;
|
||||||
|
parser->layout = NULL;
|
||||||
|
|
||||||
|
return DC_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static dc_status_t
|
||||||
|
hw_ostc_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime)
|
||||||
|
{
|
||||||
|
hw_ostc_parser_t *parser = (hw_ostc_parser_t *) abstract;
|
||||||
|
const unsigned char *data = abstract->data;
|
||||||
|
unsigned int size = abstract->size;
|
||||||
|
|
||||||
|
// Cache the header data.
|
||||||
|
dc_status_t rc = hw_ostc_parser_cache (parser);
|
||||||
|
if (rc != DC_STATUS_SUCCESS)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
unsigned int version = parser->version;
|
||||||
|
const hw_ostc_layout_t *layout = parser->layout;
|
||||||
|
|
||||||
unsigned int divetime = 0;
|
unsigned int divetime = 0;
|
||||||
if (version > 0x20) {
|
if (version > 0x20) {
|
||||||
// Use the dive time stored in the extended header, rounded down towards
|
// Use the dive time stored in the extended header, rounded down towards
|
||||||
@ -256,41 +300,13 @@ hw_ostc_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigned
|
|||||||
const unsigned char *data = abstract->data;
|
const unsigned char *data = abstract->data;
|
||||||
unsigned int size = abstract->size;
|
unsigned int size = abstract->size;
|
||||||
|
|
||||||
if (size < 9) {
|
// Cache the header data.
|
||||||
ERROR(abstract->context, "Header too small.");
|
dc_status_t rc = hw_ostc_parser_cache (parser);
|
||||||
return DC_STATUS_DATAFORMAT;
|
if (rc != DC_STATUS_SUCCESS)
|
||||||
}
|
return rc;
|
||||||
|
|
||||||
// Check the profile version
|
unsigned int version = parser->version;
|
||||||
unsigned int version = data[parser->frog ? 8 : 2];
|
const hw_ostc_layout_t *layout = parser->layout;
|
||||||
const hw_ostc_layout_t *layout = NULL;
|
|
||||||
unsigned int header = 0;
|
|
||||||
switch (version) {
|
|
||||||
case 0x20:
|
|
||||||
layout = &hw_ostc_layout_ostc;
|
|
||||||
header = 47;
|
|
||||||
break;
|
|
||||||
case 0x21:
|
|
||||||
layout = &hw_ostc_layout_ostc;
|
|
||||||
header = 57;
|
|
||||||
break;
|
|
||||||
case 0x22:
|
|
||||||
layout = &hw_ostc_layout_frog;
|
|
||||||
header = 256;
|
|
||||||
break;
|
|
||||||
case 0x23:
|
|
||||||
layout = &hw_ostc_layout_ostc3;
|
|
||||||
header = 256;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ERROR(abstract->context, "Unknown data format version.");
|
|
||||||
return DC_STATUS_DATAFORMAT;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (size < header) {
|
|
||||||
ERROR(abstract->context, "Header too small.");
|
|
||||||
return DC_STATUS_DATAFORMAT;
|
|
||||||
}
|
|
||||||
|
|
||||||
dc_gasmix_t *gasmix = (dc_gasmix_t *) value;
|
dc_gasmix_t *gasmix = (dc_gasmix_t *) value;
|
||||||
dc_salinity_t *water = (dc_salinity_t *) value;
|
dc_salinity_t *water = (dc_salinity_t *) value;
|
||||||
@ -417,41 +433,14 @@ hw_ostc_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t call
|
|||||||
const unsigned char *data = abstract->data;
|
const unsigned char *data = abstract->data;
|
||||||
unsigned int size = abstract->size;
|
unsigned int size = abstract->size;
|
||||||
|
|
||||||
if (size < 9) {
|
// Cache the parser data.
|
||||||
ERROR(abstract->context, "Header too small.");
|
dc_status_t rc = hw_ostc_parser_cache (parser);
|
||||||
return DC_STATUS_DATAFORMAT;
|
if (rc != DC_STATUS_SUCCESS)
|
||||||
}
|
return rc;
|
||||||
|
|
||||||
// Check the profile version
|
unsigned int version = parser->version;
|
||||||
unsigned int version = data[parser->frog ? 8 : 2];
|
unsigned int header = parser->header;
|
||||||
const hw_ostc_layout_t *layout = NULL;
|
const hw_ostc_layout_t *layout = parser->layout;
|
||||||
unsigned int header = 0;
|
|
||||||
switch (version) {
|
|
||||||
case 0x20:
|
|
||||||
layout = &hw_ostc_layout_ostc;
|
|
||||||
header = 47;
|
|
||||||
break;
|
|
||||||
case 0x21:
|
|
||||||
layout = &hw_ostc_layout_ostc;
|
|
||||||
header = 57;
|
|
||||||
break;
|
|
||||||
case 0x22:
|
|
||||||
layout = &hw_ostc_layout_frog;
|
|
||||||
header = 256;
|
|
||||||
break;
|
|
||||||
case 0x23:
|
|
||||||
layout = &hw_ostc_layout_ostc3;
|
|
||||||
header = 256;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ERROR(abstract->context, "Unknown data format version.");
|
|
||||||
return DC_STATUS_DATAFORMAT;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (size < header) {
|
|
||||||
ERROR(abstract->context, "Header too small.");
|
|
||||||
return DC_STATUS_DATAFORMAT;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the sample rate.
|
// Get the sample rate.
|
||||||
unsigned int samplerate = 0;
|
unsigned int samplerate = 0;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user