等待服务启动,然后继续

时间:2018-07-03 21:15:31

标签: movesense

我正在尝试使DataLogger和Logbook在moveense设备上工作。我想做的事情与this问题中的询问类似/继续。当我在连接设备时配置服务时,我想等待DataLogger启动(返回状态代码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接受。从上一个问题中我了解到,我需要检查该函数是否在onPutResult()函数中返回了返回码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是否为true。 这是我有点迷茫的地方,我尝试只在while循环中等待,然后在movesense-device-lib中寻找一个sleep函数(没有运气),希望不会在等待数据记录器时使代码崩溃开始。 while循环导致一个无限循环,我想如果我能找到一个睡眠函数,那它也会阻塞。

这是错误的方法还是我走在正确的轨道上,如果可以的话,我将不胜感激。

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

1 个答案:

答案 0 :(得分:0)

您的代码的设置部分正确。 asyncPut中的结果202表示该请求已分派到另一个线程,您可以在onPutResult中正确看到PUT操作的实际结果。

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

基本上,您有两种选择:

  1. 由于数据记录器现在正在运行,因此只需在opPutResult中调用您的启动代码。您发出的任何请求都必须快速(例如<200ms)或异步。
  2. 触发“延迟过程调用”( whiteboard :: DpcFunctor 类)。这会导致执行中断,Movesense调度程序将稍后执行您的功能。
  3. 如果需要稍等,请调用 startTimer()并在 onTimer() -callback
  4. 中调用其余代码