Telemetry decoding
Describes how to decode data from recieved telemetry. This includes evaluation of temperature, pressure and humidity from measured values or GPS coordinates.
FRAME_PAYLOAD_DATA structure
Each frame contains payload consisting of subframes with varying length.
SUBFRAME structure
offset (B) | lenght (B) | name | content |
0 | 1 | SUBFRAME_TYPE | Type of subframe ? |
1 | 1 | SUBFRAME_LEN | Length of subframe payload |
2 | 2*SUBFRAME_LEN | SUBFRAME_PAYLOAD | subframe payload |
2*SUBFRAME_LEN+2 | 2 | SUBFRAME_CRC | CRC 16 of subframe payload, polynom = 0x11021 (0x1021 withought leadeing 1) |
Known subframe types
SUBFRAME_TYPE | description |
0x65 | Calibration and Configuration fragment |
0x69 | Measurement data |
0x67 | GPS data |
0x68 | RADAC (radiation measurement) / O3 (ozone) |
0xff | padding ? |
Calibration subframe payload (0x65)
expected payload length: 32
offset (B) | lenght (B) | name | content | description |
0 | 2 | CALIB_FR_NUM | uint16 | frame number, (starts from 1) |
2 | 10 | CALIB_ID | string | 0x20 0x20 + sonde ID (same as on cover) |
12 | 1 | CALIB_STATE_0 | uint8 | 0 - OK; 0x08/0x0A - battery low / battery low, powe off countdown running? |
13 | 1 | CALIB_STATE_1 | uint8 | see table bellow |
14 | 1 | CALIB_UNKNOWN_0 | 0x00 | ??? |
15 | 1 | CALIB_FRAG_NUM | unit8 | callibration and configuration fragment number |
16 | 16 | CALIB_FRAG_DATA | bytes | calibration and configuration data fragment |
STATE_1
TODO: verification needed, possible documentation bug
bit offset | description |
(LSB) 0 | start detected (set at the same time as bit 5) |
1 | ??? |
2 | humidity sensor heating: 0 = off, 1 = on |
3 | humidity sensor for measurement: 0 = U1 (CH2), 1 = U2 (CH3) |
4 | set to 1 when current drown from battery is increased by 50mA |
5 | start detected (set at the same time as bit 1) |
6 | ??? |
(MSB) 7 | ??? |
Measurement subframe payload (0x69)
expected payload length: 24
offset (B) | lenght (B) | content | name | description |
0 | 3 | int24 | MEAS_T | Temperature sensor (wire at end of stick) |
3 | 3 | int24 | MEAS_U1 | Humidity (remoter to sonde) |
6 | 3 | int24 | MEAS_U2 | Humidity (closer to sonde) |
9 | 3 | int24 | MEAS_REF1 | reference upper bound, increase with temperature (or vice versa, TODO) |
12 | 3 | int24 | MEAS_REF2 | reference upper bound, decrease with temperature (or vice versa, TODO) |
15 | 3 | int24 | MEAS_P | Pressure |
18 | 3 | int24 | MEAS_REF3 | reference lower bound |
21 | 3 | int24 | MEAS_REF4 | reference lower bound |
ref = (MEAS_REF3 + MEAS_REF4) / 2;
p_rel = 1.0 / ((MEAS_P - ref) / (MEAS_REF1 - ref) - 0.0655) * 0.9053 + 0.08778;
# pressure in hPa
P = p_rel * ((((CALIB_COEFF[15] * p_rel + CALIB_COEFF[14]) * p_rel + CALIB_COEFF[13]) * p_rel + CALIB_COEFF[12]) * p_rel + CALIB_COEFF[11]) + CALIB_COEFF[10];
ref4 = MEAS_REF2 - ref;
u1_rel = 1.0 / ((MEAS_U1 - ref) / ref4);
u2_rel = 1.0 / ((MEAS_U2 - ref) / ref4);
# humidity
U1 = (
(u1_rel * CALIB_COEFF[43] + CALIB_COEFF[42]) * \
u1_rel + CALIB_COEFF[41]) * u1_rel + ALIB_COEFF[40];
U2 = (
(u2_rel * CALIB_COEFF[53] + CALIB_COEFF[52]) * \
u2_rel + CALIB_COEFF[51]) * u2_rel + CALIB_COEFF[50];
U = max(U1, U2)
rt = (1.0 / (CALIB_COEFF[37] - 1.0) + 17.99418) * \
0.079298 / (((MEAS_T - ref) / ref4) - 0.15791);
# temperature °C
T = ((((
rt * CALIB_COEFF[35] + \
CALIB_COEFF[34]) * rt + \
CALIB_COEFF[33]) * rt + \
CALIB_COEFF[32]) * rt + \
CALIB_COEFF[31]) * rt + \
CALIB_COEFF[30];
GPS subframe payload (0x67)
expected payload length: 122
offset (B) | lenght (B) | content | description |
0 | 4 | GPS_TIME (int32) | GPS time - ms from week start |
4 | 2 | GPS_BLOB_0 | ???, 4*4 bits |
6 | 8 | GPS_PRN | PRN for each tracked satelite |
14 | 12 | GPS_STAT_1 | signal strength, fix status … |
26 | 96 | GPS_DATA_1 | doppler, pseudorange, … |
GPS_PRN
List of pseudorange sequence number for each recieving satelite, 0 == no satelite.
12*5 bit - PRN number (x - unused ?)
11100000 x2222211 44433333 x5555544 77766666 x8888877 AAA99999 xBBBBBAA
GPS_STAT_1
GPS satelite channel state.
offset (b) | length (b) | description |
0 | 4 (int4) | signal strength or fix quallity, 0xf == NaN / no signal |
4 | 1 | time fix - set to 1 when time is succesfully obtained from subframe |
5 | 1 | pseudorange fix ??? - pseudorange fix is correlated to time ? |
6 | 1 | pseudorange fix ??? (not corelated to time ?) |
7 | 1 | signal tracking - some signal found at certain frequency |
GPS_DATA_1
offset (B) | length (B) | type | description |
0 | 4 | int32/fract32 ? | value in range < -2e6, 0x1400000 ), pseudorange in metters?, 0x7FFFxxxx == NAN |
4 | 3 | int24/fract24 ? | some number, might be signed, not sure, doppler shift? |
7 | 1 | ??? | number, min/max: < -38, 39 > usually -5..10 |
RADAC / O3 (radiation and ozone measurement) (0x68)
expected payload length: 10
No usefull values available to decipher this frame, have someone something?
offset (B) | length (B) | description |
0 | 10 | ??? |
ussual content:
0x03 0x03 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
Padding subframe (0xff)
expected payload length: 4
This type of frame probably identifies only padding
Configuration and calibration
Calibration data are composed from fragments send in first subframe.
Calibration data block is 512B long. Content is identical with data from EEPROM.
- there should be somewhere date/time (GPS send only seconds offset from start of week)
offset (B) | lenght (B) | content | description |
0 | 2 | ??? | ??? (checksum?) |
2 | 2 | unit16 | downlik frequency: f = (400E6 + 10E3*value) Hz
upper limit is around 423MHz (value = 0x08FC) |
4 | 2 | uint16 | always 0xffff - kill timmer ? |
6 | 2 | int16 | always 0x0100 - set transmit power to full ? |
??? | | | |
22 | 10 | string | probe ID (same as printed on conver, starts with 0x20 0x20) |
??? | | | |
64 | 5*x | CALIB_COEFF | calibration coefficients table |
CALIB_COEFF
Consist of sequence of repeated fields with following structure:
offset (B) | lenght (B) | context | description |
0 | 1 | uint8 | calibration constant index |
4 | 4 | float32 | calibration constant value |
Example of calibration data
coefficient index row/col (x) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
1x | -366.026 | -43.9063 | 393.234 | -131.314 | 25.6268 | -2.02341 | | 0.96 |
2x | -803.34 | 363.815 | 317.784 | 127.429 | | | | 0.96 |
3x | -187.802 | 89.6416 | -26.9122 | 9.15022 | -1.45707 | 0.0868068 | | 0.849488 |
4x (humidity 1) | -1223.17 | 3548.18 | -2646.42 | 588.217 | | | | 0.96 |
5x (humidity 2) | -1198.04 | 3497.31 | -2611.15 | 580.153 | | | | 0.96 |
6x | 0.0318379 | 0.0374458 | -0.0433925 0.00630527 | | | | | |
7x | -0.000132316 | 0.000414854 | -0.000402439 6.31402e-05 | | | | | |
8x | -2.04505e-06 | 1.5662e-067.05777e-07 | | | | | | |
11x | 0.5227 | -0.0284 | 0.000286 | 8.97e-07 | -1.26e-09 | | | |
12x | 1.07573 | -0.204 | 0.009009 | -5.83e-05 | -1.04e-06 | | | |
13x | 0.5227 | -0.0284 | 0.000286 | 8.97e-07 | -1.26e-09 | | | |
14x | 1.07573 | -0.204 | 0.009009 | -5.83e-05 | -1.04e-06 | | | |
15x | | 4.75029e-06-5.47494e-08 4.851e-10 -1.736e-12 | | | | | | 0.7 |
16x | | | | | | | | 0.7 |