P/W-Autoモード-リファクタリング

プログラミングで最重要なコトは何か。
プログラミングで最重要なコトってなんでしょうね。
時と場合によって、、人によっても違うことでしょう。
私の中では、
【とにかく動作するものをつくるコト】
が最重要と思ってます。
そして、、
【動作するものつくる】【リファクタリング】
【ブラッシュアップ】
という感じで、進んでいきます。私の場合は。
もちろん、完成度をどこまで高めるか、、とか、、
どこでいったん終了させるか、、、とかは、
作るもの次第の感じです。
今回の、P/W-AUtoモードの作成に関しては、、
まぁプログラム自体は複雑ではなく、
PICマイコンの搭載する程度の容量なので、
内容的には、それほどレベルが高いものでは無いのですが、
クルマの中で使うという、それはそれで、特殊事情があるので、
普段のプログラミングとしての問題とは別の問題があります。
実際には、モーターもエンジンもファンも、そして電装系も数十アンペアが流れたりとか、
ノイズ拾いまくりの環境なのにもかかわらず、A/Dコンバータ入力で、
コマンドの切り分けをしようなんてことをするわけなので、
机上でのテストだけでは、わかりきらない部分もあることでしょう。
まぁ意外と、、、DC-DC絶縁型コンバータくんが頑張ってくれて、
そこそこ安定感があるものができてるのかもしれません。
とにかくやってみて、安定動作するまでが、ゴールですからね。
家に帰るまでが遠足ですよ!
順を追って、ソースコードを。
まず、MPLABでProjectを作成したときにできるmainを含むソースのmain関数はこんなです。
void main(void){
SYSTEM_Initialize();
}
まぁもっとも、戻り値【void】に違和感を感じつつも、
今回リファクタリング後のソースはこんな感じです。
void main(void)
{
SYSTEM_Initialize();
allClear();
while (1){
__delay_ms(100);
int V = getMenuButton();
miracle();
if(!V) continue;
allClear();
switch (V){
case 1: downAuto(V, _N2on); break;
case 2: pushOn(V, _N2on); break;
case 3: pushOn(V, _N1on); break;
case 4: upAuto(V, _N1on,_N2on); break;
case 5: downAuto(V, _N4on); break;
case 6: pushOn(V, _N4on); break;
case 7: pushOn(V, _N3on); break;
case 8: upAuto(V, _N3on,_N4on); break;
default: if(V != 0) allClear(); break;
}
}
}
まぁ順を追ってくと、、、
SYSTEM_Initializeはまぁ無いといけないので、そのまま。
allClearは全ての出力側をlowに設定。
あとは、whileで無限LOOPです。
0.1秒待機して。
現在のMenuButton番号の1~8を取得(押されていなければ0)
miracleは、、その名の通り、miracle。後述。
0ならcontinueでwhileに戻ります
allClearして。
switchでMenu番号ごとの処理。
共通化する部分が多いので、
①UP-AUTO
②DOWN-AUTO
③押してる間だけON
の3種類に集約。
2番目の引数(UP-AUTOは3番目も)は、関数のポインタを渡して、関数を実行してもらいます。
まぁ、PICのプログラム入門書では、、関数のポインタまでは出てこない気がするけど、どうだろ。。
ここは、typedefとかつかって、こんな風に書きます。
typedef void(*FUNC_VV)(void);
void pushOn(int V,FUNC_VV dorry)
FUNC_VVという名前で【FUNC_VV】
ポインタだよっていう指定【*FUNC_VV】
引数の無い関数だよという指定【(*FUNC_VV)(void)】
戻り値はないからvoidだよ➡【void(*FUNC_VV)(void)】
という意味で、FUNC_VVという型を定義します。
そして、pushOnの関数の引数の1番目がint、2番目がこの関数へのポインタ、、、という、
このような形で記述しますよ。
この関数の中では、
dorry();
ってかけば、無事に関数が呼び出されます。
なんでdorryかっていうと、、
関数のことをFunctionって言うし、
略してFunc
複数形にしてFuncs。
Funcs,,Funcs,,,,,,The Funcs,,,と言えば、、、
的な話ではあります。※正しくはdoryだし、Funkですが。^^;
2つ目が必要なときは、もちろんterryですよ。