Trond Enger / d7a_1x

Fork of d7a_1x by WizziLab

Committer:
Jeej
Date:
Fri Sep 23 15:00:41 2016 +0000
Revision:
59:b42eae56b51b
Parent:
58:38a366236bda
Child:
63:afd046faedb0
Optimized ALP parsing

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