#pragma SFR #pragma NOP #pragma HALT #pragma STOP #include "incs.h" #include "i2c_twl.h" #include "i2c_ctr.h" #include "led.h" #include "pm.h" #include "rtc.h" //========================================================= #define INTERVAL_TSK_SW 8 #define CLICK_THRESHOLD 2 #ifdef _FOR_E3_ #define HOLD_THREASHOLD (u8)( 800 / INTERVAL_TSK_SW ) #else #define HOLD_THREASHOLD (u8)( 2000 / INTERVAL_TSK_SW ) #endif //========================================================= u8 SW_pow_count; bit SW_pow_mask; u8 SW_home_count, SW_wifi_count; 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; \ } \ } \ } #define chk_clicked( button, count, irq_bit_name ) \ if( !button ) \ { \ if( count <= CLICK_THRESHOLD ) \ { \ count += 1; \ } \ if( count == CLICK_THRESHOLD ) \ { \ set_irq( VREG_C_IRQ0, irq_bit_name ); \ } \ } \ else \ { \ count = 0; \ } /* ======================================================== スイッチの監視  チャタリングをはねたり、長押しや、押したトリガなどの検出など ======================================================== */ void tsk_sw( ) { static u16 cnt_force_off = 0; static u8 task_interval = 0; switch ( system_status.pwr_state ) { case ( ON_TRIG ): cnt_force_off = 0; 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 ): // 電源スイッチの監視 // count_sw_n( SW_POW_n, SW_pow_count, SW_pow_mask ); // ボタン押し時間のカウント if( SW_POW_n ) { if( SW_pow_count == CLICK_THRESHOLD ) { #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 cnt_force_off = 1; } if( cnt_force_off != 0 ) { #ifdef _FOR_E3_ if( ++cnt_force_off == ( 200 / INTERVAL_TSK_SW ) ) #else if( ++cnt_force_off == ( 4000 / INTERVAL_TSK_SW ) ) #endif { // タイムアウトによる強制OFF cnt_force_off = 0; vreg_ctr[ VREG_C_LED_POW ] = LED_POW_ILM_ONLY_RED; system_status.pwr_state = OFF_TRIG; renge_task_interval_run_force = 1; } } #ifdef _SW_HOME_ENABLE_ // 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; // 放されてる状態 } chk_clicked( SW_HOME_n, SW_home_count, REG_BIT_SW_HOME_CLICK ); #endif // wifi sw // chk_clicked( SW_WIFI_n, SW_wifi_count, REG_BIT_SW_WIFI_CLICK ); } }