MBee Arduino library
Классы | Открытые члены | Полный список членов класса
Класс SerialStarWithCallbacks

Этот класс может быть использован вместо класса SerialStar и позволяет самостоятельно создавать функции, которые будут автоматически вызываться при получении пакетов от радиомодуля. Подробнее...

#include <SerialStar.h>

Граф наследования:SerialStarWithCallbacks:
SerialStar MBee868 MBee

Открытые члены

void onPacketError (void(*func)(uint8_t, uintptr_t), uintptr_t data=0)
 Регистрация callback-функции для события ошибки чтения пакета. Подробнее...
 
void onResponse (void(*func)(MBeeResponse &, uintptr_t), uintptr_t data=0)
 Регистрация callback-функции для события приема пакета от модуля. Подробнее...
 
void onOtherResponse (void(*func)(MBeeResponse &, uintptr_t), uintptr_t data=0)
 Регистрация callback-функции для события приема пакета от модуля. Подробнее...
 
void onModemStatusResponse (void(*func)(ModemStatusResponse &, uintptr_t), uintptr_t data=0)
 Регистрация callback-функции, вызываемой при приеме API-фрейма со статусом модема (apiId = 0x8A).
 
void onTxStatusResponse (void(*func)(TxStatusResponse &, uintptr_t), uintptr_t data=0)
 Регистрация callback-функции, вызываемой при приеме API-фрейма со статусом передачи (apiId = 0x8B).
 
void onAtCommandResponse (void(*func)(AtCommandResponse &, uintptr_t), uintptr_t data=0)
 Регистрация callback-функции, вызываемой при приеме API-фрейма с ответом на локальную AT-команду (apiId = 0x87, 0x88, 0x89).
 
void onRemoteAtCommandResponse (void(*func)(RemoteAtCommandResponse &, uintptr_t), uintptr_t data=0)
 Регистрация callback-функции, вызываемой при приеме API-фрейма с ответом на удаленную AT-команду (apiId = 0x97, 0x98).
 
void onRxAcknowledgeResponse (void(*func)(RxAcknowledgeResponse &, uintptr_t), uintptr_t data=0)
 Регистрация callback-функции, вызываемой при приеме API-фрейма с подтверждением приема пакета от удаленного модема (apiId = 0x8C).
 
void onRxResponse (void(*func)(RxResponse &, uintptr_t), uintptr_t data=0)
 Регистрация callback-функции, вызываемой при приеме API-фрейма с неструктурированными данными от удаленного модема (apiId = 0x81, 0x82, 0x8F, 0x90).
 
void onRxIoSampleResponse (void(*func)(RxIoSampleResponse &, uintptr_t), uintptr_t data=0)
 Регистрация callback-функции, вызываемой при приеме API-фрейма с данными о состоянии датчиков удаленного модема (apiId = 0x83, 0x84).
 
void run ()
 Главный цикл. Подробнее...
 
template<typename Response >
uint8_t waitFor (Response &response, uint16_t timeout, bool(*func)(Response &, uintptr_t)=NULL, uintptr_t data=0, int16_t frameId=-1)
 Принимает API-фрейм заданного типа, опционально отфильтрованного с помощью определенной функции проверки. Подробнее...
 
uint8_t sendAndWait (MBeeRequest &request, uint16_t timeout)
 Передает в UART API-фрейм, предназначенный для передачи по эфиру и ждет ответа со статусом в течение заданного времени. Подробнее...
 
uint8_t sendAndWaitForAcknowledge (MBeeRequest &request, uint16_t timeout)
 Передает в UART API-фрейм, предназначенный для передачи по эфиру. Подробнее...
 
uint8_t waitForStatus (uint8_t frameId, uint16_t timeout)
 Ждет приема ответного API-фрейма со статусом после отправки пакета с определенным frameId в течение заданного времени. Подробнее...
 
uint8_t waitForAcknowledge (uint8_t frameId, uint16_t timeout)
 Ждет API-фрейм c подтверждением приема удаленным модулем пакета с определенным frameId в течение заданного времени. Подробнее...
 
