今日は朝から開発マシンの復旧。昨日買ってきたHDDを取り付けてリカバリCDで購入時の状態に戻し、グラフィックやらLANのドライバを入れる。この機体はXP Home Editionで購入していたので別に買ったアップグレードCDでXP Professional Editionにしておく。
これでパソコンは復活したので、必要な開発環境をインストールしようとしたのだが、ライセンス登録時の内容が分からないため断念。登録内容を知っている社員に電話で訊いても良いのだが、彼は月曜には戻ってくる予定なのでその後で直接訊くことにした。
それ以外に、Subversion、TortoiseSVN、Inno Setup、One-Click Rubyなどをインストールして復旧作業は終わり。
その後は昨日に引き続きリファクタリング。
無駄に長い関数をコンパクトにまとめるための準備。実際にコードを置き換えるのは来週、ファームウェアの作成者が出張から帰ってきてからになる。
無駄に長い関数の一例としては、次のような関数がある。
void commandAA(int val) { String st_aa_val; //VCLのAnsiString if (val >= 0) { st_aa_val = FormatFloat("0000", val); st_aa_val.Insert("AA[+",0); } else { st_aa_val = FormatFloat("0000", -val); st_aa_val.Insert("AA[-",0); } st_aa_val.Insert("]#",(st_aa_val.Length() + 1)); send(st_aa_val); }
この関数は整数の引数からコマンド文字列を作り、send()で機器に送信する。
例えば、引数 val = 123 の場合、"AA[+0123]#"という文字列が作られて送信される。
ここでは文字列を作るのにBorlandのVCLのFormatFloat関数とStringのInsertメソッドを使い、さらに引数の正負で場合分けもして、文字列をこねくりまわしている。これとほぼ同じ("AA"の部分と桁数が異なる)関数が20個ほどあり、全部でInsertしまくっている。
このくらいのことは、sprintf()を使えば1行で出来てしまう。
void commandAA(int val) { String st_aa_val; st_aa_val.sprintf("AA[%+05d]#", val); //これでOK send(st_aa_val); }
そもそもファームウェアの仕様が「コマンド文字列は固定長」になていなければもっと楽なんだけど。