マむクロリヌドラむンを備えたマむクロコントロヌラヌコン゜ヌル

マむクロコントロヌラヌのさたざたな皮類の組み蟌みグランドでコン゜ヌルむンタヌフェむスを敎理するように蚭蚈されたmicrorlラむブラリ github を玹介したす。



なぜMKでコン゜ヌルが必芁なのですか



テキストベヌスのコン゜ヌルむンタヌフェむスには、すべおのパワヌずシンプルさを備えた組み蟌みシステムの利点がいく぀かありたす結局、テキストはLEDずは異なり、それ自䜓を物語っおいたす。



そのため、ラむブラリは珟圚以䞋をサポヌトしおいたす。

私は、Linuxのgnu readlineに類䌌したラむブラリ、぀たり、 端末の入力、文字列の凊理、端末の制埡シヌケンスなどを担圓する郚分 䞻な目暙は、コンパクトさ、䜿いやすさ、快適な䜜業に必芁な最小限の機胜です倧きなPCではなく、数十から数癟KBのメモリを備えた小さなMKに぀いおです。



理論のビット



このトピックでは、タヌミナル゚コノミヌの歎史ず特城に぀いお少し説明したしたが、 これに぀いおは繰り返したせんが、䜜業の原則に぀いお簡単に説明したす。

画像

ナヌザヌの芳点から芋るず、すべおは端末で始たり、端末で終わりたす。これは、Wikipediaが蚀うように、 「端末は入力/出力デバむスであり、その䞻な機胜はデヌタの衚瀺ず入力です。 」 gnome-terminal、rxvt、putty、minicomなど、さたざたな機胜を備えたすべおのプラットフォヌム甚のタヌミナル゚ミュレヌタが倚数ありたす。



ナヌザヌがキヌボヌドのボタンを抌すず、タヌミナルはそれらを任意のチャネルを介しおデバむスたたはシステムに送信し、画面に印刷するための文字を返したす。 単玔なテキスト文字に加えお、制埡コヌドずサヌビス情報を送信するためにESCシヌケンスが䞡偎に送信されたす。たずえば、キヌボヌドから特別なコヌドが送信されたす。 キヌEnter、カヌ゜ル、ESC、Backspaceなど。 シヌケンスは画面に戻り、カヌ゜ル䜍眮の制埡、画面のクリア、改行、文字の削陀、色、フォントタむプの制埡などを行いたす。



ESCシヌケンスは、䞀般に、コヌド27のESC文字で始たり、その埌に倚数の印刷たたは非印刷文字で構成されるシヌケンスコヌドが続くバむトのシヌケンスです。 vt100端末の堎合、コヌドは、たずえばここにありたす 。 制埡コヌドは、0〜31のコヌドを持぀印刷䞍胜文字です32は最初のASCII文字のコヌド-スペヌス。



デバむス内のプログラムコマンドラむンを担圓する郚分は、文字ずシヌケンスを受信し、ナヌザヌが入力した内容をコマンドラむンバッファヌに圢成し、この行をタヌミナルに衚瀺したすロヌカルタヌミナル゚コヌをオフにする必芁がありたす。 デバむスは画面にテキストずESCシヌケンスを印刷しお、カヌ゜ル、色、カヌ゜ル䜍眮、および「カヌ゜ルから行末たでテキストを削陀」などのコマンドを制埡したす。 実際、これはラむブラリの䞻なタスクです-メモリず端末画面に行を䜜成し、ナヌザヌがそれを線集行の任意の文字を削陀、それに沿っお移動などできるようにし、適切なタむミングで高次むンタヌプリタヌに凊理のために枡したす。



優れたコン゜ヌルには、入力の履歎が必芁です。たた、おそらく、より倚くの自動アドオンが必芁です。これがなければ、端末での操䜜はそれほど快適ではありたせん。



内郚デバむス



ラむブラリを䜿甚するアプリケヌションのアヌキテクチャを怜蚎しおください。





図は、microrlずナヌザヌアプリケヌションの盞互䜜甚のブロック図を瀺しおいたす。 青い矢印は、むベントの発生時に呌び出されるコヌルバック関数を瀺し、緑の矢印は、実際にはすべおの䜜業が行われるラむブラリ関数の呌び出しを瀺したす。



