Yuki Suga / RTnoV4

Dependencies:   EthernetInterface mbed-rtos

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers EtherTcp.cpp Source File

EtherTcp.cpp

00001 #include "mbed.h"
00002 #define RTNO_SUBMODULE_DEFINE
00003 #include "RTno.h"
00004 
00005 #ifdef USE_ETHERNET_CONNECTION
00006 
00007 #include "EtherTcp.h"
00008 #include "EthernetInterface.h"
00009 
00010 
00011 #include "ip_addr.h"
00012 /**
00013 #include <../SPI/SPI.h>
00014 #include <../Ethernet/Ethernet.h>
00015 
00016 static EthernetServer *m_pServer;
00017 static EthernetClient *m_pClient;
00018 */
00019 //static EthernetInterface* m_pInterface;
00020 static TCPSocketServer* m_pServerSocket;
00021 static TCPSocketConnection m_ClientSocket;
00022 
00023 
00024 #define ETCP_RX_BUFFER_SIZE 128
00025 uint8_t etcp_rx_buffer[ETCP_RX_BUFFER_SIZE];
00026 int etcp_rx_buffer_pointer_head = 0;
00027 int etcp_rx_buffer_pointer_tail = 0;
00028 ///Host m_Client;
00029 
00030 Serial *pSerial;
00031 
00032 /**
00033  * Push data to ring buffer.
00034  */
00035 int etcp_rx_buffer_push(unsigned char c) {
00036     etcp_rx_buffer[etcp_rx_buffer_pointer_tail] = c;
00037     etcp_rx_buffer_pointer_tail++;
00038     if(etcp_rx_buffer_pointer_tail >= ETCP_RX_BUFFER_SIZE) {
00039         etcp_rx_buffer_pointer_tail = 0;
00040     }
00041     return 0;
00042 }
00043 
00044 /**
00045  * Pop data fron ring buffer
00046  */
00047 int etcp_rx_buffer_pop(unsigned char *c) {
00048     *c = etcp_rx_buffer[etcp_rx_buffer_pointer_head];
00049     etcp_rx_buffer_pointer_head++;
00050     if(etcp_rx_buffer_pointer_head >= ETCP_RX_BUFFER_SIZE) {
00051         etcp_rx_buffer_pointer_head = 0;
00052     }
00053     return 0;
00054 }
00055 
00056 int etcp_rx_buffer_get_size() {
00057     int size = etcp_rx_buffer_pointer_tail - etcp_rx_buffer_pointer_head;
00058     if(size < 0) {
00059         size += ETCP_RX_BUFFER_SIZE;
00060     }
00061     return size;
00062 }
00063 
00064 /*
00065 static void EtherTcp_onClientEvent(TCPSocketEvent e) {
00066   switch (e) {
00067   // If the socket is readable, do stuff
00068   case TCPSOCKET_READABLE:
00069     while(1) {
00070       char buf;
00071       int ret = m_pClientSocket->recv(&buf, 1);
00072       if (ret == 0) break;
00073       etcp_rx_buffer_push(buf);
00074     }
00075     
00076     break;
00077   case TCPSOCKET_CONTIMEOUT:
00078   case TCPSOCKET_CONRST:
00079   case TCPSOCKET_CONABRT:
00080   case TCPSOCKET_ERROR:
00081   case TCPSOCKET_DISCONNECTED:
00082     delete m_pClientSocket;
00083     m_pClientSocket = NULL;
00084     break;
00085   }
00086 }
00087 
00088 static void EtherTcp_onServerEvent(TCPSocketEvent e) {
00089   if(e == TCPSOCKET_ACCEPT ) {
00090     if ( m_pServerSocket->accept(&m_Client, &m_pClientSocket) ) {
00091       return; //Error in accept, discard connection
00092     }
00093     
00094     m_pClientSocket->setOnEvent(EtherTcp_onClientEvent);
00095   }
00096 }
00097 */
00098 
00099 void EtherTcp_init(/*const char* mac, */const char* ip, 
00100            const char* gateway, const char* subnet,
00101            uint16_t port) 
00102 
00103 {
00104   pSerial = new Serial(USBTX, USBRX);
00105   EthernetInterface::init(
00106        ip, subnet, gateway);
00107   //printf("Hello %d %d %d %d\r\n", ip[0], ip[1], ip[2], ip[3]);
00108   //EthernetErr ethErr = m_pInterface->setup();
00109   //if (ethErr) {
00110  //  return;
00111  // }  
00112   
00113   m_pServerSocket = new TCPSocketServer();
00114   //m_pServerSocket->setOnEvent(EtherTcp_onServerEvent);
00115   m_pServerSocket->bind(port);
00116   m_pServerSocket->listen();
00117   m_pServerSocket->accept(m_ClientSocket);
00118   SerialDevice_available = EtherTcp_available;
00119   SerialDevice_getc = EtherTcp_getc;
00120   SerialDevice_putc = EtherTcp_putc;
00121 }
00122 
00123 uint8_t EtherTcp_available()
00124 {
00125   //Net::poll();
00126   return etcp_rx_buffer_get_size();
00127 }
00128 
00129 
00130 void EtherTcp_putc(const char c) {
00131   char d = c;
00132     m_ClientSocket.send(&d, 1);
00133   }
00134 
00135 uint8_t EtherTcp_getc()
00136 {
00137   uint8_t c;
00138   m_ClientSocket.receive((char*)&c, 1);
00139   //etcp_rx_buffer_pop(&c);
00140   return c;
00141 }
00142 
00143 #endif