Реализовать запись в EEPROM в нестандартной прошивке movesense
Я пытаюсь интегрировать ведение журнала в EEPROM в мою специальную прошивку movesense. Читая документы по службе ведения журнала, я убедился, что у меня настроена система ведения журнала с моими объектами на белой доске и что ведение журнала включено (состояние ведения журнала установлено на 3) со следующим кодом:
WB_RES::DataLoggerConfig dConfig;
WB_RES::DataEntry dEntry, dEntry1;
WB_RES::DataLoggerStateValues::Type dlstate = WB_RES::DataLoggerStateValues::Type::DATALOGGER_LOGGING;
dEntry.path = "/App/Object1";
dEntry1.path = "/App/Object2";
dConfig.dataEntries.dataEntry = {dEntry, dEntry1};
result = asyncPut(WB_RES::LOCAL::MEM_DATALOGGER_CONFIG(), AsyncRequestOptions::Empty, dConfig);
if(!wb::RETURN_OKC(result))
DebugLogger::info("asyncPut::datalogger config threw error: %u", result);
result = asyncPut(WB_RES::LOCAL::MEM_DATALOGGER_STATE(), AsyncRequestOptions::Empty, dlstate);
if(!wb::RETURN_OKC(result))
DebugLogger::info("asyncPut::datalogger start threw error: %u", result);
Пути к объектам доски, которые я настроил в файле yaml:
paths: /App/Object1/Subscription:
<blah, post/delete actions defined>
paths: /App/Object2/Subscription:
<blah, post/delete actions defined>
Прежде всего, это правильно, при получении прошивки movesense для регистрации этих объектов доски? Какова связь между путем к доске, определенным в файле yaml, и путем ввода данных, который мы настраиваем в коде? Они должны точно соответствовать?
Во-вторых, если у меня есть вышеуказанное правильное значение, будут ли записи автоматически регистрироваться, когда я отправляю уведомление подписанным потребителям (в настоящее время выполняется в методе onNotify()), или мне придется создавать конкретный объект wb::LogEntry и заполните это, а затем выполните asyncPost для цели MEM_LOGBOOK_ENTRIES(), вот так:
wb::LogEntry foo;
result = asyncPost(WB_RES::LOCAL::MEM_LOGBOOK_ENTRIES(), AsyncRequestOptions::Empty, foo);
Если это так, то являются ли они вспомогательными функциями, помогающими заполнить объект wb::LogEntry, поскольку, похоже, вам нужен идентификатор, отметка времени, а затем объект данных доски? Или мы должны создать их сами?
1 ответ
Ваша основная идея верна, но есть некоторые детали, которые немного не соответствуют.
Сначала делим два компонента, DataLogger и Журнал:
- DataLogger заботится обо всем, чтобы сохранить данные в памяти EEPROM
- Журнал может быть использован для чтения данных из памяти EEPROM (и стирания их в чистое состояние)
DataLogger работает, подписываясь на пути, указанные в /Mem/DataLogger/Config, а затем сохраняя уведомления об этих подписках (нет необходимости что-либо делать с / Registry /Entries).
Простой поток:
- PUT пути для входа в /Mem/DataLogger/Config
- PUT 3 в /Mem/DataLogger/State, чтобы начать запись
--- Регистрация здесь происходит ---
- PUT 2 в /Mem/DataLogger/State, чтобы остановить запись
Однако некоторые детали неверны в вашем коде. Результат операции Config и State PUT появляется в обратном вызове onPutResult(). Таким образом, чтобы быть уверенным, что конфигурация верна, вы должны инициировать изменение состояния после получения status = 200 в обратном вызове /Config PUT.
Также есть некоторые ограничения на то, что может быть зарегистрировано. в основном:
- если существует несколько массивов, они должны быть одинаковой длины (например, /Meas/IMU9)
- строки не поддерживаются
Чтобы увидеть, как объекты значений уведомлений хранятся в EEPROM, смотрите /generated/sbem-code/sbem_definitions.cpp. Если ваш тип не появляется там, то что-то в вашем сервисе yaml препятствует сериализации.
Чтобы ознакомиться с API DataLogger и Журнала, обратитесь к Android-приложению DataLoggerSample в репозитории movesense -mobile -lib.