MBee Arduino library
SerialStar.h
1 /* "Системы модули и компоненты" ("СМК"). 2020. Москва.
2 Библиотека MBee-Arduino.
3 Распространяется свободно. Надеемся, что программные продукты, созданные
4 с помощью данной библиотеки будут полезными, однако никакие гарантии, явные или
5 подразумеваемые не предоставляются.
6 
7 The MIT License(MIT)
8 
9 MBee-Arduino Library.
10 Copyright © 2020 Systems, modules and components. Moscow. Russia.
11 
12 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
13 documentation files(the "Software"), to deal in the Software without restriction, including without limitation
14 the rights to use, copy, modify, merge, publish, distribute, sublicense, and / or sell copies of the Software,
15 and to permit persons to whom the Software is furnished to do so, subject to the following conditions :
16 The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
17 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
18 WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR
19 COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21 
22 Code adapted from XBee-Arduino library XBee.h. Copyright info below.
23 * @file XBee.h
24 * @author Andrew Rapp
25 * @license This project is released under the GNU License
26 * @copyright Copyright (c) 2009 Andrew Rapp. All rights reserved
27 * @date 2009
28 * @brief Interface to the wireless XBee modules
29 */
30 
31 #ifndef SerialStar_h
32 #define SerialStar_h
33 
34 //Режим последовательного интерфейса должен быть установлен в пакетный с escape-символами в направлении Модуль->Хост. В направлении хост->модуль пакетный режим без escape-символов.
35 #define ATAP 2
36 
37 //Escape-символы.
38 #define START_BYTE 0x7E
39 #define ESCAPE 0x7D
40 #define XON 0x11
41 #define XOFF 0x13
42 
43 //Коды ошибок при разборе API-фрейма.
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
48 
49 //Статус локального ответа API-фрейма.
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 //Пакет в эфир не отправлен вследствие занятости рабочей частоты.
55 
56 //Параметры поля Receive options.
57 #define PACKET_ACKNOWLEDGED_BIT 0
58 #define PACKET_WAS_BROADCAST_BIT 1
59 
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
64 
65 //Константы ответа TRANSMIT_STATUS_API_FRAME.
66 #define SUCCESS 0x0
67 
68 //Биты регистра DM (Device Mode).
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-фрейме.
75 
76 //Параметры поля transmitOptions.
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, если сообщение предназначено для спящего узла и помещается в буфер, а не передается сразу в эфир.
81 
82 //Параметры поля Remote command options.
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.
89 
90 //Параметры поля Receive options.
91 #define NO_RECEIVE_OPTIONS 0
92 #define PACKET_ACKNOWLEDGED_BIT 0
93 #define PACKET_WAS_BROADCAST_BIT 1
94 
95 #define MAX_FRAME_DATA_SIZE 44 //2 байта адреса + 1 байт RSSI + 1 байт options + 40 байт данные)
96 #define BROADCAST_ADDRESS 0xFFFF
97 
98 //Значения "по умолчанию".
99 #define TRANSMIT_OPTION_DEFAULT 0
100 
101 //Линии ввода/вывода.
102 
103 //Состояние цифрового входа/выхода.
104 #define LOW 0
105 #define HIGH 1
106 
107 #define PWM_DUTY_CYCLE_MAX 13000u //Максимальное значение параметра для команд управления временем включенного состояния ШИМ-выхода (команды M1 - M4).
108 
109 //Идентификаторы линий ввода/вывода. Идентификаторы соответствуют номерам физических выводов модуля MBee-868-x.0.
110 #define L0_ID 2
111 #define L1_ID 3
112 #define L2_ID 4
113 #define L3_ID 6
114 #define L4_ID 7
115 #define L5_ID 9
116 #define L6_ID 11
117 #define L7_ID 12
118 #define L8_ID 13
119 
120 #define B0_ID 14
121 #define B1_ID 15
122 #define B2_ID 16
123 #define B3_ID 17
124 #define B4_ID 18
125 #define B5_ID 19
126 
127 #define R0_ID 35
128 #define R1_ID 34
129 #define R2_ID 33
130 #define R3_ID 32
131 #define R4_ID 31
132 #define R5_ID 30
133 #define R6_ID 29
134 #define R7_ID 28
135 #define R8_ID 27
136 #define R9_ID 24
137 
138 //Режимы линий ввода/вывода.
139 #define IO_DISABLED 0
140 #define IO_NOT_AVAILABLE 1
141 #define IO_ADC 2
142 #define IO_DIGITAL_INPUT 3
143 #define IO_DIGITAL_OUTPUT_LO 4
144 #define IO_DIGITAL_OUTPUT_HI 5
145 #define IO_UART_TX 6
146 #define IO_UART_RX 7
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
156 #define IO_PWM1 17
157 #define IO_PWM2 18
158 #define IO_PWM3 19
159 #define IO_PWM4 20
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
167 
168 //Макросы.
169 #define BV(n) (1 << (n))
170 
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. Фрейм содержит дополнительные поля из маршрутного заголовка принятого пакета.
195 
203 {
204 public:
208  MBeeResponse();
209 
213  uint8_t getApiId();
214 
215  void setApiId(uint8_t apiId);
216 
220  uint8_t getMsbLength();
221 
222  void setMsbLength(uint8_t msbLength);
226  uint8_t getLsbLength();
227 
228  void setLsbLength(uint8_t lsbLength);
232  uint8_t getChecksum();
233 
237  void setChecksum(uint8_t checksum);
238 
242  uint8_t getFrameDataLength();
243 
247  void setFrameLength(uint8_t frameLength);
248 
252  void setFrameData(uint8_t* frameDataPtr);
253 
261  uint8_t* getFrameData();
262 
266  uint16_t getPacketLength();
267 
271  void setExtendedFieldsLength(uint8_t length);
272 
276  uint8_t getExtendedFieldsLength(void);
277 
281  void reset();
282 
286  void init();
287 
291  void getTxStatusResponse(MBeeResponse &response);
292 
296  void getRxResponse(MBeeResponse &response);
297 
301  void getRxIoSampleResponse(MBeeResponse &response);
302 
306  void getModemStatusResponse(MBeeResponse &response);
307 
311  void getAtCommandResponse(MBeeResponse &responses);
312 
317 
321  void getRxAcknowledgeResponse(MBeeResponse &response);
322 
326  bool isAvailable();
327 
331  void setAvailable(bool complete);
332 
336  bool isError();
337 
342  uint8_t getErrorCode();
343 
347  void setErrorCode(uint8_t errorCode);
348 
349 protected:
350  uint8_t* _frameDataPtr;
351 private:
352  void setCommon(MBeeResponse &target);
353  uint8_t _apiId;
354  uint8_t _msbLength;
355  uint8_t _lsbLength;
356  uint8_t _checksum;
357  uint8_t _frameLength;
358  bool _complete;
359  uint8_t _errorCode;
360  uint8_t _extendedFieldsLength;
361 };
362 
367 {
368 public:
372  FrameIdResponse();
373 
377  uint8_t getFrameId();
378 private:
379  uint8_t _frameId;
380 };
381 
386 {
387 public:
392 
396  uint8_t getStatus();
397 };
398 
403 {
404 public:
409 
413  uint16_t getRemoteAddress();
414 
418  uint8_t getRssi();
419 
423  uint8_t getOption();
424 
428  uint8_t getFrameId();
429 
433  uint16_t getPreviousHopAddress();
434 };
435 
440 {
441 public:
449  uint8_t* getCommand();
450 
454  uint8_t getStatus();
455 
460  uint8_t* getValue();
461 
465  uint8_t getValueLength();
466 
470  bool isOk();
471 };
472 
477 {
478 public:
483 
487  uint8_t getStatus();
488 
492  bool isSuccess();
493 
497  uint8_t getApiId();
498 };
499 
500 
505 {
506 public:
511 
515  uint8_t* getCommand();
516 
520  uint8_t getStatus();
521 
526  uint8_t* getValue();
527 
531  uint8_t getValueLength();
532 
536  bool isOk();
537 };
538 
543 {
544 public:
549 
554  uint8_t getFrameId();
555 };
556 
561 {
562 public:
566  RxDataResponse();
567 
572  uint8_t getData(uint8_t index);
573 
577  uint8_t* getData();
578 
582  bool isAddressBroadcast();
583 
587  virtual uint8_t getDataLength() = 0;
588 
592  virtual uint8_t getDataOffset() = 0;
593 };
594 
596 {
597 public:
602 
606  uint8_t getDataLength();
607 
608  uint8_t getDataOffset();
609 
613  uint8_t getSampleSize();
614 
620  uint8_t getTemperature();
621 
626  uint8_t getVbatt();
627 
631  uint8_t getMode(uint8_t number);
632 
636  uint8_t getPin(uint8_t number);
637 
638 
642  bool isAvailable(uint8_t pin);
643 
649  uint8_t getSampleNumber(uint8_t pin);
650 
654  uint16_t getAnalog(uint8_t number);
655 
659  uint8_t getDigital(uint8_t number);
660 
664  uint32_t getCounter(uint8_t number);
665 
666 private:
667  void getNextSample(uint8_t &sample); //Увеличивает sample на число байт, соответствующее длине данных о текущем состоянии, которая зависит от типа входа/выхода.
668  uint8_t getSample(uint8_t number); //Возвращает смещение первого байта (идентификатора линии ввода/вывода) относительно начала поля данных для данного номера выборки в пакете.
669 };
670 
671 
675 class RxResponse : public RxDataResponse
676 {
677 public:
681  RxResponse();
682 
686  uint8_t getDataLength();
687 
691  uint8_t getDataOffset();
692 
696  bool isAcknowledged();
697 };
698 
706 {
707 public:
711  MBeeRequest(uint8_t apiId, uint8_t frameId);
712 
716  void setFrameId(uint8_t frameId);
717 
721  uint8_t getFrameId();
722 
726  void setApiId(uint8_t apiId);
727 
731  uint8_t getApiId();
738  virtual uint8_t getFrameData(uint8_t pos) = 0; //Приравнивание функции 0 делает ее pure virtual (т.е. она обязательна должна быть определена в производных классах)
742  virtual uint8_t getFrameDataLength() = 0;
743 
744 private:
745  uint8_t _apiId;
746  uint8_t _frameId;
747 };
748 
753 {
754 public:
759 
763  AtCommandRequest(uint8_t *command);
764 
768  AtCommandRequest(uint8_t *command, uint8_t *commandValue, uint8_t commandValueLength);
769 
773  AtCommandRequest(uint8_t *command, uint8_t *commandValue, uint8_t commandValueLength, uint8_t frameId);
774 
778  uint8_t getFrameData(uint8_t pos);
779 
783  uint8_t getFrameDataLength();
784 
788  uint8_t* getCommand();
789 
793  void setCommand(uint8_t* command);
794 
798  uint8_t* getCommandValue();
799 
803  void setCommandValue(uint8_t* value);
804 
808  uint8_t getCommandValueLength();
809 
813  void setCommandValueLength(uint8_t length);
814 
818  void clearCommandValue();
819 private:
820  uint8_t *_command;
821  uint8_t *_commandValue;
822  uint8_t _commandValueLength;
823 };
824 
829 {
830 public:
831  PayloadRequest(uint8_t apiId, uint8_t frameId, uint8_t *payload, uint8_t payloadLength);
835  uint8_t* getPayload();
836 
840  void setPayload(uint8_t* payloadPtr);
841 
846  void setPayload(uint8_t* payloadPtr, uint8_t payloadLength)
847  {
848  setPayload(payloadPtr);
849  setPayloadLength(payloadLength);
850  }
851 
855  uint8_t getPayloadLength();
856 
863  void setPayloadLength(uint8_t payloadLength);
864 private:
865  uint8_t* _payloadPtr;
866  uint8_t _payloadLength;
867 };
868 
873 {
874 public:
879 
891  RemoteAtCommandRequest(uint16_t remoteAddress, uint8_t *command, uint8_t *commandValue, uint8_t commandValueLength);
892 
902  RemoteAtCommandRequest(uint16_t remoteAddress, uint8_t *command);
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);
911  bool getCca();
912  void setCca(bool cca);
913  bool getEncryption();
914  void setEncryption(bool encryption);
915  bool getSleepingDevice();
916  void setSleepingDevice(bool sleepingDevice);
917  uint8_t getFrameData(uint8_t pos);
918  uint8_t getFrameDataLength();
919  void setDefault();
920 private:
921  uint16_t _remoteAddress;
922  bool _acknowledge;
923  bool _applyChanges;
924  bool _saveChanges;
925  bool _cca;
926  bool _encryption;
927  bool _sleepingDevice;
928 };
929 
950 class TxRequest : public PayloadRequest
951 {
952 public:
958  TxRequest();
959 
963  TxRequest(uint16_t addr, uint8_t *payload, uint8_t payloadLength);
964 
968  TxRequest(uint16_t addr, uint8_t option, uint8_t *payload, uint8_t payloadLength, uint8_t frameId);
969 
973  uint16_t getRemoteAddress();
974 
978  void setRemoteAddress(uint16_t remoteAddress);
979 
983  uint8_t getOption();
984 
988  void setOption(uint8_t option);
989 
994  bool getOptionEnable();
995 
999  void setOptionEnable(bool optionEnable);
1000 
1004  bool getAcknowledge();
1005 
1009  void setAcknowledge(bool acknowledge);
1010 
1014  bool getCca();
1015 
1019  void setCca(bool cca);
1020 
1024  bool getEncryption();
1025 
1029  void setEncryption(bool encryption);
1030 
1034  bool getSleepingDevice();
1035 
1039  void setSleepingDevice(bool sleepingDevice);
1040 
1044  uint8_t getFrameData(uint8_t pos);
1045 
1049  uint8_t getFrameDataLength();
1050 
1051 private:
1052  uint16_t _remoteAddress;
1053  uint8_t _option;
1054  bool _optionEnable;
1055 };
1056 
1060 class SerialStar : public MBee868
1061 {
1062 public:
1063  SerialStar();
1064  void readPacket();
1065  bool readPacket(int timeout);
1066  void readPacketUntilAvailable();
1067  void send(void*);
1068  void send(MBeeRequest &request);
1069 
1070  MBeeResponse& getResponse();
1071 private:
1072  void sendByte(uint8_t b, bool escape);
1073  void resetResponse();
1074  MBeeResponse _response;
1075  bool _escape;
1076  uint8_t _pos; //Текущая позиция в буфере. По сути дела представляет собой состояние конечного автомата.
1077  uint8_t b; //Последний считанный байт.
1078  uint8_t _checksumTotal;
1079  uint8_t _nextFrameId;
1080  //Буфер входящих сообщений. Содержит только один пакет с данными, начинающимися после поля frameType (api id) и оканчивающимися перед checksum.
1081  uint8_t _responseFrameData[MAX_FRAME_DATA_SIZE];
1082  Stream* _serial;
1083 };
1084 
1105 {
1106 public:
1112  void onPacketError(void (*func)(uint8_t, uintptr_t), uintptr_t data = 0)
1113  {
1114  _onPacketError.set(func, data);
1115  }
1116 
1123  void onResponse(void (*func)(MBeeResponse&, uintptr_t), uintptr_t data = 0)
1124  {
1125  _onResponse.set(func, data);
1126  }
1127 
1133  void onOtherResponse(void (*func)(MBeeResponse&, uintptr_t), uintptr_t data = 0)
1134  {
1135  _onOtherResponse.set(func, data);
1136  }
1137 
1138  //Функции, регистрирующие специфические callback-функции для каждого типа API-фрейма. Callback-функции вызываются каждый раз при успешном приеме
1139  //API-фрейма соответствующего типа после того, как быдет вызвана функция, зарегистрированна по onResponse().
1140  //Аргументом callback-функции является принятый фрейм(уже конвертированный в соответсвующий тип) и указатель на данные, переданный при регистрации
1141  //данной callback-функции.
1142 
1146  void onModemStatusResponse(void (*func)(ModemStatusResponse&, uintptr_t), uintptr_t data = 0)
1147  {
1148  _onModemStatusResponse.set(func, data);
1149  }
1150 
1154  void onTxStatusResponse(void (*func)(TxStatusResponse&, uintptr_t), uintptr_t data = 0)
1155  {
1156  _onTxStatusResponse.set(func, data);
1157  }
1158 
1162  void onAtCommandResponse(void (*func)(AtCommandResponse&, uintptr_t), uintptr_t data = 0)
1163  {
1164  _onAtCommandResponse.set(func, data);
1165  }
1166 
1170  void onRemoteAtCommandResponse(void (*func)(RemoteAtCommandResponse&, uintptr_t), uintptr_t data = 0)
1171  {
1172  _onRemoteAtCommandResponse.set(func, data);
1173  }
1174 
1178  void onRxAcknowledgeResponse(void (*func)(RxAcknowledgeResponse&, uintptr_t), uintptr_t data = 0)
1179  {
1180  _onRxAcknowledgeResponse.set(func, data);
1181  }
1182 
1186  void onRxResponse(void (*func)(RxResponse&, uintptr_t), uintptr_t data = 0)
1187  {
1188  _onRxResponse.set(func, data);
1189  }
1190 
1194  void onRxIoSampleResponse(void (*func)(RxIoSampleResponse&, uintptr_t), uintptr_t data = 0)
1195  {
1196  _onRxIoSampleResponse.set(func, data);
1197  }
1198 
1203  void run();
1204 
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)
1220  {
1221  return waitForInternal(Response::API_ID, &response, timeout, (void*)func, data, frameId);
1222  }
1223 
1229  uint8_t sendAndWait(MBeeRequest &request, uint16_t timeout)
1230  {
1231  send(request);
1232  return waitForStatus(request.getFrameId(), timeout);
1233  }
1234 
1242  uint8_t sendAndWaitForAcknowledge(MBeeRequest &request, uint16_t timeout);
1243 
1250  uint8_t waitForStatus(uint8_t frameId, uint16_t timeout);
1251 
1258  uint8_t waitForAcknowledge(uint8_t frameId, uint16_t timeout);
1259 
1260 private:
1266  uint8_t waitForInternal(uint8_t apiId, void *response, uint16_t timeout, void *func, uintptr_t data, int16_t frameId);
1267 
1272  uint8_t matchStatus(uint8_t frameId);
1273 
1278  uint8_t matchAcknowledge(uint8_t frameId);
1279 
1287  bool loopTop();
1288 
1294  void loopBottom();
1295 
1296  template <typename Arg> struct Callback
1297  {
1298  void (*func)(Arg, uintptr_t);
1299  uintptr_t data;
1300  void set(void (*func)(Arg, uintptr_t), uintptr_t data)
1301  {
1302  this->func = func;
1303  this->data = data;
1304  }
1305  bool call(Arg arg)
1306  {
1307  if(this->func)
1308  {
1309  this->func(arg, this->data);
1310  return true;
1311  }
1312  return false;
1313  }
1314  };
1315 
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;
1326 };
1327 
1328 #endif //SerialStar_h
void setPayload(uint8_t *payloadPtr, uint8_t payloadLength)
Уставливает инлайном одновременно указатель на поле данных и число байт из него, начиная с первого...
Definition: SerialStar.h:846
Этот класс может быть использован вместо класса SerialStar и позволяет самостоятельно создавать функц...
Definition: SerialStar.h:1104
Класс расширяет базовый класс MBeeResponse для всех сообщений, которые имеют поле frame id...
Definition: SerialStar.h:366
Супер класс для всех пакетов, передаваемых от хоста к модулям MBee-868-x.0 в проекте SerialStar...
Definition: SerialStar.h:705
Класс для локального ответа модуля со статусом передачи в эфир или размещением в буфере.
Definition: SerialStar.h:476
uint8_t getFrameId()
Возвращает frame id.
Definition: SerialStar.cpp:592
uint8_t getLsbLength()
Возвращает LSB длины поля данных.
Definition: SerialStar.cpp:61
void onRxResponse(void(*func)(RxResponse &, uintptr_t), uintptr_t data=0)
Регистрация callback-функции, вызываемой при приеме API-фрейма с неструктурированными данными от удал...
Definition: SerialStar.h:1186
Класс для выдачи в UART принятых по эфиру пакетов, содержаших неструктированные данные.
Definition: SerialStar.h:675
void getTxStatusResponse(MBeeResponse &response)
Вызов TxStatusResponse при getApiId() == 0x8B.
Definition: SerialStar.cpp:133
void onRxAcknowledgeResponse(void(*func)(RxAcknowledgeResponse &, uintptr_t), uintptr_t data=0)
Регистрация callback-функции, вызываемой при приеме API-фрейма с подтверждением приема пакета от удал...
Definition: SerialStar.h:1178
void setAvailable(bool complete)
Устанавливает признак доступности пакета.
Definition: SerialStar.cpp:187
void onRxIoSampleResponse(void(*func)(RxIoSampleResponse &, uintptr_t), uintptr_t data=0)
Регистрация callback-функции, вызываемой при приеме API-фрейма с данными о состоянии датчиков удаленн...
Definition: SerialStar.h:1194
void getAtCommandResponse(MBeeResponse &responses)
Вызов AtCommandResponse при getApiId() == x88).
Definition: SerialStar.cpp:161
bool isError()
Возвращает true если при разборе пакета произошли ошибки.
Definition: SerialStar.cpp:192
uint8_t getMsbLength()
Возвращает MSB длины поля данных.
Definition: SerialStar.cpp:51
Класс для ответа на командный API-фрейм для удаленного узла.
Definition: SerialStar.h:504
uint8_t getExtendedFieldsLength(void)
Возвращает длину дополнительных полей пакета расширенного формата.
Definition: SerialStar.cpp:111
void onPacketError(void(*func)(uint8_t, uintptr_t), uintptr_t data=0)
Регистрация callback-функции для события ошибки чтения пакета.
Definition: SerialStar.h:1112
uint8_t getFrameDataLength()
Возвращает длину данных в пакете между полем типа API-фрейма и контрольной суммой.
Definition: SerialStar.cpp:81
void setErrorCode(uint8_t errorCode)
Устанавливает код ошибки.
Definition: SerialStar.cpp:202
void getRxAcknowledgeResponse(MBeeResponse &response)
Вызов RxAcknowledgeResponse при getApiId() == 0x8C.
Definition: SerialStar.cpp:175
Супер класс для всех пакетов, передаваемых по UART модулями MBee-868-x.0 в проекте SerialStar...
Definition: SerialStar.h:202
uint8_t getApiId()
Возвращает тип API-фрейма.
Definition: SerialStar.cpp:41
bool isAvailable()
Возвращает true, если пакет успешно принят.
Definition: SerialStar.cpp:182
MBeeResponse()
Конструктор "по умолчанию".
Definition: SerialStar.cpp:36
void getModemStatusResponse(MBeeResponse &response)
Вызов ModemStatusResponse при getApiId() == 0x8A.
Definition: SerialStar.cpp:154
Класс для удаленного управления модулем с помощью API-фрейма.
Definition: SerialStar.h:872
void onResponse(void(*func)(MBeeResponse &, uintptr_t), uintptr_t data=0)
Регистрация callback-функции для события приема пакета от модуля.
Definition: SerialStar.h:1123
void getRemoteAtCommandResponse(MBeeResponse &response)
Вызов RemoteAtCommandResponse при getApiId() == 0x97, 0x98.
Definition: SerialStar.cpp:168
void reset()
Сбрасывает все поля пакета.
Definition: SerialStar.cpp:116
Базовый класс для работы с модулями диапазона 868 МГц.
Definition: MBee.h:183
void onOtherResponse(void(*func)(MBeeResponse &, uintptr_t), uintptr_t data=0)
Регистрация callback-функции для события приема пакета от модуля.
Definition: SerialStar.h:1133
Класс для пакета с подтверждением получения неструктурированных данных удаленным модемом.
Definition: SerialStar.h:542
Класс для локального управления модулем с помощью API-фрейма.
Definition: SerialStar.h:752
void onAtCommandResponse(void(*func)(AtCommandResponse &, uintptr_t), uintptr_t data=0)
Регистрация callback-функции, вызываемой при приеме API-фрейма с ответом на локальную AT-команду (api...
Definition: SerialStar.h:1162
uint8_t getChecksum()
Подсчет контрольной суммы.
Definition: SerialStar.cpp:71
Класс для API-фрейма со статусом модема после инициализации.
Definition: SerialStar.h:385
uint16_t getPacketLength()
Возвращает длину пакета.
Definition: SerialStar.cpp:101
Класс для проекта SerialStar диапазона 868 МГц.
Definition: SerialStar.h:1060
void setChecksum(uint8_t checksum)
Запись контрольной суммы в соответствующее поле пакета.
Definition: SerialStar.cpp:76
Базовый класс для всех пакетов, принятых по эфиру и передаваемых модулем на UART. ...
Definition: SerialStar.h:402
Класс для пакета,предназначенного для передачи удаленному модему неструктурированных данных...
Definition: SerialStar.h:950
void init()
Инициализация пакета.
Definition: SerialStar.cpp:126
void onModemStatusResponse(void(*func)(ModemStatusResponse &, uintptr_t), uintptr_t data=0)
Регистрация callback-функции, вызываемой при приеме API-фрейма со статусом модема (apiId = 0x8A)...
Definition: SerialStar.h:1146
Класс для ответа на локальный командный API-фрейм.
Definition: SerialStar.h:439
uint8_t getErrorCode()
Возвращает код ошибки или 0, если их нет.
Definition: SerialStar.cpp:197
void getRxResponse(MBeeResponse &response)
Вызов RxResponse при getApiId() == 0x81, 0x82, 0x8F, 0x90.
Definition: SerialStar.cpp:140
uint8_t waitFor(Response &response, uint16_t timeout, bool(*func)(Response &, uintptr_t)=NULL, uintptr_t data=0, int16_t frameId=-1)
Принимает API-фрейм заданного типа, опционально отфильтрованного с помощью определенной функции прове...
Definition: SerialStar.h:1219
void getRxIoSampleResponse(MBeeResponse &response)
Вызов RxIoSampleResponse при getApiId() == 0x83, 0x84.
Definition: SerialStar.cpp:147
void onRemoteAtCommandResponse(void(*func)(RemoteAtCommandResponse &, uintptr_t), uintptr_t data=0)
Регистрация callback-функции, вызываемой при приеме API-фрейма с ответом на удаленную AT-команду (api...
Definition: SerialStar.h:1170
Базовый класс для всех пакетов, предназначенных для передачи по эфиру неструктурированных данных...
Definition: SerialStar.h:828
uint8_t * getFrameData()
Возвращает указатель на буфер, который содержит сообщение.
Definition: SerialStar.cpp:96
uint8_t sendAndWait(MBeeRequest &request, uint16_t timeout)
Передает в UART API-фрейм, предназначенный для передачи по эфиру и ждет ответа со статусом в течение ...
Definition: SerialStar.h:1229
void onTxStatusResponse(void(*func)(TxStatusResponse &, uintptr_t), uintptr_t data=0)
Регистрация callback-функции, вызываемой при приеме API-фрейма со статусом передачи (apiId = 0x8B)...
Definition: SerialStar.h:1154
void setFrameLength(uint8_t frameLength)
Запись поля длины в пакете.
Definition: SerialStar.cpp:86
Класс для всех пакетов, принятых по эфиру, передаваемых модулем на UART и содержащих поле данных...
Definition: SerialStar.h:560
void setFrameData(uint8_t *frameDataPtr)
Устанавливает указатель на поле данных пакета.
Definition: SerialStar.cpp:91
void setExtendedFieldsLength(uint8_t length)
Устанавливает длину дополнительных полей пакета расширенного формата.
Definition: SerialStar.cpp:106