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

Last change on this file since 446 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
RevLine 
[270]1#include <arduino.h>
2#include <mruby.h>
[279]3#include <stdlib.h>
4#include <stdio.h>
5#include <fcntl.h>
[331]6#include <sys/stat.h>
[270]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{
[279]30 srand(seed);
[270]31}
32
33long arduino_random(long min, long max)
34{
[279]35 return (long)(((double)rand() / (double)RAND_MAX) / ((double)max - (double)min)) + min;
[270]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{
[279]227 int ret;
228 int fm;
[270]229
230 switch (mode){
231 case 0:
[279]232 fm = O_RDONLY;
[270]233 break;
234 case 1:
[279]235 fm = O_RDWR | O_CREAT;
[270]236 break;
237 case 2:
[279]238 fm = O_RDWR;
[270]239 break;
240 default:
241 return -1;
242 }
243
[279]244 ret = open(str, fm);
245 if (ret < 0) {
246 fp->fd = 0;
247 return -1;
248 }
249 fp->fd = ret;
[270]250
[279]251 return 0;
[270]252}
253
254int EEP_fwrite(FILEEEP *fp, byte *data, int *len)
255{
[279]256 int ret;
[270]257
[279]258 ret = write(fp->fd, data, *len);
259 if (ret < 0) {
260 *len = 0;
261 return -1;
262 }
263 *len = ret;
[270]264
[279]265 return 0;
[270]266}
267
268int EEP_fread(FILEEEP *fp)
269{
[279]270 int ret;
[270]271 char c;
272
[279]273 ret = read(fp->fd, &c, 1);
274 if (ret < 0)
[270]275 return -1;
276
277 return c;
278}
279
280void EEP_fclose(FILEEEP *fp)
281{
[279]282 close(fp->fd);
[270]283}
284
285int EEP_fseek(FILEEEP *fp, int pos, int mode)
286{
[279]287 int ret;
[270]288
289 switch (mode){
290 case EEP_SEEKTOP:
[279]291 ret = lseek(fp->fd, pos, SEEK_SET);
[270]292 break;
293 case EEP_SEEKCUR:
[279]294 ret = lseek(fp->fd, pos, SEEK_CUR);
[270]295 break;
296 case EEP_SEEKEND:
[279]297 ret = lseek(fp->fd, pos, SEEK_END);
[270]298 break;
299 default:
[279]300 return -1;
[270]301 break;
302 }
303
[279]304 if (ret < 0)
305 return false;
[270]306
[279]307 return true;
[270]308}
309
310int EEP_ffilesize(const char *str)
311{
[279]312 int ret;
313 struct stat fno;
[270]314
[279]315 ret = stat(str, &fno);
316 if (ret < 0)
[270]317 return 0;
318
[279]319 return fno.st_size;
[270]320}
321
322bool EEP_fEof(FILEEEP *fp)
323{
[279]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;
[270]334}
335
336bool EEP_fexist(const char *path)
337{
[279]338 int ret;
339 struct stat fno;
[270]340
[279]341 ret = stat(path, &fno);
[270]342
[279]343 return (ret == 0);
[270]344}
345
346bool EEP_fcopy(const char *src, const char *dst)
347{
[279]348 int fsrc, fdst;
349 unsigned char buffer[512];
350 int res = true;
351 int br, bw;
[270]352
[279]353 fsrc = open(src, O_RDONLY);
354 if (fsrc < 0)
[270]355 return false;
356
[279]357 fdst = open(dst, O_RDWR | O_CREAT);
358 if (fdst < 0){
359 close(fsrc);
[270]360 return false;
361 }
362
363 for (;;) {
[279]364 br = read(fsrc, buffer, sizeof(buffer));
365 if (br < 0) {
366 res = false;
[270]367 break;
[279]368 }
369 if (br == 0)
370 break;
[270]371
[279]372 bw = write(fdst, buffer, br);
373 if ((bw < 0) || bw < br) {
374 res = false;
[270]375 break;
[279]376 }
[270]377 }
378
[279]379 close(fsrc);
380 close(fdst);
[270]381
[279]382 return res;
[270]383}
384
385bool EEP_fdelete(const char *path)
386{
[279]387 int res;
[270]388
[279]389 res = unlink(path);
[270]390
[279]391 return (res == 0);
[270]392}
393
[279]394bool SD_open(File *file, const char *path, int mode)
[270]395{
[279]396 int ret;
[270]397
[279]398 if (!SD_begin())
[270]399 return false;
400
[279]401 ret = open(path, mode);
402 if (ret < 0) {
403 file->fd = 0;
[270]404 return false;
405 }
406
[279]407 file->fd = ret;
[270]408 return true;
409}
410
411bool SD_rmdir(const char *path)
412{
[279]413 int ret;
[270]414
415 if (!SD_begin())
416 return false;
417
[279]418 ret = rmdir(path);
[270]419
[279]420 return ret == 0;
[270]421}
422
423bool SD_rename(const char *path1, const char *path2)
424{
[279]425 int ret;
[270]426
427 if (!SD_begin())
428 return false;
429
[279]430 ret = rename(path1, path2);
[270]431
[279]432 return ret == 0;
[270]433}
434
435bool SD_remove(const char *path)
436{
[279]437 int ret;
[270]438
439 if (!SD_begin())
440 return false;
441
[279]442 ret = unlink(path);
[270]443
[279]444 return ret == 0;
[270]445}
446
447bool SD_exists(const char *path)
448{
[279]449 int ret;
450 struct stat fno;
[270]451
452 if (!SD_begin())
453 return false;
454
[279]455 ret = stat(path, &fno);
[270]456
[279]457 return ret == 0;
[270]458}
459
460bool SD_mkdir(const char *path)
461{
[279]462 int ret;
[270]463
464 if (!SD_begin())
465 return false;
466
[279]467 ret = mkdir(path, 0777);
[270]468
[279]469 return ret == 0;
[270]470}
471
[279]472int file_write(File *fp, unsigned char *str, int len)
[270]473{
[279]474 int ret;
[270]475
[279]476 ret = write(fp->fd, str, len);
477 if (ret < 0)
[270]478 return -1;
479
[279]480 return ret;
[270]481}
482
[279]483void file_close(File *fp)
[270]484{
[279]485 close(fp->fd);
[270]486}
487
[279]488int file_size(File *fp)
[270]489{
[279]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;
[270]498}
499
[279]500int file_position(File *fp)
[270]501{
[279]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;
[270]510}
511
[279]512void file_flush(File *fp)
[270]513{
[279]514 fsync(fp->fd);
[270]515}
516
[279]517bool file_seek(File *fp, int pos)
[270]518{
[279]519 int ret;
[270]520
[279]521 ret = lseek(fp->fd, pos, SEEK_SET);
[270]522
[279]523 return ret == 0;
[270]524}
525
[279]526int file_read(File *fp)
[270]527{
[279]528 int ret;
[270]529 char c;
530
[279]531 ret = read(fp->fd, &c, 1);
532 if (ret < 0)
[270]533 return -1;
534
535 return c;
536}
537
538void system_reboot(int mode)
539{
[279]540 exit(mode);
[270]541}
542
543int fileloader(const char *progVer, const char *binVer)
544{
545 return 0;
546}
[331]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.