9#ifndef __NBWIFIDRIVER_H
10#define __NBWIFIDRIVER_H
14#include <netinterface.h>
17#include <wifi/wifiDriver.h>
18#include <wifi/nbWifiConstants.h>
19#include <wifi/nbwifi/nbWifiMsgStructs.h>
21#define WIFI_API_TASK_PRIO WIFI_RX_TASK_BASE_PRIO + MAX_WIFI_INTERFACES
22#define MAX_OPTION_TABLES 256
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))
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
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
45#define _STRUCT_PACKED __attribute__((__packed__))
48typedef void (*ReceiveScanResultFunc)(
const nbWifiScanResult &ap);
50extern void SetWifiSPISpeed(
int);
55class NBWifi :
public Wifi
74 struct commandsWaitingResponseStruct
77 responseWaiter waitList[MAX_PENDING_COMMANDS];
82 volatile uint8_t currentCommandID;
84 volatile bool waitingForStatus;
85 OS_MBOX statusMailbox;
87 commandsWaitingResponseStruct commandsWaitingResponse;
88 PoolPtr options[MAX_OPTION_TABLES];
91 char hardwareTypeOverflow[MAX_HARDWARE_TYPE_LENGTH + 1];
93 uint32_t slaveFirmwareOffset;
94 bool slaveUpdateReady;
99 NBWifi(
const NBWifi &rhs);
104 bool ProcessInternal(
PoolPtr messageBuffer, NB::NBWifiAPIMessage::Internal::InternalTypes internalType);
106 void SendReconnectRequest();
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);
116 bool ProcessCreditReport(
PoolPtr messageBuffer);
118 bool DevFWSupported();
120 int AddWaitingCommand(uint8_t requestType, uint8_t commandID, OS_MBOX *pmbox);
121 void RemoveWaitingCommand(uint8_t commandID);
122 int ReadyInterface();
124 void RetrieveOptionTable(uint8_t tableNum);
125 void RetrieveAllOptionTables();
128 PoolPtr GetDeviceInformation();
134 State_NotRegistered = 0,
135 State_TaskNotRunning = 1,
138 State_InvalidDevice = 4,
140 State_NotConfigured = 6,
141 State_NotConnected = 7,
143 State_Reconnecting = 9,
147 static OS_FIFO WifiAPIRxFifo;
149 int myInterfaceNumber;
152 OS_FIFO BufferTxFifo;
153 uint32_t lastCreditCheckTick;
154 bool creditReportQueued;
155 bool creditReporting;
157 uint32_t lastReportTick;
158 NBWifiAPIMessage::Response::DeviceInfo devInfo;
159 DriverState currentState;
161 ReceiveScanResultFunc pfScanResultsCallback;
162 volatile bool bHardwareDetected;
164 uint8_t availableCredits;
165 uint16_t pendingTxBuffers;
167 OS_CRIT creditCheckCrit;
168 OS_CRIT commandsWaitingCrit;
169 OS_CRIT networkStatusCrit;
170 OS_CRIT bufferTxFifoCrit;
172 static uint32_t DriverStk[MAX_WIFI_INTERFACES][WIFI_TASK_STACK_SIZE];
173 static uint32_t APITaskStk[WIFI_TASK_STACK_SIZE];
175 NBWifi(CommBus busType,
int resetPinConnector,
int resetPinMum,
const char *name);
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();
189 static void RXTaskLauncher(
void *wifiDriverObj);
190 static void APITask(
void *throwaway);
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);
202 void TransmitBuffer(
PoolPtr txBuffer);
203 virtual void TransmitBuffer_Core(
PoolPtr txBuffer, uint8_t credits) = 0;
204 void enab_multicast(
MACADR macAddress, BOOL addAddress);
208 static int APIStartTask();
209 static void APIPause();
210 static void APIResume();
211 static void APIKill();
219 bool isRegistered()
const;
220 int GetWifiInterfaceNumber()
const;
223 [[deprecated]]
int GetSystemInterfaceNumber()
const;
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);
233 int ConnectToAP(
const char *ssid =
nullptr,
const char *passwd =
"", uint8_t retryCount = CONNECT_RETRIES);
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;
242 int StartConfigAP(uint8_t channel = DEFAULT_TABLE_LABEL_CHANNEL)
override;
244 void Disconnect()
override;
247 nbWifiScanResult *Scan(
const char *ssid =
nullptr, uint8_t optionCount = 0, uint16_t *optionList =
nullptr)
override;
250 int StartAsyncScan(ReceiveScanResultFunc pfCallbackFunc,
251 const char *ssid =
nullptr,
252 uint8_t optionCount = 0,
253 uint16_t *optionList =
nullptr);
255 void StopAsyncScan();
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; };
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;
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();
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;
287 friend void ::SetWifiSPISpeed(
int busSpeed);
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;
296 bool DisplayOptionTable(uint8_t n);
297 void DisplayAllOptionTables();
299 static NB::Wifi *GetNewNBWifiSPIDriver();
300 static NB::Wifi *GetNewNBWifiSerialDriver();
304extern NB::Wifi *theWifiIntf;
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