見出し画像

ESP32でTWSNMPのセンサー開発5日目:Arduino IDE 2.x+VS Codeで快適に開発できるようになってベンダー名検索でメモリ不足が発生する問題を解決できた

今朝は3時に助手の猫さんが起こしてくれました。昨日から吐き戻し軽減のカリカリに替えて猫さんの体調は良くなったようです。

まず、ESP32のソースコードの編集をVS Codeで行えるようにできました。Arudino IDEの拡張機能は入れていませんがC++の拡張だけでもかなり開発効率アップです。
Arduino IDE 2.xで開発しているプロジェクトのフォルダをVS Code で開いてコードを編集して保存すれば、Arduino IDE側にもすぐに反映されます。逆にArduino IDEで編集してもVS Code側に反映されます。どちらで編集してもOKということです。
C++のソースコードの補完は、

のようにVS Codeの下のほうにあるC++の構成をクリックするとメニューが表示されます。構成をJSONで編集を実行すれば
.vscode/c_cpp_properties.json
のファイルができるので、

{
    "configurations": [
        {
            "name": "Mac",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [],
            "macFrameworkPath": [
                "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks"
            ],
            "compilerPath": "/usr/bin/clang",
            "cStandard": "c17",
            "cppStandard": "c++17",
            "intelliSenseMode": "macos-clang-x64"
        },
        {          
            "name": "Arduino-esp32",
            "includePath": [
                "/Users/<ユーザー名>/Library/Arduino15//packages/esp32/hardware/**",
                "${workspaceRoot}"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE"
            ],
            "compilerPath": "/usr/bin/clang",
            "cStandard": "c17",
            "cppStandard": "c++17",
            "intelliSenseMode": "macos-clang-x64",
            "browse": {
                "path": [
                    "/Users/<ユーザー名>/Library/Arduino15//packages/esp32/hardware/**",
                    "${workspaceRoot}"
                ],
                "limitSymbolsToIncludedHeaders": true,
                "databaseFilename": ""
            } 
          }
    ],
    "version": 4
}

のようにArduino-esp32の部分を追加すればOKです。主にヘッダーファイルが、どこにあるかだけ追加しています。
Windowsの場合は、パスが違うので探してください。

のようにコードの補完や定義位置への移動が快適に動作します。
文法チェックは動作しませんが、エディタの動作も滑らかなのでかなり開発が快適になります。

Bluetoothのベンダーコードからベンダー名を検索する処理を、昨日は組み込むベンダー名のデータを削って対応しましたが、ちゃんと対応できる技をあみだしました。
いろいろ調べているとPROGMEM

という仕組みを使えばデータを容量の少ないSRAMではなくFLASHメモリに配置できるらいしいということがわかりました。これでメモリ不足を解消できると思いました。さらに調べてみるとArduino IDE +ESP32の場合、

にあるようにPROGMEMは無意味で、constと書けばよいらしいことがわかりました。

そこで作ってみました。
まず、ベンダーコードとベンダー名は

struct codeToVendorEnt {
  const int16_t code;
  const char *name;
};

const codeToVendorEnt codetVendorList[] =
{
{ 0x0D6B,"Crane Payment Innovations, Inc."},
{ 0x0D6A,"Helge Kaiser GmbH"},
{ 0x0D69,"AIR AROMA INTERNATIONAL PTY LTD"},
|

のような感じで定義します。データは、

からダウンロードしたものを昨日書いたGO言語のプログラムで整形したものです。
毎回、このリストから検索すると時間がかかるので、

std::map<int16_t, const char *> codeToVendor;

const char* getVendorFromCode(int16_t code) {
  if(codeToVendor.count(code)) {
    return codeToVendor[code]; 
  }
  for(codeToVendorEnt e:codetVendorList) {
    if( e.code == code) {
      codeToVendor[code] = e.name;
      return e.name;
    }
  }
  codeToVendor[code] = "";
  return "";
}

のような処理でstd::mapを使ってキャッシュできるようにしました。なかなかよいアイデアです。
これでメモリ不足なく動作するようになりました。

これでWifiとBluetoothのセンサーは動くことが確認できたので、センサーを多くの人が使えるようにしようと思います。
そのために、

  • Wifiに接続するSSID、パスワード、syslogの送信先などをシリアルポートから設定できるようにする

  • 設定をFLASHメモリーに保存して再起動しても動作するようにする

の2つを考えようと思いますが、今朝は時間切れです。

明日に続く

いいなと思ったら応援しよう!

twsnmp
開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。