Arudinoのfirmata(通信プロトコル)がmbedにないか探してみたところ
RPCというものを代わりに見つけました。
/myled1/write 1
文字列を送り込むとmbedのLEDなどを点灯できます。超お手軽。
・mbedのコード
int ret = MultiBoot("/local/test.gba"); if(ret == EXIT_FAILURE) { SystemError("MultiBoot", ret); } RpcDigitalOut myled1(LED1, "myled1"); RpcDigitalOut myled2(LED2, "myled2"); uint32_t r, cnt = 0; char buf[40], outbuf[40]; pc.printf("RPC GBA start\n"); for(;;) { WaitSPI32(0x0, 0x00010000, "Wait start signature"); cnt = 0; while((r = WriteSPI32NoDebug(0x0)) != 0x00020000) { *(uint32_t*)(&buf[cnt * 4]) = r; cnt++; } pc.printf("[%s]\n", buf); RPC::call(buf, outbuf); }
文字列をバッファに格納するまでspi通信を使っています。
シグネチャがなんか見っともないけれど、これはしょうがないかなあ。
・GBAのコード
IWRAM_CODE void RpcExec(void) { if(IrqSerialIsUse() == TRUE) { return; } bool isA = KeyIsTrgA(); bool isB = KeyIsTrgB(); if(isA == FALSE && isB == FALSE) { return; } if(isA == TRUE) { if(Rpc.isLED1 == FALSE) { RpcSerial("/myled1/write 1"); Rpc.isLED1 = TRUE; } else { RpcSerial("/myled1/write 0"); Rpc.isLED1 = FALSE; } } 以下略・・・
ちょっと反省会。
・gba側をspi通信のマスターにする方法がわからず、mbed側でポーリングしています。
gbatekにそれらしいの見つけたので後日修正予定。
・双方向していないです(汗。
・rpc、変数の値を文字列で返さない。ライブラリを作り替えないといけなさそう。
/var/read できず。/var/write 123は値が入ったことを確認しています。
・早くwikiのドキュメントを書け >ヲレ
電子工作をしないにしても知っていてよかったです。
一応、wikiの方にプログラムを上げときました。
NO.111 rpc