wayne roberts
/
lora_mesh
star-mesh LoRa network
Embed:
(wiki syntax)
Show/hide line numbers
main.h
00001 #include "radio.h" 00002 00003 00004 //#define GATEWAY 00005 00006 //#define MESH_DEBUG 00007 00008 #define DISCOVERY_ANS_LENGTH 13 00009 #define ANS_PAD_MS 5 00010 00011 #define ANS_SIZE_BYTE 9 /* */ 00012 00013 #define RETRY_LIMIT 5 /* maximum count of reqest retries until giving up */ 00014 /********************************************************/ 00015 00016 #define SPREADING_FACTOR 8 00017 #ifdef SX128x_H 00018 #define CF_MHZ 2487.0 00019 #define BW_KHZ 400 00020 #define TX_DBM 12 00021 #else 00022 #define CF_MHZ 917.6 00023 #define BW_KHZ 500 00024 #define TX_DBM 17 00025 #endif 00026 00027 #define SP_US ((1<<SPREADING_FACTOR) / (BW_KHZ/1000.0)) 00028 #define N_PRE_SYMB (((WAKEUP_INTERVAL_MS * 1000) / SP_US) + 8) 00029 00030 #define N_DISCOVERY_ANS 180 // enough time slots for randomized collision avoidance 00031 #define N_HALF_DISCOVERY_ANS (N_DISCOVERY_ANS / 2) 00032 00033 #define WAKEUP_INTERVAL_MS 1000 00034 #define CHANNEL_VACANT_REQUIRED_COUNT 3 00035 00036 #define ID_NONE 0x00000000 00037 #define ANY_ID 0xffffffff 00038 00039 typedef enum { 00040 /* 0 */ CMD_UNUSED = 0, 00041 /* 1 */ CMD_ANS, 00042 /* 2 */ CMD_DISCOVERY_REQ, 00043 /* 3 */ CMD_DISCOVERY_ANS, 00044 /* 4 */ CMD_ATTACH_REQ, 00045 /* 5 */ CMD_USER_PAYLOAD_UP_REQ, 00046 /* 6 */ CMD_USER_PAYLOAD_DN_REQ, 00047 /* 7 */ CMD_NEW_DEVICE_ATTACHED_REQ, 00048 /* 8 */ CMD_REMOVE_DEVICE_REQ, 00049 /* 9 */ CMD_DOWNSTREAM_NOT_RESPONDING, 00050 } cmd_e; 00051 00052 typedef enum { 00053 /* 0 */ NOT_ANSWERING = 0, 00054 /* 1 */ ANSWER_OK, 00055 /* 2 */ ANSWER_BUSY, 00056 /* 3 */ ANSWER_UNATTACHED, 00057 } ans_e; 00058 00059 typedef union { 00060 struct { 00061 uint8_t currentOp : 5; // 0,1,2,3,4 00062 uint8_t txAns : 3; // 5,6,7 00063 } bits; 00064 uint16_t octet; 00065 } reqflags_t; 00066 extern reqflags_t reqFlags; 00067 00068 typedef struct { 00069 uint8_t discoverAnswering : 1; // 0 00070 uint8_t sending_req : 1; // 1 00071 uint8_t firstDiscoverAns : 1; // 2 00072 uint8_t CallTXRequest : 1; // 3 00073 uint8_t unused : 1; // 4 00074 uint8_t getAns : 1; // 5 00075 uint8_t vacantCheck : 1; // 6 00076 uint8_t deferred_send : 1; // 7 00077 } flags_t; 00078 00079 extern volatile flags_t flags; 00080 00081 typedef struct local lid_list_t; 00082 typedef struct children cid_list_t; 00083 00084 struct children { 00085 uint32_t id; 00086 children* next; 00087 }; 00088 00089 struct local { 00090 uint32_t id; // device directly attached 00091 children* attachedList; // devices attached to id 00092 local* next; 00093 }; 00094 00095 struct _fwd_ { 00096 uint8_t buf[247]; 00097 int len; 00098 uint32_t A_id; 00099 uint32_t B_id; 00100 uint32_t tx_dest_id; // pkt destination 00101 }; 00102 extern struct _fwd_ fwd; 00103 00104 struct _nr_ { 00105 uint32_t reporting_id; 00106 uint32_t device_not_respoding_id; 00107 }; 00108 extern struct _nr_ notResponding; 00109 00110 /* from main.cpp: */ 00111 #define HFG_UNATTACHED 0xff 00112 #ifdef GATEWAY 00113 extern const uint8_t hops_from_gateway; 00114 #else 00115 extern uint8_t hops_from_gateway; 00116 #endif 00117 extern EventQueue queue; 00118 extern RawSerial pc; 00119 extern char pcbuf[64]; /* local user terminal */ 00120 extern uint32_t my_id; 00121 extern unsigned discovery_ans_time_step_us; 00122 extern unsigned discovery_ans_time_total_us; 00123 void setPreambleSize(bool wakesize, uint8_t by); 00124 uint32_t getu32FromBuf(const uint8_t* in); 00125 void putu32ToBuf(uint8_t* out, uint32_t v); 00126 void putu16ToBuf(uint8_t* out, uint16_t v); 00127 uint16_t getu16FromBuf(const uint8_t* in); 00128 uint16_t crc16( uint8_t *buffer, uint16_t length ); 00129 void txBuf_send(bool sendingReq); 00130 bool remove_directlyAttached_device(uint32_t id); 00131 void remove_childDevice(uint32_t id, uint32_t* attachedTo); 00132 uint32_t find_dest_id(uint32_t reqid); 00133 #ifdef MESH_DEBUG 00134 int _rx_log_printf(const char *format, ...); 00135 #endif /* MESH_DEBUG */ 00136 extern uint32_t tx_dest_id; 00137 extern uint8_t txBuf[]; 00138 extern uint8_t txBuf_idx; 00139 extern uint16_t dbg_plCur; 00140 extern uint8_t dbg_plSetBy; 00141 extern const char* const cmdStrs[]; 00142 void start_periodic_rxing(uint8_t by); 00143 00144 /* radio specific */ 00145 void radio_print_status(void); 00146 void cmd_op(uint8_t); 00147 void radio_printOpMode(void); 00148 bool isRadioRxing(void); 00149 00150 #ifndef GATEWAY 00151 /* upstream interface */ 00152 extern uint32_t id_newDeviceNotification; 00153 typedef struct { 00154 uint32_t id, cnt; 00155 int preference; 00156 uint8_t hfg; 00157 } upstream_t; 00158 extern upstream_t attUp; 00159 void upstream_init(void); 00160 void discovery_rx_end(void); 00161 void upstream_print_status(void); 00162 int uplink(const uint8_t* userPayload, uint8_t userPayloadSize); 00163 void upstream_new_device_notify(void); 00164 void upstream_ans_rxDoneCB(float rssi, float snr, uint8_t* idx, uint32_t, uint8_t); 00165 #endif /* !GATEWAY */ 00166 void upstream_req_rxDoneCB(float rssi, float snr, uint8_t* idx, uint32_t, uint8_t); 00167 void upstream_signal_check(float rssi, float snr, uint8_t rx_hfg, uint32_t rx_id); 00168 void init_attached_upstream(void); 00169 void upstream_attached_check(uint32_t); 00170 00171 /* downstream interface */ 00172 struct remove { 00173 uint32_t destID; 00174 uint32_t removeID; 00175 }; 00176 extern struct remove downRemove; 00177 extern lid_list_t* attachedDevices; 00178 #ifdef GATEWAY 00179 typedef struct { 00180 uint8_t len; 00181 uint32_t originating_src_id; 00182 uint8_t rxBufIdx; 00183 } upInfo_t; 00184 void downstream_req_rxDoneCB(float rssi, float snr, uint8_t* idx, uint32_t, uint8_t, upInfo_t*); 00185 #else 00186 void downstream_req_rxDoneCB(float rssi, float snr, uint8_t* idx, uint32_t, uint8_t); 00187 #endif 00188 void downstream_ans_rxDoneCB(float rssi, float snr, uint8_t* idx, uint32_t, uint8_t); 00189 void request_remove_device(void); 00190 00191 00192 void cmd_downlink(uint8_t argsAt); 00193 00194 /* application layer: */ 00195 void app_init(void); 00196 void gateway_uplink(uint8_t len, uint32_t, const uint8_t* payload); /* uplink handler */ 00197 void app_downlink(uint8_t len, const uint8_t* payload); /* downlink handler */ 00198 void app_uplink_complete(void); 00199 00200 #ifdef MESH_DEBUG 00201 #define Mdbg_printf(fmt, ...) pc.printf((fmt), ##__VA_ARGS__) 00202 #define mdbg_putc(x) pc.putc(x) 00203 #define Rx_log_printf(fmt, ...) _rx_log_printf((fmt), ##__VA_ARGS__) 00204 #else 00205 #define Mdbg_printf(fmt, ...) 00206 #define mdbg_putc(x) 00207 #define Rx_log_printf(fmt, ...) 00208 #endif 00209
Generated on Fri Jul 15 2022 20:28:20 by 1.7.2