diff --git a/src/uwatec_galileo_parser.c b/src/uwatec_galileo_parser.c index 55a7dfb..f99ecda 100644 --- a/src/uwatec_galileo_parser.c +++ b/src/uwatec_galileo_parser.c @@ -208,29 +208,29 @@ typedef enum { typedef struct uwatec_galileo_sample_info_t { uwatec_galileo_sample_t type; - unsigned int nbits; + unsigned int ntypebits; unsigned int extrabytes; } uwatec_galileo_sample_info_t; static const uwatec_galileo_sample_info_t uwatec_galileo_sol_table [] = { - {DELTA_DEPTH, 7, 0}, // 0ddd dddd - {DELTA_RBT, 5, 0}, // 100d dddd + {DELTA_DEPTH, 1, 0}, // 0ddd dddd + {DELTA_RBT, 3, 0}, // 100d dddd {DELTA_TANK_PRESSURE, 4, 0}, // 1010 dddd {DELTA_TEMPERATURE, 4, 0}, // 1011 dddd {TIME, 4, 0}, // 1100 dddd {DELTA_HEARTRATE, 4, 0}, // 1101 dddd {ALARMS, 4, 0}, // 1110 dddd - {ALARMS, 0, 1}, // 1111 0000 dddddddd - {ABSOLUTE_DEPTH, 0, 2}, // 1111 0001 dddddddd dddddddd - {ABSOLUTE_RBT, 0, 1}, // 1111 0010 dddddddd - {ABSOLUTE_TEMPERATURE, 0, 2}, // 1111 0011 dddddddd dddddddd - {ABSOLUTE_TANK_1_PRESSURE, 0, 2}, // 1111 0100 dddddddd dddddddd - {ABSOLUTE_TANK_2_PRESSURE, 0, 2}, // 1111 0101 dddddddd dddddddd - {ABSOLUTE_TANK_D_PRESSURE, 0, 2}, // 1111 0110 dddddddd dddddddd - {ABSOLUTE_HEARTRATE, 0, 1}, // 1111 0111 dddddddd - {BEARING, 0, 2}, // 1111 1000 dddddddd dddddddd - {ALARMS, 0, 1}, // 1111 1001 dddddddd + {ALARMS, 8, 1}, // 1111 0000 dddddddd + {ABSOLUTE_DEPTH, 8, 2}, // 1111 0001 dddddddd dddddddd + {ABSOLUTE_RBT, 8, 1}, // 1111 0010 dddddddd + {ABSOLUTE_TEMPERATURE, 8, 2}, // 1111 0011 dddddddd dddddddd + {ABSOLUTE_TANK_1_PRESSURE, 8, 2}, // 1111 0100 dddddddd dddddddd + {ABSOLUTE_TANK_2_PRESSURE, 8, 2}, // 1111 0101 dddddddd dddddddd + {ABSOLUTE_TANK_D_PRESSURE, 8, 2}, // 1111 0110 dddddddd dddddddd + {ABSOLUTE_HEARTRATE, 8, 1}, // 1111 0111 dddddddd + {BEARING, 8, 2}, // 1111 1000 dddddddd dddddddd + {ALARMS, 8, 1}, // 1111 1001 dddddddd }; static parser_status_t @@ -279,20 +279,28 @@ uwatec_galileo_parser_samples_foreach (parser_t *abstract, sample_callback_t cal unsigned int id = uwatec_galileo_identify (data + offset, size - offset); assert (id < entries); - // Process the remaining data bytes. - unsigned int nbits = table[id].nbits; - unsigned int n = NBITS - nbits; - unsigned int value = data[offset] & (0xFF >> n); - assert (offset + table[id].extrabytes + 1 <= size); + // Skip the processed type bytes. + offset += table[id].ntypebits / NBITS; + + // Process the remaining data bits. + unsigned int nbits = 0; + unsigned int value = 0; + unsigned int n = table[id].ntypebits % NBITS; + if (n > 0) { + nbits = NBITS - n; + value = data[offset] & (0xFF >> n); + offset++; + } + + // Process the extra data bytes. + assert (offset + table[id].extrabytes <= size); for (unsigned int i = 0; i < table[id].extrabytes; ++i) { nbits += NBITS; value <<= NBITS; - value += data[offset + i + 1]; + value += data[offset]; + offset++; } - // Skip the processed data bytes. - offset += table[id].extrabytes + 1; - // Fix the sign bit. signed int svalue = uwatec_galileo_fixsignbit (value, nbits); diff --git a/src/uwatec_smart_parser.c b/src/uwatec_smart_parser.c index 71c9732..3d76bc1 100644 --- a/src/uwatec_smart_parser.c +++ b/src/uwatec_smart_parser.c @@ -127,7 +127,9 @@ uwatec_smart_identify (const unsigned char data[], unsigned int size) } } - return count; + assert (0); + + return (unsigned int) -1; } @@ -167,67 +169,68 @@ typedef enum { typedef struct uwatec_smart_sample_info_t { uwatec_smart_sample_t type; + unsigned int ntypebits; unsigned int ignoretype; unsigned int extrabytes; } uwatec_smart_sample_info_t; static const uwatec_smart_sample_info_t uwatec_smart_pro_table [] = { - {DELTA_DEPTH, 0, 0}, // 0ddddddd - {DELTA_TEMPERATURE, 0, 0}, // 10dddddd - {TIME, 0, 0}, // 110ddddd - {ALARMS, 0, 0}, // 1110dddd - {DELTA_DEPTH, 0, 1}, // 11110ddd dddddddd - {DELTA_TEMPERATURE, 0, 1}, // 111110dd dddddddd - {ABSOLUTE_DEPTH, 1, 2}, // 1111110d dddddddd dddddddd - {ABSOLUTE_TEMPERATURE, 1, 2}, // 11111110 dddddddd dddddddd + {DELTA_DEPTH, 1, 0, 0}, // 0ddddddd + {DELTA_TEMPERATURE, 2, 0, 0}, // 10dddddd + {TIME, 3, 0, 0}, // 110ddddd + {ALARMS, 4, 0, 0}, // 1110dddd + {DELTA_DEPTH, 5, 0, 1}, // 11110ddd dddddddd + {DELTA_TEMPERATURE, 6, 0, 1}, // 111110dd dddddddd + {ABSOLUTE_DEPTH, 7, 1, 2}, // 1111110d dddddddd dddddddd + {ABSOLUTE_TEMPERATURE, 8, 0, 2}, // 11111110 dddddddd dddddddd }; static const uwatec_smart_sample_info_t uwatec_smart_aladin_table [] = { - {DELTA_DEPTH, 0, 0}, // 0ddddddd - {DELTA_TEMPERATURE, 0, 0}, // 10dddddd - {TIME, 0, 0}, // 110ddddd - {ALARMS, 0, 0}, // 1110dddd - {DELTA_DEPTH, 0, 1}, // 11110ddd dddddddd - {DELTA_TEMPERATURE, 0, 1}, // 111110dd dddddddd - {ABSOLUTE_DEPTH, 1, 2}, // 1111110d dddddddd dddddddd - {ABSOLUTE_TEMPERATURE, 1, 2}, // 11111110 dddddddd dddddddd - {ALARMS, 0, 0}, // 11111111 0ddddddd + {DELTA_DEPTH, 1, 0, 0}, // 0ddddddd + {DELTA_TEMPERATURE, 2, 0, 0}, // 10dddddd + {TIME, 3, 0, 0}, // 110ddddd + {ALARMS, 4, 0, 0}, // 1110dddd + {DELTA_DEPTH, 5, 0, 1}, // 11110ddd dddddddd + {DELTA_TEMPERATURE, 6, 0, 1}, // 111110dd dddddddd + {ABSOLUTE_DEPTH, 7, 1, 2}, // 1111110d dddddddd dddddddd + {ABSOLUTE_TEMPERATURE, 8, 0, 2}, // 11111110 dddddddd dddddddd + {ALARMS, 9, 0, 0}, // 11111111 0ddddddd }; static const uwatec_smart_sample_info_t uwatec_smart_com_table [] = { - {DELTA_TANK_PRESSURE_DEPTH, 0, 1}, // 0ddddddd dddddddd - {DELTA_RBT, 0, 0}, // 10dddddd - {DELTA_TEMPERATURE, 0, 0}, // 110ddddd - {DELTA_TANK_PRESSURE, 0, 1}, // 1110dddd dddddddd - {DELTA_DEPTH, 0, 1}, // 11110ddd dddddddd - {DELTA_TEMPERATURE, 0, 1}, // 111110dd dddddddd - {ALARMS, 1, 1}, // 1111110d dddddddd - {TIME, 1, 1}, // 11111110 dddddddd - {ABSOLUTE_DEPTH, 1, 2}, // 11111111 0ddddddd dddddddd dddddddd - {ABSOLUTE_TANK_1_PRESSURE, 1, 2}, // 11111111 10dddddd dddddddd dddddddd - {ABSOLUTE_TEMPERATURE, 1, 2}, // 11111111 110ddddd dddddddd dddddddd - {ABSOLUTE_RBT, 1, 1}, // 11111111 1110dddd dddddddd + {DELTA_TANK_PRESSURE_DEPTH, 1, 0, 1}, // 0ddddddd dddddddd + {DELTA_RBT, 2, 0, 0}, // 10dddddd + {DELTA_TEMPERATURE, 3, 0, 0}, // 110ddddd + {DELTA_TANK_PRESSURE, 4, 0, 1}, // 1110dddd dddddddd + {DELTA_DEPTH, 5, 0, 1}, // 11110ddd dddddddd + {DELTA_TEMPERATURE, 6, 0, 1}, // 111110dd dddddddd + {ALARMS, 7, 1, 1}, // 1111110d dddddddd + {TIME, 8, 0, 1}, // 11111110 dddddddd + {ABSOLUTE_DEPTH, 9, 1, 2}, // 11111111 0ddddddd dddddddd dddddddd + {ABSOLUTE_TANK_1_PRESSURE, 10, 1, 2}, // 11111111 10dddddd dddddddd dddddddd + {ABSOLUTE_TEMPERATURE, 11, 1, 2}, // 11111111 110ddddd dddddddd dddddddd + {ABSOLUTE_RBT, 12, 1, 1}, // 11111111 1110dddd dddddddd }; static const uwatec_smart_sample_info_t uwatec_smart_tec_table [] = { - {DELTA_TANK_PRESSURE_DEPTH, 0, 1}, // 0ddddddd dddddddd - {DELTA_RBT, 0, 0}, // 10dddddd - {DELTA_TEMPERATURE, 0, 0}, // 110ddddd - {DELTA_TANK_PRESSURE, 0, 1}, // 1110dddd dddddddd - {DELTA_DEPTH, 0, 1}, // 11110ddd dddddddd - {DELTA_TEMPERATURE, 0, 1}, // 111110dd dddddddd - {ALARMS, 1, 1}, // 1111110d dddddddd - {TIME, 1, 1}, // 11111110 dddddddd - {ABSOLUTE_DEPTH, 1, 2}, // 11111111 0ddddddd dddddddd dddddddd - {ABSOLUTE_TEMPERATURE, 1, 2}, // 11111111 10dddddd dddddddd dddddddd - {ABSOLUTE_TANK_1_PRESSURE, 1, 2}, // 11111111 110ddddd dddddddd dddddddd - {ABSOLUTE_TANK_2_PRESSURE, 1, 2}, // 11111111 1110dddd dddddddd dddddddd - {ABSOLUTE_TANK_D_PRESSURE, 1, 2}, // 11111111 11110ddd dddddddd dddddddd - {ABSOLUTE_RBT, 1, 1}, // 11111111 111110dd dddddddd + {DELTA_TANK_PRESSURE_DEPTH, 1, 0, 1}, // 0ddddddd dddddddd + {DELTA_RBT, 2, 0, 0}, // 10dddddd + {DELTA_TEMPERATURE, 3, 0, 0}, // 110ddddd + {DELTA_TANK_PRESSURE, 4, 0, 1}, // 1110dddd dddddddd + {DELTA_DEPTH, 5, 0, 1}, // 11110ddd dddddddd + {DELTA_TEMPERATURE, 6, 0, 1}, // 111110dd dddddddd + {ALARMS, 7, 1, 1}, // 1111110d dddddddd + {TIME, 8, 0, 1}, // 11111110 dddddddd + {ABSOLUTE_DEPTH, 9, 1, 2}, // 11111111 0ddddddd dddddddd dddddddd + {ABSOLUTE_TEMPERATURE, 10, 1, 2}, // 11111111 10dddddd dddddddd dddddddd + {ABSOLUTE_TANK_1_PRESSURE, 11, 1, 2}, // 11111111 110ddddd dddddddd dddddddd + {ABSOLUTE_TANK_2_PRESSURE, 12, 1, 2}, // 11111111 1110dddd dddddddd dddddddd + {ABSOLUTE_TANK_D_PRESSURE, 13, 1, 2}, // 11111111 11110ddd dddddddd dddddddd + {ABSOLUTE_RBT, 14, 1, 1}, // 11111111 111110dd dddddddd }; @@ -293,28 +296,33 @@ uwatec_smart_parser_samples_foreach (parser_t *abstract, sample_callback_t callb assert (id < entries); // Skip the processed type bytes. - offset += id / NBITS; + offset += table[id].ntypebits / NBITS; - // Process the remaining data bytes. - unsigned int n = id % NBITS; - unsigned int nbits = NBITS - n - 1; - unsigned int value = data[offset] & (0xFF >> n); - if (table[id].ignoretype) { - // Ignore any data bits that are stored in - // the last type byte for certain samples. - nbits = 0; - value = 0; + // Process the remaining data bits. + unsigned int nbits = 0; + unsigned int value = 0; + unsigned int n = table[id].ntypebits % NBITS; + if (n > 0) { + nbits = NBITS - n; + value = data[offset] & (0xFF >> n); + if (table[id].ignoretype) { + // Ignore any data bits that are stored in + // the last type byte for certain samples. + nbits = 0; + value = 0; + } + offset++; } - assert (offset + table[id].extrabytes + 1 <= size); + + // Process the extra data bytes. + assert (offset + table[id].extrabytes <= size); for (unsigned int i = 0; i < table[id].extrabytes; ++i) { nbits += NBITS; value <<= NBITS; - value += data[offset + i + 1]; + value += data[offset]; + offset++; } - // Skip the processed data bytes. - offset += table[id].extrabytes + 1; - // Fix the sign bit. signed int svalue = uwatec_smart_fixsignbit (value, nbits);