3333#define VoltagePin 14
3434// #define LED 13 // Blinks on receipt
3535
36- float RF95_FREQ = 420 ;
36+ float RF95_FREQ = 426.15 ;
3737float SUSTAINER_FREQ = 426.15 ;
3838float BOOSTER_FREQ = 425.15 ;
3939float GROUND_FREQ = 420 ;
@@ -75,13 +75,20 @@ float convert_range(T val, float range) {
7575struct TelemetryPacket {
7676 int32_t lat;
7777 int32_t lon;
78- int16_t alt;
79- int16_t baro_alt;
78+ uint16_t alt; // 15 bit meters, 1 bit command ack
79+ uint16_t baro_alt;
8080 uint16_t highg_ax; // 14 bit signed ax [-16,16) 2 bit tilt angle
81- uint16_t highg_ay; // 1bit sign 13 bit unsigned [0 ,16) 2 bit tilt angle
82- uint16_t highg_az; // 1bit sign 13 bit unsigned [0 ,16) 2 bit tilt angle
81+ uint16_t highg_ay; // 14 bit signed ax [-16 ,16) 2 bit tilt angle
82+ uint16_t highg_az; // 14 bit signed ax [-16 ,16) 2 bit tilt angle
8383 uint8_t batt_volt;
84- uint8_t fsm_satcount;
84+
85+ // If callsign bit (highest bit of fsm_callsign_satcount) is set, the callsign is KD9ZMJ
86+ //
87+ // If callsign bit (highest bit of fsm_callsign_satcount) is not set, the callsign is KD9ZPM
88+
89+ uint8_t fsm_callsign_satcount; // 4 bit fsm state, 1 bit is_sustainer_callsign, 3 bits sat count
90+ uint16_t kf_vx; // 16 bit meters/second
91+ uint32_t pyro; // 7 bit continuity 4 bit tilt
8592 float RSSI = 0.0 ;
8693};
8794
@@ -100,7 +107,9 @@ struct FullTelemetryData {
100107 float freq;
101108 float rssi;
102109 float sat_count;
110+ float pyros[4 ];
103111 bool is_sustainer;
112+ uint16_t kf_vx
104113};
105114
106115
@@ -166,20 +175,25 @@ void EnqueuePacket(const TelemetryPacket& packet, float frequency) {
166175 data.longitude = ConvertGPS (packet.lon );
167176 data.barometer_altitude = convert_range<int16_t >(packet.baro_alt , 1 << 17 );
168177 int tilt = decodeLastTwoBits (packet.highg_ax , packet.highg_ay , packet.highg_az );
178+ tilt |= (packet.pyro >> 28 & (0xF )) << 6 ;
169179 int16_t ax = packet.highg_ax & 0xfffc ;
170180 int16_t ay = packet.highg_ay & 0xfffc ;
171181 int16_t az = packet.highg_az & 0xfffc ;
172182 data.highG_ax = convert_range<int16_t >(ax, 32 );
173183 data.highG_ay = convert_range<int16_t >(ay, 32 );
174184 data.highG_az = convert_range<int16_t >(az, 32 );
175- data.tilt_angle = tilt; // convert_range(tilt, 180) ; // [-90, 90 ]
185+ data.tilt_angle = tilt / 1023 . * 180 ; // Returns tilt angle in range [0, 180 ]
176186 data.battery_voltage = convert_range (packet.batt_volt , 16 );
177- data.sat_count = packet.fsm_satcount >> 4 & 0b0111 ;
178- data.is_sustainer = (packet.fsm_satcount >> 7 );
179- data.FSM_State = packet.fsm_satcount & 0b1111 ;
187+ data.sat_count = packet.fsm_callsign_satcount >> 4 & 0b0111 ;
188+ data.is_sustainer = (packet.fsm_callsign_satcount >> 7 );
189+ data.FSM_State = packet.fsm_callsign_satcount & 0b1111 ;
190+ data.pyros [0 ] = ((float ) ((packet.pyro >> 0 ) & (0x7F )) / 127 .) * 12 .;
191+ data.pyros [1 ] = ((float ) ((packet.pyro >> 7 ) & (0x7F )) / 127 .) * 12 .;
192+ data.pyros [2 ] = ((float ) ((packet.pyro >> 14 ) & (0x7F )) / 127 .) * 12 .;
193+ data.pyros [3 ] = ((float ) ((packet.pyro >> 21 ) & (0x7F )) / 127 .) * 12 .;
180194
181195 // kinda hacky but it will work
182- if (packet.fsm_satcount == static_cast <uint8_t >(-1 )) {
196+ if (packet.fsm_callsign_satcount == static_cast <uint8_t >(-1 )) {
183197 data.FSM_State = static_cast <uint8_t >(-1 );
184198 }
185199
@@ -239,7 +253,12 @@ void printPacketJson(FullTelemetryData const& packet) {
239253 printJSONField (" frequency" , packet.freq );
240254 printJSONField (" RSSI" , packet.rssi );
241255 printJSONField (" sat_count" , packet.sat_count );
242- printJSONField (" is_sustainer" , packet.is_sustainer , false );
256+ printJSONField (" kf_velocity" , packet.kf_vx );
257+ printJSONField (" is_sustainer" , packet.is_sustainer );
258+ printJSONField (" pyro_a" , packet.pyros [0 ]);
259+ printJSONField (" pyro_b" , packet.pyros [1 ]);
260+ printJSONField (" pyro_c" , packet.pyros [2 ]);
261+ printJSONField (" pyro_d" , packet.pyros [3 ], false );
243262 Serial.println (" }}" );
244263}
245264
@@ -344,8 +363,10 @@ void setup() {
344363 rf95.setCodingRate4 (8 );
345364 rf95.setSpreadingFactor (8 );
346365 rf95.setPayloadCRC (true );
347- rf95.setSignalBandwidth (125000 );
366+
367+ rf95.setSignalBandwidth (250000 );
348368 rf95.setPreambleLength (8 );
369+
349370 Serial.print (R"( {"type": "freq_success", "frequency":)" );
350371 Serial.print (current_freq);
351372 Serial.println (" }" );
0 commit comments