/* ======================================================== // 電源LED LED_POW_B,R 6,7 TDR00 周期(0x03FF。TPS0で250kHzでカウントアップ。10bitなら250Hz位になる) TDR0x Duty 0で消灯、TDR00(より大 =0x03FF以上)で点灯です。 enum pwr_state_{ OFF_TRIG = 0, ON_CHECK, ON_TRIG, ON, SLEEP }; enum LED_ILUM_MODE{ LED_POW_ILM_AUTO, LED_POW_ILM_ON, LED_POW_ILM_SLEEP, LED_POW_ILM_CEOFF }; ======================================================== */ #ifndef _WIN32 #pragma sfr #endif #include "incs.h" #include "led.h" // ======================================================== // スリープ中明滅のテーブル。マジか。 const u8 LED_PTN_SLEEP[] = { 25, 38, 52, 68, 83, 98, 110, 119, 125, 128, 128, 125, 119, 110, 98, 83, 68, 52, 38, 25, 16, 10, 8, 8, 8, 8, 8, 8, 8, 8, 10, 16 }; // 赤LEDの電池残量LEDの点滅パターン st_led_red_batt_empty led_red_batt_empty = { 0x55, 0x55, 0x55, 0x55 }; #define LED_SLEEP_FRAME_LEN 71 #define LED_SLEEP_DIM_LEN 71 #define LED_SLEEP_FRAME_NUM 32 // ======================================================== static void led_pow_normal( ); static void led_pow_sleep( ); static void led_pow_bt_empty(); static u8 led_pow_batt_low(); #define led_fade_to( now, goal ) now = fade_to( now, goal ) extern u8 fade_to( u8 now, u8 goal ); #define led_fade_to2( led, status ) led = fade_to2( status ) extern u8 fade_to2( st_LED_dim_status* status ); // ======================================================== // 電源LEDのスリープパターンのステータス類 static u8 time_to_next_frame_sleep = LED_SLEEP_FRAME_LEN; static u8 frame_sleep; static st_LED_dim_status LED_dim_status_sleep; extern bit ledInitialized; extern bit BT_IN_CHG_delayed_n; // ======================================================== void tsk_led_pow( ) { if( ! ledInitialized ) { return; // おしまい } info_led_override = false; switch ( vreg_ctr[VREG_C_LED_POW] ) { case ( LED_POW_ILM_AUTO ): default: led_pow_normal( ); break; case ( LED_POW_ILM_SLEEP ): led_pow_sleep( ); break; case ( LED_POW_ILM_ON ): led_fade_to( LED_duty_pow_blu, vreg_ctr[VREG_C_LED_BRIGHT] ); LED_pow_red = 0; break; case ( LED_POW_ILM_OFF ): led_fade_to( LED_duty_pow_blu, 0 ); LED_pow_red = 0; break; case ( LED_POW_ILM_ONLY_RED ): LED_duty_pow_blu = 0; LED_pow_red = 1; break; case ( LED_POW_ILM_ONLY_BLUE ): LED_duty_pow_blu = LED_BRIGHT_MAX; LED_pow_red = 0; break; case ( LED_POW_ILM_FORCE_BT_EMPTY ): led_pow_bt_empty(); break; } if( system_status.pwr_state == OFF || system_status.pwr_state == ON_CHECK ) { LED_pow_red = 0; info_led_override = false; } if( info_led_override ) { LED_duty_notify_blu = 0; LED_duty_notify_grn = 0; LED_duty_notify_red = ( LED_pow_red == 0 )? 0 : 255; } } /* ======================================================== 電池残量で、 青→赤→赤点滅 ======================================================== */ static void led_pow_normal( ) { time_to_next_frame_sleep = LED_SLEEP_FRAME_LEN; frame_sleep = 0; LED_dim_status_sleep.now = (sx16)LED_duty_pow_blu * 128; if( led_pow_batt_low() != 0 ) // 赤の点灯も←でやっています { return; // おしまい } // 青点灯 led_fade_to( LED_duty_pow_blu, vreg_ctr[VREG_C_LED_BRIGHT] ); } /* ======================================================== ホタルパターン 電池残量で赤→赤点滅にする ======================================================== */ static void led_pow_sleep( ) { if( led_pow_batt_low() != 0 ) // 赤の点灯も←でやっています { time_to_next_frame_sleep = LED_SLEEP_FRAME_LEN; frame_sleep = 0; LED_dim_status_sleep.now = (sx16)LED_duty_pow_blu * 128; return; // おしまい } LED_dim_status_sleep.to = LED_PTN_SLEEP[frame_sleep] * 128; // グラデーションのデルタを計算 LED_dim_status_sleep.delta = (( LED_dim_status_sleep.to - LED_dim_status_sleep.now ) ) / LED_SLEEP_DIM_LEN; led_fade_to2( LED_duty_pow_blu, &LED_dim_status_sleep ); // 次のフレームに進める? time_to_next_frame_sleep --; if( time_to_next_frame_sleep == 0 ) { time_to_next_frame_sleep = LED_SLEEP_FRAME_LEN; frame_sleep ++; if( frame_sleep >= LED_SLEEP_FRAME_NUM -1 ) { frame_sleep = 0; } } } /* ======================================================== 電池が少ないときの共通  返値: 0 電池が少なくなかった      1    少なかったので共通パターンにした ======================================================== */ static u8 led_pow_batt_low() { if( vreg_ctr[VREG_C_BT_REMAIN] > BATT_TH_LO ) { LED_pow_red = 0; return 0; // おしまい } if(( vreg_ctr[VREG_C_BT_REMAIN] > BATT_TH_EMPTY ) || !BT_IN_CHG_delayed_n ) // 電池残量が5%(〜10%) または、それ未満でも充電中 { // 赤点灯 led_fade_to( LED_duty_pow_blu, 0 ); { LED_pow_red = 1; } } else // 電池が5%未満 かつ アダプタなし { led_pow_bt_empty(); } return 1; } /* ========================================================  電池がないパターン   指定パターンを流す   お知らせを上書きしたりする ======================================================== */ static void led_pow_bt_empty() { static u8 delay; static u8 red_blink_poi; info_led_override = true; // 赤点滅 led_fade_to( LED_duty_pow_blu, 0 ); // 赤の点滅パターンも指定できる delay ++; if( delay < 64 ) // フレームの保持時間稼ぎ { return; } delay = 0; if( led_red_batt_empty.dats[ red_blink_poi / 8 ] & ( 1 << ( red_blink_poi % 8 )) ) { LED_pow_red = 1; } else { LED_pow_red = 0; } red_blink_poi ++; if( red_blink_poi >= 32 ) { red_blink_poi = 0; } }