Add datetime support to the parsers.

This commit is contained in:
Jef Driesen 2010-02-02 15:04:46 +00:00
parent fab15b19a7
commit a8116a0aec
24 changed files with 375 additions and 16 deletions

View File

@ -15,6 +15,7 @@ dc_datetime_gmtime
parser_get_type
parser_set_data
parser_get_datetime
parser_samples_foreach
parser_destroy

View File

@ -35,12 +35,14 @@ struct mares_nemo_parser_t {
};
static parser_status_t mares_nemo_parser_set_data (parser_t *abstract, const unsigned char *data, unsigned int size);
static parser_status_t mares_nemo_parser_get_datetime (parser_t *abstract, dc_datetime_t *datetime);
static parser_status_t mares_nemo_parser_samples_foreach (parser_t *abstract, sample_callback_t callback, void *userdata);
static parser_status_t mares_nemo_parser_destroy (parser_t *abstract);
static const parser_backend_t mares_nemo_parser_backend = {
PARSER_TYPE_MARES_NEMO,
mares_nemo_parser_set_data, /* set_data */
mares_nemo_parser_get_datetime, /* datetime */
mares_nemo_parser_samples_foreach, /* samples_foreach */
mares_nemo_parser_destroy /* destroy */
};
@ -101,6 +103,32 @@ mares_nemo_parser_set_data (parser_t *abstract, const unsigned char *data, unsig
}
static parser_status_t
mares_nemo_parser_get_datetime (parser_t *abstract, dc_datetime_t *datetime)
{
if (abstract->size < 2)
return PARSER_STATUS_ERROR;
unsigned int length = array_uint16_le (abstract->data);
if (length < 8 || length > abstract->size)
return PARSER_STATUS_ERROR;
const unsigned char *p = abstract->data + length - 8;
if (datetime) {
datetime->year = p[0] + 2000;
datetime->month = p[1];
datetime->day = p[2];
datetime->hour = p[3];
datetime->minute = p[4];
datetime->second = 0;
}
return PARSER_STATUS_SUCCESS;
}
static parser_status_t
mares_nemo_parser_samples_foreach (parser_t *abstract, sample_callback_t callback, void *userdata)
{

View File

@ -36,7 +36,7 @@ device_status_t
oceanic_atom2_device_keepalive (device_t *device);
parser_status_t
oceanic_atom2_parser_create (parser_t **parser);
oceanic_atom2_parser_create (parser_t **parser, unsigned int model);
#ifdef __cplusplus
}

View File

