OSDN Git Service

Update samples to nxtOSEK_v212.zip (I did not check their licenses.)
[nxt-jsp/etrobo-atk.git] / nxtOSEK / samples_c / usbtest / usbtest.c
1 /* usbtest.c */\r
2 #include <string.h>\r
3 \r
4 #include "kernel.h"\r
5 #include "kernel_id.h"\r
6 \r
7 #include "ecrobot_interface.h"\r
8 #include "usb_test.h"\r
9 \r
10 /* OSEK declarations */\r
11 DeclareTask(Task_ts1);\r
12 DeclareTask(Task_background);\r
13 DeclareResource(USB_Rx);\r
14 DeclareCounter(SysTimerCnt);\r
15 \r
16 #define MAX_NUM_OF_CHAR 16\r
17 #define MAX_NUM_OF_LINE 8\r
18 \r
19 static int pos_x = 0;\r
20 static int pos_y = 0;\r
21 \r
22 static void showInitScreen(void)\r
23 {\r
24         pos_x = 0;\r
25         pos_y = 0;\r
26 \r
27         display_clear(0);\r
28         display_goto_xy(0, 0);\r
29         display_string("USB TEST");\r
30         display_goto_xy(0, 1);\r
31         display_string("Run usbhost.exe");\r
32         display_update();       \r
33 }\r
34 \r
35 static void display_usb_data(U8 *data, int len)\r
36 {\r
37         int i;\r
38 \r
39         /* set LCD postion in x, y */\r
40         if (pos_x >= MAX_NUM_OF_CHAR)\r
41         {\r
42                 pos_x = 0;\r
43                 pos_y++;\r
44         }\r
45 \r
46         if (pos_y >= MAX_NUM_OF_LINE)\r
47         {\r
48                 pos_x = 0;\r
49                 pos_y = 0;\r
50         }\r
51                         \r
52         if (pos_x == 0 && pos_y == 0)\r
53         {\r
54                 display_clear(0);\r
55         }\r
56         display_goto_xy(pos_x, pos_y);\r
57 \r
58         for (i = 0; i < len; i++)\r
59         {\r
60                 if (data[i] == '\n')\r
61                 {\r
62                         pos_x = 0;\r
63                         pos_y++;\r
64                         break;\r
65                 }\r
66                 else\r
67                 {\r
68                         display_string((char *)&data[i]);\r
69                         display_update();\r
70                         if (i == (len - 1))\r
71                         {\r
72                                 pos_x += len;\r
73                                 break;\r
74                         }\r
75                 }\r
76         }\r
77 }\r
78 \r
79 /* ECRobot hooks */\r
80 void ecrobot_device_initialize()\r
81 {\r
82         ecrobot_init_usb(); /* init USB */\r
83 }\r
84 \r
85 void ecrobot_device_terminate()\r
86 {\r
87         ecrobot_term_usb(); /* terminate USB */\r
88 }\r
89 \r
90 /* nxtOSEK hook to be invoked from an ISR in category 2 */\r
91 void user_1ms_isr_type2(void)\r
92 {\r
93         /* Increment System Timer Count to activate periodical Tasks */\r
94         (void)SignalCounter(SysTimerCnt);\r
95 }\r
96 \r
97 /* 1msec periodical Task */\r
98 TASK(Task_ts1)\r
99 {\r
100         GetResource(USB_Rx);\r
101         ecrobot_process1ms_usb(); /* USB process handler (must be invoked every 1msec) */\r
102         ReleaseResource(USB_Rx);\r
103 \r
104         TerminateTask();\r
105 }\r
106 \r
107 /* background Task */\r
108 TASK(Task_background)\r
109 {\r
110         int len;\r
111         U8 data[MAX_USB_DATA_LEN]; /* first byte is preserved for disconnect request from host */\r
112 \r
113         showInitScreen();\r
114 \r
115         while(1)\r
116         {\r
117                 memset(data, 0, MAX_USB_DATA_LEN); /* flush buffer */\r
118                 /* critical section */\r
119                 GetResource(USB_Rx);\r
120                 len = ecrobot_read_usb(data, 0, MAX_USB_DATA_LEN); /* read USB data */\r
121                 ReleaseResource(USB_Rx);\r
122 \r
123                 if (len > 0)\r
124                 {\r
125                         if (data[0] == DISCONNECT_REQ)\r
126                         {\r
127                                 /* disconnect current connection */\r
128                                 ecrobot_disconnect_usb();\r
129                                 showInitScreen();\r
130                         }\r
131                         else\r
132                         {\r
133                                 data[0] = 0x00;\r
134                                 ecrobot_send_usb(data, 0, len); /* send back received USB data */\r
135                                 display_usb_data(&data[1], len-1);\r
136                         }\r
137                 }\r
138         }\r
139 }\r