在 movesense 自定义固件中实现对 EEPROM 的记录

Implement logging to EEPROM in movesense custom firmware

我希望在我的自定义 movesense 固件中将日志记录集成到 EEPROM。阅读有关日志记录服务的文档,我已验证我已使用自定义白板对象配置了日志记录系统,并且已启用日志记录(日志记录状态设置为 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文件中定义的白板路径与我们在代码中配置的数据录入路径有什么关系?它们必须完全匹配吗?

其次,如果我的上述内容正确,那么当我 post 向订阅的消费者发出通知时(目前在 onNotify() 方法中完成),是否会自动记录条目,或者我是否会创建一个特定的 wb::LogEntry 对象,并填充它,然后对 MEM_LOGBOOK_ENTRIES() 目标执行 asyncPost,如下所示:

wb::LogEntry foo;
result = asyncPost(WB_RES::LOCAL::MEM_LOGBOOK_ENTRIES(), AsyncRequestOptions::Empty, foo);

如果是这样,它们是否有帮助填充 wb::LogEntry 对象的辅助函数,因为看起来您需要一个 ID、时间戳,然后是白板数据对象?还是我们必须自己生成这些?

你的基本思路是对的,但是有些细节有点不对。

首先划分两个组件,DataLoggerLogbook:

  • DataLogger 负责将数据存储到 EEPROM 内存的所有事情
  • Logbook 可用于从 EEPROM 存储器中读取数据(并将其擦除为干净状态)

DataLogger 的工作方式是订阅 /Mem/DataLogger/Config 中给出的路径,然后存储这些订阅的通知(有不需要对 /Logbook/Entries).

做任何事情

简单流程:

  1. PUT 路径以记录到 /Mem/DataLogger/Config
  2. PUT 3 到 /Mem/DataLogger/State 开始记录

--- 记录发生在这里 ---

  1. PUT 2 到 /Mem/DataLogger/State 以停止记录

但是您的代码中有一些细节错误。 Config 和 State PUT 操作的结果来自 onPutResult() 回调。因此,为确保配置正确,您必须在 /Config PUT 的回调中获得 status = 200 后触发状态更改。

对于可以记录的内容也有一些限制。主要是:

  • 如果有多个数组,它们的长度必须相同(如/Meas/IMU9)
  • 不支持字符串

要查看通知值对象如何存储到 EEPROM 中,请参阅 /generated/sbem-code/sbem_definitions.cpp。如果你的类型没有出现在那里,那么你的服务 yaml 中的某些东西阻止了序列化。

要试用 DataLogger 和日志 API,请参阅 movesense-mobile-lib 存储库中的 DataLoggerSample Android app