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;
    }
}