Реализация тайм-аута связи

Я ' m, реализующий класс, который общается с контроллером мотора через USB-устройство. У меня все работает, кроме способа указать, является ли параметр, полученный по коммуникационной ссылке, «свежим» или нет. Что у меня есть:

class MyCommClass
{
public:
  bool getSpeed( double *speed );

private:
  void rxThread();

  struct MsgBase 
  { /* .. */ };

  struct Msg1 : public MsgBase
  { /* .. */ };

  struct Msg2 : public MsgBase
  { /* .. */ };

  /* .. */

  struct MsgN : public MsgBase
  { /* .. */ };

  Msg1 msg1;
  Msg2 msg2;
  /* .. */
  MsgN msgn;

  std::map< unsigned long id, MsgBase *msg > messages;
};

rxThead () - это бесконечный цикл, работающий в отдельном потоке, проверяющий USB-устройство на наличие доступных сообщений. Каждое сообщение имеет уникальный идентификатор, который rxThread () использует, чтобы вставить его в правый объект msgx . Что мне нужно, так это когда пользователь вызывает функцию getSpeed ​​() , он должен иметь возможность определить, является ли текущее значение скорости «свежим» или «устаревшим», то есть является ли объект msgx , который содержит значение скорости, было обновлено в течение указанного периода ожидания. Таким образом, каждый объект сообщения должен реализовать свой собственный тайм-аут (поскольку они зависят от сообщения).

Все сообщения периодически передаются контроллером мотора, но есть и такие, которые передаются, как только их содержимое изменяется (но они также будут передаваться периодически, если содержимое не изменяется). Это означает, что получение сообщения с частотой, превышающей номинальную, нормально, но оно должно появиться хотя бы один раз в течение максимального периода ожидания.

USB-устройство предоставляет временные метки вместе с сообщениями, поэтому у меня есть доступ к этой информации. Отметка времени не отражает текущее время, это длинное число без знака с микросекундным разрешением, которое устройство обновляет каждый раз при получении сообщения. Я подозреваю, что устройство просто начинает увеличивать это значение с 0 с момента, когда я вызываю его функции инициализации. Я могу придумать несколько различных способов реализации этого:

  • Каждый объект сообщения запускает поток, который запускается бесконечно в ожидании (WaitForSingleObject) в течение периода ожидания. По истечении времени ожидания он проверяет, увеличена ли переменная счетчика (которая была кэширована до ожидания). В противном случае он устанавливает флаг, помечающий сообщение как устаревшее. Счетчик будет увеличиваться каждый раз, когда rxThread () обновляет этот объект сообщения.

  • rxThread () , помимо заполнения сообщений, также выполняет итерацию по списку сообщений и проверяет метку времени каждого сообщения. последний раз обновлялся. Если метка времени превышает тайм-аут, сообщение помечается как устаревшее. У этого метода могут быть проблемы с объемом необходимой обработки. Вероятно, это не будет проблемой на большинстве машин, но этот код должен работать на свинцово-медленном «промышленном компьютере».

Я очень признателен за ваши мысли и предложения о том, как это реализовать. Я открыт для идей, отличных от двух, о которых я упомянул. Я использую Visual Studio 2005, и кроссплатформенная переносимость не является большой проблемой, поскольку драйверы USB-устройств предназначены только для Windows. В настоящее время я отслеживаю около 8 сообщений, но было бы неплохо, если бы решение было достаточно легким, чтобы я мог добавить еще несколько (возможно, еще 8), не сталкиваясь с ограничениями вычислительной мощности.

Заранее спасибо, промышленный компьютер ».

Я очень признателен за ваши мысли и предложения о том, как это реализовать. Я открыт для идей, кроме двух, о которых я упомянул. Я использую Visual Studio 2005, и кроссплатформенная переносимость не является большой проблемой, поскольку драйверы USB-устройств предназначены только для Windows. В настоящее время я отслеживаю около 8 сообщений, но было бы неплохо, если бы решение было достаточно легким, чтобы я мог добавить еще несколько (возможно, еще 8), не сталкиваясь с ограничениями вычислительной мощности.

Заранее спасибо, промышленный компьютер ».

Я очень признателен за ваши мысли и предложения о том, как это реализовать. Я открыт для идей, отличных от двух, о которых я упомянул. Я использую Visual Studio 2005, и кроссплатформенная переносимость не является большой проблемой, поскольку драйверы USB-устройств предназначены только для Windows. В настоящее время я отслеживаю около 8 сообщений, но было бы неплохо, если бы решение было достаточно легким, чтобы я мог добавить еще несколько (возможно, еще 8), не сталкиваясь с ограничениями вычислительной мощности.

Заранее спасибо, Ашиш.

1
задан Praetorian 29 September 2010 в 02:39
поделиться