38 #define START_BYTE 0x7E 44 #define NO_ERROR_IN_FRAME 0 45 #define CHECKSUM_FAILURE 1 46 #define PACKET_EXCEEDS_BYTE_ARRAY_LENGTH 2 47 #define UNEXPECTED_START_BYTE 3 50 #define OK_COMMAND_STATUS 0 51 #define ERROR_COMMAND_STATUS 1 //Недостаточно памяти для размещения пакета. 52 #define INVALID_CODE_COMMAND_STATUS 2 //Недопустимый код команды. 53 #define INVALID_PARAMETER_COMMAND_STATUS 3 //Недопустимое значение параметра. 54 #define TX_FAILURE_COMMAND_STATUS 4 //Пакет в эфир не отправлен вследствие занятости рабочей частоты. 57 #define PACKET_ACKNOWLEDGED_BIT 0 58 #define PACKET_WAS_BROADCAST_BIT 1 60 #define API_ID_INDEX 3 //Тип API-фрейма всегда третий байт фрейма (считая с 0). 61 #define AT_COMMAND_API_LENGTH 2 //2 байта символы AT-команды. 62 #define REMOTE_AT_COMMAND_API_LENGTH 5 //Адрес удаленного модема 2 байта + Опции 1 байт + Символы AT-команды 2 байта. 63 #define DEFAULT_FRAME_ID 1 69 #define DEVICE_MODE_BROADCAST_RECEIVE_BIT 0 //Если данный бит равен 1, то прием широковещательных пакетов запрещен. 70 #define DEVICE_MODE_ADC_REF_BIT 1 //Бит, управляющий опорным напряжением. Равен 0, если опорное напряжение 2,5В и 1, если 1,5В. 71 #define DEVICE_MODE_REPEATER_BIT 2 //Бит, включающий/выключающий функцию ретрансляции пакетов. 72 #define DEVICE_MODE_CCA_BIT 4 //Бит, управляющий режимом CCA при передаче пакетов в прозрачном режиме UART. Если равен 1, то CCA отключено. 73 #define DEVICE_MODE_ENCRYPTION_BIT 5 //Бит, управляющий шифрованием трафика в прозрачном режиме UART. Если равен 1, то шифрование включено. 74 #define DEVICE_MODE_EXTENDED_FORMAT_BIT 6 //Бит, управляющий наличием дополнительных полей в выходном API-фрейме. 77 #define ACKNOWLEDGE_DISABLE_TX_OPTIONS_BIT 0 78 #define CCA_DISABLE_TX_OPTIONS_BIT DEVICE_MODE_CCA_BIT //Номер бита, для удобства совпадает с аналогичным битом поля регистра mode. 79 #define ENCRYPTION_ENABLE_TX_OPTIONS_BIT DEVICE_MODE_ENCRYPTION_BIT //Номер бита, для удобства совпадает с аналогичным битом поля регистра mode. 80 #define SLEEP_DEVICE_TX_OPTIONS_BIT 6 //Бит, равный 1, если сообщение предназначено для спящего узла и помещается в буфер, а не передается сразу в эфир. 83 #define ACKNOWLEDGE_DISABLE_COMMAND_OPTIONS_BIT ACKNOWLEDGE_DISABLE_TX_OPTIONS_BIT 84 #define APPLY_CHANGES_COMMAND_OPTION_BIT 1 //Применяет сделанные изменения и записывает во флеш обновленные параметры. 85 #define APPLY_CHANGES_NO_SAVE_COMMAND_OPTION_BIT 2 //Применяет сделанные изменения без сохранения их во флеш. 86 #define CCA_DISABLE_COMMAND_OPTION_BIT DEVICE_MODE_CCA_BIT //Для удобства совпадает с битом аналогичного назначения поля transmitOptions и регистра Device Mode. 87 #define ENCRYPTION_ENABLE_COMMAND_OPTION_BIT DEVICE_MODE_ENCRYPTION_BIT //Для удобства совпадает с битом аналогичного назначения поля transmitOptions и регистра Device Mode. 88 #define SLEEP_DEVICE_COMMAND_OPTIONS_BIT SLEEP_DEVICE_TX_OPTIONS_BIT //Для удобства совпадает с битом аналогичного назначения поля transmitOptions и регистра Device Mode. 91 #define NO_RECEIVE_OPTIONS 0 92 #define PACKET_ACKNOWLEDGED_BIT 0 93 #define PACKET_WAS_BROADCAST_BIT 1 95 #define MAX_FRAME_DATA_SIZE 44 //2 байта адреса + 1 байт RSSI + 1 байт options + 40 байт данные) 96 #define BROADCAST_ADDRESS 0xFFFF 99 #define TRANSMIT_OPTION_DEFAULT 0 107 #define PWM_DUTY_CYCLE_MAX 13000u //Максимальное значение параметра для команд управления временем включенного состояния ШИМ-выхода (команды M1 - M4). 139 #define IO_DISABLED 0 140 #define IO_NOT_AVAILABLE 1 142 #define IO_DIGITAL_INPUT 3 143 #define IO_DIGITAL_OUTPUT_LO 4 144 #define IO_DIGITAL_OUTPUT_HI 5 147 #define IO_UART_CTS 8 148 #define IO_UART_RTS 9 149 #define IO_SYSTEM_LED 10 150 #define IO_SLEEP_REQUEST 11 151 #define IO_SLEEP_STATUS 12 152 #define IO_COUNTER_INPUT1 13 153 #define IO_COUNTER_INPUT2 14 154 #define IO_WAKEUP_INPUT_FALLING_EDGE 15 155 #define IO_WAKEUP_INPUT_RISING_EDGE 16 160 #define IO_RS485_DIRECTION 21 161 #define IO_DIGITAL_LINE_PASSING 22 162 #define IO_DIGITAL_LINE_PASSING_INVERTED 23 163 #define IO_ANALOG_LINE_PASSING_PWM1 24 164 #define IO_ANALOG_LINE_PASSING_PWM2 25 165 #define IO_ANALOG_LINE_PASSING_PWM3 26 166 #define IO_ANALOG_LINE_PASSING_PWM4 27 169 #define BV(n) (1 << (n)) 174 #define MODEM_STATUS_API_FRAME 0x8A //ex. MODEM_STATUS_RESPONSE. 175 #define TRANSMIT_STATUS_API_FRAME 0x8B //ex. ZB_TX_STATUS_RESPONSE. 176 #define AT_COMMAND_IMMEDIATE_APPLY_API_FRAME 0x07 //Идентификатор введен SysMC. AT-команда, содержащаяся во фрейме, применяется непосредственно после получения без сохранения измененного параметра во флеше. 177 #define AT_COMMAND_RESPONSE_IMMEDIATE_APPLY_API_FRAME 0x87 178 #define AT_COMMAND_API_FRAME 0x08 //ex. AT_COMMAND_REQUEST. 179 #define AT_COMMAND_RESPONSE_API_FRAME 0x88 //ex. AT_COMMAND_RESPONSE. 180 #define AT_COMMAND_QUEUE_PARAMETER_VALUE_API_FRAME 0x09 //ex. AT_COMMAND_QUEUE_REQUEST. 181 #define AT_COMMAND_RESPONSE_QUEUE_PARAMETER_VALUE_API_FRAME 0x89 //ex. TX_STATUS_RESPONSE. Идентификатор не имеет аналога в проекте SerialStar. 182 #define REMOTE_AT_COMMAND_REQUEST_API_FRAME 0x17 //ex. REMOTE_AT_REQUEST. 183 #define REMOTE_AT_COMMAND_RESPONSE_API_FRAME 0x97 //ex. REMOTE_AT_COMMAND_RESPONSE. 184 #define REMOTE_AT_COMMAND_RESPONSE_EXTENDED_API_FRAME 0x98 //Идентификатор, введенный SysMC. Фрейм содержит дополнительные поля из маршрутного заголовка принятого пакета. 185 #define TRANSMIT_REQUEST_NO_OPTIONS_API_FRAME 0x0F //Идентификатор, введенный SysMC, предназначенный для передачи данных без байта опций. Нужен для увеличения полезной нагрузки. 186 #define TRANSMIT_REQUEST_API_FRAME 0x10 //ex. ZB_TX_REQUEST. 187 #define TRANSMIT_REQUEST_PRO_API_FRAME 0x01 //ex. TX_16_REQUEST. 188 #define REMOTE_ACKNOWLEDGE_API_FRAME 0x8C //Идентификатор, введенный SysMC, предназначенный для подтверждения приема пакетов удаленным модемом. 189 #define RECEIVE_PACKET_API_FRAME 0x81 //ex. RX_16_RESPONSE. 190 #define RECEIVE_PACKET_EXTENDED_API_FRAME 0x82 //Идентификатор, введенный SysMC. Фрейм содержит дополнительные поля из маршрутного заголовка принятого пакета. 191 #define RECEIVE_PACKET_NO_OPTIONS_API_FRAME 0x8F //Идентификатор, введенный SysMC, используемый при выдаче в UART сообщений, переданных удаленным модемом в прозрачном режиме или в пакетном режиме без опций (TRANSMIT_REQUEST_NO_OPTIONS_API_FRAME). 192 #define RECEIVE_PACKET_NO_OPTIONS_EXTENDED_API_FRAME 0x90 //Идентификатор, введенный SysMC. Фрейм содержит дополнительные поля из маршрутного заголовка принятого пакета. 193 #define IO_DATA_SAMPLE_API_FRAME 0x83 //ex. RX_16_IO_RESPONSE. 194 #define IO_DATA_SAMPLE_EXTENDED_API_FRAME 0x84 //Идентификатор, введенный SysMC. Фрейм содержит дополнительные поля из маршрутного заголовка принятого пакета. 215 void setApiId(uint8_t apiId);
222 void setMsbLength(uint8_t msbLength);
228 void setLsbLength(uint8_t lsbLength);
350 uint8_t* _frameDataPtr;
357 uint8_t _frameLength;
360 uint8_t _extendedFieldsLength;
377 uint8_t getFrameId();
413 uint16_t getRemoteAddress();
428 uint8_t getFrameId();
433 uint16_t getPreviousHopAddress();
449 uint8_t* getCommand();
465 uint8_t getValueLength();
515 uint8_t* getCommand();
531 uint8_t getValueLength();
554 uint8_t getFrameId();
572 uint8_t getData(uint8_t index);
582 bool isAddressBroadcast();
587 virtual uint8_t getDataLength() = 0;
592 virtual uint8_t getDataOffset() = 0;
606 uint8_t getDataLength();
608 uint8_t getDataOffset();
613 uint8_t getSampleSize();
620 uint8_t getTemperature();
631 uint8_t getMode(uint8_t number);
636 uint8_t getPin(uint8_t number);
649 uint8_t getSampleNumber(uint8_t pin);
654 uint16_t getAnalog(uint8_t number);
659 uint8_t getDigital(uint8_t number);
664 uint32_t getCounter(uint8_t number);
667 void getNextSample(uint8_t &sample);
668 uint8_t getSample(uint8_t number);
686 uint8_t getDataLength();
691 uint8_t getDataOffset();
696 bool isAcknowledged();
716 void setFrameId(uint8_t frameId);
721 uint8_t getFrameId();
726 void setApiId(uint8_t apiId);
768 AtCommandRequest(uint8_t *command, uint8_t *commandValue, uint8_t commandValueLength);
773 AtCommandRequest(uint8_t *command, uint8_t *commandValue, uint8_t commandValueLength, uint8_t frameId);
788 uint8_t* getCommand();
793 void setCommand(uint8_t* command);
798 uint8_t* getCommandValue();
803 void setCommandValue(uint8_t* value);
808 uint8_t getCommandValueLength();
813 void setCommandValueLength(uint8_t length);
818 void clearCommandValue();
821 uint8_t *_commandValue;
822 uint8_t _commandValueLength;
831 PayloadRequest(uint8_t apiId, uint8_t frameId, uint8_t *payload, uint8_t payloadLength);
835 uint8_t* getPayload();
840 void setPayload(uint8_t* payloadPtr);
848 setPayload(payloadPtr);
849 setPayloadLength(payloadLength);
855 uint8_t getPayloadLength();
863 void setPayloadLength(uint8_t payloadLength);
865 uint8_t* _payloadPtr;
866 uint8_t _payloadLength;
891 RemoteAtCommandRequest(uint16_t remoteAddress, uint8_t *command, uint8_t *commandValue, uint8_t commandValueLength);
903 uint16_t getRemoteAddress();
904 void setRemoteAddress(uint16_t remoteAddress);
905 bool getAcknowledge();
906 void setAcknowledge(
bool acknowledge);
907 bool getApplyChanges();
908 void setApplyChanges(
bool applyChanges);
909 bool getSaveChanges();
910 void setSaveChanges(
bool saveChanges);
912 void setCca(
bool cca);
913 bool getEncryption();
914 void setEncryption(
bool encryption);
915 bool getSleepingDevice();
916 void setSleepingDevice(
bool sleepingDevice);
921 uint16_t _remoteAddress;
927 bool _sleepingDevice;
963 TxRequest(uint16_t addr, uint8_t *payload, uint8_t payloadLength);
968 TxRequest(uint16_t addr, uint8_t option, uint8_t *payload, uint8_t payloadLength, uint8_t frameId);
973 uint16_t getRemoteAddress();
978 void setRemoteAddress(uint16_t remoteAddress);
988 void setOption(uint8_t option);
994 bool getOptionEnable();
999 void setOptionEnable(
bool optionEnable);
1004 bool getAcknowledge();
1009 void setAcknowledge(
bool acknowledge);
1019 void setCca(
bool cca);
1024 bool getEncryption();
1029 void setEncryption(
bool encryption);
1034 bool getSleepingDevice();
1039 void setSleepingDevice(
bool sleepingDevice);
1052 uint16_t _remoteAddress;
1065 bool readPacket(
int timeout);
1066 void readPacketUntilAvailable();
1072 void sendByte(uint8_t b,
bool escape);
1073 void resetResponse();
1078 uint8_t _checksumTotal;
1079 uint8_t _nextFrameId;
1081 uint8_t _responseFrameData[MAX_FRAME_DATA_SIZE];
1114 _onPacketError.set(func, data);
1125 _onResponse.set(func, data);
1135 _onOtherResponse.set(func, data);
1148 _onModemStatusResponse.set(func, data);
1156 _onTxStatusResponse.set(func, data);
1164 _onAtCommandResponse.set(func, data);
1172 _onRemoteAtCommandResponse.set(func, data);
1180 _onRxAcknowledgeResponse.set(func, data);
1188 _onRxResponse.set(func, data);
1196 _onRxIoSampleResponse.set(func, data);
1218 template <
typename Response>
1219 uint8_t
waitFor(Response& response, uint16_t timeout,
bool (*func)(Response&, uintptr_t) = NULL, uintptr_t data = 0, int16_t frameId = -1)
1221 return waitForInternal(Response::API_ID, &response, timeout, (
void*)func, data, frameId);
1232 return waitForStatus(request.
getFrameId(), timeout);
1242 uint8_t sendAndWaitForAcknowledge(
MBeeRequest &request, uint16_t timeout);
1250 uint8_t waitForStatus(uint8_t frameId, uint16_t timeout);
1258 uint8_t waitForAcknowledge(uint8_t frameId, uint16_t timeout);
1266 uint8_t waitForInternal(uint8_t apiId,
void *response, uint16_t timeout,
void *func, uintptr_t data, int16_t frameId);
1272 uint8_t matchStatus(uint8_t frameId);
1278 uint8_t matchAcknowledge(uint8_t frameId);
1296 template <
typename Arg>
struct Callback
1298 void (*func)(Arg, uintptr_t);
1300 void set(void (*func)(Arg, uintptr_t), uintptr_t data)
1309 this->func(arg, this->data);
1316 Callback<uint8_t> _onPacketError;
1317 Callback<MBeeResponse&> _onResponse;
1318 Callback<MBeeResponse&> _onOtherResponse;
1319 Callback<ModemStatusResponse&> _onModemStatusResponse;
1320 Callback<TxStatusResponse&> _onTxStatusResponse;
1321 Callback<AtCommandResponse&> _onAtCommandResponse;
1322 Callback<RemoteAtCommandResponse&> _onRemoteAtCommandResponse;
1323 Callback<RxAcknowledgeResponse&> _onRxAcknowledgeResponse;
1324 Callback<RxResponse&> _onRxResponse;
1325 Callback<RxIoSampleResponse&> _onRxIoSampleResponse;
1328 #endif //SerialStar_h void setPayload(uint8_t *payloadPtr, uint8_t payloadLength)
Уставливает инлайном одновременно указатель на поле данных и число байт из него, начиная с первого...
Этот класс может быть использован вместо класса SerialStar и позволяет самостоятельно создавать функц...
Класс расширяет базовый класс MBeeResponse для всех сообщений, которые имеют поле frame id...
Супер класс для всех пакетов, передаваемых от хоста к модулям MBee-868-x.0 в проекте SerialStar...
Класс для локального ответа модуля со статусом передачи в эфир или размещением в буфере.
uint8_t getFrameId()
Возвращает frame id.
uint8_t getLsbLength()
Возвращает LSB длины поля данных.
void onRxResponse(void(*func)(RxResponse &, uintptr_t), uintptr_t data=0)
Регистрация callback-функции, вызываемой при приеме API-фрейма с неструктурированными данными от удал...
Класс для выдачи в UART принятых по эфиру пакетов, содержаших неструктированные данные.
void getTxStatusResponse(MBeeResponse &response)
Вызов TxStatusResponse при getApiId() == 0x8B.
void onRxAcknowledgeResponse(void(*func)(RxAcknowledgeResponse &, uintptr_t), uintptr_t data=0)
Регистрация callback-функции, вызываемой при приеме API-фрейма с подтверждением приема пакета от удал...
void setAvailable(bool complete)
Устанавливает признак доступности пакета.
void onRxIoSampleResponse(void(*func)(RxIoSampleResponse &, uintptr_t), uintptr_t data=0)
Регистрация callback-функции, вызываемой при приеме API-фрейма с данными о состоянии датчиков удаленн...
void getAtCommandResponse(MBeeResponse &responses)
Вызов AtCommandResponse при getApiId() == x88).
bool isError()
Возвращает true если при разборе пакета произошли ошибки.
uint8_t getMsbLength()
Возвращает MSB длины поля данных.
Класс для ответа на командный API-фрейм для удаленного узла.
uint8_t getExtendedFieldsLength(void)
Возвращает длину дополнительных полей пакета расширенного формата.
void onPacketError(void(*func)(uint8_t, uintptr_t), uintptr_t data=0)
Регистрация callback-функции для события ошибки чтения пакета.
uint8_t getFrameDataLength()
Возвращает длину данных в пакете между полем типа API-фрейма и контрольной суммой.
void setErrorCode(uint8_t errorCode)
Устанавливает код ошибки.
void getRxAcknowledgeResponse(MBeeResponse &response)
Вызов RxAcknowledgeResponse при getApiId() == 0x8C.
Супер класс для всех пакетов, передаваемых по UART модулями MBee-868-x.0 в проекте SerialStar...
uint8_t getApiId()
Возвращает тип API-фрейма.
bool isAvailable()
Возвращает true, если пакет успешно принят.
MBeeResponse()
Конструктор "по умолчанию".
void getModemStatusResponse(MBeeResponse &response)
Вызов ModemStatusResponse при getApiId() == 0x8A.
Класс для удаленного управления модулем с помощью API-фрейма.
void onResponse(void(*func)(MBeeResponse &, uintptr_t), uintptr_t data=0)
Регистрация callback-функции для события приема пакета от модуля.
void getRemoteAtCommandResponse(MBeeResponse &response)
Вызов RemoteAtCommandResponse при getApiId() == 0x97, 0x98.
void reset()
Сбрасывает все поля пакета.
Базовый класс для работы с модулями диапазона 868 МГц.
void onOtherResponse(void(*func)(MBeeResponse &, uintptr_t), uintptr_t data=0)
Регистрация callback-функции для события приема пакета от модуля.
Класс для пакета с подтверждением получения неструктурированных данных удаленным модемом.
Класс для локального управления модулем с помощью API-фрейма.
void onAtCommandResponse(void(*func)(AtCommandResponse &, uintptr_t), uintptr_t data=0)
Регистрация callback-функции, вызываемой при приеме API-фрейма с ответом на локальную AT-команду (api...
uint8_t getChecksum()
Подсчет контрольной суммы.
Класс для API-фрейма со статусом модема после инициализации.
uint16_t getPacketLength()
Возвращает длину пакета.
Класс для проекта SerialStar диапазона 868 МГц.
void setChecksum(uint8_t checksum)
Запись контрольной суммы в соответствующее поле пакета.
Базовый класс для всех пакетов, принятых по эфиру и передаваемых модулем на UART. ...
Класс для пакета,предназначенного для передачи удаленному модему неструктурированных данных...
void init()
Инициализация пакета.
void onModemStatusResponse(void(*func)(ModemStatusResponse &, uintptr_t), uintptr_t data=0)
Регистрация callback-функции, вызываемой при приеме API-фрейма со статусом модема (apiId = 0x8A)...
Класс для ответа на локальный командный API-фрейм.
uint8_t getErrorCode()
Возвращает код ошибки или 0, если их нет.
void getRxResponse(MBeeResponse &response)
Вызов RxResponse при getApiId() == 0x81, 0x82, 0x8F, 0x90.
uint8_t waitFor(Response &response, uint16_t timeout, bool(*func)(Response &, uintptr_t)=NULL, uintptr_t data=0, int16_t frameId=-1)
Принимает API-фрейм заданного типа, опционально отфильтрованного с помощью определенной функции прове...
void getRxIoSampleResponse(MBeeResponse &response)
Вызов RxIoSampleResponse при getApiId() == 0x83, 0x84.
void onRemoteAtCommandResponse(void(*func)(RemoteAtCommandResponse &, uintptr_t), uintptr_t data=0)
Регистрация callback-функции, вызываемой при приеме API-фрейма с ответом на удаленную AT-команду (api...
Базовый класс для всех пакетов, предназначенных для передачи по эфиру неструктурированных данных...
uint8_t * getFrameData()
Возвращает указатель на буфер, который содержит сообщение.
uint8_t sendAndWait(MBeeRequest &request, uint16_t timeout)
Передает в UART API-фрейм, предназначенный для передачи по эфиру и ждет ответа со статусом в течение ...
void onTxStatusResponse(void(*func)(TxStatusResponse &, uintptr_t), uintptr_t data=0)
Регистрация callback-функции, вызываемой при приеме API-фрейма со статусом передачи (apiId = 0x8B)...
void setFrameLength(uint8_t frameLength)
Запись поля длины в пакете.
Класс для всех пакетов, принятых по эфиру, передаваемых модулем на UART и содержащих поле данных...
void setFrameData(uint8_t *frameDataPtr)
Устанавливает указатель на поле данных пакета.
void setExtendedFieldsLength(uint8_t length)
Устанавливает длину дополнительных полей пакета расширенного формата.