Trond Enger / d7a_1x

Fork of d7a_1x by WizziLab

Committer:
Jeej
Date:
Mon Sep 12 16:36:09 2016 +0000
Revision:
58:38a366236bda
Parent:
56:da34fc11e760
Child:
59:b42eae56b51b
Broadcast.

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 45:b85384e7d825 143 TYPEDEF_STRUCT_PACKED
Jeej 45:b85384e7d825 144 {
Jeej 58:38a366236bda 145 // Tag
Jeej 58:38a366236bda 146 uint8_t s_tag;
Jeej 45:b85384e7d825 147 uint8_t tag;
Jeej 58:38a366236bda 148 // Status
Jeej 58:38a366236bda 149 uint8_t s_status;
Jeej 58:38a366236bda 150 d7a_alp_rsp_status_t status;
Jeej 58:38a366236bda 151 // IStatus
Jeej 58:38a366236bda 152 uint8_t s_istatus;
Jeej 58:38a366236bda 153 int8_t lb;
Jeej 58:38a366236bda 154 uint8_t id[D7A_UID_LEN];
Jeej 58:38a366236bda 155 // Data
Jeej 58:38a366236bda 156 uint32_t data_len;
Jeej 45:b85384e7d825 157 uint8_t* data;
Jeej 45:b85384e7d825 158 } d7a_alp_rsp_t;
Jeej 45:b85384e7d825 159
Jeej 46:665391110051 160 // =======================================================================
Jeej 46:665391110051 161 // d7a_ctf_t
Jeej 46:665391110051 162 // -----------------------------------------------------------------------
Jeej 52:c7a58fc48bd2 163 // DLL compressed time format
Jeej 46:665391110051 164 // =======================================================================
Jeej 46:665391110051 165 typedef union
Jeej 46:665391110051 166 {
Jeej 46:665391110051 167 // bit access fields
Jeej 46:665391110051 168 struct {
Jeej 52:c7a58fc48bd2 169 // Mantissa
Jeej 46:665391110051 170 uint8_t mant : 5;
Jeej 52:c7a58fc48bd2 171 // Exponent
Jeej 46:665391110051 172 uint8_t exp : 3;
Jeej 46:665391110051 173 } bf;
Jeej 46:665391110051 174
Jeej 46:665391110051 175 // byte access
Jeej 46:665391110051 176 uint8_t byte;
Jeej 46:665391110051 177
Jeej 46:665391110051 178 } d7a_ctf_t;
Jeej 46:665391110051 179
Jeej 46:665391110051 180 // =======================================================================
Jeej 46:665391110051 181 // d7a_qos_t
Jeej 46:665391110051 182 // -----------------------------------------------------------------------
Jeej 52:c7a58fc48bd2 183 // Bitfield structure of the D7ASP Quality of Service control byte
Jeej 46:665391110051 184 // =======================================================================
Jeej 46:665391110051 185 typedef union
Jeej 46:665391110051 186 {
Jeej 46:665391110051 187 // bit access fields
Jeej 46:665391110051 188 struct {
Jeej 52:c7a58fc48bd2 189 // Response mode
Jeej 46:665391110051 190 uint8_t resp : 3;
Jeej 52:c7a58fc48bd2 191 // Retry mode
Jeej 46:665391110051 192 uint8_t retry : 3;
Jeej 52:c7a58fc48bd2 193 // Responder has to keep the ACK template (TPL status file)
Jeej 46:665391110051 194 uint8_t record : 1;
Jeej 52:c7a58fc48bd2 195 // Stop D7ASP on not acknowledged request
Jeej 46:665391110051 196 uint8_t stop_on_err : 1;
Jeej 46:665391110051 197
Jeej 46:665391110051 198 } bf;
Jeej 46:665391110051 199
Jeej 46:665391110051 200 // byte access
Jeej 46:665391110051 201 uint8_t byte;
Jeej 46:665391110051 202
Jeej 46:665391110051 203 } d7a_qos_t;
Jeej 46:665391110051 204
Jeej 46:665391110051 205 // =======================================================================
Jeej 46:665391110051 206 // d7a_sp_cfg_t
Jeej 46:665391110051 207 // -----------------------------------------------------------------------
Jeej 52:c7a58fc48bd2 208 // Structure of the D7ASP Configuration
Jeej 46:665391110051 209 // =======================================================================
Jeej 46:665391110051 210 TYPEDEF_STRUCT_PACKED
Jeej 46:665391110051 211 {
Jeej 52:c7a58fc48bd2 212 // D7ASP QoS
Jeej 46:665391110051 213 d7a_qos_t qos;
Jeej 52:c7a58fc48bd2 214 // Dormant Timeout (0, no timeout)
Jeej 46:665391110051 215 d7a_ctf_t dorm_to;
Jeej 52:c7a58fc48bd2 216 // Addressee
Jeej 46:665391110051 217 d7a_addressee_t addressee;
Jeej 46:665391110051 218
Jeej 46:665391110051 219 } d7a_sp_cfg_t;
Jeej 46:665391110051 220
Jeej 46:665391110051 221
Jeej 46:665391110051 222 // =======================================================================
Jeej 46:665391110051 223 // alp_d7a_itf_t
Jeej 46:665391110051 224 // -----------------------------------------------------------------------
Jeej 52:c7a58fc48bd2 225 // ALP/D7A Interface file TODO:should be in alp_d7a.h when/if it exists
Jeej 52:c7a58fc48bd2 226 // but not in alp.h as it requires D7A
Jeej 46:665391110051 227 // ====================================================================
Jeej 46:665391110051 228 TYPEDEF_STRUCT_PACKED {
Jeej 46:665391110051 229 uint8_t type;
Jeej 46:665391110051 230 d7a_sp_cfg_t cfg;
Jeej 46:665391110051 231 } alp_d7a_itf_t;
Jeej 46:665391110051 232
Jeej 46:665391110051 233
Jeej 58:38a366236bda 234 // =======================================================================
Jeej 58:38a366236bda 235 // d7a_ch_header_t
Jeej 58:38a366236bda 236 // -----------------------------------------------------------------------
Jeej 58:38a366236bda 237 /// Bitfield structure of the channel identifier
Jeej 58:38a366236bda 238 // =======================================================================
Jeej 58:38a366236bda 239 typedef union
Jeej 58:38a366236bda 240 {
Jeej 58:38a366236bda 241 // bit access fields
Jeej 58:38a366236bda 242 struct {
Jeej 58:38a366236bda 243 /// Coding scheme
Jeej 58:38a366236bda 244 uint8_t cs : 2;
Jeej 58:38a366236bda 245 /// Channel Class
Jeej 58:38a366236bda 246 uint8_t cl : 2;
Jeej 58:38a366236bda 247 /// Channel Band
Jeej 58:38a366236bda 248 uint8_t band : 3;
Jeej 58:38a366236bda 249 /// RFU
Jeej 58:38a366236bda 250 uint8_t rfu : 1;
Jeej 58:38a366236bda 251 } bf;
Jeej 58:38a366236bda 252
Jeej 58:38a366236bda 253 // byte access
Jeej 58:38a366236bda 254 uint8_t byte;
Jeej 58:38a366236bda 255
Jeej 58:38a366236bda 256 } d7a_ch_header_t;
Jeej 58:38a366236bda 257
Jeej 58:38a366236bda 258 // =======================================================================
Jeej 58:38a366236bda 259 // d7a_sp_status_t
Jeej 58:38a366236bda 260 // -----------------------------------------------------------------------
Jeej 58:38a366236bda 261 /// Bitfield structure of the D7ASP segment status byte
Jeej 58:38a366236bda 262 // =======================================================================
Jeej 58:38a366236bda 263 typedef union
Jeej 58:38a366236bda 264 {
Jeej 58:38a366236bda 265 // bit access fields
Jeej 58:38a366236bda 266 struct {
Jeej 58:38a366236bda 267 /// RFU
Jeej 58:38a366236bda 268 uint8_t rfu : 4;
Jeej 58:38a366236bda 269 /// Identifier type of the received segment
Jeej 58:38a366236bda 270 uint8_t idf : 2;
Jeej 58:38a366236bda 271 /// Current seqnum was already received
Jeej 58:38a366236bda 272 uint8_t retry : 1;
Jeej 58:38a366236bda 273 /// There are not received seqnums anterior to the current seqnum
Jeej 58:38a366236bda 274 uint8_t missed : 1;
Jeej 58:38a366236bda 275 } bf;
Jeej 58:38a366236bda 276
Jeej 58:38a366236bda 277 // byte access
Jeej 58:38a366236bda 278 uint8_t byte;
Jeej 58:38a366236bda 279
Jeej 58:38a366236bda 280 } d7a_sp_status_t;
Jeej 58:38a366236bda 281
Jeej 58:38a366236bda 282 // =======================================================================
Jeej 58:38a366236bda 283 // d7a_nwl_security_t
Jeej 58:38a366236bda 284 // -----------------------------------------------------------------------
Jeej 58:38a366236bda 285 /// NWL Security File structure
Jeej 58:38a366236bda 286 // =======================================================================
Jeej 58:38a366236bda 287 TYPEDEF_STRUCT_PACKED
Jeej 58:38a366236bda 288 {
Jeej 58:38a366236bda 289 /// Key counter
Jeej 58:38a366236bda 290 uint8_t key_counter;
Jeej 58:38a366236bda 291 /// Frame counter
Jeej 58:38a366236bda 292 uint32_t frame_counter;
Jeej 58:38a366236bda 293
Jeej 58:38a366236bda 294 } d7a_nwl_security_t;
Jeej 58:38a366236bda 295
Jeej 58:38a366236bda 296
Jeej 58:38a366236bda 297 // =======================================================================
Jeej 58:38a366236bda 298 // d7a_sp_res_t
Jeej 58:38a366236bda 299 // -----------------------------------------------------------------------
Jeej 58:38a366236bda 300 /// D7A specific segment metadata
Jeej 58:38a366236bda 301 // =======================================================================
Jeej 58:38a366236bda 302 TYPEDEF_STRUCT_PACKED
Jeej 58:38a366236bda 303 {
Jeej 58:38a366236bda 304 /// channel header
Jeej 58:38a366236bda 305 d7a_ch_header_t header;
Jeej 58:38a366236bda 306 /// channel index
Jeej 58:38a366236bda 307 uint16_t idx;
Jeej 58:38a366236bda 308 /// RSSI in -dBm
Jeej 58:38a366236bda 309 int8_t rxlev;
Jeej 58:38a366236bda 310 /// Link budget in dB
Jeej 58:38a366236bda 311 int8_t lb;
Jeej 58:38a366236bda 312 /// Target RXLEV in -dBm
Jeej 58:38a366236bda 313 int8_t target_rxlev;
Jeej 58:38a366236bda 314 /// D7ASP status
Jeej 58:38a366236bda 315 d7a_sp_status_t status;
Jeej 58:38a366236bda 316 /// D7ASP Token
Jeej 58:38a366236bda 317 uint8_t token;
Jeej 58:38a366236bda 318 /// D7ASP Sequence number
Jeej 58:38a366236bda 319 uint8_t seq;
Jeej 58:38a366236bda 320 /// Response timeout
Jeej 58:38a366236bda 321 uint32_t resp_to;
Jeej 58:38a366236bda 322 /// Addressee
Jeej 58:38a366236bda 323 d7a_addressee_t addressee;
Jeej 58:38a366236bda 324 /// NLS security state (optional)
Jeej 58:38a366236bda 325 d7a_nwl_security_t nls_state;
Jeej 58:38a366236bda 326
Jeej 58:38a366236bda 327 } d7a_sp_res_t;
Jeej 58:38a366236bda 328
Jeej 58:38a366236bda 329
Jeej 58:38a366236bda 330
Jeej 49:81d5bddb02f0 331 d7a_errors_t d7a_alp_open(void);
Jeej 56:da34fc11e760 332 d7a_errors_t d7a_alp_close(void);
Jeej 43:28202405094d 333 void d7a_alp_new_pkt(d7a_com_rx_msg_t* pkt);
Jeej 43:28202405094d 334 d7a_com_rx_msg_t* d7a_alp_wait_pkt(uint32_t millisec = osWaitForever);
Jeej 58:38a366236bda 335 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 336 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 337
Jeej 43:28202405094d 338 #endif // _D7A_ALP_H_