図1を参照して、この発明の実施例の歩数計測システム1000は、歩数計100および歩数管理装置10を含む。歩数計100は、使用者の歩行に応じて歩数を計測するためのものである。歩数管理装置10は、歩数計100によって計測された歩数データの管理をするためのものである。歩数管理装置10と歩数計100とは、たとえばIrDAのような近距離無線通信により互いにデータを送受信する。
なお、図1では、1つの歩数計100のみが示されるが、歩数計測システム1000は複数の歩数計100を含んでよい。つまり、歩数管理装置10では、複数の歩数計100のそれぞれの歩数データが管理されるようにしてよい。
歩数管理装置10は、一例として携帯型のゲーム装置の形態で実現される。ただし、歩数管理装置10の形態は任意であり、たとえば、据置型のゲーム装置、パーソナルコンピュータ、携帯情報端末、携帯電話機であってもよい。
ゲーム装置10は、第1の液晶表示器(LCD)12および第2のLCD14を含む。LCD12およびLCD14は、所定の配置位置となるようにハウジング16に収納される。この実施例では、ハウジング16は、上側ハウジング16aと下側ハウジング16bとによって構成され、LCD12は上側ハウジング16aに収納され、LCD14は下側ハウジング16bに収納される。したがって、LCD12とLCD14とは縦(上下)に並ぶように近接して配置される。
なお、この実施例では、表示器としてLCDを用いるようにしてあるが、LCDに代えて、EL(Electronic Luminescence)ディスプレイやプラズマディスプレイを用いるようにしてもよい。
図1からも分かるように、上側ハウジング16aは、LCD12の平面形状よりも少し大きな平面形状を有し、一方主面からLCD12の表示面を露出するように開口部が形成される。一方、下側ハウジング16bの平面形状およびサイズも上側ハウジング16aと同等に選ばれ、横方向の中央部にLCD14の表示面を露出するように開口部が形成される。下側ハウジング16bの右側面には電源スイッチ18が設けられる。
また、上側ハウジング16aには、LCD12を挟んで左右に、スピーカ36aおよび36b(図2参照)のための音抜き孔20aおよび20bが形成される。
上側ハウジング16aと下側ハウジング16bとは、上側ハウジング16aの下辺(下端)と下側ハウジング16bの上辺(上端)の一部とが回動可能に連結されている。したがって、たとえば、ゲームをプレイしない場合には、LCD12の表示面とLCD14の表示面とが対面するように、上側ハウジング16aを回動させて折りたたんでおけば、LCD12の表示面およびLCD14の表示面に傷がつくなどの破損を防止することができる。ただし、上側ハウジング16aと下側ハウジング16bとは、回動可能に連結せずに、それらを一体的(固定的)に設けたハウジング16を形成するようにしてもよい。
そして、上側ハウジング16aと下側ハウジング16bとの連結部の中央には、マイク(図示せず)のためのマイク孔20cが形成される。マイクから取り込んだ音、音声または息などによる音声信号に基づいてゲーム処理を行うことが可能である。
また、下側ハウジング16bには、操作スイッチ22(22a,22b,22c,22d,22e,22f,22g,22Lおよび22R)が設けられる。
操作スイッチ22は、方向指示スイッチ(十字スイッチ)22a,スタートスイッチ22b、セレクトスイッチ22c、動作スイッチ(Aボタン)22d、動作スイッチ(Bボタン)22e、動作スイッチ(Xボタン)22f、動作スイッチ(Yボタン)22g、動作スイッチ(Lボタン)22Lおよび動作スイッチ(Rボタン)22Rを含む。スイッチ22aは、下側ハウジング16bの一方主面であり、LCD14の左側に配置される。その他のスイッチ22b−22gは、下側ハウジング16bの一方主面であり、LCD14の右側に配置される。さらに、動作スイッチ22Lおよび22Rは、それぞれ下側ハウジング16bの上端面の左右角部に配置される。なお、動作スイッチ22Lおよび22Rは下側ハウジング16bの背面に設けられており、図1のような正面視では連結部の背後に隠れているので破線で示されている。
方向指示スイッチ22aは、ディジタルジョイスティックとして機能し、4つの押圧部の1つを操作することによって、ユーザないしプレイヤによって操作可能なプレイヤオブジェクト(またはプレイヤキャラクタ)の進行方向(移動方向)を指示したり、カーソルの進行方向を指示したりする等のために用いられる。また、各押圧部には、特定の役割を割り当てることができ、4つの押圧部の1つを操作することによって、割り当てられた役割を指示(指定)することができる。
スタートスイッチ22bは、プッシュボタンで構成され、ゲームを開始(再開)したり、一時停止(Pause)したりする等に用いられる。また、セレクトスイッチ22cは、プッシュボタンで構成され、ゲームモードの選択等に用いられる。
動作スイッチ22dすなわちAボタンは、プッシュボタンで構成され、方向指示以外の動作、すなわち、プレイヤオブジェクトに打つ(パンチ)、投げる、つかむ(取得)、乗る、ジャンプするなどの任意のアクションをさせることができる。たとえば、アクションゲームにおいては、ジャンプ、パンチ、武器を動かす等を指示することができる。また、ロールプレイングゲーム(RPG)やシミュレーションRPGにおいては、アイテムの取得、武器やコマンドの選択および決定等を指示することができる。動作スイッチ22eすなわちBボタンは、プッシュボタンで構成され、セレクトスイッチ22cで選択したゲームモードの変更やAボタン22dで決定したアクションの取り消し等のために用いられる。
動作スイッチ22fすなわちXボタン、および動作スイッチ22gすなわちYボタンは、プッシュボタンで構成され、Aボタン22dとBボタン22eだけでは、ゲーム進行ができないときに、補助的な操作に用いられる。ただし、Xボタン22fおよびYボタン22gは、Aボタン22dおよびBボタン22eと同様の操作に用いることも可能である。もちろん、ゲームプレイにおいてXボタン22fとYボタン22gとを必ずしも使用しなくてよい。
動作スイッチ22L(左押しボタン)および動作スイッチ22R(右押しボタン)は、プッシュボタンで構成され、左押しボタン(Lボタン)22Lおよび右押しボタン(Rボタン)22Rは、Aボタン22dおよびBボタン22eと同様の操作に用いることができ、また、Aボタン22dおよびBボタン22eの補助的な操作に用いることができる。さらに、Lボタン22LおよびRボタン22Rは、方向スイッチ22a,Aボタン22d,Bボタン22e,Xボタン22f,Yボタン22gに割り当てられた役割を、他の役割に変更することができる。
また、LCD14の上面には、タッチパネル24が装着される。タッチパネル24としては、たとえば、抵抗膜方式、光学式(赤外線方式)および静電容量結合式のいずれかの種類のものを用いることができる。タッチパネル24はLCD14の画面内の任意の位置(座標)をユーザが指示するためのポインティングデバイスである。タッチパネル24は、その上面をスティック26ないしはペン(スタイラスペン)或いは指(以下、これらを「スティック26等」という場合がある。)で、押圧したり、撫でたり、触れたりすることにより操作(タッチ入力)すると、スティック26等の操作位置の座標を検出して、当該検出座標に対応する座標データを出力する。
なお、この実施例では、LCD14(LCD12も同じ、または略同じ。)の表示面の解像度は256dot×192dotである。タッチパネル24の検出精度も表示画面に対応して256dot×192dotとしてあるが、タッチパネル24の検出精度は表示画面の解像度よりも低くてもよく、高くてもよい。
LCD12およびLCD14には異なるゲーム画面を表示することができる。たとえば、レースゲームでは一方のLCDに運転席からの視点による画面を表示し、他方のLCDにレース(コース)全体の画面を表示することができる。また、RPGでは、一方のLCDにマップやプレイヤオブジェクト等のキャラクタを表示し、他方のLCDにプレイヤオブジェクトが所有するアイテムを表示することができる。さらに、一方のLCDにプレイヤオブジェクトやノンプレイヤオブジェクトなどを含むゲーム画面を表示し、他方のLCDに当該プレイヤオブジェクトやノンプレイヤオブジェクトに関する情報を含む他のゲーム画面または当該プレイヤオブジェクトを操作するための操作画面を表示することができる。さらには、2つのLCD12およびLCD14を合わせて1つの画面として用いることにより、プレイヤオブジェクトが倒さなければならない巨大な怪物(敵オブジェクト)を表示することもできる。
したがって、プレイヤはスティック26等でタッチパネル24を操作することにより、LCD14の画面に表示されるプレイヤオブジェクト、敵オブジェクト、アイテムオブジェクト、操作オブジェクトなどの画像を指示(操作)したり、コマンドを選択(入力)したりすることができる。また、仮想ゲーム空間(3次元ゲーム空間)に設けられる仮想カメラ(視点)の方向(視線の向き)を変化させたり、ゲーム画面(マップ)のスクロール(徐々に移動表示)方向を指示したりすることもできる。
なお、ゲームの種類によっては、タッチパネル24を用いることにより、その他の入力指示も可能である。たとえば、LCD14上のタッチパネル24において文字,数字,記号等を手書き入力することができる。
このように、ゲーム装置10は、2画面分の表示部となるLCD12およびLCD14を有し、いずれか一方(この実施例では、LCD14)の上面にタッチパネル24が設けられるので、2画面(12,14)と2系統の操作部(22,24)とを有する構成になっている。
なお、この実施例では、第1のLCD12と第2のLCD14とを縦方向に並べて配置するようにしているが、2つのLCDの配置は適宜に変更され得る。他の実施例では、第1のLCD12と第2のLCD14とを横方向に並べて配置するようにしてもよい。
また、この実施例では、2つのLCDを設けるようにしているが、表示手段としてのLCDの数は適宜変更され得る。他の実施例では、縦長形状の1つのLCDを設けて、表示領域を上下に分けて、2つのゲーム画面をそれぞれの表示領域に表示するようにしてもよいし、あるいは、横長形状の1つのLCDを設けて、表示領域を左右に分割し、2つゲーム画面をそれぞれの表示領域に表示するようにしてもよい。
また、スティック26は、たとえば下側ハウジング16bに設けられる収納部(図示せず)に収納することができ、必要に応じて取り出される。ただし、スティック26を設けない場合には、その収納部も設ける必要はない。
さらに、ゲーム装置10はメモリカード(またはカートリッジ)28を含み、このメモリカード28は着脱自在であり、下側ハウジング16bの上端面に設けられる挿入部30(図1では点線で示す)に挿入される。図1では省略するが、挿入部30の奥部には、メモリカード28の挿入方向先端部に設けられるコネクタ60と接合するためのコネクタ32(図2参照)が設けられており、したがって、メモリカード28が挿入部30に挿入されると、コネクタ同士が接合され、ゲーム装置10のCPUコア34(図2参照)がメモリカード28にアクセス可能となる。
なお、図1では省略するが、たとえば、下側ハウジング16bにおいて、その裏面には電池収容ボックスが設けられ、下端面(底面)には、音量スイッチおよびイヤフォンジャックなどが設けられ、上端面(天面)には、外部拡張コネクタなどが設けられる。
図2はゲーム装置10の電気的な構成を示すブロック図である。この図2を参照して、ゲーム装置10は電子回路基板38を含み、この電子回路基板38には上述のCPUコア34等の回路コンポーネントが実装される。CPUコア34は、バス40を介して前述のコネクタ32に接続されるととともに、RAM42、第1のグラフィック処理ユニット(GPU)44、第2のGPU46、入出カインターフェース回路(以下、「I/F回路」という。)48、LCDコントローラ50および無線通信部58に接続される。
コネクタ32には、上述したように、メモリカード28が着脱自在に接続される。メモリカード28は、コネクタ32と接合されるコネクタ60を含み、コネクタ60には、バス62を介してROM64およびマイコン66が接続される。マイコン66には、バックアップ用メモリ68およびIr通信用回路70が接続される。
マイコン66は、CPUコア34の制御下で、バックアップ用メモリ68の書込みおよび読出し、ならびにIr通信用回路70を用いた赤外線通信(Ir通信)を制御する。つまり、CPUコア34は、マイコン66を介してバックアップ用メモリ68にデータを書き込み、バックアップ用メモリ68からデータを読み出す。また、CPUコア34は、マイコン66およびIr通信用回路70を介して、歩数計100とデータを送受信する。なお、図1では見えないが、Ir通信用回路70の通信ポートが、メモリカード28が挿入部30に装着されたときに露出する部分(たとえば上端面)に設けられている。
ROM64は、ゲーム装置10で実行すべきゲームのためのゲームプログラム、画像データ(文字やオブジェクトの画像、背景画像、アイテム画像、アイコン(ボタン)画像、メッセージ画像など)およびゲームに必要な音(音楽)のデータ(音データ)等を予め記憶する。バックアップ用メモリ68は、そのゲームの途中データやゲームの結果データなどを記憶(セーブ)するためのものである。バックアップ用メモリ68としては、フラッシュメモリのような不揮発性メモリ、または電池から電源が供給されるSRAMなどが用いられ得る。
RAM42は、バッファメモリないしはワーキングメモリとして使用される。つまり、CPUコア34は、メモリカード28のROM64に記憶されたゲームプログラム、画像データおよび音データ等をRAM42にロードし、ロードしたゲームプログラムに従って処理を実行する。また、CPUコア34は、ゲームの進行に応じて一時的に生成するデータ(ゲームデータやフラグデータ等)をRAM42に記憶しつつゲーム処理を実行する。
GPU44およびGPU46は、それぞれ、描画手段の一部を形成し、たとえばシングルチップASICで構成され、CPUコア34からのグラフィックスコマンド(作画命令)を受け、そのグラフィックスコマンドに従って画像データを生成する。ただし、CPUコア34は、グラフィックスコマンドに加えて、画像データの生成に必要な画像生成プログラム(ゲームプログラムに含まれる。)をGPU44およびGPU46のそれぞれに与える。
また、GPU44には、第1のビデオRAM(以下、「VRAM」という。)52が接続され、GPU46には、第2のVRAM54が接続される。GPU44およびGPU46が作画コマンドを実行するにあたって必要なデータ(画像データ:ポリゴンやテクスチャ等のデータ)は、GPU44およびGPU46が、それぞれ、第1のVRAM52および第2のVRAM54にアクセスして取得する。
なお、CPUコア34は、描画に必要な画像データをGPU44およびGPU46を介して第1のVRAM52および第2のVRAM54に書き込む。GPU44はVRAM52にアクセスして描画のための画像データを作成し、その画像データをVRAM52の描画バッファに記憶する。GPU46はVRAM54にアクセスして描画のための画像データを作成し、その画像データをVRAM54の描画バッファに記憶する。描画バッファとしてはフレームバッファまたはラインバッファ等が採用されてよい。
VRAM52およびVRAM54は、LCDコントローラ50に接続される。LCDコントローラ50はレジスタ56を含み、レジスタ56はたとえば1ビットで構成され、CPUコア34の指示によって「0」または「1」の値(データ値)を記憶する。LCDコントローラ50は、レジスタ56のデータ値が「0」である場合には、GPU44によって作成された画像データをLCD12に出力し、GPU46によって作成された画像データをLCD14に出力する。また、LCDコントローラ50は、レジスタ56のデータ値が「1」である場合には、GPU44によって作成された画像データをLCD14に出力し、GPU46によって作成された画像データをLCD12に出力する。
なお、LCDコントローラ50は、VRAM52およびVRAM54から直接画像データを読み出したり、GPU44およびGPU46を介してVRAM52およびVRAM54から画像データを読み出したりする。
また、VRAM52およびVRAM54はRAM42に設けられてもよいし、あるいはその描画バッファおよびZバッファがRAM42に設けられてもよい。
I/F回路48には、操作スイッチ22,タッチパネル24およびスピーカ36a,36bが接続される。ここで、操作スイッチ22は、上述したスイッチ22a,22b,22c,22d,22e,22f,22g,22Lおよび22Rであり、操作スイッチ22が操作されると、対応する操作信号(操作データ)がI/F回路48を介してCPUコア34に入力される。また、タッチパネル24からの座標データがI/F回路48を介してCPUコア34に入力される。さらに、CPUコア34は、ゲーム音楽(BGM)、効果音またはゲームキャラクタの音声(擬制音)などのゲームに必要な音データをRAM42から読み出し、I/F回路48を介してスピーカ36a,36bから当該音を出力する。
無線通信部58は他のゲーム装置10や通信機器との間で無線によってデータを送受信するための通信手段である。なお、ゲーム装置10が送受信する微弱電波は、電波法による規制のかからない強度に設定されている。CPUコア34がゲームデータやコマンドなどのデータを無線通信部58に与えると、無線通信部58は、相手方へのデータを無線信号に変調してアンテナから送信する。また、無線通信部58は、相手方からの無線信号を同じアンテナで受信してデータに復調し、当該データをCPUコア34に与える。この無線通信部58を介して、ゲーム装置10は、他のゲーム装置10との間でデータを通信して通信ゲームを実行することが可能である。また、ゲーム装置10は、この無線通信部58を介してネットワークに接続することができ、ネットワーク上のサーバからプログラムやデータをダウンロードしたり、サーバにデータをアップロードしたり、ネットワークを介して他のゲーム装置10と通信したりすることが可能である。
図3は歩数計100の一例を示す斜視図である。歩数計100は、略直方体形状のハウジング102を有し、ハウジング102は、ユーザのポケット等に簡単に収容可能なように小型化されており、一例として、縦横の長さは3〜4cm程度、厚さは1cm程度である。ハウジング102の一方主面(上面)には押しボタン104が設けられる。メモリカード28のIr通信用回路70が通信待機状態にある場合に、ユーザによってこの押しボタン104が押されると、歩数計100はメモリカード28すなわちゲーム装置10と通信を開始する。また、押しボタン104の端部にはLED106が設けられる。LED106は、たとえば2色LEDであり、色や点滅パターンによって、歩数計100の動作状態を表現する。また、ハウジング102の側面(先端面)には、赤外線通信ポート108が設けられる。なお、歩数計100の動作電源としては、たとえばコイン型リチウム電池(CR2032)が使用され、ハウジング102の他方主面(下面)には電池蓋が取り外し可能に設けられている。
図4は、歩数計100の電気的な構成の一例を示すブロック図である。歩数計100はマイコン110を含み、マイコン110には、増幅回路112を介してショックセンサ114が接続される。また、マイコン110には、押しボタン104、LED106、EEPROM116およびIr通信用回路118が接続される。
マイコン110は、歩数計アルゴリズムを内蔵した低消費電力マイコンであり、ショックセンサ114からの出力データの検出、EEPROM116の書込みおよび読出し、LED106の点滅、Ir通信用回路118を用いた赤外線通信など、歩数計100の全体動作を制御する。
ショックセンサ114は、ユーザの歩行に応じた動きを検出するためのセンサであり、たとえばHDDの衝撃検知に用いられるショックセンサ(加速度センサ)が適用され得る。ショックセンサ114は、この実施例では2軸に配置され、これによって、歩数計100をポケットや鞄等に入れた状態で歩数を計測または検出することが可能になっている。ショックセンサ114の出力は増幅回路112で増幅されてマイコン110に入力される。マイコン110にはADコンバータが内蔵されているので、マイコン110はショックセンサ114の出力をサンプリングして出力データ(加速度データ)を取得する。マイコン110は、出力データと歩数計アルゴリズムに基づいて歩数をカウントし、単位時間ごとに歩数の累計値(カウント数)を順次EEPROM116に記憶する。つまり、EEPROM116には歩数データとして単位時間ごとの歩数値の履歴が保存される。
ただし、EEPROM116の歩数データの保存領域には限りがあり、つまり、歩数データには保存期間がある。たとえば、1分単位ごとに歩数値を記憶する場合には、EEPROM116には約7日分の歩数履歴を保存することができる。保存領域が一杯になった場合には、最も古く記憶された歩数値が上書きされる。また、この実施例では、歩数値の記録の単位時間は1分に設定されるが、たとえば1時間、1日などに適宜変更可能である。
マイコン110は、動作状態に応じてLED106の色や点滅パターンを制御する。たとえば、当日の歩数が予め設定しておいた歩数を超えたときには、LED106の色が赤から黄緑に変更される。また、押しボタン104が押されたときには、マイコン110は、Ir通信用回路118を用いてゲーム装置10(メモリカード28)との通信を開始するとともに、当該通信開始確認と動作確認のためにLED106を点滅させる。
押しボタン104が押されることによって通信を開始すると、マイコン110は、歩数計100のID(識別情報)を内蔵ROMまたはEEPROM116から読み出し、当該IDを含むデータをIr通信用回路118を介してゲーム装置10に送信する。歩数計100とゲーム装置10は、必要なデータを送受信する。たとえば、ゲーム装置10から歩数データの要求を受信すると、マイコン110は、EEPROM116から必要な歩数データを読み出してゲーム装置10に送信する。なお、ゲーム装置10は、前回歩数計100から歩数データを受信したときの時刻情報を記憶しており、必要な期間または個数の歩数値を要求することができ、その場合、マイコン110は、現在の歩数値から過去に遡って、必要な期間または個数の歩数値を読み出して、ゲーム装置10に送信することができる。
図5にはゲーム装置10のメモリマップの一例が示される。メモリマップはプログラム記憶領域200およびデータ記憶領域202を含む。なお、図5はメモリマップの一部を示しており、プログラム記憶領域200およびデータ記憶領域202には、画像生成表示プログラム、操作データ取得プログラム、歩数データ保存プログラム、歩数データを所定の処理に使用するプログラムおよび画像データなど、処理の実行に必要な他のプログラムおよびデータも記憶されている。
記憶領域204には、電池交換検出プログラムが記憶されている。このプログラムは、歩数計100において電池交換があったか否かを検出するためのものである。なお、電池交換だけでなく、歩数計100に強い静電気のような衝撃が加わって誤って歩数計100がリセットされたことも検出する。つまり、このプログラムにより、歩数計100で初期化があったか否かを検出する。初期化があったか否かは、歩数計100から取得した所定のデータに基づいて判定される。歩数計100でリセットがかかり、つまり、初期化処理が実行されたときに、所定のデータとして当該初期化があったことを示す情報が記憶されてよく、その場合、当該情報によって初期化が判定される。また、歩数計100に記憶されている歩数値の数に基づいて、判定を行うようにしてもよい。その場合、ゲーム装置10に歩数計100から歩数データを取得したときの時刻情報を示す前回取得時刻を記憶しておく。そして、歩数計100に前回取得時刻から現在時刻までの期間に記憶されている歩数値の数が当該期間に記憶されるべき数よりも小さければ、初期化があったことが分かる。
記憶領域206には、歩数データ受信プログラムが記憶されている。このプログラムは、歩数計100から必要な歩数値を取得するためのものである。これにより、前回取得時刻から現在時刻までの期間の歩数データが取得される。また、初期化があった場合、初期化前に計測された歩数データが取得される。
記憶領域208には時刻設定プログラムが記憶されている。このプログラムは、単位時間ごとの歩数値のそれぞれに、記録時刻を設定するためのものである。初期化前に記憶された各歩数値については、各記録時刻が歩数計100の時刻に基づいて設定される。初期化後に記憶された各歩数値については、各記録時刻がゲーム装置10の時刻に基づいて設定される。
記憶領域210には、ゲーム装置10の現在の時刻情報を示す現在時刻t1が記憶される。時刻情報は年月日時分秒を含む。ゲーム装置10の電子回路基板38には、図示しない時計回路が設けられており、CPUコア34は、当該時計回路から時刻を取得して現在時刻t1をカウントする。
記憶領域212には前回取得時刻t3が記憶される。前回取得時刻t3は、歩数計100から前回歩数データを取得したときの時刻情報、つまり、最後に歩数データの取得処理を行って歩数データを受信した際の時刻情報を示す。ゲーム装置10が複数の歩数計100から歩数データを取得する場合、各歩数計100のIDに対応付けて、それぞれのt3を記憶する。前回取得時刻t3は、バックアップ用メモリ68に保存される。
記憶領域214には歩数計100から取得した歩数データが記憶される。ゲーム装置10が複数の歩数計100から歩数データを取得する場合、各歩数計100のIDに対応付けて、それぞれの歩数データを記憶する。歩数データはバックアップ用メモリ68に保存される。
図6には歩数計100のメモリマップの一例が示される。メモリマップはプログラム記憶領域300およびデータ記憶領域302を含む。なお、図6はメモリマップの一部を示しており、プログラム記憶領域300およびデータ記憶領域302には、処理の実行に必要な他のプログラムおよびデータも記憶されている。
記憶領域304には、歩数データ記録プログラムが記憶されている。このプログラムは、単位時間ごとの歩数値を検出し記録するためのものである。
記憶領域306には初期化プログラムが記憶されている。この初期化プログラムは、電池交換などに応じてリセットがかかったときに実行される。この初期化処理において、計測中の歩数データが記憶されていると判断されるとき、当該データは過去のデータすなわち初期化前に計測されたデータとして記憶される。
記憶領域308には時刻設定プログラムが記憶されている。このプログラムは、歩数計100の時刻をゲーム装置10の時刻に設定するためのものである。
記憶領域310には歩数データ送信プログラムが記憶されている。このプログラムは、必要な歩数値をゲーム装置10に送信するためのものである。
記憶領域312には歩数計100の現在の時刻情報を示す現在時刻t2が記憶される。時刻情報は年月日時分秒を含む。歩数計100のマイコン110は時計回路を内蔵しており、現在時刻t2をカウントする。初期化時には現在時刻t2は初期値にリセットされる。初期値は、たとえば「2001/01/01 00:00:00」である。また、記憶領域308の時刻設定プログラムによって時刻設定が行われるときには、現在時刻t2は、ゲーム装置10から受信した時刻に設定される。
記憶領域314は歩数ログバッファすなわち歩数データバッファである。この歩数ログバッファはEEPROM116の特定の範囲に設けられており、したがって、電池が切れた場合であってもデータは保存される。このバッファには、歩数ログすなわち単位時間ごとの歩数値が記憶される。歩数データだけでなく、さらに、少なくとも1つの歩数値に対応する(検出)時刻情報、時刻設定済みフラグなどの日時データも記憶される。時刻設定済みフラグは、歩数計100の時刻がゲーム装置10から受信した時刻に基づいて計時されたか否かを示す。
図7−図9を参照して、この実施例の歩数データの記録方式について説明する。歩数計100では、EEPROM116に設けた歩数ログバッファ314に日時と歩数とが混ぜて格納される。つまり、歩数バッファ、日時バッファと分かれていない。たとえば特定の記憶領域を日時バッファとして固定してしまうと、当該記憶領域を単位時間ごとに書き換えることになり、このような記録方法では、EEPROMの書換寿命で問題がある。そこで、この実施例では、歩数データと日時データを移動させながら記録することによって、メモリの書換寿命が低下するのを防止するようにした。
具体的には、歩数ログバッファ314には、現在有効な日付ブロックが作成され、当該現在有効な日付ブロックに、現在計測中の歩数データに関する時刻情報が記憶される。図7は現在有効な日付ブロックを説明するための図解図である。図7において、黒菱形印「◆」400が現在有効な日付ブロックを示す。また、二重丸印「◎」402は、日付ブロックの指す歩数値の記憶領域を示し、星印「*」404は、歩数値1個分の記憶領域を示す。
現在有効な日付ブロック「◆」400は、必ず規定長前に記憶される歩数値の検出時刻を示している。つまり、現在有効な日付ブロック「◆」400に記憶される時刻情報は、規定長前の歩数値すなわち二重丸印「◎」402の記憶領域に記憶された歩数値の検出時刻を示す。最初、歩数ログバッファ314の先頭を基準にして規定長後のアドレスに現在有効な日付ブロック「◆」400が作成され、この現在有効な日付ブロック「◆」400に歩数計100の時刻が記憶される。また、当該歩数計100の時刻がゲーム装置10の時刻に基づいて設定された時刻であるか否かを示す時刻設定済みフラグも記憶される。所定の単位時間ごとに検出される歩数値は、歩数ログバッファ314の先頭の記憶領域「◎」402から順次記憶される。このように、歩数ログバッファ314では、単位時間毎に順次検出されて記憶される歩数値に関連付けて時刻情報が記憶されている。
時間経過に伴って歩数値が記憶領域「*」404に順次記憶されていくことにより、書込み位置が現在有効な日付ブロック「◆」400に迫ると、現在有効な日付ブロック「◆」400を移動する。図8は現在有効な日付ブロックの移動を説明するための図解図である。図8において、丸印「○」406は、歩数値が既に記憶された記憶領域を示す。また、上向き矢印408は、書込みポインタの示す書込み位置、つまり、次に歩数値が書込まれる記憶領域または記憶位置を示す。
図8の上部に示すように、この実施例では、書込み位置408が現在有効な日付ブロック「◆」400を示すとき、この現在有効な日付ブロックが移動される。具体的には、図8の下部に示すように、現在有効な日付ブロックは規定長先に移動され、当該移動後の現在有効な日付ブロック「◆」400に、歩数計100の時刻および時刻設定済みフラグが記憶される。したがって、書込みポインタの指す記憶領域(書込み位置408)、すなわち、そのときまで現在有効な日付ブロックであった記憶領域(図8上部の「◆」400)は、日付ブロックの指す記憶領域「◎」402(図8下部)となり、当該領域402に、検出された歩数値が記憶されることとなる。なお、そのときまで日付ブロックの指す歩数値の記憶領域「◎」402であった記憶領域(図8上部)は、歩数値が既に記憶された記憶領域「○」406(図8下部)となっている。
このようにして、歩数ログバッファ314では、現在有効な日付ブロック「◆」400を移動させつつ歩数値が記憶される。また、検出順序が分かるように各歩数値を記憶すれば、少なくとも1つの歩数値に対応する時刻のみを記憶しておくことで、各歩数値の時刻を算出できる。つまり、現在有効な日付ブロック「◆」400に規定長前の記憶領域「◎」402の歩数値の時刻情報が記憶され、かつ、単位時間ごとに順次検出された各歩数値がアドレス順に記憶されるので、現在有効な日付ブロック「◆」400の時刻情報とアドレス順に基づいて、各歩数値の時刻を算出することができる。したがって、歩数値ごとに時刻を記憶する必要がなく、順次検出されて記憶される歩数値に関連付けて少なくとも1つの時刻を記憶しておけばよいので、歩数データを記憶しておくメモリの容量を節約することができる。
また、歩数ログバッファ314はリングバッファとして構成されており、当該歩数ログバッファ314の末尾の記憶領域の次に書込まれる記憶領域は、当該歩数ログバッファ314の先頭である。したがって、歩数値の記録が歩数ログバッファ314の末尾の記憶領域まで達したときは、次の記録は歩数ログバッファ314の先頭から上書きにより続けられる。
歩数計100において電池切れが起こると、歩数値の記録が停止する。歩数ログバッファ314は電池切れ直前の記憶状態で保持される。その後、ユーザによって電池が交換されたとき、歩数計100のマイコン110にリセットがかかり初期化処理が実行されるようにする。このリセットに応じて起動される初期化処理によって、歩数ログバッファ314に記憶されていた歩数値に関連付けられた時刻を、歩数ログバッファ314にこれから記憶される歩数値に関連付けられる時刻と区別可能なデータとして記憶する。
具体的には、図9に示すような初期化処理が実行される。図9の上部に示す歩数ログバッファ314の状態で電池が切れたとする。電池交換後の初期化処理では、マイコン110は、歩数ログバッファ314をサーチし、現在有効な日付ブロック「◆」400を探す。現在有効な日付ブロック「◆」400が見つかると、マイコン110は、当該現在有効な日付ブロック「◆」400を、過去の日付ブロックに変更する。図9の下部に示すように、白菱形印「◇」410が過去の日付ブロックを示す。ただし、日付ブロックが現在有効な日付ブロックから過去の日付ブロックに変更されても、当該ブロックに記憶されていた時刻およびその時刻設定済みフラグは変更されない。つまり、この過去の日付ブロック「◇」410は、規定長前の記憶領域「◎」402に記憶された歩数値の時刻情報を記憶している。したがって、この過去の日付ブロック「◇」410の前に記憶された各歩数値の時刻を、当該過去の日付ブロック「◇」410の時刻とアドレス順に基づいて算出することができる。
さらに、マイコン110は、過去の日付ブロック「◇」410の直後のアドレスを基準にして、新たに現在有効な日付ブロック「◆」400を作成する。つまり、過去の日付ブロック「◇」410の直後の記憶領域の規定長後に現在有効な日付ブロック「◆」400を作成する。したがって、過去の日付ブロック「◇」410の直後の記憶領域は、現在有効な日付ブロック「◆」400の規定長前の記憶領域であり、つまり、現在有効な日付ブロック「◆」400の指す歩数値の記憶領域「◎」402となる。なお、現在有効な日付ブロック「◆」400には、初期値にリセットされた歩数計100の時刻が記憶されるとともに、当該時刻に対応する時刻設定済みフラグはオフにされる。また、書込みポインタの書込み位置408は、過去の日付ブロック「◇」410の直後のアドレスに変更される。このようにして、電池交換後には、過去の日付ブロック「◇」410の直後から歩数値の記録が行われることとなる。
なお、ここでは、電池切れ後の電池交換による初期化の場合を例に説明を行ったが、強い静電気などの衝撃により誤ってリセットがかかるなど、他の理由によって初期化が行われる場合も同様である。
このようにして歩数計100の歩数ログバッファ314に記憶された歩数データは、現在有効な日付ブロックと過去の日付ブロックによって、電池切れ以前に記憶された歩数ログであるかまたは最近の(現在記録中である)歩数ログであるか区別可能になっている。したがって、電池切れ以前に記憶された歩数ログの各歩数値については、過去の日付ブロックによって各時刻を算出することができ、最近の歩数ログの各歩数値については、現在の日付ブロックによって各時刻を算出することができる。
図10には、電池切れ以前の歩数ログの取得を説明するための図解図を示す。書込みポインタの書込み位置408は、現在の歩数ログの記録の最先端の記憶領域であるから、この書込み位置408から逆方向(記録を進める方向とは逆の方向)に過去の日付ブロック「◇」410または現在有効な日付ブロック「◆」400をサーチする。なお、歩数ログバッファ314は上述のようにリングバッファであるから、歩数ログバッファ314の先頭までサーチがなされると、次は末尾からサーチが続けられる。また、電池切れ以前の歩数ログが存在しない場合、過去の日付ブロック「◇」410が発見されずに、現在有効な日付ブロック「◆」400が発見される。なお、過去の日付ブロック「◇」410が発見されないのは、電池交換が行われていないためであり、あるいは、歩数ログの保存期間内に電池切れが起こらずに過去の日付ブロック「◇」410が上書きされたためである。
直前(すなわち1回前)の電池切れ以前の歩数ログを取得する際には、書込み位置408から逆方向に1個目の過去の日付ブロック「◇」410をサーチする。過去の日付ブロック「◇」410を発見した場合、そこからさらに逆方向に別の過去の日付ブロック「◇」410または現在有効な日付ブロック「◆」400のサーチを行う。1個目の過去の日付ブロックから次に発見された日付ブロックまでのデータが、直前の電池切れ以前の歩数データとして取得される。図10の場合、サーチにより、書込み位置408から左方向に3つ隣にある過去の日付ブロック「◇」410が1個目の過去の日付ブロックとして発見される。さらに、歩数ログバッファ314の末尾にある現在有効な日付ブロック「◆」400が発見される。そして、それらの間の歩数データが1回前の電池切れ以前の歩数ログとして取得される。
2回前の電池切れ以前の歩数ログの取得、さらにそれ以前の歩数ログの取得も同様にして行われる。電池切れ以前の歩数ログの取得について包括的に表現すると、(n+1)回前の歩数ログを取得する際には、書込み位置408から逆方向に(n+1)個目の過去の日付ブロック「◇」410をサーチする。ただし、nは、電池交換回数をカウントするための変数nであり、0以上の整数である。(n+1)個目の過去の日付ブロック「◇」410を発見した場合、そこからさらに逆方向に別の過去の日付ブロック「◇」410または現在有効な日付ブロック「◆」400のサーチを行って、発見された日付ブロック間のデータが(n+1)回前の電池切れ以前の歩数ログとして取得される。
図11には、最近の歩数ログの取得を説明するための図解図を示す。最近の歩数ログを取得する際には、書込み位置408から逆方向(記録を進める方向とは逆の方向)に過去の日付ブロック「◇」410または現在有効な日付ブロック「◆」400をサーチする。書込み位置408から発見された日付ブロックまでの歩数データが最近の歩数ログとして取得される。図11の場合、サーチにより、書込み位置408から左方向に3つ隣にある過去の日付ブロック「◇」410が発見される。そして、書込み位置408と発見された過去の日付ブロック「◇」410間の歩数データが最近の歩数ログとして取得される。
歩数ログの各歩数値には時刻が設定される。電池切れ以前の歩数ログについては、歩数計100で計時されて過去の日付ブロック「◇」410に記憶された時刻に基づいて設定される。具体的には、各歩数値の時刻は、当該歩数ログの後の過去の日付ブロック「◇」410と当該過去の日付ブロック「◇」410の規定長前の記憶領域「◎」402とから算出される。つまり、日付ブロックの指す記憶領域「◎」402の歩数値の時刻が、過去の日付ブロック「◇」410に記憶された時刻であるから、歩数ログの他の歩数値の時刻は、そのアドレスと記録の単位時間(この実施例では1分)に基づいて設定される。過去の日付ブロック「◇」410の指す記憶領域「◎」402よりも前に記憶された歩数値については、記憶領域「◎」402からアドレスが減るごとに単位時間だけ記憶領域「◎」402の時刻から減算した時刻が設定され、記憶領域「◎」402よりも後に記憶された歩数値については、記憶領域「◎」402からアドレスが増えるごとに単位時間だけ記憶領域「◎」402の時刻から加算した時刻が設定される。たとえば、日付ブロックの指す記憶領域「◎」402の2つ前の記憶領域「○」406の歩数値の時刻は、過去の日付ブロック「◇」410に記憶された時刻から(単位時間×2)だけ減算した時刻に設定される。
また、最近の歩数ログについては、各歩数値の時刻は、現在有効な日付ブロック「◆」400に記憶された時刻に基づいて設定されるのではなく、ゲーム装置(歩数管理装置)10で計時される時刻に基づいて設定される。具体的には、書込み位置408の1つ前の記憶領域「○」406に記憶された歩数値が、最近に記憶された歩数値であるから、当該歩数値の時刻が、歩数ログを受信したときの時刻すなわちゲーム装置10で計時される現在時刻t1に設定される。歩数ログの他の歩数値の時刻は、そのアドレスと記録の単位時間に基づいて設定される。つまり、他の歩数値は、最近に記憶された歩数値よりも前に記憶された歩数値であるから、その時刻は、アドレスが減るごとに単位時間だけ現在時刻t1から減算した時刻に設定される。
このようにして、電池交換後に記憶された歩数値の時刻をゲーム装置10側の時刻で設定し、歩数計100の電池切れまでに記録された歩数値の時刻を歩数計100側の時刻で設定することができる。つまり、歩数計100が現在計時している時刻と連続している歩数値すなわち最近の歩数値については、ゲーム装置10の現在時刻に基づいて時刻を設定でき、一方、歩数計100が現在計時している時刻と連続していない歩数値すなわち初期化以前の歩数値については、歩数計100に記憶しておいた時刻に基づいて時刻を設定できる。したがって、初期化(電池交換など)の有無に応じて、歩数値の時刻を適切に設定することができ、また、歩数の記録時刻の精度を向上させることができる。
また、歩数計100からの歩数データの取得をまめに行うようにすれば、歩数計100の時刻に基づいて時刻設定される歩数値の量を減らし、ゲーム装置10の精度の良い時刻に基づいて時刻設定される歩数値の量を増やすことができ、したがって、歩数計100の時刻の精度をあまり気にしなくても良いので、安価な歩数計100を提供することができる。なお、歩数計100は電池切れで計時を停止し、その後電池交換により計時を開始しても、時計が初期値に設定されるので、この実施例では、ゲーム装置10の時刻が設定されるまでは、正確な時刻が分からないが、歩数計100に別電池を有する時計回路をさらに持たせるのはコスト面で問題がある。
また、たとえば、歩数計100が複数あって、複数の歩数計100で検出される歩数値を1つのゲーム装置10で管理するようなシステム1000を構成する場合、ゲーム装置10で計時される時刻によって、各歩数計100で計測された歩数値の記録時刻が設定されるので、各歩数計100の時刻を容易に同期させることができるとともに、複数の歩数計100がそれぞれ異なる時刻を計時していたとしても、時刻の整合性を取ることができ、歩数値の記録時刻の精度を向上させることができる。
この歩数計測システム1000の動作の一例をフロー図に基づいて説明する。まず、歩数計100の歩数ログの記録について説明する。図12は歩数計100の分ログ記録処理の動作の一例を示す。ここで分ログとは、1分を単位時間として検出された歩数値が記録された歩数ログを意味する。分ログ記録処理は、単位時間ごと(この実施例では1分ごと)に実行される。
図12のステップS1で、歩数計100のマイコン110は、次のメモリ領域は日付ブロックであるか否かを判断する。つまり、マイコン110は、書込みポインタの示す書込み位置が、EEPROM116の歩数ログバッファ314に記憶された現在有効な日付ブロック「◆」400の記憶位置を示すかどうか判断する。このステップS1で“YES”の場合、マイコン110は、ステップS3で、現在有効な日付ブロック「◆」400の時刻を現在時刻t2に変更し、当該現在有効な日付ブロックを、歩数ログバッファ314において書込み位置から一定長先へ移動させる。一方、ステップS1で“NO”の場合には、処理はそのままステップS3に進む。
ステップS3で、マイコン110は、次のメモリ領域に分ログを追加する。つまり、マイコン110は、書込みポインタの示す書込み位置に、単位時間の間に検出またはカウントされた歩数値を記憶する。ステップS3を終了すると、この分ログ記録処理を終了する。
図13は歩数計100の初期化処理の動作の一例を示す。初期化処理は、電池交換が行われた場合、強い静電気により衝撃が加わった場合などに、リセットがかかることによって実行される。
初期化処理を開始すると、マイコン110は、まず、ステップS11でEEPROM116の歩数ログバッファ314から現在有効な日付ブロック「◆」400を検索する。歩数ログの記録中に電池切れが起こった場合には、歩数ログバッファ314に現在有効な日付ブロック「◆」400が記憶されているが、工場で出荷前に最初に初期化処理が起動される場合には、歩数ログバッファ314には現在有効な日付ブロック「◆」400が記憶されていない。したがって、現在有効な日付ブロック「◆」400を検索することによって、電池交換や誤動作等によって起動された初期化処理であるか否かを判断する。
次に、ステップS13で、マイコン110は、現在有効な日付ブロック「◆」400を発見したか否かを判断する。ステップS13で“NO”の場合、つまり、最初の初期化処理と判断される場合には、マイコン110は、ステップS15で、バッファ先頭を基準にしたアドレスに現在有効な日付ブロック「◆」400を新規に作成する。具体的には、EEPROM116の歩数ログバッファ314の先頭アドレスから規定長先に、現在有効な日付ブロック「◆」400を作成する。
一方、ステップS13で“YES”の場合、つまり、電池交換や誤動作等によって起動された初期化処理であると判断される場合には、マイコンは、ステップS17で、発見した現在有効な日付ブロック「◆」400を過去の日付ブロック「◇」410に変更する。また、ステップS19で、マイコン110は、当該過去の日付ブロック「◇」410の直後のアドレスを基準にして、現在有効な日付ブロック「◆」400を新規に作成する。具体的には、過去の日付ブロック「◇」410の直後のアドレスから規定長先に、現在有効な日付ブロック「◆」400を作成する。
続くステップS21では、マイコン110は、歩数計100の時刻t2を初期値にリセットする。つまり、記憶領域312に現在時刻t2として所定の初期値を記憶する。歩数計100の現在時刻t2は、この初期値から単位時間毎に一定値加算することによって計時される。
また、ステップS23では、マイコン110は、現在有効な日付ブロック「◆」400に初期値すなわち現在時刻t2を記録する。さらに、ステップS25で、マイコン110は、現在有効な日付ブロック「◆」400に記憶される時刻設定済みフラグをオフにする。時刻設定済みフラグは、現在有効な日付ブロック「◆」400に記憶されている時刻がゲーム装置10の計時する時刻に基づいて設定されたものであるか否かを示す。この初期化処理が実行されると、時刻設定済みフラグはオフにされ、後述されるように、歩数計100がゲーム装置10の計時する時刻t1を受信して時刻t2に時刻t1を設定したとき、時刻設定済みフラグはオンにされる。このゲーム装置10からの時刻t1の受信は、歩数計100の歩数データをゲーム装置10に送信するための通信の際に実行される。したがって、時刻設定済みフラグがオフである場合、歩数計100が、初期化処理を実行し、かつ、その後ゲーム装置10と通信をしていない状態(初期状態)であることが分かる。つまり、時刻設定済みフラグがオフである場合には、歩数計100では、電池交換や誤動作等によって初期化処理が実行されており、歩数ログバッファ314に過去の歩数ログ(初期化以前に記録された歩数ログ)が記憶されている可能性があることが分かる。ステップS25を終了すると、この初期化処理を終了する。
図14は、歩数計100の時刻設定処理の動作の一例を示す。ゲーム装置10と通信中にゲーム装置10から時刻設定コマンドを受信したときに実行される。具体的には、歩数計100のマイコン110は、ステップS41で、時刻設定コマンドをゲーム装置10から受信したか否かを判断する。時刻設定コマンドは、後述されるように、歩数計100の時刻設定済みフラグがオフである場合にゲーム装置10から送信される。マイコン110は、このステップS41の処理を一定時間ごとに実行し、“YES”と判断される場合に、続くステップS43−S49の処理を実行する。時刻設定済みコマンドを受信していない場合、そのままこの時刻設定処理を終了する。
ステップS43では、マイコン110は時刻t1を取得する。時刻設定コマンドには、ゲーム装置10で計時される現在の時刻t1が含まれているので、この時刻t1を時刻設定コマンドから抽出する。そして、ステップS45で、マイコン110は、時刻t1を歩数計100の時刻t2に設定する。具体的には、記憶領域312の現在時刻t2として、受信した時刻t1を記憶する。
続いて、ステップS47で、マイコン110は、時刻t2を調整した時刻を、現在有効な日付ブロック「◆」400の時刻に設定する。現在時刻t2は、記録中の最先端の記憶領域、すなわち、書込みポインタの書込み位置408に対応し、一方、現在有効な日付ブロック「◆」400の時刻は、規定長前の記憶領域「◎」402に対応する。したがって、現在時刻t2、書込み位置408および規定長前の記憶領域「◎」402のアドレスに基づいて、記憶領域「◎」402の歩数値の検出時刻を算出し、当該検出時刻を現在有効な日付ブロック「◆」400に記憶する。
さらに、ステップS49で、マイコン110は、現在有効な日付ブロック「◆」400の時刻設定済みフラグをオンにする。これにより、現在有効な日付ブロック「◆」400の時刻がゲーム装置10の時刻t1に基づいて設定されたことを記録する。ステップS49を終了すると、この時刻設定処理を終了する。
このように、この実施例では、歩数計100側の時刻をゲーム装置10側の時刻に修正することができるので、歩数計100の時計の精度が低くてもよく、したがって、歩数計100の製造コストを抑えることが出来る。また、歩数計100の時刻をユーザに設定させる必要もないので、ユーザの手を煩わせることがなく、歩数計100の操作性を簡略化することが出来る。
図15および図16は歩数計100の歩数ログ送信処理の動作の一例を示す。歩数計100は、押しボタン104が押されると、ゲーム装置10に通信を開始するための所定のデータを送信し、ゲーム装置10との通信を開始する。歩数ログ送信処理は、ゲーム装置10と通信を開始した後に、一定時間ごとに実行される。
マイコン110は、ステップS61で、ゲーム装置10から歩数ログの数を要求されたか否かを判断する。ゲーム装置10は、後述されるように、時刻設定済みフラグがオンである場合に歩数計100で電池交換があったか否かを判断するために、歩数計100に歩数ログの数を要求する。ここで要求される歩数ログの数は、前回取得時刻t3から現在までに記録された歩数値の数である。
ステップS61で“YES”の場合、マイコン110は、ステップS63で、要求された歩数ログの数を検出して、ゲーム装置10に送信する。現在有効な日付ブロック「◆」400に記憶された時刻が規定長前の記憶領域「◎」402の歩数値の時刻を示すので、マイコン100は、各歩数値の検出時刻を特定することができる。したがって、マイコン100は、歩数ログバッファ314を書込み位置408から逆方向に遡って調査することによって、現在から前回取得時刻t3までの間に記録されている歩数値の数を検出することができる。現在時刻から前回取得時刻t3までの間に初期化処理が実行されていた場合には、歩数値の記録が中断し、記録されている歩数値の数が、現在時刻から前回取得時刻t3の期間に本来記録されているべき歩数値の数よりも少なくなる。一方、ステップS61で“NO”の場合には、処理はそのままステップS65に進む。
ステップS65では、マイコン110は、(n+1)回前の電池切れ以前の歩数ログを要求されたか否かを判断する。ゲーム装置10は、後述されるように、歩数計100で電池交換があったと判断されるときに、(n+1)回前の電池切れ以前の歩数ログを要求する。
ステップS65で“YES”の場合、マイコン110は、ステップS67で、書込み位置408から逆方向に(n+1)個目の過去の日付ブロック「◇」410を探す。(n+1)回前の電池切れ以前の歩数ログが記憶されている場合、歩数ログバッファ314には(n+1)個の過去の日付ブロック「◇」410が記憶されている。
そして、ステップS69で、マイコンは当該過去の日付ブロック「◇」410を発見したか否かを判断する。ステップS69で“NO”の場合、つまり、書込み位置408から1周するまでに(n+1)個目の過去の日付ブロック「◇」410を発見できなかった場合には、マイコン110は、ステップS71で、歩数ログ存在フラグをオフにする。なお、歩数ログ存在フラグは、(n+1)回前の電池切れ以前の歩数ログが存在したかどうかを示すフラグであり、ゲーム装置10に返送するデータに含められるデータである。ステップS71を終了すると、処理はステップS79に進む。
一方、ステップS69で“YES”の場合、つまり、(n+1)個目の過去の日付ブロック「◇」410が存在する場合には、マイコン110は、ステップS73で、歩数ログ存在フラグをオンにする。
続いて、ステップS75で、マイコン110は、当該過去の日付ブロック「◇」410に設定された時刻および時刻設定済みフラグを読み出す。この時刻は、電池が切れたときの歩数計100の時刻を示す。また、時刻設定済みフラグは、当該時刻に関する時刻設定済みフラグであり、つまり、当該時刻がゲーム装置10の時刻に基づいて設定された時刻であるか否かを示す。これら時刻および時刻設定済みフラグは、ゲーム装置10に返送するデータに含められるデータである。
また、ステップS77で、マイコン110は、当該過去の日付ブロック「◇」410から逆方向の次の日付ブロックまでの歩数ログを歩数ログバッファ314から読み出す。次の日付ブロックは、過去の日付ブロック「◇」410または現在有効な日付ブロック「◆」400である。この読み出した歩数ログが、(n+1)回前の電池切れ以前の歩数ログである。
そして、ステップS79で、マイコン110は、歩数ログ存在フラグ、(n+1)回前の電池切れ以前の歩数ログ、電池が切れたときの歩数計100の時刻および時刻設定済みフラグをゲーム装置10に送信する。なお、ステップS69で“NO”と判断される場合には、歩数ログ存在フラグのみを含むデータが返送される。
一方、ステップS65で“NO”の場合には、処理はそのまま図16のステップS81に進む。なお、この実施例のゲーム装置10は、後述されるように、(n+1)回前の電池切れ以前の歩数ログが存在しないと判断されるまで、1回の電池切れごとの歩数ログを要求するようになっているので、ステップS79で歩数ログ存在フラグがオフであるデータがゲーム装置10に送信されるまで、歩数ログの要求に応じてステップS65からS79の処理が繰り返し実行されることとなる。
図16のステップS81では、マイコン110は、最近の歩数ログを要求されたか否かを判断する。ゲーム装置10は、後述されるように、歩数計100に最近の歩数ログを要求する。また、ゲーム装置10は、前回取得時間t3から現在時刻t1までの期間分の歩数ログを要求する。ただし、前回取得時間t3から現在時刻t1までの期間が、歩数ログバッファ314に記録可能な最大数に対応する期間を超える場合には、最近の歩数ログのすべてが要求される。
ステップS81で“YES”の場合、マイコン110は、ステップS83で、(t1−t3)期間の指定があるか否かを判断する。ステップS83で“NO”の場合、つまり、最近の歩数ログのすべてを要求された場合には、マイコン110は、ステップS85で、歩数ログのすべてを歩数ログバッファ314から読み出す。前回取得時刻t3から現在時刻t1までの経過時間が、歩数ログバッファ314に記録可能な最大数に対応する期間を超えているので、歩数ログバッファ314には、最近の歩数ログ、すなわち現在記録中の歩数ログのみが記憶されており、1回前の電池切れ以前の歩数ログは記憶されていない。したがって、歩数ログのすべてが読み出される。ステップS85を終了すると、処理はステップS93に進む。
一方、ステップS83で“YES”の場合、つまり、現在時刻t1から前回取得時刻t3までの期間の指定データが要求データに含まれている場合には、マイコン110は、ステップS87で、(t1−t3)期間に日付ブロックがあるか否かを判断する。前回取得時刻t3から現在時刻t1までの間に歩数計100で電池交換等により初期化があったときには、書込み位置408から逆方向に前回取得時刻t3に対応する歩数値の記憶領域までの間に過去の日付ブロック「◇」410が存在することになり、したがって、書込み位置408から当該過去の日付ブロック「◇」410までの歩数ログが最近の歩数ログとなる。ステップS87で“YES”の場合には、マイコン110は、ステップS89で、現在時刻t1から過去の日付ブロック「◇」410までの歩数ログを読み出す。一方、ステップS87で“NO”の場合には、マイコン110は、ステップS91で、(t1−t3)期間分の歩数ログ、すなわち、書込み位置408から前回取得時刻t3に対応する歩数値の記憶領域までの歩数ログを読み出す。
続いて、ステップS93で、マイコン110は、読み出した最近の歩数ログをゲーム装置10に送信する。なお、ステップS81で“NO”の場合には、そのままこの歩数ログ送信処理を終了する。
図17−図19は、ゲーム装置10の歩数データ取得処理の動作の一例を示す。この歩数データ取得処理は、所定のタイミングでまたは操作スイッチ22の所定の操作に応じて実行される。
歩数データ取得処理を開始すると、ステップS101で、CPUコア34は通信待ち処理を実行する。メモリカード28のマイコン66によってIr通信用回路70が通信待ち状態になる。なお、この際、第1のLCD12または第2のLCD14に、歩数計100をゲーム装置10に向けて押しボタン104を押すことによって通信を開始するようにユーザに促すテキストを含む画面を表示するようにしてよい。
CPUコア34は、ステップS103で歩数計100からデータを受信したか否かを判断する。このステップS103の処理は、歩数計100からデータを受信するまで一定時間ごとに実行される。当該データは、歩数計100で押しボタン104が押されることによって送信され、歩数計100の識別情報(ID)を含んでいる。ゲーム装置10で管理する歩数計100のIDを登録する処理を初期設定により予め行って、バックアップ用メモリ68に当該IDを記憶しておくことにより、歩数計100からのデータを判別することができる。ステップS103で“YES”の場合、CPUコア34は、ステップS105で当該歩数計100との通信を開始する。
続いて、ステップS107で、CPUコア34は、電池が交換された回数をカウントするための変数(電池交換数カウンタ)nに初期値0を設定する。また、ステップS109で、CPUコア34は、電池切れ以前の有効な歩数ログ存在数をカウントするための変数mに初期値0を設定する。
続くステップS111で、CPUコア34は、電池交換検出処理を実行する。この電池交換検出処理は、歩数計100で電池交換があったか否か、つまり、歩数計100で初期化処理が実行されたか否かを検出するための処理である。電池交換検出処理の動作の一例が図20に示される。
電池交換検出処理を開始すると、図20の最初のステップS161で、CPUコア34は、歩数計100の時刻t2と時刻設定済みフラグを歩数計100から取得する。具体的には、CPUコア34は、時刻t2と時刻設定済みフラグの要求を歩数計100に送信する。歩数計100のマイコン110は、この要求を受信すると、歩数ログバッファ314の現在有効な日付ブロック「◆」400に記憶された時刻設定済みフラグと記憶領域312の現在時刻t2とを読み出して、時刻設定済みフラグと時刻t2をゲーム装置10に送信する。CPUコア34は、時刻設定済みフラグと時刻t2を歩数計100から受信してRAM42に記憶する。
ステップS163で、CPUコア34は、時刻t2に関連する時刻設定済みフラグがオンであるか否か、つまり、歩数計100の現在時刻t2が、ゲーム装置10の時刻に基づいて設定されて計時されたものであるか否かが判断される。歩数計100で初期化処理が実行された場合、上述のように、歩数計100の現在時刻t2は初期値にリセットされてから計時され、かつ、時刻設定済みフラグはオフになっている。したがって、このステップS163では、歩数計100が初期状態にないのか否かを判断している。
ステップS163で“NO”の場合、つまり、歩数計100が初期状態にある場合には、CPUコア34は、ステップS165で、現在時刻t1を含む時刻設定コマンドを歩数計100に送信する。この時刻設定コマンドに応じて、歩数計100では、上述のように時刻設定処理(図14)が実行され、歩数計100の時刻t2がゲーム装置10の時刻t1に設定されるとともに、当該時刻に関連する時刻設定済みフラグがオンにされる。ステップS165を終了すると、処理はステップS171に進む。
一方、ステップS163で“YES”の場合、つまり、歩数計100が初期状態ではない場合には、処理はステップS167に進む。歩数計100で初期化処理が実行されたときには、時刻設定済みフラグがオフにされているので、ステップS163で時刻設定済みフラグの判定を行うことによって、本来、歩数計100の電池交換または誤動作等による初期化を検出することができる。しかし、歩数計100が複数のソフトウェアで使用される場合、たとえばソフトウェアAを実行しているときのゲーム装置10によって時刻設定済みフラグを設定されてしまうと、ソフトウェアBを実行しているときのゲーム装置10では、初期化を検出できないということが起こる。そこで、さらに、ステップS167およびS169の処理によって、歩数計100における初期化の検出を試みる。
具体的には、ステップS167で、CPUコア34は、歩数ログの数を歩数計100から取得する。具体的には、CPUコア34は、歩数ログの数の要求を歩数計100に送信する。前回取得時刻t3から現在までの歩数ログの数(歩数値の数)を取得したいので、要求データは前回取得時刻t3を含む。歩数計100のマイコン110は、この要求を受信すると、上述の歩数ログ送信処理(図15のステップS61−S63)で、歩数ログの数を検出してゲーム装置10に送信する。CPUコア34は、歩数ログの数を受信してRAM42に記憶する。
続くステップS169で、CPUコア34は、歩数ログの数が、現在時刻t1から前回取得時刻t3までの期間分の歩数ログの数よりも小さいか否かを判断する。前回取得時刻t3から現在までの間に歩数計100で電池切れが生じ電池交換が行われた場合、歩数値の記録が途切れることにより、歩数ログの数が、前回取得時刻t3から現在時刻t1までの期間に記録されるべき歩数ログの数(歩数値の数)よりも小さくなる。なお、前回取得時刻t3から現在時刻t1までの経過時間が歩数ログバッファ314に記録可能な最大の期間を超える場合には、前回取得時刻t3から現在時刻t1までの期間にされるべき歩数ログの数は、当該最大の期間に記録されるべき歩数ログの数である。
ステップS169で“YES”の場合、つまり、前回取得時刻t3から現在までの間に歩数計100で電池交換が行われた可能性がある場合には、処理はステップS171に進む。
このように、前回取得時刻t3から現在時刻t1までの期間に記憶された歩数値の数に基づいて電池交換(初期化処理)の実行を判定するようにしているので、複数のソフトウェアで歩数計100を共用する場合にも、各ソフトウェアの処理において、歩数計100で初期化処理が実行されたことを検出することができる。この実施例のように、初期化処理の実行に応じてオフされかつ歩数データ送信処理に応じてオンされるようなフラグ(時刻設定済みフラグ)を歩数計100に記憶しておくような場合には、各ソフトウェアの処理において上記フラグが切り替えられるので、先に他のソフトウェアの処理でゲーム装置10に歩数データが取得されると、後から実行されたソフトウェアでは、初期化処理が実行されたことが検出できなくなる。しかし、前回取得時刻t3から現在までの歩数値の数を検出する場合には、他のソフトウェアが先に実行されても、歩数値の数が変更されないので、後から実行されるソフトウェアでも初期化処理の実行を検出することができる。
なお、上述のように、1つの歩数計100を複数のソフトウェアで共用する場合、時刻設定済みフラグは初期化があったか否かを示すフラグとして機能しないときがある。しかし、1つのソフトウェアのみで歩数計100を使用する場合には、時刻設定済みフラグは、初期化があったかどうかを示すフラグとなるので、その場合、ステップS167およびS169の処理は省略されてよい。
ステップS171では、CPUコア34は、電池交換フラグをオンにする。電池交換フラグは、歩数計100で電池交換(初期化処理)が行われたか否かを示すフラグであり、この電池交換フラグは、歩数計100に過去の歩数ログが記録されているか否かも示す。一方、ステップS169で“NO”の場合には、CPUコア34は、ステップS173で電池交換フラグをオフにする。ステップS171またはS173を終了すると、この電池交換検出処理を終了し、処理は図7のステップS113に戻る。
ステップS113では、CPUコア34は、電池交換が検出されたか否か、つまり、電池交換フラグがオンであるか否かを判断する。ステップS113で“YES”の場合、処理は図18のステップS115に進み、過去の歩数ログ(電池切れ以前の歩数ログ)の取得を行う。一方、ステップS113で“NO”の場合、処理はそのまま図19のステップS129に進む。
図18のステップS115では、CPUコア34は、(n+1)回前の電池切れ以前の歩数ログを歩数計100に要求する。最初の要求時には、変数nには初期値0が設定されているので、1回前の電池切れ以前の歩数ログが要求される。この要求に応じて、歩数計100では、上述の歩数ログ送信処理(図15のステップS65−S79)が実行されて、歩数ログ存在フラグ、(n+1)回前の電池切れ以前の歩数ログ、電池が切れたときの歩数計100の時刻および当該時刻に関連する時刻設定済みフラグを含むデータがゲーム装置10に送信される。
これに応じて、ステップS117で、CPUコア34は、歩数ログ存在フラグ、(n+1)回前の電池切れ以前の歩数ログ、電池が切れたときの歩数計100の時刻および当該時刻に関連する時刻設定済みフラグを含むデータを歩数計100から受信し、RAM42に記憶する。
そして、ステップS119で、CPUコア34は当該歩数ログが存在するか否か、つまり、歩数ログ存在フラグがオンであるか否かを判断する。
ステップS119で“YES”の場合、CPUコア34は、ステップS121で、当該歩数ログが有効なデータであるか否かを判断する。具体的には、時刻設定済みフラグがオンであるか否かを判断する。ここで、有効なデータとは、歩数ログの各歩数値の検出時刻として適切な時刻を設定可能なデータを意味する。もし受信した時刻設定済みフラグがオフであれば、受信した電池が切れたときの歩数計100の時刻は、初期値に基づいて計時された時刻であり、ゲーム装置10の時刻に基づいて設定されたものではなく、つまり、正確ではない。したがって、歩数値に関連付けられた時刻が不明であり、当該歩数ログの各歩数値には適切な時刻を設定することができないので、当該歩数ログは無効なデータとして扱う。たとえば、電池交換がうまくいかずに電池が何度か出し入れされた場合や残量のほとんどない電池に交換された場合などに記憶された、時刻情報の不正確な歩数データを取り除くことができる。
ステップS121で“YES”の場合には、CPUコア34は、ステップS123で、電池が切れたときの時刻とアドレス順に基づいて、電池切れ以前の歩数ログの各歩数値に時刻を設定し、各歩数値と時刻をメモリ(RAM42)に保持する。なお、上述のように、電池が切れたときの時刻は過去の日付ブロック「◇」410に記憶された時刻であり、当該過去の日付ブロック「◇」410の指す記憶領域「◎」402の歩数値の検出時刻である。また、歩数ログの各歩数値は、単位時間ごとにアドレス順に記憶されている。したがって、歩数ログにおけるアドレス順と電池が切れたときの時刻に基づいて、各歩数値の検出時刻を算出し、各歩数値と時刻とを対応付けることができる。
このようにして、有効な歩数ログの各歩数値に時刻を設定することができたので、CPUコア34は、ステップS125で、有効な歩数ログの数をカウントする変数mを1だけインクリメントする。一方、ステップS121で“NO”の場合、つまり、時刻設定済みフラグがオフであった場合には、適切な時刻設定が行えないので、処理はそのままステップS127に進む。
ステップS127では、CPUコア34は、電池交換回数をカウントする変数nを1だけインクリメントする。つまり、(n+1)回前の歩数ログが存在したので、電池交換回数をカウントする。ステップS127を終了すると、処理はステップS115に戻る。したがって、もう1回前の電池切れ以前の歩数ログの取得が試みられる。
この実施例では、電池交換検出処理を行って電池交換(初期化処理)が実行されたことが検出されたときだけ、初期化処理前に記憶されたデータを歩数計100から取得するようにしている。したがって、歩数計100においては初期化処理前に記憶されたデータを探して送信する処理を必要なときだけ実行すればよいので、処理負担を減らすことができる。また、歩数計100の歩数ログバッファ314に記憶されているデータのすべてをいつもゲーム装置10に送信してゲーム装置10で初期化処理前のデータを探すような処理を実行するのではなく、必要なデータだけを歩数計100から送信する処理を実行するので、通信量を減らすことができる。
一方、ステップS119で“NO”の場合には、(n+1)回前の歩数ログがもはや歩数計100に記憶されていないので、この過去の歩数ログの取得を終了し、処理は図19のステップS129に進む。
図19のステップS129では、CPUコア34は、前回取得時刻t3から現在時刻t1までの経過時間が歩数ログ保存期間よりも長いか否かを判断する。歩数ログ保存期間は、歩数ログバッファ314に保存可能な最大数の歩数値の記録にかかる時間に相当する。このステップS129では、前回取得時刻t3から歩数ログ保存期間を超える時間が経過したかどうかが判断されている。
ステップS129で“YES”の場合、つまり、前回取得時刻t3からの経過時間が歩数ログ保存期間を超えた場合には、歩数計100の歩数ログバッファ314には最近の歩数ログのみが記録されているものと判断できる。したがって、ステップS131で、CPUコア34は、最近の歩数ログのすべてを歩数計100に要求する。上述の図16に示すように、歩数計100は、この要求に応じて歩数ログのすべてを読み出して、ゲーム装置10に送信する。
一方、ステップS129で“NO”の場合、つまり、前回取得時刻t3からの経過時間が歩数ログ保存期間内である場合には、CPUコア34は、ステップS133で、(t1−t3)期間分の最近の歩数ログを歩数計100に要求する。この要求データは、少なくとも前回取得時刻t3を含み、つまり、要求データは、現在時刻t1から前回取得時刻t3までの期間の指定を含む。上述の図16に示すように、歩数計100は、この要求に応じて、当該期間における最近の歩数ログを読み出して、ゲーム装置10に送信する。
続くステップS135で、CPUコア34は、最近の歩数ログを歩数計100から受信してRAM42に記憶する。ステップS137で、CPUコア34は、現在時刻t1とアドレス順に基づいて、最近の歩数ログの各歩数値に時刻を設定し、各歩数値と時刻をメモリ(RAM42)に保持する。なお、上述の図11に示すように、書込み位置408が記録の最先端メモリであり、書込み位置408が現在時刻t1に対応する。最近の歩数ログにおける各歩数値のアドレスが書込み位置408から一定長減るごとに、時刻を現在時刻t1から単位時間減算することによって、各歩数値の検出時刻を算出し、各歩数値と時刻とを対応付ける。ステップS139では、CPUコア34は、歩数計100との通信を終了する。
続いて、ステップS141で、CPUコア34は、メモリ(RAM42)上の最近の歩数ログを歩数計100のIDに対応付けてバックアップ用メモリ68に保存する。
ステップS143で、CPUコア34は、電池切れ以前の有効な歩数ログ存在数をカウントする変数mが0より大きいか否かを判断する。ステップS143で“YES”の場合、CPUコア34は、ステップS145で、メモリ(RAM42)上の電池切れ以前の歩数ログを歩数計100のIDに対応付けてバックアップ用メモリ68に保存する。
ステップS147で、CPUコア34は、変数mを1だけディクリメントする。そして、処理はステップS143に戻る。したがって、有効な歩数ログのすべてがバックアップ用メモリ68に保存される。ステップS141およびステップS145では、歩数データを歩数計100のIDに対応付けて保存するようにしたので、システム1000が複数の歩数計100を含む場合、歩数管理装置10が複数の歩数計100の歩数データを管理することができる。また、電池交換前の歩数データについては、各歩数値の時刻を各歩数計100に記憶された時刻に基づいて設定するので、各歩数値の時刻の精度を保つことができ、また、電池交換後の歩数データについては、各歩数値の時刻を歩数管理装置10の時刻に基づいて設定するので、複数の歩数計100の時計がそれぞれ異なる時刻を刻んでいたとしても、時刻の整合性を取ることができる。したがって、歩数の記録時刻の精度を向上させることができる。
一方、ステップS143で“NO”の場合、つまり、有効な歩数ログの保存が終わった場合には、CPUコア34は、ステップS149で、現在時刻t1を前回取得時刻t3とし、当該前回取得時刻t3を歩数計100のIDに対応付けてバックアップ用メモリ68に保存する。前回取得時刻t3についても歩数計100のIDに対応付けて保存するようにしたので、歩数管理装置10は複数の歩数計100を管理することができる。ステップS149を終了すると、この歩数データ取得処理を終了する。
この実施例によれば、初期化処理において、初期化前に記憶されていた歩数値に関連付けられた現在有効な日付ブロック(第1時刻データ)の時刻を、過去の日付ブロック(第1時刻データと区別可能な第2時刻データ)として記憶するようにしたので、初期化処理の前後に記憶された歩数値および時刻を区別することができる。したがって、初期化処理の後に記憶された各歩数値の記録時刻を、歩数管理装置10の時刻に基づいて設定することができ、初期化処理の前に記憶された各歩数値の記録時刻を、歩数計100の時刻に基づいて設定することができる。したがって、歩数の記録時刻の精度を向上させることができる。また、歩数計100における電池交換等によって生じる初期化処理の有無に応じて適切な記録時刻を設定することができる。さらに、歩数計100の時刻の精度をあまり気にしなくても良いので、安価な歩数計100を使用でき、歩数計測システム1000のコストを低減することができる。
また、この実施例では、歩数管理装置10で各歩数値の記録時刻の設定を行うようにしたので、歩数計100の処理負荷を減らすことができる。
なお、上述の実施例では、ゲーム装置10において、各歩数値の時刻を算出し、各歩数値と時刻とを対応付けるようにしていた。しかし、他の実施例では、初期化処理以前に記憶された各歩数値、つまり、電池切れ以前の歩数ログの各歩数値に対しては、過去の日付ブロック「◇」410に記憶された時刻に基づいて歩数計100で記録時刻を設定し、各歩数値と時刻とを対応付けたデータをゲーム装置10に送信するようにしてもよい。また、初期化処理後に記録された各歩数値、つまり、最近の歩数ログの各歩数値に対しては、ゲーム装置10から現在時刻t1を送信し、当該時刻t1に基づいて歩数計100で各歩数値の時刻を設定し、各歩数値と時刻とを対応付けたデータをゲーム装置10に送信するようにしてもよい。
また、この実施例では、1つの歩数値に対応する時刻を記憶しておき、当該時刻を基に各歩数値の時刻をアドレス順に基づいて算出するようにしていた。しかし、他の実施例では、メモリの容量を気にしなくてよいのであれば、各歩数値に対応してそれぞれ検出(記録)時刻を記憶するようにしてもよい。このようにすれば、各歩数値の時刻をアドレス順に基づいて算出する処理が不要になるので、処理負担を軽減することができる。