Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: CircularBuffer FixedLengthList
Dependents: XBeeApiTest XBeeApiSimpleATCmdsExample XBeeApiBroadcastExample XBeeApiBroadcastExampleRTOS ... more
Utility/XBeeApiCmdAt.cpp@53:7b65422d7a32, 2014-07-28 (annotated)
- Committer:
- johnb
- Date:
- Mon Jul 28 13:27:58 2014 +0000
- Revision:
- 53:7b65422d7a32
- Parent:
- 52:0950b05d5270
- Child:
- 55:610aa4a2ed3b
Comments & clean-up
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
johnb | 8:1b48b619d7f6 | 1 | /** |
johnb | 8:1b48b619d7f6 | 2 | |
johnb | 8:1b48b619d7f6 | 3 | Copyright 2014 John Bailey |
johnb | 13:302e7c1ea0b3 | 4 | |
johnb | 8:1b48b619d7f6 | 5 | Licensed under the Apache License, Version 2.0 (the "License"); |
johnb | 8:1b48b619d7f6 | 6 | you may not use this file except in compliance with the License. |
johnb | 8:1b48b619d7f6 | 7 | You may obtain a copy of the License at |
johnb | 8:1b48b619d7f6 | 8 | |
johnb | 8:1b48b619d7f6 | 9 | http://www.apache.org/licenses/LICENSE-2.0 |
johnb | 8:1b48b619d7f6 | 10 | |
johnb | 8:1b48b619d7f6 | 11 | Unless required by applicable law or agreed to in writing, software |
johnb | 8:1b48b619d7f6 | 12 | distributed under the License is distributed on an "AS IS" BASIS, |
johnb | 8:1b48b619d7f6 | 13 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
johnb | 8:1b48b619d7f6 | 14 | See the License for the specific language governing permissions and |
johnb | 8:1b48b619d7f6 | 15 | limitations under the License. |
johnb | 8:1b48b619d7f6 | 16 | |
johnb | 8:1b48b619d7f6 | 17 | */ |
johnb | 8:1b48b619d7f6 | 18 | |
johnb | 8:1b48b619d7f6 | 19 | #include "XBeeApiCmdAt.hpp" |
johnb | 8:1b48b619d7f6 | 20 | |
johnb | 8:1b48b619d7f6 | 21 | /* Set of Frame ID codes for the various commands (see XBEE_CMD_POSN_FRAME_ID) */ |
johnb | 8:1b48b619d7f6 | 22 | |
johnb | 13:302e7c1ea0b3 | 23 | #define CMD_RESPONSE_GET_VR '1' |
johnb | 13:302e7c1ea0b3 | 24 | #define CMD_RESPONSE_GET_HV '2' |
johnb | 13:302e7c1ea0b3 | 25 | #define CMD_RESPONSE_GET_CH '3' |
johnb | 13:302e7c1ea0b3 | 26 | #define CMD_RESPONSE_SET_CH '4' |
johnb | 13:302e7c1ea0b3 | 27 | #define CMD_RESPONSE_SET_CE '5' |
johnb | 13:302e7c1ea0b3 | 28 | #define CMD_RESPONSE_GET_CE '6' |
johnb | 13:302e7c1ea0b3 | 29 | #define CMD_RESPONSE_SET_EDA '7' |
johnb | 13:302e7c1ea0b3 | 30 | #define CMD_RESPONSE_GET_EDA '8' |
johnb | 13:302e7c1ea0b3 | 31 | #define CMD_RESPONSE_SET_PID '9' |
johnb | 13:302e7c1ea0b3 | 32 | #define CMD_RESPONSE_GET_PID '0' |
johnb | 31:c144106e55b5 | 33 | #define CMD_RESPONSE_SET_MY 'a' |
johnb | 31:c144106e55b5 | 34 | #define CMD_RESPONSE_GET_MY 'b' |
johnb | 32:af4e495afd62 | 35 | #define CMD_RESPONSE_GET_SH 'c' |
johnb | 32:af4e495afd62 | 36 | #define CMD_RESPONSE_GET_SL 'd' |
johnb | 32:af4e495afd62 | 37 | #define CMD_RESPONSE_SET_RR 'e' |
johnb | 32:af4e495afd62 | 38 | #define CMD_RESPONSE_GET_RR 'f' |
johnb | 32:af4e495afd62 | 39 | #define CMD_RESPONSE_SET_RN 'g' |
johnb | 32:af4e495afd62 | 40 | #define CMD_RESPONSE_GET_RN 'h' |
johnb | 32:af4e495afd62 | 41 | #define CMD_RESPONSE_SET_MM 'i' |
johnb | 32:af4e495afd62 | 42 | #define CMD_RESPONSE_GET_MM 'j' |
johnb | 50:f76b7e7959a2 | 43 | #define CMD_RESPONSE_GET_D0 'k' |
johnb | 50:f76b7e7959a2 | 44 | #define CMD_RESPONSE_GET_D1 'l' |
johnb | 50:f76b7e7959a2 | 45 | #define CMD_RESPONSE_GET_D2 'm' |
johnb | 50:f76b7e7959a2 | 46 | #define CMD_RESPONSE_GET_D3 'n' |
johnb | 50:f76b7e7959a2 | 47 | #define CMD_RESPONSE_GET_D4 'o' |
johnb | 50:f76b7e7959a2 | 48 | #define CMD_RESPONSE_GET_D5 'p' |
johnb | 50:f76b7e7959a2 | 49 | #define CMD_RESPONSE_GET_D6 'q' |
johnb | 50:f76b7e7959a2 | 50 | #define CMD_RESPONSE_GET_D7 'r' |
johnb | 51:a7d0d2ef9261 | 51 | #define CMD_RESPONSE_SET_D0 's' |
johnb | 51:a7d0d2ef9261 | 52 | #define CMD_RESPONSE_SET_D1 't' |
johnb | 51:a7d0d2ef9261 | 53 | #define CMD_RESPONSE_SET_D2 'u' |
johnb | 51:a7d0d2ef9261 | 54 | #define CMD_RESPONSE_SET_D3 'v' |
johnb | 51:a7d0d2ef9261 | 55 | #define CMD_RESPONSE_SET_D4 'w' |
johnb | 51:a7d0d2ef9261 | 56 | #define CMD_RESPONSE_SET_D5 'x' |
johnb | 51:a7d0d2ef9261 | 57 | #define CMD_RESPONSE_SET_D6 'y' |
johnb | 51:a7d0d2ef9261 | 58 | #define CMD_RESPONSE_SET_D7 'z' |
johnb | 51:a7d0d2ef9261 | 59 | #define CMD_RESPONSE_SET_IC 'A' |
johnb | 51:a7d0d2ef9261 | 60 | #define CMD_RESPONSE_GET_IC 'B' |
johnb | 51:a7d0d2ef9261 | 61 | #define CMD_RESPONSE_SET_IO 'C' |
johnb | 51:a7d0d2ef9261 | 62 | #define CMD_RESPONSE_SET_IR 'D' |
johnb | 51:a7d0d2ef9261 | 63 | #define CMD_RESPONSE_GET_IR 'E' |
johnb | 51:a7d0d2ef9261 | 64 | #define CMD_RESPONSE_SET_DH 'F' |
johnb | 51:a7d0d2ef9261 | 65 | #define CMD_RESPONSE_GET_DH 'G' |
johnb | 51:a7d0d2ef9261 | 66 | #define CMD_RESPONSE_SET_DL 'H' |
johnb | 51:a7d0d2ef9261 | 67 | #define CMD_RESPONSE_GET_DL 'I' |
johnb | 51:a7d0d2ef9261 | 68 | #define CMD_RESPONSE_SET_WR 'J' |
johnb | 51:a7d0d2ef9261 | 69 | #define CMD_RESPONSE_SET_AC 'K' |
johnb | 51:a7d0d2ef9261 | 70 | #define CMD_RESPONSE_SET_FR 'L' |
johnb | 51:a7d0d2ef9261 | 71 | #define CMD_RESPONSE_SET_IS 'M' |
johnb | 13:302e7c1ea0b3 | 72 | |
johnb | 30:9532b01a1ae1 | 73 | /** Lowest channel supported by the XBee S1 */ |
johnb | 30:9532b01a1ae1 | 74 | #define XBEE_CHAN_MIN 0x0b |
johnb | 30:9532b01a1ae1 | 75 | /** Highest channel supported by the XBee S1 */ |
johnb | 30:9532b01a1ae1 | 76 | #define XBEE_CHAN_MAX 0x1a |
johnb | 13:302e7c1ea0b3 | 77 | |
johnb | 30:9532b01a1ae1 | 78 | /** Lowest channel supported by the XBee S1 Pro */ |
johnb | 30:9532b01a1ae1 | 79 | #define XBEE_PRO_CHAN_MIN 0x0c |
johnb | 30:9532b01a1ae1 | 80 | /** Highest channel supported by the XBee S1 Pro */ |
johnb | 30:9532b01a1ae1 | 81 | #define XBEE_PRO_CHAN_MAX 0x17 |
johnb | 8:1b48b619d7f6 | 82 | |
johnb | 8:1b48b619d7f6 | 83 | /* Content for the various commands - value of 0 indicates a value to be populated (i.e. variable) */ |
johnb | 8:1b48b619d7f6 | 84 | |
johnb | 50:f76b7e7959a2 | 85 | static const uint8_t cmd_vr[] = { 'V', 'R' }; |
johnb | 50:f76b7e7959a2 | 86 | static const uint8_t cmd_vr_get_fid = CMD_RESPONSE_GET_VR; |
johnb | 50:f76b7e7959a2 | 87 | |
johnb | 50:f76b7e7959a2 | 88 | static const uint8_t cmd_hv[] = { 'H', 'V' }; |
johnb | 50:f76b7e7959a2 | 89 | static const uint8_t cmd_hv_get_fid = CMD_RESPONSE_GET_HV; |
johnb | 50:f76b7e7959a2 | 90 | |
johnb | 50:f76b7e7959a2 | 91 | static const uint8_t cmd_sh[] = { 'S', 'H' }; |
johnb | 50:f76b7e7959a2 | 92 | static const uint8_t cmd_sh_get_fid = CMD_RESPONSE_GET_SH; |
johnb | 50:f76b7e7959a2 | 93 | |
johnb | 50:f76b7e7959a2 | 94 | static const uint8_t cmd_sl[] = { 'S', 'L' }; |
johnb | 50:f76b7e7959a2 | 95 | static const uint8_t cmd_sl_get_fid = CMD_RESPONSE_GET_SL; |
johnb | 13:302e7c1ea0b3 | 96 | |
johnb | 50:f76b7e7959a2 | 97 | static const uint8_t cmd_ch[] = { 'C', 'H' }; |
johnb | 50:f76b7e7959a2 | 98 | static const uint8_t cmd_ch_get_fid = CMD_RESPONSE_GET_CH; |
johnb | 50:f76b7e7959a2 | 99 | static const uint8_t cmd_ch_set[] = { 'C', 'H', 0 }; |
johnb | 50:f76b7e7959a2 | 100 | static const uint8_t cmd_ch_set_fid = CMD_RESPONSE_SET_CH; |
johnb | 50:f76b7e7959a2 | 101 | |
johnb | 50:f76b7e7959a2 | 102 | static const uint8_t cmd_ce[] = { 'C', 'E' }; |
johnb | 50:f76b7e7959a2 | 103 | static const uint8_t cmd_ce_get_fid = CMD_RESPONSE_GET_CE; |
johnb | 50:f76b7e7959a2 | 104 | static const uint8_t cmd_ce_set[] = { 'C', 'E', 0 }; |
johnb | 50:f76b7e7959a2 | 105 | static const uint8_t cmd_ce_set_fid = CMD_RESPONSE_SET_CE; |
johnb | 13:302e7c1ea0b3 | 106 | |
johnb | 50:f76b7e7959a2 | 107 | static const uint8_t cmd_eda[] = { 'A', '1' }; |
johnb | 50:f76b7e7959a2 | 108 | static const uint8_t cmd_eda_get_fid = CMD_RESPONSE_GET_EDA; |
johnb | 50:f76b7e7959a2 | 109 | static const uint8_t cmd_eda_set[] = { 'A', '1', 0 }; |
johnb | 50:f76b7e7959a2 | 110 | static const uint8_t cmd_eda_set_fid = CMD_RESPONSE_SET_EDA; |
johnb | 32:af4e495afd62 | 111 | |
johnb | 50:f76b7e7959a2 | 112 | static const uint8_t cmd_pid[] = { 'I', 'D' }; |
johnb | 50:f76b7e7959a2 | 113 | static const uint8_t cmd_pid_get_fid = CMD_RESPONSE_GET_PID; |
johnb | 50:f76b7e7959a2 | 114 | static const uint8_t cmd_pid_set[] = { 'I', 'D', 0, 0 }; |
johnb | 50:f76b7e7959a2 | 115 | static const uint8_t cmd_pid_set_fid = CMD_RESPONSE_SET_PID; |
johnb | 13:302e7c1ea0b3 | 116 | |
johnb | 50:f76b7e7959a2 | 117 | static const uint8_t cmd_my[] = { 'M', 'Y' }; |
johnb | 50:f76b7e7959a2 | 118 | static const uint8_t cmd_my_get_fid = CMD_RESPONSE_GET_MY; |
johnb | 50:f76b7e7959a2 | 119 | static const uint8_t cmd_my_set[] = { 'M', 'Y', 0, 0 }; |
johnb | 50:f76b7e7959a2 | 120 | static const uint8_t cmd_my_set_fid = CMD_RESPONSE_SET_MY; |
johnb | 32:af4e495afd62 | 121 | |
johnb | 50:f76b7e7959a2 | 122 | static const uint8_t cmd_rr[] = { 'R', 'R' }; |
johnb | 50:f76b7e7959a2 | 123 | static const uint8_t cmd_rr_get_fid = CMD_RESPONSE_GET_RR; |
johnb | 50:f76b7e7959a2 | 124 | static const uint8_t cmd_rr_set[] = { 'R', 'R', 0 }; |
johnb | 50:f76b7e7959a2 | 125 | static const uint8_t cmd_rr_set_fid = CMD_RESPONSE_SET_RR; |
johnb | 50:f76b7e7959a2 | 126 | |
johnb | 50:f76b7e7959a2 | 127 | static const uint8_t cmd_rn[] = { 'R', 'N' }; |
johnb | 50:f76b7e7959a2 | 128 | static const uint8_t cmd_rn_get_fid = CMD_RESPONSE_GET_RN; |
johnb | 50:f76b7e7959a2 | 129 | static const uint8_t cmd_rn_set[] = { 'R', 'N', 0 }; |
johnb | 50:f76b7e7959a2 | 130 | static const uint8_t cmd_rn_set_fid = CMD_RESPONSE_SET_RN; |
johnb | 13:302e7c1ea0b3 | 131 | |
johnb | 50:f76b7e7959a2 | 132 | static const uint8_t cmd_mm[] = { 'M', 'M' }; |
johnb | 50:f76b7e7959a2 | 133 | static const uint8_t cmd_mm_get_fid = CMD_RESPONSE_GET_MM; |
johnb | 50:f76b7e7959a2 | 134 | static const uint8_t cmd_mm_set[] = { 'M', 'M', 0 }; |
johnb | 50:f76b7e7959a2 | 135 | static const uint8_t cmd_mm_set_fid = CMD_RESPONSE_SET_MM; |
johnb | 8:1b48b619d7f6 | 136 | |
johnb | 51:a7d0d2ef9261 | 137 | static const uint8_t cmd_ic[] = { 'I', 'C' }; |
johnb | 51:a7d0d2ef9261 | 138 | static const uint8_t cmd_ic_get_fid = CMD_RESPONSE_GET_IC; |
johnb | 51:a7d0d2ef9261 | 139 | static const uint8_t cmd_ic_set[] = { 'I', 'C', 0 }; |
johnb | 51:a7d0d2ef9261 | 140 | static const uint8_t cmd_ic_set_fid = CMD_RESPONSE_SET_IC; |
johnb | 51:a7d0d2ef9261 | 141 | |
johnb | 51:a7d0d2ef9261 | 142 | static const uint8_t cmd_io_set[] = { 'I', 'O', 0 }; |
johnb | 51:a7d0d2ef9261 | 143 | static const uint8_t cmd_io_set_fid = CMD_RESPONSE_SET_IO; |
johnb | 51:a7d0d2ef9261 | 144 | |
johnb | 51:a7d0d2ef9261 | 145 | static const uint8_t cmd_ir[] = { 'I', 'R' }; |
johnb | 51:a7d0d2ef9261 | 146 | static const uint8_t cmd_ir_get_fid = CMD_RESPONSE_GET_IR; |
johnb | 51:a7d0d2ef9261 | 147 | static const uint8_t cmd_ir_set[] = { 'I', 'R', 0, 0 }; |
johnb | 51:a7d0d2ef9261 | 148 | static const uint8_t cmd_ir_set_fid = CMD_RESPONSE_SET_IR; |
johnb | 51:a7d0d2ef9261 | 149 | |
johnb | 51:a7d0d2ef9261 | 150 | static const uint8_t cmd_dh[] = { 'D', 'H' }; |
johnb | 51:a7d0d2ef9261 | 151 | static const uint8_t cmd_dh_get_fid = CMD_RESPONSE_GET_DH; |
johnb | 51:a7d0d2ef9261 | 152 | static const uint8_t cmd_dh_set[] = { 'D', 'H', 0, 0, 0, 0 }; |
johnb | 51:a7d0d2ef9261 | 153 | static const uint8_t cmd_dh_set_fid = CMD_RESPONSE_SET_DH; |
johnb | 51:a7d0d2ef9261 | 154 | |
johnb | 51:a7d0d2ef9261 | 155 | static const uint8_t cmd_dl[] = { 'D', 'L' }; |
johnb | 51:a7d0d2ef9261 | 156 | static const uint8_t cmd_dl_get_fid = CMD_RESPONSE_GET_DL; |
johnb | 51:a7d0d2ef9261 | 157 | static const uint8_t cmd_dl_set[] = { 'D', 'L', 0, 0, 0, 0 }; |
johnb | 51:a7d0d2ef9261 | 158 | static const uint8_t cmd_dl_set_fid = CMD_RESPONSE_SET_DL; |
johnb | 51:a7d0d2ef9261 | 159 | |
johnb | 51:a7d0d2ef9261 | 160 | static const uint8_t cmd_wr[] = { 'W', 'R' }; |
johnb | 51:a7d0d2ef9261 | 161 | static const uint8_t cmd_wr_set_fid = CMD_RESPONSE_SET_WR; |
johnb | 51:a7d0d2ef9261 | 162 | |
johnb | 51:a7d0d2ef9261 | 163 | static const uint8_t cmd_ac[] = { 'A', 'C' }; |
johnb | 51:a7d0d2ef9261 | 164 | static const uint8_t cmd_ac_set_fid = CMD_RESPONSE_SET_AC; |
johnb | 51:a7d0d2ef9261 | 165 | |
johnb | 51:a7d0d2ef9261 | 166 | static const uint8_t cmd_fr[] = { 'F', 'R' }; |
johnb | 51:a7d0d2ef9261 | 167 | static const uint8_t cmd_fr_set_fid = CMD_RESPONSE_SET_FR; |
johnb | 51:a7d0d2ef9261 | 168 | |
johnb | 51:a7d0d2ef9261 | 169 | static const uint8_t cmd_is[] = { 'I', 'S' }; |
johnb | 51:a7d0d2ef9261 | 170 | static const uint8_t cmd_is_set_fid = CMD_RESPONSE_SET_IS; |
johnb | 51:a7d0d2ef9261 | 171 | |
johnb | 50:f76b7e7959a2 | 172 | static const uint8_t cmd_d[ XBEE_API_DIO_CHANNEL_COUNT ][2] = {{ 'D', '0' }, |
johnb | 50:f76b7e7959a2 | 173 | { 'D', '1' }, |
johnb | 50:f76b7e7959a2 | 174 | { 'D', '2' }, |
johnb | 50:f76b7e7959a2 | 175 | { 'D', '3' }, |
johnb | 50:f76b7e7959a2 | 176 | { 'D', '4' }, |
johnb | 50:f76b7e7959a2 | 177 | { 'D', '5' }, |
johnb | 50:f76b7e7959a2 | 178 | { 'D', '6' }, |
johnb | 50:f76b7e7959a2 | 179 | { 'D', '7' }}; |
johnb | 50:f76b7e7959a2 | 180 | static const uint8_t cmd_d_get_fid[ XBEE_API_DIO_CHANNEL_COUNT ] = { CMD_RESPONSE_GET_D0, |
johnb | 50:f76b7e7959a2 | 181 | CMD_RESPONSE_GET_D1, |
johnb | 50:f76b7e7959a2 | 182 | CMD_RESPONSE_GET_D2, |
johnb | 50:f76b7e7959a2 | 183 | CMD_RESPONSE_GET_D3, |
johnb | 50:f76b7e7959a2 | 184 | CMD_RESPONSE_GET_D4, |
johnb | 50:f76b7e7959a2 | 185 | CMD_RESPONSE_GET_D5, |
johnb | 50:f76b7e7959a2 | 186 | CMD_RESPONSE_GET_D6, |
johnb | 50:f76b7e7959a2 | 187 | CMD_RESPONSE_GET_D7 }; |
johnb | 31:c144106e55b5 | 188 | |
johnb | 53:7b65422d7a32 | 189 | #define XBEE_CMD_POSN_FRAME_ID (XBEE_CMD_POSN_ID_SPECIFIC_DATA) |
johnb | 53:7b65422d7a32 | 190 | #define XBEE_CMD_POSN_STATUS (7U) |
johnb | 8:1b48b619d7f6 | 191 | #define XBEE_CMD_POSN_PARAM_START (8U) |
johnb | 8:1b48b619d7f6 | 192 | |
johnb | 13:302e7c1ea0b3 | 193 | #define XBEE_CMD_RESPONS_HAS_DATA( _p_len ) ((_p_len > ( XBEE_CMD_POSN_PARAM_START + 1 )) |
johnb | 13:302e7c1ea0b3 | 194 | |
johnb | 50:f76b7e7959a2 | 195 | /** Template class to create an XBeeApiFrame which can be used to change |
johnb | 50:f76b7e7959a2 | 196 | the value of one of the XBee parameters. This class is used by the |
johnb | 50:f76b7e7959a2 | 197 | setXXX methods in XBeeApiCmdAt */ |
johnb | 50:f76b7e7959a2 | 198 | template< typename T > |
johnb | 50:f76b7e7959a2 | 199 | class XBeeApiCmdAtSet : public XBeeApiFrame { |
johnb | 50:f76b7e7959a2 | 200 | uint8_t m_buffer[ XBEE_API_CMD_SET_HEADER_LEN + sizeof( T ) ]; |
johnb | 50:f76b7e7959a2 | 201 | public: |
johnb | 50:f76b7e7959a2 | 202 | /** Constructor |
johnb | 50:f76b7e7959a2 | 203 | |
johnb | 50:f76b7e7959a2 | 204 | \param p_data Pointer to a buffer of length 2 bytes identifying |
johnb | 50:f76b7e7959a2 | 205 | the command, e.g. 'V', 'R' would set up a version |
johnb | 50:f76b7e7959a2 | 206 | request |
johnb | 50:f76b7e7959a2 | 207 | \param p_val New value for the parameter |
johnb | 50:f76b7e7959a2 | 208 | */ |
johnb | 50:f76b7e7959a2 | 209 | XBeeApiCmdAtSet( const uint8_t p_frameId, |
johnb | 50:f76b7e7959a2 | 210 | const uint8_t* const p_data, |
johnb | 50:f76b7e7959a2 | 211 | const T p_val ); |
johnb | 50:f76b7e7959a2 | 212 | /** Destructor */ |
johnb | 50:f76b7e7959a2 | 213 | virtual ~XBeeApiCmdAtSet(); |
johnb | 50:f76b7e7959a2 | 214 | }; |
johnb | 50:f76b7e7959a2 | 215 | |
johnb | 50:f76b7e7959a2 | 216 | class XBeeApiCmdAtReq : public XBeeApiFrame { |
johnb | 50:f76b7e7959a2 | 217 | uint8_t m_buffer[ XBEE_API_CMD_REQ_HEADER_LEN ]; |
johnb | 50:f76b7e7959a2 | 218 | public: |
johnb | 50:f76b7e7959a2 | 219 | /** Constructor |
johnb | 50:f76b7e7959a2 | 220 | |
johnb | 50:f76b7e7959a2 | 221 | \param p_data Pointer to a buffer of length 2 bytes identifying |
johnb | 50:f76b7e7959a2 | 222 | the command, e.g. 'V', 'R' would set up a version |
johnb | 50:f76b7e7959a2 | 223 | request |
johnb | 50:f76b7e7959a2 | 224 | \param p_val New value for the parameter |
johnb | 50:f76b7e7959a2 | 225 | */ |
johnb | 50:f76b7e7959a2 | 226 | XBeeApiCmdAtReq( const uint8_t p_frameId, |
johnb | 50:f76b7e7959a2 | 227 | const uint8_t* const p_data ); |
johnb | 50:f76b7e7959a2 | 228 | /** Destructor */ |
johnb | 50:f76b7e7959a2 | 229 | virtual ~XBeeApiCmdAtReq(); |
johnb | 50:f76b7e7959a2 | 230 | }; |
johnb | 50:f76b7e7959a2 | 231 | |
johnb | 29:c6d037cceb02 | 232 | XBeeApiCmdAt::XBeeApiCmdAt( XBeeDevice* const p_device ) : XBeeApiFrameDecoder( p_device ) , |
johnb | 31:c144106e55b5 | 233 | m_have_hwVer( false ), |
johnb | 31:c144106e55b5 | 234 | m_have_fwVer( false ), |
johnb | 31:c144106e55b5 | 235 | m_have_chan( false ), |
johnb | 31:c144106e55b5 | 236 | m_have_PANId( false ), |
johnb | 31:c144106e55b5 | 237 | m_have_EDA( false ), |
johnb | 31:c144106e55b5 | 238 | m_have_CE( false ), |
johnb | 32:af4e495afd62 | 239 | m_have_sourceAddress( false ), |
johnb | 32:af4e495afd62 | 240 | m_have_snLow( false ), |
johnb | 32:af4e495afd62 | 241 | m_have_snHigh( false ), |
johnb | 32:af4e495afd62 | 242 | m_have_retries( false ), |
johnb | 32:af4e495afd62 | 243 | m_have_randomDelaySlots( false ), |
johnb | 51:a7d0d2ef9261 | 244 | m_have_macMode( false ), |
johnb | 51:a7d0d2ef9261 | 245 | m_have_dioChangeDetectMask( false ), |
johnb | 51:a7d0d2ef9261 | 246 | m_have_dioLevels( false ), |
johnb | 51:a7d0d2ef9261 | 247 | m_have_sampleRate( false ), |
johnb | 51:a7d0d2ef9261 | 248 | m_have_destHigh( false ), |
johnb | 51:a7d0d2ef9261 | 249 | m_have_destLow ( false ), |
johnb | 51:a7d0d2ef9261 | 250 | m_writeCount( 0 ), |
johnb | 51:a7d0d2ef9261 | 251 | m_applyCount( 0 ), |
johnb | 51:a7d0d2ef9261 | 252 | m_resetCount( 0 ), |
johnb | 51:a7d0d2ef9261 | 253 | m_sampleCount( 0 ) |
johnb | 8:1b48b619d7f6 | 254 | { |
johnb | 52:0950b05d5270 | 255 | uint8_t i; |
johnb | 52:0950b05d5270 | 256 | for( i = 0; |
johnb | 51:a7d0d2ef9261 | 257 | i < XBEE_API_DIO_CHANNEL_COUNT; |
johnb | 51:a7d0d2ef9261 | 258 | i++ ) |
johnb | 51:a7d0d2ef9261 | 259 | { |
johnb | 51:a7d0d2ef9261 | 260 | m_have_d[ i ] = false; |
johnb | 52:0950b05d5270 | 261 | m_ioDigitalUpdatedTime[ i ] = 0; |
johnb | 52:0950b05d5270 | 262 | } |
johnb | 52:0950b05d5270 | 263 | for( i = 0; |
johnb | 52:0950b05d5270 | 264 | i < XBEE_API_ADC_CHANNEL_COUNT; |
johnb | 52:0950b05d5270 | 265 | i++ ) |
johnb | 52:0950b05d5270 | 266 | { |
johnb | 52:0950b05d5270 | 267 | m_ioAnalogueUpdatedTime[ i ] = 0; |
johnb | 51:a7d0d2ef9261 | 268 | } |
johnb | 8:1b48b619d7f6 | 269 | } |
johnb | 8:1b48b619d7f6 | 270 | |
johnb | 51:a7d0d2ef9261 | 271 | #define RESPONSE_OK( _data ) (_data[ statusPosn ] == 0) |
johnb | 51:a7d0d2ef9261 | 272 | |
johnb | 51:a7d0d2ef9261 | 273 | #define PROCESS_SET_RESPONSE( _type, _var ) \ |
johnb | 51:a7d0d2ef9261 | 274 | case CMD_RESPONSE_SET_ ## _type: \ |
johnb | 51:a7d0d2ef9261 | 275 | if( RESPONSE_OK( p_data )) \ |
johnb | 51:a7d0d2ef9261 | 276 | { \ |
johnb | 51:a7d0d2ef9261 | 277 | m_ ## _var = m_ ## _var ## Pend; \ |
johnb | 51:a7d0d2ef9261 | 278 | m_have_ ## _var = true; \ |
johnb | 51:a7d0d2ef9261 | 279 | } \ |
johnb | 51:a7d0d2ef9261 | 280 | else \ |
johnb | 51:a7d0d2ef9261 | 281 | { \ |
johnb | 51:a7d0d2ef9261 | 282 | /* TODO */ \ |
johnb | 51:a7d0d2ef9261 | 283 | } \ |
johnb | 51:a7d0d2ef9261 | 284 | ret_val = true; \ |
johnb | 51:a7d0d2ef9261 | 285 | break; |
johnb | 51:a7d0d2ef9261 | 286 | |
johnb | 51:a7d0d2ef9261 | 287 | #define PROCESS_SET_GET_RESPONSE_GENERIC( _type, _var, _src, _t, _sfx ) \ |
johnb | 32:af4e495afd62 | 288 | case CMD_RESPONSE_SET_ ## _type: \ |
johnb | 32:af4e495afd62 | 289 | case CMD_RESPONSE_GET_ ## _type: \ |
johnb | 51:a7d0d2ef9261 | 290 | if( RESPONSE_OK( p_data )) \ |
johnb | 32:af4e495afd62 | 291 | { \ |
johnb | 50:f76b7e7959a2 | 292 | if( CMD_RESPONSE_GET_ ## _type == p_data[ XBEE_CMD_POSN_FRAME_ID ] ) \ |
johnb | 32:af4e495afd62 | 293 | { \ |
johnb | 51:a7d0d2ef9261 | 294 | m_ ##_var ##_sfx = (_t) (_src); \ |
johnb | 32:af4e495afd62 | 295 | } \ |
johnb | 32:af4e495afd62 | 296 | else \ |
johnb | 32:af4e495afd62 | 297 | { \ |
johnb | 51:a7d0d2ef9261 | 298 | m_ ##_var ##_sfx = m_ ## _var ## Pend ## _sfx; \ |
johnb | 32:af4e495afd62 | 299 | } \ |
johnb | 51:a7d0d2ef9261 | 300 | m_have_ ##_var ##_sfx = true; \ |
johnb | 32:af4e495afd62 | 301 | } \ |
johnb | 32:af4e495afd62 | 302 | else \ |
johnb | 32:af4e495afd62 | 303 | { \ |
johnb | 32:af4e495afd62 | 304 | /* TODO */ \ |
johnb | 32:af4e495afd62 | 305 | } \ |
johnb | 32:af4e495afd62 | 306 | ret_val = true; \ |
johnb | 32:af4e495afd62 | 307 | break; |
johnb | 32:af4e495afd62 | 308 | |
johnb | 32:af4e495afd62 | 309 | #define PROCESS_GET_RESPONSE_GENERIC( _type, _var, _src ) \ |
johnb | 32:af4e495afd62 | 310 | case CMD_RESPONSE_GET_ ## _type: \ |
johnb | 51:a7d0d2ef9261 | 311 | if( RESPONSE_OK( p_data )) \ |
johnb | 32:af4e495afd62 | 312 | { \ |
johnb | 32:af4e495afd62 | 313 | m_ ##_var = _src; \ |
johnb | 32:af4e495afd62 | 314 | m_have_ ## _var = true; \ |
johnb | 32:af4e495afd62 | 315 | } \ |
johnb | 32:af4e495afd62 | 316 | else \ |
johnb | 32:af4e495afd62 | 317 | { \ |
johnb | 32:af4e495afd62 | 318 | /* TODO */ \ |
johnb | 32:af4e495afd62 | 319 | } \ |
johnb | 32:af4e495afd62 | 320 | ret_val = true; \ |
johnb | 32:af4e495afd62 | 321 | break; |
johnb | 32:af4e495afd62 | 322 | |
johnb | 51:a7d0d2ef9261 | 323 | #define PROCESS_SET_GET_RESPONSE_8BIT_WITHCAST( _type, _var, _t, _sfx ) PROCESS_SET_GET_RESPONSE_GENERIC( _type, _var, p_data[ dataPosn ], _t, _sfx ) |
johnb | 51:a7d0d2ef9261 | 324 | #define PROCESS_SET_GET_RESPONSE_8BIT( _type, _var ) PROCESS_SET_GET_RESPONSE_GENERIC( _type, _var, p_data[ dataPosn ], uint8_t, ) |
johnb | 51:a7d0d2ef9261 | 325 | #define PROCESS_SET_GET_RESPONSE_16BIT( _type, _var ) PROCESS_SET_GET_RESPONSE_GENERIC( _type, _var, ((uint16_t)p_data[ dataPosn ] << 8) | p_data[ dataPosn + 1 ], uint16_t, ) |
johnb | 51:a7d0d2ef9261 | 326 | #define PROCESS_SET_GET_RESPONSE_32BIT( _type, _var ) PROCESS_SET_GET_RESPONSE_GENERIC( _type, _var, ((uint32_t)p_data[ dataPosn ] << 24) |\ |
johnb | 51:a7d0d2ef9261 | 327 | ((uint32_t)p_data[ dataPosn + 1 ] << 16) |\ |
johnb | 51:a7d0d2ef9261 | 328 | ((uint32_t)p_data[ dataPosn + 2 ] << 8) |\ |
johnb | 51:a7d0d2ef9261 | 329 | ((uint32_t)p_data[ dataPosn + 3 ]), uint32_t, ) |
johnb | 50:f76b7e7959a2 | 330 | |
johnb | 50:f76b7e7959a2 | 331 | #define PROCESS_GET_RESPONSE_16BIT( _type, _var ) PROCESS_GET_RESPONSE_GENERIC( _type, _var, ((uint16_t)p_data[ dataPosn ] << 8) | p_data[ dataPosn + 1 ] ) |
johnb | 50:f76b7e7959a2 | 332 | #define PROCESS_GET_RESPONSE_32BIT( _type, _var ) PROCESS_GET_RESPONSE_GENERIC( _type, _var, ((uint32_t)p_data[ dataPosn ] << 24) |\ |
johnb | 50:f76b7e7959a2 | 333 | ((uint32_t)p_data[ dataPosn + 1 ] << 16) |\ |
johnb | 50:f76b7e7959a2 | 334 | ((uint32_t)p_data[ dataPosn + 2 ] << 8) |\ |
johnb | 50:f76b7e7959a2 | 335 | ((uint32_t)p_data[ dataPosn + 3 ])) |
johnb | 50:f76b7e7959a2 | 336 | |
johnb | 50:f76b7e7959a2 | 337 | size_t XBeeApiCmdAt::getResponseStatusPos( void ) const |
johnb | 50:f76b7e7959a2 | 338 | { |
johnb | 50:f76b7e7959a2 | 339 | return XBEE_CMD_POSN_STATUS; |
johnb | 50:f76b7e7959a2 | 340 | } |
johnb | 32:af4e495afd62 | 341 | |
johnb | 50:f76b7e7959a2 | 342 | bool XBeeApiCmdAt::processResponseFrame( const uint8_t* const p_data, size_t p_len ) |
johnb | 50:f76b7e7959a2 | 343 | { |
johnb | 50:f76b7e7959a2 | 344 | bool ret_val = false; |
johnb | 50:f76b7e7959a2 | 345 | size_t statusPosn = getResponseStatusPos(); |
johnb | 50:f76b7e7959a2 | 346 | size_t dataPosn = statusPosn + 1; |
johnb | 50:f76b7e7959a2 | 347 | |
johnb | 50:f76b7e7959a2 | 348 | switch( p_data[ XBEE_CMD_POSN_FRAME_ID ] ) |
johnb | 50:f76b7e7959a2 | 349 | { |
johnb | 51:a7d0d2ef9261 | 350 | case CMD_RESPONSE_SET_WR: |
johnb | 51:a7d0d2ef9261 | 351 | if( RESPONSE_OK( p_data )) |
johnb | 51:a7d0d2ef9261 | 352 | { |
johnb | 51:a7d0d2ef9261 | 353 | m_writeCount++; |
johnb | 51:a7d0d2ef9261 | 354 | } |
johnb | 51:a7d0d2ef9261 | 355 | ret_val = true; |
johnb | 51:a7d0d2ef9261 | 356 | break; |
johnb | 51:a7d0d2ef9261 | 357 | case CMD_RESPONSE_SET_AC: |
johnb | 51:a7d0d2ef9261 | 358 | if( RESPONSE_OK( p_data )) |
johnb | 51:a7d0d2ef9261 | 359 | { |
johnb | 51:a7d0d2ef9261 | 360 | m_applyCount++; |
johnb | 51:a7d0d2ef9261 | 361 | } |
johnb | 51:a7d0d2ef9261 | 362 | ret_val = true; |
johnb | 51:a7d0d2ef9261 | 363 | break; |
johnb | 51:a7d0d2ef9261 | 364 | case CMD_RESPONSE_SET_FR: |
johnb | 51:a7d0d2ef9261 | 365 | if( RESPONSE_OK( p_data )) |
johnb | 51:a7d0d2ef9261 | 366 | { |
johnb | 51:a7d0d2ef9261 | 367 | m_resetCount++; |
johnb | 51:a7d0d2ef9261 | 368 | } |
johnb | 51:a7d0d2ef9261 | 369 | ret_val = true; |
johnb | 51:a7d0d2ef9261 | 370 | break; |
johnb | 51:a7d0d2ef9261 | 371 | case CMD_RESPONSE_SET_IS: |
johnb | 51:a7d0d2ef9261 | 372 | if( RESPONSE_OK( p_data )) |
johnb | 51:a7d0d2ef9261 | 373 | { |
johnb | 51:a7d0d2ef9261 | 374 | m_sampleCount++; |
johnb | 51:a7d0d2ef9261 | 375 | } |
johnb | 51:a7d0d2ef9261 | 376 | ret_val = true; |
johnb | 51:a7d0d2ef9261 | 377 | break; |
johnb | 50:f76b7e7959a2 | 378 | PROCESS_GET_RESPONSE_16BIT( HV, hwVer ) |
johnb | 50:f76b7e7959a2 | 379 | PROCESS_GET_RESPONSE_16BIT( VR, fwVer ) |
johnb | 50:f76b7e7959a2 | 380 | |
johnb | 50:f76b7e7959a2 | 381 | PROCESS_SET_GET_RESPONSE_8BIT( CH, chan ) |
johnb | 50:f76b7e7959a2 | 382 | PROCESS_SET_GET_RESPONSE_8BIT( CE, CE ) |
johnb | 50:f76b7e7959a2 | 383 | PROCESS_SET_GET_RESPONSE_16BIT( PID, PANId ) |
johnb | 50:f76b7e7959a2 | 384 | PROCESS_SET_GET_RESPONSE_8BIT( EDA, EDA ) |
johnb | 50:f76b7e7959a2 | 385 | PROCESS_SET_GET_RESPONSE_8BIT( RR, retries ) |
johnb | 50:f76b7e7959a2 | 386 | PROCESS_SET_GET_RESPONSE_16BIT( MY, sourceAddress ) |
johnb | 50:f76b7e7959a2 | 387 | PROCESS_GET_RESPONSE_32BIT( SH, snHigh ) |
johnb | 50:f76b7e7959a2 | 388 | PROCESS_GET_RESPONSE_32BIT( SL, snLow ) |
johnb | 51:a7d0d2ef9261 | 389 | PROCESS_SET_GET_RESPONSE_32BIT( DH, destHigh ) |
johnb | 51:a7d0d2ef9261 | 390 | PROCESS_SET_GET_RESPONSE_32BIT( DL, destLow ) |
johnb | 50:f76b7e7959a2 | 391 | PROCESS_SET_GET_RESPONSE_8BIT( RN, randomDelaySlots ) |
johnb | 51:a7d0d2ef9261 | 392 | PROCESS_SET_GET_RESPONSE_8BIT_WITHCAST( MM, macMode, XBeeApiMACMode_e, ) |
johnb | 50:f76b7e7959a2 | 393 | /* TODO: Add D0, D1, D2 response handling */ |
johnb | 51:a7d0d2ef9261 | 394 | PROCESS_SET_GET_RESPONSE_8BIT_WITHCAST( D0, d, XBeeApiDioConfig_e, [0] ) |
johnb | 51:a7d0d2ef9261 | 395 | PROCESS_SET_GET_RESPONSE_8BIT( IC, dioChangeDetectMask ) |
johnb | 51:a7d0d2ef9261 | 396 | PROCESS_SET_RESPONSE( IO, dioLevels ) |
johnb | 51:a7d0d2ef9261 | 397 | PROCESS_SET_GET_RESPONSE_16BIT( IR, sampleRate ) |
johnb | 50:f76b7e7959a2 | 398 | } |
johnb | 32:af4e495afd62 | 399 | |
johnb | 50:f76b7e7959a2 | 400 | return ret_val; |
johnb | 50:f76b7e7959a2 | 401 | } |
johnb | 32:af4e495afd62 | 402 | |
johnb | 52:0950b05d5270 | 403 | #define DIO_CHANNEL_MASK (0x01FFU) |
johnb | 52:0950b05d5270 | 404 | #define ADC_CHANNEL_MASK (0x7E00U) |
johnb | 52:0950b05d5270 | 405 | |
johnb | 52:0950b05d5270 | 406 | bool XBeeApiCmdAt::processIOFrame( const uint8_t* const p_data, size_t p_len, const size_t p_start ) |
johnb | 52:0950b05d5270 | 407 | { |
johnb | 52:0950b05d5270 | 408 | #if 0 |
johnb | 52:0950b05d5270 | 409 | /* This is the number of sample sets that are contained in the packet, set using the IT AT command */ |
johnb | 52:0950b05d5270 | 410 | uint8_t sampleCount = p_data[ p_start ]; |
johnb | 52:0950b05d5270 | 411 | #endif |
johnb | 52:0950b05d5270 | 412 | |
johnb | 53:7b65422d7a32 | 413 | const uint16_t channelMask = (((uint16_t)p_data[ p_start + 1 ]) << 8) | |
johnb | 53:7b65422d7a32 | 414 | ((uint16_t)p_data[ p_start + 2 ]); |
johnb | 52:0950b05d5270 | 415 | const uint8_t* dataPtr = &( p_data[ p_start + 3 ] ); |
johnb | 52:0950b05d5270 | 416 | const uint16_t dioMask = channelMask & DIO_CHANNEL_MASK; |
johnb | 52:0950b05d5270 | 417 | uint16_t adcMask = (channelMask & ADC_CHANNEL_MASK) >> 9U; |
johnb | 52:0950b05d5270 | 418 | uint8_t adc = 0; |
johnb | 52:0950b05d5270 | 419 | |
johnb | 52:0950b05d5270 | 420 | time_t seconds = time( NULL ); |
johnb | 52:0950b05d5270 | 421 | |
johnb | 52:0950b05d5270 | 422 | if( dioMask ) |
johnb | 52:0950b05d5270 | 423 | { |
johnb | 52:0950b05d5270 | 424 | uint16_t dioData = (((uint16_t)dataPtr[ 0 ]) << 8U) | |
johnb | 52:0950b05d5270 | 425 | (uint16_t)dataPtr[ 1 ]; |
johnb | 52:0950b05d5270 | 426 | dataPtr += 2; |
johnb | 52:0950b05d5270 | 427 | |
johnb | 52:0950b05d5270 | 428 | for( unsigned i = 0; |
johnb | 52:0950b05d5270 | 429 | i < XBEE_API_DIO_CHANNEL_COUNT; |
johnb | 52:0950b05d5270 | 430 | i++ ) |
johnb | 52:0950b05d5270 | 431 | { |
johnb | 52:0950b05d5270 | 432 | if(( dioMask >> i ) & 0x01 ) |
johnb | 52:0950b05d5270 | 433 | { |
johnb | 52:0950b05d5270 | 434 | m_ioDigitalState[i] = ( dioData >> i ) & 0x01; |
johnb | 52:0950b05d5270 | 435 | m_ioDigitalUpdatedTime[i] = seconds; |
johnb | 52:0950b05d5270 | 436 | } |
johnb | 52:0950b05d5270 | 437 | } |
johnb | 52:0950b05d5270 | 438 | } |
johnb | 52:0950b05d5270 | 439 | |
johnb | 52:0950b05d5270 | 440 | while( adcMask ) |
johnb | 52:0950b05d5270 | 441 | { |
johnb | 52:0950b05d5270 | 442 | if( adcMask & 0x01 ) |
johnb | 52:0950b05d5270 | 443 | { |
johnb | 52:0950b05d5270 | 444 | uint16_t adcData = (((uint16_t)dataPtr[ 0 ]) << 8U) | |
johnb | 52:0950b05d5270 | 445 | (uint16_t)dataPtr[ 1 ]; |
johnb | 52:0950b05d5270 | 446 | dataPtr += 2; |
johnb | 52:0950b05d5270 | 447 | |
johnb | 52:0950b05d5270 | 448 | m_ioAnalogueVal[adc] = adcData; |
johnb | 52:0950b05d5270 | 449 | m_ioAnalogueUpdatedTime[adc] = seconds; |
johnb | 52:0950b05d5270 | 450 | } |
johnb | 52:0950b05d5270 | 451 | adcMask = adcMask >> 1U; |
johnb | 52:0950b05d5270 | 452 | adc++; |
johnb | 52:0950b05d5270 | 453 | } |
johnb | 52:0950b05d5270 | 454 | |
johnb | 52:0950b05d5270 | 455 | return true; |
johnb | 52:0950b05d5270 | 456 | } |
johnb | 52:0950b05d5270 | 457 | |
johnb | 52:0950b05d5270 | 458 | #define XBEE_IO_PACKET_ADDRESS (XBEE_CMD_POSN_ID_SPECIFIC_DATA) |
johnb | 52:0950b05d5270 | 459 | #define XBEE_IO_PACKET_64BIT_DATA_START (XBEE_IO_PACKET_ADDRESS + sizeof( uint64_t) + 1U + 1U) |
johnb | 52:0950b05d5270 | 460 | #define XBEE_IO_PACKET_16BIT_DATA_START (XBEE_IO_PACKET_ADDRESS + sizeof( uint16_t) + 1U + 1U) |
johnb | 52:0950b05d5270 | 461 | |
johnb | 8:1b48b619d7f6 | 462 | bool XBeeApiCmdAt::decodeCallback( const uint8_t* const p_data, size_t p_len ) |
johnb | 8:1b48b619d7f6 | 463 | { |
johnb | 8:1b48b619d7f6 | 464 | bool ret_val = false; |
johnb | 13:302e7c1ea0b3 | 465 | |
johnb | 50:f76b7e7959a2 | 466 | if( XBEE_CMD_AT_RESPONSE == p_data[ XBEE_CMD_POSN_API_ID ] ) |
johnb | 50:f76b7e7959a2 | 467 | { |
johnb | 50:f76b7e7959a2 | 468 | ret_val = processResponseFrame( p_data, p_len ); |
johnb | 52:0950b05d5270 | 469 | } |
johnb | 52:0950b05d5270 | 470 | else if( XBEE_CMD_RX_16B_IO == p_data[ XBEE_CMD_POSN_API_ID ] ) |
johnb | 52:0950b05d5270 | 471 | { |
johnb | 52:0950b05d5270 | 472 | uint16_t src16BitAddr = (((uint16_t)p_data[ XBEE_IO_PACKET_ADDRESS ]) << 8U) | |
johnb | 52:0950b05d5270 | 473 | p_data[ XBEE_IO_PACKET_ADDRESS + 1 ]; |
johnb | 52:0950b05d5270 | 474 | if( m_have_sourceAddress && |
johnb | 52:0950b05d5270 | 475 | ( src16BitAddr == m_sourceAddress )) |
johnb | 52:0950b05d5270 | 476 | { |
johnb | 52:0950b05d5270 | 477 | ret_val = processIOFrame( p_data, p_len, XBEE_IO_PACKET_16BIT_DATA_START ); |
johnb | 52:0950b05d5270 | 478 | } |
johnb | 8:1b48b619d7f6 | 479 | } |
johnb | 52:0950b05d5270 | 480 | else if( XBEE_CMD_RX_64B_IO == p_data[ XBEE_CMD_POSN_API_ID ] ) |
johnb | 52:0950b05d5270 | 481 | { |
johnb | 52:0950b05d5270 | 482 | uint32_t srcAddrHigh = (((uint64_t)p_data[ XBEE_IO_PACKET_ADDRESS ]) << 24U) | |
johnb | 52:0950b05d5270 | 483 | (((uint64_t)p_data[ XBEE_IO_PACKET_ADDRESS + 1 ]) << 16U) | |
johnb | 52:0950b05d5270 | 484 | (((uint64_t)p_data[ XBEE_IO_PACKET_ADDRESS + 2 ]) << 8U) | |
johnb | 52:0950b05d5270 | 485 | (((uint64_t)p_data[ XBEE_IO_PACKET_ADDRESS + 3 ])); |
johnb | 52:0950b05d5270 | 486 | uint32_t srcAddrLow = (((uint64_t)p_data[ XBEE_IO_PACKET_ADDRESS + 4 ]) << 24U) | |
johnb | 52:0950b05d5270 | 487 | (((uint64_t)p_data[ XBEE_IO_PACKET_ADDRESS + 5 ]) << 16U) | |
johnb | 52:0950b05d5270 | 488 | (((uint64_t)p_data[ XBEE_IO_PACKET_ADDRESS + 6 ]) << 8U) | |
johnb | 52:0950b05d5270 | 489 | ((uint64_t)p_data[ XBEE_IO_PACKET_ADDRESS + 7 ]); |
johnb | 52:0950b05d5270 | 490 | if( m_have_snLow && |
johnb | 52:0950b05d5270 | 491 | m_have_snHigh && |
johnb | 52:0950b05d5270 | 492 | ( srcAddrHigh == m_snHigh ) && |
johnb | 52:0950b05d5270 | 493 | ( srcAddrLow == m_snLow )) |
johnb | 52:0950b05d5270 | 494 | { |
johnb | 52:0950b05d5270 | 495 | ret_val = processIOFrame( p_data, p_len, XBEE_IO_PACKET_64BIT_DATA_START ); |
johnb | 52:0950b05d5270 | 496 | } |
johnb | 52:0950b05d5270 | 497 | } |
johnb | 52:0950b05d5270 | 498 | else |
johnb | 52:0950b05d5270 | 499 | { |
johnb | 52:0950b05d5270 | 500 | } |
johnb | 52:0950b05d5270 | 501 | |
johnb | 8:1b48b619d7f6 | 502 | return ret_val; |
johnb | 8:1b48b619d7f6 | 503 | } |
johnb | 8:1b48b619d7f6 | 504 | |
johnb | 8:1b48b619d7f6 | 505 | bool XBeeApiCmdAt::setChannel( uint8_t const p_chan ) |
johnb | 8:1b48b619d7f6 | 506 | { |
johnb | 29:c6d037cceb02 | 507 | bool ret_val = false; |
johnb | 29:c6d037cceb02 | 508 | |
johnb | 29:c6d037cceb02 | 509 | if((( m_device->getXBeeModel() == XBeeDevice::XBEEDEVICE_S1 ) && |
johnb | 29:c6d037cceb02 | 510 | ( p_chan >= XBEE_CHAN_MIN ) && |
johnb | 29:c6d037cceb02 | 511 | ( p_chan <= XBEE_CHAN_MAX )) || |
johnb | 29:c6d037cceb02 | 512 | (( m_device->getXBeeModel() == XBeeDevice::XBEEDEVICE_S1_PRO ) && |
johnb | 29:c6d037cceb02 | 513 | ( p_chan >= XBEE_PRO_CHAN_MIN ) && |
johnb | 29:c6d037cceb02 | 514 | ( p_chan <= XBEE_PRO_CHAN_MAX ))) |
johnb | 29:c6d037cceb02 | 515 | { |
johnb | 29:c6d037cceb02 | 516 | m_chanPend = p_chan; |
johnb | 50:f76b7e7959a2 | 517 | SendCmd_uint8_t( cmd_ch_set_fid, cmd_ch_set, p_chan ); |
johnb | 29:c6d037cceb02 | 518 | ret_val = true; |
johnb | 29:c6d037cceb02 | 519 | } |
johnb | 29:c6d037cceb02 | 520 | return ret_val; |
johnb | 8:1b48b619d7f6 | 521 | } |
johnb | 8:1b48b619d7f6 | 522 | |
johnb | 50:f76b7e7959a2 | 523 | void XBeeApiCmdAt::SendReq( const uint8_t p_frameId, |
johnb | 50:f76b7e7959a2 | 524 | const uint8_t* p_data ) |
johnb | 50:f76b7e7959a2 | 525 | { |
johnb | 50:f76b7e7959a2 | 526 | XBeeApiCmdAtReq req( p_frameId, p_data ); |
johnb | 50:f76b7e7959a2 | 527 | m_device->SendFrame( &req ); |
johnb | 50:f76b7e7959a2 | 528 | } |
johnb | 50:f76b7e7959a2 | 529 | |
johnb | 50:f76b7e7959a2 | 530 | |
johnb | 31:c144106e55b5 | 531 | #define MAKE_REQUEST( _name, _mnemonic, _cmd ) \ |
johnb | 31:c144106e55b5 | 532 | bool XBeeApiCmdAt::request ## _name( void ) \ |
johnb | 31:c144106e55b5 | 533 | {\ |
johnb | 50:f76b7e7959a2 | 534 | m_have_ ## _mnemonic = false; \ |
johnb | 50:f76b7e7959a2 | 535 | SendReq( _cmd ## _get_fid, _cmd ); \ |
johnb | 31:c144106e55b5 | 536 | return true;\ |
johnb | 8:1b48b619d7f6 | 537 | } |
johnb | 8:1b48b619d7f6 | 538 | |
johnb | 51:a7d0d2ef9261 | 539 | MAKE_REQUEST( HardwareVersion, hwVer, cmd_hv ) |
johnb | 51:a7d0d2ef9261 | 540 | MAKE_REQUEST( FirmwareVersion, fwVer, cmd_vr ) |
johnb | 51:a7d0d2ef9261 | 541 | MAKE_REQUEST( Channel, chan, cmd_ch ) |
johnb | 51:a7d0d2ef9261 | 542 | MAKE_REQUEST( PanId, PANId, cmd_pid ) |
johnb | 51:a7d0d2ef9261 | 543 | MAKE_REQUEST( CoordinatorEnabled, CE, cmd_ce ) |
johnb | 51:a7d0d2ef9261 | 544 | MAKE_REQUEST( EndDeviceAssociationEnabled, EDA, cmd_eda ) |
johnb | 51:a7d0d2ef9261 | 545 | MAKE_REQUEST( SourceAddress, sourceAddress, cmd_my ) |
johnb | 51:a7d0d2ef9261 | 546 | MAKE_REQUEST( Retries, retries, cmd_rr ) |
johnb | 51:a7d0d2ef9261 | 547 | MAKE_REQUEST( RandomDelaySlots, randomDelaySlots, cmd_rn ) |
johnb | 51:a7d0d2ef9261 | 548 | MAKE_REQUEST( MacMode, macMode, cmd_mm ) |
johnb | 51:a7d0d2ef9261 | 549 | MAKE_REQUEST( SerialNumberHigh, snHigh, cmd_sh ) |
johnb | 51:a7d0d2ef9261 | 550 | MAKE_REQUEST( SerialNumberLow, snLow, cmd_sl ) |
johnb | 51:a7d0d2ef9261 | 551 | MAKE_REQUEST( DioChangeDetectMask, dioChangeDetectMask, cmd_ic ) |
johnb | 51:a7d0d2ef9261 | 552 | MAKE_REQUEST( SampleRate, sampleRate, cmd_ir ) |
johnb | 51:a7d0d2ef9261 | 553 | MAKE_REQUEST( DestinationAddressHigh, destHigh, cmd_dh ) |
johnb | 51:a7d0d2ef9261 | 554 | MAKE_REQUEST( DestinationAddressLow, destLow, cmd_dl ) |
johnb | 51:a7d0d2ef9261 | 555 | |
johnb | 51:a7d0d2ef9261 | 556 | bool XBeeApiCmdAt::requestWriteSettings( void ) |
johnb | 51:a7d0d2ef9261 | 557 | { |
johnb | 51:a7d0d2ef9261 | 558 | SendReq( cmd_wr_set_fid, cmd_wr ); |
johnb | 51:a7d0d2ef9261 | 559 | return true; |
johnb | 51:a7d0d2ef9261 | 560 | } |
johnb | 51:a7d0d2ef9261 | 561 | |
johnb | 51:a7d0d2ef9261 | 562 | bool XBeeApiCmdAt::requestApplyChanges( void ) |
johnb | 51:a7d0d2ef9261 | 563 | { |
johnb | 51:a7d0d2ef9261 | 564 | SendReq( cmd_ac_set_fid, cmd_ac ); |
johnb | 51:a7d0d2ef9261 | 565 | return true; |
johnb | 51:a7d0d2ef9261 | 566 | } |
johnb | 51:a7d0d2ef9261 | 567 | |
johnb | 51:a7d0d2ef9261 | 568 | bool XBeeApiCmdAt::requestReset( void ) |
johnb | 51:a7d0d2ef9261 | 569 | { |
johnb | 51:a7d0d2ef9261 | 570 | SendReq( cmd_fr_set_fid, cmd_fr ); |
johnb | 51:a7d0d2ef9261 | 571 | return true; |
johnb | 51:a7d0d2ef9261 | 572 | } |
johnb | 51:a7d0d2ef9261 | 573 | |
johnb | 51:a7d0d2ef9261 | 574 | bool XBeeApiCmdAt::requestForceSample( void ) |
johnb | 51:a7d0d2ef9261 | 575 | { |
johnb | 51:a7d0d2ef9261 | 576 | SendReq( cmd_is_set_fid, cmd_is ); |
johnb | 51:a7d0d2ef9261 | 577 | return true; |
johnb | 51:a7d0d2ef9261 | 578 | } |
johnb | 32:af4e495afd62 | 579 | |
johnb | 32:af4e495afd62 | 580 | bool XBeeApiCmdAt::requestSerialNumber( void ) |
johnb | 32:af4e495afd62 | 581 | { |
johnb | 50:f76b7e7959a2 | 582 | requestSerialNumberHigh(); |
johnb | 50:f76b7e7959a2 | 583 | requestSerialNumberLow(); |
johnb | 32:af4e495afd62 | 584 | return true; |
johnb | 32:af4e495afd62 | 585 | } |
johnb | 8:1b48b619d7f6 | 586 | |
johnb | 51:a7d0d2ef9261 | 587 | bool XBeeApiCmdAt::requestDestinationAddress( void ) |
johnb | 51:a7d0d2ef9261 | 588 | { |
johnb | 51:a7d0d2ef9261 | 589 | requestDestinationAddressHigh(); |
johnb | 51:a7d0d2ef9261 | 590 | requestDestinationAddressLow(); |
johnb | 51:a7d0d2ef9261 | 591 | return true; |
johnb | 51:a7d0d2ef9261 | 592 | } |
johnb | 51:a7d0d2ef9261 | 593 | |
johnb | 50:f76b7e7959a2 | 594 | bool XBeeApiCmdAt::requestDioConfig( const uint8_t p_chanNo ) |
johnb | 50:f76b7e7959a2 | 595 | { |
johnb | 50:f76b7e7959a2 | 596 | bool ret_val = false; |
johnb | 50:f76b7e7959a2 | 597 | if( p_chanNo < XBEE_API_DIO_CHANNEL_COUNT ) |
johnb | 50:f76b7e7959a2 | 598 | { |
johnb | 50:f76b7e7959a2 | 599 | m_have_d[ p_chanNo ] = false; |
johnb | 50:f76b7e7959a2 | 600 | SendReq( cmd_d_get_fid[ p_chanNo ], cmd_d[ p_chanNo ] ); |
johnb | 50:f76b7e7959a2 | 601 | ret_val = true; |
johnb | 50:f76b7e7959a2 | 602 | } |
johnb | 50:f76b7e7959a2 | 603 | return ret_val; |
johnb | 50:f76b7e7959a2 | 604 | } |
johnb | 50:f76b7e7959a2 | 605 | |
johnb | 52:0950b05d5270 | 606 | time_t XBeeApiCmdAt::getDigitalState( const uint8_t p_chanNo, bool& p_state ) |
johnb | 52:0950b05d5270 | 607 | { |
johnb | 52:0950b05d5270 | 608 | time_t ret_val = 0; |
johnb | 52:0950b05d5270 | 609 | if( p_chanNo < XBEE_API_DIO_CHANNEL_COUNT ) |
johnb | 52:0950b05d5270 | 610 | { |
johnb | 52:0950b05d5270 | 611 | p_state = m_ioDigitalState[ p_chanNo ]; |
johnb | 52:0950b05d5270 | 612 | ret_val = m_ioDigitalUpdatedTime[ p_chanNo ]; |
johnb | 52:0950b05d5270 | 613 | } |
johnb | 52:0950b05d5270 | 614 | return ret_val; |
johnb | 52:0950b05d5270 | 615 | } |
johnb | 52:0950b05d5270 | 616 | |
johnb | 52:0950b05d5270 | 617 | time_t XBeeApiCmdAt::getAnalogueValue( const uint8_t p_chanNo, uint16_t& p_val ) |
johnb | 52:0950b05d5270 | 618 | { |
johnb | 52:0950b05d5270 | 619 | time_t ret_val = 0; |
johnb | 52:0950b05d5270 | 620 | if( p_chanNo < XBEE_API_ADC_CHANNEL_COUNT ) |
johnb | 52:0950b05d5270 | 621 | { |
johnb | 52:0950b05d5270 | 622 | p_val = m_ioAnalogueVal[ p_chanNo ]; |
johnb | 52:0950b05d5270 | 623 | ret_val = m_ioAnalogueUpdatedTime[ p_chanNo ]; |
johnb | 52:0950b05d5270 | 624 | } |
johnb | 52:0950b05d5270 | 625 | return ret_val; |
johnb | 52:0950b05d5270 | 626 | } |
johnb | 50:f76b7e7959a2 | 627 | |
johnb | 31:c144106e55b5 | 628 | #define MAKE_GET(_name, _mnemonic, _type ) \ |
johnb | 31:c144106e55b5 | 629 | bool XBeeApiCmdAt::get ## _name( _type* const p_param ) \ |
johnb | 31:c144106e55b5 | 630 | {\ |
johnb | 31:c144106e55b5 | 631 | if( m_have_ ## _mnemonic ) {\ |
johnb | 31:c144106e55b5 | 632 | *p_param = m_ ## _mnemonic;\ |
johnb | 31:c144106e55b5 | 633 | } \ |
johnb | 31:c144106e55b5 | 634 | return m_have_ ## _mnemonic; \ |
johnb | 13:302e7c1ea0b3 | 635 | } |
johnb | 13:302e7c1ea0b3 | 636 | |
johnb | 51:a7d0d2ef9261 | 637 | MAKE_GET( FirmwareVersion, fwVer, uint16_t ) |
johnb | 51:a7d0d2ef9261 | 638 | MAKE_GET( HardwareVersion, hwVer, uint16_t ) |
johnb | 51:a7d0d2ef9261 | 639 | MAKE_GET( Channel, chan, uint8_t ) |
johnb | 51:a7d0d2ef9261 | 640 | MAKE_GET( CoordinatorEnabled, CE, bool ) |
johnb | 51:a7d0d2ef9261 | 641 | MAKE_GET( EndDeviceAssociationEnabled, EDA, bool ) |
johnb | 51:a7d0d2ef9261 | 642 | MAKE_GET( PanId, PANId, panId_t ) |
johnb | 51:a7d0d2ef9261 | 643 | MAKE_GET( SourceAddress, sourceAddress, uint16_t ) |
johnb | 51:a7d0d2ef9261 | 644 | MAKE_GET( Retries, retries, uint8_t ) |
johnb | 51:a7d0d2ef9261 | 645 | MAKE_GET( RandomDelaySlots, randomDelaySlots, uint8_t ) |
johnb | 51:a7d0d2ef9261 | 646 | MAKE_GET( MacMode, macMode, XBeeApiMACMode_e ) |
johnb | 51:a7d0d2ef9261 | 647 | MAKE_GET( DioChangeDetectMask, dioChangeDetectMask, uint8_t ) |
johnb | 51:a7d0d2ef9261 | 648 | MAKE_GET( DioLevels, dioLevels, uint8_t ) |
johnb | 51:a7d0d2ef9261 | 649 | MAKE_GET( SampleRate, sampleRate, uint16_t ) |
johnb | 51:a7d0d2ef9261 | 650 | MAKE_GET( DestinationAddressHigh, destHigh, uint32_t ) |
johnb | 51:a7d0d2ef9261 | 651 | MAKE_GET( DestinationAddressLow, destLow, uint32_t ) |
johnb | 32:af4e495afd62 | 652 | |
johnb | 32:af4e495afd62 | 653 | bool XBeeApiCmdAt::getSerialNumber( uint64_t* const p_sn ) |
johnb | 32:af4e495afd62 | 654 | { |
johnb | 32:af4e495afd62 | 655 | /* Need both halves to have the complete serial number */ |
johnb | 32:af4e495afd62 | 656 | bool have_sn = m_have_snLow && m_have_snHigh; |
johnb | 32:af4e495afd62 | 657 | if( have_sn ) |
johnb | 32:af4e495afd62 | 658 | { |
johnb | 32:af4e495afd62 | 659 | *p_sn = m_snHigh; |
johnb | 32:af4e495afd62 | 660 | *p_sn = *p_sn << 32U; |
johnb | 32:af4e495afd62 | 661 | *p_sn |= m_snLow; |
johnb | 32:af4e495afd62 | 662 | } |
johnb | 32:af4e495afd62 | 663 | return( have_sn ); |
johnb | 32:af4e495afd62 | 664 | } |
johnb | 25:db6874b7ac4b | 665 | |
johnb | 51:a7d0d2ef9261 | 666 | bool XBeeApiCmdAt::getDestinationAddress( uint64_t* const p_addr ) |
johnb | 51:a7d0d2ef9261 | 667 | { |
johnb | 51:a7d0d2ef9261 | 668 | bool have_da = m_have_destLow && m_have_destHigh; |
johnb | 51:a7d0d2ef9261 | 669 | if( have_da ) |
johnb | 51:a7d0d2ef9261 | 670 | { |
johnb | 51:a7d0d2ef9261 | 671 | *p_addr = m_destHigh; |
johnb | 51:a7d0d2ef9261 | 672 | *p_addr = *p_addr << 32U; |
johnb | 51:a7d0d2ef9261 | 673 | *p_addr |= m_destLow; |
johnb | 51:a7d0d2ef9261 | 674 | } |
johnb | 51:a7d0d2ef9261 | 675 | return( have_da ); |
johnb | 51:a7d0d2ef9261 | 676 | |
johnb | 51:a7d0d2ef9261 | 677 | } |
johnb | 51:a7d0d2ef9261 | 678 | |
johnb | 50:f76b7e7959a2 | 679 | bool XBeeApiCmdAt::getDioConfig( const uint8_t p_chanNo, XBeeApiDioConfig_e* const p_conf ) |
johnb | 50:f76b7e7959a2 | 680 | { |
johnb | 50:f76b7e7959a2 | 681 | bool ret_val = false; |
johnb | 50:f76b7e7959a2 | 682 | if( p_chanNo < XBEE_API_DIO_CHANNEL_COUNT ) |
johnb | 50:f76b7e7959a2 | 683 | { |
johnb | 50:f76b7e7959a2 | 684 | if( m_have_d[ p_chanNo ] ) |
johnb | 50:f76b7e7959a2 | 685 | { |
johnb | 50:f76b7e7959a2 | 686 | *p_conf = m_d[ p_chanNo ]; |
johnb | 50:f76b7e7959a2 | 687 | ret_val = true; |
johnb | 50:f76b7e7959a2 | 688 | } |
johnb | 50:f76b7e7959a2 | 689 | } |
johnb | 50:f76b7e7959a2 | 690 | return ret_val; |
johnb | 50:f76b7e7959a2 | 691 | } |
johnb | 50:f76b7e7959a2 | 692 | |
johnb | 50:f76b7e7959a2 | 693 | #define MAKE_SET( _name, _mnemonic, _cmd, _type, _transmit_type ) \ |
johnb | 31:c144106e55b5 | 694 | bool XBeeApiCmdAt::set ## _name( const _type p_param ) \ |
johnb | 31:c144106e55b5 | 695 | {\ |
johnb | 31:c144106e55b5 | 696 | m_have_ ## _mnemonic = false;\ |
johnb | 31:c144106e55b5 | 697 | m_## _mnemonic ## Pend = p_param;\ |
johnb | 50:f76b7e7959a2 | 698 | SendCmd_ ## _transmit_type ( _cmd ## _fid, _cmd, p_param ); \ |
johnb | 31:c144106e55b5 | 699 | return true;\ |
johnb | 13:302e7c1ea0b3 | 700 | } |
johnb | 13:302e7c1ea0b3 | 701 | |
johnb | 51:a7d0d2ef9261 | 702 | MAKE_SET( CoordinatorEnabled, CE, cmd_ce_set, bool, uint8_t ) |
johnb | 51:a7d0d2ef9261 | 703 | MAKE_SET( EndDeviceAssociationEnabled, EDA, cmd_eda_set, bool, uint8_t ) |
johnb | 51:a7d0d2ef9261 | 704 | MAKE_SET( PanId, PANId, cmd_pid_set, uint16_t, uint16_t ) |
johnb | 51:a7d0d2ef9261 | 705 | MAKE_SET( SourceAddress, sourceAddress, cmd_my_set, uint16_t, uint16_t ) |
johnb | 51:a7d0d2ef9261 | 706 | MAKE_SET( Retries, retries, cmd_rr_set, uint8_t, uint16_t ) |
johnb | 51:a7d0d2ef9261 | 707 | MAKE_SET( RandomDelaySlots, randomDelaySlots, cmd_rn_set, uint8_t, uint16_t ) |
johnb | 51:a7d0d2ef9261 | 708 | MAKE_SET( MacMode, macMode, cmd_mm_set, XBeeApiMACMode_e, uint8_t ) |
johnb | 51:a7d0d2ef9261 | 709 | MAKE_SET( DioChangeDetectMask, dioChangeDetectMask, cmd_ic_set, uint8_t, uint8_t ) |
johnb | 51:a7d0d2ef9261 | 710 | MAKE_SET( DioLevels, dioLevels, cmd_io_set, uint8_t, uint8_t ) |
johnb | 51:a7d0d2ef9261 | 711 | MAKE_SET( SampleRate, sampleRate, cmd_ir_set, uint16_t, uint16_t ) |
johnb | 51:a7d0d2ef9261 | 712 | MAKE_SET( DestinationAddressHigh, destHigh, cmd_dh_set, uint32_t, uint32_t ) |
johnb | 51:a7d0d2ef9261 | 713 | MAKE_SET( DestinationAddressLow, destLow, cmd_dl_set, uint32_t, uint32_t ) |
johnb | 50:f76b7e7959a2 | 714 | |
johnb | 50:f76b7e7959a2 | 715 | |
johnb | 50:f76b7e7959a2 | 716 | bool XBeeApiCmdAt::setDioConfig( const uint8_t p_chanNo, const XBeeApiDioConfig_e p_conf ) |
johnb | 50:f76b7e7959a2 | 717 | { |
johnb | 50:f76b7e7959a2 | 718 | bool ret_val = false; |
johnb | 50:f76b7e7959a2 | 719 | if( p_chanNo < XBEE_API_DIO_CHANNEL_COUNT ) |
johnb | 50:f76b7e7959a2 | 720 | { |
johnb | 51:a7d0d2ef9261 | 721 | /* TODO: Add check that p_conf is valid for this channel */ |
johnb | 50:f76b7e7959a2 | 722 | m_have_d[ p_chanNo ] = false; |
johnb | 50:f76b7e7959a2 | 723 | m_dPend[ p_chanNo ] = p_conf; |
johnb | 50:f76b7e7959a2 | 724 | SendCmd_uint8_t( cmd_d_get_fid[ p_chanNo ], cmd_d[ p_chanNo ], p_conf ); |
johnb | 50:f76b7e7959a2 | 725 | } |
johnb | 50:f76b7e7959a2 | 726 | return ret_val; |
johnb | 50:f76b7e7959a2 | 727 | } |
johnb | 50:f76b7e7959a2 | 728 | |
johnb | 51:a7d0d2ef9261 | 729 | bool XBeeApiCmdAt::setDestinationAddress( const uint64_t p_addr ) |
johnb | 51:a7d0d2ef9261 | 730 | { |
johnb | 51:a7d0d2ef9261 | 731 | m_have_destHigh = m_have_destLow = false; |
johnb | 51:a7d0d2ef9261 | 732 | |
johnb | 51:a7d0d2ef9261 | 733 | setDestinationAddressHigh( p_addr >> 32U ); |
johnb | 51:a7d0d2ef9261 | 734 | setDestinationAddressLow( p_addr ); |
johnb | 51:a7d0d2ef9261 | 735 | |
johnb | 51:a7d0d2ef9261 | 736 | return true; |
johnb | 51:a7d0d2ef9261 | 737 | } |
johnb | 51:a7d0d2ef9261 | 738 | |
johnb | 51:a7d0d2ef9261 | 739 | |
johnb | 51:a7d0d2ef9261 | 740 | |
johnb | 50:f76b7e7959a2 | 741 | void XBeeApiCmdAt::SendCmd_uint8_t( const uint8_t p_frameId, |
johnb | 50:f76b7e7959a2 | 742 | const uint8_t* const p_data, |
johnb | 50:f76b7e7959a2 | 743 | const uint8_t& p_val ) |
johnb | 50:f76b7e7959a2 | 744 | { |
johnb | 50:f76b7e7959a2 | 745 | XBeeApiCmdAtSet<uint8_t> req( p_frameId, p_data, p_val ); |
johnb | 50:f76b7e7959a2 | 746 | m_device->SendFrame( &req ); |
johnb | 50:f76b7e7959a2 | 747 | } |
johnb | 50:f76b7e7959a2 | 748 | |
johnb | 50:f76b7e7959a2 | 749 | void XBeeApiCmdAt::SendCmd_uint16_t( const uint8_t p_frameId, |
johnb | 50:f76b7e7959a2 | 750 | const uint8_t* const p_data, |
johnb | 50:f76b7e7959a2 | 751 | const uint16_t& p_val ) |
johnb | 50:f76b7e7959a2 | 752 | { |
johnb | 50:f76b7e7959a2 | 753 | XBeeApiCmdAtSet<uint16_t> req( p_frameId, p_data, p_val ); |
johnb | 50:f76b7e7959a2 | 754 | m_device->SendFrame( &req ); |
johnb | 50:f76b7e7959a2 | 755 | } |
johnb | 13:302e7c1ea0b3 | 756 | |
johnb | 51:a7d0d2ef9261 | 757 | void XBeeApiCmdAt::SendCmd_uint32_t( const uint8_t p_frameId, |
johnb | 51:a7d0d2ef9261 | 758 | const uint8_t* const p_data, |
johnb | 51:a7d0d2ef9261 | 759 | const uint32_t& p_val ) |
johnb | 8:1b48b619d7f6 | 760 | { |
johnb | 51:a7d0d2ef9261 | 761 | XBeeApiCmdAtSet<uint32_t> req( p_frameId, p_data, p_val ); |
johnb | 51:a7d0d2ef9261 | 762 | m_device->SendFrame( &req ); |
johnb | 50:f76b7e7959a2 | 763 | } |
johnb | 31:c144106e55b5 | 764 | |
johnb | 25:db6874b7ac4b | 765 | template < typename T > |
johnb | 50:f76b7e7959a2 | 766 | XBeeApiCmdAtSet<T>::XBeeApiCmdAtSet( const uint8_t p_frameId, |
johnb | 50:f76b7e7959a2 | 767 | const uint8_t* const p_data, |
johnb | 50:f76b7e7959a2 | 768 | const T p_val ) : XBeeApiFrame( ) |
johnb | 8:1b48b619d7f6 | 769 | { |
johnb | 25:db6874b7ac4b | 770 | size_t s; |
johnb | 25:db6874b7ac4b | 771 | uint8_t* dest; |
johnb | 25:db6874b7ac4b | 772 | const uint8_t* src = (uint8_t*)(&p_val); |
johnb | 25:db6874b7ac4b | 773 | |
johnb | 13:302e7c1ea0b3 | 774 | m_apiId = XBEE_CMD_AT_CMD; |
johnb | 25:db6874b7ac4b | 775 | |
johnb | 50:f76b7e7959a2 | 776 | m_buffer[0] = p_frameId; |
johnb | 50:f76b7e7959a2 | 777 | m_buffer[1] = p_data[0]; |
johnb | 50:f76b7e7959a2 | 778 | m_buffer[2] = p_data[1]; |
johnb | 25:db6874b7ac4b | 779 | |
johnb | 36:cc7e8d1e35dd | 780 | m_dataLen = sizeof( m_buffer ); |
johnb | 36:cc7e8d1e35dd | 781 | |
johnb | 36:cc7e8d1e35dd | 782 | /* TODO: This copy code isn't portable - it's assuming that the data in |
johnb | 36:cc7e8d1e35dd | 783 | * p_data is little endian */ |
johnb | 36:cc7e8d1e35dd | 784 | |
johnb | 36:cc7e8d1e35dd | 785 | dest = &( m_buffer[ m_dataLen - 1 ] ); |
johnb | 25:db6874b7ac4b | 786 | |
johnb | 25:db6874b7ac4b | 787 | for( s = 0; |
johnb | 25:db6874b7ac4b | 788 | s < sizeof( T ); |
johnb | 36:cc7e8d1e35dd | 789 | s++, dest--, src++ ) { |
johnb | 25:db6874b7ac4b | 790 | *dest = *src; |
johnb | 25:db6874b7ac4b | 791 | } |
johnb | 25:db6874b7ac4b | 792 | |
johnb | 50:f76b7e7959a2 | 793 | m_data = m_buffer; |
johnb | 50:f76b7e7959a2 | 794 | } |
johnb | 13:302e7c1ea0b3 | 795 | |
johnb | 25:db6874b7ac4b | 796 | template < typename T > |
johnb | 50:f76b7e7959a2 | 797 | XBeeApiCmdAtSet<T>::~XBeeApiCmdAtSet() |
johnb | 50:f76b7e7959a2 | 798 | { |
johnb | 50:f76b7e7959a2 | 799 | } |
johnb | 50:f76b7e7959a2 | 800 | |
johnb | 50:f76b7e7959a2 | 801 | XBeeApiCmdAtReq::XBeeApiCmdAtReq( const uint8_t p_frameId, |
johnb | 50:f76b7e7959a2 | 802 | const uint8_t* const p_data ) |
johnb | 50:f76b7e7959a2 | 803 | { |
johnb | 50:f76b7e7959a2 | 804 | m_apiId = XBEE_CMD_AT_CMD; |
johnb | 50:f76b7e7959a2 | 805 | |
johnb | 50:f76b7e7959a2 | 806 | m_buffer[0] = p_frameId; |
johnb | 50:f76b7e7959a2 | 807 | m_buffer[1] = p_data[0]; |
johnb | 50:f76b7e7959a2 | 808 | m_buffer[2] = p_data[1]; |
johnb | 50:f76b7e7959a2 | 809 | |
johnb | 50:f76b7e7959a2 | 810 | m_dataLen = sizeof( m_buffer ); |
johnb | 50:f76b7e7959a2 | 811 | m_data = m_buffer; |
johnb | 50:f76b7e7959a2 | 812 | } |
johnb | 50:f76b7e7959a2 | 813 | |
johnb | 50:f76b7e7959a2 | 814 | XBeeApiCmdAtReq::~XBeeApiCmdAtReq() |
johnb | 13:302e7c1ea0b3 | 815 | { |
johnb | 25:db6874b7ac4b | 816 | } |