wayne roberts / Mbed OS lora_mesh

Dependencies:   sx12xx_hal

Committer:
Wayne Roberts
Date:
Tue Dec 03 09:48:53 2019 -0800
Revision:
0:6015834e4279
initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Wayne Roberts 0:6015834e4279 1 #include "radio.h"
Wayne Roberts 0:6015834e4279 2
Wayne Roberts 0:6015834e4279 3
Wayne Roberts 0:6015834e4279 4 //#define GATEWAY
Wayne Roberts 0:6015834e4279 5
Wayne Roberts 0:6015834e4279 6 //#define MESH_DEBUG
Wayne Roberts 0:6015834e4279 7
Wayne Roberts 0:6015834e4279 8 #define DISCOVERY_ANS_LENGTH 13
Wayne Roberts 0:6015834e4279 9 #define ANS_PAD_MS 5
Wayne Roberts 0:6015834e4279 10
Wayne Roberts 0:6015834e4279 11 #define ANS_SIZE_BYTE 9 /* */
Wayne Roberts 0:6015834e4279 12
Wayne Roberts 0:6015834e4279 13 #define RETRY_LIMIT 5 /* maximum count of reqest retries until giving up */
Wayne Roberts 0:6015834e4279 14 /********************************************************/
Wayne Roberts 0:6015834e4279 15
Wayne Roberts 0:6015834e4279 16 #define SPREADING_FACTOR 8
Wayne Roberts 0:6015834e4279 17 #ifdef SX128x_H
Wayne Roberts 0:6015834e4279 18 #define CF_MHZ 2487.0
Wayne Roberts 0:6015834e4279 19 #define BW_KHZ 400
Wayne Roberts 0:6015834e4279 20 #define TX_DBM 12
Wayne Roberts 0:6015834e4279 21 #else
Wayne Roberts 0:6015834e4279 22 #define CF_MHZ 917.6
Wayne Roberts 0:6015834e4279 23 #define BW_KHZ 500
Wayne Roberts 0:6015834e4279 24 #define TX_DBM 17
Wayne Roberts 0:6015834e4279 25 #endif
Wayne Roberts 0:6015834e4279 26
Wayne Roberts 0:6015834e4279 27 #define SP_US ((1<<SPREADING_FACTOR) / (BW_KHZ/1000.0))
Wayne Roberts 0:6015834e4279 28 #define N_PRE_SYMB (((WAKEUP_INTERVAL_MS * 1000) / SP_US) + 8)
Wayne Roberts 0:6015834e4279 29
Wayne Roberts 0:6015834e4279 30 #define N_DISCOVERY_ANS 180 // enough time slots for randomized collision avoidance
Wayne Roberts 0:6015834e4279 31 #define N_HALF_DISCOVERY_ANS (N_DISCOVERY_ANS / 2)
Wayne Roberts 0:6015834e4279 32
Wayne Roberts 0:6015834e4279 33 #define WAKEUP_INTERVAL_MS 1000
Wayne Roberts 0:6015834e4279 34 #define CHANNEL_VACANT_REQUIRED_COUNT 3
Wayne Roberts 0:6015834e4279 35
Wayne Roberts 0:6015834e4279 36 #define ID_NONE 0x00000000
Wayne Roberts 0:6015834e4279 37 #define ANY_ID 0xffffffff
Wayne Roberts 0:6015834e4279 38
Wayne Roberts 0:6015834e4279 39 typedef enum {
Wayne Roberts 0:6015834e4279 40 /* 0 */ CMD_UNUSED = 0,
Wayne Roberts 0:6015834e4279 41 /* 1 */ CMD_ANS,
Wayne Roberts 0:6015834e4279 42 /* 2 */ CMD_DISCOVERY_REQ,
Wayne Roberts 0:6015834e4279 43 /* 3 */ CMD_DISCOVERY_ANS,
Wayne Roberts 0:6015834e4279 44 /* 4 */ CMD_ATTACH_REQ,
Wayne Roberts 0:6015834e4279 45 /* 5 */ CMD_USER_PAYLOAD_UP_REQ,
Wayne Roberts 0:6015834e4279 46 /* 6 */ CMD_USER_PAYLOAD_DN_REQ,
Wayne Roberts 0:6015834e4279 47 /* 7 */ CMD_NEW_DEVICE_ATTACHED_REQ,
Wayne Roberts 0:6015834e4279 48 /* 8 */ CMD_REMOVE_DEVICE_REQ,
Wayne Roberts 0:6015834e4279 49 /* 9 */ CMD_DOWNSTREAM_NOT_RESPONDING,
Wayne Roberts 0:6015834e4279 50 } cmd_e;
Wayne Roberts 0:6015834e4279 51
Wayne Roberts 0:6015834e4279 52 typedef enum {
Wayne Roberts 0:6015834e4279 53 /* 0 */ NOT_ANSWERING = 0,
Wayne Roberts 0:6015834e4279 54 /* 1 */ ANSWER_OK,
Wayne Roberts 0:6015834e4279 55 /* 2 */ ANSWER_BUSY,
Wayne Roberts 0:6015834e4279 56 /* 3 */ ANSWER_UNATTACHED,
Wayne Roberts 0:6015834e4279 57 } ans_e;
Wayne Roberts 0:6015834e4279 58
Wayne Roberts 0:6015834e4279 59 typedef union {
Wayne Roberts 0:6015834e4279 60 struct {
Wayne Roberts 0:6015834e4279 61 uint8_t currentOp : 5; // 0,1,2,3,4
Wayne Roberts 0:6015834e4279 62 uint8_t txAns : 3; // 5,6,7
Wayne Roberts 0:6015834e4279 63 } bits;
Wayne Roberts 0:6015834e4279 64 uint16_t octet;
Wayne Roberts 0:6015834e4279 65 } reqflags_t;
Wayne Roberts 0:6015834e4279 66 extern reqflags_t reqFlags;
Wayne Roberts 0:6015834e4279 67
Wayne Roberts 0:6015834e4279 68 typedef struct {
Wayne Roberts 0:6015834e4279 69 uint8_t discoverAnswering : 1; // 0
Wayne Roberts 0:6015834e4279 70 uint8_t sending_req : 1; // 1
Wayne Roberts 0:6015834e4279 71 uint8_t firstDiscoverAns : 1; // 2
Wayne Roberts 0:6015834e4279 72 uint8_t CallTXRequest : 1; // 3
Wayne Roberts 0:6015834e4279 73 uint8_t unused : 1; // 4
Wayne Roberts 0:6015834e4279 74 uint8_t getAns : 1; // 5
Wayne Roberts 0:6015834e4279 75 uint8_t vacantCheck : 1; // 6
Wayne Roberts 0:6015834e4279 76 uint8_t deferred_send : 1; // 7
Wayne Roberts 0:6015834e4279 77 } flags_t;
Wayne Roberts 0:6015834e4279 78
Wayne Roberts 0:6015834e4279 79 extern volatile flags_t flags;
Wayne Roberts 0:6015834e4279 80
Wayne Roberts 0:6015834e4279 81 typedef struct local lid_list_t;
Wayne Roberts 0:6015834e4279 82 typedef struct children cid_list_t;
Wayne Roberts 0:6015834e4279 83
Wayne Roberts 0:6015834e4279 84 struct children {
Wayne Roberts 0:6015834e4279 85 uint32_t id;
Wayne Roberts 0:6015834e4279 86 children* next;
Wayne Roberts 0:6015834e4279 87 };
Wayne Roberts 0:6015834e4279 88
Wayne Roberts 0:6015834e4279 89 struct local {
Wayne Roberts 0:6015834e4279 90 uint32_t id; // device directly attached
Wayne Roberts 0:6015834e4279 91 children* attachedList; // devices attached to id
Wayne Roberts 0:6015834e4279 92 local* next;
Wayne Roberts 0:6015834e4279 93 };
Wayne Roberts 0:6015834e4279 94
Wayne Roberts 0:6015834e4279 95 struct _fwd_ {
Wayne Roberts 0:6015834e4279 96 uint8_t buf[247];
Wayne Roberts 0:6015834e4279 97 int len;
Wayne Roberts 0:6015834e4279 98 uint32_t A_id;
Wayne Roberts 0:6015834e4279 99 uint32_t B_id;
Wayne Roberts 0:6015834e4279 100 uint32_t tx_dest_id; // pkt destination
Wayne Roberts 0:6015834e4279 101 };
Wayne Roberts 0:6015834e4279 102 extern struct _fwd_ fwd;
Wayne Roberts 0:6015834e4279 103
Wayne Roberts 0:6015834e4279 104 struct _nr_ {
Wayne Roberts 0:6015834e4279 105 uint32_t reporting_id;
Wayne Roberts 0:6015834e4279 106 uint32_t device_not_respoding_id;
Wayne Roberts 0:6015834e4279 107 };
Wayne Roberts 0:6015834e4279 108 extern struct _nr_ notResponding;
Wayne Roberts 0:6015834e4279 109
Wayne Roberts 0:6015834e4279 110 /* from main.cpp: */
Wayne Roberts 0:6015834e4279 111 #define HFG_UNATTACHED 0xff
Wayne Roberts 0:6015834e4279 112 #ifdef GATEWAY
Wayne Roberts 0:6015834e4279 113 extern const uint8_t hops_from_gateway;
Wayne Roberts 0:6015834e4279 114 #else
Wayne Roberts 0:6015834e4279 115 extern uint8_t hops_from_gateway;
Wayne Roberts 0:6015834e4279 116 #endif
Wayne Roberts 0:6015834e4279 117 extern EventQueue queue;
Wayne Roberts 0:6015834e4279 118 extern RawSerial pc;
Wayne Roberts 0:6015834e4279 119 extern char pcbuf[64]; /* local user terminal */
Wayne Roberts 0:6015834e4279 120 extern uint32_t my_id;
Wayne Roberts 0:6015834e4279 121 extern unsigned discovery_ans_time_step_us;
Wayne Roberts 0:6015834e4279 122 extern unsigned discovery_ans_time_total_us;
Wayne Roberts 0:6015834e4279 123 void setPreambleSize(bool wakesize, uint8_t by);
Wayne Roberts 0:6015834e4279 124 uint32_t getu32FromBuf(const uint8_t* in);
Wayne Roberts 0:6015834e4279 125 void putu32ToBuf(uint8_t* out, uint32_t v);
Wayne Roberts 0:6015834e4279 126 void putu16ToBuf(uint8_t* out, uint16_t v);
Wayne Roberts 0:6015834e4279 127 uint16_t getu16FromBuf(const uint8_t* in);
Wayne Roberts 0:6015834e4279 128 uint16_t crc16( uint8_t *buffer, uint16_t length );
Wayne Roberts 0:6015834e4279 129 void txBuf_send(bool sendingReq);
Wayne Roberts 0:6015834e4279 130 bool remove_directlyAttached_device(uint32_t id);
Wayne Roberts 0:6015834e4279 131 void remove_childDevice(uint32_t id, uint32_t* attachedTo);
Wayne Roberts 0:6015834e4279 132 uint32_t find_dest_id(uint32_t reqid);
Wayne Roberts 0:6015834e4279 133 #ifdef MESH_DEBUG
Wayne Roberts 0:6015834e4279 134 int _rx_log_printf(const char *format, ...);
Wayne Roberts 0:6015834e4279 135 #endif /* MESH_DEBUG */
Wayne Roberts 0:6015834e4279 136 extern uint32_t tx_dest_id;
Wayne Roberts 0:6015834e4279 137 extern uint8_t txBuf[];
Wayne Roberts 0:6015834e4279 138 extern uint8_t txBuf_idx;
Wayne Roberts 0:6015834e4279 139 extern uint16_t dbg_plCur;
Wayne Roberts 0:6015834e4279 140 extern uint8_t dbg_plSetBy;
Wayne Roberts 0:6015834e4279 141 extern const char* const cmdStrs[];
Wayne Roberts 0:6015834e4279 142 void start_periodic_rxing(uint8_t by);
Wayne Roberts 0:6015834e4279 143
Wayne Roberts 0:6015834e4279 144 /* radio specific */
Wayne Roberts 0:6015834e4279 145 void radio_print_status(void);
Wayne Roberts 0:6015834e4279 146 void cmd_op(uint8_t);
Wayne Roberts 0:6015834e4279 147 void radio_printOpMode(void);
Wayne Roberts 0:6015834e4279 148 bool isRadioRxing(void);
Wayne Roberts 0:6015834e4279 149
Wayne Roberts 0:6015834e4279 150 #ifndef GATEWAY
Wayne Roberts 0:6015834e4279 151 /* upstream interface */
Wayne Roberts 0:6015834e4279 152 extern uint32_t id_newDeviceNotification;
Wayne Roberts 0:6015834e4279 153 typedef struct {
Wayne Roberts 0:6015834e4279 154 uint32_t id, cnt;
Wayne Roberts 0:6015834e4279 155 int preference;
Wayne Roberts 0:6015834e4279 156 uint8_t hfg;
Wayne Roberts 0:6015834e4279 157 } upstream_t;
Wayne Roberts 0:6015834e4279 158 extern upstream_t attUp;
Wayne Roberts 0:6015834e4279 159 void upstream_init(void);
Wayne Roberts 0:6015834e4279 160 void discovery_rx_end(void);
Wayne Roberts 0:6015834e4279 161 void upstream_print_status(void);
Wayne Roberts 0:6015834e4279 162 int uplink(const uint8_t* userPayload, uint8_t userPayloadSize);
Wayne Roberts 0:6015834e4279 163 void upstream_new_device_notify(void);
Wayne Roberts 0:6015834e4279 164 void upstream_ans_rxDoneCB(float rssi, float snr, uint8_t* idx, uint32_t, uint8_t);
Wayne Roberts 0:6015834e4279 165 #endif /* !GATEWAY */
Wayne Roberts 0:6015834e4279 166 void upstream_req_rxDoneCB(float rssi, float snr, uint8_t* idx, uint32_t, uint8_t);
Wayne Roberts 0:6015834e4279 167 void upstream_signal_check(float rssi, float snr, uint8_t rx_hfg, uint32_t rx_id);
Wayne Roberts 0:6015834e4279 168 void init_attached_upstream(void);
Wayne Roberts 0:6015834e4279 169 void upstream_attached_check(uint32_t);
Wayne Roberts 0:6015834e4279 170
Wayne Roberts 0:6015834e4279 171 /* downstream interface */
Wayne Roberts 0:6015834e4279 172 struct remove {
Wayne Roberts 0:6015834e4279 173 uint32_t destID;
Wayne Roberts 0:6015834e4279 174 uint32_t removeID;
Wayne Roberts 0:6015834e4279 175 };
Wayne Roberts 0:6015834e4279 176 extern struct remove downRemove;
Wayne Roberts 0:6015834e4279 177 extern lid_list_t* attachedDevices;
Wayne Roberts 0:6015834e4279 178 #ifdef GATEWAY
Wayne Roberts 0:6015834e4279 179 typedef struct {
Wayne Roberts 0:6015834e4279 180 uint8_t len;
Wayne Roberts 0:6015834e4279 181 uint32_t originating_src_id;
Wayne Roberts 0:6015834e4279 182 uint8_t rxBufIdx;
Wayne Roberts 0:6015834e4279 183 } upInfo_t;
Wayne Roberts 0:6015834e4279 184 void downstream_req_rxDoneCB(float rssi, float snr, uint8_t* idx, uint32_t, uint8_t, upInfo_t*);
Wayne Roberts 0:6015834e4279 185 #else
Wayne Roberts 0:6015834e4279 186 void downstream_req_rxDoneCB(float rssi, float snr, uint8_t* idx, uint32_t, uint8_t);
Wayne Roberts 0:6015834e4279 187 #endif
Wayne Roberts 0:6015834e4279 188 void downstream_ans_rxDoneCB(float rssi, float snr, uint8_t* idx, uint32_t, uint8_t);
Wayne Roberts 0:6015834e4279 189 void request_remove_device(void);
Wayne Roberts 0:6015834e4279 190
Wayne Roberts 0:6015834e4279 191
Wayne Roberts 0:6015834e4279 192 void cmd_downlink(uint8_t argsAt);
Wayne Roberts 0:6015834e4279 193
Wayne Roberts 0:6015834e4279 194 /* application layer: */
Wayne Roberts 0:6015834e4279 195 void app_init(void);
Wayne Roberts 0:6015834e4279 196 void gateway_uplink(uint8_t len, uint32_t, const uint8_t* payload); /* uplink handler */
Wayne Roberts 0:6015834e4279 197 void app_downlink(uint8_t len, const uint8_t* payload); /* downlink handler */
Wayne Roberts 0:6015834e4279 198 void app_uplink_complete(void);
Wayne Roberts 0:6015834e4279 199
Wayne Roberts 0:6015834e4279 200 #ifdef MESH_DEBUG
Wayne Roberts 0:6015834e4279 201 #define Mdbg_printf(fmt, ...) pc.printf((fmt), ##__VA_ARGS__)
Wayne Roberts 0:6015834e4279 202 #define mdbg_putc(x) pc.putc(x)
Wayne Roberts 0:6015834e4279 203 #define Rx_log_printf(fmt, ...) _rx_log_printf((fmt), ##__VA_ARGS__)
Wayne Roberts 0:6015834e4279 204 #else
Wayne Roberts 0:6015834e4279 205 #define Mdbg_printf(fmt, ...)
Wayne Roberts 0:6015834e4279 206 #define mdbg_putc(x)
Wayne Roberts 0:6015834e4279 207 #define Rx_log_printf(fmt, ...)
Wayne Roberts 0:6015834e4279 208 #endif
Wayne Roberts 0:6015834e4279 209