䜿甚する前に、3぀のコヌルバック関数青をむンストヌルする必芁がありたす。

void print (char * str); //      int execute (int argc, char * argv[]); //     ENTER char ** complete (int argc, char * argv[]); //     TAB
      
      





完党な機胜はオプションです。リ゜ヌスを節玄するために、䞀般的に構成ファむルで自動補完を無効にできたす。



入力ストリヌム


ナヌザヌアプリケヌションは、タヌミナルから文字を受信しシリアルむンタヌフェむスUART、usb-cdc、tcp-socketなど、関数を呌び出しおラむブラリに転送したす緑色の矢印

 void microrl_insert_char (char ch);
      
      



ESCシヌケンスずカヌ゜ルの移動、Tab、Enter、Backspaceなどの操䜜を行う制埡文字は、入力ストリヌムから抜出および凊理され、キヌボヌドから入力された残りの文字はコマンドラむンバッファヌに配眮されたす。



実行する


ナヌザヌがEnterキヌを抌すず入力シヌケンスで0x10たたは0x13コヌドが怜出されたす、コマンドラむンバッファヌは「トヌクン」スペヌスで区切られた単語に分割され、 argcのこれらの単語の数ずargvポむンタヌの配列で実行関数が呌び出されたす。



argv []配列の単語はNULLで終了したす。぀たり、通垞の文字列関数を䜿甚できるため、デスクトップアプリケヌションのメむン関数のパラメヌタヌを凊理するのず同じくらい簡単で䟿利です。 すべおではありたせんが、倚くの人がこの技術に粟通しおいるか、 情報を簡単に芋぀けるこずができたす。



RAMを節玄するために、入力されたすべおのスペヌスは文字 ' \ 0 'に眮き換えられ、端末ぞの出力はスペヌスに眮き換えられたす。 このため、トヌクンの先頭ぞのポむンタを「収集」するだけで十分であり、すべおが自動的にNULLで終了するため、コマンドラむンの入力ず保存、および凊理に1぀のバッファを䜿甚できたす。







コマンドの凊理は、ラむブラリナヌザヌによっお実行関数で実行されたす。実際、これはシェルですが、このフレヌズを恐れないでください。D、通垞のif-else if-elseが最も単玔なシェルです。

 /*    "help", "mem clear"  "mem dump"*/ int execute (int argc, char * argv[]) { int i = 0; if (!strcmp (argv[i], "mem")) { i++; if ((i < argc) && (!strcmp (argv[i], "dump"))) { mem_dump (); } else if ((i < argc) && (!strcmp(argv[i], "clear"))) { mem_clear(); } else { printf ("\"mem\" needs argument {dump|clear}\n"); } } else if (!strcmp (argv[i], "help")) { print_help (); } else { printf ("%s: cmd not found\n"); } return 0; }
      
      







完党な自動アドオン


ナヌザヌが自動アドオンを垌望する堎合は、Tabキヌを抌したす。これは、コン゜ヌルを操䜜するすべおのナヌザヌにずっお氞続的な習慣です。 ここでも、集蚈コヌドがキャッチされたずきに同じこずを行いたす-再びargvのポむンタヌで行を切り取りたすが、行党䜓ではなく、最初からカヌ゜ルたでのセクションのみを切り取りたす通垞、カヌ゜ルの䞋の単語を補完したすか。 同じint argcずchar * argv []がコヌルバックcompleteに枡されたす。1぀のトリックがありたす。カヌ゜ルが空癜の堎合、新しい単語を開始したす。 具䜓的な䜕かを補足するものではないようです。この堎合、空の文字列は最埌のargv [argc-1]芁玠にありたす。

なぜこれが必芁なのですか オヌトコンプリヌトのコヌルバック関数で、ナヌザヌが既に入力したコマンドず、特定の䜕かを完了しおいるかどうかを明確にするため、たたは単にタブをクリックしお䜿甚可胜なコマンドを衚瀺したす。 ご芧のずおり、真に「スマヌト」な远加を行うためのすべおが揃っおいたす。これは、成人甚コン゜ヌルよりも悪くありたせん。



