歩数計バグ修正

・毎時一歩目の時に累計のインクリメントを忘れていた
・内部で年の比較を誤っていた。2021年にバグが発覚するのを回避できた

充電ICの不具合(仕様)の回避
・アダプタを抜いた瞬間に電池残量100%で充電完了 となってしまうのを回避。
 SoCへ通知するステータスもケア済み


git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_mcu@312 013db118-44a6-b54f-8bf7-843cb86687b1
This commit is contained in:
n2232 2011-02-15 08:09:43 +00:00
parent c3e5d5f2d2
commit f8af9cb246
9 changed files with 74 additions and 52 deletions

View File

@ -15,7 +15,7 @@
#define MCU_VER_MAJOR 0x01
#define MCU_VER_MINOR 0x1B
#define MCU_VER_MINOR 0x1C
#define _firm_format_v3_

Binary file not shown.

View File

@ -97,8 +97,6 @@ unsigned char MIN;
unsigned char SEC;
# endif
#endif

View File

@ -70,6 +70,10 @@ u8 frame_sleep;
st_LED_dim_status LED_dim_status_sleep;
// 充電中か否か
extern bit BT_IN_CHG_delayed_n;
// ========================================================
#define led_fade_to( now, goal ) now = fade_to( now, goal )
@ -382,7 +386,8 @@ static u8 led_pow_batt_low()
// おしまい
}
if(( vreg_ctr[VREG_C_BT_REMAIN] > BATT_TH_EMPTY ) || !BT_IN_CHG_n )
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 );

View File