- Открытые члены унаследованные от SerialStar
void readPacket ()
 Чтение всех байт, имеющихся в приемном буфере UART. Подробнее...
 
bool readPacket (int timeout)
 Ожидает приема пакета от модуля в течение timeout миллисекунд. Подробнее...
 
void readPacketUntilAvailable ()
 Ожидает приема пакета до тех пор, пока он не будет получен или не произойдет какая-либо ошибка. Подробнее...
 
void send (void *)
 Передача данных модулю или удаленному узлу. Подробнее...
 
void send (MBeeRequest &request)
 
MBeeResponsegetResponse ()
 
- Открытые члены унаследованные от MBee
void begin (Stream &serial)
 Инициализирует соединение с радиомодулем на заданном COM-порте.
 
void setSerial (Stream &serial)
 Назначает последовательный порт. Подробнее...
 
bool available ()
 Проверяет наличие принятых данных в буфере UART.
 
uint8_t read ()
 Считывает 1 байт из входного буфера UART.
 
void write (uint8_t val)
 Передает 1 байт по UART.
 

Дополнительные унаследованные члены

- Открытые атрибуты унаследованные от MBee
Stream * _serial
 

Подробное описание

Этот класс может быть использован вместо класса SerialStar и позволяет самостоятельно создавать функции, которые будут автоматически вызываться при получении пакетов от радиомодуля.

Такой подход значительно упрощает процесс программирования. При использовании этого класса, прежде всего необходимо зарегистрировать свою callback функцию, с помощью метода onXxx. Каждый метод имеет аргумент uintptr_t, который может быть использован для передачи произвольных данных в callback-функцию. Это оказывается полезным при регистрации одной и той же callback-функции для нескольких событий, либо в случае, если функция должна выполнять разные действия в разных обстоятельствах. Обработка этих данных внутри функции является опциональной, однако присутствие их в списке аргументов callback-функции является обязательным. Если их обработка не предполагается, то данные можно просто проигнорировать. Тип uintptr_t не является указателем, а является целочисленным. Размер его должен быть достаточен для хранения указателя, характерного для данной аппаратной платформы. Например, его длина для плат, использующих AVR, должна быть не менее 16 бит, а для устройств на основе ARM - не менее 32. Для каждого события может быть зарегистрирована только одна функция. Повторная регистрация функции для одного и того же события перепишет ранее зарегистрированную. Для отмены регистрации callback-функции, необходимо передать ей NULL вкачестве аргумента. Для того, чтобы callback-функции работали, необходимо регулярно вызывать метод этого класса run(). Проще всего поместить вызов этого метода в главный цикл программы - loop{}. Этот метод автоматически вызывает функции readPacket() и getResponse() и некоторые других из класса MBee. Таким образом, вызывать их непосредственно из программы не требуется (хотя, если это сделать то ничего страшного не произойдет, тем не менее некоторые callback-функции могут после такого вызова не сработать). Внутри callback-функции не допускаются блокировки в виде задержек или ожиданий. Дело в том, что callback-функции вызываются изнутри функции waitFor() или других дружественных функций, и если быстро не вернуться из callback, то в функции waitFor() может произойти таймаут. Отправка пакетов внутри callback-функции вполне допустима,однако вызов фукнций,связанных с приемом пакетов недопустим. К этим функциям относятся readPacket() waitFor() и т.п. Вызов этих функций перепишет принятое ранее сообщение, что заблокирует вызов callback-функций для всех ожидающих событий.

См. определение в файле SerialStar.h строка 1104

Методы

◆ onOtherResponse()

void SerialStarWithCallbacks::onOtherResponse ( void(*)(MBeeResponse &, uintptr_t)  func,
uintptr_t  data = 0 
)
inline

Регистрация callback-функции для события приема пакета от модуля.

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

См. определение в файле SerialStar.h строка 1133

1134  {
1135  _onOtherResponse.set(func, data);
1136  }

◆ onPacketError()

void SerialStarWithCallbacks::onPacketError ( void(*)(uint8_t, uintptr_t)  func,
uintptr_t  data = 0 
)
inline

Регистрация callback-функции для события ошибки чтения пакета.

