![]() |
My Project
|
Этот класс может быть использован вместо класса MBee и позволяет самостоятельно создавать функции, которые будут автоматически вызываться при получении пакетов от радиомодуля. Подробнее...
#include <MBee.h>
Открытые члены | |
void | onPacketError (void(*func)(uint8_t, uintptr_t), uintptr_t data=0) |
Регистрация callback-функции для события ошибки чтения пакета. Подробнее... | |
void | onResponse (void(*func)(XBeeResponse &, uintptr_t), uintptr_t data=0) |
Регистрация callback-функции для события приема пакета от модуля. Подробнее... | |
void | onOtherResponse (void(*func)(XBeeResponse &, uintptr_t), uintptr_t data=0) |
Регистрация callback-функции для события приема пакета от модуля. Подробнее... | |
void | onZBTxStatusResponse (void(*func)(ZBTxStatusResponse &, uintptr_t), uintptr_t data=0) |
void | onZBRxResponse (void(*func)(ZBRxResponse &, uintptr_t), uintptr_t data=0) |
void | onZBExplicitRxResponse (void(*func)(ZBExplicitRxResponse &, uintptr_t), uintptr_t data=0) |
void | onZBRxIoSampleResponse (void(*func)(ZBRxIoSampleResponse &, uintptr_t), uintptr_t data=0) |
void | onTxStatusResponse (void(*func)(TxStatusResponse &, uintptr_t), uintptr_t data=0) |
void | onRx16Response (void(*func)(Rx16Response &, uintptr_t), uintptr_t data=0) |
void | onRx64Response (void(*func)(Rx64Response &, uintptr_t), uintptr_t data=0) |
void | onRx16IoSampleResponse (void(*func)(Rx16IoSampleResponse &, uintptr_t), uintptr_t data=0) |
void | onRx64IoSampleResponse (void(*func)(Rx64IoSampleResponse &, uintptr_t), uintptr_t data=0) |
void | onModemStatusResponse (void(*func)(ModemStatusResponse &, uintptr_t), uintptr_t data=0) |
void | onAtCommandResponse (void(*func)(AtCommandResponse &, uintptr_t), uintptr_t data=0) |
void | onRemoteAtCommandResponse (void(*func)(RemoteAtCommandResponse &, uintptr_t), uintptr_t data=0) |
void | loop () |
Главный цикл. Подробнее... | |
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) |
Wait for a API response of the given type, optionally filtered by the given match function. Подробнее... | |
uint8_t | sendAndWait (XBeeRequest &request, uint16_t timeout) |
Sends a XBeeRequest (TX packet) out the serial port, and wait for a status response API frame (up until the given timeout). Подробнее... | |
uint8_t | waitForStatus (uint8_t frameId, uint16_t timeout) |
Wait for a status API response with the given frameId and return the status from the packet (for ZB_TX_STATUS_RESPONSE, this returns just the delivery status, not the routing status). Подробнее... | |
![]() | |
virtual void | readPacket ()=0 |
Чтение всех байт, имеющихся в приемном буфере UART. Подробнее... | |
virtual bool | readPacket (int timeout)=0 |
Ожидает приема пакета от модуля в течение timeout миллисекунд. Подробнее... | |
virtual void | readPacketUntilAvailable ()=0 |
Ожидает приема пакета до тех пор, пока он не будет получен или не произойдет какая-либо ошибка. Подробнее... | |
virtual void | send (void *)=0 |
Передача данных модулю или удаленному узлу. Подробнее... | |
void | begin (Stream &serial) |
Инициализирует соединение с радиомодулем на заданном COM-порте. | |
void | setSerial (Stream &serial) |
Назначает последовательный порт. Подробнее... | |
bool | available () |
Проверяет наличие принятых данных в буфере UART. | |
uint8_t | read () |
Считывает 1 байт из входного буфера UART. | |
void | write (uint8_t val) |
Передает 1 байт по UART. | |
Дополнительные унаследованные члены | |
![]() | |
Stream * | _serial |
Этот класс может быть использован вместо класса MBee и позволяет самостоятельно создавать функции, которые будут автоматически вызываться при получении пакетов от радиомодуля.
Такой подход значительно упрощает процесс программирования. При использовании этого класса, прежде всего необходимо зарегистрировать свою callback функцию, с помощью метода onXxx. Каждый метод имеет аргумент uintptr_t, который может быть использован для передачи произвольных данных в callback-функцию. Такой подход является полезным при регистрации одной и той же callback-функции для нескольких событий, либо в случае, если функция должна выполнять разные действия в разных обстоятельствах. Обработка этих данных внутри функции является опциональной, однако присутствие их в списке аргументов callback-функции является обязательным. Если их обработка не предполагается, то данные можно просто проигнорировать. Тип uintptr_t является целым. Размер его должен быть достаточен для хранения указателя, характерного для данной платформы Arduino. Например, его длина для плат, использующих AVR, должна быть не менее 16 бит, а для устройств на основе ARM - не менее 32. Для каждого события может быть зарегистрирована только одна функция. Таким образом, повторная регистрации функции для одного и того же события перепишет ранее зарегистрированную. Для отмены регистрации callback-функции, необходимо передать ей NULL вкачестве аргумента. Для того, чтобы callback-функции работали, необходимо регулярно вызывать метод этого класса loop(). Проще всего поместить вызов этого метода в главный цикл скетча - loop{}. Этот метод автоматически вызывает функции readPacket() и getResponse() и некторых других из класса MBee. Таким образом, вызывать их непосредственно из скетча не требуется (хотя, если это сделать то ничего страшного не произойдет, тем не менее некоторые callback-функции могут не сработать). Внутри callback-функции не допускаются блокировки в виде задержек или ожиданий. Дело в том, что callback-функции вызываются изнутри функции waitFor() или других дружественных функций, и если быстро не вернуться из callback, то в функции waitFor() может произойти таймаут. Отправка пакетов внутри callback-функции вполне допустима,однако вызов фукнций, связанных с приемом пакетов не допустим. К таким функциям относятся readPacket() waitFor() и т.п. Вызов таких функций перепишет принятое сообщение, что заблокирует вызов callback-функций для всех ожидающих событий.
void mbeeWithCallbacks::loop | ( | ) |
Главный цикл.
Этот метод должен регулярно вызываться для непрерывной обработки данных, поступающих от модуля MBee по последовательному интерфейсу и вызова соответствующих callback-функций.
|
inline |
Регистрация callback-функции для события приема пакета от модуля.
Зарегистрированная функция будет вызываться всегда при любом успешном приеме пакета по UART если специфическая callback-функция для данного типа пакета не зарегистрирована. В качестве аргумента передается ссылка на принятый пакет. Данные, содержащиеся в принятом размещаются по указателю, переданному в качестве аргумента при регистрации данной callback-функции.
|
inline |
Регистрация callback-функции для события ошибки чтения пакета.
Зарегистрированная функция будет вызываться каждый раз при возникновении ошибки разбора пакета, полученного от радиомодуля. Аргументом при вызове будет являться код ошибки, аналогичный получаемому при вызове MBeeResponse::getErrorCode() и помещенный по указателю data, объявленному при регистрации callback-функции.
|
inline |
Регистрация callback-функции для события приема пакета от модуля.
Зарегистрированная функция будет вызываться всегда при любом успешном приеме пакета по UART перед тем, как будет вызвана специфическая для принятого пакета callback-функция или функция onOtherResponse(), если специфическая функция не зарегистрирована. В качестве аргумента передается ссылка на принятый пакет. Данные, содержащиеся в принятом размещаются по указателю, переданному в качестве аргумента при регистрации данной callback-функции.
|
inline |
Sends a XBeeRequest (TX packet) out the serial port, and wait for a status response API frame (up until the given timeout).
Essentially this just calls send() and waitForStatus(). See waitForStatus for the meaning of the return value and more details.
|
inline |
Wait for a API response of the given type, optionally filtered by the given match function.
If a match function is given it is called for every response of the right type received, passing the response and the data parameter passed to this method. If the function returns true (or if no function was passed), waiting stops and this method returns 0. If the function returns false, waiting continues. After the given timeout passes, this method returns XBEE_WAIT_TIMEOUT.
If a valid frameId is passed (e.g. 0-255 inclusive) and a status API response frame is received while waiting, that has a non-zero status, waiting stops and that status is received. This is intended for when a TX packet was sent and you are waiting for an RX reply, which will most likely never arrive when TX failed. However, since the status reply is not guaranteed to arrive before the RX reply (a remote module can send a reply before the ACK), first calling waitForStatus() and then waitFor() can sometimes miss the reply RX packet.
Note that when the intended response is received before the status reply, the latter will not be processed by this method and will be subsequently processed by e.g. loop() normally.
While waiting, any other responses received are passed to the relevant callbacks, just as if calling loop() continuously (except for the response sought, that one is only passed to the OnResponse handler and no others).
After this method returns, the response itself can still be retrieved using getResponse() as normal.
uint8_t mbeeWithCallbacks::waitForStatus | ( | uint8_t | frameId, |
uint16_t | timeout | ||
) |
Wait for a status API response with the given frameId and return the status from the packet (for ZB_TX_STATUS_RESPONSE, this returns just the delivery status, not the routing status).
If the timeout is reached before reading the response, XBEE_WAIT_TIMEOUT is returned instead.
While waiting, any other responses received are passed to the relevant callbacks, just as if calling loop() continuously (except for the status response sought, that one is only passed to the OnResponse handler and no others).
After this method returns, the response itself can still be retrieved using getResponse() as normal.