WioLTEのSDカードは使えるのか？（未解決）

# SDカードスロットがありますね

Wio LTEのSDカードスロットは3G/LTE通信用のSIMカードスロットと共通、というか2階建てになっているので、SIMを挿そうとして困った方もいらっしゃるかもしれません。

[Espruino公式のWioLTEページ](https://www.espruino.com/WioLTE)には、「Using SD Card」という項目があります。読むと（拙訳）

* SDカードはEspruino標準のファイルI/Oで取り扱い可能
* ただし電源ONから4秒以上待たないと初期化が終わらないので使えない

という注意書きと共にサンプルコードが提示されていました。

```javascript
var fs = require('fs');

// Init SDCard
WioLTE.init;

var test = function() {
  // List files
  console.log('List files on root path:\r\n', fs.readdirSync());
  // Write file  
  fs.writeFileSync("hello.txt", "Hello World");
  // read file
  console.log(fs.readFileSync("hello.txt"));
  // append file
  fs.appendFileSync("hello.txt", "!!!");
  // read again
  console.log(fs.readFileSync("hello.txt"));
};

setTimeout(test, 4000);
```

# WioLTE.init（？）

ここで妙なことに気がつきました。```WioLTE.init;```という行がありますが、ハードウェアリファレンスマニュアルの[WioLTEの項目](https://www.espruino.com/Reference#WioLTE)には「定義済み」項目として

* WioLTE.A4
* WioLTE.A6
* WioLTE.D20
* WioLTE.D38
* WioLTE.I2C
* WioLTE.LED(red, green, blue)
* WioLTE.setGrovePower(onoff)
* WioLTE.setLEDPower(onoff)
* WioLTE.UART

が挙げられており、```WioLTE.init```という項目はありません。実際、Web IDE上で

```
>WioLTE. <-ここでTABキーを押してコード補完する
A4                  A6
D20                 D38
I2C                 LED
UART                setGrovePower
setLEDPower         apply
bind                call
replaceWith         clone
emit                hasOwnProperty
length              on
removeAllListeners  removeListener
toString            valueOf
```

としてコード補完を試みてもinitは出てきません。

# 困った時のソースコード

そもそも、WioLTE向けの定義はどこに書かれているのでしょうか？　それを探すと解決の糸口が見つかるかもしれません。GitHubには[Espruinoのリポジトリ](https://github.com/espruino/Espruino)があり、ここを探せば見つかる可能性が高そうです。

どのファイルが使われているかは[Makefile](https://github.com/espruino/Espruino/blob/master/Makefile)に書かれている可能性があります。WioLTEに関する記述を探すとこんなものが見つかりました。

```makefile
ifdef USE_WIO_LTE
  INCLUDE += -I$(ROOT)/libs/wio_lte
  WRAPPERSOURCES += libs/wio_lte/jswrap_wio_lte.c
  SOURCES += targets/stm32/stm32_ws2812b_driver.c
endif
```

どうやら```libs/wio_lte/jswrap_wio_lte.c```に何か書かれていそうですね。このファイルを探ってみると

```c
/*JSON{
  "type" : "init",
  "generate" : "jswrap_wio_lte_init"
}*/
void jswrap_wio_lte_init() {
  // initialise the SD card
  jsvUnLock(jspEvaluate("(function(){digitalWrite(A15,1);var spi=new SPI();spi.setup({mosi:D2,miso:C8,sck:C12});E.connectSDCard(spi,C11);})();",true));
}
```
という記述がありました。どうやらWioLTE.initはちゃんと定義されているようですね。ここで```"type": "init"```と指定されていますが、これは```script/common.py```に説明があり、

```
#                      // init = function to run on initialisation
```

ということでボードの初期化時に実行されるコードのようです。要するに、[Espruino公式のWioLTEページ](https://www.espruino.com/WioLTE)に書かれている説明は誤り（あるいは古い）記述であり、```WioLTE.init;```は初期化時に実行済みであることが推定されます。

# アクセスしてみよう

という訳で先に進みます。

```JavaScript
>var fs=require("fs");
=function () { [native code] }
>fs.readdirSync()
Uncaught Error: Unable to mount media : NOT_READY
 at line 1 col 16
fs.readdirSync()
               ^
>
```

あれ？？　メディアが```NOT_READY```ということでアクセスが蹴られてしまいました。まだ何か間違いがあるのでしょうか？？

もしやWioLTE.initに相当するコードが初期化時に実行されていない？　という可能性も考え、こんなコードを動かしてみました。単に上記の初期化コードを書き直し、それからSDカードへのアクセスを試みたものです。

```JavaScript
digitalWrite(A15,1);
var spi=new SPI();
spi.setup({mosi:D2,miso:C8,sck:C12});
E.connectSDCard(spi,C11);

var fs=require("fs");

var test = function() {
  var result = fs.readdirSync();
  console.log("dir\r\n", result);
};

setTimeout(test, 4000);
```

すると

```
>
>
 _____                 _
|   __|___ ___ ___ _ _|_|___ ___
|   __|_ -| . |  _| | | |   | . |
|_____|___|  _|_| |___|_|_|_|___|
          |_| http://espruino.com
 1v95 Copyright 2017 G.Williams
Espruino is Open Source. Our work is supported
only by sales of official boards and donations:
http://espruino.com/Donate
>
=undefined
Uncaught Error: Unable to mount media : NOT_READY
 at line 9 col 29
var result = fs.readdirSync();
                            ^
in function called from system
> 
```

やはりNOT_READYで読み込めません。なぜ？？？？？