Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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()
Generated on Sat Jul 30 2022 23:17:09 by
1.7.2