歩数計バグ修正

・毎時一歩目の時に累計のインクリメントを忘れていた
・内部で年の比較を誤っていた。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_MAJOR 0x01
#define MCU_VER_MINOR 0x1B #define MCU_VER_MINOR 0x1C
#define _firm_format_v3_ #define _firm_format_v3_

Binary file not shown.

View File

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

View File

@ -70,6 +70,10 @@ u8 frame_sleep;
st_LED_dim_status LED_dim_status_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 ) #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 ); led_fade_to( LED_duty_pow_blu, 0 );

View File

@ -201,7 +201,7 @@ void pedometer()
static void hosu_increment_if_necessary() static void hosu_increment_if_necessary()
{ {
u8 year_compd; // hour境界補正済み現在年。comp(ensation) u8 year_compd; // hour境界補正済み現在年。comp(ensation -ed)
// 現在時刻取得 // 現在時刻取得
DI(); DI();
@ -225,7 +225,7 @@ static void hosu_increment_if_necessary()
// 書き込みポインタの更新 // 書き込みポインタの更新
if( ! ( vreg_ctr[ VREG_C_ACC_HOSU_L ] == 0 && // 歩数計on後、最初の一歩までは前回からの経過時間を計算しない if( ! ( vreg_ctr[ VREG_C_ACC_HOSU_L ] == 0 && // 歩数計on後、最初の一歩までは前回からの経過時間を計算しない
vreg_ctr[ VREG_C_ACC_HOSU_M ] == 0 && 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時台に上書き // 補正計算 元旦零時台で昨日扱いになった場合、大晦日の23時台に上書き
@ -249,25 +249,31 @@ static void hosu_increment_if_necessary()
last_hour_fny = now_longhour; 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歩足りない { // これしないと1歩足りない
pool.vreg_c_ext.pedo_log[ p_record ] = 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; 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; //. いろいろ失敗だったね...
if( ++vreg_ctr[ VREG_C_ACC_HOSU_H ] == 0 ){ vreg_ctr[ VREG_C_ACC_HOSU_M ] = 255;
vreg_ctr[ VREG_C_ACC_HOSU_L ] = 255; //. カンスト orz vreg_ctr[ VREG_C_ACC_HOSU_H ] = 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 ) 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 ) if( now_longhour > last_hour_fny )
{ {

View File

@ -24,14 +24,14 @@ u8 raw_adc_temperature;
BT_VENDER battery_manufacturer = BT_VENDER_NOT_CHECKED; BT_VENDER battery_manufacturer = BT_VENDER_NOT_CHECKED;
st_bt_comp bt_comp; // バッテリパラメータ構造体 st_bt_comp bt_comp; // バッテリパラメータ構造体
u8 reg_shadow; // NTR PMIC レジスタミラー u8 reg_shadow; // NTR PMIC レジスタミラー
bit bt_chg_ready; // バッテリパラメータ送信済。充電開始許可 bit bt_authorized; // バッテリパラメータ送信済。充電開始許可
u8 chg_led_override; // アダプタ差したとき、充電するしないに関わらずしばらく点灯させる u8 chg_led_override; // アダプタ差したとき、充電するしないに関わらずしばらく点灯させる
u16 bt_volt16; u16 bt_volt16;
bit ntr_pm_bt_low_old; bit ntr_pm_bt_low_old;
bit BT_CHG_STAT_Change; bit BT_CHG_STAT_Change;
bit BT_IN_CHG_delayed_n;
u8 pmic_version; u8 pmic_version;
u8 mgic_version[2]; u8 mgic_version[2];
@ -128,7 +128,7 @@ void tsk_batt( )
} }
// WM0ではCHG_ENABLEピンは /WL_RST に配線されており、充電制御しない // 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で充電再開 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 ) // 充電*してない* (論理がわかりづらいな!) if( !BT_IN_CHG_n )
{ {
anti_chatter = 0; // さらにチャタリング除去
LED_CHARGE = 0;
}
else
{
if( anti_chatter < 2 ) // 電池無しでアダプタさして、電極をさわさわ if( anti_chatter < 2 ) // 電池無しでアダプタさして、電極をさわさわ
{ // すると充電LEDががさがさするので { // すると充電LEDががさがさするので
anti_chatter++; anti_chatter++;
} }
else else
{ {
LED_CHARGE = 1; 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 ){ // ↑から見ればわかるが、瞬間(数クロック)消える事がある。気がつく人いるかな…? if( chg_led_override != 0 ){ // ↑から見ればわかるが、瞬間(数クロック)消える事がある。気がつく人いるかな…?
chg_led_override -= 1; chg_led_override -= 1;
LED_CHARGE = 1; LED_CHARGE = 1;
@ -256,7 +269,7 @@ void BT_chk()
BT_model_detect(); BT_model_detect();
if( system_status.model != MODEL_JIKKI ) if( system_status.model != MODEL_JIKKI )
{ {
bt_chg_ready = false; bt_authorized = false;
return; return;
// おしまい // おしまい
} }
@ -274,7 +287,7 @@ void BT_chk()
} }
BT_mgic_init(); // 機種判定も行います BT_mgic_init(); // 機種判定も行います
} }
bt_chg_ready = true; bt_authorized = true;
renge_task_immed_add( tski_BT_temp_update ); // 電池温度監視スタート renge_task_immed_add( tski_BT_temp_update ); // 電池温度監視スタート
} }
@ -598,14 +611,14 @@ void BT_get_left(){
{ {
// 実機 // // 実機 //
u8 temp_v[2]; 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 ) if( iic_mcu_read( IIC_SLA_BT_GAUGE, BT_GAUGE_REG_SOC, 2, temp_fuel ) != ERR_SUCCESS )
{ {
// 残量ICがNACK …バッテリはずれた // 残量ICがNACK …バッテリはずれた
vreg_ctr[ VREG_C_STATUS_1 ] |= REG_BIT_GASGAUGE_ERR; vreg_ctr[ VREG_C_STATUS_1 ] |= REG_BIT_GASGAUGE_ERR;
bt_chg_ready = false; bt_authorized = false;
vreg_ctr[ VREG_C_BT_REMAIN ] = 0; vreg_ctr[ VREG_C_BT_REMAIN ] = 0;
system_status.force_off = true; system_status.force_off = true;
} }
@ -638,27 +651,27 @@ void BT_get_left(){
if( bt_volt16 > V_TH_30 ) if( bt_volt16 > V_TH_30 )
{ {
temp_force_fule_left = 100; temp_force_fuel_left = 100;
hysteresis = 0; hysteresis = 0;
} }
else if( bt_volt16 - hysteresis > V_TH_LO ) else if( bt_volt16 - hysteresis > V_TH_LO )
{ {
temp_force_fule_left = 30; temp_force_fuel_left = 30;
hysteresis = 0; hysteresis = 0;
} }
else if( bt_volt16 > V_TH_EMPTY ) else if( bt_volt16 > V_TH_EMPTY )
{ {
temp_force_fule_left = BATT_TH_LO; // ここから赤 temp_force_fuel_left = BATT_TH_LO; // ここから赤
hysteresis = 500; hysteresis = 500;
} }
else if( bt_volt16 > V_TH_ZERO ) else if( bt_volt16 > V_TH_ZERO )
{ {
temp_force_fule_left = BATT_TH_EMPTY; temp_force_fuel_left = BATT_TH_EMPTY;
hysteresis = 500; hysteresis = 500;
} }
else if( bt_volt16 > V_TH_FORCE_OFF ) else if( bt_volt16 > V_TH_FORCE_OFF )
{ {
temp_force_fule_left = 0; temp_force_fuel_left = 0;
hysteresis = 500; hysteresis = 500;
} }
else else
@ -672,20 +685,20 @@ void BT_get_left(){
// 充電許可(=アダプタも刺さってる)のに充電してない // 充電許可(=アダプタも刺さってる)のに充電してない
// かつ、少なくとも素の電池残量が60%以上CCICバグ回避 // かつ、少なくとも素の電池残量が60%以上CCICバグ回避
// = 充電完了。電池がへたってくるとMGICが100%を返さない // = 充電完了。電池がへたってくると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 ] = 100;
vreg_ctr[ VREG_C_BT_REMAIN_FINE ] = 0; vreg_ctr[ VREG_C_BT_REMAIN_FINE ] = 0;
} }
else 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 ] = temp_fuel[0];
vreg_ctr[ VREG_C_BT_REMAIN_FINE ] = temp_fuel[1]; vreg_ctr[ VREG_C_BT_REMAIN_FINE ] = temp_fuel[1];
} }
else 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; 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(); 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 u8 iic_burst_state;
extern bit temp_zone_charge_disable; 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 5) <EFBFBD>V
6) ( rcomp & 0xFF ) 6) ( rcomp & 0xFF )
7) raw_adc_temperature 7) raw_adc_temperature
8) ( !temp_zone_charge_disable | ( bt_chg_ready << 1 ) ) 8) ( !temp_zone_charge_disable | ( bt_authorized << 1 ) )
9) 9)
======================================================== */ ======================================================== */
u8 extinfo_read() u8 extinfo_read()
@ -286,7 +286,7 @@ u8 extinfo_read()
infos[4] = mgic_version[1]; infos[4] = mgic_version[1];
infos[5] = (u8)( _dbg_rcomp & 0xFF ); infos[5] = (u8)( _dbg_rcomp & 0xFF );
infos[6] = raw_adc_temperature; 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; infos[8] = system_status.info_fullcolor;
iic_burst_state++; iic_burst_state++;

View File

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