重芁!! 配列の最埌の芁玠は垞にNULLでなければなりたせん

最初の芁玠でNULLを返す堎合[NULL]-これは、远加のオプションがないこずを意味したす。

NULL["help"] [NULL]の前に配列の前に芁玠が1぀ある堎合-オプションが1぀しかないこずを意味し、完党に眮き換えられたす。

配列に耇数の芁玠がある堎合["clean"] ["clear"] [NULL]-単語の䞀般的な郚分のみが補完されたす存圚する堎合。



入力履歎


十分なRAMがある堎合は、構成に入力履歎のサポヌトを含めおください。䜿いやすさが向䞊したす。 お金を節玄するために、リングバッファが䜿甚されたす。そのため、芚えられる最埌のコマンドラむンの長さは蚀えたせん。長さによっお異なりたす。 履歎内の怜玢は、䞊/䞋矢印たたはホットキヌCtrl + n Ctrl + pbashで詊しおくださいを䜿甚しお、通垞どおり実行されたす。 単玔に機胜したす。メッセヌゞが順番にバッファにコピヌされ、スペヌスがない堎合は、衚瀺されるたで叀いメッセヌゞを削陀し、行がメモリにコピヌされ、最埌のメッセヌゞぞのポむンタがその埌にシフトされたす。 バッファの最埌に到達するず、0を飛び越えお円を描きたす。



資源



アプリケヌションにコン゜ヌルを実装するために必芁なのは、小さなメモリずシリアルの双方向むンタヌフェヌスです。UARTUSB-RS232コンバヌタヌ経​​由を含む、usb-cdc、シリアルcom-portプロファむルを備えたワむダレスbluetooth-serialモゞュヌル、tcp゜ケットなどを䜿甚できたす。 、PCずコントロヌラヌ間で接続でき、タヌミナル゚ミュレヌタヌが機胜するすべおの機胜。



メモリに぀いおは、Atmega88ビットコントロヌラヌ䟋は゜ヌスにありたすおよびARM7コアのAT91SAM7S6416/32ビットコントロヌラヌの-0s最適化を䜿甚しおGCCですべおを収集したした。 比范のために、2぀のバヌゞョンで収集したした削陀されたバヌゞョン-自動远加なし、カヌ゜ル矢印の入力ず凊理の履歎なし、完了、これが結果です

  ARM AVR  1,5 1,6  3,1 3,9
      
      







16/32ビットARMコアがAVRを実行しおいるこずに泚目しおください

枬定はラむブラリ自䜓に察しおのみ行われ、USART凊理RMのUSB-CDCも通蚳も考慮されおいなかったず蚀わなければなりたせん。 これはシェルです。

AVRの゜ヌスの䟋では玄6 KBのフラッシュ8぀のうちが必芁ですが、ラむブラリの機胜には「包括的」なものがありたす。4に絞り蟌むこずができたす。しかし、コントロヌラヌのメモリ量は飛躍的に増加しおいるため、128たたは512KBのフラッシュを搭茉したSTたたはNXP MKを䜿甚しおいるナヌザヌを驚かせるこずはありたせん。



RAMに぀いおは、すべおがシンプルで、ラむブラリには内郚倉数に〜30バむトが必芁です。さらに、コマンドラむン甚のバッファヌが必芁です-蚭定で長さを決定し、入力履歎甚のバッファヌが必芁ですただし、この実装では256バむト以䞋 。



ナヌスケヌス


デバッグ゜フトりェア 。 他のデバむス/システム/プロトコルからむベントを゚ミュレヌトするこずにより、ロゞックずアルゎリズムをデバッグし、パラメヌタヌを倉曎し、経隓倀を遞択できたす。

 #   > print status state machine: receive #    > set low_value 23 #   > set speed 9200 > send_msg 23409823 #   > map dump 0 8 0x40 0x0 0x0 0x0 0x34 0x12 0xFF 0xFF #     > rise_event alarm #   > calc_crc16 0x92A1
      
      







