@@ -221,8 +221,15 @@ K_THREAD_DEFINE(usb_init_thread_id, 256, usb_init_thread, NULL, NULL, NULL, 6, 0
221221//|255 |id |addr |resv |
222222
223223#include "util.h"
224+ // last valid data
224225static float last_q_trackers [256 ][4 ] = {0 };
226+ static uint32_t last_v_trackers [256 ] = {0 };
227+ static uint8_t last_p_trackers [256 ] = {0 };
225228static int last_valid_trackers [256 ] = {0 };
229+ // last received data
230+ static float cur_q_trackers [256 ][4 ] = {0 };
231+ static uint32_t cur_v_trackers [256 ] = {0 };
232+ static uint8_t cur_p_trackers [256 ] = {0 };
226233
227234void hid_write_packet_n (uint8_t * data , uint8_t rssi )
228235{
@@ -250,24 +257,45 @@ void hid_write_packet_n(uint8_t *data, uint8_t rssi)
250257 q_iem (v , q );
251258 }
252259 float * last_q = last_q_trackers [data [1 ]];
253- float mag = q_diff_mag (q , last_q );
254- if (mag > 0.5f && mag < 6.28f - 0.5f )
260+ uint32_t * last_v = & last_v_trackers [data [1 ]];
261+ uint8_t * last_p = & last_p_trackers [data [1 ]];
262+ float * cur_q = cur_q_trackers [data [1 ]];
263+ uint32_t * cur_v = & cur_v_trackers [data [1 ]];
264+ uint8_t * cur_p = & cur_p_trackers [data [1 ]];
265+ float mag = q_diff_mag (q , last_q ); // difference between last valid
266+ float mag_cur = q_diff_mag (q , cur_q ); // difference between last received
267+ bool mag_invalid = mag > 0.5f && mag < 6.28f - 0.5f ; // possibly invalid rotation
268+ bool mag_cur_invalid = mag_cur > 0.5f && mag_cur < 6.28f - 0.5f ; // possibly inconsistent rotation
269+ if (mag_invalid )
255270 {
256- LOG_ERR ("Abnormal rotation for %012llX, ID %d, packet ID %d, mag: %.2f rad, last valid: %d" , stored_tracker_addr [data [1 ]], data [1 ], data [0 ], (double )mag , last_valid_trackers [data [1 ]]);
257- printk ("quat: %5.2f %5.2f %5.2f %5.2f\n" , (double )q [0 ], (double )q [1 ], (double )q [2 ], (double )q [3 ]);
258- printk ("last: %5.2f %5.2f %5.2f %5.2f\n" , (double )last_q [0 ], (double )last_q [1 ], (double )last_q [2 ], (double )last_q [3 ]);
271+ // HWID, ID, packet type, rotation difference (rad), last valid packet
272+ LOG_ERR ("Abnormal rot. %012llX i%d p%d m%.2f/%.2f v%d" , stored_tracker_addr [data [1 ]], data [1 ], data [0 ], (double )mag , (double )mag_cur , last_valid_trackers [data [1 ]]);
273+ // decoded quat, packet type, q_buf
274+ printk ("a: %5.2f %5.2f %5.2f %5.2f p%d:%08lX\n" , (double )q [0 ], (double )q [1 ], (double )q [2 ], (double )q [3 ], data [0 ], * q_buf );
275+ printk ("b: %5.2f %5.2f %5.2f %5.2f p%d:%08lX\n" , (double )cur_q [0 ], (double )cur_q [1 ], (double )cur_q [2 ], (double )cur_q [3 ], * cur_p , * cur_v );
276+ printk ("c: %5.2f %5.2f %5.2f %5.2f p%d:%08lX\n" , (double )last_q [0 ], (double )last_q [1 ], (double )last_q [2 ], (double )last_q [3 ], * last_p , * last_v );
259277 last_valid_trackers [data [1 ]]++ ;
260- if (last_valid_trackers [data [1 ]] > 2 ) // reset last_q
278+ memcpy (cur_q , q , sizeof (q ));
279+ * cur_v = * q_buf ;
280+ * cur_p = data [0 ];
281+ if (!mag_cur_invalid && last_valid_trackers [data [1 ]] > 2 ) // reset last_q
261282 {
262283 LOG_WRN ("Reset rotation for %012llX, ID %d" , stored_tracker_addr [data [1 ]], data [1 ]);
263284 last_valid_trackers [data [1 ]] = 0 ;
264285 memcpy (last_q , q , sizeof (q ));
286+ * last_v = * q_buf ;
287+ * last_p = data [0 ];
265288 return ;
266289 }
267290 return ;
268291 }
269292 last_valid_trackers [data [1 ]] = 0 ;
293+ memcpy (cur_q , q , sizeof (q ));
294+ * cur_v = * q_buf ;
295+ * cur_p = data [0 ];
270296 memcpy (last_q , q , sizeof (q ));
297+ * last_v = * q_buf ;
298+ * last_p = data [0 ];
271299 }
272300
273301 memcpy (& report .data , data , 16 ); // all data can be passed through
0 commit comments