source: asp3_tinet_ecnl_rx/trunk/bnep_bridge/src/main.c@ 341

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

NTPコマンド追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 9.6 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 "shellif.h"
43#include <kernel.h>
44#include <t_stdlib.h>
45#include <sil.h>
46#include <stdlib.h>
47#include <setjmp.h>
48#include <string.h>
49#include "syssvc/serial.h"
50#include "syssvc/syslog.h"
51#include "target_syssvc.h"
52#include "kernel_cfg.h"
53#include "main.h"
54#include "ffarch.h"
55#include "ff.h"
56#include "core/ntshell.h"
57#include "core/ntlibc.h"
58#include "util/ntstdio.h"
59#include "usrcmd.h"
60#include "util/ntopt.h"
61#include "mbed_api.h"
62#include "usb_hbth.h"
63#include "ntshell_main.h"
64#include <btstack/utils.h>
65#include "if_btusb.h"
66#include "if_rx62n.h"
67
68ID ws_api_mailboxid = MAIN_DATAQUEUE;
69extern int bt_bnep_mode;
70/* PANU向けリモートアドレス */
71// BUFFALLO
72//bd_addr_t remote_addr = { 0x00,0x1B,0xDC,0x04,0x5C,0x2D };
73// Raspberry Pi 3
74//bd_addr_t remote_addr = {0xB8,0x27,0xEB,0x10,0x6D,0x60};
75// PRINCETON
76//bd_addr_t remote_addr = {0x00,0x1B,0xDC,0x06,0x6E,0x98};
77// ELECOM
78bd_addr_t remote_addr = {0x00,0x1B,0xDC,0x09,0x27,0x26};
79
80/* ネットワークインタフェースに依存しないソフトウェア情報 */
81
82T_IF_SOFTC if_softc = {
83 {0,}, /* ネットワークインタフェースのアドレス */
84 0, /* 送信タイムアウト */
85 NULL, /* ディバイス依存のソフトウェア情報 */
86 NULL, /* ディバイス依存のソフトウェア情報 */
87 SEM_IF_RX62N_SBUF_READY, /* 送信セマフォ */
88 SEM_IF_RX62N_RBUF_READY, /* 受信セマフォ */
89
90#ifdef SUPPORT_INET6
91
92 IF_MADDR_INIT, /* マルチキャストアドレスリスト */
93
94#endif /* of #ifdef SUPPORT_INET6 */
95};
96
97PRI main_task_priority = MAIN_PRIORITY + 1;
98
99static void netif_link_callback(T_IFNET *ether);
100extern int execute_command(int wait);
101
102enum main_state_t {
103 main_state_start,
104 main_state_idle,
105};
106
107struct main_t {
108 TMO timer;
109 enum main_state_t state;
110 SYSTIM prev, now;
111};
112struct main_t main_obj;
113
114static void main_initialize();
115static TMO main_get_timer();
116static void main_progress(TMO interval);
117static void main_timeout();
118
119int uart_read(char *buf, int cnt, void *extobj)
120{
121 return serial_rea_dat(SIO_PORTID, (char *)buf, cnt);
122}
123
124int uart_write(const char *buf, int cnt, void *extobj)
125{
126 return serial_wri_dat(SIO_PORTID, buf, cnt);
127}
128
129unsigned char ntstdio_xi(struct ntstdio_t *handle)
130{
131 char buf[1];
132 if(serial_rea_dat(SIO_PORTID, buf, 1) != 1)
133 return -EIO;
134 return buf[0];
135}
136
137void ntstdio_xo(struct ntstdio_t *handle, unsigned char c)
138{
139 char buf[1];
140 buf[0] = c;
141 serial_wri_dat(SIO_PORTID, buf, 1);
142}
143
144ntshell_t ntshell;
145#if !defined(_MSC_VER)
146void _start_c(long *p);
147
148/*
149 * メインタスク
150 */
151void main_task(intptr_t exinf)
152{
153 long args[] = {
154 1,
155 (long)"ntshell",
156 };
157 _start_c(args);
158}
159
160int main(int argc, char **argv)
161{
162 // NAP mode
163 bt_bnep_mode = 1;
164
165 main_initialize();
166
167 ntshell_init(&ntshell, uart_read, uart_write, cmd_execute, NULL);
168 ntshell_set_prompt(&ntshell, "NTShell>");
169 ntshell_execute(&ntshell);
170
171 return 0;
172}
173#else
174void main_task(intptr_t exinf)
175{
176 main_initialize();
177
178 ntshell_init(&ntshell, uart_read, uart_write, cmd_execute, NULL);
179 ntshell_set_prompt(&ntshell, "NTShell>");
180 ntshell_execute(&ntshell);
181}
182#endif
183/*
184 * 初期化
185 */
186static void main_initialize()
187{
188 FILINFO fno;
189#if _USE_LFN
190 char lfn[_MAX_LFN + 1];
191 fno.lfname = lfn;
192 fno.lfsize = _MAX_LFN + 1;
193#endif
194 ER ret2;
195
196 ntshell_task_init();
197
198 main_obj.timer = TMO_FEVR;
199 main_obj.state = main_state_start;
200
201 gpio_t led_blue, led_green, led_red, sw;
202 gpio_init_out(&led_blue, LED_BLUE);
203 gpio_init_out(&led_green, LED_GREEN);
204 gpio_init_out(&led_red, LED_RED);
205 gpio_init_in(&sw, USER_BUTTON0);
206
207 bool_t exec = gpio_read(&sw) == 1;
208
209 gpio_write(&led_blue, 1);
210 gpio_write(&led_green, exec ? 1 : 0);
211 gpio_write(&led_red, 0);
212
213 ether_set_link_callback(netif_link_callback);
214
215 /* 初期化 */
216 if (ffarch_init() == 0) {
217 gpio_write(&led_blue, 0);
218 }
219 else {
220 gpio_write(&led_blue, 0);
221 gpio_write(&led_red, 1);
222 }
223
224 gpio_write(&led_green, 0);
225
226 usbhost_init(USBHOST_TASK);
227
228 ret2 = get_tim(&main_obj.now);
229 if (ret2 != E_OK) {
230 syslog(LOG_ERROR, "get_tim");
231 ext_tsk();
232 return;
233 }
234}
235
236/*
237 * タイマー取得
238 */
239static TMO main_get_timer()
240{
241 TMO timer = main_obj.timer;
242
243 return timer;
244}
245
246/*
247 * 時間経過
248 */
249static void main_progress(TMO interval)
250{
251 if (main_obj.timer != TMO_FEVR) {
252 main_obj.timer -= interval;
253 if (main_obj.timer < 0) {
254 main_obj.timer = 0;
255 }
256 }
257}
258
259/*
260 * タイムアウト処理
261 */
262static void main_timeout()
263{
264 //if (main_obj.timer == 0) {
265 //}
266}
267
268void ntshell_change_netif_link(uint8_t link_up, uint8_t up);
269
270static void netif_link_callback(T_IFNET *ether)
271{
272 uint8_t link_up = (ether->flags & IF_FLAG_LINK_UP) != 0;
273 uint8_t up = (ether->flags & IF_FLAG_UP) != 0;
274
275 ntshell_change_netif_link(link_up, up);
276}
277
278static const cmd_table_t cmdlist[] = {
279 {"cd", "change directory", usrcmd_cd },
280 {"ls", "list files", usrcmd_ls },
281 {"cp", "copy file", usrcmd_cp },
282 {"rm", "remove file", usrcmd_rm },
283 {"mv", "move file", usrcmd_mv },
284 {"mkdir", "Make directory", usrcmd_mkdir},
285 {"hexdump", "Hex dump", usrcmd_hexdump},
286 {"date", "print date and time", usrcmd_date},
287 {"info", "This is a description text string for info command.", usrcmd_info},
288 {"exit", "Exit Natural Tiny Shell", usrcmd_exit},
289};
290cmd_table_info_t cmd_table_info = { cmdlist, sizeof(cmdlist) / sizeof(cmdlist[0]) };
291
292static T_IFNET ether_ifnet;
293
294/**
295 * Called by a driver when its link goes up
296 */
297void ether_set_link_up(T_IF_SOFTC *ic)
298{
299 if (!(ether_ifnet.flags & IF_FLAG_LINK_UP)) {
300 ether_ifnet.flags |= IF_FLAG_LINK_UP;
301
302 if (ether_ifnet.flags & IF_FLAG_UP) {
303#if LWIP_ARP
304 /* For Ethernet network interfaces, we would like to send a "gratuitous ARP" */
305 if (ether_ifnet.flags & IF_FLAG_ETHARP) {
306 etharp_gratuitous(&ether_ifnet);
307 }
308#endif /* LWIP_ARP */
309
310#if LWIP_IGMP
311 /* resend IGMP memberships */
312 if (ether_ifnet._flags & IF_FLAG_IGMP) {
313 igmp_report_groups(&ether_ifnet);
314 }
315#endif /* LWIP_IGMP */
316 }
317 if (ether_ifnet.link_callback) {
318 (ether_ifnet.link_callback)(&ether_ifnet);
319 }
320 }
321}
322
323/**
324 * Called by a driver when its link goes down
325 */
326void ether_set_link_down(T_IF_SOFTC *ic)
327{
328 if (ether_ifnet.flags & IF_FLAG_LINK_UP) {
329 ether_ifnet.flags &= ~IF_FLAG_LINK_UP;
330 if (ether_ifnet.link_callback) {
331 (ether_ifnet.link_callback)(&ether_ifnet);
332 }
333 }
334}
335
336/**
337 * Set callback to be called when link is brought up/down
338 */
339void ether_set_link_callback(ether_status_callback_fn link_callback)
340{
341 ether_ifnet.link_callback = link_callback;
342}
343
344/*
345 * Ethernet 入力タスク
346 */
347
348void
349ether_input_task(intptr_t exinf)
350{
351 T_IF_SOFTC *ic = &if_softc;
352 T_NET_BUF *input;
353 ER ret;
354
355 btusb_probe(ic);
356 btusb_init(ic);
357
358 rx62n_probe(ic);
359 rx62n_init(ic);
360
361 while (true) {
362 ret = wai_sem(ic->semid_rxb_ready);
363 if (ret != E_OK) {
364 syslog(LOG_DEBUG, "wai_sem(ic->semid_rxb_ready) = %d", ret);
365 return;
366 }
367
368 if ((input = rx62n_read(ic)) != NULL) {
369 int rel = btusb_start(ic, input);
370 if (rel) {
371 rel_net_buf(input);
372 }
373 }
374 }
375}
376
377ER tget_net_buf (T_NET_BUF **blk, uint_t len, TMO tmout)
378{
379 T_NET_BUF *buf;
380
381 buf = malloc(sizeof(T_NET_BUF) + len);
382 *blk = buf;
383 if (buf == NULL)
384 return E_TMOUT;
385
386 buf->len = len;
387 buf->idix = 0;
388 buf->flags = 0;
389
390 return E_OK;
391}
392
393ER rel_net_buf (T_NET_BUF *blk)
394{
395 free(blk);
396
397 return E_OK;
398}
Note: See TracBrowser for help on using the repository browser.