在继续之前等待服务启动

Waiting for services to start before continuing

我正在尝试让 DataLogger 和 Logbook 在 movesense 设备上工作。我想做的是 similar/continuation 问题中的问题。当我在设备连接时配置我的服务时,我想等待 DataLogger 启动(return 状态代码 200),然后再继续执行我的其余代码。

作为 onSubscribe() 函数的一部分,我执行以下代码来配置 DataLogger:

WB_RES::DataLoggerConfig logConfig;
WB_RES::DataEntry entry;
WB_RES::DataLoggerStateValues::Type logState = WB_RES::DataLoggerStateValues::Type::DATALOGGER_LOGGING;

entry.path = <pathToService>;
<del>logConfig.dataEntries.dataEntry= {entry}; </del>
logConfig.dataEntries.dataEntry = whiteboard::MakeArray<WB_RES::DataEntry>(&entry, 1);

result = asyncPut(WB_RES::LOCAL::MEM_DATALOGGER_CONFIG(), AsyncRequestOptions::Empty, logConfig);

执行此命令后我得到的状态码是 202 Accepted。我从上一个问题中了解到,我需要检查 onPutResult() 函数中的此函数 returns return 代码 200。

这是我做的

switch(resourceId.localResourceId)
{
case WB_RES::LOCAL::MEM_DATALOGGER_CONFIG::LID:
{
  if(resultCode == whiteboard::HTTP_CODE_OK)
  {
    asyncPut(WB_RES::LOCAL::MEM_DATALOGGER_STATE(), AsyncRequestOptions::Empty,WB_RES::DataLoggerStateValues::Type::DATALOGGER_LOGGING);
  }
}
break;

再次在 onPutResult() 中,我使用这段代码检查数据记录器是否设置在正确的状态

case WB_RES::LOCAL::MEM_DATALOGGER_STATE::LID:
{
  if(resultCode == whiteboard::HTTP_CODE_OK)
  {
    // Boolean variable that indicate that the dataLogger is running.
    DataLoggerRunning = true; 
  }
  else
  {
    DEBUGLOG("onPutResult::MEM_DATALOGGER_STATE::
               SomethingIsNotRight");
  }
}
break;

现在我想在启动我的服务之前检测变量 DataLoggerRunning 是否为真。 这是我有点迷路的地方,我试着在 while 循环中等待,并在 movesense-device-lib 中寻找睡眠功能(没有运气),希望在等待数据记录器时不会使代码崩溃开始。 while 循环导致无限循环,我认为如果我能找到一个睡眠函数,它也会被阻塞。

这是错误的方法还是我在正确的轨道上,如果是这样有助于取得进展,我们将不胜感激。

编辑:更新了用于添加数据记录器路径的代码。如果使用旧代码,我们将得到 404 找不到路径。

您代码的设置部分是正确的。 asyncPut 中的结果 202 意味着请求被分派到另一个线程,你正确地在 onPutResult 中看到了 PUT 操作的实际结果。

由于 Movesense 是一种异步架构,您不能在循环中等待变量(或者有一种方法,但这是非常不可取的,因为它可能会在其他地方引起问题),尤其是在简单的 while 中循环。你并不真的需要 DataLoggerRunning 标志,除非你在其他地方需要它。当您收到 onPutResult() 回调时,DataLogger 为 运行,尽管可能还没有任何日志(如果没有数据)。 DataLogger 的工作方式是它订阅给定的路径并存储它收到的通知中的数据。

基本上你有几个选择:

  1. 只需在 opPutResult 中调用您的启动代码,因为数据记录器现在 运行。您发出的任何请求都必须是快速的(比方说 < 200 毫秒)或异步的。
  2. 触发一个"Deferred Procedure Call" (whiteboard::DpcFunctor class)。这会导致执行断开连接,Movesense 调度程序将稍后执行您的功能。
  3. 如果您需要稍等片刻,请调用 startTimer() 并调用 onTimer() 中的其余代码-回调