@@ -103,18 +103,30 @@ static void ws_neighbor_calculate_ufsi_drift(ws_neighbor_class_entry_t *ws_neigh
103
103
{
104
104
if (ws_neighbor -> fhss_data .uc_timing_info .utt_rx_timestamp && ws_neighbor -> fhss_data .uc_timing_info .ufsi ) {
105
105
uint32_t seq_length = 0x10000 ;
106
- if (ws_neighbor -> fhss_data .uc_timing_info .unicast_channel_function == WS_TR51CF ) {
106
+ if (ws_neighbor -> fhss_data .uc_timing_info .unicast_channel_function == WS_TR51CF ) {
107
107
seq_length = ws_neighbor -> fhss_data .uc_timing_info .unicast_number_of_channels ;
108
108
}
109
109
uint32_t ufsi_prev_tmp = ws_neighbor -> fhss_data .uc_timing_info .ufsi ;
110
110
uint32_t ufsi_cur_tmp = ws_utt -> ufsi ;
111
- if (ufsi_cur_tmp < ufsi_prev_tmp ) {
112
- ufsi_cur_tmp += 0xffffff ;
111
+ if (ws_neighbor -> fhss_data .uc_timing_info .unicast_channel_function == WS_DH1CF ) {
112
+ if (ufsi_cur_tmp < ufsi_prev_tmp ) {
113
+ ufsi_cur_tmp += 0xffffff ;
114
+ }
113
115
}
114
116
// Convert 24-bit UFSI to real time before drift calculation
115
117
uint32_t time_since_seq_start_prev_ms = own_ceil ((float )((uint64_t )ufsi_prev_tmp * seq_length * ws_neighbor -> fhss_data .uc_timing_info .unicast_dwell_interval ) / 0x1000000 );
116
118
uint32_t time_since_seq_start_cur_ms = own_ceil ((float )((uint64_t )ufsi_cur_tmp * seq_length * ws_neighbor -> fhss_data .uc_timing_info .unicast_dwell_interval ) / 0x1000000 );
117
119
uint32_t time_since_last_ufsi_us = timestamp - ws_neighbor -> fhss_data .uc_timing_info .utt_rx_timestamp ;
120
+
121
+ if (ws_neighbor -> fhss_data .uc_timing_info .unicast_channel_function == WS_TR51CF ) {
122
+ uint32_t full_uc_schedule_ms = ws_neighbor -> fhss_data .uc_timing_info .unicast_dwell_interval * ws_neighbor -> fhss_data .uc_timing_info .unicast_number_of_channels ;
123
+ uint32_t temp_ms = (time_since_last_ufsi_us / 1000 ) / full_uc_schedule_ms ;
124
+ if (time_since_seq_start_cur_ms >= time_since_seq_start_prev_ms ) {
125
+ temp_ms -- ;
126
+ }
127
+ time_since_seq_start_cur_ms += temp_ms * full_uc_schedule_ms + (full_uc_schedule_ms - time_since_seq_start_prev_ms ) + time_since_seq_start_prev_ms ;
128
+ }
129
+
118
130
uint32_t ufsi_diff_ms = time_since_seq_start_cur_ms - time_since_seq_start_prev_ms ;
119
131
int32_t ufsi_drift_ms = (int32_t )(time_since_last_ufsi_us / 1000 - ufsi_diff_ms );
120
132
// Only trace if there is significant error
0 commit comments