ESP32 btstack が動かない

 買って直後に書きました。

 軽い気持ちで Bluetooth で遊んでみようと思ったのも束の間、公式には BT Stack ライブラリがないぽく、かなり低レベルなところから自作しないといけないことが 昨日判明。


 最終的に https://github.com/bluekitchen/btstack を ESP32(Arduino) 向けに移植するのが最もベターな気がする という結論に達しましたが、Arduino でライブラリをデバッグするコツが掴めず。


 今頃、外人さんがコード書いてるところ だろうから、もうちょっと待ってみるか、って気持ちに傾きつつある軟弱者です。。

 あの btstack は(私にとっては)高機能すぎるので、自分のほうは更にシンプルぽい USB_Host_Shield_2.0 を参考にしつつ移植に勤しんでいて何とかコンパイルが通るところまで進んでいたのですが、どうもその間に bluekitchen さん御本人が ESP32 にも対応してくれたみたい。


 Arduino 環境でも動かそうとチャレンジしたのですが、リンクさせるものとさせないものの区別が困難を極め・・・
 なので、Arduino じゃなくて ESP-IDF の環境を用意してみました。
(ESP-IDF で動かしたうえで Arduino に持って行ったほうが良かろうという判断)


 適当なフォルダを掘って、そこをカレントにした上で

git clone https://github.com/bluekitchen/btstack.git

Branch が master じゃないので

cd btstack
git checkout -b esp32 origin/esp32

 カレントを port/esp32 に移動させてコンパイルする流儀のようです

cd port/esp32
make
make flash

 何となくうまく進んだぽいのですがシリアルモニターには

BTDM CONTROLLER VERSION: 010101
BTDM ROM VERSION 0101
BD_ADDR: 24:0A:C4:XX:XX:XX
NVDS MAGIC FAILED
RF Init OK with coex
btstack_task start
-------------- btstack_setup
-------------- btstack_setup end
-------------- btstack_main
[00:00:02.358] LOG -- transport_can_send_packet_now 1, esp_vhci_host_check_send_available 0

[00:00:02.364] LOG -- transport_can_send_packet_now 1, esp_vhci_host_check_send_available 0

[00:00:02.372] LOG -- transport_can_send_packet_now 1, esp_vhci_host_check_send_available 0

BTstack counter 0001
[00:00:02.382] EVT <= 60 01 01
[00:00:02.385] LOG -- transport_can_send_packet_now 1, esp_vhci_host_check_send_available 0

[00:00:02.393] LOG -- transport_can_send_packet_now 1, esp_vhci_host_check_send_available 0

[00:00:02.402] LOG -- transport_can_send_packet_now 1, esp_vhci_host_check_send_available 0

[00:00:02.410] LOG -- hci_initializing_run: substate 0, can send 1
[00:00:02.416] LOG -- transport_can_send_packet_now 1, esp_vhci_host_check_send_available 0

[00:00:02.424] CMD => 03 0C 00
VHCI: Controller is not run
-------------- btstack_main end

 ソースは読み切れてないものの、BTstack counter がカウントアップされていくべき気がするんですが、「VHCI: Controller is not run」っていう何か良くない気がするメッセージで終わってます。
 Controller が動いてない?


 どんな条件のときに「Controller is not run」が出るのか探ろうと grep してみても、プリコンパイルな libbtdm_app.a しか見つからず糸口なし。


 うーん・・・


(追記)
 どうも Bluetooth 機能が有効化されていないみたい。


btstack/port/esp32/main/main.c に以下を追加

static bool btStart(){
    if(esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_ENABLED){
        return true;
    }
    if(esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_IDLE){
        esp_bt_controller_init();
        while(esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_IDLE){}
    }
    if(esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_INITED){
        if (esp_bt_controller_enable(ESP_BT_MODE_BTDM)) {
            printf("BT Enable failed");
            return false;
        }
    }
    if(esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_ENABLED){
        return true;
    }
    printf("BT Start failed");
    return false;
}

 そのうえで、btstack_setup(void) の中をちょっと修正

static void btstack_setup(void){

    btStart();                             // これ追加
    hci_dump_open(NULL, HCI_DUMP_STDOUT);

 そうすると、「VHCI: Controller is not run」が消えて、もっと動いた感じになります。
(ただし、btStart() が失敗したときを無視しているので、これはこれで要対策)


 が、HCI や ACL と言った話のことを理解しないと次のステップには進めなさそうな雲行き。。
 自分が目標としている SPP では更に RFCOMM などというものの理解も必要みたいで、うーん、敷居が高い。。。


(追記)2017/04/04
 ちょっとだけ進展しました。
 ESP32 の Classic BT で Change_Local_Name が使えない? をどうぞ