![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Shuttle Test Server
main.cpp@0:8ef98f26a429, 2017-01-13 (annotated)
- 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?
User | Revision | Line number | New 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() |