【问题标题】:Implement logging to EEPROM in movesense custom firmware在 movesense 自定义固件中实现记录到 EEPROM
【发布时间】:2018-11-02 22:56:28
【问题描述】:

我希望在我的自定义 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文件中定义的白板路径和我们在代码中配置的数据输入路径是什么关系?它们必须完全匹配吗?

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

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

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

【问题讨论】:

    标签: movesense


    【解决方案1】:

    您的基本想法是正确的,但有些细节有点偏离。

    首先划分两个组件,DataLoggerLogbook

    • DataLogger 负责将数据存储到 EEPROM 内存中
    • 日志可用于从 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 和 Logbook API,请参阅 movesense-mobile-lib 存储库中的 DataLoggerSample Android app

    【讨论】:

    • 当 PUT 路径到 /Mem/DataLogger/Config 时,我们是否使用 EXACT 路径,例如我的示例:/App/Object1/Subscription,还是使用 /App/Object1 足够好?跨度>
    • 无需添加“/Subscription”。此外,生成 sbem 的所有路径都在这里:bitbucket.org/suunto/movesense-device-lib/src/… 所以,它将是 ex。 meas/* 和来自用户应用程序的所有 wbresources
    • 找出生成路径的简单方法是查看:/generated/sbem-code/sbem_definitions.cpp(构建后),它将包含决定如何生成的代码事情被写入 DataLogger。
    • 修复了 DataLoggerSample 的链接
    猜你喜欢
    • 2019-09-22
    • 2019-09-08
    • 2011-02-08
    • 2015-11-13
    • 2014-04-04
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    相关资源
    最近更新 更多