Dependencies:   EthernetNetIf mbed ADXL345_I2C

main.cpp

Committer:
SED9008
Date:
2012-02-23
Revision:
0:5abac0d420fc

File content as of revision 0:5abac0d420fc:

#include "mbed.h"
#include "EthernetNetIf.h"
#include "TCPSocket.h"
#include "ADXL345_I2C.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);
ADXL345_I2C accelerometer(p9, p10);


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;

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

float motor_0 = 50;
float motor_1 = 50;
float motor_2 = 50;
float motor_3 = 50;

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

long x = 50;
long y = 50;

// == end

int go = 0;
int countertje = 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() {

    //Go into standby mode to configure the device.
    accelerometer.setPowerControl(0x00);
 
    //Full resolution, +/-16g, 4mg/LSB.
    accelerometer.setDataFormatControl(0x0B);
     
    //3.2kHz data rate.
    accelerometer.setDataRate(ADXL345_3200HZ);
 
    //Measurement mode.
    accelerometer.setPowerControl(0x08);

    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(closesock) {
            if(!closesock){
                led1=0;
                go=0;
                pConnectedSock->close();
                break;
            }
        }
        if(go){
            if(countertje == 10){
                countertje = 0;
            }
            char buffer [128];
            sprintf (buffer, "%d\n",countertje);
            sender(buffer);
            sprintf (buffer, "x: %d\ny: %d\nmotor_0: %f\nmotor_1: %f\nmotor_2: %f\nmotor_3: %f\n", x,y,motor_0,motor_1,motor_2,motor_3);
            sender(buffer);
            char receive[128];
            while ( int len = pConnectedSock->recv(receive, 128) ) {
              led2 != led2;
              if(strcmp(receive,"Got it!")==0){
                led2 = 0;
                break;
              }
            }
            /*
            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); */
            countertje++;
        }
        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 = accelerometer.getAx();
    y = accelerometer.getAy();

    a_motor_0 = a_motor_0-((((base_x_0-x)/2)+((base_x_0-y)/2))/1000);
    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))/1000);
    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))/1000);
    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))/1000);
    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"); 
     };
}