@ -33,15 +33,18 @@ typedef struct oceanic_atom2_parser_t oceanic_atom2_parser_t;
struct oceanic_atom2_parser_t {
parser_t base;
unsigned int model;
};
static parser_status_t oceanic_atom2_parser_set_data (parser_t *abstract, const unsigned char *data, unsigned int size);
static parser_status_t oceanic_atom2_parser_get_datetime (parser_t *abstract, dc_datetime_t *datetime);
static parser_status_t oceanic_atom2_parser_samples_foreach (parser_t *abstract, sample_callback_t callback, void *userdata);
static parser_status_t oceanic_atom2_parser_destroy (parser_t *abstract);
static const parser_backend_t oceanic_atom2_parser_backend = {
PARSER_TYPE_OCEANIC_ATOM2,
oceanic_atom2_parser_set_data, /* set_data */
oceanic_atom2_parser_get_datetime, /* datetime */
oceanic_atom2_parser_samples_foreach, /* samples_foreach */
oceanic_atom2_parser_destroy /* destroy */
};
@ -58,7 +61,7 @@ parser_is_oceanic_atom2 (parser_t *abstract)
parser_status_t
oceanic_atom2_parser_create (parser_t **out)
oceanic_atom2_parser_create (parser_t **out, unsigned int model)
{
if (out == NULL)
return PARSER_STATUS_ERROR;
@ -73,6 +76,9 @@ oceanic_atom2_parser_create (parser_t **out)
// Initialize the base class.
parser_init (&parser->base, &oceanic_atom2_parser_backend);
// Set the default values.
parser->model = model;
*out = (parser_t*) parser;
return PARSER_STATUS_SUCCESS;
@ -102,6 +108,43 @@ oceanic_atom2_parser_set_data (parser_t *abstract, const unsigned char *data, un
}
static parser_status_t
oceanic_atom2_parser_get_datetime (parser_t *abstract, dc_datetime_t *datetime)
{
oceanic_atom2_parser_t *parser = (oceanic_atom2_parser_t *) abstract;
if (abstract->size < 8)
return PARSER_STATUS_ERROR;
const unsigned char *p = abstract->data;
if (datetime) {
if (parser->model == 0x4258) {
// VT3
datetime->year = ((p[3] & 0xE0) >> 1) + (p[4] & 0x0F) + 2000;
datetime->month = (p[4] & 0xF0) >> 4;
datetime->day = p[3] & 0x1F;
datetime->hour = bcd2dec (p[1] & 0x7F);
} else {
// Atom 2
datetime->year = bcd2dec (((p[3] & 0xC0) >> 2) + (p[4] & 0x0F)) + 2000;
datetime->month = (p[4] & 0xF0) >> 4;
datetime->day = bcd2dec (p[3] & 0x3F);
datetime->hour = bcd2dec (p[1] & 0x1F);
}
datetime->minute = bcd2dec (p[0]);
datetime->second = 0;
// Convert to a 24-hour clock.
datetime->hour %= 12;
if (p[1] & 0x80)
datetime->hour += 12;
}
return PARSER_STATUS_SUCCESS;
}
static parser_status_t
oceanic_atom2_parser_samples_foreach (parser_t *abstract, sample_callback_t callback, void *userdata)
{

View File

@ -36,12 +36,14 @@ struct oceanic_veo250_parser_t {
};
static parser_status_t oceanic_veo250_parser_set_data (parser_t *abstract, const unsigned char *data, unsigned int size);
static parser_status_t oceanic_veo250_parser_get_datetime (parser_t *abstract, dc_datetime_t *datetime);
static parser_status_t oceanic_veo250_parser_samples_foreach (parser_t *abstract, sample_callback_t callback, void *userdata);
static parser_status_t oceanic_veo250_parser_destroy (parser_t *abstract);
static const parser_backend_t oceanic_veo250_parser_backend = {
PARSER_TYPE_OCEANIC_VEO250,
oceanic_veo250_parser_set_data, /* set_data */
oceanic_veo250_parser_get_datetime, /* datetime */
oceanic_veo250_parser_samples_foreach, /* samples_foreach */
oceanic_veo250_parser_destroy /* destroy */
};
@ -102,6 +104,26 @@ oceanic_veo250_parser_set_data (parser_t *abstract, const unsigned char *data, u
}
static parser_status_t
oceanic_veo250_parser_get_datetime (parser_t *abstract, dc_datetime_t *datetime)
{
if (abstract->size < 8)
return PARSER_STATUS_ERROR;
const unsigned char *p = abstract->data;
if (datetime) {
datetime->year = ((p[5] & 0xF0) >> 4) + ((p[1] & 0xE0) >> 1) + 2003;
datetime->month = ((p[7] & 0xF0) >> 4);
datetime->day = p[1] & 0x1F;
datetime->hour = p[3];
datetime->minute = p[2];
datetime->second = 0;
}
return PARSER_STATUS_SUCCESS;
}
static parser_status_t
oceanic_veo250_parser_samples_foreach (parser_t *abstract, sample_callback_t callback, void *userdata)
{

View File

@ -36,12 +36,14 @@ struct oceanic_vtpro_parser_t {
};
static parser_status_t oceanic_vtpro_parser_set_data (parser_t *abstract, const unsigned char *data, unsigned int size);
static parser_status_t oceanic_vtpro_parser_get_datetime (parser_t *abstract, dc_datetime_t *datetime);
static parser_status_t oceanic_vtpro_parser_samples_foreach (parser_t *abstract, sample_callback_t callback, void *userdata);
static parser_status_t oceanic_vtpro_parser_destroy (parser_t *abstract);
static const parser_backend_t oceanic_vtpro_parser_backend = {
PARSER_TYPE_OCEANIC_VTPRO,
oceanic_vtpro_parser_set_data, /* set_data */
oceanic_vtpro_parser_get_datetime, /* datetime */
oceanic_vtpro_parser_samples_foreach, /* samples_foreach */
oceanic_vtpro_parser_destroy /* destroy */
};
@ -102,6 +104,32 @@ oceanic_vtpro_parser_set_data (parser_t *abstract, const unsigned char *data, un
}
static parser_status_t
oceanic_vtpro_parser_get_datetime (parser_t *abstract, dc_datetime_t *datetime)
{
if (abstract->size < 8)
return PARSER_STATUS_ERROR;
const unsigned char *p = abstract->data;
if (datetime) {
datetime->year = bcd2dec (p[4] & 0x0F) + 2000;
datetime->month = (p[4] & 0xF0) >> 4;
datetime->day = bcd2dec (p[3]);
datetime->hour = bcd2dec (p[1] & 0x7F);
datetime->minute = bcd2dec (p[0]);
datetime->second = 0;
// Convert to a 24-hour clock.
datetime->hour %= 12;
if (p[1] & 0x80)
datetime->hour += 12;
}
return PARSER_STATUS_SUCCESS;
}
static parser_status_t
oceanic_vtpro_parser_samples_foreach (parser_t *abstract, sample_callback_t callback, void *userdata)
{

View File

@ -22,12 +22,12 @@
#ifndef PARSER_PRIVATE_H
#define PARSER_PRIVATE_H
#include "parser.h"
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#include "parser.h"
struct parser_t;
struct parser_backend_t;
@ -44,6 +44,8 @@ struct parser_backend_t {
parser_status_t (*set_data) (parser_t *parser, const unsigned char *data, unsigned int size);
parser_status_t (*datetime) (parser_t *parser, dc_datetime_t *datetime);
parser_status_t (*samples_foreach) (parser_t *parser, sample_callback_t callback, void *userdata);
parser_status_t (*destroy) (parser_t *parser);

View File

@ -59,6 +59,19 @@ parser_set_data (parser_t *parser, const unsigned char *data, unsigned int size)
}
parser_status_t
parser_get_datetime (parser_t *parser, dc_datetime_t *datetime)
{
if (parser == NULL)
return PARSER_STATUS_UNSUPPORTED;
if (parser->backend->datetime == NULL)
return PARSER_STATUS_UNSUPPORTED;
return parser->backend->datetime (parser, datetime);
}
parser_status_t
parser_samples_foreach (parser_t *parser, sample_callback_t callback, void *userdata)
{

View File

@ -22,6 +22,8 @@
#ifndef PARSER_H
#define PARSER_H
#include "datetime.h"
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
@ -140,6 +142,9 @@ parser_get_type (parser_t *device);
parser_status_t
parser_set_data (parser_t *parser, const unsigned char *data, unsigned int size);
parser_status_t
parser_get_datetime (parser_t *parser, dc_datetime_t *datetime);
parser_status_t
parser_samples_foreach (parser_t *parser, sample_callback_t callback, void *userdata);

View File

@ -45,7 +45,7 @@ device_status_t
reefnet_sensus_extract_dives (device_t *device, const unsigned char data[], unsigned int size, dive_callback_t callback, void *userdata);
parser_status_t
reefnet_sensus_parser_create (parser_t **parser);
reefnet_sensus_parser_create (parser_t **parser, unsigned int devtime, dc_ticks_t systime);
parser_status_t
reefnet_sensus_parser_set_calibration (parser_t *parser, double atmospheric, double hydrostatic);

View File

@ -26,6 +26,7 @@
#include "parser-private.h"
#include "units.h"
#include "utils.h"
#include "array.h"
#define SAMPLE_DEPTH_ADJUST 13
@ -36,15 +37,20 @@ struct reefnet_sensus_parser_t {
// Depth calibration.
double atmospheric;
double hydrostatic;
// Clock synchronization.
unsigned int devtime;
dc_ticks_t systime;
};
static parser_status_t reefnet_sensus_parser_set_data (parser_t *abstract, const unsigned char *data, unsigned int size);
static parser_status_t reefnet_sensus_parser_get_datetime (parser_t *abstract, dc_datetime_t *datetime);
static parser_status_t reefnet_sensus_parser_samples_foreach (parser_t *abstract, sample_callback_t callback, void *userdata);
static parser_status_t reefnet_sensus_parser_destroy (parser_t *abstract);
static const parser_backend_t reefnet_sensus_parser_backend = {
PARSER_TYPE_REEFNET_SENSUS,
reefnet_sensus_parser_set_data, /* set_data */
reefnet_sensus_parser_get_datetime, /* datetime */
reefnet_sensus_parser_samples_foreach, /* samples_foreach */
reefnet_sensus_parser_destroy /* destroy */
};
@ -61,7 +67,7 @@ parser_is_reefnet_sensus (parser_t *abstract)
parser_status_t
reefnet_sensus_parser_create (parser_t **out)
reefnet_sensus_parser_create (parser_t **out, unsigned int devtime, dc_ticks_t systime)
{
if (out == NULL)
return PARSER_STATUS_ERROR;
@ -79,6 +85,8 @@ reefnet_sensus_parser_create (parser_t **out)
// Set the default values.
parser->atmospheric = ATM;
parser->hydrostatic = 1025.0 * GRAVITY;
parser->devtime = devtime;
parser->systime = systime;
*out = (parser_t*) parser;
@ -124,6 +132,25 @@ reefnet_sensus_parser_set_calibration (parser_t *abstract, double atmospheric, d
}
static parser_status_t
reefnet_sensus_parser_get_datetime (parser_t *abstract, dc_datetime_t *datetime)
{
reefnet_sensus_parser_t *parser = (reefnet_sensus_parser_t *) abstract;
if (abstract->size < 2 + 4)
return PARSER_STATUS_ERROR;
unsigned int timestamp = array_uint32_le (abstract->data + 2);
dc_ticks_t ticks = parser->systime - (parser->devtime - timestamp);
if (!dc_datetime_localtime (datetime, ticks))
return PARSER_STATUS_ERROR;
return PARSER_STATUS_SUCCESS;
}
static parser_status_t
reefnet_sensus_parser_samples_foreach (parser_t *abstract, sample_callback_t callback, void *userdata)
{

View File

@ -48,7 +48,7 @@ device_status_t
reefnet_sensuspro_extract_dives (device_t *device, const unsigned char data[], unsigned int size, dive_callback_t callback, void *userdata);
parser_status_t
reefnet_sensuspro_parser_create (parser_t **parser);
reefnet_sensuspro_parser_create (parser_t **parser, unsigned int devtime, dc_ticks_t systime);
parser_status_t
reefnet_sensuspro_parser_set_calibration (parser_t *parser, double atmospheric, double hydrostatic);

View File

@ -36,15 +36,20 @@ struct reefnet_sensuspro_parser_t {
// Depth calibration.
double atmospheric;
double hydrostatic;
// Clock synchronization.
unsigned int devtime;
dc_ticks_t systime;
};
static parser_status_t reefnet_sensuspro_parser_set_data (parser_t *abstract, const unsigned char *data, unsigned int size);
static parser_status_t reefnet_sensuspro_parser_get_datetime (parser_t *abstract, dc_datetime_t *datetime);
static parser_status_t reefnet_sensuspro_parser_samples_foreach (parser_t *abstract, sample_callback_t callback, void *userdata);
static parser_status_t reefnet_sensuspro_parser_destroy (parser_t *abstract);
static const parser_backend_t reefnet_sensuspro_parser_backend = {
PARSER_TYPE_REEFNET_SENSUSPRO,
reefnet_sensuspro_parser_set_data, /* set_data */
reefnet_sensuspro_parser_get_datetime, /* datetime */
reefnet_sensuspro_parser_samples_foreach, /* samples_foreach */
reefnet_sensuspro_parser_destroy /* destroy */
};
@ -61,7 +66,7 @@ parser_is_reefnet_sensuspro (parser_t *abstract)
parser_status_t
reefnet_sensuspro_parser_create (parser_t **out)
reefnet_sensuspro_parser_create (parser_t **out, unsigned int devtime, dc_ticks_t systime)
{
if (out == NULL)
return PARSER_STATUS_ERROR;
@ -79,6 +84,8 @@ reefnet_sensuspro_parser_create (parser_t **out)
// Set the default values.
parser->atmospheric = ATM;
parser->hydrostatic = 1025.0 * GRAVITY;
parser->devtime = devtime;
parser->systime = systime;
*out = (parser_t*) parser;
@ -124,6 +131,25 @@ reefnet_sensuspro_parser_set_calibration (parser_t *abstract, double atmospheric
}
static parser_status_t
reefnet_sensuspro_parser_get_datetime (parser_t *abstract, dc_datetime_t *datetime)
{
reefnet_sensuspro_parser_t *parser = (reefnet_sensuspro_parser_t *) abstract;
if (abstract->size < 6 + 4)
return PARSER_STATUS_ERROR;
unsigned int timestamp = array_uint32_le (abstract->data + 6);
dc_ticks_t ticks = parser->systime - (parser->devtime - timestamp);
if (!dc_datetime_localtime (datetime, ticks))
return PARSER_STATUS_ERROR;
return PARSER_STATUS_SUCCESS;
}
static parser_status_t
reefnet_sensuspro_parser_samples_foreach (parser_t *abstract, sample_callback_t callback, void *userdata)
{

View File

@ -71,7 +71,7 @@ device_status_t
reefnet_sensusultra_extract_dives (device_t *device, const unsigned char data[], unsigned int size, dive_callback_t callback, void *userdata);
parser_status_t
reefnet_sensusultra_parser_create (parser_t **parser);
reefnet_sensusultra_parser_create (parser_t **parser, unsigned int devtime, dc_ticks_t systime);
parser_status_t
reefnet_sensusultra_parser_set_calibration (parser_t *parser, double atmospheric, double hydrostatic);

View File

@ -36,15 +36,20 @@ struct reefnet_sensusultra_parser_t {
// Depth calibration.
double atmospheric;
double hydrostatic;
// Clock synchronization.
unsigned int devtime;
dc_ticks_t systime;
};
static parser_status_t reefnet_sensusultra_parser_set_data (parser_t *abstract, const unsigned char *data, unsigned int size);
static parser_status_t reefnet_sensusultra_parser_get_datetime (parser_t *abstract, dc_datetime_t *datetime);
static parser_status_t reefnet_sensusultra_parser_samples_foreach (parser_t *abstract, sample_callback_t callback, void *userdata);
static parser_status_t reefnet_sensusultra_parser_destroy (parser_t *abstract);
static const parser_backend_t reefnet_sensusultra_parser_backend = {
PARSER_TYPE_REEFNET_SENSUSULTRA,
reefnet_sensusultra_parser_set_data, /* set_data */
reefnet_sensusultra_parser_get_datetime, /* datetime */
reefnet_sensusultra_parser_samples_foreach, /* samples_foreach */
reefnet_sensusultra_parser_destroy /* destroy */
};
@ -61,7 +66,7 @@ parser_is_reefnet_sensusultra (parser_t *abstract)
parser_status_t
reefnet_sensusultra_parser_create (parser_t **out)
reefnet_sensusultra_parser_create (parser_t **out, unsigned int devtime, dc_ticks_t systime)
{
if (out == NULL)
return PARSER_STATUS_ERROR;
@ -79,6 +84,8 @@ reefnet_sensusultra_parser_create (parser_t **out)
// Set the default values.
parser->atmospheric = ATM;
parser->hydrostatic = 1025.0 * GRAVITY;
parser->devtime = devtime;
parser->systime = systime;
*out = (parser_t*) parser;
@ -124,6 +131,25 @@ reefnet_sensusultra_parser_set_calibration (parser_t *abstract, double atmospher
}
static parser_status_t
reefnet_sensusultra_parser_get_datetime (parser_t *abstract, dc_datetime_t *datetime)
{
reefnet_sensusultra_parser_t *parser = (reefnet_sensusultra_parser_t *) abstract;
if (abstract->size < 4 + 4)
return PARSER_STATUS_ERROR;
unsigned int timestamp = array_uint32_le (abstract->data + 4);
dc_ticks_t ticks = parser->systime - (parser->devtime - timestamp);
if (!dc_datetime_localtime (datetime, ticks))
return PARSER_STATUS_ERROR;
return PARSER_STATUS_SUCCESS;
}
static parser_status_t
reefnet_sensusultra_parser_samples_foreach (parser_t *abstract, sample_callback_t callback, void *userdata)
{

View File

@ -38,12 +38,14 @@ struct suunto_d9_parser_t {
};
static parser_status_t suunto_d9_parser_set_data (parser_t *abstract, const unsigned char *data, unsigned int size);
static parser_status_t suunto_d9_parser_get_datetime (parser_t *abstract, dc_datetime_t *datetime);
static parser_status_t suunto_d9_parser_samples_foreach (parser_t *abstract, sample_callback_t callback, void *userdata);
static parser_status_t suunto_d9_parser_destroy (parser_t *abstract);
static const parser_backend_t suunto_d9_parser_backend = {
PARSER_TYPE_SUUNTO_D9,
suunto_d9_parser_set_data, /* set_data */
suunto_d9_parser_get_datetime, /* datetime */
suunto_d9_parser_samples_foreach, /* samples_foreach */
suunto_d9_parser_destroy /* destroy */
};
@ -107,6 +109,27 @@ suunto_d9_parser_set_data (parser_t *abstract, const unsigned char *data, unsign
}
static parser_status_t
suunto_d9_parser_get_datetime (parser_t *abstract, dc_datetime_t *datetime)
{
if (abstract->size < 0x15 - 4 + 7)
return PARSER_STATUS_ERROR;
const unsigned char *p = abstract->data + 0x15 - 4;
if (datetime) {
datetime->hour = p[0];
datetime->minute = p[1];
datetime->second = p[2];
datetime->year = p[3] + (p[4] << 8);
datetime->month = p[5];
datetime->day = p[6];
}
return PARSER_STATUS_SUCCESS;
}
static parser_status_t
suunto_d9_parser_samples_foreach (parser_t *abstract, sample_callback_t callback, void *userdata)
{

View File

@ -44,7 +44,7 @@ device_status_t
suunto_eon_extract_dives (device_t *device, const unsigned char data[], unsigned int size, dive_callback_t callback, void *userdata);
parser_status_t
suunto_eon_parser_create (parser_t **parser);
suunto_eon_parser_create (parser_t **parser, int spyder);
#ifdef __cplusplus
}

View File

@ -26,20 +26,24 @@
#include "parser-private.h"
#include "units.h"
#include "utils.h"
#include "array.h"
typedef struct suunto_eon_parser_t suunto_eon_parser_t;
struct suunto_eon_parser_t {
parser_t base;
int spyder;
};
static parser_status_t suunto_eon_parser_set_data (parser_t *abstract, const unsigned char *data, unsigned int size);
static parser_status_t suunto_eon_parser_get_datetime (parser_t *abstract, dc_datetime_t *datetime);
static parser_status_t suunto_eon_parser_samples_foreach (parser_t *abstract, sample_callback_t callback, void *userdata);
static parser_status_t suunto_eon_parser_destroy (parser_t *abstract);
static const parser_backend_t suunto_eon_parser_backend = {
PARSER_TYPE_SUUNTO_EON,
suunto_eon_parser_set_data, /* set_data */
suunto_eon_parser_get_datetime, /* datetime */
suunto_eon_parser_samples_foreach, /* samples_foreach */
suunto_eon_parser_destroy /* destroy */
};
@ -56,7 +60,7 @@ parser_is_suunto_eon (parser_t *abstract)
parser_status_t
suunto_eon_parser_create (parser_t **out)
suunto_eon_parser_create (parser_t **out, int spyder)
{
if (out == NULL)
return PARSER_STATUS_ERROR;
@ -71,6 +75,9 @@ suunto_eon_parser_create (parser_t **out)
// Initialize the base class.
parser_init (&parser->base, &suunto_eon_parser_backend);
// Set the default values.
parser->spyder = spyder;
*out = (parser_t*) parser;
return PARSER_STATUS_SUCCESS;
@ -100,6 +107,37 @@ suunto_eon_parser_set_data (parser_t *abstract, const unsigned char *data, unsig
}
static parser_status_t
suunto_eon_parser_get_datetime (parser_t *abstract, dc_datetime_t *datetime)
{
suunto_eon_parser_t *parser = (suunto_eon_parser_t *) abstract;
if (abstract->size < 6 + 5)
return DEVICE_STATUS_ERROR;
const unsigned char *p = abstract->data + 6;
if (datetime) {
if (parser->spyder) {
datetime->year = p[0] + (p[0] < 90 ? 2000 : 1900);
datetime->month = p[1];
datetime->day = p[2];
datetime->hour = p[3];
datetime->minute = p[4];
} else {
datetime->year = bcd2dec (p[0]) + (bcd2dec (p[0]) < 85 ? 2000 : 1900);
datetime->month = bcd2dec (p[1]);
datetime->day = bcd2dec (p[2]);
datetime->hour = bcd2dec (p[3]);
datetime->minute = bcd2dec (p[4]);
}
datetime->second = 0;
}
return PARSER_STATUS_SUCCESS;
}
static parser_status_t
suunto_eon_parser_samples_foreach (parser_t *abstract, sample_callback_t callback, void *userdata)
{

View File

@ -40,6 +40,7 @@ static parser_status_t suunto_solution_parser_destroy (parser_t *abstract);
static const parser_backend_t suunto_solution_parser_backend = {
PARSER_TYPE_SUUNTO_SOLUTION,
suunto_solution_parser_set_data, /* set_data */
NULL, /* datetime */
suunto_solution_parser_samples_foreach, /* samples_foreach */
suunto_solution_parser_destroy /* destroy */
};

View File

@ -34,12 +34,14 @@ struct suunto_vyper_parser_t {
};
static parser_status_t suunto_vyper_parser_set_data (parser_t *abstract, const unsigned char *data, unsigned int size);
static parser_status_t suunto_vyper_parser_get_datetime (parser_t *abstract, dc_datetime_t *datetime);
static parser_status_t suunto_vyper_parser_samples_foreach (parser_t *abstract, sample_callback_t callback, void *userdata);
static parser_status_t suunto_vyper_parser_destroy (parser_t *abstract);
static const parser_backend_t suunto_vyper_parser_backend = {
PARSER_TYPE_SUUNTO_VYPER,
suunto_vyper_parser_set_data, /* set_data */
suunto_vyper_parser_get_datetime, /* datetime */
suunto_vyper_parser_samples_foreach, /* samples_foreach */
suunto_vyper_parser_destroy /* destroy */
};
@ -100,6 +102,27 @@ suunto_vyper_parser_set_data (parser_t *abstract, const unsigned char *data, uns
}
static parser_status_t
suunto_vyper_parser_get_datetime (parser_t *abstract, dc_datetime_t *datetime)
{
if (abstract->size < 9 + 5)
return DEVICE_STATUS_ERROR;
const unsigned char *p = abstract->data + 9;
if (datetime) {
datetime->year = p[0] + (p[0] < 90 ? 2000 : 1900);
datetime->month = p[1];
datetime->day = p[2];
datetime->hour = p[3];
datetime->minute = p[4];
datetime->second = 0;
}
return PARSER_STATUS_SUCCESS;
}
static parser_status_t
suunto_vyper_parser_samples_foreach (parser_t *abstract, sample_callback_t callback, void *userdata)
{

View File

@ -39,7 +39,7 @@ device_status_t
uwatec_memomouse_extract_dives (device_t *device, const unsigned char data[], unsigned int size, dive_callback_t callback, void *userdata);
parser_status_t
uwatec_memomouse_parser_create (parser_t **parser);
uwatec_memomouse_parser_create (parser_t **parser, unsigned int devtime, dc_ticks_t systime);
#ifdef __cplusplus
}

View File

@ -31,15 +31,19 @@ typedef struct uwatec_memomouse_parser_t uwatec_memomouse_parser_t;
struct uwatec_memomouse_parser_t {
parser_t base;
unsigned int devtime;
dc_ticks_t systime;
};
static parser_status_t uwatec_memomouse_parser_set_data (parser_t *abstract, const unsigned char *data, unsigned int size);
static parser_status_t uwatec_memomouse_parser_get_datetime (parser_t *abstract, dc_datetime_t *datetime);
static parser_status_t uwatec_memomouse_parser_samples_foreach (parser_t *abstract, sample_callback_t callback, void *userdata);
static parser_status_t uwatec_memomouse_parser_destroy (parser_t *abstract);
static const parser_backend_t uwatec_memomouse_parser_backend = {
PARSER_TYPE_UWATEC_MEMOMOUSE,
uwatec_memomouse_parser_set_data, /* set_data */
uwatec_memomouse_parser_get_datetime, /* datetime */
uwatec_memomouse_parser_samples_foreach, /* samples_foreach */
uwatec_memomouse_parser_destroy /* destroy */
};
@ -56,7 +60,7 @@ parser_is_uwatec_memomouse (parser_t *abstract)
parser_status_t
uwatec_memomouse_parser_create (parser_t **out)
uwatec_memomouse_parser_create (parser_t **out, unsigned int devtime, dc_ticks_t systime)
{
if (out == NULL)
return PARSER_STATUS_ERROR;
@ -71,6 +75,10 @@ uwatec_memomouse_parser_create (parser_t **out)
// Initialize the base class.
parser_init (&parser->base, &uwatec_memomouse_parser_backend);
// Set the default values.
parser->devtime = devtime;
parser->systime = systime;
*out = (parser_t*) parser;
return PARSER_STATUS_SUCCESS;
@ -100,6 +108,25 @@ uwatec_memomouse_parser_set_data (parser_t *abstract, const unsigned char *data,
}
static parser_status_t
uwatec_memomouse_parser_get_datetime (parser_t *abstract, dc_datetime_t *datetime)
{
uwatec_memomouse_parser_t *parser = (uwatec_memomouse_parser_t *) abstract;
if (abstract->size < 11 + 4)
return PARSER_STATUS_ERROR;
unsigned int timestamp = array_uint32_le (abstract->data + 11);
dc_ticks_t ticks = parser->systime - (parser->devtime - timestamp) / 2;
if (!dc_datetime_localtime (datetime, ticks))
return PARSER_STATUS_ERROR;
return PARSER_STATUS_SUCCESS;
}
static parser_status_t
uwatec_memomouse_parser_samples_foreach (parser_t *abstract, sample_callback_t callback, void *userdata)
{

View File

@ -41,7 +41,7 @@ device_status_t
uwatec_smart_extract_dives (device_t *device, const unsigned char data[], unsigned int size, dive_callback_t callback, void *userdata);
parser_status_t
uwatec_smart_parser_create (parser_t **parser, unsigned int model);
uwatec_smart_parser_create (parser_t **parser, unsigned int model, unsigned int devtime, dc_ticks_t systime);
#ifdef __cplusplus
}

View File

@ -27,6 +27,7 @@
#include "parser-private.h"
#include "units.h"
#include "utils.h"
#include "array.h"
#define NBITS 8
#define NELEMENTS(x) ( sizeof(x) / sizeof((x)[0]) )
@ -36,15 +37,19 @@ typedef struct uwatec_smart_parser_t uwatec_smart_parser_t;
struct uwatec_smart_parser_t {
parser_t base;
unsigned int model;
unsigned int devtime;
dc_ticks_t systime;
};
static parser_status_t uwatec_smart_parser_set_data (parser_t *abstract, const unsigned char *data, unsigned int size);
static parser_status_t uwatec_smart_parser_get_datetime (parser_t *abstract, dc_datetime_t *datetime);
static parser_status_t uwatec_smart_parser_samples_foreach (parser_t *abstract, sample_callback_t callback, void *userdata);
static parser_status_t uwatec_smart_parser_destroy (parser_t *abstract);
static const parser_backend_t uwatec_smart_parser_backend = {
PARSER_TYPE_UWATEC_SMART,
uwatec_smart_parser_set_data, /* set_data */
uwatec_smart_parser_get_datetime, /* datetime */
uwatec_smart_parser_samples_foreach, /* samples_foreach */
uwatec_smart_parser_destroy /* destroy */
};
@ -61,7 +66,7 @@ parser_is_uwatec_smart (parser_t *abstract)
parser_status_t
uwatec_smart_parser_create (parser_t **out, unsigned int model)
uwatec_smart_parser_create (parser_t **out, unsigned int model, unsigned int devtime, dc_ticks_t systime)
{
if (out == NULL)
return PARSER_STATUS_ERROR;
@ -78,6 +83,8 @@ uwatec_smart_parser_create (parser_t **out, unsigned int model)
// Set the default values.
parser->model = model;
parser->devtime = devtime;
parser->systime = systime;
*out = (parser_t*) parser;
@ -108,6 +115,25 @@ uwatec_smart_parser_set_data (parser_t *abstract, const unsigned char *data, uns
}
static parser_status_t
uwatec_smart_parser_get_datetime (parser_t *abstract, dc_datetime_t *datetime)
{
uwatec_smart_parser_t *parser = (uwatec_smart_parser_t *) abstract;
if (abstract->size < 8 + 4)
return PARSER_STATUS_ERROR;
unsigned int timestamp = array_uint32_le (abstract->data + 8);
dc_ticks_t ticks = parser->systime - (parser->devtime - timestamp) / 2;
if (!dc_datetime_localtime (datetime, ticks))
return PARSER_STATUS_ERROR;
return PARSER_STATUS_SUCCESS;
}
static unsigned int
uwatec_smart_identify (const unsigned char data[], unsigned int size)
{