diff --git a/src/cressi_edy_parser.c b/src/cressi_edy_parser.c index 8c881df..da7d2bf 100644 --- a/src/cressi_edy_parser.c +++ b/src/cressi_edy_parser.c @@ -42,6 +42,7 @@ static const parser_backend_t cressi_edy_parser_backend = { PARSER_TYPE_CRESSI_EDY, cressi_edy_parser_set_data, /* set_data */ cressi_edy_parser_get_datetime, /* datetime */ + NULL, /* fields */ cressi_edy_parser_samples_foreach, /* samples_foreach */ cressi_edy_parser_destroy /* destroy */ }; diff --git a/src/hw_ostc_parser.c b/src/hw_ostc_parser.c index 488b200..65599fc 100644 --- a/src/hw_ostc_parser.c +++ b/src/hw_ostc_parser.c @@ -48,6 +48,7 @@ static const parser_backend_t hw_ostc_parser_backend = { PARSER_TYPE_HW_OSTC, hw_ostc_parser_set_data, /* set_data */ hw_ostc_parser_get_datetime, /* datetime */ + NULL, /* fields */ hw_ostc_parser_samples_foreach, /* samples_foreach */ hw_ostc_parser_destroy /* destroy */ }; diff --git a/src/libdivecomputer.symbols b/src/libdivecomputer.symbols index be3d1a8..93cb1d9 100644 --- a/src/libdivecomputer.symbols +++ b/src/libdivecomputer.symbols @@ -19,6 +19,7 @@ dc_datetime_gmtime parser_get_type parser_set_data parser_get_datetime +parser_get_field parser_samples_foreach parser_destroy diff --git a/src/mares_iconhd_parser.c b/src/mares_iconhd_parser.c index 94eb4a8..c5af473 100644 --- a/src/mares_iconhd_parser.c +++ b/src/mares_iconhd_parser.c @@ -41,6 +41,7 @@ static const parser_backend_t mares_iconhd_parser_backend = { PARSER_TYPE_MARES_ICONHD, mares_iconhd_parser_set_data, /* set_data */ mares_iconhd_parser_get_datetime, /* datetime */ + NULL, /* fields */ mares_iconhd_parser_samples_foreach, /* samples_foreach */ mares_iconhd_parser_destroy /* destroy */ }; diff --git a/src/mares_nemo_parser.c b/src/mares_nemo_parser.c index 208454d..2bccbc3 100644 --- a/src/mares_nemo_parser.c +++ b/src/mares_nemo_parser.c @@ -52,6 +52,7 @@ 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 */ + NULL, /* fields */ mares_nemo_parser_samples_foreach, /* samples_foreach */ mares_nemo_parser_destroy /* destroy */ }; diff --git a/src/oceanic_atom2_parser.c b/src/oceanic_atom2_parser.c index be946be..46c29b1 100644 --- a/src/oceanic_atom2_parser.c +++ b/src/oceanic_atom2_parser.c @@ -57,6 +57,7 @@ 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 */ + NULL, /* fields */ oceanic_atom2_parser_samples_foreach, /* samples_foreach */ oceanic_atom2_parser_destroy /* destroy */ }; diff --git a/src/oceanic_veo250_parser.c b/src/oceanic_veo250_parser.c index d6f06f3..5217249 100644 --- a/src/oceanic_veo250_parser.c +++ b/src/oceanic_veo250_parser.c @@ -44,6 +44,7 @@ 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 */ + NULL, /* fields */ oceanic_veo250_parser_samples_foreach, /* samples_foreach */ oceanic_veo250_parser_destroy /* destroy */ }; diff --git a/src/oceanic_vtpro_parser.c b/src/oceanic_vtpro_parser.c index 78f9f49..306fc2a 100644 --- a/src/oceanic_vtpro_parser.c +++ b/src/oceanic_vtpro_parser.c @@ -43,6 +43,7 @@ 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 */ + NULL, /* fields */ oceanic_vtpro_parser_samples_foreach, /* samples_foreach */ oceanic_vtpro_parser_destroy /* destroy */ }; diff --git a/src/parser-private.h b/src/parser-private.h index 6eea8b4..86c70d8 100644 --- a/src/parser-private.h +++ b/src/parser-private.h @@ -46,6 +46,8 @@ struct parser_backend_t { parser_status_t (*datetime) (parser_t *parser, dc_datetime_t *datetime); + parser_status_t (*field) (parser_t *parser, parser_field_type_t type, unsigned int flags, void *value); + parser_status_t (*samples_foreach) (parser_t *parser, sample_callback_t callback, void *userdata); parser_status_t (*destroy) (parser_t *parser); diff --git a/src/parser.c b/src/parser.c index 8304b7a..96e80a4 100644 --- a/src/parser.c +++ b/src/parser.c @@ -71,6 +71,18 @@ parser_get_datetime (parser_t *parser, dc_datetime_t *datetime) return parser->backend->datetime (parser, datetime); } +parser_status_t +parser_get_field (parser_t *parser, parser_field_type_t type, unsigned int flags, void *value) +{ + if (parser == NULL) + return PARSER_STATUS_UNSUPPORTED; + + if (parser->backend->field == NULL) + return PARSER_STATUS_UNSUPPORTED; + + return parser->backend->field (parser, type, flags, value); +} + parser_status_t parser_samples_foreach (parser_t *parser, sample_callback_t callback, void *userdata) diff --git a/src/parser.h b/src/parser.h index b264007..2b58bac 100644 --- a/src/parser.h +++ b/src/parser.h @@ -68,6 +68,14 @@ typedef enum parser_sample_type_t { SAMPLE_TYPE_VENDOR } parser_sample_type_t; +typedef enum parser_field_type_t { + FIELD_TYPE_DIVETIME, + FIELD_TYPE_MAXDEPTH, + FIELD_TYPE_AVGDEPTH, + FIELD_TYPE_GASMIX_COUNT, + FIELD_TYPE_GASMIX +} parser_field_type_t; + typedef enum parser_sample_event_t { SAMPLE_EVENT_NONE, SAMPLE_EVENT_DECOSTOP, @@ -111,6 +119,12 @@ typedef enum parser_sample_vendor_t { SAMPLE_VENDOR_OCEANIC_ATOM2 } parser_sample_vendor_t; +typedef struct gasmix_t { + double helium; + double oxygen; + double nitrogen; +} gasmix_t; + typedef union parser_sample_value_t { unsigned int time; double depth; @@ -148,6 +162,9 @@ 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_get_field (parser_t *parser, parser_field_type_t type, unsigned int flags, void *value); + parser_status_t parser_samples_foreach (parser_t *parser, sample_callback_t callback, void *userdata); diff --git a/src/reefnet_sensus_parser.c b/src/reefnet_sensus_parser.c index 2604161..4d2351a 100644 --- a/src/reefnet_sensus_parser.c +++ b/src/reefnet_sensus_parser.c @@ -50,6 +50,7 @@ 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 */ + NULL, /* fields */ reefnet_sensus_parser_samples_foreach, /* samples_foreach */ reefnet_sensus_parser_destroy /* destroy */ }; diff --git a/src/reefnet_sensuspro_parser.c b/src/reefnet_sensuspro_parser.c index ca7d05b..27e2cb1 100644 --- a/src/reefnet_sensuspro_parser.c +++ b/src/reefnet_sensuspro_parser.c @@ -49,6 +49,7 @@ 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 */ + NULL, /* fields */ reefnet_sensuspro_parser_samples_foreach, /* samples_foreach */ reefnet_sensuspro_parser_destroy /* destroy */ }; diff --git a/src/reefnet_sensusultra_parser.c b/src/reefnet_sensusultra_parser.c index f23aec1..9ad164d 100644 --- a/src/reefnet_sensusultra_parser.c +++ b/src/reefnet_sensusultra_parser.c @@ -49,6 +49,7 @@ 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 */ + NULL, /* fields */ reefnet_sensusultra_parser_samples_foreach, /* samples_foreach */ reefnet_sensusultra_parser_destroy /* destroy */ }; diff --git a/src/suunto_d9_parser.c b/src/suunto_d9_parser.c index a379c46..3c3f783 100644 --- a/src/suunto_d9_parser.c +++ b/src/suunto_d9_parser.c @@ -45,6 +45,7 @@ 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 */ + NULL, /* fields */ suunto_d9_parser_samples_foreach, /* samples_foreach */ suunto_d9_parser_destroy /* destroy */ }; diff --git a/src/suunto_eon_parser.c b/src/suunto_eon_parser.c index 1747ab3..06717d0 100644 --- a/src/suunto_eon_parser.c +++ b/src/suunto_eon_parser.c @@ -43,6 +43,7 @@ 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 */ + NULL, /* fields */ suunto_eon_parser_samples_foreach, /* samples_foreach */ suunto_eon_parser_destroy /* destroy */ }; diff --git a/src/suunto_solution_parser.c b/src/suunto_solution_parser.c index 9dd607d..41c04fd 100644 --- a/src/suunto_solution_parser.c +++ b/src/suunto_solution_parser.c @@ -40,6 +40,7 @@ static const parser_backend_t suunto_solution_parser_backend = { PARSER_TYPE_SUUNTO_SOLUTION, suunto_solution_parser_set_data, /* set_data */ NULL, /* datetime */ + NULL, /* fields */ suunto_solution_parser_samples_foreach, /* samples_foreach */ suunto_solution_parser_destroy /* destroy */ }; diff --git a/src/suunto_vyper_parser.c b/src/suunto_vyper_parser.c index 53077bd..ddbf309 100644 --- a/src/suunto_vyper_parser.c +++ b/src/suunto_vyper_parser.c @@ -41,6 +41,7 @@ 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 */ + NULL, /* fields */ suunto_vyper_parser_samples_foreach, /* samples_foreach */ suunto_vyper_parser_destroy /* destroy */ }; diff --git a/src/uwatec_memomouse_parser.c b/src/uwatec_memomouse_parser.c index 940fa3d..89af203 100644 --- a/src/uwatec_memomouse_parser.c +++ b/src/uwatec_memomouse_parser.c @@ -43,6 +43,7 @@ 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 */ + NULL, /* fields */ uwatec_memomouse_parser_samples_foreach, /* samples_foreach */ uwatec_memomouse_parser_destroy /* destroy */ }; diff --git a/src/uwatec_smart_parser.c b/src/uwatec_smart_parser.c index 58384b6..5849292 100644 --- a/src/uwatec_smart_parser.c +++ b/src/uwatec_smart_parser.c @@ -49,6 +49,7 @@ 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 */ + NULL, /* fields */ uwatec_smart_parser_samples_foreach, /* samples_foreach */ uwatec_smart_parser_destroy /* destroy */ };