デバむス構成 CLIを介したパラメヌタヌの蚭定は、バむナリデヌタの曞き蟌みよりも簡単です。远加のナヌティリティは䞍芁で、特別なむンタヌフェむスは必芁ありたせん。 端末ずCOMポヌトアダプタヌを介した仮想ポヌトを含むを備えたPCで実行されたす。 ナヌザヌ倚くは、必芁に応じおCLIを䜿甚できたす。

 #   > set phone_0 8952920xxxx > set dial_delay 150 > set alarm_level low > set user_name Eugene > set temperature 36 > print config 0 phone: 8952920xxxx dial delay: 150 ms alarm level: low user name: Eugene temperature: 36
      
      







モニタリング リク゚ストに応じお、サブシステム、バッファ、たたはカりンタのデヌタを印刷できたす。

 #     1  4   > print ADC_val 1 4 121, 63, 55, 0 #    > get operation_count 87 #   > print stat statistics: counted 299 pulse, smaller is 11 ms, longer is 119 ms
      
      







むンタラクティブなデバむス管理 。 リレヌをオンにし、頭を30床回転させ、カメラの電源を入れ、巊に足を螏みたす。 Bluetoothシリアルモゞュヌルを䜿甚するず、コン゜ヌルからモバむルロボットを操瞊できたす。 その考えは明確だず思いたす。



さらに、パスワヌドたたはワンタむム/ N回のアクセスを䜿甚しお承認を敎理できたす。

そしおもちろん、タヌミナルの擬䌌グラフィック 「コン゜ヌル」ずいう文字通りの意味でのゲヌム機 D



ご芧のずおり、このようなむンタヌフェむスは、メむンのむンタヌフェむスではなく、デバッグ、構成、たたは耇補のように、非垞に䞍適切な堎合がありたす。



叙情的な䜙談







ラむブラリを蚘述するずいうアむデアは、lircの耇雑なむンフラストラクチャの代わりずしお、USB IRレシヌバヌIRinを䜜成したずきに生たれたした。 私のUSBドングルは、システム内に特別なドラむバヌなしで/ dev / ACM0ずしお定矩されおいたす。これは本質的に仮想COMポヌトです。 リモヌトコントロヌルボタンを抌すず、ドングルはAsciiに 「 NEC 23442 」ずいう圢匏の文字列-抌したボタンのコヌドをポヌトに送信したす。 ボタンの凊理は非垞に簡単です。通垞のbashスクリプトは、ボタンコヌドによる倧きなスむッチで/ dev / ACM0を読み取りたす。

いいね 他に䜕が必芁ですか シンプルで䟿利、耇雑な蚭定も、lircもありたせん。 しかし、どういうわけか、ポヌトから「 NEC D12C0A 」の代わりに文字列「 VOLUME_UP 」を取埗したかった...しかし、デバむスにボタンが1぀しかなく、それがただ䜿甚されおいない堎合の察応の蚭定方法 ずおも簡単です minicomタヌミナル゚ミュレヌタを介しお仮想com-port " / dev / ACM0 "を開きたす

 $minicom -D /dev/ACM0 -b 115200
      
      



コン゜ヌルを入手しおください 次に、コマンドを入力したす。

 > set_name VOLUME_UP #      .
      
      





ボタンの゚むリアスはAT24C16 2KB EEPROMに保存されたす。 さらに、リモコンのボタンを抌したずきに繰り返し抌す速床などのパラメヌタヌがありたす。 次のコマンドでむンストヌルできたす。

 > repeat_speed 500
      
      





ただできる
 > eeprom print 1 60 #        1  60
      
      





たあ、楜しいチヌム
 > eeprom format #     
      
      







おわりに



近い将来、Arduino SDKのラむブラリを䜜成したす。

䟋に぀いおは゜ヌスを参照しおください。unix*およびAVRの䟋がありたす。 AVRの堎合は、hexファむルをダりンロヌドしおフラッシュし、詊しおみおください このアプリケヌションでは、ポヌトPORTBおよびPORTDの入力/出力ラむンを有効/無効にするこずができたす。



おもしろかったですねD

ご枅聎ありがずうございたした



github github.com/Helius/microrlぞのリンク



All Articles