Trond Enger / d7a_1x

Fork of d7a_1x by WizziLab

Committer:
Jeej
Date:
Mon Oct 10 13:31:44 2016 +0000
Revision:
63:afd046faedb0
Parent:
59:b42eae56b51b
Child:
65:ac3844adfe49
Reduced command timeout

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jeej 43:28202405094d 1 #ifndef _D7A_ALP_H_
Jeej 43:28202405094d 2 #define _D7A_ALP_H_
Jeej 43:28202405094d 3
Jeej 63:afd046faedb0 4 #define D7A_ALP_RESP_TO (3000)
Jeej 43:28202405094d 5
Jeej 43:28202405094d 6 #define ALP_CTRL_GROUP 0x80
Jeej 43:28202405094d 7 #define ALP_CTRL_RESP 0x40
Jeej 43:28202405094d 8 #define ALP_CTRL_OVERLOAD 0x80
Jeej 43:28202405094d 9 #define ALP_CTRL_INDIRECT 0x40
Jeej 43:28202405094d 10 #define ALP_CTRL_EOP 0x80
Jeej 43:28202405094d 11 #define ALP_CTRL_ERR 0x40
Jeej 43:28202405094d 12
Jeej 43:28202405094d 13
Jeej 43:28202405094d 14 typedef enum {
Jeej 43:28202405094d 15 // OPCODE | OPERAND
Jeej 43:28202405094d 16 ALP_OPCODE_NOP = 0, //| -
Jeej 43:28202405094d 17
Jeej 43:28202405094d 18 ALP_OPCODE_F_RD_DATA = 1, //| FDR
Jeej 43:28202405094d 19 ALP_OPCODE_F_RD_PROP = 2, //| FID
Jeej 43:28202405094d 20
Jeej 43:28202405094d 21 ALP_OPCODE_F_WR_DATA = 4, //| FD
Jeej 43:28202405094d 22 ALP_OPCODE_F_WR_FLUSH = 5, //| FD
Jeej 43:28202405094d 23 ALP_OPCODE_F_WR_PROP = 6, //| FD
Jeej 43:28202405094d 24
Jeej 43:28202405094d 25 ALP_OPCODE_QUERY = 8, //| Q
Jeej 43:28202405094d 26 ALP_OPCODE_QBREAK = 9, //| Q
Jeej 43:28202405094d 27 ALP_OPCODE_PERM_REQ = 10, //| P
Jeej 43:28202405094d 28
Jeej 43:28202405094d 29 ALP_OPCODE_CRC_CHECK = 11, //| Q
Jeej 43:28202405094d 30
Jeej 43:28202405094d 31 ALP_OPCODE_F_EXIST = 16, //| FID
Jeej 43:28202405094d 32 ALP_OPCODE_F_CREATE = 17, //| FD
Jeej 43:28202405094d 33 ALP_OPCODE_F_DELETE = 18, //| FID
Jeej 43:28202405094d 34 ALP_OPCODE_F_RESTORE = 19, //| FID
Jeej 43:28202405094d 35 ALP_OPCODE_F_FLUSH = 20, //| FID
Jeej 43:28202405094d 36 ALP_OPCODE_F_OPEN = 21, //| FID
Jeej 43:28202405094d 37 ALP_OPCODE_F_CLOSE = 22, //| FID
Jeej 43:28202405094d 38 ALP_OPCODE_F_COPY = 23, //| 2xFID
Jeej 43:28202405094d 39 ALP_OPCODE_F_EXECUTE = 31, //| FID
Jeej 43:28202405094d 40
Jeej 43:28202405094d 41 ALP_OPCODE_RSP_F_DATA = 32, //| FD
Jeej 43:28202405094d 42 ALP_OPCODE_RSP_F_PROP = 33, //| FH
Jeej 43:28202405094d 43 ALP_OPCODE_RSP_STATUS = 34, //| S
Jeej 43:28202405094d 44 ALP_OPCODE_RSP_ISTATUS = ALP_OPCODE_RSP_STATUS + (1 << 6), //| SI
Jeej 43:28202405094d 45 ALP_OPCODE_RSP_TAG = 35, //| PID
Jeej 43:28202405094d 46 ALP_OPCODE_RSP_EOPTAG = ALP_OPCODE_RSP_TAG + (2 << 6), //| PID
Jeej 43:28202405094d 47 ALP_OPCODE_RSP_ERRTAG = ALP_OPCODE_RSP_TAG + (1 << 6), //| PID
Jeej 43:28202405094d 48
Jeej 43:28202405094d 49 ALP_OPCODE_CHUNK = 48, //| -
Jeej 43:28202405094d 50 ALP_OPCODE_LOGIC = 49, //| -
Jeej 43:28202405094d 51 ALP_OPCODE_FORWARD = 50, //| I
Jeej 43:28202405094d 52 ALP_OPCODE_IFORWARD = 51, //| IFID
Jeej 43:28202405094d 53 ALP_OPCODE_TAG = 52, //| PID
Jeej 43:28202405094d 54
Jeej 43:28202405094d 55 ALP_OPCODE_EXT = 63, //| RFU
Jeej 43:28202405094d 56
Jeej 43:28202405094d 57 // Modifiers
Jeej 43:28202405094d 58 ALP_OPCODE_RESP = 0x40,
Jeej 43:28202405094d 59 ALP_OPCODE_GROUP = 0x80,
Jeej 43:28202405094d 60
Jeej 43:28202405094d 61 ALP_OPCODE_ERR = 0x40,
Jeej 43:28202405094d 62 ALP_OPCODE_EOP = 0x80,
Jeej 43:28202405094d 63
Jeej 43:28202405094d 64 ALP_OPCODE_INDIRECT = 0x40,
Jeej 43:28202405094d 65 ALP_OPCODE_OVERLOAD = 0x80,
Jeej 43:28202405094d 66
Jeej 43:28202405094d 67 } alp_opcodes_t;
Jeej 43:28202405094d 68
Jeej 43:28202405094d 69
Jeej 45:b85384e7d825 70 typedef enum {
Jeej 45:b85384e7d825 71 ALP_RESP_TYPE_UNKNOWN = 0,
Jeej 45:b85384e7d825 72 ALP_RESP_TYPE_F_DATA = ALP_OPCODE_RSP_F_DATA,
Jeej 45:b85384e7d825 73 ALP_RESP_TYPE_F_PROP = ALP_OPCODE_RSP_F_PROP,
Jeej 45:b85384e7d825 74 ALP_RESP_TYPE_ISTATUS = ALP_OPCODE_RSP_ISTATUS,
Jeej 45:b85384e7d825 75 ALP_RESP_TYPE_STATUS = ALP_OPCODE_RSP_STATUS,
Jeej 45:b85384e7d825 76 ALP_RESP_TYPE_TAG = ALP_OPCODE_RSP_TAG,
Jeej 45:b85384e7d825 77 } alp_resp_type_t;
Jeej 45:b85384e7d825 78
Jeej 46:665391110051 79 // =======================================================================
Jeej 46:665391110051 80 // d7a_resp_t
Jeej 46:665391110051 81 // -----------------------------------------------------------------------
Jeej 52:c7a58fc48bd2 82 // Enumerator of the D7ASP Response types
Jeej 46:665391110051 83 // =======================================================================
Jeej 46:665391110051 84 typedef enum
Jeej 46:665391110051 85 {
Jeej 52:c7a58fc48bd2 86 // No response requested
Jeej 46:665391110051 87 D7A_RESP_NO = 0,
Jeej 52:c7a58fc48bd2 88 // Get all responses in response period
Jeej 46:665391110051 89 D7A_RESP_ALL,
Jeej 52:c7a58fc48bd2 90 // Get at least one acknowledgement per request during response period
Jeej 46:665391110051 91 D7A_RESP_ANY,
Jeej 52:c7a58fc48bd2 92 // RFU
Jeej 46:665391110051 93 D7A_RESP_RFU_1,
Jeej 52:c7a58fc48bd2 94 // No response requested, repeat 3 times
Jeej 46:665391110051 95 D7A_RESP_NO_RPT,
Jeej 52:c7a58fc48bd2 96 // Get all responses in response period, only Responders having not received packets respond
Jeej 46:665391110051 97 D7A_RESP_ON_ERR,
Jeej 52:c7a58fc48bd2 98 // Get at least one acknowledgement per request during response period.
Jeej 52:c7a58fc48bd2 99 // Stick to a single responder when possible
Jeej 46:665391110051 100 D7A_RESP_PREFERRED,
Jeej 52:c7a58fc48bd2 101 // RFU
Jeej 46:665391110051 102 D7A_RESP_RFU_2,
Jeej 46:665391110051 103
Jeej 46:665391110051 104 } d7a_resp_t;
Jeej 46:665391110051 105
Jeej 46:665391110051 106
Jeej 45:b85384e7d825 107 typedef struct {
Jeej 45:b85384e7d825 108 uint8_t type;
Jeej 45:b85384e7d825 109 uint8_t* data; // data
Jeej 45:b85384e7d825 110 union
Jeej 45:b85384e7d825 111 {
Jeej 45:b85384e7d825 112 struct {
Jeej 45:b85384e7d825 113 uint32_t length;
Jeej 45:b85384e7d825 114 uint32_t offset;
Jeej 45:b85384e7d825 115 uint8_t fid;
Jeej 45:b85384e7d825 116 } f_data;
Jeej 45:b85384e7d825 117 struct {
Jeej 45:b85384e7d825 118 uint32_t length;
Jeej 45:b85384e7d825 119 uint32_t offset;
Jeej 45:b85384e7d825 120 uint8_t fid;
Jeej 45:b85384e7d825 121 } f_prop;
Jeej 45:b85384e7d825 122 struct {
Jeej 45:b85384e7d825 123 uint8_t code;
Jeej 45:b85384e7d825 124 uint8_t id; // Action ID
Jeej 45:b85384e7d825 125 } status;
Jeej 45:b85384e7d825 126 struct {
Jeej 45:b85384e7d825 127 uint32_t length;
Jeej 45:b85384e7d825 128 uint8_t type;
Jeej 45:b85384e7d825 129 } itf;
Jeej 45:b85384e7d825 130 struct {
Jeej 45:b85384e7d825 131 uint8_t id;
Jeej 45:b85384e7d825 132 uint8_t eop;
Jeej 45:b85384e7d825 133 uint8_t err;
Jeej 45:b85384e7d825 134 } tag;
Jeej 45:b85384e7d825 135 } meta;
Jeej 45:b85384e7d825 136 } alp_uns_resp_parsed_t;
Jeej 45:b85384e7d825 137
Jeej 45:b85384e7d825 138 TYPEDEF_STRUCT_PACKED
Jeej 45:b85384e7d825 139 {
Jeej 45:b85384e7d825 140 uint8_t aid;
Jeej 45:b85384e7d825 141 int8_t status;
Jeej 45:b85384e7d825 142 } d7a_alp_rsp_status_t;
Jeej 45:b85384e7d825 143
Jeej 59:b42eae56b51b 144 #define NO_TAG (-1)
Jeej 45:b85384e7d825 145 TYPEDEF_STRUCT_PACKED
Jeej 45:b85384e7d825 146 {
Jeej 59:b42eae56b51b 147 int16_t tag;
Jeej 59:b42eae56b51b 148 bool eop;
Jeej 59:b42eae56b51b 149 d7a_msg_t* msg;
Jeej 45:b85384e7d825 150 } d7a_alp_rsp_t;
Jeej 45:b85384e7d825 151
Jeej 46:665391110051 152 // =======================================================================
Jeej 46:665391110051 153 // d7a_ctf_t
Jeej 46:665391110051 154 // -----------------------------------------------------------------------
Jeej 52:c7a58fc48bd2 155 // DLL compressed time format
Jeej 46:665391110051 156 // =======================================================================
Jeej 46:665391110051 157 typedef union
Jeej 46:665391110051 158 {
Jeej 46:665391110051 159 // bit access fields
Jeej 46:665391110051 160 struct {
Jeej 52:c7a58fc48bd2 161 // Mantissa
Jeej 46:665391110051 162 uint8_t mant : 5;
Jeej 52:c7a58fc48bd2 163 // Exponent
Jeej 46:665391110051 164 uint8_t exp : 3;
Jeej 46:665391110051 165 } bf;
Jeej 46:665391110051 166
Jeej 46:665391110051 167 // byte access
Jeej 46:665391110051 168 uint8_t byte;
Jeej 46:665391110051 169
Jeej 46:665391110051 170 } d7a_ctf_t;
Jeej 46:665391110051 171
Jeej 46:665391110051 172 // =======================================================================
Jeej 46:665391110051 173 // d7a_qos_t
Jeej 46:665391110051 174 // -----------------------------------------------------------------------
Jeej 52:c7a58fc48bd2 175 // Bitfield structure of the D7ASP Quality of Service control byte
Jeej 46:665391110051 176 // =======================================================================
Jeej 46:665391110051 177 typedef union
Jeej 46:665391110051 178 {
Jeej 46:665391110051 179 // bit access fields
Jeej 46:665391110051 180 struct {
Jeej 52:c7a58fc48bd2 181 // Response mode
Jeej 46:665391110051 182 uint8_t resp : 3;
Jeej 52:c7a58fc48bd2 183 // Retry mode
Jeej 46:665391110051 184 uint8_t retry : 3;
Jeej 52:c7a58fc48bd2 185 // Responder has to keep the ACK template (TPL status file)
Jeej 46:665391110051 186 uint8_t record : 1;
Jeej 52:c7a58fc48bd2 187 // Stop D7ASP on not acknowledged request
Jeej 46:665391110051 188 uint8_t stop_on_err : 1;
Jeej 46:665391110051 189
Jeej 46:665391110051 190 } bf;
Jeej 46:665391110051 191
Jeej 46:665391110051 192 // byte access
Jeej 46:665391110051 193 uint8_t byte;
Jeej 46:665391110051 194
Jeej 46:665391110051 195 } d7a_qos_t;
Jeej 46:665391110051 196
Jeej 46:665391110051 197 // =======================================================================
Jeej 46:665391110051 198 // d7a_sp_cfg_t
Jeej 46:665391110051 199 // -----------------------------------------------------------------------
Jeej 52:c7a58fc48bd2 200 // Structure of the D7ASP Configuration
Jeej 46:665391110051 201 // =======================================================================
Jeej 46:665391110051 202 TYPEDEF_STRUCT_PACKED
Jeej 46:665391110051 203 {
Jeej 52:c7a58fc48bd2 204 // D7ASP QoS
Jeej 46:665391110051 205 d7a_qos_t qos;
Jeej 52:c7a58fc48bd2 206 // Dormant Timeout (0, no timeout)
Jeej 46:665391110051 207 d7a_ctf_t dorm_to;
Jeej 52:c7a58fc48bd2 208 // Addressee
Jeej 46:665391110051 209 d7a_addressee_t addressee;
Jeej 46:665391110051 210
Jeej 46:665391110051 211 } d7a_sp_cfg_t;
Jeej 46:665391110051 212
Jeej 46:665391110051 213
Jeej 46:665391110051 214 // =======================================================================
Jeej 46:665391110051 215 // alp_d7a_itf_t
Jeej 46:665391110051 216 // -----------------------------------------------------------------------
Jeej 52:c7a58fc48bd2 217 // ALP/D7A Interface file TODO:should be in alp_d7a.h when/if it exists
Jeej 52:c7a58fc48bd2 218 // but not in alp.h as it requires D7A
Jeej 46:665391110051 219 // ====================================================================
Jeej 46:665391110051 220 TYPEDEF_STRUCT_PACKED {
Jeej 46:665391110051 221 uint8_t type;
Jeej 46:665391110051 222 d7a_sp_cfg_t cfg;
Jeej 46:665391110051 223 } alp_d7a_itf_t;
Jeej 46:665391110051 224
Jeej 46:665391110051 225
Jeej 58:38a366236bda 226 // =======================================================================
Jeej 58:38a366236bda 227 // d7a_ch_header_t
Jeej 58:38a366236bda 228 // -----------------------------------------------------------------------
Jeej 58:38a366236bda 229 /// Bitfield structure of the channel identifier
Jeej 58:38a366236bda 230 // =======================================================================
Jeej 58:38a366236bda 231 typedef union
Jeej 58:38a366236bda 232 {
Jeej 58:38a366236bda 233 // bit access fields
Jeej 58:38a366236bda 234 struct {
Jeej 58:38a366236bda 235 /// Coding scheme
Jeej 58:38a366236bda 236 uint8_t cs : 2;
Jeej 58:38a366236bda 237 /// Channel Class
Jeej 58:38a366236bda 238 uint8_t cl : 2;
Jeej 58:38a366236bda 239 /// Channel Band
Jeej 58:38a366236bda 240 uint8_t band : 3;
Jeej 58:38a366236bda 241 /// RFU
Jeej 58:38a366236bda 242 uint8_t rfu : 1;
Jeej 58:38a366236bda 243 } bf;
Jeej 58:38a366236bda 244
Jeej 58:38a366236bda 245 // byte access
Jeej 58:38a366236bda 246 uint8_t byte;
Jeej 58:38a366236bda 247
Jeej 58:38a366236bda 248 } d7a_ch_header_t;
Jeej 58:38a366236bda 249
Jeej 58:38a366236bda 250 // =======================================================================
Jeej 58:38a366236bda 251 // d7a_sp_status_t
Jeej 58:38a366236bda 252 // -----------------------------------------------------------------------
Jeej 58:38a366236bda 253 /// Bitfield structure of the D7ASP segment status byte
Jeej 58:38a366236bda 254 // =======================================================================
Jeej 58:38a366236bda 255 typedef union
Jeej 58:38a366236bda 256 {
Jeej 58:38a366236bda 257 // bit access fields
Jeej 58:38a366236bda 258 struct {
Jeej 58:38a366236bda 259 /// RFU
Jeej 58:38a366236bda 260 uint8_t rfu : 4;
Jeej 58:38a366236bda 261 /// Identifier type of the received segment
Jeej 58:38a366236bda 262 uint8_t idf : 2;
Jeej 58:38a366236bda 263 /// Current seqnum was already received
Jeej 58:38a366236bda 264 uint8_t retry : 1;
Jeej 58:38a366236bda 265 /// There are not received seqnums anterior to the current seqnum
Jeej 58:38a366236bda 266 uint8_t missed : 1;
Jeej 58:38a366236bda 267 } bf;
Jeej 58:38a366236bda 268
Jeej 58:38a366236bda 269 // byte access
Jeej 58:38a366236bda 270 uint8_t byte;
Jeej 58:38a366236bda 271
Jeej 58:38a366236bda 272 } d7a_sp_status_t;
Jeej 58:38a366236bda 273
Jeej 58:38a366236bda 274 // =======================================================================
Jeej 58:38a366236bda 275 // d7a_nwl_security_t
Jeej 58:38a366236bda 276 // -----------------------------------------------------------------------
Jeej 58:38a366236bda 277 /// NWL Security File structure
Jeej 58:38a366236bda 278 // =======================================================================
Jeej 58:38a366236bda 279 TYPEDEF_STRUCT_PACKED
Jeej 58:38a366236bda 280 {
Jeej 58:38a366236bda 281 /// Key counter
Jeej 58:38a366236bda 282 uint8_t key_counter;
Jeej 58:38a366236bda 283 /// Frame counter
Jeej 58:38a366236bda 284 uint32_t frame_counter;
Jeej 58:38a366236bda 285
Jeej 58:38a366236bda 286 } d7a_nwl_security_t;
Jeej 58:38a366236bda 287
Jeej 58:38a366236bda 288
Jeej 58:38a366236bda 289 // =======================================================================
Jeej 58:38a366236bda 290 // d7a_sp_res_t
Jeej 58:38a366236bda 291 // -----------------------------------------------------------------------
Jeej 58:38a366236bda 292 /// D7A specific segment metadata
Jeej 58:38a366236bda 293 // =======================================================================
Jeej 58:38a366236bda 294 TYPEDEF_STRUCT_PACKED
Jeej 58:38a366236bda 295 {
Jeej 58:38a366236bda 296 /// channel header
Jeej 58:38a366236bda 297 d7a_ch_header_t header;
Jeej 58:38a366236bda 298 /// channel index
Jeej 58:38a366236bda 299 uint16_t idx;
Jeej 58:38a366236bda 300 /// RSSI in -dBm
Jeej 58:38a366236bda 301 int8_t rxlev;
Jeej 58:38a366236bda 302 /// Link budget in dB
Jeej 58:38a366236bda 303 int8_t lb;
Jeej 58:38a366236bda 304 /// Target RXLEV in -dBm
Jeej 58:38a366236bda 305 int8_t target_rxlev;
Jeej 58:38a366236bda 306 /// D7ASP status
Jeej 58:38a366236bda 307 d7a_sp_status_t status;
Jeej 58:38a366236bda 308 /// D7ASP Token
Jeej 58:38a366236bda 309 uint8_t token;
Jeej 58:38a366236bda 310 /// D7ASP Sequence number
Jeej 58:38a366236bda 311 uint8_t seq;
Jeej 58:38a366236bda 312 /// Response timeout
Jeej 58:38a366236bda 313 uint32_t resp_to;
Jeej 58:38a366236bda 314 /// Addressee
Jeej 58:38a366236bda 315 d7a_addressee_t addressee;
Jeej 58:38a366236bda 316 /// NLS security state (optional)
Jeej 58:38a366236bda 317 d7a_nwl_security_t nls_state;
Jeej 58:38a366236bda 318
Jeej 58:38a366236bda 319 } d7a_sp_res_t;
Jeej 58:38a366236bda 320
Jeej 58:38a366236bda 321
Jeej 58:38a366236bda 322
Jeej 59:b42eae56b51b 323 d7a_errors_t d7a_alp_open(UnsolicitedMsgFunction uns_msg);
Jeej 56:da34fc11e760 324 d7a_errors_t d7a_alp_close(void);
Jeej 43:28202405094d 325 void d7a_alp_new_pkt(d7a_com_rx_msg_t* pkt);
Jeej 43:28202405094d 326 d7a_com_rx_msg_t* d7a_alp_wait_pkt(uint32_t millisec = osWaitForever);
Jeej 59:b42eae56b51b 327 void d7a_alp_free_msg(d7a_msg_t* msg);
Jeej 58:38a366236bda 328 d7a_msg_t** d7a_alp_write_file(const uint8_t file_id, const uint32_t offset, const uint32_t size, const uint8_t* const buf, d7a_addressee_t* addressee = NULL, uint8_t retry = 0, bool resp = true);
Jeej 58:38a366236bda 329 d7a_msg_t** d7a_alp_read_file(const uint8_t file_id, const uint32_t offset, const uint32_t size, d7a_addressee_t* addressee = NULL, uint8_t retry = 0);
Jeej 43:28202405094d 330
Jeej 43:28202405094d 331 #endif // _D7A_ALP_H_