WirelessComs For David

Dependencies:   EthernetNetIf Queue Servo mbed

main.cpp

Committer:
johnson6987
Date:
2013-07-29
Revision:
3:9844ec849c12
Parent:
0:8101522bb770

File content as of revision 3:9844ec849c12:

#include "mbed.h"
#include "EthernetNetIf.h"
#include "UDPSocket.h"
#include "queue.h"
#include "Servo.h"

BusOut myleds(LED1, LED2, LED3, LED4);
Ticker NetPoll;
Timer ErrorTime;
Timer systemtime;
Queue UDP_queue(256,1);
Serial pc(USBTX, USBRX);
EthernetNetIf * eth;
UDPSocket UDP;
Host Robot;
Servo Ml(p21);
Servo Mr(p22);
Servo Arm(p23);
Servo Elbow(p24);
float MR=.5;
float ML=.5;

//DigitalOut leds[] = {(p10),(p11),(p12),(p13),(p14),(p15),(p16),(p17)};

char messageBufferIncoming[256];

struct Joystick {
    float axis[4];
    float button[12];
};

void dtime(int x){
myleds=x;
//pc.printf("%d - time=%f\n",x,systemtime.read());
}

void right(){
Ml=1;
Mr=1;
wait(.25);
}

void left(){
Ml=0;
Mr=0;
wait(.25);
}

void forward(float time){
Ml=1;
Mr=0;
wait(time);
}

void backwards(float time){
Ml=0;
Mr=1;
wait(time);
}


Joystick Joy;
void messageProcess(void)
{
dtime(1);
    ErrorTime.reset();
    // pc.printf("%s\r\n",messageBufferIncoming);
    sscanf(messageBufferIncoming,"%f%f%f%f",\
           &Joy.axis[0],\
           &Joy.axis[1],\
           &Joy.axis[2],\
           &Joy.axis[3]);
dtime(2);
   // pc.printf("%f %f %f %f\r\n", Joy.axis[0],Joy.axis[1],Joy.axis[2],Joy.axis[3]);
    /*
    sscanf(messageBufferIncoming,"%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f",\
    &Joy.axis[0],\
    &Joy.axis[1],\
    &Joy.axis[2],\
    &Joy.axis[3],\
    &Joy.button[0],\
    &Joy.button[1],\
    &Joy.button[2],\
    &Joy.button[3],\
    &Joy.button[4],\
    &Joy.button[5],\
    &Joy.button[6],\
    &Joy.button[7],\
    &Joy.button[8],\
    &Joy.button[9],\
    &Joy.button[10],\
    &Joy.button[11]);
    
    */
    
   
    float Y=Joy.axis[1];
    float X=Joy.axis[0];
    Arm=Joy.axis[2];
    Elbow=(Joy.axis[3]+1)/2.0;
    Y=-Y;
    dtime(3);
    
    if (X<0.1 && Y<0.1 && X>-0.1 && Y>-0.1) {
        Ml=0.5;
        Mr=0.5;
        dtime(4);
    } else {
    dtime(5);
        if (Y>0 && X>0) { //quadrant 1
            ML=sqrt((X*X)+(Y*Y));
            MR=X-Y;
        }
        if (Y>0 && X<0) { //quadrant 2
            ML=Y+X;
            MR=-sqrt((X*X)+(Y*Y));
        }
        if (Y<0 && X<0) { //quadrant 3
            ML=-sqrt((X*X)+(Y*Y));
            MR=X-Y;
        }
        if (Y<0 && X>0) { //quadrant 4
            ML=X+Y;
            MR=sqrt((X*X)+(Y*Y));
        }
    Ml=((ML*ML*ML)+1)/2.0;
    Mr=((MR*MR*MR)+1)/2.0;
    }
    dtime(6);
    //pc.printf("X=%f Y=%f ML=%f MR=%f\r\n", X,Y,Ml.read(),Mr.read());
    /*
    
    /*ML=1;
    //MR=0;
    for (int x=0; x<8; x++) {
        leds[x]=(bool)Joy.button[x];
        dtime(7);
    }*/
}

void onUDPSocketEvent(UDPSocketEvent e)
{
dtime(14);
    switch (e) {
        case UDPSOCKET_READABLE: //The only event for now
            char buf[256] = {0};
            Host host;
           while ( int len = UDP.recvfrom( buf, 255, &host ) ) {
                if ( len <= 0 )
                    break;
                UDP_queue.Put(buf);
            }
               // UDP.recvfrom( messageBufferIncoming, 255, &host );
                //messageProcess();
            break;
    }
}


int main()
{
    systemtime.start();
    eth = new EthernetNetIf(
        IpAddr(IpAddr(192,168,1,102)),  // My IP Address
        IpAddr(IpAddr(255,255,255,0)), //Network Mask
        IpAddr(IpAddr(192,168,1,2)), //Gateway
        IpAddr(IpAddr())  //DNS
    );
    Robot.setIp(IpAddr(192,168,1,102));
    Robot.setPort(12345);

    eth->setup();
    UDP.setOnEvent(&onUDPSocketEvent);
    UDP.bind(Robot);
    NetPoll.attach_us(&Net::poll,500);

    ErrorTime.start();

    while (1) {
        if ( UDP_queue.Get(messageBufferIncoming))messageProcess();
        if (ErrorTime.read()>.2) {
        dtime(15);
            Mr=.50;
            Ml=0.5;
           
            ErrorTime.reset();
        }

    }
}