#pragma SFR #pragma NOP #pragma HALT #pragma STOP #include "incs.h" #include "i2c_twl.h" #include "i2c_ctr.h" #include "led.h" #include "accero.h" #include "pm.h" #include "rtc.h" //========================================================= #define INTERVAL_TSK_SW 16 #define CLICK_THRESHOLD 1 #define HOLD_THREASHOLD (u8)( 600 / INTERVAL_TSK_SW ) //========================================================= u8 SW_pow_count, SW_home_count, SW_wifi_count; bit SW_pow_mask, SW_home_mask, SW_wifi_mask; bit SW_HOME_n; //========================================================= // 押した時間を数える。押しっぱなしでも0に戻らない // maskが非0の時は、一度離すまで無視する #define count_sw_n( sw, counter, mask ) \ { \ if( sw ){ \ mask = 0; \ counter = 0; \ }else{ \ if( mask != 0 ){ \ counter = 0; \ }else{ \ counter += 1; \ if( counter == 0 ) counter = 255; \ } \ } \ } /* ======================================================== スイッチの監視  チャタリングをはねたり、長押しや、押したトリガなどの検出など ======================================================== */ void tsk_sw( ) { static u8 cnt_force_off = 0; static u8 task_interval = 0; switch ( system_status.pwr_state ) { case ( OFF_TRIG ): SW_pow_count = 0; SW_wifi_count = 0; SW_home_count = 0; cnt_force_off = 0; break; case ( ON_TRIG ): // 電源投入 SW_pow_mask = 1; SW_home_mask = 1; SW_wifi_mask = 1; break; } if( task_interval-- != 0 ) { return; } else { task_interval = (u8)( INTERVAL_TSK_SW / SYS_INTERVAL_TICK ); } switch ( system_status.pwr_state ) { case ( ON ): case ( SLEEP ): case ( BT_CHARGE ): case ( OFF ): // 電源スイッチの監視 // if( SW_POW_n ) { if( ( CLICK_THRESHOLD < SW_pow_count ) && ( SW_pow_count <= HOLD_THREASHOLD ) ) { #ifdef _SW_HOME_ENABLE_ set_irq( VREG_C_IRQ0, REG_BIT_SW_POW_CLICK ); #else set_irq( VREG_C_IRQ0, REG_BIT_SW_HOME_CLICK ); #endif } } else if( SW_pow_count == HOLD_THREASHOLD ) { #ifdef _SW_HOME_ENABLE_ set_irq( VREG_C_IRQ0, REG_BIT_SW_POW_HOLD ); #else set_irq( VREG_C_IRQ0, REG_BIT_SW_HOME_HOLD ); #endif } else if( SW_pow_count == (u8)( 1000 / INTERVAL_TSK_SW )) { // todo vreg_ctr[ VREG_C_LED_POW ] = LED_POW_ILM_ONLY_RED; system_status.pwr_state = OFF_TRIG; renge_task_interval_run_force = 1; } // 電源OFF割り込みを入れたが… if( ( vreg_ctr[VREG_C_IRQ0] & REG_BIT_SW_POW_HOLD ) != 0 ) { cnt_force_off += 1; if( cnt_force_off >= 13 ) { // …返事がない。強制的に切る。 vreg_ctr[ VREG_C_LED_POW ] = LED_POW_ILM_ONLY_RED; system_status.pwr_state = OFF_TRIG; renge_task_interval_run_force = 1; } } else { cnt_force_off = 0; } // HOME スイッチ // switch( system_status.model ) { #ifdef _MODEL_CTR_ case( MODEL_JIKKI ): SW_HOME_n = SW_HOME_n_JIKKI; break; #endif case( MODEL_TS_BOARD ): case( MODEL_SHIROBAKO ): SW_HOME_n = SW_HOME_n_TSBOARD; break; default: SW_HOME_n = 1; } if( SW_HOME_n ) { if( ( CLICK_THRESHOLD < SW_home_count ) && ( SW_home_count <= HOLD_THREASHOLD ) ) { set_irq( VREG_C_IRQ0, REG_BIT_SW_HOME_CLICK ); } } else if( SW_home_count == HOLD_THREASHOLD ) { set_irq( VREG_C_IRQ0, REG_BIT_SW_HOME_HOLD ); } // wifi sw // if( SW_wifi_count == CLICK_THRESHOLD ) { set_irq( VREG_C_IRQ0, REG_BIT_SW_WIFI_CLICK ); } break; } // ボタン押し時間のカウント /* if( ( system_status.pwr_state == ON ) || ( system_status.pwr_state == OFF ) || ( system_status.pwr_state == BT_CHARGE ) ) */ { count_sw_n( SW_POW_n, SW_pow_count, SW_pow_mask ); #ifdef _SW_HOME_ENABLE_ count_sw_n( SW_HOME_n, SW_home_count, SW_home_mask ); #endif count_sw_n( SW_WIFI_n, SW_wifi_count, SW_wifi_mask ); } return; }