diff --git a/branches/SDK2.0_1NUP/config.h b/branches/SDK2.0_1NUP/config.h index 4417db6..956ddf0 100644 --- a/branches/SDK2.0_1NUP/config.h +++ b/branches/SDK2.0_1NUP/config.h @@ -15,7 +15,7 @@ #define MCU_VER_MAJOR 0x01 -#define MCU_VER_MINOR 0x1B +#define MCU_VER_MINOR 0x1C #define _firm_format_v3_ diff --git a/branches/SDK2.0_1NUP/hoge.bin b/branches/SDK2.0_1NUP/hoge.bin index 94163ff..efa2ea8 100644 Binary files a/branches/SDK2.0_1NUP/hoge.bin and b/branches/SDK2.0_1NUP/hoge.bin differ diff --git a/branches/SDK2.0_1NUP/jhl_defs.h b/branches/SDK2.0_1NUP/jhl_defs.h index ca5b913..e6cd773 100644 --- a/branches/SDK2.0_1NUP/jhl_defs.h +++ b/branches/SDK2.0_1NUP/jhl_defs.h @@ -97,8 +97,6 @@ unsigned char MIN; unsigned char SEC; - - # endif #endif diff --git a/branches/SDK2.0_1NUP/led.c b/branches/SDK2.0_1NUP/led.c index ec2f820..e1414e9 100644 --- a/branches/SDK2.0_1NUP/led.c +++ b/branches/SDK2.0_1NUP/led.c @@ -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 ); diff --git a/branches/SDK2.0_1NUP/pedo_alg_thre_det2.c b/branches/SDK2.0_1NUP/pedo_alg_thre_det2.c index 7aaa887..a3be680 100644 --- a/branches/SDK2.0_1NUP/pedo_alg_thre_det2.c +++ b/branches/SDK2.0_1NUP/pedo_alg_thre_det2.c @@ -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; } } } @@ -494,8 +500,10 @@ static unsigned long my_sqrt(unsigned long x) ======================================================== */ static u16 calc_hours_spend( u8 year ) { - // 同じ年の内 - if( cal_log_latest.year_bcd == year ) + u8 cal_log_latest_year = bcdtob( cal_log_latest.year_bcd ); + + // 同じ年の内 + if( cal_log_latest_year == year ) { if( now_longhour > last_hour_fny ) { @@ -506,12 +514,12 @@ static u16 calc_hours_spend( u8 year ) return( 0 ); // 同じ時間帯(と、巻き戻り。 どうなっても知らない) } } - else if( cal_log_latest.year_bcd == ( year -1 ) ) + else if( cal_log_latest_year == ( year -1 ) ) { // 年をまたいでいるとき return( ( ( 365 + ( is_firstyear(year) ? 1: 0 )) * 24 ) - last_hour_fny + now_longhour ); } - else if( cal_log_latest.year_bcd < year ) + else if( cal_log_latest_year < year ) { // 数年放置 return( PEDOMETER_LOG_SIZE +1 ); diff --git a/branches/SDK2.0_1NUP/pm.c b/branches/SDK2.0_1NUP/pm.c index b4e96ea..5a6461d 100644 --- a/branches/SDK2.0_1NUP/pm.c +++ b/branches/SDK2.0_1NUP/pm.c @@ -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; } } diff --git a/branches/SDK2.0_1NUP/pm.h b/branches/SDK2.0_1NUP/pm.h index fd751e6..7cf1575 100644 --- a/branches/SDK2.0_1NUP/pm.h +++ b/branches/SDK2.0_1NUP/pm.h @@ -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; } //  これを呼ぶ前に、現在温度を教えておく必要があります。 diff --git a/branches/SDK2.0_1NUP/task_misc.c b/branches/SDK2.0_1NUP/task_misc.c index 6f79c04..3c27c04 100644 --- a/branches/SDK2.0_1NUP/task_misc.c +++ b/branches/SDK2.0_1NUP/task_misc.c @@ -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) 〃 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++; diff --git a/branches/SDK2.0_1NUP/task_sys.c b/branches/SDK2.0_1NUP/task_sys.c index 8729cea..1b3ce19 100644 --- a/branches/SDK2.0_1NUP/task_sys.c +++ b/branches/SDK2.0_1NUP/task_sys.c @@ -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;