Зарегистрированная функция будет вызываться каждый раз при возникновении ошибки разбора пакета, полученного от радиомодуля. Аргументом при вызове будет являться код ошибки, аналогичный получаемому при вызове MBeeResponse::getErrorCode(), а также опциональные данные (или указатель на них), определенные при регистрации callback-функции.

См. определение в файле SerialStar.h строка 1112

1113  {
1114  _onPacketError.set(func, data);
1115  }

◆ onResponse()

void SerialStarWithCallbacks::onResponse ( void(*)(MBeeResponse &, uintptr_t)  func,
uintptr_t  data = 0 
)
inline

Регистрация callback-функции для события приема пакета от модуля.

Зарегистрированная функция будет вызываться всегда при любом успешном приеме пакета по UART перед тем, как будет вызвана специфическая для принятого пакета callback-функция или функция onOtherResponse(), если специфическая функция не зарегистрирована. В качестве аргумента передается ссылка на принятый пакет, а также опциональные данные (или указатель на них), определенные при регистрации callback-функции.

См. определение в файле SerialStar.h строка 1123

1124  {
1125  _onResponse.set(func, data);
1126  }

◆ run()

void SerialStarWithCallbacks::run ( )

Главный цикл.

Этот метод должен регулярно вызываться для непрерывной обработки данных, поступающих от модуля MBee по последовательному интерфейсу и вызова соответствующих callback-функций.

См. определение в файле SerialStar.cpp строка 1222

1223  {
1224  if(loopTop())
1225  loopBottom();
1226 }

◆ sendAndWait()

uint8_t SerialStarWithCallbacks::sendAndWait ( MBeeRequest request,
uint16_t  timeout 
)
inline

Передает в UART API-фрейм, предназначенный для передачи по эфиру и ждет ответа со статусом в течение заданного времени.

Собственно говоря, этот метод просто последовательно вызывает функции send() и waitForStatus(). См. функцию waitForStatus() для более получения более подробной информации о возвращаемых параметрах и деталях.

См. определение в файле SerialStar.h строка 1229

1230  {
1231  send(request);
1232  return waitForStatus(request.getFrameId(), timeout);
1233  }
uint8_t getFrameId()
Возвращает frame id.
Definition: SerialStar.cpp:592
void send(void *)
Передача данных модулю или удаленному узлу.
uint8_t waitForStatus(uint8_t frameId, uint16_t timeout)
Ждет приема ответного API-фрейма со статусом после отправки пакета с определенным frameId в течение з...

◆ sendAndWaitForAcknowledge()

uint8_t SerialStarWithCallbacks::sendAndWaitForAcknowledge ( MBeeRequest request,
uint16_t  timeout 
)

Передает в UART API-фрейм, предназначенный для передачи по эфиру.

В течение заданного времени ждет ответа со статусом и подтверждение получения пакета от удаленного модуля. Метод просто последовательно вызывает функции send(), waitForStatus() и waitForAcknowledge(). Ожидание подтверждения приема инициализируется только при удачной отправке пакета в эфир т.е. если вызов waitForStatus() вернул 0. Функция возвращает 0, если принято подтверждение получения и MBEE_WAIT_TIMEOUT(0xFF), если подтверждения так и не дождались. Если сообщение в эфир отправлено не было, то возвращается статус передачи.

См. определение в файле SerialStar.cpp строка 1228

1229 {
1230  uint8_t status;
1231  unsigned long start = millis();
1232  send(request);
1233  status = waitForStatus(request.getFrameId(), timeout - (millis() - start));
1234  if(status)
1235  return status;
1236  return waitForAcknowledge(request.getFrameId(), timeout - (millis() - start));
1237 }
uint8_t getFrameId()
Возвращает frame id.
Definition: SerialStar.cpp:592
void send(void *)
Передача данных модулю или удаленному узлу.
uint8_t waitForStatus(uint8_t frameId, uint16_t timeout)
Ждет приема ответного API-фрейма со статусом после отправки пакета с определенным frameId в течение з...
uint8_t waitForAcknowledge(uint8_t frameId, uint16_t timeout)
Ждет API-фрейм c подтверждением приема удаленным модулем пакета с определенным frameId в течение зада...

