@@ -47,13 +47,9 @@ LOG_MODULE_REGISTER(StateSync, LOG_LEVEL_INF);
4747
4848#define THREAD_STACK_SIZE 2000
4949#define THREAD_PRIORITY 5
50- static K_THREAD_STACK_DEFINE (stack_area_left , THREAD_STACK_SIZE ) ;
51- static struct k_thread thread_data_left ;
52- static k_tid_t stateSyncThreadLeftId = 0 ;
53-
54- static K_THREAD_STACK_DEFINE (stack_area_dongle , THREAD_STACK_SIZE ) ;
55- static struct k_thread thread_data_dongle ;
56- static k_tid_t stateSyncThreadDongleId = 0 ;
50+ static K_THREAD_STACK_DEFINE (stack_area , THREAD_STACK_SIZE ) ;
51+ static struct k_thread thread_data ;
52+ static k_tid_t stateSyncThreadId = 0 ;
5753
5854sync_generic_half_state_t SyncLeftHalfState ;
5955sync_generic_half_state_t SyncRightHalfState ;
@@ -71,17 +67,6 @@ bool StateSync_BlinkRightBatteryPercentage = false;
7167
7268bool StateSync_VersionCheckEnabled = true;
7369
74- static void wake (k_tid_t tid ) {
75- if (tid != 0 ) {
76- k_wakeup (tid );
77- // if (DEBUG_MODE) {
78- // LogU("StateSync woke up %p", tid);
79- // }
80- } else if (k_uptime_get_32 () > 5000 ) {
81- LOG_INF ("Skipping wake up, tid is 0" );
82- }
83- }
84-
8570static void receiveProperty (device_id_t src , state_sync_prop_id_t property , const uint8_t * data , uint8_t len );
8671
8772#define DEFAULT_LAYER_PROP (NAME ) \
@@ -185,20 +170,7 @@ static void invalidateProperty(state_sync_prop_id_t propId) {
185170 } else {
186171 stateSyncProps [propId ].dirtyState = DirtyState_NeedsUpdate ;
187172 }
188- bool isRightLeftDevice =
189- (DEVICE_ID == DeviceId_Uhk80_Left || DEVICE_ID == DeviceId_Uhk80_Right );
190- bool isRightLeftLink = (stateSyncProps [propId ].direction &
191- (SyncDirection_RightToLeft | SyncDirection_LeftToRight ));
192- if (isRightLeftLink && isRightLeftDevice ) {
193- wake (stateSyncThreadLeftId );
194- }
195- bool isRightDongleDevice =
196- (DEVICE_ID == DeviceId_Uhk80_Right || DEVICE_ID == DeviceId_Uhk_Dongle );
197- bool isRightDongleLink = (stateSyncProps [propId ].direction &
198- (SyncDirection_DongleToRight | SyncDirection_RightToDongle ));
199- if (isRightDongleLink && isRightDongleDevice ) {
200- wake (stateSyncThreadDongleId );
201- }
173+ WAKE (stateSyncThreadId );
202174}
203175
204176void StateSync_UpdateProperty (state_sync_prop_id_t propId , void * data ) {
@@ -825,37 +797,6 @@ static bool handlePropertyUpdateRightToDongle() {
825797 return UpdateResult_AllUpToDate ;
826798}
827799
828- static void updateLoopRightLeft () {
829- update_result_t res ;
830-
831- if (DEVICE_ID == DeviceId_Uhk80_Left ) {
832- while (true) {
833- bool isConnected = DeviceState_IsDeviceConnected (DeviceId_Uhk80_Right );
834- STATE_SYNC_LOG ("--- Left to right update loop, connected: %i\n" , isConnected );
835-
836- if (!isConnected || (res = handlePropertyUpdateLeftToRight ()) == UpdateResult_AllUpToDate ) {
837- k_sleep (K_FOREVER );
838- } else {
839- uint32_t delay = res == UpdateResult_UpdatedHighPrio ? STATE_SYNC_SEND_DELAY_HPRIO : STATE_SYNC_SEND_DELAY_LPRIO ;
840- k_sleep (K_MSEC (delay ));
841- }
842- }
843- }
844-
845- if (DEVICE_ID == DeviceId_Uhk80_Right ) {
846- while (true) {
847- bool isConnected = DeviceState_IsDeviceConnected (DeviceId_Uhk80_Left );
848- STATE_SYNC_LOG ("--- Right to left update loop, connected: %i\n" , isConnected );
849- if (!isConnected || (res = handlePropertyUpdateRightToLeft ()) == UpdateResult_AllUpToDate ) {
850- k_sleep (K_FOREVER );
851- } else {
852- uint32_t delay = res == UpdateResult_UpdatedHighPrio ? STATE_SYNC_SEND_DELAY_HPRIO : STATE_SYNC_SEND_DELAY_LPRIO ;
853- k_sleep (K_MSEC (delay ));
854- }
855- }
856- }
857- }
858-
859800static void updateStandbys () {
860801 for (uint8_t peerId = PeerIdFirstHost ; peerId <= PeerIdLastHost ; peerId ++ ) {
861802 uint8_t connectionId = Peers [peerId ].connectionId ;
@@ -866,64 +807,87 @@ static void updateStandbys() {
866807 }
867808}
868809
869- static void updateLoopRightDongle () {
870- update_result_t res ;
871810
872- if (DEVICE_ID == DeviceId_Uhk80_Right ) {
873- while (true) {
874- bool isConnected = DeviceState_IsDeviceConnected (DeviceId_Uhk_Dongle );
875- STATE_SYNC_LOG ("--- Right to dongle update loop, connected: %i\n" , isConnected );
811+ static void updateLoop () {
812+ update_result_t res1 = UpdateResult_AllUpToDate ;
813+ update_result_t res2 = UpdateResult_AllUpToDate ;
814+ bool isConnected1 = false;
815+ bool isConnected2 = false;
816+ bool isIdle1 = true;
817+ bool isIdle2 = true;
818+
819+ while (true) {
820+ if (DEVICE_ID == DeviceId_Uhk80_Left ) {
821+ isConnected1 = DeviceState_IsDeviceConnected (DeviceId_Uhk80_Right );
822+ STATE_SYNC_LOG ("--- Left to right update loop, connected: %i\n" , isConnected );
823+
824+ if (isConnected1 ) {
825+ res1 = handlePropertyUpdateLeftToRight ();
826+ }
876827
828+ isIdle1 = !isConnected1 || res1 == UpdateResult_AllUpToDate ;
829+ }
830+
831+ if (DEVICE_ID == DeviceId_Uhk80_Right ) {
832+ isConnected1 = DeviceState_IsDeviceConnected (DeviceId_Uhk80_Left );
833+ STATE_SYNC_LOG ("--- Right to left update loop, connected: %i\n" , isConnected1 );
834+ if (isConnected1 ) {
835+ res1 = handlePropertyUpdateRightToLeft ();
836+ }
837+ isIdle1 = !isConnected1 || res1 == UpdateResult_AllUpToDate ;
838+ }
839+
840+ if (DEVICE_ID == DeviceId_Uhk80_Right ) {
841+ isConnected2 = DeviceState_IsDeviceConnected (DeviceId_Uhk_Dongle );
842+ STATE_SYNC_LOG ("--- Right to dongle update loop, connected: %i\n" , isConnected2 );
877843 if (stateSyncProps [StateSyncPropertyId_DongleStandby ].dirtyState != DirtyState_Clean ) { \
878844 updateStandbys (); \
879845 }
880846
881- if (!isConnected || (res = handlePropertyUpdateRightToDongle ()) == UpdateResult_AllUpToDate ) {
882- k_sleep (K_FOREVER );
883- } else {
884- uint32_t delay = res == UpdateResult_UpdatedHighPrio ? STATE_SYNC_SEND_DELAY_HPRIO : STATE_SYNC_SEND_DELAY_LPRIO ;
885- k_sleep (K_MSEC (delay ));
847+ if (!isConnected2 ) {
848+ res2 = handlePropertyUpdateRightToDongle ();
886849 }
850+ isIdle2 = !isConnected2 || res2 == UpdateResult_AllUpToDate ;
887851 }
888- }
889852
890- if (DEVICE_ID == DeviceId_Uhk_Dongle ) {
891- while (true) {
892- bool isConnected = DeviceState_IsDeviceConnected (DeviceId_Uhk80_Right );
893- STATE_SYNC_LOG ("--- Dongle update loop, connected: %i\n" , isConnected );
894- if (!isConnected || DongleStandby || (res = handlePropertyUpdateDongleToRight ()) == UpdateResult_AllUpToDate ) {
895- k_sleep (K_FOREVER );
896- } else {
897- uint32_t delay = res == UpdateResult_UpdatedHighPrio ? STATE_SYNC_SEND_DELAY_HPRIO : STATE_SYNC_SEND_DELAY_LPRIO ;
898- k_sleep (K_MSEC (delay ));
853+
854+ if (DEVICE_ID == DeviceId_Uhk_Dongle ) {
855+ isConnected1 = DeviceState_IsDeviceConnected (DeviceId_Uhk80_Right );
856+ STATE_SYNC_LOG ("--- Dongle update loop, connected: %i\n" , isConnected1 );
857+ if (!isConnected1 ) {
858+ res1 = handlePropertyUpdateDongleToRight ();
899859 }
860+
861+ isIdle1 = !isConnected1 || res1 == UpdateResult_AllUpToDate ;
862+ }
863+
864+ update_result_t mergedResult = MIN (res1 , res2 );
865+
866+
867+ if (isIdle1 && isIdle2 ) {
868+ k_sleep (K_FOREVER );
869+ } else {
870+ uint32_t delay = mergedResult == UpdateResult_UpdatedHighPrio ? STATE_SYNC_SEND_DELAY_HPRIO : STATE_SYNC_SEND_DELAY_LPRIO ;
871+ k_sleep (K_MSEC (delay ));
900872 }
901873 }
902874}
903875
876+
904877void StateSync_UpdateLayer (layer_id_t layerId , bool fullUpdate ) {
905878 state_sync_prop_id_t propId = StateSyncPropertyId_LayerActionFirst + layerId - LayerId_First ;
906879
907880 stateSyncProps [propId ].dirtyState = fullUpdate ? DirtyState_NeedsUpdate : DirtyState_NeedsClearing ;
908881 stateSyncProps [propId ].defaultDirty = stateSyncProps [propId ].dirtyState ;
909882
910- WAKE (stateSyncThreadLeftId );
883+ WAKE (stateSyncThreadId );
911884}
912885
913886void StateSync_Init () {
914- if (DEVICE_ID == DeviceId_Uhk80_Left || DEVICE_ID == DeviceId_Uhk80_Right ) {
915- stateSyncThreadLeftId = k_thread_create (& thread_data_left , stack_area_left ,
916- K_THREAD_STACK_SIZEOF (stack_area_left ), updateLoopRightLeft , NULL , NULL , NULL ,
887+ stateSyncThreadId = k_thread_create (& thread_data , stack_area ,
888+ K_THREAD_STACK_SIZEOF (stack_area ), updateLoop , NULL , NULL , NULL ,
917889 THREAD_PRIORITY , 0 , K_NO_WAIT );
918- k_thread_name_set (& thread_data_left , "state_sync_left_right" );
919- }
920-
921- if (DEVICE_ID == DeviceId_Uhk80_Right || DEVICE_ID == DeviceId_Uhk_Dongle ) {
922- stateSyncThreadDongleId = k_thread_create (& thread_data_dongle , stack_area_dongle ,
923- K_THREAD_STACK_SIZEOF (stack_area_dongle ), updateLoopRightDongle , NULL , NULL , NULL ,
924- THREAD_PRIORITY , 0 , K_NO_WAIT );
925- k_thread_name_set (& thread_data_dongle , "state_sync_dongle_right" );
926- }
890+ k_thread_name_set (& thread_data , "state_sync" );
927891}
928892
929893void StateSync_ResetRightLeftLink (bool bidirectional ) {
0 commit comments