あーさん日記

https://akkera102.sakura.ne.jp/gbadev/ の中の人

SIO通信5

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