Словарь как структура данных в Arduino C ++ - PullRequest
0 голосов
/ 27 ноября 2018

Я пишу конвертер USB в PS / 2 в Arduino, и у меня есть структура данных, которую я реализовал бы как словарь, если бы использовал другой язык более высокого уровня.Записи будут выглядеть примерно так:

{ 0x29: { name: "esc", make: [0x76], break: [0xfe, 0x76] } }

Здесь 0x29 - это код USB для ключа, так что это ключ для поиска в словаре.Затем я бы использовал entry.name для целей отладки, entry.make - это массив байтов, который мне нужно отправить при нажатии клавиши (keyDown) и entry.break при отпускании клавиши (keyUp).

Как можно достичь этого в C ++?

1 Ответ

0 голосов
/ 27 ноября 2018

Похоже, что ArduinoSTL 1.1.0 не включает unordered_map, поэтому вы можете создать map, как это.

  1. Загрузите ZIP-файл Arduino STL иположите его куда-нибудь хорошо
  2. Sketch \ Include Library \ Add ZIP library и укажите полный путь к ZIP-файлу.

Затем он должен скомпилироваться, хотя и с большим количеством предупреждений STLо неиспользованных переменных.

#include <ArduinoSTL.h>    
#include <iostream>
#include <string>
#include <map>

struct key_entry {
    std::string name;
    std::string down;
    std::string up;
    key_entry() : name(), down(), up() {}
    key_entry(const std::string& n, const std::string& d, const std::string& u) :
        name(n),
        down(d),
        up(u)
    {}
};

using keydict = std::map<unsigned int, key_entry>;

keydict kd = {
    {0x28, {"KEY_ENTER",  "\x5a", "\xf0\x5a"}},
    {0x29, {"KEY_ESC",    "\x76", "\xf0\x76"}}
};

void setup() {
    Serial.begin( 115200 );  
}

void loop() {
    auto& a = kd[0x29];
    // use a.down or a.up (or a.name for debugging)
    Serial.write(a.up.c_str(), a.up.size());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...