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ですよ。

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です