source: EcnlProtoTool/trunk/mrbgems/mruby-arduino/src/sWiFi.c@ 270

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

mruby版ECNLプロトタイピング・ツールを追加

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-csrc
File size: 11.3 KB
Line 
1/*
2 * ESP-WROOM-02関連
3 *
4 * Copyright (c) 2016 Wakayama.rb Ruby Board developers
5 *
6 * This software is released under the MIT License.
7 * https://github.com/wakayamarb/wrbb-v2lib-firm/blob/master/MITL
8 *
9 */
10#include <arduino.h>
11#include <string.h>
12
13#include <mruby.h>
14#include <mruby/string.h>
15
16#include "../llbruby.h"
17#include "sKernel.h"
18#include "sSerial.h"
19
20extern serial_t *RbSerial[]; /*0:Serial(USB), 1:Serial1, 2:Serial3, 3:Serial2, 4:Serial6 5:Serial7*/
21
22#define WIFI_SERIAL 3
23#define WIFI_BAUDRATE 115200
24/*#define WIFI_CTS 15*/
25#define WIFI_WAIT_MSEC 10000
26
27unsigned char WiFiData[256];
28int WiFiRecvOutlNum = -1; /*ESP8266からの受信を出力するシリアル番号: -1の場合は出力しない。*/
29
30/******************************************************/
31/* OK 0d0a か ERROR 0d0aが来るまで WiFiData[]に読むか、*/
32/* 指定されたシリアルポートに出力します*/
33/**/
34/* 1:受信した, 0:受信できなかった*/
35/******************************************************/
36int getData(int wait_msec)
37{
38/*char f[16];*/
39 unsigned long times;
40 int c;
41 int okt = 0;
42 int ert = 0;
43 int len = 0;
44 int n = 0;
45
46 /*DEBUG_PRINT("getData", a);*/
47
48 WiFiData[0] = 0;
49 times = us_ticker_read() / 1000;
50 while (n < 256) {
51 /*digitalWrite(get_pin(WIFI_CTS), 0); //送信許可*/
52
53 /*wait_msec 待
54つ*/
55 if ((us_ticker_read() / 1000) - times > wait_msec) {
56 DEBUG_PRINT("WiFi get Data", "Time OUT");
57 WiFiData[n] = 0;
58 return 0;
59 }
60
61 while (len = serial_readable(RbSerial[WIFI_SERIAL])) {
62 for (int i = 0; i < len; i++) {
63 c = serial_getc(RbSerial[WIFI_SERIAL]);
64
65 /*指定のシリアルポートに出す設定であれば、受信値を出力します*/
66 if (WiFiRecvOutlNum >= 0) {
67 serial_putc(RbSerial[WiFiRecvOutlNum], (unsigned char)c);
68 }
69
70 WiFiData[n] = c;
71 n++;
72 /*DEBUG_PRINT("c",c);*/
73
74 if (c == 'O') {
75 okt++;
76 ert++;
77 }
78 else if (c == 'K') {
79 okt++;
80 }
81 else if (c == 0x0d) {
82 ert++;
83 okt++;
84 }
85 else if (c == 0x0a) {
86 ert++;
87 okt++;
88 if (okt == 4 || ert == 7) {
89 WiFiData[n] = 0;
90 n = 256;
91 break;
92 }
93 else {
94 ert = 0;
95 okt = 0;
96 }
97 }
98 else if (c == 'E' || c == 'R') {
99 ert++;
100 }
101 else {
102 okt = 0;
103 ert = 0;
104 }
105 }
106 times = us_ticker_read() / 1000;
107 }
108 }
109 /*digitalWrite(get_pin(WIFI_CTS), 0); //送信許可*/
110 return 1;
111}
112
113/******************************************************/
114/* ステーションモードの設定: WiFi.cwmode*/
115/* WiFi.cwmode(mode)*/
116/* mode: 1:Station, 2:SoftAP, 3:Station + SoftAP*/
117/******************************************************/
118mrb_value mrb_wifi_Cwmode(mrb_state *mrb, mrb_value self)
119{
120 int mode;
121 char tmode[16];
122
123 mrb_get_args(mrb, "i", &mode);
124
125 sprintf(tmode, "%d", mode);
126
127 serial_print(RbSerial[WIFI_SERIAL], "AT+CWMODE=");
128 serial_println(RbSerial[WIFI_SERIAL], tmode);
129
130 /*OK 0d0a か ERROR 0d0aが来るまで WiFiData[]に読か、指定されたシリアルポートに出力します*/
131 getData(WIFI_WAIT_MSEC);
132
133 return mrb_str_new_cstr(mrb, (const char*)WiFiData);
134}
135
136/******************************************************/
137/* コマンド応答のシリアル出力設定: WiFi.sout*/
138/* WiFi.sout( mode[,serialNumber] )*/
139/* mode: 0:出力しない, 1:出力する*/
140/* serialNumber: 出力å…
141ˆã®ã‚·ãƒªã‚¢ãƒ«ç•ªå·*/
142/******************************************************/
143mrb_value mrb_wifi_Sout(mrb_state *mrb, mrb_value self)
144{
145 int mode;
146 int num = -1;
147
148 int n = mrb_get_args(mrb, "i|i", &mode, &num);
149
150 if (mode == 0) {
151 WiFiRecvOutlNum = -1;
152 }
153 else {
154 if (n >= 2) {
155 if (num >= 0) {
156 WiFiRecvOutlNum = num;
157 }
158 }
159 }
160 return mrb_nil_value(); /*戻り値は無しですよ。*/
161}
162
163/******************************************************/
164/* ATコマンドの送信: WiFi.at*/
165/* WiFi.at( command[, mode] )*/
166/* commnad: ATコマンド内
167容*/
168/* mode: 0:'AT+'を自動追加する、1:'AT+'を自動追加しない*/
169/******************************************************/
170mrb_value mrb_wifi_at(mrb_state *mrb, mrb_value self)
171{
172 mrb_value text;
173 int mode = 0;
174
175 int n = mrb_get_args(mrb, "S|i", &text, &mode);
176
177 char *s = RSTRING_PTR(text);
178 int len = RSTRING_LEN(text);
179
180 if (n <= 1 || mode == 0) {
181 serial_print(RbSerial[WIFI_SERIAL], "AT+");
182 }
183
184 for (int i = 0; i < 254; i++) {
185 if (i >= len) { break; }
186 WiFiData[i] = s[i];
187 }
188 WiFiData[len] = 0;
189
190 serial_println(RbSerial[WIFI_SERIAL], (const char*)WiFiData);
191 /*DEBUG_PRINT("WiFi.at",(const char*)WiFiData);*/
192
193 /*OK 0d0a か ERROR 0d0aが来るまで WiFiData[]に読か、指定されたシリアルポートに出力します*/
194 getData(WIFI_WAIT_MSEC);
195
196 return mrb_str_new_cstr(mrb, (const char*)WiFiData);
197}
198
199/******************************************************/
200/* WiFi接続します: WiFi.cwjap*/
201/* WiFi.cwjap(SSID,Passwd)*/
202/* SSID: WiFiのSSID*/
203/* Passwd: パスワード*/
204/******************************************************/
205mrb_value mrb_wifi_Cwjap(mrb_state *mrb, mrb_value self)
206{
207 mrb_value ssid;
208 mrb_value passwd;
209
210 mrb_get_args(mrb, "SS", &ssid, &passwd);
211
212 char *s = RSTRING_PTR(ssid);
213 int slen = RSTRING_LEN(ssid);
214
215 char *p = RSTRING_PTR(passwd);
216 int plen = RSTRING_LEN(passwd);
217
218 serial_print(RbSerial[WIFI_SERIAL], "AT+CWJAP=");
219 WiFiData[0] = 0x22; /*-> "*/
220 WiFiData[1] = 0;
221 serial_print(RbSerial[WIFI_SERIAL], (const char*)WiFiData);
222
223 for (int i = 0; i < 254; i++) {
224 if (i >= slen) { break; }
225 WiFiData[i] = s[i];
226 }
227 WiFiData[slen] = 0;
228 serial_print(RbSerial[WIFI_SERIAL], (const char*)WiFiData);
229
230 WiFiData[0] = 0x22; /*-> "*/
231 WiFiData[1] = 0x2C; /*-> ,*/
232 WiFiData[2] = 0x22; /*-> "*/
233 WiFiData[3] = 0;
234 serial_print(RbSerial[WIFI_SERIAL], (const char*)WiFiData);
235
236 for (int i = 0; i < 254; i++) {
237 if (i >= plen) { break; }
238 WiFiData[i] = p[i];
239 }
240 WiFiData[plen] = 0;
241 serial_print(RbSerial[WIFI_SERIAL], (const char*)WiFiData);
242
243 WiFiData[0] = 0x22; /*-> "*/
244 WiFiData[1] = 0;
245 serial_println(RbSerial[WIFI_SERIAL], (const char*)WiFiData);
246
247 /*OK 0d0a か ERROR 0d0aが来るまで WiFiData[]に読か、指定されたシリアルポートに出力します*/
248 getData(WIFI_WAIT_MSEC);
249
250 return mrb_str_new_cstr(mrb, (const char*)WiFiData);
251}
252
253/******************************************************/
254/* IPアドレスとMACアドレスの表示: WiFi.cifsr*/
255/* WiFi.cwjap()*/
256/******************************************************/
257mrb_value mrb_wifi_Cifsr(mrb_state *mrb, mrb_value self)
258{
259 serial_println(RbSerial[WIFI_SERIAL], "AT+CIFSR");
260
261 /*OK 0d0a か ERROR 0d0aが来るまで WiFiData[]に読か、指定されたシリアルポートに出力します*/
262 getData(WIFI_WAIT_MSEC);
263
264 return mrb_str_new_cstr(mrb, (const char*)WiFiData);
265}
266
267/******************************************************/
268/* USBポートとESP8266をシリアルで直結します: WiFi.bypass*/
269/* WiFi.bypass()*/
270/* リセットするまで、処理は戻りません。*/
271/******************************************************/
272mrb_value mrb_wifi_bypass(mrb_state *mrb, mrb_value self)
273{
274 int len0, len1, len;
275 int retCnt = 0;
276
277 while (true) {
278 len0 = serial_readable(RbSerial[0]);
279 len1 = serial_readable(RbSerial[WIFI_SERIAL]);
280
281 if (len0 > 0) {
282 len = len0 < 256 ? len0 : 256;
283
284 for (int i = 0; i < len; i++) {
285 WiFiData[i] = (unsigned char)serial_getc(RbSerial[0]);
286 }
287 serial_write(RbSerial[WIFI_SERIAL], WiFiData, len);
288 }
289
290 if (len1 > 0) {
291 len = len1 < 256 ? len1 : 256;
292
293 for (int i = 0; i < len; i++) {
294 WiFiData[i] = (unsigned char)serial_getc(RbSerial[WIFI_SERIAL]);
295 }
296 serial_write(RbSerial[0], WiFiData, len);
297 }
298 }
299 return mrb_nil_value(); /*戻り値は無しですよ。*/
300}
301
302/******************************************************/
303/* ライブラリを定義します*/
304/******************************************************/
305int esp8266_Init(mrb_state *mrb)
306{
307 PinName txpin, rxpin;
308
309 /*ESP8266からの受信を出力しないに設定*/
310 WiFiRecvOutlNum = -1;
311
312 /*CTS用にPIN15をOUTPUTに設定します*/
313 /*pinMode(get_pin(WIFI_CTS), 1);*/
314 /*digitalWrite(get_pin(WIFI_CTS), 1);*/
315
316 /*WiFiのシリアル3を設定*/
317 /*シリアル通信の初期化をします*/
318 portToPins(SCI_SCI0P2x, &txpin, &rxpin);
319 serial_init(RbSerial[WIFI_SERIAL], txpin, rxpin);
320 serial_baud(RbSerial[WIFI_SERIAL], WIFI_BAUDRATE);
321 int len;
322
323 /*受信バッファを空にします*/
324 while ((len = serial_readable(RbSerial[WIFI_SERIAL])) > 0) {
325 /*serial_print(RbSerial[0], len);*/
326 for (int i = 0; i < len; i++) {
327 serial_getc(RbSerial[WIFI_SERIAL]);
328 }
329 }
330
331 /*ECHOオフコマンドを送信する*/
332 serial_println(RbSerial[WIFI_SERIAL], "ATE0");
333
334 /*OK 0d0a か ERROR 0d0aが来るまで WiFiData[]に読む*/
335 if (getData(500) == 0) {
336 return 0;
337 }
338
339 struct RClass *wifiModule = mrb_define_module(mrb, "WiFi");
340
341 mrb_define_module_function(mrb, wifiModule, "at", mrb_wifi_at, MRB_ARGS_REQ(1) | MRB_ARGS_OPT(1));
342 mrb_define_module_function(mrb, wifiModule, "sout", mrb_wifi_Sout, MRB_ARGS_REQ(1) | MRB_ARGS_OPT(1));
343 mrb_define_module_function(mrb, wifiModule, "cwmode", mrb_wifi_Cwmode, MRB_ARGS_REQ(1));
344 mrb_define_module_function(mrb, wifiModule, "cwjap", mrb_wifi_Cwjap, MRB_ARGS_REQ(2));
345 mrb_define_module_function(mrb, wifiModule, "connect", mrb_wifi_Cwjap, MRB_ARGS_REQ(2));
346 mrb_define_module_function(mrb, wifiModule, "cifsr", mrb_wifi_Cifsr, MRB_ARGS_NONE());
347 mrb_define_module_function(mrb, wifiModule, "config", mrb_wifi_Cifsr, MRB_ARGS_NONE());
348
349 mrb_define_module_function(mrb, wifiModule, "bypass", mrb_wifi_bypass, MRB_ARGS_NONE());
350
351 return 1;
352
353 /*mrb_define_module_function(mrb, pancakeModule, "clear", mrb_pancake_Clear, MRB_ARGS_REQ(1));*/
354 /*mrb_define_module_function(mrb, pancakeModule, "line", mrb_pancake_Line, MRB_ARGS_REQ(5));*/
355 /*mrb_define_module_function(mrb, pancakeModule, "circle", mrb_pancake_Circle, MRB_ARGS_REQ(4));*/
356 /*mrb_define_module_function(mrb, pancakeModule, "stamp", mrb_pancake_Stamp, MRB_ARGS_REQ(4));*/
357 /*mrb_define_module_function(mrb, pancakeModule, "stamp1", mrb_pancake_Stamp1, MRB_ARGS_REQ(4));*/
358 /*mrb_define_module_function(mrb, pancakeModule, "image", mrb_pancake_Image, MRB_ARGS_REQ(1));*/
359 /*mrb_define_module_function(mrb, pancakeModule, "video", mrb_pancake_Video, MRB_ARGS_REQ(1));*/
360 /*mrb_define_module_function(mrb, pancakeModule, "sound", mrb_pancake_Sound, MRB_ARGS_REQ(8));*/
361 /*mrb_define_module_function(mrb, pancakeModule, "sound1", mrb_pancake_Sound1, MRB_ARGS_REQ(3));*/
362 /*mrb_define_module_function(mrb, pancakeModule, "reset", mrb_pancake_Reset, MRB_ARGS_NONE());*/
363 /*mrb_define_module_function(mrb, pancakeModule, "out", mrb_pancake_Out, MRB_ARGS_REQ(1));*/
364
365 /*struct RClass *spriteModule = mrb_define_module(mrb, "Sprite");*/
366 /*mrb_define_module_function(mrb, spriteModule, "start", mrb_pancake_Start, MRB_ARGS_REQ(1));*/
367 /*mrb_define_module_function(mrb, spriteModule, "create", mrb_pancake_Create, MRB_ARGS_REQ(2));*/
368 /*mrb_define_module_function(mrb, spriteModule, "move", mrb_pancake_Move, MRB_ARGS_REQ(3));*/
369 /*mrb_define_module_function(mrb, spriteModule, "flip", mrb_pancake_Flip, MRB_ARGS_REQ(2));*/
370 /*mrb_define_module_function(mrb, spriteModule, "rotate", mrb_pancake_Rotate, MRB_ARGS_REQ(2));*/
371 /*mrb_define_module_function(mrb, spriteModule, "user", mrb_pancake_User, MRB_ARGS_REQ(3));*/
372
373 /*struct RClass *musicModule = mrb_define_module(mrb, "Music");*/
374 /*mrb_define_module_function(mrb, musicModule, "score", mrb_pancake_Score, MRB_ARGS_REQ(4));*/
375 /*mrb_define_module_function(mrb, musicModule, "play", mrb_pancake_Play, MRB_ARGS_REQ(1));*/
376}
Note: See TracBrowser for help on using the repository browser.