bool jsfsInit() { #ifndef LINUX if (!fat_initialised) { #ifdef SD_CARD_ANYWHERE if (!isSdSPISetup()) { #ifdef SD_SPI const char *deviceStr = jshGetDeviceString(SD_SPI); JsVar *spi = jsvSkipNameAndUnLock(jspGetNamedVariable(deviceStr)); JshSPIInfo inf; jshSPIInitInfo(&inf); inf.pinMISO = SD_DO_PIN; inf.pinMOSI = SD_DI_PIN; inf.pinSCK = SD_CLK_PIN; jshSPISetup(SD_SPI, &inf); sdSPISetup(spi, SD_CS_PIN); jsvUnLock(spi); #else jsError("SD card must be setup with E.connectSDCard first"); return false; #endif } #endif FRESULT res; if ((res = f_mount(&jsfsFAT, "", 1/*immediate*/)) != FR_OK) { jsfsReportError("Unable to mount SD card", res); return false; } fat_initialised = true; } #endif return true; }
/*JSON{ "type" : "kill", "generate" : "jswrap_file_kill" }*/ void jswrap_file_kill() { JsVar *arr = fsGetArray(false); if (arr) { JsvObjectIterator it; jsvObjectIteratorNew(&it, arr); while (jsvObjectIteratorHasValue(&it)) { JsVar *file = jsvObjectIteratorGetValue(&it); jswrap_file_close(file); jsvUnLock(file); jsvObjectIteratorNext(&it); } jsvObjectIteratorFree(&it); jsvRemoveAllChildren(arr); jsvUnLock(arr); } // close fs library #ifndef LINUX if (fat_initialised) { fat_initialised = false; f_mount(0, 0, 0); } #endif #ifdef SD_CARD_ANYWHERE sdSPISetup(0, PIN_UNDEFINED); #endif }
/*JSON{ "type" : "staticmethod", "class" : "E", "name" : "connectSDCard", "generate" : "jswrap_E_connectSDCard", "ifndef" : "SAVE_ON_FLASH", "params" : [ ["spi","JsVar","The SPI object to use for communication"], ["csPin","pin","The pin to use for Chip Select"] ] } Setup the filesystem so that subsequent calls to `E.openFile` and `require('fs').*` will use an SD card on the supplied SPI device and pin. It can even work using software SPI - for instance: ``` var spi = new SPI(); spi.setup({mosi:C7,miso:C8,sck:C9}); E.connectSDCard(spi,C6); console.log(require("fs").readdirSync()); ``` */ void jswrap_E_connectSDCard(JsVar *spi, Pin csPin) { #ifdef SD_CARD_ANYWHERE if (!jsvIsObject(spi)) { jsExceptionHere(JSET_ERROR, "First argument is a %t, not an SPI object\n", spi); return; } if (!jshIsPinValid(csPin)) { jsExceptionHere(JSET_ERROR, "Second argument is not a valid pin"); return; } jswrap_E_unmountSD(); sdSPISetup(spi, csPin); #else jsExceptionHere(JSET_ERROR, "Unimplemented on Linux"); #endif }
bool jsfsInit() { #ifndef LINUX if (!fat_initialised) { #ifndef USE_FLASHFS #ifdef SD_CARD_ANYWHERE if (!isSdSPISetup()) { #ifdef SD_SPI const char *deviceStr = jshGetDeviceString(SD_SPI); JsVar *spi = jsvSkipNameAndUnLock(jspGetNamedVariable(deviceStr)); JshSPIInfo inf; jshSPIInitInfo(&inf); inf.baudRate = 4000000; // 4Mhz bit rate for onboard SD cards inf.pinMISO = SD_DO_PIN; inf.pinMOSI = SD_DI_PIN; inf.pinSCK = SD_CLK_PIN; jshSPISetup(SD_SPI, &inf); sdSPISetup(spi, SD_CS_PIN); jsvUnLock(spi); #else jsExceptionHere(JSET_ERROR,"SD card must be setup with E.connectSDCard first"); return false; #endif // SD_SPI } #endif // SD_CARD_ANYWHER #endif // USE_FLASHFS FRESULT res; if ((res = f_mount(&jsfsFAT, "", 1)) != FR_OK) { jsfsReportError("Unable to mount media", res); return false; } fat_initialised = true; } #endif // LINUX return true; }