Dependencies:   EthernetNetIf mbed

main.cpp

Committer:
SED9008
Date:
2012-02-15
Revision:
0:fa3fb9be66e3

File content as of revision 0:fa3fb9be66e3:

#include "mbed.h"
#include "EthernetNetIf.h"
#include "TCPSocket.h"
DigitalOut led1(LED1, "led1");
DigitalOut led2(LED2, "led2");
DigitalOut led3(LED3, "led3");
DigitalOut led4(LED4, "led4");
AnalogIn ana_x(p19, "ana_x");
AnalogIn ana_y(p20, "ana_y");
DigitalIn init(p5);
DigitalIn garbage(p6);
DigitalIn closesock(p7);
EthernetNetIf eth(
  IpAddr(192,168,0,16), //IP Address
  IpAddr(255,255,255,0), //Network Mask
  IpAddr(192,168,0,1), //Gateway
  IpAddr(192,168,0,1)  //DNS
);


// == stability vars
Ticker routine;

int base_x_0 = 50;
int base_y_0 = 50;
int base_x_1 = 50;
int base_y_1 = 50;
int base_x_2 = 50;
int base_y_2 = 50;
int base_x_3 = 50;
int base_y_3 = 50;

int motor_0 = 50;
int motor_1 = 50;
int motor_2 = 50;
int motor_3 = 50;

int a_motor_0 = motor_0;
int a_motor_1 = motor_1;
int a_motor_2 = motor_2;
int a_motor_3 = motor_3;

int x = 50;
int y = 50;

// == end

int go = 0;

#define TCP_LISTENING_PORT 1337

TCPSocket ListeningSock; //Listener
TCPSocket* pConnectedSock; // for ConnectedSock
Host client; 
TCPSocketErr err;
char data[128];

void sender(const char*);
void interrupt();
void onConnectedTCPSocketEvent( TCPSocketEvent );
void onListeningTCPSocketEvent( TCPSocketEvent );

int main() {

    EthernetErr ethErr = eth.setup();
      if(ethErr)
      {
        led3 = 1;
        return -1;
      }
    // Set the callbacks for Listening
    ListeningSock.setOnEvent(&onListeningTCPSocketEvent); 
    // bind and listen on TCP
    err=ListeningSock.bind(Host(IpAddr(), TCP_LISTENING_PORT)); // listen on own ipaddres, port 1337
    if(err)
    {
    //Deal with that error...
        led3 = 1;
    }
    err=ListeningSock.listen(); // Starts listening
    if(err)
    {
         led3 = 1;
    }
    routine.attach(&interrupt, 1);
    Timer timer;
    timer.start();
    while(true)
    {
        Net::poll(); //poll TCPstack
        while(init) {
            if(!init){
                sender("220 Connected\n");
                go=1;
                break;
                
            }
        }
        while(garbage) {
            if(!garbage){
                sender("RAndomstuff\n");
                break;
            }
        }
        while(closesock) {
            if(!closesock){
                pConnectedSock->close();
                led1=0;
                break;
            }
        }
        if(go){
            char buffer [16];
            sprintf (buffer, "x: %d\n", x);
            sender(buffer);
            sprintf (buffer, "y: %d\n", y);
            sender(buffer);
            sprintf (buffer, "motor_0: %d\n", motor_0);
            sender(buffer);
            sprintf (buffer, "motor_1: %d\n", motor_1);
            sender(buffer);
            sprintf (buffer, "motor_2: %d\n", motor_2);
            sender(buffer);
            sprintf (buffer, "motor_3: %d\n", motor_3);
            sender(buffer);
        }
        if(timer.read() > 0.2) 
        {
            led4=!led4; //Status light toggle
            timer.reset();
        }
  }
}

void sender( const char* data ){
    int len = strlen(data);
    pConnectedSock->send(data, len);
}


