Ожидание запуска служб перед продолжением - PullRequest
0 голосов
/ 04 июля 2018

Я пытаюсь заставить DataLogger и Журнал работать на устройстве movesense. То, что я пытаюсь сделать, похоже / продолжение того, что задают в этом вопросе. Когда я настраиваю свою службу при подключении устройства, я хотел бы дождаться запуска 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 Принято. Из предыдущего вопроса я понял, что мне нужно убедиться, что эта функция возвращает код возврата 200 в функции onPutResult ().

Это я делаю по

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 приводил к бесконечному циклу, и я предполагаю, что функция сна также будет блокировать, если я смогу ее найти.

Это неправильный подход или я на правильном пути, если да, то помощь в достижении прогресса будет принята.

EDIT : обновлен код для добавления пути к регистратору данных. Если используется старый код, мы получим 404, не найденный для пути.

1 Ответ

0 голосов
/ 04 июля 2018

Правильная часть вашего кода. Результат 202 в asyncPut означает, что запрос отправляется в другой поток, и вы правильно видите фактический результат операции PUT в onPutResult.

Поскольку Movesense является асинхронной архитектурой, вы не можете ждать переменную в цикле (или есть способ, но он совершенно нецелесообразен, поскольку может вызвать проблемы в другом месте), , особенно не в простом цикле while, Вам действительно не нужен флаг DataLoggerRunning , если он вам не нужен в другом месте. DataLogger запускается при получении обратного вызова onPutResult (), хотя, возможно, еще не было журнала (если данных нет). Способ работы DataLogger заключается в том, что он подписывается на заданные пути и сохраняет данные из получаемых уведомлений.

В основном у вас есть несколько вариантов:

  1. Просто вызовите код запуска в opPutResult, поскольку регистратор данных уже запущен. Любые ваши запросы должны быть быстрыми (скажем, <200 мс) или асинхронными. </li>
  2. Запуск «отложенного вызова процедуры» ( whiteboard :: DpcFunctor class). Это вызывает отключение при выполнении, и планировщик Movesense выполнит вашу функцию чуть позже.
  3. Если вам нужно немного подождать, позвоните startTimer () и вызовите оставшуюся часть кода в onTimer () -callback
...