Shuttle Test Client

Dependencies:   mbed

main.cpp

Committer:
tkanavathy
Date:
2017-01-13
Revision:
0:447b25550052

File content as of revision 0:447b25550052:

/*-- CLIENT INCLUDES ---------------------------------------------------------*/
#include "mbed.h"
#include "EthernetInterface.h"
/*-- GLOBAL CONSTANTS --------------------------------------------------------*/
const int PORT = 7;                             //arbitrary port
/*-- IP CONSTANT CONFIGURATION --*/
static const char* SERVER_IP = "192.168.1.101"; //IP of server board
static const char* CLIENT_IP = "192.168.1.102"; //IP of client board
static const char* MASK = "255.255.255.0";      //mask          
static const char* GATEWAY = "192.168.1.1";     //gateway
/*-- INITIALISATION ----------------------------------------------------------*/
Serial pc(USBTX, USBRX);        //create PC interface
EthernetInterface eth;          //create ethernet
UDPSocket sock;                 //creat Ethernet socket
Endpoint server;                //create endpoint
/* -- DECLARE LEDs for STATUS DISPLAY --*/
DigitalOut red(LED_RED);    
DigitalOut green(LED_GREEN);
DigitalOut blue(LED_BLUE);
/*-- DECLARE INTERRUPTS --*/
InterruptIn touch(SW2);
InterruptIn butt3(SW3);
Timer t_level, t_shuttle; //define timers to measure each level and shuttle
/*--VARIABLES------------------------------------------------------------*/
int i; //Loop iteration counter
int n;                  //size of received message
char message[6] = {0,01,1,1,'\0'};  //MESSAGE status[1],level[2],blue[1],line[1]
char c_status[1], c_level[2], c_blue[1], c_line[1];  //receival buffers

/*---- Status of program? ----*/
/*------ 0 = Loaded      --*/ 
/*------ 1 = Start       --*/
/*------ 2 = In Progress --*/
/*------ 3 = Stop        --*/
int status, level;       //Keep track of the level of the Beep Test
bool line;               //Has the runner crossed the line?

/*-- FUNCTION DECLARATIONS ---------------------------------------------------*/
void init_usb(void);    //initializes pc.printf if required
void init_eth(void);    //initializes Ethernet
void init_load(void);   //Initialise program
void send(void);        //Send packets
void receive(void);     //Recv packets
int main(void);         //main
void end_eth(void);     //closes Ethernet socket

/*-- INTERRUPT DEFINITIONS ---------------------------------------------------*/
void ISR1()
{
    //Did the runner cross line in time, before showing RED?
    if (red == 0) line = false; //Crossed line late
    else line = true; // Crossed line in time
}
void ISR2()
{
    //Reset the program
    status =0;
}

/*-- FUNCTION DEFINITIONS ---------------------------------------------------*/
/****INIT_USB BAUD RATE***/
void init_usb(void)
{
    pc.baud(9600);    //baud rate
}

/****OPEN_ETHERNET CONNECTION***/
void init_eth(void)
{
    eth.init(CLIENT_IP, MASK, GATEWAY);                  //set up IP
    eth.connect();                                       //connect ethernet
    pc.printf("\nCLIENT - Client IP Address is %s\r\n", eth.getIPAddress()); //get client IP address
    sock.init();                                         //initialize socket
    server.set_address(SERVER_IP, PORT);                 //set address of server
}

/**** INITIALISE CLIENT PARAMETERS***/
void init_load(void)
{
    //Initialise flags and reset timers
    level = 1; //Reset to starting level 1
    line = true;
    //Client LED is solid BLUE in Loaded Status
    blue = 0;
    green = 1;
    red = 1;
    //Reset the timers
    t_level.reset();
    t_shuttle.reset(); //20*3600/(8000+500*level) = 144/(level+16) sec
}

