今日は朝から開発マシンの復旧。昨日買ってきたHDDを取り付けてリカバリCDで購入時の状態に戻し、グラフィックやらLANのドライバを入れる。この機体はXP Home Editionで購入していたので別に買ったアップグレードCDでXP Professional Editionにしておく。
これでパソコンは復活したので、必要な開発環境をインストールしようとしたのだが、ライセンス登録時の内容が分からないため断念。登録内容を知っている社員に電話で訊いても良いのだが、彼は月曜には戻ってくる予定なのでその後で直接訊くことにした。
それ以外に、SubversionTortoiseSVN、Inno Setup、One-Click Rubyなどをインストールして復旧作業は終わり。

その後は昨日に引き続きリファクタリング
無駄に長い関数をコンパクトにまとめるための準備。実際にコードを置き換えるのは来週、ファームウェアの作成者が出張から帰ってきてからになる。

無駄に長い関数の一例としては、次のような関数がある。

void commandAA(int val)
{
    String st_aa_val;        //VCLAnsiString
    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]#"という文字列が作られて送信される。

ここでは文字列を作るのにBorlandVCLの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);
}

そもそもファームウェアの仕様が「コマンド文字列は固定長」になていなければもっと楽なんだけど。