@@ -112,6 +112,16 @@ static bool test_ufsi(uint8_t *ufsi_ptr, uint_fast24_t test_value)
112112 return true;
113113}
114114
115+ static void test_set_interrupt_delay_us (uint32_t delay_us , bool bc )
116+ {
117+ fhss_callbacks_stub .uint32_value = delay_us + 15752684 ;
118+ if (bc ) {
119+ fhss_common_stub .fhss_struct .ws -> next_bc_timeout = fhss_callbacks_stub .uint32_value - delay_us ;
120+ } else {
121+ fhss_common_stub .fhss_struct .ws -> next_uc_timeout = fhss_callbacks_stub .uint32_value - delay_us ;
122+ }
123+ }
124+
115125static void test_set_platform_api (fhss_timer_t * fhss_timer )
116126{
117127 fhss_timer -> fhss_resolution_divider = 1 ;
@@ -158,6 +168,48 @@ static fhss_api_t *test_generate_fhss_api(void)
158168 return & fhss_api ;
159169}
160170
171+ static fhss_api_t * test_generate_fhss_api_default_settings (void )
172+ {
173+ memset (& ws , 0 , sizeof (fhss_ws_t ));
174+ memset (& fhss_callbacks_stub , 0 , sizeof (fhss_callbacks_stub_def ));
175+ memset (& fhss_common_stub , 0 , sizeof (fhss_common_stub_def ));
176+ neighbor_info .uc_timing_info .ufsi = 1000000 ;
177+ neighbor_info .uc_timing_info .unicast_channel_function = WS_DH1CF ;
178+ neighbor_info .uc_timing_info .unicast_dwell_interval = 200 ;
179+ neighbor_info .uc_timing_info .utt_rx_timestamp = 100000 ;
180+ fhss_common_stub .fhss_struct .fhss_api = & fhss_api ;
181+ fhss_common_stub .fhss_struct .ws = & ws ;
182+ fhss_common_stub .fhss_struct .ws -> uc_slot = 3 ;
183+ fhss_common_stub .fhss_struct .ws -> fhss_configuration .ws_uc_channel_function = WS_DH1CF ;
184+ fhss_common_stub .fhss_struct .ws -> fhss_configuration .ws_bc_channel_function = WS_DH1CF ;
185+ fhss_common_stub .fhss_struct .ws -> fhss_configuration .fhss_uc_dwell_interval = 255 ;
186+ fhss_common_stub .fhss_struct .ws -> fhss_configuration .fhss_bc_dwell_interval = 255 ;
187+ fhss_common_stub .fhss_struct .ws -> fhss_configuration .fhss_broadcast_interval = 1020 ;
188+ fhss_common_stub .fhss_struct .ws -> get_neighbor_info = & app_get_neighbor_info ;
189+ fhss_common_stub .fhss_struct .number_of_channels = 35 ;
190+ fhss_common_stub .fhss_struct .number_of_uc_channels = 35 ;
191+ fhss_common_stub .fhss_struct .number_of_bc_channels = 35 ;
192+ fhss_common_stub .fhss_struct .ws -> fhss_configuration .unicast_channel_mask [1 ] = 0x00000007 ;
193+ fhss_common_stub .fhss_struct .ws -> fhss_configuration .unicast_channel_mask [0 ] = 0xffffffff ;
194+ fhss_common_stub .fhss_struct .ws -> fhss_configuration .channel_mask [1 ] = 0x00000007 ;
195+ fhss_common_stub .fhss_struct .ws -> fhss_configuration .channel_mask [0 ] = 0xffffffff ;
196+ fhss_common_stub .fhss_struct .rx_channel = DEFAULT_CHANNEL ;
197+ fhss_common_stub .fhss_struct .fhss_state = FHSS_UNSYNCHRONIZED ;
198+ fhss_common_stub .fhss_struct .own_hop = 0xff ;
199+ fhss_common_stub .fhss_struct .ws -> is_on_bc_channel = false;
200+ fhss_common_stub .fhss_struct .optimal_packet_length = OPTIMAL_PACKET_LENGTH ;
201+ fhss_common_stub .fhss_struct .callbacks .change_channel = & mac_set_channel ;
202+ fhss_common_stub .fhss_struct .callbacks .read_mac_address = & mac_read_64bit_mac_address ;
203+ fhss_common_stub .fhss_struct .callbacks .read_tx_queue_size = & mac_read_tx_queue_sizes ;
204+ fhss_common_stub .fhss_struct .callbacks .read_timestamp = & mac_read_phy_timestamp ;
205+ fhss_common_stub .fhss_struct .callbacks .read_datarate = & mac_read_phy_datarate ;
206+ fhss_common_stub .fhss_struct .callbacks .tx_poll = & mac_poll_tx_queue ;
207+ fhss_callbacks_stub .datarate = 150000 ;
208+ test_set_platform_api (& fhss_common_stub .fhss_struct .platform_functions );
209+ fhss_ws_set_callbacks (& fhss_common_stub .fhss_struct );
210+ return & fhss_api ;
211+ }
212+
161213bool test_fhss_ws_enable ()
162214{
163215 fhss_api_t fhss_api ;
@@ -565,6 +617,107 @@ bool test_fhss_broadcast_handler()
565617 // Test when FHSS struct not found
566618 disable_fhss_struct ();
567619 fhss_common_stub .callback [1 ](fhss_common_stub .fhss_struct .fhss_api , DEFAULT_TIMER_DELAY );
620+ // Test delayed interrupts
621+ api = test_generate_fhss_api_default_settings ();
622+ enable_fhss_struct ();
623+ // Test when broadcast channel enabled
624+ fhss_common_stub .fhss_struct .ws -> is_on_bc_channel = true;
625+ fhss_common_stub .fhss_struct .ws -> bc_slot = 60000 ;
626+ test_set_interrupt_delay_us (1000000 , true);
627+ fhss_common_stub .fhss_struct .fhss_api -> synch_state_set (api , DEFAULT_FHSS_STATE , DEFAULT_PANID );
628+ if ((fhss_common_stub .fhss_struct .ws -> next_bc_timeout != (fhss_common_stub .fhss_struct .callbacks .read_timestamp (fhss_common_stub .fhss_struct .fhss_api ) + 20000 )) ||
629+ (fhss_common_stub .fhss_struct .ws -> is_on_bc_channel != true) || (fhss_common_stub .fhss_struct .ws -> bc_slot != 60002 )) {
630+ return false;
631+ }
632+ test_set_interrupt_delay_us (1985000 , true);
633+ fhss_common_stub .fhss_struct .ws -> bc_slot = 65535 ;
634+ fhss_common_stub .fhss_struct .ws -> is_on_bc_channel = true;
635+ fhss_common_stub .fhss_struct .fhss_api -> synch_state_set (api , DEFAULT_FHSS_STATE , DEFAULT_PANID );
636+ if ((fhss_common_stub .fhss_struct .ws -> next_bc_timeout != (fhss_common_stub .fhss_struct .callbacks .read_timestamp (fhss_common_stub .fhss_struct .fhss_api ) + 55000 )) ||
637+ (fhss_common_stub .fhss_struct .ws -> is_on_bc_channel != true) || (fhss_common_stub .fhss_struct .ws -> bc_slot != 2 )) {
638+ return false;
639+ }
640+ test_set_interrupt_delay_us (2905000 , true);
641+ fhss_common_stub .fhss_struct .ws -> bc_slot = 60000 ;
642+ fhss_common_stub .fhss_struct .ws -> is_on_bc_channel = true;
643+ fhss_common_stub .fhss_struct .fhss_api -> synch_state_set (api , DEFAULT_FHSS_STATE , DEFAULT_PANID );
644+ if ((fhss_common_stub .fhss_struct .ws -> next_bc_timeout != (fhss_common_stub .fhss_struct .callbacks .read_timestamp (fhss_common_stub .fhss_struct .fhss_api ) + 155000 )) ||
645+ (fhss_common_stub .fhss_struct .ws -> is_on_bc_channel != true) || (fhss_common_stub .fhss_struct .ws -> bc_slot != 60004 )) {
646+ return false;
647+ }
648+ test_set_interrupt_delay_us (500000 , true);
649+ fhss_common_stub .fhss_struct .ws -> bc_slot = 60000 ;
650+ fhss_common_stub .fhss_struct .ws -> is_on_bc_channel = true;
651+ fhss_common_stub .fhss_struct .fhss_api -> synch_state_set (api , DEFAULT_FHSS_STATE , DEFAULT_PANID );
652+ if ((fhss_common_stub .fhss_struct .ws -> next_bc_timeout != (fhss_common_stub .fhss_struct .callbacks .read_timestamp (fhss_common_stub .fhss_struct .fhss_api ) + 265000 )) ||
653+ (fhss_common_stub .fhss_struct .ws -> is_on_bc_channel != false) || (fhss_common_stub .fhss_struct .ws -> bc_slot != 60000 )) {
654+ return false;
655+ }
656+ test_set_interrupt_delay_us (1720000 , true);
657+ fhss_common_stub .fhss_struct .ws -> bc_slot = 60000 ;
658+ fhss_common_stub .fhss_struct .ws -> is_on_bc_channel = true;
659+ fhss_common_stub .fhss_struct .fhss_api -> synch_state_set (api , DEFAULT_FHSS_STATE , DEFAULT_PANID );
660+ if ((fhss_common_stub .fhss_struct .ws -> next_bc_timeout != (fhss_common_stub .fhss_struct .callbacks .read_timestamp (fhss_common_stub .fhss_struct .fhss_api ) + 65000 )) ||
661+ (fhss_common_stub .fhss_struct .ws -> is_on_bc_channel != false) || (fhss_common_stub .fhss_struct .ws -> bc_slot != 60001 )) {
662+ return false;
663+ }
664+ test_set_interrupt_delay_us (2340000 , true);
665+ fhss_common_stub .fhss_struct .ws -> bc_slot = 60000 ;
666+ fhss_common_stub .fhss_struct .ws -> is_on_bc_channel = true;
667+ fhss_common_stub .fhss_struct .fhss_api -> synch_state_set (api , DEFAULT_FHSS_STATE , DEFAULT_PANID );
668+ if ((fhss_common_stub .fhss_struct .ws -> next_bc_timeout != (fhss_common_stub .fhss_struct .callbacks .read_timestamp (fhss_common_stub .fhss_struct .fhss_api ) + 465000 )) ||
669+ (fhss_common_stub .fhss_struct .ws -> is_on_bc_channel != false) || (fhss_common_stub .fhss_struct .ws -> bc_slot != 60002 )) {
670+ return false;
671+ }
672+ // Test when broadcast channel disabled
673+ fhss_common_stub .fhss_struct .ws -> is_on_bc_channel = false;
674+ test_set_interrupt_delay_us (100000 , true);
675+ fhss_common_stub .fhss_struct .ws -> bc_slot = 60000 ;
676+ fhss_common_stub .fhss_struct .fhss_api -> synch_state_set (api , DEFAULT_FHSS_STATE , DEFAULT_PANID );
677+ if ((fhss_common_stub .fhss_struct .ws -> next_bc_timeout != (fhss_common_stub .fhss_struct .callbacks .read_timestamp (fhss_common_stub .fhss_struct .fhss_api ) + 155000 )) ||
678+ (fhss_common_stub .fhss_struct .ws -> is_on_bc_channel != true) || (fhss_common_stub .fhss_struct .ws -> bc_slot != 60001 )) {
679+ return false;
680+ }
681+ fhss_common_stub .fhss_struct .ws -> is_on_bc_channel = false;
682+ test_set_interrupt_delay_us (1220000 , true);
683+ fhss_common_stub .fhss_struct .ws -> bc_slot = 60000 ;
684+ fhss_common_stub .fhss_struct .fhss_api -> synch_state_set (api , DEFAULT_FHSS_STATE , DEFAULT_PANID );
685+ if ((fhss_common_stub .fhss_struct .ws -> next_bc_timeout != (fhss_common_stub .fhss_struct .callbacks .read_timestamp (fhss_common_stub .fhss_struct .fhss_api ) + 55000 )) ||
686+ (fhss_common_stub .fhss_struct .ws -> is_on_bc_channel != true) || (fhss_common_stub .fhss_struct .ws -> bc_slot != 60002 )) {
687+ return false;
688+ }
689+ fhss_common_stub .fhss_struct .ws -> is_on_bc_channel = false;
690+ test_set_interrupt_delay_us (2280000 , true);
691+ fhss_common_stub .fhss_struct .ws -> bc_slot = 60000 ;
692+ fhss_common_stub .fhss_struct .fhss_api -> synch_state_set (api , DEFAULT_FHSS_STATE , DEFAULT_PANID );
693+ if ((fhss_common_stub .fhss_struct .ws -> next_bc_timeout != (fhss_common_stub .fhss_struct .callbacks .read_timestamp (fhss_common_stub .fhss_struct .fhss_api ) + 15000 )) ||
694+ (fhss_common_stub .fhss_struct .ws -> is_on_bc_channel != true) || (fhss_common_stub .fhss_struct .ws -> bc_slot != 60003 )) {
695+ return false;
696+ }
697+ fhss_common_stub .fhss_struct .ws -> is_on_bc_channel = false;
698+ test_set_interrupt_delay_us (555000 , true);
699+ fhss_common_stub .fhss_struct .ws -> bc_slot = 60000 ;
700+ fhss_common_stub .fhss_struct .fhss_api -> synch_state_set (api , DEFAULT_FHSS_STATE , DEFAULT_PANID );
701+ if ((fhss_common_stub .fhss_struct .ws -> next_bc_timeout != (fhss_common_stub .fhss_struct .callbacks .read_timestamp (fhss_common_stub .fhss_struct .fhss_api ) + 465000 )) ||
702+ (fhss_common_stub .fhss_struct .ws -> is_on_bc_channel != false) || (fhss_common_stub .fhss_struct .ws -> bc_slot != 60001 )) {
703+ return false;
704+ }
705+ fhss_common_stub .fhss_struct .ws -> is_on_bc_channel = false;
706+ test_set_interrupt_delay_us (1975000 , true);
707+ fhss_common_stub .fhss_struct .ws -> bc_slot = 60000 ;
708+ fhss_common_stub .fhss_struct .fhss_api -> synch_state_set (api , DEFAULT_FHSS_STATE , DEFAULT_PANID );
709+ if ((fhss_common_stub .fhss_struct .ws -> next_bc_timeout != (fhss_common_stub .fhss_struct .callbacks .read_timestamp (fhss_common_stub .fhss_struct .fhss_api ) + 65000 )) ||
710+ (fhss_common_stub .fhss_struct .ws -> is_on_bc_channel != false) || (fhss_common_stub .fhss_struct .ws -> bc_slot != 60002 )) {
711+ return false;
712+ }
713+ fhss_common_stub .fhss_struct .ws -> is_on_bc_channel = false;
714+ test_set_interrupt_delay_us (2395000 , true);
715+ fhss_common_stub .fhss_struct .ws -> bc_slot = 60000 ;
716+ fhss_common_stub .fhss_struct .fhss_api -> synch_state_set (api , DEFAULT_FHSS_STATE , DEFAULT_PANID );
717+ if ((fhss_common_stub .fhss_struct .ws -> next_bc_timeout != (fhss_common_stub .fhss_struct .callbacks .read_timestamp (fhss_common_stub .fhss_struct .fhss_api ) + 665000 )) ||
718+ (fhss_common_stub .fhss_struct .ws -> is_on_bc_channel != false) || (fhss_common_stub .fhss_struct .ws -> bc_slot != 60003 )) {
719+ return false;
720+ }
568721 return true;
569722}
570723
@@ -734,6 +887,35 @@ bool test_fhss_unicast_handler()
734887 // Test when FHSS struct not found
735888 disable_fhss_struct ();
736889 fhss_common_stub .callback [0 ](fhss_common_stub .fhss_struct .fhss_api , DEFAULT_TIMER_DELAY );
890+ // Test delayed interrupts
891+ api = test_generate_fhss_api_default_settings ();
892+ fhss_common_stub .fhss_struct .ws -> fhss_configuration .fhss_bc_dwell_interval = 0 ;
893+ fhss_common_stub .fhss_struct .ws -> fhss_configuration .fhss_broadcast_interval = 0 ;
894+ fhss_common_stub .fhss_struct .ws -> fhss_configuration .ws_uc_channel_function = WS_DH1CF ;
895+ enable_fhss_struct ();
896+ fhss_common_stub .fhss_struct .fhss_api -> synch_state_set (api , DEFAULT_FHSS_STATE , DEFAULT_PANID );
897+
898+ fhss_common_stub .fhss_struct .ws -> uc_slot = 10000 ;
899+ test_set_interrupt_delay_us (100000 , false);
900+ fhss_common_stub .callback [0 ](fhss_common_stub .fhss_struct .fhss_api , DEFAULT_TIMER_DELAY );
901+ if ((fhss_common_stub .fhss_struct .ws -> next_uc_timeout != (fhss_common_stub .fhss_struct .callbacks .read_timestamp (fhss_common_stub .fhss_struct .fhss_api ) + 155000 )) ||
902+ fhss_common_stub .fhss_struct .ws -> uc_slot != 10001 ) {
903+ return false;
904+ }
905+ fhss_common_stub .fhss_struct .ws -> uc_slot = 10000 ;
906+ test_set_interrupt_delay_us (405000 , false);
907+ fhss_common_stub .callback [0 ](fhss_common_stub .fhss_struct .fhss_api , DEFAULT_TIMER_DELAY );
908+ if ((fhss_common_stub .fhss_struct .ws -> next_uc_timeout != (fhss_common_stub .fhss_struct .callbacks .read_timestamp (fhss_common_stub .fhss_struct .fhss_api ) + 105000 )) ||
909+ fhss_common_stub .fhss_struct .ws -> uc_slot != 10002 ) {
910+ return false;
911+ }
912+ fhss_common_stub .fhss_struct .ws -> uc_slot = 10000 ;
913+ test_set_interrupt_delay_us (1835000 , false);
914+ fhss_common_stub .callback [0 ](fhss_common_stub .fhss_struct .fhss_api , DEFAULT_TIMER_DELAY );
915+ if ((fhss_common_stub .fhss_struct .ws -> next_uc_timeout != (fhss_common_stub .fhss_struct .callbacks .read_timestamp (fhss_common_stub .fhss_struct .fhss_api ) + 205000 )) ||
916+ fhss_common_stub .fhss_struct .ws -> uc_slot != 10008 ) {
917+ return false;
918+ }
737919 return true;
738920}
739921
0 commit comments