void interrupt() 
{
    x = ana_x.read()*100;
    y = ana_y.read()*100;

    a_motor_0 = a_motor_0-((base_x_0-x)/2)+((base_x_0-y)/2);
    if(a_motor_0>99){
        motor_0 = 100;}
    else if(a_motor_0 < 1){
        motor_0 = 0;}
    else{
        motor_0 = a_motor_0;}
    a_motor_1 = a_motor_1-((base_x_1-x)/2)-((base_x_1-y)/2);
    if(a_motor_1>99){
        motor_1 = 100;}
    else if(a_motor_1 < 1){
        motor_1 = 0;}
    else{
        motor_1 = a_motor_1;}
    a_motor_2 = a_motor_2+((base_x_2-x)/2)-((base_x_2-y)/2);
    if(a_motor_2>99){
        motor_2 = 100;}
    else if(a_motor_2 < 1){
        motor_2 = 0;}
    else{
        motor_2 = a_motor_2;}
    a_motor_3 = a_motor_3+((base_x_3-x)/2)+((base_x_3-y)/2);
    if(a_motor_3>99){
        motor_3 = 100;}
    else if(a_motor_3 < 1){
        motor_3 = 0;}
    else{
        motor_3 = a_motor_3;}
}

void onConnectedTCPSocketEvent(TCPSocketEvent e)
{
   switch(e)
    {
    case TCPSOCKET_CONNECTED:
        led1 = 1;
        break;
    case TCPSOCKET_WRITEABLE:
      //Can now write some data...
        led1 = 1;
        break;
    case TCPSOCKET_READABLE:
      //Can now read dome data...
        led1 = 1;
       // Read in any available data into the buffer
       char buff[128];
       while ( int len = pConnectedSock->recv(buff, 128) ) {
       // And send straight back out again
           
           //pConnectedSock->send(buff, len);
           //buff[len]=0; // make terminater
           led2 != led2;
           strcpy(data,buff); 
       }
       break;
    case TCPSOCKET_CONTIMEOUT:
        printf("TCP Socket Timeout\r\n");
        break;
    case TCPSOCKET_CONRST:
        printf("TCP Socket CONRST\r\n");
        break;
    case TCPSOCKET_CONABRT:
        printf("TCP Socket CONABRT\r\n");
        break;
    case TCPSOCKET_ERROR:
        printf("TCP Socket Error\r\n");
        break;
    case TCPSOCKET_DISCONNECTED:
    //Close socket...
        printf("TCP Socket Disconnected\r\n");        
        pConnectedSock->close();
        led1=0;
        break;
    default:
        printf("DEFAULT\r\n"); 
      }
}


void onListeningTCPSocketEvent(TCPSocketEvent e)
{
    switch(e)
    {
    case TCPSOCKET_ACCEPT:
        printf("Listening: TCP Socket Accepted\r\n");
        // Accepts connection from client and gets connected socket.   
        err=ListeningSock.accept(&client, &pConnectedSock);
        if (err) {
            led3 = 1;
            return; //Error in accept, discard connection
        }
        // Setup the new socket events
        pConnectedSock->setOnEvent(&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();
        printf("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:
        printf("Listening: TCP Socket Connected\r\n");
        break;
    case TCPSOCKET_WRITEABLE:
        printf("Listening: TCP Socket Writable\r\n");
        break;
    case TCPSOCKET_READABLE:
        printf("Listening: TCP Socket Readable\r\n");
        break;
    case TCPSOCKET_CONTIMEOUT:
        printf("Listening: TCP Socket Timeout\r\n");
        break;
    case TCPSOCKET_CONRST:
        printf("Listening: TCP Socket CONRST\r\n");
        break;
    case TCPSOCKET_CONABRT:
        printf("Listening: TCP Socket CONABRT\r\n");
        break;
    case TCPSOCKET_ERROR:
        led3 = 1;
        break;
    case TCPSOCKET_DISCONNECTED:
    //Close socket...
        printf("Listening: TCP Socket Disconnected\r\n");        
        ListeningSock.close();
        break;
    default:
        printf("DEFAULT\r\n"); 
     };
}