ctr_mcu/trunk/sw.c
N2232 2a6ddf4d26 0.17
・レジスタ書き込みでの強制ボリュームセット実装
・パナソニックのバッテリパラメータをダミーから差し替え(まだ機能してない)
・フルカラーお知らせLEDにきちんと対応
 現行の電源ボード、電源赤がPWMできたりするが実機に合わせてコードも整理
  でないと自動判別後が大変な為
・電源断時にLEDを何となくフェードアウト
・CTR側のI2Cレジスタの実装を修正。220バイト程ROMを節約
 エンバグ怖い
・I2C_mcuのモジュール初期化チェックなどの無駄を少し整理
・TWL I2Cの通信がどうにも間に合わないとき、リトライされてタイミングが悪いと0x00などを返していた。
 リトライ時にも正常に動作するように修正。エンバグ怖い
・廃止enumをちょっと整理
・I2Cレジスタの初期値・リセット時の初期化などを修正
・温度で充電停止周りを実装
・プラットフォームの判定を誤っていた。(0x7Fで読める)
・RCOMPの値の計算を間違えていた。算数もできないのか!
・デバッグコードを抜いた。(pm.c)
・rengeOSのデバッグを有効にしたままだった。I2C_TWLのパフォーマンスが全くでず不具合の嵐
・6秒で電源断を追加。(CTRレジスタから可変) デバッグで耐えられないのでまだ#ifdefでデフォルトを1秒にしてある
・電池無しからアダプタ差したり、アダプタ有りの状態から電池をつないだりで充電したりしなかったり電源はいらなかったり…を修正
・電源LEDが赤になるタイミングと、TWLへの電池残量への通知、NTRへの通知などの閾値がばらばらだったのを修正


git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_mcu@171 013db118-44a6-b54f-8bf7-843cb86687b1
2010-05-24 04:10:36 +00:00

167 lines
4.8 KiB
C

#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"
#include "sw.h"
//=========================================================
/*
vreg_ctrから読みたいのでヘッダへ
#define INTERVAL_TSK_SW 8
#define CLICK_THRESHOLD 2
#ifdef _FORCE_OFF_1SEC_
#define HOLD_THREASHOLD (u8)( 800 / INTERVAL_TSK_SW )
#define FORCEOFF_THREASHOLD (u8)( 1000 / INTERVAL_TSK_SW )
#else
#define HOLD_THREASHOLD (u8)( 2000 / INTERVAL_TSK_SW )
#define FORCEOFF_THREASHOLD (u8)( 4000 / 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;
SW_pow_count = 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 )
{
if( ++cnt_force_off >= vreg_ctr[ VREG_C_OFF_DELAY ] * 6 );
{
// タイムアウトによる強制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 );
}
}