Shuttle Test Server

Dependencies:   mbed-rtos mbed

Committer:
tkanavathy
Date:
Fri Jan 13 13:33:09 2017 +0000
Revision:
0:8ef98f26a429
RTES - 20m Shuttle Test - Server

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tkanavathy 0:8ef98f26a429 1 /*-- SERVER INCLUDES ---------------------------------------------------------*/
tkanavathy 0:8ef98f26a429 2 #include "mbed.h"
tkanavathy 0:8ef98f26a429 3 #include "EthernetInterface.h"
tkanavathy 0:8ef98f26a429 4 /*-- GLOBAL CONSTANTS --------------------------------------------------------*/
tkanavathy 0:8ef98f26a429 5 const int PORT = 7; //arbitrary port
tkanavathy 0:8ef98f26a429 6 /*-- IP CONSTANT CONFIGURATION --*/
tkanavathy 0:8ef98f26a429 7 static const char* SERVER_IP = "192.168.1.101"; //IP of server board
tkanavathy 0:8ef98f26a429 8
tkanavathy 0:8ef98f26a429 9 static const char* MASK = "255.255.255.0"; //mask
tkanavathy 0:8ef98f26a429 10 static const char* GATEWAY = "192.168.1.1"; //gateway
tkanavathy 0:8ef98f26a429 11 /*-- INITIALISATION ----------------------------------------------------------*/
tkanavathy 0:8ef98f26a429 12 Serial pc(USBTX, USBRX); //create PC interface
tkanavathy 0:8ef98f26a429 13 EthernetInterface eth; //create ethernet
tkanavathy 0:8ef98f26a429 14 UDPSocket server; //create Ethernet server
tkanavathy 0:8ef98f26a429 15 Endpoint client; //create endpoint
tkanavathy 0:8ef98f26a429 16 /* -- DECLARE LEDs for STATUS DISPLAY --*/
tkanavathy 0:8ef98f26a429 17 DigitalOut red(LED_RED);
tkanavathy 0:8ef98f26a429 18 DigitalOut green(LED_GREEN);
tkanavathy 0:8ef98f26a429 19 DigitalOut blue(LED_BLUE);
tkanavathy 0:8ef98f26a429 20 /*-- DECLARE INTERRUPTS --*/
tkanavathy 0:8ef98f26a429 21 InterruptIn touch(SW2);
tkanavathy 0:8ef98f26a429 22 InterruptIn butt3(SW3);
tkanavathy 0:8ef98f26a429 23 Timer t_level, t_shuttle; //define timers to measure each level and shuttle
tkanavathy 0:8ef98f26a429 24 /*--VARIABLES-----------------------------------------------------------------*/
tkanavathy 0:8ef98f26a429 25 int i; //Loop iteration counter
tkanavathy 0:8ef98f26a429 26 int n; //size of received message
tkanavathy 0:8ef98f26a429 27 char message[6] = {0,01,1,1,'\0'}; //MESSAGE status[1],level[2],blue[1],line[1]
tkanavathy 0:8ef98f26a429 28 char c_status[1], c_level[2], c_blue[1], c_line[1]; //receival buffers
tkanavathy 0:8ef98f26a429 29
tkanavathy 0:8ef98f26a429 30 /*---- Status of program? ----*/
tkanavathy 0:8ef98f26a429 31 /*------ 0 = Loaded --*/
tkanavathy 0:8ef98f26a429 32 /*------ 1 = Start --*/
tkanavathy 0:8ef98f26a429 33 /*------ 2 = In Progress --*/
tkanavathy 0:8ef98f26a429 34 /*------ 3 = Stop --*/
tkanavathy 0:8ef98f26a429 35 int status, level; //Keep track of the level of the Beep Test
tkanavathy 0:8ef98f26a429 36 bool line; //Has runner crossed the line?
tkanavathy 0:8ef98f26a429 37
tkanavathy 0:8ef98f26a429 38 /*-- FUNCTION DECLARATIONS ---------------------------------------------------*/
tkanavathy 0:8ef98f26a429 39 void init_usb(void); //initializes pc.printf if required
tkanavathy 0:8ef98f26a429 40 void init_eth(void); //initializes Ethernet
tkanavathy 0:8ef98f26a429 41 void init_load(void); //initialise program
tkanavathy 0:8ef98f26a429 42 void send(void); //Send packets
tkanavathy 0:8ef98f26a429 43 void receive(void); //receives packets
tkanavathy 0:8ef98f26a429 44 int main(void); //main
tkanavathy 0:8ef98f26a429 45
tkanavathy 0:8ef98f26a429 46
tkanavathy 0:8ef98f26a429 47 /*-- INTERRUPT DEFINITIONS ---------------------------------------------------*/
tkanavathy 0:8ef98f26a429 48 void ISR1()
tkanavathy 0:8ef98f26a429 49 {
tkanavathy 0:8ef98f26a429 50 //Did the runner cross line in time, before showing RED?
tkanavathy 0:8ef98f26a429 51 if (red == 0) line = false; //Crossed line late
tkanavathy 0:8ef98f26a429 52 else line = true; // Crossed line in time
tkanavathy 0:8ef98f26a429 53 }
tkanavathy 0:8ef98f26a429 54 void ISR2()
tkanavathy 0:8ef98f26a429 55 {
tkanavathy 0:8ef98f26a429 56 //Start/End Shuttle Run Test
tkanavathy 0:8ef98f26a429 57 if (status == 0) status = 1;
tkanavathy 0:8ef98f26a429 58 else status = 0;
tkanavathy 0:8ef98f26a429 59 }
tkanavathy 0:8ef98f26a429 60
tkanavathy 0:8ef98f26a429 61 /*-- FUNCTION DEFINITIONS ---------------------------------------------------*/
tkanavathy 0:8ef98f26a429 62 /****INIT_USB BAUD RATE***/
tkanavathy 0:8ef98f26a429 63 void init_usb(void)
tkanavathy 0:8ef98f26a429 64 {
tkanavathy 0:8ef98f26a429 65 pc.baud(9600); //baud rate
tkanavathy 0:8ef98f26a429 66 }
tkanavathy 0:8ef98f26a429 67
tkanavathy 0:8ef98f26a429 68 /****OPEN_ETHERNET CONNECTION***/
tkanavathy 0:8ef98f26a429 69 void init_eth(void)
tkanavathy 0:8ef98f26a429 70 {
tkanavathy 0:8ef98f26a429 71 eth.init(SERVER_IP, MASK, GATEWAY); //set up IP
tkanavathy 0:8ef98f26a429 72 eth.connect(); //connect ethernet
tkanavathy 0:8ef98f26a429 73 pc.printf("\nSERVER - Server IP Address is %s\r\n", eth.getIPAddress()); //get server IP address;
tkanavathy 0:8ef98f26a429 74
tkanavathy 0:8ef98f26a429 75 server.bind(PORT); //bind server
tkanavathy 0:8ef98f26a429 76 }
tkanavathy 0:8ef98f26a429 77
tkanavathy 0:8ef98f26a429 78 /**** INITIALISE PROGRAM PARAMETERS***/
tkanavathy 0:8ef98f26a429 79 void init_load(void)
tkanavathy 0:8ef98f26a429 80 {
tkanavathy 0:8ef98f26a429 81 //Initialise flags and reset timers
tkanavathy 0:8ef98f26a429 82 level = 1; //Reset to starting level 1
tkanavathy 0:8ef98f26a429 83 line = true;
tkanavathy 0:8ef98f26a429 84 //Server LEDs flashes RED at 1Hz Loaded Status
tkanavathy 0:8ef98f26a429 85 red = !red;
tkanavathy 0:8ef98f26a429 86 green = 1;
tkanavathy 0:8ef98f26a429 87 blue = 1;
tkanavathy 0:8ef98f26a429 88 wait(0.5);
tkanavathy 0:8ef98f26a429 89 //Reset the timers
tkanavathy 0:8ef98f26a429 90 t_level.reset();
tkanavathy 0:8ef98f26a429 91 t_shuttle.reset(); //20*3600/(8000+500*level) = 144/(level+16) sec
tkanavathy 0:8ef98f26a429 92 }
tkanavathy 0:8ef98f26a429 93
tkanavathy 0:8ef98f26a429 94 /**** SEND MESSAGE ***/
tkanavathy 0:8ef98f26a429 95 void send(void)
tkanavathy 0:8ef98f26a429 96 {
tkanavathy 0:8ef98f26a429 97 sprintf(message, "%i %02i %i %i %c", status, level, int(blue), line, '\0');
tkanavathy 0:8ef98f26a429 98 server.sendTo(client, message, sizeof(message));
tkanavathy 0:8ef98f26a429 99 pc.printf("SERVER: Send '%s' to client %s\r\n", message, client.get_address()); //print message sent
tkanavathy 0:8ef98f26a429 100 }
tkanavathy 0:8ef98f26a429 101
tkanavathy 0:8ef98f26a429 102 /**** RECEIVE ***/
tkanavathy 0:8ef98f26a429 103 void receive(void)
tkanavathy 0:8ef98f26a429 104 {
tkanavathy 0:8ef98f26a429 105 pc.printf("\nSERVER: Waiting for UDP packet...\r\n"); //wait for packet
tkanavathy 0:8ef98f26a429 106 n = server.receiveFrom(client, message, sizeof(message)); //receive message from client
tkanavathy 0:8ef98f26a429 107 message[n] = ' '; //Remove \0 from message
tkanavathy 0:8ef98f26a429 108 pc.printf("SERVER: Received '%s' from client %s\r\n", message, client.get_address()); //print message from client
tkanavathy 0:8ef98f26a429 109 sscanf(message, "%s %s %s %s", &c_status, &c_level, &c_blue, &c_line);
tkanavathy 0:8ef98f26a429 110 status = atoi(c_status);
tkanavathy 0:8ef98f26a429 111 level = atoi(c_level);
tkanavathy 0:8ef98f26a429 112 blue = atoi(c_blue);
tkanavathy 0:8ef98f26a429 113 c_blue[0] = (blue == 0) ? '0' : '1';
tkanavathy 0:8ef98f26a429 114 line = atoi(c_line);
tkanavathy 0:8ef98f26a429 115 pc.printf("SERVER: Converted '%i %i %c %i' from client \r\n", status, level, c_blue[0], line); //print converted message
tkanavathy 0:8ef98f26a429 116 } //end receive()
tkanavathy 0:8ef98f26a429 117
tkanavathy 0:8ef98f26a429 118 /************ MAIN ************************************************************/
tkanavathy 0:8ef98f26a429 119 int main(void)
tkanavathy 0:8ef98f26a429 120 {
tkanavathy 0:8ef98f26a429 121 touch.fall(&ISR1); // attach address ISR to interrupt falling edge
tkanavathy 0:8ef98f26a429 122 butt3.rise(&ISR2); // attach address ISR to interrupt rising edge
tkanavathy 0:8ef98f26a429 123
tkanavathy 0:8ef98f26a429 124 init_usb(); //initialize the PC interface
tkanavathy 0:8ef98f26a429 125 init_eth(); //initialize the Ethernet connection
tkanavathy 0:8ef98f26a429 126 receive(); //Wait for connection from client
tkanavathy 0:8ef98f26a429 127
tkanavathy 0:8ef98f26a429 128 while (true) { //Repeat forever
tkanavathy 0:8ef98f26a429 129 switch (status) {
tkanavathy 0:8ef98f26a429 130 case 0 :
tkanavathy 0:8ef98f26a429 131 init_load(); //Display PROGRAM LOADED (SERVER) status
tkanavathy 0:8ef98f26a429 132 break;
tkanavathy 0:8ef98f26a429 133 case 1 : //Start Beep Test
tkanavathy 0:8ef98f26a429 134 send(); //Send Message to client
tkanavathy 0:8ef98f26a429 135 t_level.start(); //Start timer to measure each level
tkanavathy 0:8ef98f26a429 136 t_shuttle.start(); //Start timer to specify each shuttle
tkanavathy 0:8ef98f26a429 137 red = 0;
tkanavathy 0:8ef98f26a429 138 status = 2; //Change status to In Progress
tkanavathy 0:8ef98f26a429 139 break;
tkanavathy 0:8ef98f26a429 140 case 2 : //Wait for message
tkanavathy 0:8ef98f26a429 141 receive();
tkanavathy 0:8ef98f26a429 142 if (line == false) {
tkanavathy 0:8ef98f26a429 143 if (blue == 1) blue = 0;
tkanavathy 0:8ef98f26a429 144 else {
tkanavathy 0:8ef98f26a429 145 status = 3; //Stop the Beep Test
tkanavathy 0:8ef98f26a429 146 break;
tkanavathy 0:8ef98f26a429 147 }
tkanavathy 0:8ef98f26a429 148 } //end if-statement
tkanavathy 0:8ef98f26a429 149 line = true; //reset the line flag
tkanavathy 0:8ef98f26a429 150 if (t_level.read() >= 60) {
tkanavathy 0:8ef98f26a429 151 level++; //New level
tkanavathy 0:8ef98f26a429 152 t_level.reset();
tkanavathy 0:8ef98f26a429 153 t_level.start();//New level - Restart timer
tkanavathy 0:8ef98f26a429 154 for (i=0; i<4; i++) { //Flash green to indicate new level
tkanavathy 0:8ef98f26a429 155 green = !green;
tkanavathy 0:8ef98f26a429 156 wait_ms(250);
tkanavathy 0:8ef98f26a429 157 }
tkanavathy 0:8ef98f26a429 158 } //end if-statement
tkanavathy 0:8ef98f26a429 159 red = 1;
tkanavathy 0:8ef98f26a429 160 green = 0; //Display Solid green
tkanavathy 0:8ef98f26a429 161 wait(72/(level+16)); //half(t_shuttle)
tkanavathy 0:8ef98f26a429 162 red = 0; //Display solid Yellow
tkanavathy 0:8ef98f26a429 163 wait(72/(level+16));
tkanavathy 0:8ef98f26a429 164 send(); //Send message to client
tkanavathy 0:8ef98f26a429 165 green = 1;
tkanavathy 0:8ef98f26a429 166 break;
tkanavathy 0:8ef98f26a429 167 case 3 : //Stop the Beep Test, delay, then reload
tkanavathy 0:8ef98f26a429 168 red = blue = 0;
tkanavathy 0:8ef98f26a429 169 send(); //Send message to client
tkanavathy 0:8ef98f26a429 170 //LED FLASHES PURPLE at 1HZ square waves for 2 minutes
tkanavathy 0:8ef98f26a429 171 for (i=0; i<180; i++){
tkanavathy 0:8ef98f26a429 172 red = !red;
tkanavathy 0:8ef98f26a429 173 blue = !blue;
tkanavathy 0:8ef98f26a429 174 wait_ms(500);
tkanavathy 0:8ef98f26a429 175 }
tkanavathy 0:8ef98f26a429 176 status = 0; //Reset the Beep Test
tkanavathy 0:8ef98f26a429 177 break;
tkanavathy 0:8ef98f26a429 178 default :
tkanavathy 0:8ef98f26a429 179 red = 0; green = 1;
tkanavathy 0:8ef98f26a429 180 for (i=0; i<60; i++) { //FLASHING red green at 2Hz - status-error
tkanavathy 0:8ef98f26a429 181 red = !red;
tkanavathy 0:8ef98f26a429 182 green = !green;
tkanavathy 0:8ef98f26a429 183 wait_ms(250);
tkanavathy 0:8ef98f26a429 184 }
tkanavathy 0:8ef98f26a429 185 return(0);
tkanavathy 0:8ef98f26a429 186 } //End Switch-statement
tkanavathy 0:8ef98f26a429 187 } //End while-loop
tkanavathy 0:8ef98f26a429 188 } //End Main()