ChiaYen Kan / Mbed 2 deprecated Nucleo_L053R8_NTShell

Dependencies:   mbed

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?

UserRevisionLine numberNew 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