NetBurner 3.5.6
PDF Version
nbWifiDriver.h
1/*NB_REVISION*/
2
3/*NB_COPYRIGHT*/
4
9#ifndef __NBWIFIDRIVER_H
10#define __NBWIFIDRIVER_H
11
12#include <buffers.h>
13#include <nettypes.h>
14#include <netinterface.h>
15#include <constants.h>
16#include <utils.h>
17#include <wifi/wifiDriver.h>
18#include <wifi/nbWifiConstants.h>
19#include <wifi/nbwifi/nbWifiMsgStructs.h>
20
21#define WIFI_API_TASK_PRIO WIFI_RX_TASK_BASE_PRIO + MAX_WIFI_INTERFACES
22#define MAX_OPTION_TABLES 256 // options have an 8-bit table id
23#define WIFI_MAX_QUEUED_BUFFERS 8
24#define WIFI_RX_MIN_BUFFER_THRESHHOLD 20
25#define WIFI_INIT_BAUDRATE 230400
26#define WIFI_RX_DELAY (TICKS_PER_SECOND / 4)
27#define WIFI_PEND_TIMEOUT (TICKS_PER_SECOND / 2)
28#define WIFI_UPDATE_MAX_PAYLOAD \
29 (ETH_MAX_SIZE - sizeof(NB::NBWifiAPIMessage::Header::APIRequest) - sizeof(NB::NBWifiAPIMessage::Request::FirmwareChunk))
30
31#define WIFI_SERIAL_SYNC_SEQ "a\x1B\x0B"
32#define TOKEN_FIRST 'a'
33#define TOKEN_MID '\x1B'
34#define TOKEN_LAST '\x0B'
35#define TOKEN_FIRST_COUNT 3
36#define TOKEN_MID_COUNT 2
37#define TOKEN_LAST_COUNT 1
38
39#define MAX_PENDING_COMMANDS 5
40#define READ_ERROR_LIMIT 5
41#define READ_CREDIT_REPORT_THRESHOLD 8
42#define REQUEST_CREDIT_REPORT_THRESHOLD 4
43
44#ifndef _STRUCT_PACKED
45#define _STRUCT_PACKED __attribute__((__packed__))
46#endif
47
48typedef void (*ReceiveScanResultFunc)(const nbWifiScanResult &ap);
49
50extern void SetWifiSPISpeed(int);
51
52namespace NB
53{
54
55class NBWifi : public Wifi
56{
57 private:
58 /* ---- Private Structure definitions ---- */
59 struct busWait
60 {
61 OS_MBOX mbox;
62 uint8_t error;
63 uint32_t code;
64 };
65
66 struct responseWaiter
67 {
68 bool valid;
69 uint8_t requestType;
70 uint8_t commandID;
71 OS_MBOX *pMbox;
72 };
73
74 struct commandsWaitingResponseStruct
75 {
76 int lastKnownFree;
77 responseWaiter waitList[MAX_PENDING_COMMANDS];
78 };
79 /* ---- End Private Structure definitions ---- */
80
81 /* ---- Data members ---- */
82 volatile uint8_t currentCommandID;
83
84 volatile bool waitingForStatus;
85 OS_MBOX statusMailbox;
86 OS_SEM startupSem;
87 commandsWaitingResponseStruct commandsWaitingResponse;
88 PoolPtr options[MAX_OPTION_TABLES];
89 PoolPtr connectConfigBuf;
90
91 char hardwareTypeOverflow[MAX_HARDWARE_TYPE_LENGTH + 1]; // <- this must follow the device info struct
92 // it is extra space for a nullbyte for full length strings
93 uint32_t slaveFirmwareOffset; // used when updating slave firmware
94 bool slaveUpdateReady;
95 /* ---- End Data members ---- */
96
97 /* ---- Constructors ---- */
98 NBWifi();
99 NBWifi(const NBWifi &rhs);
100 /* ---- End Constructors ---- */
101
102 /* ---- Private methods ---- */
103
104 bool ProcessInternal(PoolPtr messageBuffer, NB::NBWifiAPIMessage::Internal::InternalTypes internalType);
105
106 void SendReconnectRequest();
107
108 bool ProcessRequest(PoolPtr messageBuffer, uint8_t requestType);
109 bool ProcessResponse(PoolPtr messageBuffer, uint8_t responseType);
110 bool ProcessResponseID(PoolPtr messageBuffer);
111 bool ProcessScanResult(PoolPtr messageBuffer);
112 bool ProcessStatus(PoolPtr messageBuffer);
113 bool ProcessDeviceInfo(PoolPtr messageBuffer);
114 bool ProcessOptionTableResponse(PoolPtr messageBuffer);
115
116 bool ProcessCreditReport(PoolPtr messageBuffer);
117
118 bool DevFWSupported();
119
120 int AddWaitingCommand(uint8_t requestType, uint8_t commandID, OS_MBOX *pmbox);
121 void RemoveWaitingCommand(uint8_t commandID);
122 int ReadyInterface();
123
124 void RetrieveOptionTable(uint8_t tableNum);
125 void RetrieveAllOptionTables();
126
127 PoolPtr GetNetworkStatus();
128 PoolPtr GetDeviceInformation();
129 /* ---- End Private methods ---- */
130
131 protected:
132 typedef enum
133 {
134 State_NotRegistered = 0,
135 State_TaskNotRunning = 1,
136 State_NoDevice = 2, // Beginning driver initialization
137 State_NoInfo = 3, //
138 State_InvalidDevice = 4, // Unsupported device or firmware, halting
139 State_NoOptions = 5, //
140 State_NotConfigured = 6, // Driver initialized
141 State_NotConnected = 7, //
142 State_Connected = 8, // Connection established
143 State_Reconnecting = 9, // Attempting to reconnect to last successful AP connection. Disconnected due to host triggering a chipset
144 // reset due to detecting a crash
145 } DriverState;
146
147 static OS_FIFO WifiAPIRxFifo;
148
149 int myInterfaceNumber;
150 OS_SEM taskPauseSem;
151 OS_FIFO BusMsgFifo;
152 OS_FIFO BufferTxFifo;
153 uint32_t lastCreditCheckTick;
154 bool creditReportQueued;
155 bool creditReporting;
156 bool slaveHalted;
157 uint32_t lastReportTick;
158 NBWifiAPIMessage::Response::DeviceInfo devInfo;
159 DriverState currentState;
160
161 ReceiveScanResultFunc pfScanResultsCallback;
162 volatile bool bHardwareDetected;
163 bool scanActive;
164 uint8_t availableCredits;
165 uint16_t pendingTxBuffers;
166 uint8_t rxTaskID;
167 OS_CRIT creditCheckCrit;
168 OS_CRIT commandsWaitingCrit;
169 OS_CRIT networkStatusCrit;
170 OS_CRIT bufferTxFifoCrit;
171
172 static uint32_t DriverStk[MAX_WIFI_INTERFACES][WIFI_TASK_STACK_SIZE];
173 static uint32_t APITaskStk[WIFI_TASK_STACK_SIZE];
174
175 NBWifi(CommBus busType, int resetPinConnector, int resetPinMum, const char *name);
176 ~NBWifi();
177
178 void SendBusMessage(PoolPtr txMessage, bool waitForCredits = true);
179 virtual void SendBusMessage_Core(PoolPtr txMessage) = 0;
180 virtual void RXTask() = 0;
181 int RegisterDriver();
182 uint8_t GetNextCommandID();
183 void PushRXCreditReport(PoolPtr pp);
184 void PushPayloadCreditReport(PoolPtr &pp);
185 void ExternalReconnect(PoolPtr configMsg);
186 void InternalReset();
187
188 public:
189 static void RXTaskLauncher(void *wifiDriverObj);
190 static void APITask(void *throwaway);
191
192 // static functions for use with interface blocks
193 static void TransmitBuffer_0(PoolPtr txBuffer);
194 static void TransmitBuffer_1(PoolPtr txBuffer);
195 static void kill_0();
196 static void kill_1();
197 static BOOL linkActive_0();
198 static BOOL linkActive_1();
199 static void enab_multicast_0(MACADR macAddress, BOOL addAddress);
200 static void enab_multicast_1(MACADR macAddress, BOOL addAddress);
201
202 void TransmitBuffer(PoolPtr txBuffer);
203 virtual void TransmitBuffer_Core(PoolPtr txBuffer, uint8_t credits) = 0;
204 void enab_multicast(MACADR macAddress, BOOL addAddress);
205
206 // APITask control methods
207 int APIStart();
208 static int APIStartTask();
209 static void APIPause();
210 static void APIResume();
211 static void APIKill();
212
213 // RXTask control methods
214 int Start();
215 void Pause();
216 void Resume();
217 void Kill();
218
219 bool isRegistered() const;
220 int GetWifiInterfaceNumber() const;
221
222 // @deprecated This function is now deprecated. Please see GetInterfaceName() for current
223 [[deprecated]] int GetSystemInterfaceNumber() const;
224
225 // WLAN manipulation and statistics functions
226 int ConnectWithOptions(const char *ssid = nullptr,
227 const char *passwd = "",
228 uint8_t retryCount = CONNECT_RETRIES,
229 uint8_t optionCount = 0,
230 uint16_t *optionList = nullptr,
231 uint8_t ssidLen = 0);
232
233 int ConnectToAP(const char *ssid = nullptr, const char *passwd = "", uint8_t retryCount = CONNECT_RETRIES);
234
235 int StartAP(const char *ssid = nullptr,
236 const char *passwd = "",
237 uint8_t channel = DEFAULT_TABLE_LABEL_CHANNEL,
238 uint8_t security = DEFAULT_TABLE_LABEL_SEC,
239 uint8_t cipher = DEFAULT_TABLE_LABEL_CIPH,
240 uint8_t ssidLen = 0) override;
241
242 int StartConfigAP(uint8_t channel = DEFAULT_TABLE_LABEL_CHANNEL) override;
243
244 void Disconnect() override;
245
246 // Results of Scan are valid until the next call to 'Scan' or 'FreeScanList'
247 nbWifiScanResult *Scan(const char *ssid = nullptr, uint8_t optionCount = 0, uint16_t *optionList = nullptr) override;
248 void FreeScanList();
249
250 int StartAsyncScan(ReceiveScanResultFunc pfCallbackFunc,
251 const char *ssid = nullptr,
252 uint8_t optionCount = 0,
253 uint16_t *optionList = nullptr);
254
255 void StopAsyncScan();
256
257 // Status functions:
258 int GetCurSSID(char *buf, int maxlen) override;
259 MACADR GetCurBSSID() override;
260 void GetCurrentAP(driverStatusStruct *ap) override;
261 void GetDeviceInformation(nbWifiDeviceInfo *ap) override;
262 bool Connected() override;
263 int GetSignalStrength() override;
264 int GetCurChannel() override;
265 int GetSecurity() override;
266 int GetCipher() override;
267 uint8_t GetAvailableCredits() { return availableCredits; };
268
269 // Utility Functions
270 int StoreSSIDPWToConfig(char *ssid, char *password, int ssidLen = 0) override;
271 int GetSSIDFromConfig(char *returnBuf, int maxLen) override;
272 int GetKeyFromConfig(char *returnBuf, int maxLen) override;
273
274 virtual void SendCreditRequest() = 0;
275 virtual void SendCreditReport(uint8_t credits = 0xFF) = 0;
276 void SetMAC(const MACADR *newMAC, bool waitForResponse = true);
277 int SetITUCountry(NB::ITU_Country::CountryCode_t country);
278 bool GetLinkStatus(); // does not perform a bus communication, fast
279 void Print();
280 int RenderPrintToJson(int fd);
281 bool UpdateSlaveFirmware(uint32_t imageLength, const uint8_t *imageBuffer) override;
282 bool ReadySlaveUpdate();
283 bool SendFirmwareChunk(uint32_t length, const uint8_t *data);
284 bool FinishedSendingFirmware(uint32_t length, const uint8_t *data);
285 virtual bool SetBusSpeed(uint32_t busSpeed) = 0;
286
287 friend void ::SetWifiSPISpeed(int busSpeed);
288 friend class Wifi;
289
290 int ConnectToAP(const char *ssid = nullptr,
291 const char *passwd = "",
292 uint8_t retryCount = CONNECT_RETRIES,
293 uint8_t security = DEFAULT_WIFI_SEC_ALL) override;
294 int ConnectToAP(nbWifiConnect connect) override;
295
296 bool DisplayOptionTable(uint8_t n);
297 void DisplayAllOptionTables();
298
299 static NB::Wifi *GetNewNBWifiSPIDriver();
300 static NB::Wifi *GetNewNBWifiSerialDriver();
301};
302} // namespace NB
303
304extern NB::Wifi *theWifiIntf;
305
306#endif /* ----- #ifndef __NBWIFIDRIVER_H ----- */
Used to store and manipulate MAC addresses.
Definition nettypes.h:69
int connect(const IPADDR &ipAddress, uint16_t remotePort, uint32_t timeout)
Establish a TCP connection to a remote host.
Definition tcp.h:1547
Main buffer structure for network and serial communication.
Definition buffers.h:90