#include #include #include "../llbruby.h" serial_t *Serial; serial_t *Serial1; /*1:Serial1*/ serial_t *Serial2; /*2:Serial3*/ serial_t *Serial3; /*3:Serial2*/ serial_t *Serial4; /*4:Serial6*/ serial_t *Serial5; /*5:Serial7*/ i2c_t Wire1; i2c_t Wire2; i2c_t Wire3; i2c_t Wire4; i2c_t Wire5; FATFS RomDisk; SD Sd; char ExeFilename[64]; void arduino_init() { } void randomSeed(long seed) { } long arduino_random(long min, long max) { return min; } struct pin_node pin_list; static struct pin_node *find_pin(PinType type, PinName pin) { struct pin_node *ret = &pin_list; while (ret != NULL) { if ((ret->type == type) && (ret->pin == pin)) { break; } ret = ret->next; } return ret; } static struct pin_node *new_pin(PinType type, PinName pin) { struct pin_node *ret = calloc(1, sizeof(struct pin_node)); ret->next = pin_list.next; ret->type = type; ret->pin = pin; pin_list.next = ret; return ret; } struct pin_node *get_pin(PinType type, PinName pinno) { struct pin_node *pin; if (pinno == -1) return NULL; pin = find_pin(type, pinno); if (pin != NULL) return pin; pin = new_pin(type, pinno); if (pin == NULL) return NULL; switch (type) { case pintype_gpio: gpio_init(&pin->gpio, pinno); break; case pintype_dac: #if DEVICE_ANALOGOUT analogout_init(&pin->dac, pinno); #endif break; case pintype_pwmout: pwmout_init(&pin->pwmout, pinno); pin->period = 491; break; case pintype_analogin: analogin_init(&pin->analogin, pinno); break; } return pin; } bool portToPins(SCI_PORT port, PinName *txpin, PinName *rxpin) { switch (port) { case SCI_USB0: *txpin = 201; *rxpin = 202; break; case SCI_SCI0P2x: *txpin = 1; *rxpin = 2; break; case SCI_SCI2B: *txpin = 1; *rxpin = 2; break; case SCI_SCI6B: *txpin = 1; *rxpin = 2; break; case SCI_SCI2A: *txpin = 1; *rxpin = 2; break; default: *txpin = 0; *rxpin = 0; return false; } return true; } PinType get_pin_type(PinName pin) { struct pin_node *ret = &pin_list; while (ret != NULL) { if (ret->pin == pin) { return ret->type; } } return pintype_none; } void analogReference(int mode) { } void setPinModeDac(int pin) { } void tone(int pin, int frequency, int duration) { } void noTone(int pin) { } int serial_write(serial_t *serial, const unsigned char *buf, int len) { const char *c = (const char *)buf; for (int i = 0; i < len; i++) { serial_putc(serial, c[i]); } return len; } int serial_print(serial_t *serial, const char *str) { int i; for (i = 0; ; i++) { char c = str[i]; if (c == '\0') break; serial_putc(serial, c); } return i; } int serial_println(serial_t *serial, const char *str) { int i; for (i = 0; ; i++) { char c = str[i]; if (c == '\0') break; serial_putc(serial, c); } i++; serial_putc(serial, '\r'); i++; serial_putc(serial, '\n'); return i; } uint8_t EEPROM_write(int addr, uint8_t data) { return 0; } uint8_t EEPROM_read(int addr) { return 0xFF; } int EEP_fopen(FILEEEP *fp, const char *str, char mode) { FRESULT ret; BYTE fm; switch (mode){ case 0: fm = FA_READ; break; case 1: fm = FA_READ | FA_WRITE | FA_CREATE_NEW; break; case 2: fm = FA_READ | FA_WRITE; break; default: return -1; } ret = f_open(&fp->fp, str, fm); return (ret == FR_OK) ? 0 : -1; } int EEP_fwrite(FILEEEP *fp, byte *data, int *len) { FRESULT ret; ret = f_write(&fp->fp, data, (UINT)*len, (UINT *)len); return (ret == FR_OK) ? 1 : -1; } int EEP_fread(FILEEEP *fp) { FRESULT ret; char c; UINT br; ret = f_read(&fp->fp, &c, 1, &br); if (ret != FR_OK) return -1; return c; } void EEP_fclose(FILEEEP *fp) { f_close(&fp->fp); } int EEP_fseek(FILEEEP *fp, int pos, int mode) { FRESULT ret; switch (mode){ case EEP_SEEKTOP: ret = f_lseek(&fp->fp, pos); break; case EEP_SEEKCUR: ret = f_lseek(&fp->fp, fp->fp.fptr + pos); break; case EEP_SEEKEND: ret = f_lseek(&fp->fp, fp->fp.fsize - pos); break; default: ret = FR_INVALID_PARAMETER; break; } if (ret != FR_OK) f_lseek(&fp->fp, 0); return fp->fp.fptr; } int EEP_ffilesize(const char *str) { FRESULT ret; FILINFO fno; ret = f_stat(str, &fno); if (ret != FR_OK) return 0; return fno.fsize; } bool EEP_fEof(FILEEEP *fp) { return f_tell(&fp->fp) == f_size(&fp->fp); } bool EEP_fexist(const char *path) { FRESULT ret; FILINFO fno; ret = f_stat(path, &fno); return (ret == FR_OK); } bool EEP_fcopy(const char *src, const char *dst) { FIL fsrc, fdst; BYTE buffer[512]; FRESULT res; UINT br, bw; res = f_open(&fsrc, src, FA_OPEN_EXISTING | FA_READ); if (res != FR_OK) return false; res = f_open(&fdst, dst, FA_CREATE_ALWAYS | FA_WRITE); if (res != FR_OK){ f_close(&fsrc); return false; } for (;;) { res = f_read(&fsrc, buffer, sizeof(buffer), &br); if ((res != FR_OK) || br == 0) break; res = f_write(&fdst, buffer, br, &bw); if ((res != FR_OK) || bw < br) break; } f_close(&fsrc); f_close(&fdst); return (res == FR_OK); } bool EEP_fdelete(const char *path) { FRESULT res; res = f_unlink(path); return (res == FR_OK); } bool SD_begin() { DSTATUS dst; FRESULT res; BYTE pdrv = 1, type; if (Sd.FatFs.fs_type != 0) return true; if ((dst = disk_initialize(pdrv)) != RES_OK) { return false; } if ((dst = disk_ioctl(pdrv, MMC_GET_TYPE, &type)) != RES_OK) { Sd.dst = dst; Sd.type = 0; } else { Sd.dst = RES_OK; Sd.type = type; } if ((res = f_mount(&Sd.FatFs, "1:", 1)) != FR_OK) { return false; } return true; } bool SD_open(File *file, const char *path, int mode) { FRESULT ret; if (!SD_begin()) return false; ret = f_open(&file->fp, path, mode); return ret == FR_OK; } bool SD_rmdir(const char *path) { FRESULT ret; if (!SD_begin()) return false; ret = f_unlink(path); return ret == FR_OK; } bool SD_rename(const char *path1, const char *path2) { FRESULT ret; if (!SD_begin()) return false; ret = f_rename(path1, path2); return ret == FR_OK; } bool SD_remove(const char *path) { FRESULT ret; if (!SD_begin()) return false; ret = f_unlink(path); return ret == FR_OK; } bool SD_exists(const char *path) { FRESULT ret; FILINFO fno; if (!SD_begin()) return false; ret = f_stat(path, &fno); return ret == FR_OK; } bool SD_mkdir(const char *path) { FRESULT ret; if (!SD_begin()) return false; ret = f_mkdir(path); return ret == FR_OK; } int file_write(File *fd, unsigned char *str, int len) { FRESULT ret; UINT bw; ret = f_write(&fd->fp, str, len, &bw); if (ret != FR_OK) return -1; return bw; } void file_close(File *fd) { f_close(&fd->fp); } int file_size(File *fd) { return f_size(&fd->fp); } int file_position(File *fd) { return fd->fp.fptr; } void file_flush(File *fd) { f_flush(&fd->fp); } bool file_seek(File *fd, int pos) { FRESULT ret; ret = f_lseek(&fd->fp, pos); return ret != FR_OK; } int file_read(File *fd) { FRESULT ret; char c; UINT br; ret = f_read(&fd->fp, &c, 1, &br); if (ret != FR_OK) return -1; return c; } void system_reboot(int mode) { } int fileloader(const char *progVer, const char *binVer) { return 0; } DWORD get_fattime(void) { time_t temp; struct tm _tm; time(&temp); gmtime_r(&temp, &_tm); return ((DWORD)(_tm.tm_year - 1980) << 25) | ((DWORD)_tm.tm_mon << 21) | ((DWORD)_tm.tm_mday << 16) | ((DWORD)_tm.tm_hour << 11) | ((DWORD)_tm.tm_min << 5) | ((DWORD)_tm.tm_sec >> 1); } void mrb_gr_peach_gem_init(mrb_state *mrb) { } void mrb_gr_peach_gem_final(mrb_state *mrb) { }