star-mesh LoRa network

Dependencies:   sx12xx_hal

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.h Source File

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