IJFW - IchigoJamのBASICプログラムをメモリカード(MMCまたは互換カード)に保存したり読み出したりできるプログラム。メモリカードにファームウェアのファイルを置くだけで、電源ON時に自動的に書き換える機能も搭載(一応こちらがメイン)。LPC1114FN28専用。
参考URL http://www.cyberchabudai.org/index.php/entry?tag=IJFW
FatfsIjfwConfigrable/FatfsIjfwConfigurable.cpp
- Committer:
- oks486
- Date:
- 2016-08-21
- Revision:
- 2:daf6c4719496
- Parent:
- 1:11f73f269fdc
File content as of revision 2:daf6c4719496:
#include "mbed.h" #include "ff.h" #include "FatfsIjfwConfigurable.h" FatfsIjfwConfigurable::FatfsIjfwConfigurable(SPI* _spi, DigitalOut* _cs) : FatfsIJFW(_spi, _cs) { initConfigItem(); } void FatfsIjfwConfigurable::initConfigItem() { strncpy(configitem[0].itemName, "FirmUpdate", ITEM_NAME_LENGTH); strncpy(configitem[0].itemValue, "1", ITEM_VAL_LENGTH); strncpy(configitem[1].itemName, "FirmFileDelete", ITEM_NAME_LENGTH); strncpy(configitem[1].itemValue, "1", ITEM_VAL_LENGTH); strncpy(configitem[2].itemName, "BasDirectory", ITEM_NAME_LENGTH); strncpy(configitem[2].itemValue, "", ITEM_VAL_LENGTH); } int FatfsIjfwConfigurable::setConfigValue(const char* setName, const char* setValue) { for (int i = 0; i < CONFIG_ITEM_NUM; i++) { if (strncmp(configitem[i].itemName, setName, ITEM_NAME_LENGTH) == 0) { strncpy(configitem[i].itemValue, setValue, ITEM_VAL_LENGTH); configitem[i].itemValue[ITEM_VAL_LENGTH] = '\0'; // if setValue length is equal to ITEM_VAL_LENGTH return 1; } } return 0; } int FatfsIjfwConfigurable::getConfigValue(const char* setName, char* buf) { for (int i = 0; i < CONFIG_ITEM_NUM; i++) { if (strncmp(configitem[i].itemName, setName, ITEM_NAME_LENGTH) == 0) { strncpy(buf, configitem[i].itemValue, ITEM_VAL_LENGTH); buf[ITEM_VAL_LENGTH] = '\0'; // if itemValue length is equal to ITEM_VAL_LENGTH return 1; } } return 0; } int FatfsIjfwConfigurable::readLine(char* buf, int length) { if (f_gets(buf, (UINT)length, &file) != NULL) { return 1; } return 0; } int FatfsIjfwConfigurable::readConfigFile(const char* configFiie) { mount(); if (open(configFiie, MODE_RO) != FR_OK) { return -1; } int retval = 0; char buf[42], tempbuf[64]; while(readLine(tempbuf, sizeof(tempbuf))) { // delete space and tab for (int i = 0, j = 0; i < sizeof(tempbuf); i++) { if (tempbuf[i] != ' ' && tempbuf[i] != '\t') { if (j < sizeof(buf)) { buf[j] = tempbuf[i]; j++; } } if (tempbuf[i] == 0x0d || tempbuf[i] == 0x0a) { buf[j] = '\0'; break; } } // comment if (buf[0] == '#') { continue; } // position of separator int i, pos_sep; for (i = 0; i < sizeof(buf); i++) { if (buf[i] == '=') { pos_sep = i; buf[i] = '\0'; } else if (buf[i] == '\0') { break; } } // check length if (pos_sep > ITEM_NAME_LENGTH - 1) { retval = -2; } if ( (i-1) - (pos_sep+1) > ITEM_VAL_LENGTH - 1) { retval = -3; } // set value setConfigValue(buf, &buf[pos_sep+1]); } close(); return retval; } int FatfsIjfwConfigurable::openBas(const char* name, const FileMode mode) { char buf[ITEM_VAL_LENGTH+1]; getConfigValue("BasDirectory", buf); if (strlen(buf) > 0) { mkdir(buf); chdir("/"); int res = chdir(buf); if (res != FR_OK) { return res; } } return open(name, mode); } int FatfsIjfwConfigurable::chdir(const char* path) { FRESULT res = f_chdir(path); return (int)res; } int FatfsIjfwConfigurable::checkFirmFile(const char* binfile) { char buf[ITEM_VAL_LENGTH+1]; getConfigValue("FirmUpdate", buf); if (strncmp(buf, "0", 1) == 0) { return 0; } mount(); if (open(binfile, MODE_RO) == FR_OK) { close(); return 1; } return 0; } int FatfsIjfwConfigurable::deleteFirmFile(const char* binfile) { char buf[ITEM_VAL_LENGTH+1]; getConfigValue("FirmFileDelete", buf); if (strncmp(buf, "1", 1) == 0) { remove(binfile); return 1; } return 0; }