Therverson Kanavathy / Mbed 2 deprecated RTES-20m_Shuttle_Test-Server

Dependencies:   mbed-rtos mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 /*-- SERVER INCLUDES ---------------------------------------------------------*/
00002 #include "mbed.h"
00003 #include "EthernetInterface.h"
00004 /*-- GLOBAL CONSTANTS --------------------------------------------------------*/
00005 const int PORT = 7;                             //arbitrary port
00006 /*-- IP CONSTANT CONFIGURATION --*/
00007 static const char* SERVER_IP = "192.168.1.101"; //IP of server board
00008 
00009 static const char* MASK = "255.255.255.0";      //mask
00010 static const char* GATEWAY = "192.168.1.1";     //gateway
00011 /*-- INITIALISATION ----------------------------------------------------------*/
00012 Serial pc(USBTX, USBRX);        //create PC interface
00013 EthernetInterface eth;          //create ethernet
00014 UDPSocket server;               //create Ethernet server
00015 Endpoint client;                //create endpoint
00016 /* -- DECLARE LEDs for STATUS DISPLAY --*/
00017 DigitalOut red(LED_RED);
00018 DigitalOut green(LED_GREEN);
00019 DigitalOut blue(LED_BLUE);
00020 /*-- DECLARE INTERRUPTS --*/
00021 InterruptIn touch(SW2);
00022 InterruptIn butt3(SW3);
00023 Timer t_level, t_shuttle; //define timers to measure each level and shuttle
00024 /*--VARIABLES-----------------------------------------------------------------*/
00025 int i; //Loop iteration counter
00026 int n;                  //size of received message
00027 char message[6] = {0,01,1,1,'\0'};  //MESSAGE status[1],level[2],blue[1],line[1]
00028 char c_status[1], c_level[2], c_blue[1], c_line[1];  //receival buffers
00029 
00030 /*---- Status of program? ----*/
00031 /*------ 0 = Loaded      --*/
00032 /*------ 1 = Start       --*/
00033 /*------ 2 = In Progress --*/
00034 /*------ 3 = Stop        --*/
00035 int status, level; //Keep track of the level of the Beep Test
00036 bool line;  //Has runner crossed the line?
00037 
00038 /*-- FUNCTION DECLARATIONS ---------------------------------------------------*/
00039 void init_usb(void);    //initializes pc.printf if required
00040 void init_eth(void);    //initializes Ethernet
00041 void init_load(void);   //initialise program
00042 void send(void);        //Send packets
00043 void receive(void);     //receives packets
00044 int main(void);         //main
00045 
00046 
00047 /*-- INTERRUPT DEFINITIONS ---------------------------------------------------*/
00048 void ISR1()
00049 {
00050     //Did the runner cross line in time, before showing RED?
00051     if (red == 0) line = false; //Crossed line late
00052     else line = true; // Crossed line in time
00053 }
00054 void ISR2()
00055 {
00056     //Start/End Shuttle Run Test
00057     if (status == 0) status = 1;
00058     else status = 0;
00059 }
00060 
00061 /*-- FUNCTION DEFINITIONS ---------------------------------------------------*/
00062 /****INIT_USB BAUD RATE***/
00063 void init_usb(void)
00064 {
00065     pc.baud(9600);    //baud rate
00066 }
00067 
00068 /****OPEN_ETHERNET CONNECTION***/
00069 void init_eth(void)
00070 {
00071     eth.init(SERVER_IP, MASK, GATEWAY);                       //set up IP
00072     eth.connect();                                       //connect ethernet
00073     pc.printf("\nSERVER - Server IP Address is %s\r\n", eth.getIPAddress());    //get server IP address;
00074 
00075     server.bind(PORT);                                       //bind server
00076 }
00077 
00078 /**** INITIALISE PROGRAM PARAMETERS***/
00079 void init_load(void)
00080 {
00081     //Initialise flags and reset timers
00082     level = 1; //Reset to starting level 1
00083     line = true;
00084     //Server LEDs flashes RED at 1Hz Loaded Status
00085     red = !red;
00086     green = 1;
00087     blue = 1;
00088     wait(0.5);
00089     //Reset the timers
00090     t_level.reset();
00091     t_shuttle.reset(); //20*3600/(8000+500*level) = 144/(level+16) sec
00092 }
00093 
00094 /**** SEND MESSAGE ***/
00095 void send(void)
00096 {
00097     sprintf(message, "%i %02i %i %i %c", status, level, int(blue), line, '\0');
00098     server.sendTo(client, message, sizeof(message));
00099     pc.printf("SERVER: Send '%s' to client %s\r\n", message, client.get_address()); //print message sent
00100 }
00101 
00102 /**** RECEIVE ***/
00103 void receive(void)
00104 {
00105     pc.printf("\nSERVER: Waiting for UDP packet...\r\n");                                      //wait for packet
00106     n = server.receiveFrom(client, message, sizeof(message)); //receive message from client
00107     message[n] = ' ';                               //Remove \0 from message
00108     pc.printf("SERVER: Received '%s' from client %s\r\n", message, client.get_address());   //print message from client
00109     sscanf(message, "%s %s %s %s", &c_status, &c_level, &c_blue, &c_line);
00110     status = atoi(c_status);
00111     level = atoi(c_level);
00112     blue = atoi(c_blue);
00113     c_blue[0] = (blue == 0) ? '0' : '1';
00114     line = atoi(c_line);
00115     pc.printf("SERVER: Converted '%i %i %c %i' from client \r\n", status, level, c_blue[0], line);   //print converted message
00116 }   //end receive()
00117 
00118 /************ MAIN ************************************************************/
00119 int main(void)
00120 {
00121     touch.fall(&ISR1); // attach address ISR to interrupt falling edge
00122     butt3.rise(&ISR2); // attach address ISR to interrupt rising edge
00123 
00124     init_usb();     //initialize the PC interface
00125     init_eth();     //initialize the Ethernet connection
00126     receive();     //Wait for connection from client
00127     
00128     while (true) { //Repeat forever
00129         switch (status) {
00130             case 0 :
00131                 init_load(); //Display PROGRAM LOADED (SERVER) status
00132                 break;
00133             case 1 : //Start Beep Test
00134                 send();            //Send Message to client
00135                 t_level.start();   //Start timer to measure each level
00136                 t_shuttle.start(); //Start timer to specify each shuttle
00137                 red = 0;
00138                 status = 2; //Change status to In Progress
00139                 break;
00140             case 2 : //Wait for message
00141                 receive();
00142                 if (line == false) {
00143                     if (blue == 1) blue = 0;
00144                     else {
00145                         status = 3; //Stop the Beep Test
00146                         break;
00147                     }
00148                 } //end if-statement
00149                 line = true; //reset the line flag
00150                 if (t_level.read() >= 60) {
00151                     level++; //New level
00152                     t_level.reset();
00153                     t_level.start();//New level - Restart timer
00154                     for (i=0; i<4; i++) { //Flash green to indicate new level
00155                         green = !green;
00156                         wait_ms(250);
00157                     }
00158                 } //end if-statement
00159                 red = 1;
00160                 green = 0; //Display Solid green
00161                 wait(72/(level+16)); //half(t_shuttle)
00162                 red = 0;  //Display solid Yellow
00163                 wait(72/(level+16));
00164                 send();               //Send message to client
00165                 green = 1;
00166                 break;
00167             case 3 : //Stop the Beep Test, delay, then reload
00168                 red = blue = 0;
00169                 send();               //Send message to client                
00170                 //LED FLASHES PURPLE at 1HZ square waves for 2 minutes
00171                 for (i=0; i<180; i++){
00172                     red = !red;
00173                     blue = !blue;
00174                     wait_ms(500);
00175                 }
00176                 status = 0; //Reset the Beep Test
00177                 break;
00178             default :
00179                 red = 0; green = 1;
00180                 for (i=0; i<60; i++) { //FLASHING red green at 2Hz - status-error
00181                     red = !red;
00182                     green = !green;
00183                     wait_ms(250);
00184                 }
00185                 return(0);
00186         } //End Switch-statement
00187     } //End while-loop
00188 }   //End Main()