/******************************************************//** LED_Cam TO02 BLINK,*_PLUSE の時は、1周期分は必ずその状態になります。 その間に OFF→BLINK などされると、OFFが無視されます。 $Id$ *********************************************************/ #ifndef _WIN32 #pragma sfr #endif #include "incs.h" #include "led.h" #include "vreg_twl.h" // ======================================================== static u8 state_led_cam = 0; static u16 task_interval; bit cam_led_update; // ======================================================== static void cam_led_twl(); /********************************************//** インターバル実行タスクと、twlレジスタへの書き込みの2カ所から呼ばれます。 ***********************************************/ void tsk_led_cam( ) { DI_wt_chk(); // レジスタへの書き込みで強制起動がかかることがあるため if( !cam_led_update ) { if( task_interval != 0 ) { task_interval --; EI(); return; } } cam_led_update = false; // TWL のブリンク設定(一発だけ点灯)のため EI(); if( system_status.pwr_state == SLEEP ) // sleep中、強制消灯 { LED_CAM = 0; state_led_cam = 0; } else { // ブリンクのように待たせたいとき以外は毎週起動する // (レジスタの変更にすぐに反応する) switch ( vreg_ctr[VREG_C_LED_CAM] ) { case ( CAM_LED_OFF ): default: LED_CAM = 0; state_led_cam = 0; break; case ( CAM_LED_ON ): LED_CAM = 1; state_led_cam = 0; break; case ( CAM_LED_BLINK ): if( state_led_cam == 0 ) { LED_CAM = 1; state_led_cam = 1; } else { LED_CAM = 0; state_led_cam = 0; } task_interval = 250; break; case ( CAM_LED_ON_PLUSE ): if( state_led_cam == 0 ) { LED_CAM = 1; state_led_cam = 1; task_interval = 250; } else { vreg_ctr[VREG_C_LED_CAM] = CAM_LED_OFF; } break; case ( CAM_LED_OFF_PLUSE ): if( state_led_cam == 0 ) { LED_CAM = 0; state_led_cam = 1; task_interval = 250; } else { vreg_ctr[VREG_C_LED_CAM] = CAM_LED_ON; } break; case( CAM_LED_BY_TWL ): cam_led_twl(); } } // if( system_status.pwr_state == sleep ) ... else ... } /********************************************//** TWLからカメラLEDを操作される ***********************************************/ static void cam_led_twl() { // TWL互換 // switch ( vreg_twl[ REG_TWL_INT_ADRS_CAM ] ){ case( TWL_CAMLED_OFF ): LED_CAM = 0; state_led_cam = 0; break; case( TWL_CAMLED_BLINK ): if( state_led_cam == 0 ) { LED_CAM = 1; state_led_cam = 1; } else { LED_CAM = 0; state_led_cam = 0; } task_interval = (u8)( 600 / SYS_INTERVAL_TICK ) + 250; break; case( TWL_CAMLED_ON ): case( TWL_CAMLED_DEF_ON ): default: LED_CAM = 1; state_led_cam = 1; break; } }