◆ waitFor()

template<typename Response >
uint8_t SerialStarWithCallbacks::waitFor ( Response &  response,
uint16_t  timeout,
bool(*)(Response &, uintptr_t)  func = NULL,
uintptr_t  data = 0,
int16_t  frameId = -1 
)
inline

Принимает API-фрейм заданного типа, опционально отфильтрованного с помощью определенной функции проверки.

Если эта функция проверки определена, то она вызывается каждый раз при приеме API-фрейма требуемого типа. В качестве параметров ей передаются ссылка на ответ и указатель на поле данных. Если функция проверки возвращает true (или если такая проверочная функция не определена), то ожидание приема прекращается и осуществляется возврат в вызывающую функцию с параметром 0. Если же проверочная функция возвращает false,то ожидание приема продолжается. По истечении заданного времени ожидания, функция возвращает MBEE_WAIT_TIMEOUT (0xFF). Если фрейм был отправлен с ненулевым frameID, то на него модуль должен получить ответ со статусом. Если статус не равен 0 т.е. имела место какая-либо ошибка, то ожидание прекращается и этот статусный байт передается как результат работы функции. Такое поведение объясняется следующим: если фрейм предназначался для передачи по эфиру, то наличие ошибок при его обработке/отправке(например вследствие занятости частотного канала) приводит к тому, в эфир он не уйдет и, следовательно, ответа на него удаленного узла ждать бессмысленно. Во время ожидания, любой принятый пакет передается в соответствующую callback-функцию также, как бы это происходило при непрерывном вызове run() исключая только те фреймы, которые передаются в OnResponse() и никуда более. После вызова этого метода, пакет может быть получен с помощью обычного вызова getResponse().

См. определение в файле SerialStar.h строка 1219

1220  {
1221  return waitForInternal(Response::API_ID, &response, timeout, (void*)func, data, frameId);
1222  }

◆ waitForAcknowledge()

uint8_t SerialStarWithCallbacks::waitForAcknowledge ( uint8_t  frameId,
uint16_t  timeout 
)

Ждет API-фрейм c подтверждением приема удаленным модулем пакета с определенным frameId в течение заданного времени.

При возникновении таймаута, возвращает MBEE_WAIT_TIMEOUT(0xFF). Во время ожидания, любой принятый пакет передается в соответствующую callback-функцию также, как бы это происходило при непрерывном вызове run() исключая только те фреймы, которые передаются в OnResponse() и никуда более. После вызова этого метода, пакет может быть получен с помощью обычного вызова getResponse().

См. определение в файле SerialStar.cpp строка 1255

1256 {
1257  unsigned long start = millis();
1258  do
1259  {
1260  if(loopTop())
1261  {
1262  uint8_t status = matchAcknowledge(frameId);
1263  if(!status)
1264  return 0;
1265  loopBottom(); //Вызываем регулярные callback-функции.
1266  }
1267  } while (millis() - start < timeout);
1268  return MBEE_WAIT_TIMEOUT ;
1269 }

◆ waitForStatus()

uint8_t SerialStarWithCallbacks::waitForStatus ( uint8_t  frameId,
uint16_t  timeout 
)

Ждет приема ответного API-фрейма со статусом после отправки пакета с определенным frameId в течение заданного времени.

При возникновении таймаута, возвращает MBEE_WAIT_TIMEOUT(0xFF). Во время ожидания, любой принятый пакет передается в соответствующую callback-функцию также, как бы это происходило при непрерывном вызове run() исключая только те фреймы, которые передаются в OnResponse() и никуда более. После вызова этого метода, пакет может быть получен с помощью обычного вызова getResponse().

См. определение в файле SerialStar.cpp строка 1239

1240 {
1241  unsigned long start = millis();
1242  do
1243  {
1244  if(loopTop())
1245  {
1246  uint8_t status = matchStatus(frameId);
1247  if(status != 0xff)
1248  return status;
1249  loopBottom(); //Вызываем регулярные callback-функции.
1250  }
1251  } while (millis() - start < timeout);
1252  return MBEE_WAIT_TIMEOUT ;
1253 }

Объявления и описания членов классов находятся в файлах: