具体的に解決したい問題はなんですか? (teratailのヘルプを見ると、「具体的な問題を提示し、それに回答する」というのがここの基本スタンスのようなので)
OSレスの家電製品のプログラムを参考にしたいと思ったのですが、探しても見つかりませんでした。
まぁ、製品のプログラムを公開する、なんてことはまずあり得ないですね。
さて。
常識的に言って、その操作系で
このようなswitch文がcase500ぐらいまであります。
というのは明らかに設計がおかしいです。フラットに500の選択項目が並んでいる、というのは...ありえないとはいいませんが、ふつーの神経なら、それをグルーピングしてメニューを階層化します。全項目は500のままかも知れませんが、一時に気にしなければいけない範囲はそれでも随分限定出来るでしょう。
また、項目が少ないならそのプログラムでもいいかも知れませんが、500の項目それぞれに
C
1 if(sw == SW_DOWN) { seq=0; }
2 if(sw == SW_UP) { seq=2; }
3 if(sw == SW_SELECT) {
なんていう処理を持たせるのですか? UPやDOWNが押されたときの遷移先、その項目の種類(設定値を変更する/なにかの機能を実行する)、変更する設定値、実行する機能(関数)へのポインタなんかを構造体にして、それをテーブル(配列)にして「メニューの情報」を分離して、実行部はそれを解釈するだけ、みたいな構成に出来れば随分管理はやりやすくなるのでは? 質問のプログラムに例を取るなら、
C
1enum MENU { //メニューのIDを定義する
2 //一部だけ値を指定するのはMISRA等では怒られるがサンプルということで
3 NONE = -1,
4 MAIN = 0,
5 MENU1,
6 MENU2,
7 MENU_MAX
8};
9struct MenuItem {
10 enum MENU id; //メニュー項目のID
11 char* Title; //タイトル表示文字列
12 enum MENU moveUp; //UPキーの遷移先
13 enum MENU moveDn; //DOWNキーの遷移先
14 char* eepDat; //SELECT時EEPROM書き込みデータ
15 enum MENU moveSel; //SELECTキーの遷移先
16};
17const struct MenuItem menuItems[] = {
18 // id項目は不要とも言えるけど...あると意外と便利なことも
19 // id, Title, , up, down, EEP, sel
20 {MAIN, " MAIN MENU ", MENU1, NONE, NULL, NONE},
21 {MENU1, " MENU 1 ", MENU2, MAIN, "TEST", MAIN},
22 {MENU2, " MENU 2 ", MAIN, MENU1, "EXEC", MAIN},
23};
24
25static uint16_t seq = 0;
26void doMenu(int sw) {
27 int index = -1;
28 int mv_tmp= NONE;
29 char* eep_tmp = NULL;
30 for (int i = 0; i < MENU_MAX; i++){
31 if(menuItems[i].id==seq){
32 index = i;
33 break;
34 }
35 }
36 if (index < 0) return;
37 lcd_puts(menuItems[index].Title);
38 switch(sw ){
39 case SW_UP:
40 mv_tmp = menuItem[index].moveUp;
41 break;
42 case SW_DOWN:
43 mv_tmp = menuItem[index].moveDn;
44 break;
45 case SW_SELECT:
46 eep_tmp = menuItem[index].eepDat;
47 mv_tmp = menuItem[index].moveSel;
48 break;
49 }
50 if(eep_tmp!=NULL){
51 eeprom_write(eep_tmp);
52 }
53 if (mv_tmp >= 0) {
54 seq = mv_tmp;
55 }
56}
なんて感じにまとめられればmenuItemsのデータの追加だけで要素は増やせるわけで。(条件によってはもっと簡素になるかも知れないけど、もっとメニュー動作の「例外」があって対応しなきゃいけなくなるのが現実か)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/15 00:07
2020/04/15 07:40