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