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