SmartCard reader. PC is interface through USB or TCPport. SmartCard is interfaced through UART@ 1MHz, DIV372

Dependencies:   EthernetNetIf mbed

TcpServer.cpp

Committer:
bcalin1984
Date:
2011-02-27
Revision:
0:5bf6fcf71548

File content as of revision 0:5bf6fcf71548:

/*
A Tcp server based on the :
// TCP Echo server
// 2010/9/7

Modified by Calin Bira
Date: 28.02.2011
*/




#include "mbed.h"
#include "TcpServer.h"
#include <stdarg.h>

//#define DEBUG

#ifdef DEBUG
    #define dprintf printf
#else 
    #define dprintf noprintf
#endif
    TcpServer::TcpServer(int port)
    {
        Setup(port);
    }
    
    void TcpServer::onConnectedTCPSocketEvent(TCPSocketEvent e)
    {
       switch(e)
        {
        case TCPSOCKET_CONNECTED:
            dprintf("TCP Socket Connected\r\n");
            break;
        case TCPSOCKET_WRITEABLE:
          //Can now write some data...
            dprintf("TCP Socket Writable\r\n");
            break;
        case TCPSOCKET_READABLE:
          //Can now read dome data...
            dprintf("TCP Socket Readable\r\n");
           // Read in any available data into the buffer
           
           while ( int len = pConnectedSock->recv(buff, 256) ) 
           {
               onReceive(buff,len);
               //pConnectedSock->send(buff, len);
               //buff[len]=0; // make terminater
               //dprintf("Received&Wrote:%s\r\n",buff);
           }
           break;
        case TCPSOCKET_CONTIMEOUT:
            dprintf("TCP Socket Timeout\r\n");
            break;
        case TCPSOCKET_CONRST:
            dprintf("TCP Socket CONRST\r\n");
            break;
        case TCPSOCKET_CONABRT:
            dprintf("TCP Socket CONABRT\r\n");
            break;
        case TCPSOCKET_ERROR:
            dprintf("TCP Socket Error\r\n");
            break;
        case TCPSOCKET_DISCONNECTED:
        //Close socket...
            dprintf("TCP Socket Disconnected\r\n");        
            pConnectedSock->close();
            break;
        default:
            dprintf("DEFAULT\r\n"); 
          }
    }
    
    
    void TcpServer::onListeningTCPSocketEvent(TCPSocketEvent e)
    {
        switch(e)
        {
        case TCPSOCKET_ACCEPT:
        {
            dprintf("Listening: TCP Socket Accepted\r\n");
            // Accepts connection from client and gets connected socket.   
            err=ListeningSock.accept(&client, &pConnectedSock);
            if (err) {
                dprintf("onListeningTcpSocketEvent : Could not accept connection.\r\n");
                return; //Error in accept, discard connection
            }
            // Setup the new socket events
            pConnectedSock->setOnEvent(this, &TcpServer::onConnectedTCPSocketEvent);
            // We can find out from where the connection is coming by looking at the
            // Host parameter of the accept() method
            IpAddr clientIp = client.getIp();
            dprintf("Listening: Incoming TCP connection from %d.%d.%d.%d\r\n", 
               clientIp[0], clientIp[1], clientIp[2], clientIp[3]);
           break;
        }
        // the following cases will not happen
        case TCPSOCKET_CONNECTED:
            dprintf("Listening: TCP Socket Connected\r\n");
            break;
        case TCPSOCKET_WRITEABLE:
            dprintf("Listening: TCP Socket Writable\r\n");
            break;
        case TCPSOCKET_READABLE:
            dprintf("Listening: TCP Socket Readable\r\n");
            break;
        case TCPSOCKET_CONTIMEOUT:
            dprintf("Listening: TCP Socket Timeout\r\n");
            break;
        case TCPSOCKET_CONRST:
            dprintf("Listening: TCP Socket CONRST\r\n");
            break;
        case TCPSOCKET_CONABRT:
            dprintf("Listening: TCP Socket CONABRT\r\n");
            break;
        case TCPSOCKET_ERROR:
            dprintf("Listening: TCP Socket Error\r\n");
            break;
        case TCPSOCKET_DISCONNECTED:
        //Close socket...
            dprintf("Listening: TCP Socket Disconnected\r\n");        
            ListeningSock.close();
            break;
        default:
            dprintf("DEFAULT\r\n"); 
         };
    }
    
    int TcpServer::Setup(int port) {
      dprintf("\r\n");
      dprintf("Setting up...\r\n");
      EthernetErr ethErr = eth.setup();
      if(ethErr)
      {
        dprintf("Error %d in setup.\r\n", ethErr);
        return -1;
      }
      dprintf("Setup OK\r\n");
    
      IpAddr ip = eth.getIp();
      dprintf("mbed IP Address is %d.%d.%d.%d\r\n", ip[0], ip[1], ip[2], ip[3]);
    
      
      // Set the callbacks for Listening
      ListeningSock.setOnEvent(this,&TcpServer::onListeningTCPSocketEvent); 
      
      // bind and listen on TCP
      err=ListeningSock.bind(Host(IpAddr(), port));
      dprintf("Binding..\r\n");
      if(err)
      {
       //Deal with that error...
        dprintf("Binding Error\n");
      }
       err=ListeningSock.listen(); // Starts listening
       dprintf("Listening...\r\n");
       if(err)
       {
        dprintf("Listening Error\r\n");
       }
       return 0;
    }
    
    void TcpServer::doEvents()
    {
        Net::poll();
    }
    
     void TcpServer::SetReceiveCallback(void (*f)(char*buf, int len))
    {
        onReceive = f;
    }
    
    
    void TcpServer::Tprintf(const char * format, ...)
    {
     	va_list ap;
        va_start(ap, format);
        vsprintf(buff, format, ap);
        va_end(ap);
    
        pConnectedSock->send(buff, strlen(buff));
    }
    
     void TcpServer::noprintf(const char * format, ...)
    {
     
    }