source: EcnlProtoTool/trunk/prototool/src/arduino.c@ 331

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

prototoolに関連するプロジェクトをnewlibからmuslを使うよう変更・更新
ntshellをnewlibの下位の実装から、muslのsyscallの実装に変更・更新
以下のOSSをアップデート
・mruby-1.3.0
・musl-1.1.18
・onigmo-6.1.3
・tcc-0.9.27
以下のOSSを追加
・openssl-1.1.0e
・curl-7.57.0
・zlib-1.2.11
以下のmrbgemsを追加
・iij/mruby-digest
・iij/mruby-env
・iij/mruby-errno
・iij/mruby-iijson
・iij/mruby-ipaddr
・iij/mruby-mock
・iij/mruby-require
・iij/mruby-tls-openssl

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 8.2 KB
Line 
1#include <arduino.h>
2#include <mruby.h>
3#include <stdlib.h>
4#include <stdio.h>
5#include <fcntl.h>
6#include <sys/stat.h>
7#include "../llbruby.h"
8
9serial_t *Serial;
10serial_t *Serial1; /*1:Serial1*/
11serial_t *Serial2; /*2:Serial3*/
12serial_t *Serial3; /*3:Serial2*/
13serial_t *Serial4; /*4:Serial6*/
14serial_t *Serial5; /*5:Serial7*/
15
16i2c_t Wire1;
17i2c_t Wire2;
18i2c_t Wire3;
19i2c_t Wire4;
20i2c_t Wire5;
21
22char ExeFilename[64];
23
24void arduino_init()
25{
26}
27
28void randomSeed(long seed)
29{
30 srand(seed);
31}
32
33long arduino_random(long min, long max)
34{
35 return (long)(((double)rand() / (double)RAND_MAX) / ((double)max - (double)min)) + min;
36}
37
38struct pin_node pin_list;
39
40static struct pin_node *find_pin(PinType type, PinName pin)
41{
42 struct pin_node *ret = &pin_list;
43
44 while (ret != NULL) {
45 if ((ret->type == type) && (ret->pin == pin)) {
46 break;
47 }
48 ret = ret->next;
49 }
50
51 return ret;
52}
53
54static struct pin_node *new_pin(PinType type, PinName pin)
55{
56 struct pin_node *ret = calloc(1, sizeof(struct pin_node));
57
58 ret->next = pin_list.next;
59 ret->type = type;
60 ret->pin = pin;
61
62 pin_list.next = ret;
63
64 return ret;
65}
66
67struct pin_node *get_pin(PinType type, PinName pinno)
68{
69 struct pin_node *pin;
70
71 if (pinno == -1)
72 return NULL;
73
74 pin = find_pin(type, pinno);
75 if (pin != NULL)
76 return pin;
77
78 pin = new_pin(type, pinno);
79 if (pin == NULL)
80 return NULL;
81
82 switch (type) {
83 case pintype_gpio:
84 gpio_init(&pin->gpio, pinno);
85 break;
86 case pintype_dac:
87#if DEVICE_ANALOGOUT
88 analogout_init(&pin->dac, pinno);
89#endif
90 break;
91 case pintype_pwmout:
92 pwmout_init(&pin->pwmout, pinno);
93 pin->period = 491;
94 break;
95 case pintype_analogin:
96 analogin_init(&pin->analogin, pinno);
97 break;
98 }
99
100 return pin;
101}
102
103bool portToPins(SCI_PORT port, PinName *txpin, PinName *rxpin)
104{
105 switch (port) {
106 case SCI_USB0:
107 *txpin = 201;
108 *rxpin = 202;
109 break;
110 case SCI_SCI0P2x:
111 *txpin = 1;
112 *rxpin = 2;
113 break;
114 case SCI_SCI2B:
115 *txpin = 1;
116 *rxpin = 2;
117 break;
118 case SCI_SCI6B:
119 *txpin = 1;
120 *rxpin = 2;
121 break;
122 case SCI_SCI2A:
123 *txpin = 1;
124 *rxpin = 2;
125 break;
126 default:
127 *txpin = 0;
128 *rxpin = 0;
129 return false;
130 }
131
132 return true;
133}
134
135PinType get_pin_type(PinName pin)
136{
137 struct pin_node *ret = &pin_list;
138
139 while (ret != NULL) {
140 if (ret->pin == pin) {
141 return ret->type;
142 }
143 }
144
145 return pintype_none;
146}
147
148void analogReference(int mode)
149{
150
151}
152
153void setPinModeDac(int pin)
154{
155
156}
157
158void tone(int pin, int frequency, int duration)
159{
160
161}
162
163void noTone(int pin)
164{
165
166}
167
168int serial_write(serial_t *serial, const unsigned char *buf, int len)
169{
170 const char *c = (const char *)buf;
171
172 for (int i = 0; i < len; i++) {
173 serial_putc(serial, c[i]);
174 }
175
176 return len;
177}
178
179int serial_print(serial_t *serial, const char *str)
180{
181 int i;
182
183 for (i = 0; ; i++) {
184 char c = str[i];
185 if (c == '\0')
186 break;
187
188 serial_putc(serial, c);
189 }
190
191 return i;
192}
193
194int serial_println(serial_t *serial, const char *str)
195{
196 int i;
197
198 for (i = 0; ; i++) {
199 char c = str[i];
200 if (c == '\0')
201 break;
202
203 serial_putc(serial, c);
204 }
205
206 i++;
207 serial_putc(serial, '\r');
208
209 i++;
210 serial_putc(serial, '\n');
211
212 return i;
213}
214
215uint8_t EEPROM_write(int addr, uint8_t data)
216{
217 return 0;
218}
219
220uint8_t EEPROM_read(int addr)
221{
222 return 0xFF;
223}
224
225int EEP_fopen(FILEEEP *fp, const char *str, char mode)
226{
227 int ret;
228 int fm;
229
230 switch (mode){
231 case 0:
232 fm = O_RDONLY;
233 break;
234 case 1:
235 fm = O_RDWR | O_CREAT;
236 break;
237 case 2:
238 fm = O_RDWR;
239 break;
240 default:
241 return -1;
242 }
243
244 ret = open(str, fm);
245 if (ret < 0) {
246 fp->fd = 0;
247 return -1;
248 }
249 fp->fd = ret;
250
251 return 0;
252}
253
254int EEP_fwrite(FILEEEP *fp, byte *data, int *len)
255{
256 int ret;
257
258 ret = write(fp->fd, data, *len);
259 if (ret < 0) {
260 *len = 0;
261 return -1;
262 }
263 *len = ret;
264
265 return 0;
266}
267
268int EEP_fread(FILEEEP *fp)
269{
270 int ret;
271 char c;
272
273 ret = read(fp->fd, &c, 1);
274 if (ret < 0)
275 return -1;
276
277 return c;
278}
279
280void EEP_fclose(FILEEEP *fp)
281{
282 close(fp->fd);
283}
284
285int EEP_fseek(FILEEEP *fp, int pos, int mode)
286{
287 int ret;
288
289 switch (mode){
290 case EEP_SEEKTOP:
291 ret = lseek(fp->fd, pos, SEEK_SET);
292 break;
293 case EEP_SEEKCUR:
294 ret = lseek(fp->fd, pos, SEEK_CUR);
295 break;
296 case EEP_SEEKEND:
297 ret = lseek(fp->fd, pos, SEEK_END);
298 break;
299 default:
300 return -1;
301 break;
302 }
303
304 if (ret < 0)
305 return false;
306
307 return true;
308}
309
310int EEP_ffilesize(const char *str)
311{
312 int ret;
313 struct stat fno;
314
315 ret = stat(str, &fno);
316 if (ret < 0)
317 return 0;
318
319 return fno.st_size;
320}
321
322bool EEP_fEof(FILEEEP *fp)
323{
324 int ret, pos;
325 struct stat fno;
326
327 ret = fstat(fp->fd, &fno);
328 if (ret < 0)
329 return false;
330
331 pos = lseek(fp->fd, 0, SEEK_CUR);
332
333 return pos == fno.st_size;
334}
335
336bool EEP_fexist(const char *path)
337{
338 int ret;
339 struct stat fno;
340
341 ret = stat(path, &fno);
342
343 return (ret == 0);
344}
345
346bool EEP_fcopy(const char *src, const char *dst)
347{
348 int fsrc, fdst;
349 unsigned char buffer[512];
350 int res = true;
351 int br, bw;
352
353 fsrc = open(src, O_RDONLY);
354 if (fsrc < 0)
355 return false;
356
357 fdst = open(dst, O_RDWR | O_CREAT);
358 if (fdst < 0){
359 close(fsrc);
360 return false;
361 }
362
363 for (;;) {
364 br = read(fsrc, buffer, sizeof(buffer));
365 if (br < 0) {
366 res = false;
367 break;
368 }
369 if (br == 0)
370 break;
371
372 bw = write(fdst, buffer, br);
373 if ((bw < 0) || bw < br) {
374 res = false;
375 break;
376 }
377 }
378
379 close(fsrc);
380 close(fdst);
381
382 return res;
383}
384
385bool EEP_fdelete(const char *path)
386{
387 int res;
388
389 res = unlink(path);
390
391 return (res == 0);
392}
393
394bool SD_open(File *file, const char *path, int mode)
395{
396 int ret;
397
398 if (!SD_begin())
399 return false;
400
401 ret = open(path, mode);
402 if (ret < 0) {
403 file->fd = 0;
404 return false;
405 }
406
407 file->fd = ret;
408 return true;
409}
410
411bool SD_rmdir(const char *path)
412{
413 int ret;
414
415 if (!SD_begin())
416 return false;
417
418 ret = rmdir(path);
419
420 return ret == 0;
421}
422
423bool SD_rename(const char *path1, const char *path2)
424{
425 int ret;
426
427 if (!SD_begin())
428 return false;
429
430 ret = rename(path1, path2);
431
432 return ret == 0;
433}
434
435bool SD_remove(const char *path)
436{
437 int ret;
438
439 if (!SD_begin())
440 return false;
441
442 ret = unlink(path);
443
444 return ret == 0;
445}
446
447bool SD_exists(const char *path)
448{
449 int ret;
450 struct stat fno;
451
452 if (!SD_begin())
453 return false;
454
455 ret = stat(path, &fno);
456
457 return ret == 0;
458}
459
460bool SD_mkdir(const char *path)
461{
462 int ret;
463
464 if (!SD_begin())
465 return false;
466
467 ret = mkdir(path, 0777);
468
469 return ret == 0;
470}
471
472int file_write(File *fp, unsigned char *str, int len)
473{
474 int ret;
475
476 ret = write(fp->fd, str, len);
477 if (ret < 0)
478 return -1;
479
480 return ret;
481}
482
483void file_close(File *fp)
484{
485 close(fp->fd);
486}
487
488int file_size(File *fp)
489{
490 int ret;
491 struct stat fno;
492
493 ret = fstat(fp->fd, &fno);
494 if (ret < 0)
495 return -1;
496
497 return fno.st_size;
498}
499
500int file_position(File *fp)
501{
502 int ret;
503 struct stat fno;
504
505 ret = lseek(fp->fd, 0, SEEK_CUR);
506 if (ret < 0)
507 return -1;
508
509 return ret;
510}
511
512void file_flush(File *fp)
513{
514 fsync(fp->fd);
515}
516
517bool file_seek(File *fp, int pos)
518{
519 int ret;
520
521 ret = lseek(fp->fd, pos, SEEK_SET);
522
523 return ret == 0;
524}
525
526int file_read(File *fp)
527{
528 int ret;
529 char c;
530
531 ret = read(fp->fd, &c, 1);
532 if (ret < 0)
533 return -1;
534
535 return c;
536}
537
538void system_reboot(int mode)
539{
540 exit(mode);
541}
542
543int fileloader(const char *progVer, const char *binVer)
544{
545 return 0;
546}
547
548unsigned int Utf8_to_Utf16(const char *src, int *code_size)
549{
550 int i;
551 unsigned int uc = 0;
552 unsigned char len = 0;
553
554 len = 0;
555 if ((src[0] & 0x80) == 0) { uc = src[0] & 0x7F; len = 0; }
556 else if ((src[0] & 0xE0) == 0xC0) { uc = src[0] & 0x1F; len = 1; }
557 else if ((src[0] & 0xF0) == 0xE0) { uc = src[0] & 0x0F; len = 2; }
558 else if ((src[0] & 0xF8) == 0xF0) { uc = src[0] & 0x07; len = 3; }
559 else if ((src[0] & 0xFC) == 0xF8) { uc = src[0] & 0x03; len = 4; }
560 else if ((src[0] & 0xFE) == 0xFC) { uc = src[0] & 0x01; len = 5; }
561
562 i = 1;
563 while ((i <= len) && ((src[i] & 0xC0) == 0x80)) {
564 uc = (uc << 6) | (src[i] & 0x3F);
565 i++;
566 }
567
568 //消費文字数設定
569 *code_size = i;
570
571 //現状、2バイト限定
572 return uc;
573}
574
575int bs_char_count(char *str, int pos)
576{
577 int num = 1, local_pos = pos;
578 char *c;
579
580 while (1) {
581 c = str + local_pos;
582
583 if ((*c & 0x80) != 0x80)
584 return num;
585
586 if (((*c & 0xE0) == 0xC0) && (num == 2)) {
587 return num;
588 }
589 else if (((*c & 0xF0) == 0xE0) && (num == 3)) {
590 return num;
591 }
592 else if (((*c & 0xF8) == 0xF0) && (num == 4)) {
593 return num;
594 }
595 else if (((*c & 0xFC) == 0xF8) && (num == 5)) {
596 return num;
597 }
598 else if (((*c & 0xFE) == 0xFC) && (num == 6)) {
599 return num;
600 }
601 else {
602 if (local_pos > 0) {
603 local_pos--;
604 num++;
605 }
606 else
607 return 0;
608 }
609 }
610
611 return 0;
612}
Note: See TracBrowser for help on using the repository browser.