/**** SEND MESSAGE ***/
void send(void)
{
    sprintf(message, "%i %02i %i %i %c", status, level, int(blue), line, '\0');   
    sock.sendTo(server, message, sizeof(message));                //send message
    pc.printf("CLIENT: Send '%s' to server %s\r\n", message, SERVER_IP);//print message
}

/**** RECEIVE ***/
void receive(void)
{
    pc.printf("\nCLIENT: Waiting for UDP packet...\r\n");      //wait for packet
    n = sock.receiveFrom(server, message, sizeof(message)); //receive message from server
    message[n] = ' ';                               //Remove \0 from message
    pc.printf("CLIENT: Received '%s' from server %s\r\n", message, SERVER_IP);   //print message from server
    sscanf(message, "%s %s %s %s", &c_status, &c_level, &c_blue, &c_line);
    status = atoi(c_status);
    level = atoi(c_level);
    blue = atoi(c_blue);
    c_blue[0] = (blue == 0) ? '0' : '1';
    line = atoi(c_line);
    pc.printf("CLIENT: Converted '%i %i %c %i' from server \r\n", status, level, c_blue[0], line);   //print converted message
}   //end receive()

/****CLOSE_ETHERNET CONNECTION***/
void end_eth(void){
    sock.close();       //close socket
    eth.disconnect();   //close Ethernet
}

/************ MAIN ************************************************************/
int main(void)
{
   touch.fall(&ISR1); // attach address ISR to interrupt falling edge
   butt3.rise(&ISR2); // attach address ISR to interrupt rising edge
   
    init_usb();     //initialize the PC interface
    init_eth();     //initialize the Ethernet connection

    while(true) { //repeat forever
        switch (status) {
            case 0 :
                init_load(); //Display Program Loaded status -> Flash Blue
                send();    //Connect to server
                receive(); //Wait for START trigger from Server
                break;
            case 1 : //Start the Beep Test
                blue = 1; //Make sure Blue is OFF
                //2 second COUNTDOWN red, purple, blue, GO!
                red = 0;
                wait_ms(500);
                blue = 0;
                wait_ms(500);
                red = 1;
                wait_ms(500);
                blue = 1;
                status = 2;
                line = true;
                for (i=0; i<4; i++) {
                    green = !green;
                    wait_ms(250);
                }
                green = 0;
                wait(72/(level - 1)); //half(t_shuttle - 1)
                red = 0;
                wait(72/(level)); //half(t_shuttle)
                send();
                red = 1;
                break;
            case 2 :  //Wait for message
                receive();
                if (line == false) {
                    if (blue == 1) blue = 0;
                    else {
                        status = 3; //Stop the Beep Test
                        break;
                    }
                } //end if-statement
                line = true; //reset the line flag
                if (t_level.read() >= 60) {
                    level++; //New level
                    t_level.reset();
                    t_level.start();//New level - Restart timer
                    for (i=0; i<4; i++) { //Flash green to indicate new level
                        green = !green;
                        wait_ms(250);
                    }
                } //end if-statement
                red = 1;
                green = 0; //Display Solid green
                wait(144/(level+16)/2); //t_shuttle = 20*3600/(8000+500*level)
                red = 0; //Display solid Yellow
                wait(144/(level+16)/2);
                send();               //Send message to server
                green = 1;
                break;
            case 3 : //Stop the Beep Test, delay, then reload
                red = blue = 0;
                send();               //Send message to client                
                //LED FLASHES PURPLE at 1HZ square waves for 2 minutes
                for (i=0; i<180; i++){
                    red = !red;
                    blue = !blue;
                    wait_ms(500);
                }
                status = 0; //Reset the Beep Test
                break;
            default :
                red = 0; green = 1;
                for (i=0; i<60; i++) { //FLASHING red green at 2Hz - status-error
                    red = !red;
                    green = !green;
                    wait_ms(250);
                }
                return(0);
                } //End switch-statement
    }//End while-loop
    
}   //end main()