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; if (version > 0x20) { // Use the dive time stored in the extended header, rounded down towards // the nearest minute, to match the value displayed by the ostc. divetime = (array_uint16_le (data + layout->duration) / 60) * 60; } else { // Use the normal dive time (excluding the shallow parts of the dive). divetime = array_uint16_le (data + layout->divetime) * 60 + data[layout->divetime + 2]; } const unsigned char *p = data + layout->datetime; dc_datetime_t dt; if (version == 0x23) { dt.year = p[0] + 2000; dt.month = p[1]; dt.day = p[2]; } else { dt.year = p[2] + 2000; dt.month = p[0]; dt.day = p[1]; } dt.hour = p[3]; dt.minute = p[4]; dt.second = 0; dc_ticks_t ticks = dc_datetime_mktime (&dt); if (ticks == (dc_ticks_t) -1) return DC_STATUS_DATAFORMAT; ticks -= divetime; if (!dc_datetime_localtime (datetime, ticks)) return DC_STATUS_DATAFORMAT; return DC_STATUS_SUCCESS; }
static dc_status_t reefnet_sensus_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime) { reefnet_sensus_parser_t *parser = (reefnet_sensus_parser_t *) abstract; if (abstract->size < 2 + 4) return DC_STATUS_DATAFORMAT; 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 DC_STATUS_DATAFORMAT; return DC_STATUS_SUCCESS; }