Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
NTShell/src/ntshell.c@3:3d952c65f560, 2015-04-14 (annotated)
- Committer:
- kcy
- Date:
- Tue Apr 14 08:38:12 2015 +0000
- Revision:
- 3:3d952c65f560
- Parent:
- 0:4d2c4db9c88e
add show CPU information
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kcy | 0:4d2c4db9c88e | 1 | /** |
kcy | 0:4d2c4db9c88e | 2 | * @file ntshell.c |
kcy | 0:4d2c4db9c88e | 3 | * @author Shinichiro Nakamura |
kcy | 0:4d2c4db9c88e | 4 | * @brief 小規模組み込みシステム向けのシェルシステムの実装。 |
kcy | 0:4d2c4db9c88e | 5 | */ |
kcy | 0:4d2c4db9c88e | 6 | |
kcy | 0:4d2c4db9c88e | 7 | /* |
kcy | 0:4d2c4db9c88e | 8 | * =============================================================== |
kcy | 0:4d2c4db9c88e | 9 | * Natural Tiny Shell (NT-Shell) |
kcy | 0:4d2c4db9c88e | 10 | * =============================================================== |
kcy | 0:4d2c4db9c88e | 11 | * Copyright (c) 2010-2012 Shinichiro Nakamura |
kcy | 0:4d2c4db9c88e | 12 | * |
kcy | 0:4d2c4db9c88e | 13 | * Permission is hereby granted, free of charge, to any person |
kcy | 0:4d2c4db9c88e | 14 | * obtaining a copy of this software and associated documentation |
kcy | 0:4d2c4db9c88e | 15 | * files (the "Software"), to deal in the Software without |
kcy | 0:4d2c4db9c88e | 16 | * restriction, including without limitation the rights to use, |
kcy | 0:4d2c4db9c88e | 17 | * copy, modify, merge, publish, distribute, sublicense, and/or |
kcy | 0:4d2c4db9c88e | 18 | * sell copies of the Software, and to permit persons to whom the |
kcy | 0:4d2c4db9c88e | 19 | * Software is furnished to do so, subject to the following |
kcy | 0:4d2c4db9c88e | 20 | * conditions: |
kcy | 0:4d2c4db9c88e | 21 | * |
kcy | 0:4d2c4db9c88e | 22 | * The above copyright notice and this permission notice shall be |
kcy | 0:4d2c4db9c88e | 23 | * included in all copies or substantial portions of the Software. |
kcy | 0:4d2c4db9c88e | 24 | * |
kcy | 0:4d2c4db9c88e | 25 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
kcy | 0:4d2c4db9c88e | 26 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES |
kcy | 0:4d2c4db9c88e | 27 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
kcy | 0:4d2c4db9c88e | 28 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT |
kcy | 0:4d2c4db9c88e | 29 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |
kcy | 0:4d2c4db9c88e | 30 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
kcy | 0:4d2c4db9c88e | 31 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
kcy | 0:4d2c4db9c88e | 32 | * OTHER DEALINGS IN THE SOFTWARE. |
kcy | 0:4d2c4db9c88e | 33 | * =============================================================== |
kcy | 0:4d2c4db9c88e | 34 | */ |
kcy | 0:4d2c4db9c88e | 35 | |
kcy | 0:4d2c4db9c88e | 36 | #include "ntshell.h" |
kcy | 0:4d2c4db9c88e | 37 | #include "ntlibc.h" |
kcy | 0:4d2c4db9c88e | 38 | |
kcy | 0:4d2c4db9c88e | 39 | #define VERSION_MAJOR 0 /**< メジャー番号。 */ |
kcy | 0:4d2c4db9c88e | 40 | #define VERSION_MINOR 2 /**< マイナー番号。 */ |
kcy | 0:4d2c4db9c88e | 41 | #define VERSION_RELEASE 0 /**< リリース番号。 */ |
kcy | 0:4d2c4db9c88e | 42 | |
kcy | 0:4d2c4db9c88e | 43 | #define INITCODE (0x4367) /**< 初期化確認コード。 */ |
kcy | 0:4d2c4db9c88e | 44 | |
kcy | 0:4d2c4db9c88e | 45 | /** |
kcy | 0:4d2c4db9c88e | 46 | * @brief 未使用変数宣言。 |
kcy | 0:4d2c4db9c88e | 47 | * |
kcy | 0:4d2c4db9c88e | 48 | * @param N 未使用変数。 |
kcy | 0:4d2c4db9c88e | 49 | */ |
kcy | 0:4d2c4db9c88e | 50 | #define UNUSED_VARIABLE(N) do { (void)(N); } while (0) |
kcy | 0:4d2c4db9c88e | 51 | |
kcy | 0:4d2c4db9c88e | 52 | /** |
kcy | 0:4d2c4db9c88e | 53 | * @brief サジェストのインデックス番号。 |
kcy | 0:4d2c4db9c88e | 54 | * |
kcy | 0:4d2c4db9c88e | 55 | * @param HANDLE ハンドル。 |
kcy | 0:4d2c4db9c88e | 56 | */ |
kcy | 0:4d2c4db9c88e | 57 | #define SUGGEST_INDEX(HANDLE) ((HANDLE)->suggest_index) |
kcy | 0:4d2c4db9c88e | 58 | |
kcy | 0:4d2c4db9c88e | 59 | /** |
kcy | 0:4d2c4db9c88e | 60 | * @brief サジェストのソース文字列。 |
kcy | 0:4d2c4db9c88e | 61 | * |
kcy | 0:4d2c4db9c88e | 62 | * @param HANDLE ハンドル。 |
kcy | 0:4d2c4db9c88e | 63 | */ |
kcy | 0:4d2c4db9c88e | 64 | #define SUGGEST_SOURCE(HANDLE) ((HANDLE)->suggest_source) |
kcy | 0:4d2c4db9c88e | 65 | |
kcy | 0:4d2c4db9c88e | 66 | /** |
kcy | 0:4d2c4db9c88e | 67 | * @brief テキストエディタを取得する。 |
kcy | 0:4d2c4db9c88e | 68 | * |
kcy | 0:4d2c4db9c88e | 69 | * @param HANDLE ハンドル。 |
kcy | 0:4d2c4db9c88e | 70 | */ |
kcy | 0:4d2c4db9c88e | 71 | #define GET_EDITOR(HANDLE) (&((HANDLE)->editor)) |
kcy | 0:4d2c4db9c88e | 72 | |
kcy | 0:4d2c4db9c88e | 73 | /** |
kcy | 0:4d2c4db9c88e | 74 | * @brief テキストヒストリを取得する。 |
kcy | 0:4d2c4db9c88e | 75 | * |
kcy | 0:4d2c4db9c88e | 76 | * @param HANDLE ハンドル。 |
kcy | 0:4d2c4db9c88e | 77 | */ |
kcy | 0:4d2c4db9c88e | 78 | #define GET_HISTORY(HANDLE) (&((HANDLE)->history)) |
kcy | 0:4d2c4db9c88e | 79 | |
kcy | 0:4d2c4db9c88e | 80 | /** |
kcy | 0:4d2c4db9c88e | 81 | * @brief シリアルポートから読み込む。 |
kcy | 0:4d2c4db9c88e | 82 | * |
kcy | 0:4d2c4db9c88e | 83 | * @param HANDLE ハンドル。 |
kcy | 0:4d2c4db9c88e | 84 | * @param BUF 読み込みバッファ。 |
kcy | 0:4d2c4db9c88e | 85 | * @param CNT 読み込み文字数。 |
kcy | 0:4d2c4db9c88e | 86 | * |
kcy | 0:4d2c4db9c88e | 87 | * @return 実際に読み込んだ文字数。 |
kcy | 0:4d2c4db9c88e | 88 | */ |
kcy | 0:4d2c4db9c88e | 89 | #define SERIAL_READ(HANDLE, BUF, CNT) ((HANDLE)->func_read(BUF, CNT, (HANDLE)->extobj)) |
kcy | 0:4d2c4db9c88e | 90 | |
kcy | 0:4d2c4db9c88e | 91 | /** |
kcy | 0:4d2c4db9c88e | 92 | * @brief シリアルポートへ書き込む。 |
kcy | 0:4d2c4db9c88e | 93 | * |
kcy | 0:4d2c4db9c88e | 94 | * @param HANDLE ハンドル。 |
kcy | 0:4d2c4db9c88e | 95 | * @param BUF 書き込みバッファ。 |
kcy | 0:4d2c4db9c88e | 96 | * @param CNT 書き込み文字数。 |
kcy | 0:4d2c4db9c88e | 97 | * |
kcy | 0:4d2c4db9c88e | 98 | * @return 実際に書き込んだ文字数。 |
kcy | 0:4d2c4db9c88e | 99 | */ |
kcy | 0:4d2c4db9c88e | 100 | #define SERIAL_WRITE(HANDLE, BUF, CNT) ((HANDLE)->func_write(BUF, CNT, (HANDLE)->extobj)) |
kcy | 0:4d2c4db9c88e | 101 | |
kcy | 0:4d2c4db9c88e | 102 | /** |
kcy | 0:4d2c4db9c88e | 103 | * @brief シリアルポートへプロンプトを書き込む。 |
kcy | 0:4d2c4db9c88e | 104 | * |
kcy | 0:4d2c4db9c88e | 105 | * @param HANDLE ハンドル。 |
kcy | 0:4d2c4db9c88e | 106 | */ |
kcy | 0:4d2c4db9c88e | 107 | #define PROMPT_WRITE(HANDLE) SERIAL_WRITE((HANDLE), (HANDLE)->prompt, ntlibc_strlen((HANDLE)->prompt)) |
kcy | 0:4d2c4db9c88e | 108 | |
kcy | 0:4d2c4db9c88e | 109 | /** |
kcy | 0:4d2c4db9c88e | 110 | * @brief シリアルポートへ改行を書き込む。 |
kcy | 0:4d2c4db9c88e | 111 | * |
kcy | 0:4d2c4db9c88e | 112 | * @param HANDLE ハンドル。 |
kcy | 0:4d2c4db9c88e | 113 | */ |
kcy | 0:4d2c4db9c88e | 114 | #define PROMPT_NEWLINE(HANDLE) SERIAL_WRITE((HANDLE), NTSHELL_PROMPT_NEWLINE, ntlibc_strlen(NTSHELL_PROMPT_NEWLINE)) |
kcy | 0:4d2c4db9c88e | 115 | |
kcy | 0:4d2c4db9c88e | 116 | /** |
kcy | 0:4d2c4db9c88e | 117 | * @brief コールバックを呼び出す。 |
kcy | 0:4d2c4db9c88e | 118 | * |
kcy | 0:4d2c4db9c88e | 119 | * @param HANDLE ハンドル。 |
kcy | 0:4d2c4db9c88e | 120 | * @param TEXT コールバック関数へ渡す文字列。 |
kcy | 0:4d2c4db9c88e | 121 | */ |
kcy | 0:4d2c4db9c88e | 122 | #define CALLBACK(HANDLE, TEXT) ((HANDLE)->func_callback((TEXT), (HANDLE)->extobj)) |
kcy | 0:4d2c4db9c88e | 123 | |
kcy | 0:4d2c4db9c88e | 124 | #define VTSEND_ERASE_LINE(HANDLE) (vtsend_erase_line(&((HANDLE)->vtsend))) |
kcy | 0:4d2c4db9c88e | 125 | #define VTSEND_CURSOR_HEAD(HANDLE) (vtsend_cursor_backward(&((HANDLE)->vtsend), 80)) |
kcy | 0:4d2c4db9c88e | 126 | #define VTSEND_CURSOR_PREV(HANDLE) (vtsend_cursor_backward(&((HANDLE)->vtsend), 1)) |
kcy | 0:4d2c4db9c88e | 127 | #define VTSEND_CURSOR_NEXT(HANDLE) (vtsend_cursor_forward(&((HANDLE)->vtsend), 1)) |
kcy | 0:4d2c4db9c88e | 128 | |
kcy | 0:4d2c4db9c88e | 129 | /** |
kcy | 0:4d2c4db9c88e | 130 | * @brief テキストヒストリで1つ後ろを辿る。 |
kcy | 0:4d2c4db9c88e | 131 | * @details |
kcy | 0:4d2c4db9c88e | 132 | * 論理上のテキスト編集装置内でのテキスト編集と編集結果をビューの更新を行なう。 |
kcy | 0:4d2c4db9c88e | 133 | * text_editorは論理上のテキスト編集装置であり、ビューに関して一切感知しない。 |
kcy | 0:4d2c4db9c88e | 134 | * |
kcy | 0:4d2c4db9c88e | 135 | * @param ntshell ハンドラ。 |
kcy | 0:4d2c4db9c88e | 136 | * @param action アクション。 |
kcy | 0:4d2c4db9c88e | 137 | * @param ch 入力文字。 |
kcy | 0:4d2c4db9c88e | 138 | */ |
kcy | 0:4d2c4db9c88e | 139 | static void actfunc_history_prev(ntshell_t *ntshell, vtrecv_action_t action, unsigned char ch) |
kcy | 0:4d2c4db9c88e | 140 | { |
kcy | 0:4d2c4db9c88e | 141 | UNUSED_VARIABLE(action); |
kcy | 0:4d2c4db9c88e | 142 | UNUSED_VARIABLE(ch); |
kcy | 0:4d2c4db9c88e | 143 | if (text_history_read_point_prev(GET_HISTORY(ntshell))) { |
kcy | 0:4d2c4db9c88e | 144 | char txt[TEXTHISTORY_MAXLEN]; |
kcy | 0:4d2c4db9c88e | 145 | int n = text_history_read(GET_HISTORY(ntshell), &txt[0], sizeof(txt)); |
kcy | 0:4d2c4db9c88e | 146 | if (0 < n) { |
kcy | 0:4d2c4db9c88e | 147 | VTSEND_ERASE_LINE(ntshell); |
kcy | 0:4d2c4db9c88e | 148 | VTSEND_CURSOR_HEAD(ntshell); |
kcy | 0:4d2c4db9c88e | 149 | PROMPT_WRITE(ntshell); |
kcy | 0:4d2c4db9c88e | 150 | SERIAL_WRITE(ntshell, txt, n); |
kcy | 0:4d2c4db9c88e | 151 | text_editor_set_text(GET_EDITOR(ntshell), txt); |
kcy | 0:4d2c4db9c88e | 152 | } |
kcy | 0:4d2c4db9c88e | 153 | } |
kcy | 0:4d2c4db9c88e | 154 | } |
kcy | 0:4d2c4db9c88e | 155 | |
kcy | 0:4d2c4db9c88e | 156 | /** |
kcy | 0:4d2c4db9c88e | 157 | * @brief テキストヒストリで1つ前を辿る。 |
kcy | 0:4d2c4db9c88e | 158 | * @details |
kcy | 0:4d2c4db9c88e | 159 | * 論理上のテキスト編集装置内でのテキスト編集と編集結果をビューの更新を行なう。 |
kcy | 0:4d2c4db9c88e | 160 | * text_editorは論理上のテキスト編集装置であり、ビューに関して一切感知しない。 |
kcy | 0:4d2c4db9c88e | 161 | * |
kcy | 0:4d2c4db9c88e | 162 | * @param ntshell ハンドラ。 |
kcy | 0:4d2c4db9c88e | 163 | * @param action アクション。 |
kcy | 0:4d2c4db9c88e | 164 | * @param ch 入力文字。 |
kcy | 0:4d2c4db9c88e | 165 | */ |
kcy | 0:4d2c4db9c88e | 166 | static void actfunc_history_next(ntshell_t *ntshell, vtrecv_action_t action, unsigned char ch) |
kcy | 0:4d2c4db9c88e | 167 | { |
kcy | 0:4d2c4db9c88e | 168 | UNUSED_VARIABLE(action); |
kcy | 0:4d2c4db9c88e | 169 | UNUSED_VARIABLE(ch); |
kcy | 0:4d2c4db9c88e | 170 | if (text_history_read_point_next(GET_HISTORY(ntshell))) { |
kcy | 0:4d2c4db9c88e | 171 | char txt[TEXTHISTORY_MAXLEN]; |
kcy | 0:4d2c4db9c88e | 172 | int n = text_history_read(GET_HISTORY(ntshell), &txt[0], sizeof(txt)); |
kcy | 0:4d2c4db9c88e | 173 | if (0 < n) { |
kcy | 0:4d2c4db9c88e | 174 | VTSEND_ERASE_LINE(ntshell); |
kcy | 0:4d2c4db9c88e | 175 | VTSEND_CURSOR_HEAD(ntshell); |
kcy | 0:4d2c4db9c88e | 176 | PROMPT_WRITE(ntshell); |
kcy | 0:4d2c4db9c88e | 177 | SERIAL_WRITE(ntshell, txt, n); |
kcy | 0:4d2c4db9c88e | 178 | text_editor_set_text(GET_EDITOR(ntshell), txt); |
kcy | 0:4d2c4db9c88e | 179 | } |
kcy | 0:4d2c4db9c88e | 180 | } |
kcy | 0:4d2c4db9c88e | 181 | } |
kcy | 0:4d2c4db9c88e | 182 | |
kcy | 0:4d2c4db9c88e | 183 | /** |
kcy | 0:4d2c4db9c88e | 184 | * @brief カーソルを左へ移動させる。 |
kcy | 0:4d2c4db9c88e | 185 | * @details |
kcy | 0:4d2c4db9c88e | 186 | * 論理上のテキスト編集装置内でのテキスト編集と編集結果をビューの更新を行なう。 |
kcy | 0:4d2c4db9c88e | 187 | * text_editorは論理上のテキスト編集装置であり、ビューに関して一切感知しない。 |
kcy | 0:4d2c4db9c88e | 188 | * |
kcy | 0:4d2c4db9c88e | 189 | * @param ntshell ハンドラ。 |
kcy | 0:4d2c4db9c88e | 190 | * @param action アクション。 |
kcy | 0:4d2c4db9c88e | 191 | * @param ch 入力文字。 |
kcy | 0:4d2c4db9c88e | 192 | */ |
kcy | 0:4d2c4db9c88e | 193 | static void actfunc_cursor_left(ntshell_t *ntshell, vtrecv_action_t action, unsigned char ch) |
kcy | 0:4d2c4db9c88e | 194 | { |
kcy | 0:4d2c4db9c88e | 195 | UNUSED_VARIABLE(action); |
kcy | 0:4d2c4db9c88e | 196 | UNUSED_VARIABLE(ch); |
kcy | 0:4d2c4db9c88e | 197 | if (text_editor_cursor_left(GET_EDITOR(ntshell))) { |
kcy | 0:4d2c4db9c88e | 198 | VTSEND_CURSOR_PREV(ntshell); |
kcy | 0:4d2c4db9c88e | 199 | } |
kcy | 0:4d2c4db9c88e | 200 | } |
kcy | 0:4d2c4db9c88e | 201 | |
kcy | 0:4d2c4db9c88e | 202 | /** |
kcy | 0:4d2c4db9c88e | 203 | * @brief カーソルを右へ移動させる。 |
kcy | 0:4d2c4db9c88e | 204 | * @details |
kcy | 0:4d2c4db9c88e | 205 | * 論理上のテキスト編集装置内でのテキスト編集と編集結果をビューの更新を行なう。 |
kcy | 0:4d2c4db9c88e | 206 | * text_editorは論理上のテキスト編集装置であり、ビューに関して一切感知しない。 |
kcy | 0:4d2c4db9c88e | 207 | * |
kcy | 0:4d2c4db9c88e | 208 | * @param ntshell ハンドラ。 |
kcy | 0:4d2c4db9c88e | 209 | * @param action アクション。 |
kcy | 0:4d2c4db9c88e | 210 | * @param ch 入力文字。 |
kcy | 0:4d2c4db9c88e | 211 | */ |
kcy | 0:4d2c4db9c88e | 212 | static void actfunc_cursor_right(ntshell_t *ntshell, vtrecv_action_t action, unsigned char ch) |
kcy | 0:4d2c4db9c88e | 213 | { |
kcy | 0:4d2c4db9c88e | 214 | UNUSED_VARIABLE(action); |
kcy | 0:4d2c4db9c88e | 215 | UNUSED_VARIABLE(ch); |
kcy | 0:4d2c4db9c88e | 216 | if (text_editor_cursor_right(GET_EDITOR(ntshell))) { |
kcy | 0:4d2c4db9c88e | 217 | VTSEND_CURSOR_NEXT(ntshell); |
kcy | 0:4d2c4db9c88e | 218 | } |
kcy | 0:4d2c4db9c88e | 219 | } |
kcy | 0:4d2c4db9c88e | 220 | |
kcy | 0:4d2c4db9c88e | 221 | /** |
kcy | 0:4d2c4db9c88e | 222 | * @brief エンターキーの処理を実行する。 |
kcy | 0:4d2c4db9c88e | 223 | * @details |
kcy | 0:4d2c4db9c88e | 224 | * 論理上のテキスト編集装置内でのテキスト編集と編集結果をビューの更新を行なう。 |
kcy | 0:4d2c4db9c88e | 225 | * text_editorは論理上のテキスト編集装置であり、ビューに関して一切感知しない。 |
kcy | 0:4d2c4db9c88e | 226 | * |
kcy | 0:4d2c4db9c88e | 227 | * @param ntshell ハンドラ。 |
kcy | 0:4d2c4db9c88e | 228 | * @param action アクション。 |
kcy | 0:4d2c4db9c88e | 229 | * @param ch 入力文字。 |
kcy | 0:4d2c4db9c88e | 230 | */ |
kcy | 0:4d2c4db9c88e | 231 | static void actfunc_enter(ntshell_t *ntshell, vtrecv_action_t action, unsigned char ch) |
kcy | 0:4d2c4db9c88e | 232 | { |
kcy | 0:4d2c4db9c88e | 233 | UNUSED_VARIABLE(action); |
kcy | 0:4d2c4db9c88e | 234 | UNUSED_VARIABLE(ch); |
kcy | 0:4d2c4db9c88e | 235 | char txt[TEXTEDITOR_MAXLEN]; |
kcy | 0:4d2c4db9c88e | 236 | text_editor_get_text(GET_EDITOR(ntshell), &txt[0], sizeof(txt)); |
kcy | 0:4d2c4db9c88e | 237 | text_editor_clear(GET_EDITOR(ntshell)); |
kcy | 0:4d2c4db9c88e | 238 | text_history_write(GET_HISTORY(ntshell), txt); |
kcy | 0:4d2c4db9c88e | 239 | PROMPT_NEWLINE(ntshell); |
kcy | 0:4d2c4db9c88e | 240 | CALLBACK(ntshell, txt); |
kcy | 0:4d2c4db9c88e | 241 | PROMPT_WRITE(ntshell); |
kcy | 0:4d2c4db9c88e | 242 | } |
kcy | 0:4d2c4db9c88e | 243 | |
kcy | 0:4d2c4db9c88e | 244 | /** |
kcy | 0:4d2c4db9c88e | 245 | * @brief キャンセルキーの処理を実行する。 |
kcy | 0:4d2c4db9c88e | 246 | * @details |
kcy | 0:4d2c4db9c88e | 247 | * 論理上のテキスト編集装置内でのテキスト編集と編集結果をビューの更新を行なう。 |
kcy | 0:4d2c4db9c88e | 248 | * text_editorは論理上のテキスト編集装置であり、ビューに関して一切感知しない。 |
kcy | 0:4d2c4db9c88e | 249 | * |
kcy | 0:4d2c4db9c88e | 250 | * 一般的なOSのCTRL+C処理はシグナルを発行し、受信したプロセスが |
kcy | 0:4d2c4db9c88e | 251 | * 中断処理を実行する。 |
kcy | 0:4d2c4db9c88e | 252 | * ここでのキャンセルは見た目を再現したもので、 |
kcy | 0:4d2c4db9c88e | 253 | * 入力中の文字列を破棄してカーソルを新しい入力に備えて復帰させるものだ。 |
kcy | 0:4d2c4db9c88e | 254 | * |
kcy | 0:4d2c4db9c88e | 255 | * @param ntshell ハンドラ。 |
kcy | 0:4d2c4db9c88e | 256 | * @param action アクション。 |
kcy | 0:4d2c4db9c88e | 257 | * @param ch 入力文字。 |
kcy | 0:4d2c4db9c88e | 258 | */ |
kcy | 0:4d2c4db9c88e | 259 | static void actfunc_cancel(ntshell_t *ntshell, vtrecv_action_t action, unsigned char ch) |
kcy | 0:4d2c4db9c88e | 260 | { |
kcy | 0:4d2c4db9c88e | 261 | UNUSED_VARIABLE(action); |
kcy | 0:4d2c4db9c88e | 262 | UNUSED_VARIABLE(ch); |
kcy | 0:4d2c4db9c88e | 263 | text_editor_clear(GET_EDITOR(ntshell)); |
kcy | 0:4d2c4db9c88e | 264 | SERIAL_WRITE(ntshell, "^C", 2); |
kcy | 0:4d2c4db9c88e | 265 | PROMPT_NEWLINE(ntshell); |
kcy | 0:4d2c4db9c88e | 266 | PROMPT_WRITE(ntshell); |
kcy | 0:4d2c4db9c88e | 267 | } |
kcy | 0:4d2c4db9c88e | 268 | |
kcy | 0:4d2c4db9c88e | 269 | /** |
kcy | 0:4d2c4db9c88e | 270 | * @brief 挿入処理を実行する。 |
kcy | 0:4d2c4db9c88e | 271 | * @details |
kcy | 0:4d2c4db9c88e | 272 | * 論理上のテキスト編集装置内でのテキスト編集と編集結果をビューの更新を行なう。 |
kcy | 0:4d2c4db9c88e | 273 | * text_editorは論理上のテキスト編集装置であり、ビューに関して一切感知しない。 |
kcy | 0:4d2c4db9c88e | 274 | * |
kcy | 0:4d2c4db9c88e | 275 | * @param ntshell ハンドラ。 |
kcy | 0:4d2c4db9c88e | 276 | * @param action アクション。 |
kcy | 0:4d2c4db9c88e | 277 | * @param ch 入力文字。 |
kcy | 0:4d2c4db9c88e | 278 | */ |
kcy | 0:4d2c4db9c88e | 279 | static void actfunc_insert(ntshell_t *ntshell, vtrecv_action_t action, unsigned char ch) |
kcy | 0:4d2c4db9c88e | 280 | { |
kcy | 0:4d2c4db9c88e | 281 | UNUSED_VARIABLE(action); |
kcy | 0:4d2c4db9c88e | 282 | /* |
kcy | 0:4d2c4db9c88e | 283 | * 入力があった場合、入力補完状態から抜ける。 |
kcy | 0:4d2c4db9c88e | 284 | */ |
kcy | 0:4d2c4db9c88e | 285 | SUGGEST_INDEX(ntshell) = -1; |
kcy | 0:4d2c4db9c88e | 286 | |
kcy | 0:4d2c4db9c88e | 287 | /* |
kcy | 0:4d2c4db9c88e | 288 | * テキストエディタを使って文字を文字列に挿入する。 |
kcy | 0:4d2c4db9c88e | 289 | */ |
kcy | 0:4d2c4db9c88e | 290 | if (text_editor_insert(GET_EDITOR(ntshell), ch)) { |
kcy | 0:4d2c4db9c88e | 291 | char txt[TEXTEDITOR_MAXLEN]; |
kcy | 0:4d2c4db9c88e | 292 | int len = text_editor_get_text(GET_EDITOR(ntshell), &txt[0], sizeof(txt)); |
kcy | 0:4d2c4db9c88e | 293 | int pos = text_editor_cursor_get_position(GET_EDITOR(ntshell)); |
kcy | 0:4d2c4db9c88e | 294 | int n = len - pos; |
kcy | 0:4d2c4db9c88e | 295 | SERIAL_WRITE(ntshell, (char *)&ch, sizeof(ch)); |
kcy | 0:4d2c4db9c88e | 296 | if (n > 0) { |
kcy | 0:4d2c4db9c88e | 297 | int i; |
kcy | 0:4d2c4db9c88e | 298 | SERIAL_WRITE(ntshell, txt + pos, len - pos); |
kcy | 0:4d2c4db9c88e | 299 | for (i = 0; i < n; i++) { |
kcy | 0:4d2c4db9c88e | 300 | VTSEND_CURSOR_PREV(ntshell); |
kcy | 0:4d2c4db9c88e | 301 | } |
kcy | 0:4d2c4db9c88e | 302 | } |
kcy | 0:4d2c4db9c88e | 303 | } |
kcy | 0:4d2c4db9c88e | 304 | } |
kcy | 0:4d2c4db9c88e | 305 | |
kcy | 0:4d2c4db9c88e | 306 | /** |
kcy | 0:4d2c4db9c88e | 307 | * @brief バックスペース処理を実行する。 |
kcy | 0:4d2c4db9c88e | 308 | * @details |
kcy | 0:4d2c4db9c88e | 309 | * 論理上のテキスト編集装置内でのテキスト編集と編集結果をビューの更新を行なう。 |
kcy | 0:4d2c4db9c88e | 310 | * text_editorは論理上のテキスト編集装置であり、ビューに関して一切感知しない。 |
kcy | 0:4d2c4db9c88e | 311 | * |
kcy | 0:4d2c4db9c88e | 312 | * @param ntshell ハンドラ。 |
kcy | 0:4d2c4db9c88e | 313 | * @param action アクション。 |
kcy | 0:4d2c4db9c88e | 314 | * @param ch 入力文字。 |
kcy | 0:4d2c4db9c88e | 315 | */ |
kcy | 0:4d2c4db9c88e | 316 | static void actfunc_backspace(ntshell_t *ntshell, vtrecv_action_t action, unsigned char ch) |
kcy | 0:4d2c4db9c88e | 317 | { |
kcy | 0:4d2c4db9c88e | 318 | UNUSED_VARIABLE(action); |
kcy | 0:4d2c4db9c88e | 319 | UNUSED_VARIABLE(ch); |
kcy | 0:4d2c4db9c88e | 320 | if (text_editor_backspace(GET_EDITOR(ntshell))) { |
kcy | 0:4d2c4db9c88e | 321 | char txt[TEXTEDITOR_MAXLEN]; |
kcy | 0:4d2c4db9c88e | 322 | int len = text_editor_get_text(GET_EDITOR(ntshell), &txt[0], sizeof(txt)); |
kcy | 0:4d2c4db9c88e | 323 | int pos = text_editor_cursor_get_position(GET_EDITOR(ntshell)); |
kcy | 0:4d2c4db9c88e | 324 | int n = len - pos; |
kcy | 0:4d2c4db9c88e | 325 | VTSEND_CURSOR_PREV(ntshell); |
kcy | 0:4d2c4db9c88e | 326 | if (n > 0) { |
kcy | 0:4d2c4db9c88e | 327 | int i; |
kcy | 0:4d2c4db9c88e | 328 | SERIAL_WRITE(ntshell, txt + pos, n); |
kcy | 0:4d2c4db9c88e | 329 | SERIAL_WRITE(ntshell, " ", 1); |
kcy | 0:4d2c4db9c88e | 330 | for (i = 0; i < n + 1; i++) { |
kcy | 0:4d2c4db9c88e | 331 | VTSEND_CURSOR_PREV(ntshell); |
kcy | 0:4d2c4db9c88e | 332 | } |
kcy | 0:4d2c4db9c88e | 333 | } else { |
kcy | 0:4d2c4db9c88e | 334 | SERIAL_WRITE(ntshell, " ", 1); |
kcy | 0:4d2c4db9c88e | 335 | VTSEND_CURSOR_PREV(ntshell); |
kcy | 0:4d2c4db9c88e | 336 | } |
kcy | 0:4d2c4db9c88e | 337 | } |
kcy | 0:4d2c4db9c88e | 338 | } |
kcy | 0:4d2c4db9c88e | 339 | |
kcy | 0:4d2c4db9c88e | 340 | /** |
kcy | 0:4d2c4db9c88e | 341 | * @brief デリート処理を実行する。 |
kcy | 0:4d2c4db9c88e | 342 | * @details |
kcy | 0:4d2c4db9c88e | 343 | * 論理上のテキスト編集装置内でのテキスト編集と編集結果をビューの更新を行なう。 |
kcy | 0:4d2c4db9c88e | 344 | * text_editorは論理上のテキスト編集装置であり、ビューに関して一切感知しない。 |
kcy | 0:4d2c4db9c88e | 345 | * |
kcy | 0:4d2c4db9c88e | 346 | * @param ntshell ハンドラ。 |
kcy | 0:4d2c4db9c88e | 347 | * @param action アクション。 |
kcy | 0:4d2c4db9c88e | 348 | * @param ch 入力文字。 |
kcy | 0:4d2c4db9c88e | 349 | */ |
kcy | 0:4d2c4db9c88e | 350 | static void actfunc_delete(ntshell_t *ntshell, vtrecv_action_t action, unsigned char ch) |
kcy | 0:4d2c4db9c88e | 351 | { |
kcy | 0:4d2c4db9c88e | 352 | UNUSED_VARIABLE(action); |
kcy | 0:4d2c4db9c88e | 353 | UNUSED_VARIABLE(ch); |
kcy | 0:4d2c4db9c88e | 354 | if (text_editor_delete(GET_EDITOR(ntshell))) { |
kcy | 0:4d2c4db9c88e | 355 | char txt[TEXTEDITOR_MAXLEN]; |
kcy | 0:4d2c4db9c88e | 356 | int len = text_editor_get_text(GET_EDITOR(ntshell), &txt[0], sizeof(txt)); |
kcy | 0:4d2c4db9c88e | 357 | int pos = text_editor_cursor_get_position(GET_EDITOR(ntshell)); |
kcy | 0:4d2c4db9c88e | 358 | int n = len - pos; |
kcy | 0:4d2c4db9c88e | 359 | if (n > 0) { |
kcy | 0:4d2c4db9c88e | 360 | int i; |
kcy | 0:4d2c4db9c88e | 361 | SERIAL_WRITE(ntshell, txt + pos, n); |
kcy | 0:4d2c4db9c88e | 362 | SERIAL_WRITE(ntshell, " ", 1); |
kcy | 0:4d2c4db9c88e | 363 | for (i = 0; i < n + 1; i++) { |
kcy | 0:4d2c4db9c88e | 364 | VTSEND_CURSOR_PREV(ntshell); |
kcy | 0:4d2c4db9c88e | 365 | } |
kcy | 0:4d2c4db9c88e | 366 | } else { |
kcy | 0:4d2c4db9c88e | 367 | SERIAL_WRITE(ntshell, " ", 1); |
kcy | 0:4d2c4db9c88e | 368 | VTSEND_CURSOR_PREV(ntshell); |
kcy | 0:4d2c4db9c88e | 369 | } |
kcy | 0:4d2c4db9c88e | 370 | } |
kcy | 0:4d2c4db9c88e | 371 | } |
kcy | 0:4d2c4db9c88e | 372 | |
kcy | 0:4d2c4db9c88e | 373 | /** |
kcy | 0:4d2c4db9c88e | 374 | * @brief 入力補完処理を実行する。 |
kcy | 0:4d2c4db9c88e | 375 | * @details |
kcy | 0:4d2c4db9c88e | 376 | * 論理上のテキスト編集装置内でのテキスト編集と編集結果をビューの更新を行なう。 |
kcy | 0:4d2c4db9c88e | 377 | * text_editorは論理上のテキスト編集装置であり、ビューに関して一切感知しない。 |
kcy | 0:4d2c4db9c88e | 378 | * |
kcy | 0:4d2c4db9c88e | 379 | * @param ntshell ハンドラ。 |
kcy | 0:4d2c4db9c88e | 380 | * @param action アクション。 |
kcy | 0:4d2c4db9c88e | 381 | * @param ch 入力文字。 |
kcy | 0:4d2c4db9c88e | 382 | */ |
kcy | 0:4d2c4db9c88e | 383 | static void actfunc_suggest(ntshell_t *ntshell, vtrecv_action_t action, unsigned char ch) |
kcy | 0:4d2c4db9c88e | 384 | { |
kcy | 0:4d2c4db9c88e | 385 | UNUSED_VARIABLE(action); |
kcy | 0:4d2c4db9c88e | 386 | UNUSED_VARIABLE(ch); |
kcy | 0:4d2c4db9c88e | 387 | char buf[TEXTEDITOR_MAXLEN]; |
kcy | 0:4d2c4db9c88e | 388 | if (SUGGEST_INDEX(ntshell) < 0) { |
kcy | 0:4d2c4db9c88e | 389 | /* |
kcy | 0:4d2c4db9c88e | 390 | * 入力補完モードにこれから入る場合。 |
kcy | 0:4d2c4db9c88e | 391 | * 現在の入力文字列を元に補完候補を取得する。 |
kcy | 0:4d2c4db9c88e | 392 | */ |
kcy | 0:4d2c4db9c88e | 393 | if (text_editor_get_text( |
kcy | 0:4d2c4db9c88e | 394 | GET_EDITOR(ntshell), |
kcy | 0:4d2c4db9c88e | 395 | SUGGEST_SOURCE(ntshell), |
kcy | 0:4d2c4db9c88e | 396 | sizeof(SUGGEST_SOURCE(ntshell))) > 0) { |
kcy | 0:4d2c4db9c88e | 397 | SUGGEST_INDEX(ntshell) = 0; |
kcy | 0:4d2c4db9c88e | 398 | if (text_history_find( |
kcy | 0:4d2c4db9c88e | 399 | GET_HISTORY(ntshell), |
kcy | 0:4d2c4db9c88e | 400 | SUGGEST_INDEX(ntshell), |
kcy | 0:4d2c4db9c88e | 401 | SUGGEST_SOURCE(ntshell), |
kcy | 0:4d2c4db9c88e | 402 | buf, |
kcy | 0:4d2c4db9c88e | 403 | sizeof(buf)) == 0) { |
kcy | 0:4d2c4db9c88e | 404 | // 候補が見つかればテキストを設定して、インデックスをメモする。 |
kcy | 0:4d2c4db9c88e | 405 | int n = ntlibc_strlen((const char *)buf); |
kcy | 0:4d2c4db9c88e | 406 | VTSEND_ERASE_LINE(ntshell); |
kcy | 0:4d2c4db9c88e | 407 | VTSEND_CURSOR_HEAD(ntshell); |
kcy | 0:4d2c4db9c88e | 408 | PROMPT_WRITE(ntshell); |
kcy | 0:4d2c4db9c88e | 409 | SERIAL_WRITE(ntshell, buf, n); |
kcy | 0:4d2c4db9c88e | 410 | text_editor_set_text(GET_EDITOR(ntshell), buf); |
kcy | 0:4d2c4db9c88e | 411 | } else { |
kcy | 0:4d2c4db9c88e | 412 | // 候補がなければ入力補完モードから抜ける。 |
kcy | 0:4d2c4db9c88e | 413 | SUGGEST_INDEX(ntshell) = -1; |
kcy | 0:4d2c4db9c88e | 414 | } |
kcy | 0:4d2c4db9c88e | 415 | } |
kcy | 0:4d2c4db9c88e | 416 | } else { |
kcy | 0:4d2c4db9c88e | 417 | /* |
kcy | 0:4d2c4db9c88e | 418 | * 既に入力補完モードに入っている場合、 |
kcy | 0:4d2c4db9c88e | 419 | * 次の候補を探して見つかればテキストとして設定する。 |
kcy | 0:4d2c4db9c88e | 420 | */ |
kcy | 0:4d2c4db9c88e | 421 | SUGGEST_INDEX(ntshell) = SUGGEST_INDEX(ntshell) + 1; |
kcy | 0:4d2c4db9c88e | 422 | if (text_history_find( |
kcy | 0:4d2c4db9c88e | 423 | GET_HISTORY(ntshell), |
kcy | 0:4d2c4db9c88e | 424 | SUGGEST_INDEX(ntshell), |
kcy | 0:4d2c4db9c88e | 425 | SUGGEST_SOURCE(ntshell), |
kcy | 0:4d2c4db9c88e | 426 | buf, |
kcy | 0:4d2c4db9c88e | 427 | sizeof(buf)) == 0) { |
kcy | 0:4d2c4db9c88e | 428 | // 候補が見つかればテキストを設定する。 |
kcy | 0:4d2c4db9c88e | 429 | int n = ntlibc_strlen((const char *)buf); |
kcy | 0:4d2c4db9c88e | 430 | VTSEND_ERASE_LINE(ntshell); |
kcy | 0:4d2c4db9c88e | 431 | VTSEND_CURSOR_HEAD(ntshell); |
kcy | 0:4d2c4db9c88e | 432 | PROMPT_WRITE(ntshell); |
kcy | 0:4d2c4db9c88e | 433 | SERIAL_WRITE(ntshell, buf, n); |
kcy | 0:4d2c4db9c88e | 434 | text_editor_set_text(GET_EDITOR(ntshell), buf); |
kcy | 0:4d2c4db9c88e | 435 | } else { |
kcy | 0:4d2c4db9c88e | 436 | // 候補が見つからなければ元の入力文字列に戻し、入力補完モードから抜ける。 |
kcy | 0:4d2c4db9c88e | 437 | int n = ntlibc_strlen(SUGGEST_SOURCE(ntshell)); |
kcy | 0:4d2c4db9c88e | 438 | VTSEND_ERASE_LINE(ntshell); |
kcy | 0:4d2c4db9c88e | 439 | VTSEND_CURSOR_HEAD(ntshell); |
kcy | 0:4d2c4db9c88e | 440 | PROMPT_WRITE(ntshell); |
kcy | 0:4d2c4db9c88e | 441 | SERIAL_WRITE(ntshell, SUGGEST_SOURCE(ntshell), n); |
kcy | 0:4d2c4db9c88e | 442 | text_editor_set_text(GET_EDITOR(ntshell), SUGGEST_SOURCE(ntshell)); |
kcy | 0:4d2c4db9c88e | 443 | SUGGEST_INDEX(ntshell) = -1; |
kcy | 0:4d2c4db9c88e | 444 | } |
kcy | 0:4d2c4db9c88e | 445 | } |
kcy | 0:4d2c4db9c88e | 446 | } |
kcy | 0:4d2c4db9c88e | 447 | |
kcy | 0:4d2c4db9c88e | 448 | /** |
kcy | 0:4d2c4db9c88e | 449 | * @brief カーソルを行頭へ移動させる。 |
kcy | 0:4d2c4db9c88e | 450 | * @details |
kcy | 0:4d2c4db9c88e | 451 | * 論理上のテキスト編集装置内でのテキスト編集と編集結果をビューの更新を行なう。 |
kcy | 0:4d2c4db9c88e | 452 | * text_editorは論理上のテキスト編集装置であり、ビューに関して一切感知しない。 |
kcy | 0:4d2c4db9c88e | 453 | * |
kcy | 0:4d2c4db9c88e | 454 | * @param ntshell ハンドラ。 |
kcy | 0:4d2c4db9c88e | 455 | * @param action アクション。 |
kcy | 0:4d2c4db9c88e | 456 | * @param ch 入力文字。 |
kcy | 0:4d2c4db9c88e | 457 | */ |
kcy | 0:4d2c4db9c88e | 458 | static void actfunc_cursor_head(ntshell_t *ntshell, vtrecv_action_t action, unsigned char ch) |
kcy | 0:4d2c4db9c88e | 459 | { |
kcy | 0:4d2c4db9c88e | 460 | UNUSED_VARIABLE(action); |
kcy | 0:4d2c4db9c88e | 461 | UNUSED_VARIABLE(ch); |
kcy | 0:4d2c4db9c88e | 462 | VTSEND_CURSOR_HEAD(ntshell); |
kcy | 0:4d2c4db9c88e | 463 | PROMPT_WRITE(ntshell); |
kcy | 0:4d2c4db9c88e | 464 | text_editor_cursor_head(GET_EDITOR(ntshell)); |
kcy | 0:4d2c4db9c88e | 465 | } |
kcy | 0:4d2c4db9c88e | 466 | |
kcy | 0:4d2c4db9c88e | 467 | /** |
kcy | 0:4d2c4db9c88e | 468 | * @brief カーソルを行末へ移動させる。 |
kcy | 0:4d2c4db9c88e | 469 | * @details |
kcy | 0:4d2c4db9c88e | 470 | * 論理上のテキスト編集装置内でのテキスト編集と編集結果をビューの更新を行なう。 |
kcy | 0:4d2c4db9c88e | 471 | * text_editorは論理上のテキスト編集装置であり、ビューに関して一切感知しない。 |
kcy | 0:4d2c4db9c88e | 472 | * |
kcy | 0:4d2c4db9c88e | 473 | * @param ntshell ハンドラ。 |
kcy | 0:4d2c4db9c88e | 474 | * @param action アクション。 |
kcy | 0:4d2c4db9c88e | 475 | * @param ch 入力文字。 |
kcy | 0:4d2c4db9c88e | 476 | */ |
kcy | 0:4d2c4db9c88e | 477 | static void actfunc_cursor_tail(ntshell_t *ntshell, vtrecv_action_t action, unsigned char ch) |
kcy | 0:4d2c4db9c88e | 478 | { |
kcy | 0:4d2c4db9c88e | 479 | char buf[TEXTEDITOR_MAXLEN]; |
kcy | 0:4d2c4db9c88e | 480 | int len; |
kcy | 0:4d2c4db9c88e | 481 | UNUSED_VARIABLE(action); |
kcy | 0:4d2c4db9c88e | 482 | UNUSED_VARIABLE(ch); |
kcy | 0:4d2c4db9c88e | 483 | text_editor_get_text(GET_EDITOR(ntshell), buf, sizeof(buf)); |
kcy | 0:4d2c4db9c88e | 484 | len = ntlibc_strlen((const char *)buf); |
kcy | 0:4d2c4db9c88e | 485 | VTSEND_CURSOR_HEAD(ntshell); |
kcy | 0:4d2c4db9c88e | 486 | PROMPT_WRITE(ntshell); |
kcy | 0:4d2c4db9c88e | 487 | SERIAL_WRITE(ntshell, buf, len); |
kcy | 0:4d2c4db9c88e | 488 | text_editor_cursor_tail(GET_EDITOR(ntshell)); |
kcy | 0:4d2c4db9c88e | 489 | } |
kcy | 0:4d2c4db9c88e | 490 | |
kcy | 0:4d2c4db9c88e | 491 | /** |
kcy | 0:4d2c4db9c88e | 492 | * @brief アクションテーブルのデータ構造体。 |
kcy | 0:4d2c4db9c88e | 493 | * @details |
kcy | 0:4d2c4db9c88e | 494 | * アクションは状態と入力文字によって与えられる。 |
kcy | 0:4d2c4db9c88e | 495 | * アクションに対する関数もここで定義する。 |
kcy | 0:4d2c4db9c88e | 496 | */ |
kcy | 0:4d2c4db9c88e | 497 | typedef struct { |
kcy | 0:4d2c4db9c88e | 498 | vtrecv_action_t action; |
kcy | 0:4d2c4db9c88e | 499 | unsigned char ch; |
kcy | 0:4d2c4db9c88e | 500 | void (*func)(ntshell_t *ntshell, vtrecv_action_t action, unsigned char ch); |
kcy | 0:4d2c4db9c88e | 501 | } ntshell_action_table_t; |
kcy | 0:4d2c4db9c88e | 502 | |
kcy | 0:4d2c4db9c88e | 503 | /** |
kcy | 0:4d2c4db9c88e | 504 | * @brief アクションに対する処理関数テーブル。 |
kcy | 0:4d2c4db9c88e | 505 | * @details |
kcy | 0:4d2c4db9c88e | 506 | * やってくるコードは仮想端末側の処理に依存する。 |
kcy | 0:4d2c4db9c88e | 507 | * よって様々なプラットフォームの様々な仮想端末で試すと良い。 |
kcy | 0:4d2c4db9c88e | 508 | * |
kcy | 0:4d2c4db9c88e | 509 | * <table> |
kcy | 0:4d2c4db9c88e | 510 | * <th> |
kcy | 0:4d2c4db9c88e | 511 | * <td>Platform</td> |
kcy | 0:4d2c4db9c88e | 512 | * <td>Tools</td> |
kcy | 0:4d2c4db9c88e | 513 | * </th> |
kcy | 0:4d2c4db9c88e | 514 | * <tr> |
kcy | 0:4d2c4db9c88e | 515 | * <td>Windows</td> |
kcy | 0:4d2c4db9c88e | 516 | * <td>Hyper Terminal, Poderossa, TeraTerm</td> |
kcy | 0:4d2c4db9c88e | 517 | * </tr> |
kcy | 0:4d2c4db9c88e | 518 | * <tr> |
kcy | 0:4d2c4db9c88e | 519 | * <td>Linux</td> |
kcy | 0:4d2c4db9c88e | 520 | * <td>minicom, screen, kermit</td> |
kcy | 0:4d2c4db9c88e | 521 | * </tr> |
kcy | 0:4d2c4db9c88e | 522 | * </table> |
kcy | 0:4d2c4db9c88e | 523 | */ |
kcy | 0:4d2c4db9c88e | 524 | static const ntshell_action_table_t action_table[] = { |
kcy | 0:4d2c4db9c88e | 525 | {VTRECV_ACTION_EXECUTE, 0x01, actfunc_cursor_head}, |
kcy | 0:4d2c4db9c88e | 526 | {VTRECV_ACTION_EXECUTE, 0x02, actfunc_cursor_left}, |
kcy | 0:4d2c4db9c88e | 527 | {VTRECV_ACTION_EXECUTE, 0x03, actfunc_cancel}, |
kcy | 0:4d2c4db9c88e | 528 | {VTRECV_ACTION_EXECUTE, 0x04, actfunc_delete}, |
kcy | 0:4d2c4db9c88e | 529 | {VTRECV_ACTION_EXECUTE, 0x05, actfunc_cursor_tail}, |
kcy | 0:4d2c4db9c88e | 530 | {VTRECV_ACTION_EXECUTE, 0x06, actfunc_cursor_right}, |
kcy | 0:4d2c4db9c88e | 531 | {VTRECV_ACTION_EXECUTE, 0x08, actfunc_backspace}, |
kcy | 0:4d2c4db9c88e | 532 | {VTRECV_ACTION_EXECUTE, 0x09, actfunc_suggest}, |
kcy | 0:4d2c4db9c88e | 533 | {VTRECV_ACTION_EXECUTE, 0x0d, actfunc_enter}, |
kcy | 0:4d2c4db9c88e | 534 | {VTRECV_ACTION_EXECUTE, 0x0e, actfunc_history_next}, |
kcy | 0:4d2c4db9c88e | 535 | {VTRECV_ACTION_EXECUTE, 0x10, actfunc_history_prev}, |
kcy | 0:4d2c4db9c88e | 536 | {VTRECV_ACTION_CSI_DISPATCH, 0x41, actfunc_history_prev}, |
kcy | 0:4d2c4db9c88e | 537 | {VTRECV_ACTION_CSI_DISPATCH, 0x42, actfunc_history_next}, |
kcy | 0:4d2c4db9c88e | 538 | {VTRECV_ACTION_CSI_DISPATCH, 0x43, actfunc_cursor_right}, |
kcy | 0:4d2c4db9c88e | 539 | {VTRECV_ACTION_CSI_DISPATCH, 0x44, actfunc_cursor_left}, |
kcy | 0:4d2c4db9c88e | 540 | {VTRECV_ACTION_CSI_DISPATCH, 0x7e, actfunc_delete}, |
kcy | 0:4d2c4db9c88e | 541 | {VTRECV_ACTION_PRINT, 0x7f, actfunc_delete}, |
kcy | 0:4d2c4db9c88e | 542 | }; |
kcy | 0:4d2c4db9c88e | 543 | |
kcy | 0:4d2c4db9c88e | 544 | /** |
kcy | 0:4d2c4db9c88e | 545 | * @brief パーサーに対するコールバック関数。 |
kcy | 0:4d2c4db9c88e | 546 | * @details vtrecvモジュールのコールバック関数に従った実装である。 |
kcy | 0:4d2c4db9c88e | 547 | * |
kcy | 0:4d2c4db9c88e | 548 | * @param vtrecv パーサー。 |
kcy | 0:4d2c4db9c88e | 549 | * @param action アクション。 |
kcy | 0:4d2c4db9c88e | 550 | * @param ch キャラクタ。 |
kcy | 0:4d2c4db9c88e | 551 | */ |
kcy | 0:4d2c4db9c88e | 552 | void vtrecv_callback(vtrecv_t *vtrecv, vtrecv_action_t action, unsigned char ch) |
kcy | 0:4d2c4db9c88e | 553 | { |
kcy | 0:4d2c4db9c88e | 554 | ntshell_action_table_t *p; |
kcy | 0:4d2c4db9c88e | 555 | int i; |
kcy | 0:4d2c4db9c88e | 556 | const int ACTTBLSIZ = sizeof(action_table) / sizeof(action_table[0]); |
kcy | 0:4d2c4db9c88e | 557 | |
kcy | 0:4d2c4db9c88e | 558 | /* |
kcy | 0:4d2c4db9c88e | 559 | * 制御コードに対する処理はテーブルから探す。 |
kcy | 0:4d2c4db9c88e | 560 | */ |
kcy | 0:4d2c4db9c88e | 561 | p = (ntshell_action_table_t *)action_table; |
kcy | 0:4d2c4db9c88e | 562 | for (i = 0; i < ACTTBLSIZ; i++) { |
kcy | 0:4d2c4db9c88e | 563 | if ((p->action == action) && (p->ch == ch)) { |
kcy | 0:4d2c4db9c88e | 564 | p->func(vtrecv->user_data, action, ch); |
kcy | 0:4d2c4db9c88e | 565 | return; |
kcy | 0:4d2c4db9c88e | 566 | } |
kcy | 0:4d2c4db9c88e | 567 | p++; |
kcy | 0:4d2c4db9c88e | 568 | } |
kcy | 0:4d2c4db9c88e | 569 | |
kcy | 0:4d2c4db9c88e | 570 | /* |
kcy | 0:4d2c4db9c88e | 571 | * 通常の文字列は入力として扱う。 |
kcy | 0:4d2c4db9c88e | 572 | */ |
kcy | 0:4d2c4db9c88e | 573 | if (VTRECV_ACTION_PRINT == action) { |
kcy | 0:4d2c4db9c88e | 574 | actfunc_insert(vtrecv->user_data, action, ch); |
kcy | 0:4d2c4db9c88e | 575 | return; |
kcy | 0:4d2c4db9c88e | 576 | } |
kcy | 0:4d2c4db9c88e | 577 | |
kcy | 0:4d2c4db9c88e | 578 | /* |
kcy | 0:4d2c4db9c88e | 579 | * ここに到達する場合、 |
kcy | 0:4d2c4db9c88e | 580 | * テーブルに含まれない制御コードか、 |
kcy | 0:4d2c4db9c88e | 581 | * 通常の文字でない事が考えられる。 |
kcy | 0:4d2c4db9c88e | 582 | * |
kcy | 0:4d2c4db9c88e | 583 | * 必要なキー入力に対する動作を加えたい場合、 |
kcy | 0:4d2c4db9c88e | 584 | * vtrecvによって得られるコードを調べるために |
kcy | 0:4d2c4db9c88e | 585 | * ここにテストコードを加える事ができる。 |
kcy | 0:4d2c4db9c88e | 586 | */ |
kcy | 0:4d2c4db9c88e | 587 | } |
kcy | 0:4d2c4db9c88e | 588 | |
kcy | 0:4d2c4db9c88e | 589 | /** |
kcy | 0:4d2c4db9c88e | 590 | * @brief Natural Tiny Shellを初期化する。 |
kcy | 0:4d2c4db9c88e | 591 | * |
kcy | 0:4d2c4db9c88e | 592 | * @param p NT-Shellハンドラ。 |
kcy | 0:4d2c4db9c88e | 593 | * @param func_read シリアルリード関数。 |
kcy | 0:4d2c4db9c88e | 594 | * @param func_write シリアルライト関数。 |
kcy | 0:4d2c4db9c88e | 595 | * @param func_callback コールバック関数。 |
kcy | 0:4d2c4db9c88e | 596 | * @param extobj コールバック関数呼び出し時に渡す拡張オブジェクト。 |
kcy | 0:4d2c4db9c88e | 597 | */ |
kcy | 0:4d2c4db9c88e | 598 | void ntshell_init(ntshell_t *p, |
kcy | 0:4d2c4db9c88e | 599 | NTSHELL_SERIAL_READ func_read, |
kcy | 0:4d2c4db9c88e | 600 | NTSHELL_SERIAL_WRITE func_write, |
kcy | 0:4d2c4db9c88e | 601 | NTSHELL_USER_CALLBACK func_callback, |
kcy | 0:4d2c4db9c88e | 602 | void *extobj) |
kcy | 0:4d2c4db9c88e | 603 | { |
kcy | 0:4d2c4db9c88e | 604 | /* |
kcy | 0:4d2c4db9c88e | 605 | * vtrecvはユーザデータへのポインタを設定できるようになっている。 |
kcy | 0:4d2c4db9c88e | 606 | * Natural Tiny Shellはこれを利用してテキストエディタやヒストリ、 |
kcy | 0:4d2c4db9c88e | 607 | * リード関数やライト関数、コールバック関数を処理の中で使用できる |
kcy | 0:4d2c4db9c88e | 608 | * ようにしてある。 |
kcy | 0:4d2c4db9c88e | 609 | */ |
kcy | 0:4d2c4db9c88e | 610 | p->func_read = func_read; |
kcy | 0:4d2c4db9c88e | 611 | p->func_write = func_write; |
kcy | 0:4d2c4db9c88e | 612 | p->func_callback = func_callback; |
kcy | 0:4d2c4db9c88e | 613 | p->extobj = extobj; |
kcy | 0:4d2c4db9c88e | 614 | ntlibc_strcpy(p->prompt, NTSHELL_PROMPT_DEFAULT); |
kcy | 0:4d2c4db9c88e | 615 | |
kcy | 0:4d2c4db9c88e | 616 | p->vtrecv.user_data = p; |
kcy | 0:4d2c4db9c88e | 617 | |
kcy | 0:4d2c4db9c88e | 618 | /* |
kcy | 0:4d2c4db9c88e | 619 | * 各モジュールを初期化する。 |
kcy | 0:4d2c4db9c88e | 620 | */ |
kcy | 0:4d2c4db9c88e | 621 | vtsend_init(&(p->vtsend), func_write, 0); |
kcy | 0:4d2c4db9c88e | 622 | vtrecv_init(&(p->vtrecv), vtrecv_callback); |
kcy | 0:4d2c4db9c88e | 623 | text_editor_init(GET_EDITOR(p)); |
kcy | 0:4d2c4db9c88e | 624 | text_history_init(GET_HISTORY(p)); |
kcy | 0:4d2c4db9c88e | 625 | SUGGEST_INDEX(p) = -1; |
kcy | 0:4d2c4db9c88e | 626 | |
kcy | 0:4d2c4db9c88e | 627 | /* |
kcy | 0:4d2c4db9c88e | 628 | * 初期化確認コードを設定する。 |
kcy | 0:4d2c4db9c88e | 629 | */ |
kcy | 0:4d2c4db9c88e | 630 | p->initcode = INITCODE; |
kcy | 0:4d2c4db9c88e | 631 | } |
kcy | 0:4d2c4db9c88e | 632 | |
kcy | 0:4d2c4db9c88e | 633 | /** |
kcy | 0:4d2c4db9c88e | 634 | * @brief Natural Tiny Shellを実行する。 |
kcy | 0:4d2c4db9c88e | 635 | * @details この関数は実行を返さない。 |
kcy | 0:4d2c4db9c88e | 636 | * |
kcy | 0:4d2c4db9c88e | 637 | * @param p NT-Shellハンドラ。 |
kcy | 0:4d2c4db9c88e | 638 | */ |
kcy | 0:4d2c4db9c88e | 639 | void ntshell_execute(ntshell_t *p) |
kcy | 0:4d2c4db9c88e | 640 | { |
kcy | 0:4d2c4db9c88e | 641 | /* |
kcy | 0:4d2c4db9c88e | 642 | * 初期化確認コードを検証する。 |
kcy | 0:4d2c4db9c88e | 643 | */ |
kcy | 0:4d2c4db9c88e | 644 | if (p->initcode != INITCODE) { |
kcy | 0:4d2c4db9c88e | 645 | return; |
kcy | 0:4d2c4db9c88e | 646 | } |
kcy | 0:4d2c4db9c88e | 647 | |
kcy | 0:4d2c4db9c88e | 648 | /* |
kcy | 0:4d2c4db9c88e | 649 | * ユーザ入力ループ。 |
kcy | 0:4d2c4db9c88e | 650 | */ |
kcy | 0:4d2c4db9c88e | 651 | PROMPT_WRITE(p); |
kcy | 0:4d2c4db9c88e | 652 | while (1) { |
kcy | 0:4d2c4db9c88e | 653 | unsigned char ch; |
kcy | 0:4d2c4db9c88e | 654 | SERIAL_READ(p, (char *)&ch, sizeof(ch)); |
kcy | 0:4d2c4db9c88e | 655 | vtrecv_execute(&(p->vtrecv), &ch, sizeof(ch)); |
kcy | 0:4d2c4db9c88e | 656 | } |
kcy | 0:4d2c4db9c88e | 657 | } |
kcy | 0:4d2c4db9c88e | 658 | |
kcy | 0:4d2c4db9c88e | 659 | /** |
kcy | 0:4d2c4db9c88e | 660 | * @brief Natural Tiny Shellのプロンプトを設定する。 |
kcy | 0:4d2c4db9c88e | 661 | */ |
kcy | 0:4d2c4db9c88e | 662 | void ntshell_set_prompt(ntshell_t *p, const char *prompt) |
kcy | 0:4d2c4db9c88e | 663 | { |
kcy | 0:4d2c4db9c88e | 664 | /* |
kcy | 0:4d2c4db9c88e | 665 | * 初期化確認コードを検証する。 |
kcy | 0:4d2c4db9c88e | 666 | */ |
kcy | 0:4d2c4db9c88e | 667 | if (p->initcode != INITCODE) { |
kcy | 0:4d2c4db9c88e | 668 | return; |
kcy | 0:4d2c4db9c88e | 669 | } |
kcy | 0:4d2c4db9c88e | 670 | |
kcy | 0:4d2c4db9c88e | 671 | ntlibc_strcpy(p->prompt, prompt); |
kcy | 0:4d2c4db9c88e | 672 | } |
kcy | 0:4d2c4db9c88e | 673 | |
kcy | 0:4d2c4db9c88e | 674 | /** |
kcy | 0:4d2c4db9c88e | 675 | * @brief Natural Tiny Shellのバージョンを返す。 |
kcy | 0:4d2c4db9c88e | 676 | * @details 返すバージョンはリリースバージョンである。 |
kcy | 0:4d2c4db9c88e | 677 | * |
kcy | 0:4d2c4db9c88e | 678 | * @param major メージャーバージョン。 |
kcy | 0:4d2c4db9c88e | 679 | * @param minor マイナーバージョン。 |
kcy | 0:4d2c4db9c88e | 680 | * @param release リリースバージョン。 |
kcy | 0:4d2c4db9c88e | 681 | */ |
kcy | 0:4d2c4db9c88e | 682 | void ntshell_version(int *major, int *minor, int *release) |
kcy | 0:4d2c4db9c88e | 683 | { |
kcy | 0:4d2c4db9c88e | 684 | *major = VERSION_MAJOR; |
kcy | 0:4d2c4db9c88e | 685 | *minor = VERSION_MINOR; |
kcy | 0:4d2c4db9c88e | 686 | *release = VERSION_RELEASE; |
kcy | 0:4d2c4db9c88e | 687 | } |
kcy | 0:4d2c4db9c88e | 688 | |
kcy | 0:4d2c4db9c88e | 689 |