C027Interface

Dependencies:   C027_Support

Fork of C027Interface by NetworkSocketAPI

Revision:
14:3d1845f5cd81
Parent:
12:181a9415736b
Child:
15:21d4f56eb172
--- a/C027Interface.h	Fri Apr 15 16:08:40 2016 +0000
+++ b/C027Interface.h	Thu Apr 21 06:53:31 2016 -0500
@@ -24,52 +24,145 @@
 /** C027Interface class
  *  Implementation of the NetworkInterface for C027
  */
-class C027Interface : public CellularInterface
+class C027Interface : public NetworkStack, public CellularInterface
 {
 public:
-    // Lifetime of C027Interface
+    /** C027Interfacelifetime
+     * @param simpin    Optional PIN for the SIM
+     * @param debug     Enable debugging
+     */
     C027Interface(const char *simpin=0, bool debug=false);
 
-    // Implementation of CellularInterface
-    virtual int32_t connect(const char *apn=0, const char *username=0, const char *password=0);
-    virtual int32_t disconnect();
+    /** Start the interface
+     *
+     *  @param apn      Optional name of the network to connect to
+     *  @param username Optional username for your APN
+     *  @param password Optional password for your APN 
+     *  @return         0 on success, negative error code on failure
+     */
+    virtual int connect(const char *apn = 0, const char *username = 0, const char *password = 0);
+
+    /** Stop the interface
+     *  @return             0 on success, negative on failure
+     */
+    virtual int disconnect();
+
+    /** Get the internally stored IP address
+     *  @return             IP address of the interface or null if not yet connected
+     */
+    virtual const char *get_ip_address();
+
+    /** Get the internally stored MAC address
+     *  @return             MAC address of the interface
+     */
+    virtual const char *get_mac_address();
+
+protected:
+    /** Open a socket
+     *  @param handle       Handle in which to store new socket
+     *  @param proto        Type of socket to open, NSAPI_TCP or NSAPI_UDP
+     *  @return             0 on success, negative on failure
+     */
+    virtual int socket_open(void **handle, nsapi_protocol_t proto);
+
+    /** Close the socket
+     *  @param handle       Socket handle
+     *  @return             0 on success, negative on failure
+     *  @note On failure, any memory associated with the socket must still 
+     *        be cleaned up
+     */
+    virtual int socket_close(void *handle);
+
+    /** Bind a server socket to a specific port
+     *  @param handle       Socket handle
+     *  @param address      Local address to listen for incoming connections on 
+     *  @return             0 on success, negative on failure.
+     */
+    virtual int socket_bind(void *handle, const SocketAddress &address);
+
+    /** Start listening for incoming connections
+     *  @param handle       Socket handle
+     *  @param backlog      Number of pending connections that can be queued up at any
+     *                      one time [Default: 1]
+     *  @return             0 on success, negative on failure
+     */
+    virtual int socket_listen(void *handle, int backlog);
 
-    // Implementation of NetworkInterface
-    virtual const char *getIPAddress();
-    virtual const char *getMACAddress();
+    /** Connects this TCP socket to the server
+     *  @param handle       Socket handle
+     *  @param address      SocketAddress to connect to
+     *  @return             0 on success, negative on failure
+     */
+    virtual int socket_connect(void *handle, const SocketAddress &address);
+
+    /** Accept a new connection.
+     *  @param handle       Handle in which to store new socket
+     *  @param server       Socket handle to server to accept from
+     *  @return             0 on success, negative on failure
+     *  @note This call is not-blocking, if this call would block, must
+     *        immediately return NSAPI_ERROR_WOULD_WAIT
+     */
+    virtual int socket_accept(void **handle, void *server);
+
+    /** Send data to the remote host
+     *  @param handle       Socket handle
+     *  @param data         The buffer to send to the host
+     *  @param size         The length of the buffer to send
+     *  @return             Number of written bytes on success, negative on failure
+     *  @note This call is not-blocking, if this call would block, must
+     *        immediately return NSAPI_ERROR_WOULD_WAIT
+     */
+    virtual int socket_send(void *handle, const void *data, unsigned size);
 
-    virtual SocketInterface *createSocket(ns_protocol_t proto);
-    virtual void destroySocket(SocketInterface *socket);
+    /** Receive data from the remote host
+     *  @param handle       Socket handle
+     *  @param data         The buffer in which to store the data received from the host
+     *  @param size         The maximum length of the buffer
+     *  @return             Number of received bytes on success, negative on failure
+     *  @note This call is not-blocking, if this call would block, must
+     *        immediately return NSAPI_ERROR_WOULD_WAIT
+     */
+    virtual int socket_recv(void *handle, void *data, unsigned size);
+
+    /** Send a packet to a remote endpoint
+     *  @param handle       Socket handle
+     *  @param address      The remote SocketAddress
+     *  @param data         The packet to be sent
+     *  @param size         The length of the packet to be sent
+     *  @return the         number of written bytes on success, negative on failure
+     *  @note This call is not-blocking, if this call would block, must
+     *        immediately return NSAPI_ERROR_WOULD_WAIT
+     */
+    virtual int socket_sendto(void *handle, const SocketAddress &address, const void *data, unsigned size);
+
+    /** Receive a packet from a remote endpoint
+     *  @param handle       Socket handle
+     *  @param address      Destination for the remote SocketAddress or null
+     *  @param buffer       The buffer for storing the incoming packet data
+     *                      If a packet is too long to fit in the supplied buffer,
+     *                      excess bytes are discarded
+     *  @param size         The length of the buffer
+     *  @return the         number of received bytes on success, negative on failure
+     *  @note This call is not-blocking, if this call would block, must
+     *        immediately return NSAPI_ERROR_WOULD_WAIT
+     */
+    virtual int socket_recvfrom(void *handle, SocketAddress *address, void *buffer, unsigned size);
+
+    /** Register a callback on state change of the socket
+     *  @param handle       Socket handle
+     *  @param callback     Function to call on state change
+     *  @param data         Argument to pass to callback
+     *  @note Callback may be called in an interrupt context.
+     */
+    virtual void socket_attach(void *handle, void (*callback)(void *), void *data);
 
 private:
     // Modem object
     bool _debug;
     MDMSerial *_mdm;
-    char _ip_address[NS_IP_SIZE];
-    char _mac_address[NS_MAC_SIZE];
+    char _ip_address[NSAPI_IP_SIZE];
+    char _mac_address[NSAPI_MAC_SIZE];
     char _pin[sizeof "1234"];
-
-    // Implementation of the TCP SocketInterface for C027
-    class C027Socket : public SocketInterface
-    {
-    public:
-
-        C027Socket(MDMSerial *mdm, int socket, MDMParser::IpProtocol proto)
-            : _mdm(mdm), _socket(socket), _proto(proto) {}
-        MDMSerial *_mdm;
-        int _socket;
-        MDMParser::IpProtocol _proto;
-        MDMParser::IP _ip;
-        int _port;
-
-        // Implementation of SocketInterface
-        virtual int32_t open(const char *ip, uint16_t port);
-        virtual int32_t close();
-
-        virtual int32_t send(const void *data, uint32_t size);
-        virtual int32_t recv(void *data, uint32_t size);
-    };
 };
 
-
 #endif