The WDCInterface is is a drop-in replacement for an EthernetInterface class that allows the user to connect to the Internet with a Wistron NeWeb Corporation (WNC) M14A2A Series data module using the standard network Socket API's. This interface class is used in the AT&T Cellular IoT Starter Kit which is sold by Avnet (http://cloudconnectkits.org/product/att-cellular-iot-starter-kit).

Dependencies:   WncControllerK64F

Dependents:   WNCProximityMqtt Pubnub_ATT_IoT_SK_WNC_sync BluemixDemo BluemixQS ... more

See the WNCInterface README in the Wiki tab for detailed information on this library.

WNCInterface.h

Committer:
JMF
Date:
2016-09-27
Revision:
5:759dceff95b9
Parent:
3:1d7e6ed11269
Child:
6:7cda15f762fe

File content as of revision 5:759dceff95b9:

/* =====================================================================
   Copyright © 2016, Avnet (R)

   Contributors:
     * James Flynn, www.em.avnet.com 
 
   Licensed under the Apache License, Version 2.0 (the "License"); 
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, 
   software distributed under the License is distributed on an 
   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 
   either express or implied. See the License for the specific 
   language governing permissions and limitations under the License.

    @file          WNCInterface.h
    @version       1.0
    @date          Sept 2016

======================================================================== */


#include <stddef.h>
#include "WncControllerK64F/WncControllerK64F.h"

#ifndef _WNCINTERFACE_H_
#define _WNCINTERFACE_H_

#define WNC_DEBUG   1   //1=enable the WNC startup debug output
                                //0=disable the WNC startup debug output
#define STOP_ON_FE  1   //1=hang forever if a fatal error occurs
                //0=simply return failed response for all socket calls
#define DISPLAY_FE  1   //1 to display the fatal error when it occurs
                //0 to NOT display the fatal error
#define RESETON_FE  1   //1 to cause the MCU to reset on fatal error
                //0 to NOT reset the MCU
#define APN_DEFAULT     "m2m.com.attz"
                        
//
// WNC Error Handling macros & data
//
#define FATAL_FLAG  WncController_fk::WncController::WNC_NO_RESPONSE
#define WNC_GOOD    WncController_fk::WncController::WNC_ON

#define RETfail return -1
#define RETvoid return
#define RETnull return NULL
#define RETresume   

#define DORET(x) RET##x

#define TOSTR(x) #x
#define INTSTR(x) TOSTR(x)
#define FATAL_STR __FILE__ ":" INTSTR(__LINE__)

#if RESETON_FE == 1
#define MCURESET     ((*((volatile unsigned long *)0xE000ED0CU))=(unsigned long)((0x5fa<<16) | 0x04L))
#define RSTMSG       "RESET MCU! "
#else
#define MCURESET
#define RSTMSG       ""
#endif

#if DISPLAY_FE == 1
#define PFE     printf(RSTMSG "WNC FAILED @ %s\r\n", FATAL_STR)
#else
#define PFE
#endif

#if STOP_ON_FE == 1
#define FATAL_WNC_ERROR(v)  {extern char *_fatal_err_loc;_fatal_err_loc=FATAL_STR;PFE;MCURESET;while(1);}
#else
#define FATAL_WNC_ERROR(v)  {extern char *_fatal_err_loc;_fatal_err_loc=FATAL_STR;PFE;DORET(v);}
#endif

// Because the WncController has intermixed socket & interface functionallity
// will need to make the Socket class a friend of the Interface class. This 
// will allow the Socket class to get to the WNC functions needed for the
// socket. Forward reference the class

class Socket;
class Endpoint;
class UDPSocket;
class TCPSocketConnection;

class WNCInterface
{
  class WncControllerK64F;  //forward reference the Controller Class
  friend class TCPSocketConnection;
  friend class UDPSocket;
  friend class Endpoint;
  friend class Socket;

public:
  /** Create WNC Data Module Interface Instance for the device (M14A2A) */
  WNCInterface();

  /** Initialize the interface (no connection at this point).
  * \return 0 on success, a negative number on failure
  */
  static int init(const char* apn=NULL, MODSERIAL * debug=NULL); 

  /** Open an LTE internet data connection
      @return 0 on success, error code on failure
  */
  int connect(void);

  /** Disconnect
  * Bring the interface down
  * \return 0 on success, a negative number on failure
  */
  static int disconnect();
  
  /** Because the WNCInterface is cellular based there is no MAC Ethernet address to return, so this function
   *  returns a bogus MAC address created from the ICCD on the SIM that is being used.
   * \return a pointer to a pesudo-MAC string containing "NN:NN:NN:NN:NN:NN"
   */
  static char* getMACAddress();
  
  /** Get the IP address of your Ethernet interface
   * \return a pointer to a string containing the IP address
   */
  static char* getIPAddress();

  /** Get the Gateway address of your Ethernet interface
   * \return a pointer to a string containing the Gateway address
   */
  static char* getGateway();

  /** Get the Network mask of your Ethernet interface
   * \return a pointer to a string containing the Network mask
   */
  static char* getNetworkMask();
  
  /** Manipulate the debug output of the WncController, for debug purposes.
   * \return nothing.
   */
  void doDebug(int val);  //doing this so I can get to the wnc controller pointer

private:
  static WncController_fk::WncIpStats myNetStats;     //maintaint the network statistics
  static WncControllerK64F_fk::WncControllerK64F *_pwnc;  //pointer to the WncController instance
  static string mac;
};

#endif /* _WNCINTERFACE_ */