標準テキストLCDメニューシステム


10

テキストLCD用のCの単純なメニューシステムのパターンはありますか?単純なテキストLCDメニューを処理するために、コードを何度も書き換えていることに気づきました。

ほとんどのシステムにはメインメニューといくつかのサブメニューがあり、選択すると最小値と最大値の範囲内でパラメーターを設定できます。

理想的には、このメニューシステムは、Enter、Cancel、Up、Downなどの4つのシンプルなキーでナビゲートできます。

私のアプリケーションでは、2行x 16文字のテキストLCDを使用していますが、理想的なソリューションはどのNxMディスプレイにも適用できるはずです。


電子設計とは何の関係もありません!質問は締め切らせていただきます。
Leon Heller

5
組み込みシステムに適用されるプログラミングの質問は、ここでも質問できるかどうかという印象を受けました。多分私は間違っていた...
mjh2007

私も同じような印象を受けました。それに関する公式のメモはありますか?
AndrejaKo 2010年

FAQによると、非常に低レベルのものだけです。この質問は、ユーザーインターフェイスに関するものです。
Leon Heller

3
+1私も興味があります...私はいつも手で醸造してきました。コンソール出力またはNxMキャラクターディスプレイを使用していますか?...どちらかに対する答えがあるわけではありません:)いくつかの組み込み2xNディスプレイシステムで、Enter / Cancelを組み合わせて2つのボタンインターフェイスを実装し、Nextがあります。リングバッファにより、アップ/ネクストおよびダウン/バックの必要がなくなります。
ケニー、2011年

回答:


5

Cのメニューシステムに使用するパターンは次のようなものです。

struct menuitem
{
  const char *name; // name to be rendered
  functionPointer handlerFunc; // handler for this leaf node (optionally NULL)
  struct menu *child; // pointer to child submenu (optionally NULL)
};

struct menu
{
  struct menu *parent; // pointer to parent menu
  struct **menuitem; // array of menu items, NULL terminated
};

次に、menuそれぞれmenuitemchildサブメニューへのポインタを含むの配列を宣言します。上下に移動すると、現在選択されているの配列を移動しmenuitemます。Backはparentメニューに移動し、Forward / selectはchildサブメニューに移動するかhandlerFunc、リーフノードのを呼び出します。

メニューのレンダリングは、その項目を反復するだけです。

このスキームの利点は、完全にデータ駆動型であり、メニュー構造はレンダラーやハンドラー関数とは無関係にROMで静的に宣言できることです。


2

トビーの答えは非常に良い出発点です。ここで説明する構造は、メニューが静的であり、メニューをナビゲートすることを前提としています。

動的なメニューが必要な場合(温度、時間などの特定の値を表示するなど)、それを生成できる必要があります。

1つの方法は、文字列を作成する関数を登録することです。

struct menuitem
{
  const char *name; // name to be rendered
  const char * (*builderFunc)( const char *name );  // callback to generate string, if not null.
  functionPointer handlerFunc; // handler for this leaf node (optionally NULL)
  struct menu *child; // pointer to child submenu (optionally NULL)
};
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.