@ -201,7 +201,7 @@ void pedometer()
static void hosu_increment_if_necessary()
{
u8 year_compd; // hour境界補正済み現在年。comp(ensation)
u8 year_compd; // hour境界補正済み現在年。comp(ensation -ed)
// 現在時刻取得
DI();
@ -225,7 +225,7 @@ static void hosu_increment_if_necessary()
// 書き込みポインタの更新
if( ! ( vreg_ctr[ VREG_C_ACC_HOSU_L ] == 0 && // 歩数計on後、最初の一歩までは前回からの経過時間を計算しない
vreg_ctr[ VREG_C_ACC_HOSU_M ] == 0 &&
vreg_ctr[ VREG_C_ACC_HOSU_H ] == 0 )) //. 全ビットorでゼロ判定するのはデジタル回路屋の方言みたい
vreg_ctr[ VREG_C_ACC_HOSU_H ] == 0 )) //. 全ビットORでゼロ判定するのはデジタル回路屋の方言みたい
{
// 歩数計が止まっていた時間を考慮して必要なら進める
// 補正計算 元旦零時台で昨日扱いになった場合、大晦日の23時台に上書き
@ -249,25 +249,31 @@ static void hosu_increment_if_necessary()
last_hour_fny = now_longhour;
// 毎時ログ インクリメント
if( pool.vreg_c_ext.pedo_log[ p_record ] == HOSU_NODATA ) // その時間帯最初のカウントの時
if( pool.vreg_c_ext.pedo_log[ p_record ] == HOSU_MAX )
{
// 何もしないでおしまい
//. 小計の合計と累計があわなくなるのを避けるためだろうけど、どうなの?
return;
}
else if( pool.vreg_c_ext.pedo_log[ p_record ] == HOSU_NODATA ) // その時間帯最初のカウントの時
{ // これしないと1歩足りない
pool.vreg_c_ext.pedo_log[ p_record ] = 1;
}
else if( pool.vreg_c_ext.pedo_log[ p_record ] != HOSU_MAX )
{
else
{
// 通常パス
pool.vreg_c_ext.pedo_log[ p_record ] += 1;
}
// 累積の更新 //
if( ++vreg_ctr[ VREG_C_ACC_HOSU_L ] == 0 ) //. いろいろ失敗した...
// 累積の更新 //
if( ++vreg_ctr[ VREG_C_ACC_HOSU_L ] == 0 ) // カンストチェック
{
if( ++vreg_ctr[ VREG_C_ACC_HOSU_M ] == 0 )
{
if( ++vreg_ctr[ VREG_C_ACC_HOSU_M ] == 0 )
{
if( ++vreg_ctr[ VREG_C_ACC_HOSU_H ] == 0 ){
vreg_ctr[ VREG_C_ACC_HOSU_L ] = 255; //. カンスト orz
vreg_ctr[ VREG_C_ACC_HOSU_M ] = 255;
vreg_ctr[ VREG_C_ACC_HOSU_H ] = 255;
}
if( ++vreg_ctr[ VREG_C_ACC_HOSU_H ] == 0 ){
vreg_ctr[ VREG_C_ACC_HOSU_L ] = 255; //. いろいろ失敗だったね...
vreg_ctr[ VREG_C_ACC_HOSU_M ] = 255;
vreg_ctr[ VREG_C_ACC_HOSU_H ] = 255;
}
}
}
@ -495,7 +501,7 @@ static unsigned long my_sqrt(unsigned long x)
static u16 calc_hours_spend( u8 year )
{
// 同じ年の内
if( cal_log_latest.year_bcd == year )
if( bcdtob( cal_log_latest.year_bcd ) == year )
{
if( now_longhour > last_hour_fny )
{

View File

@ -24,14 +24,14 @@ u8 raw_adc_temperature;
BT_VENDER battery_manufacturer = BT_VENDER_NOT_CHECKED;
st_bt_comp bt_comp; // バッテリパラメータ構造体
u8 reg_shadow; // NTR PMIC レジスタミラー
bit bt_chg_ready; // バッテリパラメータ送信済。充電開始許可
bit bt_authorized; // バッテリパラメータ送信済。充電開始許可
u8 chg_led_override; // アダプタ差したとき、充電するしないに関わらずしばらく点灯させる
u16 bt_volt16;
bit ntr_pm_bt_low_old;
bit BT_CHG_STAT_Change;
bit BT_IN_CHG_delayed_n;
u8 pmic_version;
u8 mgic_version[2];
@ -128,7 +128,7 @@ void tsk_batt( )
}
// WM0ではCHG_ENABLEピンは /WL_RST に配線されており、充電制御しない
if( !temp_zone_charge_disable && bt_chg_ready && !PM_EXTDC_n )
if( !temp_zone_charge_disable && bt_authorized && !PM_EXTDC_n )
{
BT_CHG_ENABLE(); // 温度範囲OKで充電再開
}
@ -139,27 +139,40 @@ void tsk_batt( )
// 充電 //
// →割り込み。
// CCICの不具合回避のため、/CHGのネゲートをちょっと丁寧に遅延させる
{
static u8 anti_chatter;
static u8 anti_chatter;
if( BT_IN_CHG_n ) // 充電*してない* (論理がわかりづらいな!)
{
anti_chatter = 0;
LED_CHARGE = 0;
}
else
{
if( !BT_IN_CHG_n )
{
// さらにチャタリング除去
if( anti_chatter < 2 ) // 電池無しでアダプタさして、電極をさわさわ
{ // すると充電LEDががさがさするので
anti_chatter++;
}
else
{
LED_CHARGE = 1;
}
}
else
{
BT_IN_CHG_delayed_n = 0;
}
}
else
{
// "丁寧に遅延" todo:もっといい方法?
if( !BT_CHG_Ena_n && vreg_ctr[ VREG_C_BT_REMAIN ] < 60 )
{
BT_IN_CHG_delayed_n = 0; // 充電中と扱う。充電が終わっているはずがない
}
else
{
BT_IN_CHG_delayed_n = 1;
anti_chatter = 0;
}
}
LED_CHARGE = ( ! BT_IN_CHG_delayed_n )? 1: 0; // LEDに反映
}
// アダプタつないだ瞬間、満充電でも数秒わざと点灯させる。給電してることをわからせるため。
if( chg_led_override != 0 ){ // ↑から見ればわかるが、瞬間(数クロック)消える事がある。気がつく人いるかな…?
chg_led_override -= 1;
LED_CHARGE = 1;
@ -256,7 +269,7 @@ void BT_chk()
BT_model_detect();
if( system_status.model != MODEL_JIKKI )
{
bt_chg_ready = false;
bt_authorized = false;
return;
// おしまい
}
@ -274,7 +287,7 @@ void BT_chk()
}
BT_mgic_init(); // 機種判定も行います
}
bt_chg_ready = true;
bt_authorized = true;
renge_task_immed_add( tski_BT_temp_update ); // 電池温度監視スタート
}
@ -598,14 +611,14 @@ void BT_get_left(){
{
// 実機 //
u8 temp_v[2];
u8 temp_force_fule_left;
u8 temp_force_fuel_left;
// 残量リード
if( iic_mcu_read( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_SOC, 2, temp_fuel ) != ERR_SUCCESS )
{
// 残量ICがNACK …バッテリはずれた
vreg_ctr[ VREG_C_STATUS_1 ] |= REG_BIT_GASGAUGE_ERR;
bt_chg_ready = false;
bt_authorized = false;
vreg_ctr[ VREG_C_BT_REMAIN ] = 0;
system_status.force_off = true;
}
@ -638,27 +651,27 @@ void BT_get_left(){
if( bt_volt16 > V_TH_30 )
{
temp_force_fule_left = 100;
temp_force_fuel_left = 100;
hysteresis = 0;
}
else if( bt_volt16 - hysteresis > V_TH_LO )
{
temp_force_fule_left = 30;
temp_force_fuel_left = 30;
hysteresis = 0;
}
else if( bt_volt16 > V_TH_EMPTY )
{
temp_force_fule_left = BATT_TH_LO; // ここから赤
temp_force_fuel_left = BATT_TH_LO; // ここから赤
hysteresis = 500;
}
else if( bt_volt16 > V_TH_ZERO )
{
temp_force_fule_left = BATT_TH_EMPTY;
temp_force_fuel_left = BATT_TH_EMPTY;
hysteresis = 500;
}
else if( bt_volt16 > V_TH_FORCE_OFF )
{
temp_force_fule_left = 0;
temp_force_fuel_left = 0;
hysteresis = 500;
}
else
@ -672,20 +685,20 @@ void BT_get_left(){
// 充電許可(=アダプタも刺さってる)のに充電してない
// かつ、少なくとも素の電池残量が60%以上CCICバグ回避
// = 充電完了。電池がへたってくるとMGICが100%を返さない
if( !BT_CHG_Ena_n && BT_IN_CHG_n && vreg_ctr[ VREG_C_BT_REMAIN ] > 60 ){
if( !BT_CHG_Ena_n && BT_IN_CHG_delayed_n ){
vreg_ctr[ VREG_C_BT_REMAIN ] = 100;
vreg_ctr[ VREG_C_BT_REMAIN_FINE ] = 0;
}
else
{ // 少ない方にキャップ
if( temp_force_fule_left > temp_fuel[0] )
if( temp_force_fuel_left > temp_fuel[0] )
{
vreg_ctr[ VREG_C_BT_REMAIN ] = temp_fuel[0];
vreg_ctr[ VREG_C_BT_REMAIN_FINE ] = temp_fuel[1];
}
else
{
vreg_ctr[ VREG_C_BT_REMAIN ] = temp_force_fule_left;
vreg_ctr[ VREG_C_BT_REMAIN ] = temp_force_fuel_left;
vreg_ctr[ VREG_C_BT_REMAIN_FINE ] = 0;
}
}

View File

@ -161,7 +161,7 @@ task_status_immed tski_PM_LCD_off();
task_status_immed tski_PM_BL_set();
#define PM_Chg_Stop() { BT_TEMP_P = 0; BT_CHG_DISABLE(); while( !BT_IN_CHG_n ){;}; LED_CHARGE = 0; bt_chg_ready = false; }
#define PM_Chg_Stop() { BT_TEMP_P = 0; BT_CHG_DISABLE(); LED_CHARGE = 0; bt_authorized = false; }
//  これを呼ぶ前に、現在温度を教えておく必要があります。

View File

@ -251,7 +251,7 @@ extern u8 raw_adc_temperature;
extern u8 iic_burst_state;
extern bit temp_zone_charge_disable;
extern bit bt_chg_ready;
extern bit bt_authorized;
/* ========================================================
@ -265,7 +265,7 @@ extern bit bt_chg_ready;
5) <EFBFBD>V
6) ( rcomp & 0xFF )
7) raw_adc_temperature
8) ( !temp_zone_charge_disable | ( bt_chg_ready << 1 ) )
8) ( !temp_zone_charge_disable | ( bt_authorized << 1 ) )
9)
======================================================== */
u8 extinfo_read()
@ -286,7 +286,7 @@ u8 extinfo_read()
infos[4] = mgic_version[1];
infos[5] = (u8)( _dbg_rcomp & 0xFF );
infos[6] = raw_adc_temperature;
infos[7] = ( !temp_zone_charge_disable | ( bt_chg_ready << 1 ) );
infos[7] = ( !temp_zone_charge_disable | ( bt_authorized << 1 ) );
infos[8] = system_status.info_fullcolor;
iic_burst_state++;

View File

@ -29,7 +29,7 @@ static void send_getup_to_soc();
//=========================================================
extern bit info_led_off;
extern bit going_to_sleep;
extern bit bt_chg_ready;
extern bit bt_authorized;
static u8 timeout_sleep;
extern u8 chg_led_override;