void fsm_scan_update(void) { switch(current_scan_state) { case KEY_SCAN_INACTIVE: if (DEVELOPMENT_DEBUG && (systick_hit || wkup_hit)) { ASSERT_ERROR(0); } if (HAS_DELAYED_WAKEUP) { app_kbd_enable_delayed_scanning(true); } else { app_kbd_enable_scanning(); } current_scan_state = KEY_SCAN_IDLE; // Transition from KEY_SCAN_INACTIVE -> KEY_SCAN_IDLE break; case KEY_SCAN_IDLE: if (DEVELOPMENT_DEBUG && systick_hit) { ASSERT_ERROR(0); } if (wkup_hit) { // dbg_puts(DBG_SCAN_LVL, "KEY_SCAN_IDLE -> Wakeup! -> KEY_SCANNING\r\n"); scanning_substate = 0; GLOBAL_INT_DISABLE(); current_scan_state = KEY_SCANNING; // Transition from KEY_SCAN_IDLE -> KEY_SCANNING app_kbd_start_scanning(); wkup_hit = false; GLOBAL_INT_RESTORE(); } break; case KEY_STATUS_UPD: if (DEVELOPMENT_DEBUG && wkup_hit) { ASSERT_ERROR(0); } if (systick_hit) { systick_hit = false; if (app_kbd_update_status()) { scanning_substate = 0; current_scan_state = KEY_SCANNING; // Transition from KEY_STATUS_UPD -> KEY_SCANNING // scan once to save time! if (app_kbd_scan_matrix(&scanning_substate)) { current_scan_state = KEY_STATUS_UPD; // Transition from KEY_SCANNING -> KEY_STATUS_UPD } } else { GLOBAL_INT_DISABLE(); app_kbd_enable_scanning(); current_scan_state = KEY_SCAN_IDLE; // Transition from KEY_STATUS_UPD -> KEY_SCAN_IDLE GLOBAL_INT_RESTORE(); } } break; case KEY_SCANNING: if (DEVELOPMENT_DEBUG && wkup_hit) { ASSERT_ERROR(0); } if (systick_hit) { systick_hit = false; if (app_kbd_scan_matrix(&scanning_substate)) { current_scan_state = KEY_STATUS_UPD; // Transition from KEY_SCANNING -> KEY_STATUS_UPD } // else the state remains unchanged and next time we will scan the next row } break; default: break; } }
/* * Description : Key scan FSM. * * Returns : void * */ void fsm_scan_update(void) { switch(current_scan_state) { case KEY_SCAN_INACTIVE: // if (main_fsm_changed) if (true) { // main_fsm_changed = false; app_kbd_enable_scanning(); current_scan_state = KEY_SCAN_IDLE; // Transition from KEY_SCAN_INACTIVE -> KEY_SCAN_IDLE } if (DEVELOPMENT__NO_OTP) { if (systick_hit || wkup_hit) __asm("BKPT #0\n"); } break; case KEY_SCAN_IDLE: // if (main_fsm_changed) if (false) { // main_fsm_changed = false; app_kbd_disable_scanning(); current_scan_state = KEY_SCAN_INACTIVE; // Transition from KEY_SCAN_IDLE -> KEY_SCAN_INACTIVE } else if (wkup_hit) { scanning_substate = 0; app_kbd_start_scanning(); current_scan_state = KEY_SCANNING; // Transition from KEY_SCAN_IDLE -> KEY_SCANNING } wkup_hit = false; // just in case... if (DEVELOPMENT__NO_OTP) { if (systick_hit) __asm("BKPT #0\n"); } break; case KEY_STATUS_UPD: if (DEVELOPMENT__NO_OTP) { if (wkup_hit) __asm("BKPT #0\n"); } if (systick_hit) { if (app_kbd_update_status()) { scanning_substate = 0; current_scan_state = KEY_SCANNING; // Transition from KEY_STATUS_UPD -> KEY_SCANNING // scan once to save time! if (app_kbd_scan_matrix(&scanning_substate)) current_scan_state = KEY_STATUS_UPD; // Transition from KEY_SCANNING -> KEY_STATUS_UPD } else { current_scan_state = KEY_SCAN_IDLE; // Transition from KEY_STATUS_UPD -> KEY_SCAN_IDLE } systick_hit = false; } break; case KEY_SCANNING: if (DEVELOPMENT__NO_OTP) { if (wkup_hit) __asm("BKPT #0\n"); } if (systick_hit) { if (app_kbd_scan_matrix(&scanning_substate)) current_scan_state = KEY_STATUS_UPD; // Transition from KEY_SCANNING -> KEY_STATUS_UPD // else the state remains unchanged and next time we will scan the next row systick_hit = false; } break; default: break; } }