source: EcnlProtoTool/trunk/ntshell/src/main.c@ 321

Last change on this file since 321 was 321, checked in by coas-nagasima, 7 years ago

文字コードを設定

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 11.4 KB
Line 
1/*
2 * TOPPERS ECHONET Lite Communication Middleware
3 *
4 * Copyright (C) 2014-2017 Cores Co., Ltd. Japan
5 *
6 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
7 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
8 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
9 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
10 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
11 * スコード中に含まれていること.
12 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
13 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
14 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
15 * の無保証規定を掲載すること.
16 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
17 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
18 * と.
19 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
20 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
21 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
22 * 報告すること.
23 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
24 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
25 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
26 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
27 * 免責すること.
28 *
29 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
30 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
31 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
32 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
33 * の責任を負わない.
34 *
35 * @(#) $Id$
36 */
37
38/*
39 * サンプルプログラム(1)の本体
40 */
41
42#include <kernel.h>
43#include <t_syslog.h>
44#include <t_stdlib.h>
45#include <sil.h>
46#include <stdlib.h>
47#include <string.h>
48#include <stdio.h>
49#include <setjmp.h>
50#include "syssvc/serial.h"
51#include "syssvc/syslog.h"
52#include "kernel_cfg.h"
53#include "main.h"
54#include "rza1.h"
55#include <tinet_config.h>
56#include <netinet/in.h>
57#include <netinet/in_itron.h>
58#include <tinet_nic_defs.h>
59#include <tinet_cfg.h>
60#include <netinet/in_var.h>
61#include <net/ethernet.h>
62#include <net/if6_var.h>
63#include <net/net.h>
64#include <net/if_var.h>
65#include <netinet/udp_var.h>
66#include <ethernet_api.h>
67#include "ffarch.h"
68#include "gpio_api.h"
69#include "ff.h"
70#include "websocket_fbs.h"
71#include "ntshell.h"
72#include "ntstdio.h"
73#include "usrcmd.h"
74#include "ntopt.h"
75
76#ifndef _MSC_VER
77void strcpy_s(char *dst, int size, const char *src);
78#endif
79
80ID ws_api_mailboxid = MAIN_DATAQUEUE;
81ID ws_mempoolid = MPF_NET_BUF_256;
82
83#define SIO_PORTID 1
84
85char command[NTOPT_TEXT_MAXLEN];
86ntstdio_t ntstdio;
87
88const uint8_t mac_addr[6] = {0x00, 0x30, 0x13, 0x06, 0x62, 0xC0};
89const char host_name[] = "GR-PEACH";
90
91static void netif_link_callback(T_IFNET *ether);
92extern int execute_command(int wait);
93
94enum main_state_t {
95 main_state_start,
96 main_state_idle,
97};
98
99struct main_t {
100 TMO timer;
101 enum main_state_t state;
102 SYSTIM prev, now;
103 WS_FBS_ID rcvmsg;
104 T_WS_FBS_QUEUE wbs_queue;
105 WS_FBS_ID sndmsg;
106};
107struct main_t main_obj;
108
109static void main_initialize();
110static TMO main_get_timer();
111static void main_progress(TMO interval);
112static void main_timeout();
113
114int uart_read(char *buf, int cnt, void *extobj)
115{
116 return serial_rea_dat(SIO_PORTID, (char *)buf, cnt);
117#if 0
118 int result = cnt;
119 ER ret;
120 bool_t tmo = false;
121
122 while (cnt > 0) {
123 /* タイムアウト処理 */
124 if (tmo) {
125 tmo = false;
126 main_timeout();
127 }
128
129 if (main_obj.rcvmsg.ptr == NULL) {
130 ER ret2;
131 TMO timer;
132 WS_FBS_ID msg;
133
134 main_obj.prev = main_obj.now;
135
136 timer = main_get_timer();
137
138 ret = trcv_dtq(MAIN_DATAQUEUE, (intptr_t *)&msg, timer);
139 if ((ret != E_OK) && (ret != E_TMOUT)) {
140 syslog(LOG_ERROR, "trcv_dtq => %d", ret);
141 ext_tsk();
142 return 0;
143 }
144
145 ret2 = get_tim(&main_obj.now);
146 if (ret2 != E_OK) {
147 syslog(LOG_ERROR, "get_tim");
148 ext_tsk();
149 return 0;
150 }
151
152 /* 時間経過 */
153 main_progress(main_obj.now - main_obj.prev);
154
155 if (ret == E_OK) {
156 /* メッセージ受信処理 */
157 if (main_obj.rcvmsg.ptr == NULL) {
158 main_obj.rcvmsg = msg;
159 }
160 else {
161 ws_fbs_enqueue(&main_obj.wbs_queue, msg.ptr);
162 }
163 }
164
165 tmo = true;
166 }
167 else {
168 WS_FBS_SSIZE_T len, slen;
169
170 len = _ws_fbs_get_datalen(main_obj.rcvmsg);
171 if (len > cnt)
172 len = cnt;
173
174 ret = _ws_fbs_get_data(main_obj.rcvmsg, buf, len, &slen);
175 if (ret != E_OK) {
176 syslog(LOG_ERROR, "_ws_fbs_get_data msg = %p, type = %d, result = %d", main_obj.rcvmsg.ptr, main_obj.rcvmsg.ptr->hdr.type, ret);
177 ext_tsk();
178 }
179 cnt -= slen;
180
181 /* データが空の場合 */
182 if (!_ws_fbs_exist_data(main_obj.rcvmsg)) {
183 ret = _ws_fbs_del(main_obj.rcvmsg);
184 if (ret != E_OK) {
185 syslog(LOG_ERROR, "trcv_dtq msg = %p, type = %d, result = %d", main_obj.rcvmsg.ptr, main_obj.rcvmsg.ptr->hdr.type, ret);
186 ext_tsk();
187 }
188
189 main_obj.rcvmsg.ptr = NULL;
190
191 /* キューからデータを取得 */
192 ret = ws_fbs_dequeue(&main_obj.wbs_queue, &main_obj.rcvmsg.ptr);
193 }
194 }
195 }
196
197 return result;
198#endif
199}
200
201int uart_write(const char *buf, int cnt, void *extobj)
202{
203 return serial_wri_dat(SIO_PORTID, buf, cnt);
204#if 0
205 int result = cnt;
206 ER ret;
207
208 while (cnt > 0) {
209 _ws_fbs_cre(cnt, &main_obj.sndmsg);
210
211 //((ID *)main_obj.sndmsg.ptr->_gap)[0] = wbsid;
212 _ws_fbs_add_data(main_obj.sndmsg, buf, cnt);
213
214 ret = psnd_dtq(WEBSOCKET_MBXID, (intptr_t)main_obj.sndmsg.ptr);
215 if (ret != E_OK) {
216 syslog(LOG_ERROR, "psnd_dtq(WEBSOCKET_MBXID) : result=%d", ret);
217 _ws_fbs_del(main_obj.sndmsg);
218 return ret;
219 }
220 }
221
222 return result;
223#endif
224}
225
226unsigned char ntstdio_xi(struct ntstdio_t *handle)
227{
228 char buf[1];
229 if(serial_rea_dat(SIO_PORTID, buf, 1) != 1)
230 return -1;
231 return buf[0];
232}
233
234void ntstdio_xo(struct ntstdio_t *handle, unsigned char c)
235{
236 char buf[1];
237 buf[0] = c;
238 serial_wri_dat(SIO_PORTID, buf, 1);
239}
240
241ntshell_t ntshell;
242static int cmd_execute(const char *text, void *extobj);
243
244/*
245 * メインタスク
246 */
247void main_task(intptr_t exinf)
248{
249 main_initialize();
250
251 ntshell_init(&ntshell, uart_read, uart_write, cmd_execute, NULL);
252 ntshell_set_prompt(&ntshell, "NTShell>");
253 ntshell_execute(&ntshell);
254}
255
256/*
257 * 初期化
258 */
259static void main_initialize()
260{
261 FILINFO fno;
262#if _USE_LFN
263 char lfn[_MAX_LFN + 1];
264 fno.lfname = lfn;
265 fno.lfsize = _MAX_LFN + 1;
266#endif
267 ER ret2;
268
269 ntstdio_init(&ntstdio, NTSTDIO_OPTION_LINE_ECHO | NTSTDIO_OPTION_CANON | NTSTDIO_OPTION_LF_CRLF | NTSTDIO_OPTION_LF_CR, ntstdio_xi, ntstdio_xo);
270
271 main_obj.timer = TMO_FEVR;
272 main_obj.state = main_state_start;
273
274 gpio_t led_blue, led_green, led_red, sw;
275 gpio_init_out(&led_blue, LED_BLUE);
276 gpio_init_out(&led_green, LED_GREEN);
277 gpio_init_out(&led_red, LED_RED);
278 gpio_init_in(&sw, USER_BUTTON0);
279
280 bool_t exec = gpio_read(&sw) == 1;
281
282 gpio_write(&led_blue, 1);
283 gpio_write(&led_green, exec ? 1 : 0);
284 gpio_write(&led_red, 0);
285
286 ether_set_link_callback(netif_link_callback);
287
288 /* 初期化 */
289 if (mruby_arduino_init() == 0) {
290 gpio_write(&led_blue, 0);
291 }
292 else {
293 gpio_write(&led_blue, 0);
294 gpio_write(&led_red, 1);
295 }
296
297 gpio_write(&led_green, 0);
298
299 act_tsk(HTTPD1_TASK);
300 act_tsk(HTTPD2_TASK);
301
302 if (f_stat("1:/upload/main.mrb", &fno) != FR_OK) {
303 exec = false;
304 }
305
306 if (exec) {
307 strcpy_s(command, sizeof(command), "mruby -b 1:/upload/main.mrb");
308
309 execute_command(1);
310 }
311
312 ret2 = get_tim(&main_obj.now);
313 if (ret2 != E_OK) {
314 syslog(LOG_ERROR, "get_tim");
315 ext_tsk();
316 return;
317 }
318}
319
320/*
321 * タイマー取得
322 */
323static TMO main_get_timer()
324{
325 TMO timer = main_obj.timer;
326
327 return timer;
328}
329
330/*
331 * 時間経過
332 */
333static void main_progress(TMO interval)
334{
335 if (main_obj.timer != TMO_FEVR) {
336 main_obj.timer -= interval;
337 if (main_obj.timer < 0) {
338 main_obj.timer = 0;
339 }
340 }
341}
342
343/*
344 * タイムアウト処理
345 */
346static void main_timeout()
347{
348 //if (main_obj.timer == 0) {
349 //}
350}
351
352/* MACアドレスの設定時に呼ばれる */
353void mbed_mac_address(char *mac)
354{
355 memcpy(mac, mac_addr, 6);
356}
357
358static void netif_link_callback(T_IFNET *ether)
359{
360 FLGPTN flgptn;
361 T_RTSK rtsk;
362 ER ret;
363
364 ret = ref_tsk(MRUBY_TASK, &rtsk);
365 if ((ret != E_OK) || (rtsk.tskstat == TTS_DMT))
366 return;
367
368 FD_SET(0, (fd_set *)&flgptn);
369
370 set_flg(FLG_SELECT_WAIT, flgptn);
371}
372
373int gethostname(char *name, size_t len)
374{
375 return strlcpy(name, host_name, len);
376}
377
378static int usrcmd_ntopt_callback(int argc, char **argv, void *extobj);
379int mruby_exit_code;
380volatile int mruby_state;
381typedef void (*PowerOn_Reset_t)(int argc, char **argv);
382jmp_buf process_exit;
383
384/*
385 * mruby実行タスク
386 */
387void mruby_task(intptr_t exinf)
388{
389 mruby_state = 1;
390 mruby_exit_code = ntopt_parse(command, usrcmd_ntopt_callback, NULL);
391 mruby_state = 2;
392}
393
394static int usrcmd_ntopt_callback(int argc, char **argv, void *extobj)
395{
396 if (setjmp(process_exit) == 0) {
397 (*((PowerOn_Reset_t *)0x18200000))(argc, argv);
398 }
399 clean_fd();
400 return 0;
401}
402
403void shellif_into()
404{
405 /* メインタスクの優先度より高くする */
406 chg_pri(MRUBY_PRIORITY, MAIN_PRIORITY + 1);
407}
408
409void shellif_outof()
410{
411 /* mruby実行タスクの優先度に戻す */
412 chg_pri(MRUBY_PRIORITY, MRUBY_PRIORITY);
413}
414
415void shell_abort()
416{
417 asm("bkpt #0");
418
419 mruby_exit_code = -1;
420 longjmp(process_exit, 1);
421}
422
423void shell_exit(int exitcd)
424{
425 mruby_exit_code = exitcd;
426 longjmp(process_exit, 1);
427}
428
429int execute_command(int wait)
430{
431 ER ret;
432
433 ret = ter_tsk(MRUBY_TASK);
434 if ((ret != E_OK) && (ret != E_OBJ)) {
435 syslog(LOG_ERROR, "ter_tsk => %d", ret);
436 }
437
438 tslp_tsk(100000);
439
440 clean_fd();
441
442 mruby_state = 0;
443 ret = act_tsk(MRUBY_TASK);
444 if (ret != E_OK) {
445 syslog(LOG_ERROR, "act_tsk => %d", ret);
446 }
447
448 if (wait == 0)
449 return 0;
450
451 do {
452 tslp_tsk(100000);
453 } while(mruby_state == 1);
454
455 return mruby_exit_code;
456}
457
458static int cmd_execute(const char *text, void *extobj)
459{
460 strlcpy(command, text, sizeof(command));
461 return execute_command(1);
462}
463
464int stdio_close(struct _IO_FILE *fp)
465{
466 return -1;
467}
468
469size_t stdio_read(struct _IO_FILE *fp, unsigned char *data, size_t len)
470{
471 return -1;
472}
473
474size_t stdio_write(struct _IO_FILE *fp, const unsigned char *data, size_t len)
475{
476 return -1;
477}
478
479size_t stdin_read(struct _IO_FILE *fp, unsigned char *data, size_t len)
480{
481 int i = 0;
482 while (i < len) {
483 int c = ntstdio_getc(&ntstdio);
484 data[i++] = c;
485 if ((c == EOF) || (c == '\n'))
486 break;
487 }
488 return i;
489}
490
491size_t stdout_write(struct _IO_FILE *fp, const unsigned char *data, size_t len)
492{
493 for (int i = 0; i < len; i++) {
494 ntstdio_putc(&ntstdio, data[i]);
495 }
496 return len;
497}
498
499size_t stderr_write(struct _IO_FILE *fp, const unsigned char *data, size_t len)
500{
501 for (int i = 0; i < len; i++) {
502 ntstdio_putc(&ntstdio, data[i]);
503 }
504 return len;
505}
506
507int sio_close(struct _IO_FILE *fp)
508{
509 return -1;
510}
511
512size_t sio_read(struct _IO_FILE *fp, unsigned char *data, size_t len)
513{
514 return -1;
515}
516
517size_t sio_write(struct _IO_FILE *fp, const unsigned char *data, size_t len)
518{
519 return -1;
520}
Note: See TracBrowser for help on using the repository browser.