diff --git a/trunk/accero.c b/trunk/accero.c index e0d3d23..ac2910a 100644 --- a/trunk/accero.c +++ b/trunk/accero.c @@ -54,9 +54,8 @@ u16* hyst_pedometer; // ======================================================== task_interval tsk_soft_int( ); -static void pedo_increment(); - - +static void hosu_increment(); +u16 get_long_hour(); @@ -122,7 +121,7 @@ task_status_immed tsk_cbk_accero( ) { // 一歩増えました DBG_LED_WIFI_2_on; - pedo_increment(); + hosu_increment(); } } interval_hh = 0; @@ -155,13 +154,14 @@ task_status_immed tsk_cbk_accero( )   累積をインクリメント  履歴を更新 ========================================================*/ -static void pedo_increment() +#define MAGIC_PEDO_NODATA 65535 +#define MAGIC_PEDO_MAX 65534 + +u8 p_record; + +static void hosu_increment() { - static u8 last_hour; // 履歴の最新は何時? - static u8 last_day; - static u8 last_month; - static u8 last_year; - static u8 p_record; + static u16 last_hour; // 履歴の最新は何時? // 累積の更新 // // いろいろ失敗した... @@ -178,30 +178,72 @@ static void pedo_increment() } // 毎時履歴の更新 - DI(); - RWAIT = 1; - while( !RWST ){;} - - if(( last_hour != HOUR ) || ( last_day != DAY ) || ( last_month != MONTH ) || ( last_year != YEAR )) { - last_hour = HOUR; - last_day = DAY; - last_month = MONTH; - last_year = YEAR; - p_record += 1; - *(hyst_pedometer + p_record) = 0; - } - RWAIT = 0; - EI(); + u16 temp_hour = get_long_hour(); + if( temp_hour > last_hour ) + { + for( ; last_hour != temp_hour; last_hour += 1 ) + { + p_record += 1; + *(hyst_pedometer + p_record) = MAGIC_PEDO_NODATA; + } + *(hyst_pedometer + p_record) = 0; + } - *(hyst_pedometer + p_record) += 1; - if( *( hyst_pedometer + p_record ) == 65535 ) // 65535はマジックナンバーで - { - *hyst_pedometer = 65534; + *(hyst_pedometer + p_record) += 1; + if( *( hyst_pedometer + p_record ) == MAGIC_PEDO_MAX ) + { + *hyst_pedometer = 65534; + } } } +bit hosu_read_inited; +bit record_read_msb_lsb; + +/* ======================================================== + 歩数計ヒストリ読み出しの後処理(初期化) + 読み出しポインタのクリア +======================================================== */ +void hosu_read_end( ) +{ + record_read_msb_lsb = 0; + hosu_read_inited = 0; +} + +/* ======================================================== + 歩数計のヒストリを返す。 + 1回呼ぶ度に、ヒストリの下位、上位、一時間遡って下位上位... +======================================================== */ +u8 hosu_read( ) +{ + u16 temp; + u8 rv; + + static u8 p_record_buffer; + + if( hosu_read_inited == 0 ) + { + p_record_buffer = p_record; + hosu_read_inited = 1; + } + + temp = *( hyst_pedometer + p_record_buffer ); + if( record_read_msb_lsb == 0 ) + { + rv = (u8)( ( temp & 0xFF00 ) >> 8 ); + } + else + { + rv = (u8)( temp & 0x00FF ); + p_record_buffer += 1; + } + record_read_msb_lsb += 1; + + return( rv ); +} + /*========================================================= @@ -327,3 +369,51 @@ __interrupt void intp23_ACC_ready( ) } } } + + + +/* ======================================================== + 2000年1月1日0時からの現在時刻を返す + + 引数 無し + 返値 u16 long_hour +======================================================== */ +static const u16 DAYS_FROM_HNY[] = { + 0, + 0, 31, 31+28, 59+31, 90+30, + 120+31, 151+30, 181+31, 212+31, 243+30, + 273+31, 304+30 }; + + +u16 get_long_hour() +{ + u16 long_hour; + + DI(); + + RWAIT = 1; + while( !RWST ){;} + + // まず日数の部分 + long_hour = YEAR * 365; + long_hour += ( YEAR / 4 ) +1; // 閏日の分。修正ユリウスでは2000年も閏年 + long_hour += DAYS_FROM_HNY[ MONTH ]; + if(( 2 <= MONTH ) && ( DAY < 29 )) + { + // 2/29より前 + long_hour -= 1; + } + long_hour += DAY; + + long_hour *= 24; + long_hour += HOUR; + + RWAIT = 0; + + EI(); + + return( long_hour ); +} + + + diff --git a/trunk/accero.h b/trunk/accero.h index ae5eb77..7c53b9b 100644 --- a/trunk/accero.h +++ b/trunk/accero.h @@ -5,13 +5,18 @@ #include "jhl_defs.h" + /////////////////////////////////////////////////////////// -extern u16* hyst_pedometer; +extern u16* hyst_pedometer; + /////////////////////////////////////////////////////////// task_status_immed tsk_cbk_accero( ); task_status_immed acc_hosu_set( ); +void hosu_read_end( ); +u8 hosu_read( ); + #endif diff --git a/trunk/i2c_ctr.c b/trunk/i2c_ctr.c index c9c0015..9b14cc3 100644 --- a/trunk/i2c_ctr.c +++ b/trunk/i2c_ctr.c @@ -4,6 +4,8 @@ '09 Apr ======================================================== */ #include "incs.h" +#include "accero.h" + #ifdef _MCU_BSR_ // #ifdef _MODEL_TS0_ || _MODEL_WM0_ @@ -83,8 +85,6 @@ __interrupt void int_iic_ctr( ) SPIE = 0; LREL = 1; - rtc_unlock( ); - // レジスタリードで、割り込みピンをネゲート // まだ読まれてない割り込みがあれば、再度アサート if( irq_readed ) @@ -100,6 +100,9 @@ __interrupt void int_iic_ctr( ) IRQ0_ast; } } + + // 歩数計読み出し終了 + hosu_read_end( ); return; } @@ -108,7 +111,6 @@ __interrupt void int_iic_ctr( ) if( ( state == IIC_TX ) || ( state == IIC_RX ) ) { state = IIC_IDLE; - rtc_unlock( ); } } @@ -131,7 +133,7 @@ __interrupt void int_iic_ctr( ) break; case ( IIC_TX_OR_RX ): -// if( TRC ){ // 送信方向フラグ +// if( TRC ){ // 送信方向フラグ で区別するのは、割り込み遅延時に不具合が起こりえる if( STD ) { // スタートコンディション検出フラグ // リードされる @@ -168,7 +170,11 @@ __interrupt void int_iic_ctr( ) vreg_ctr_write( reg_adrs, trx_buf ); WREL = 1; } - reg_adrs += 1; + if( reg_adrs != VREG_C_ACC_HOSU_HIST ) + { + reg_adrs += 1; + } + if( state == IIC_TX ) { trx_buf = vreg_ctr_read( reg_adrs ); diff --git a/trunk/main.c b/trunk/main.c index 7f40420..755224f 100644 --- a/trunk/main.c +++ b/trunk/main.c @@ -59,14 +59,14 @@ void main_loop( void ) vreg_ctr_init( ); vreg_twl_init( ); - read_dipsw( ); - // 特定スイッチで何かするか? + read_dipsw( ); // 特定スイッチで何かするか? + + hyst_pedometer = (u16*)pool; + renge_init( ); renge_task_interval_run_force = 1; - hyst_pedometer = (u16*)pool; - EI( ); RTCIMK = 0; /* 割り込み(アラーム&インターバル)許可 */ diff --git a/trunk/self_flash.c b/trunk/self_flash.c index fc200df..ab3fba9 100644 --- a/trunk/self_flash.c +++ b/trunk/self_flash.c @@ -190,7 +190,7 @@ err firm_update( ) if( comp == 0 ) { FSL_InvertBootFlag( ); - FSL_SwapBootCluster( ); // リセットせずに頭から + FSL_SwapBootCluster( ); // リセットせずに頭から。FSL_Closeは不要 // FSL_ForceReset(); // リセット // FSL_SwapActiveBootCluster(); // ←スワップされてしまうので、続けられず暴走! // 戻ってこない // diff --git a/trunk/vreg_ctr.c b/trunk/vreg_ctr.c index e9344b3..29faa17 100644 --- a/trunk/vreg_ctr.c +++ b/trunk/vreg_ctr.c @@ -267,7 +267,13 @@ u8 vreg_ctr_read( u8 adrs ) { return( vreg_ctr[ VREG_C_MCU_STATUS ] | ( ( vreg_twl[ REG_TWL_INT_ADRS_MODE ] & 0x03 ) << 6 ) ); } -#if 0 + + if( adrs == VREG_C_ACC_HOSU_HIST ) + { + return( hosu_read() ); + } + +#if 1 if( adrs >= VREG_C_ENDMARK_ ) { return( 0xEE );