![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Part One of my Project Course. Implementation of simple I/O and a custom defined protocol over UDP/IP.
Dependencies: C12832 LM75B mbed EthernetInterface mbed-rtos
slave.cpp@3:538e17979246, 2018-03-23 (annotated)
- Committer:
- bertgereels
- Date:
- Fri Mar 23 13:42:13 2018 +0000
- Revision:
- 3:538e17979246
- Parent:
- 2:6bfe732ba6bc
Cleared response array before constructing ack.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
bertgereels | 0:88d3b9015f7c | 1 | #include "slave.h" |
bertgereels | 1:b5c534165dfe | 2 | #include "EthernetInterface.h" |
bertgereels | 1:b5c534165dfe | 3 | #include <stdio.h> |
bertgereels | 1:b5c534165dfe | 4 | #include <ctype.h> |
bertgereels | 1:b5c534165dfe | 5 | |
bertgereels | 1:b5c534165dfe | 6 | #define MAX_PACKET_SIZE 512 |
bertgereels | 0:88d3b9015f7c | 7 | |
bertgereels | 0:88d3b9015f7c | 8 | namespace ProjectOne{ |
bertgereels | 1:b5c534165dfe | 9 | |
bertgereels | 1:b5c534165dfe | 10 | const char* Slave::MASK = "255.255.255.0"; |
bertgereels | 1:b5c534165dfe | 11 | const char* Slave::GATEWAY = "192.168.0.1"; |
bertgereels | 0:88d3b9015f7c | 12 | |
bertgereels | 1:b5c534165dfe | 13 | EthernetInterface eth_slave; |
bertgereels | 1:b5c534165dfe | 14 | UDPSocket sock_slave; |
bertgereels | 1:b5c534165dfe | 15 | Endpoint master; |
bertgereels | 1:b5c534165dfe | 16 | |
bertgereels | 1:b5c534165dfe | 17 | Slave::Slave(int slave_id, Temperature *temperature, Potentiometer *potentiometer, LCD *lcd, RGB *rgb, BuzzerMusic *buzzerMusic) |
bertgereels | 1:b5c534165dfe | 18 | { |
bertgereels | 1:b5c534165dfe | 19 | slaveId = slave_id; |
bertgereels | 1:b5c534165dfe | 20 | slaveTemp = temperature; |
bertgereels | 1:b5c534165dfe | 21 | slavePot = potentiometer; |
bertgereels | 1:b5c534165dfe | 22 | slaveLcd = lcd; |
bertgereels | 1:b5c534165dfe | 23 | slaveRgb = rgb; |
bertgereels | 1:b5c534165dfe | 24 | slaveBuzzerMusic = buzzerMusic; |
bertgereels | 1:b5c534165dfe | 25 | CurrentSlaveState = STATE_INIT; |
bertgereels | 0:88d3b9015f7c | 26 | } |
bertgereels | 0:88d3b9015f7c | 27 | |
bertgereels | 0:88d3b9015f7c | 28 | void Slave::handleIncomingFrame(void){ |
bertgereels | 1:b5c534165dfe | 29 | char in_buffer[MAX_PACKET_SIZE]; |
bertgereels | 3:538e17979246 | 30 | char ack_id[4]; |
bertgereels | 3:538e17979246 | 31 | char response_array[512]; |
bertgereels | 0:88d3b9015f7c | 32 | switch(CurrentSlaveState){ |
bertgereels | 1:b5c534165dfe | 33 | case STATE_INIT: |
bertgereels | 1:b5c534165dfe | 34 | { |
bertgereels | 1:b5c534165dfe | 35 | printf("----------------\r\n"); |
bertgereels | 1:b5c534165dfe | 36 | printf("Initiating slave\r\n"); |
bertgereels | 1:b5c534165dfe | 37 | printf("----------------\r\n"); |
bertgereels | 1:b5c534165dfe | 38 | |
bertgereels | 2:6bfe732ba6bc | 39 | memset(&ip_address[0], 0, sizeof(ip_address)); |
bertgereels | 2:6bfe732ba6bc | 40 | |
bertgereels | 2:6bfe732ba6bc | 41 | ip_address[0] = '1'; |
bertgereels | 2:6bfe732ba6bc | 42 | ip_address[1] = '9'; |
bertgereels | 2:6bfe732ba6bc | 43 | ip_address[2] = '2'; |
bertgereels | 2:6bfe732ba6bc | 44 | ip_address[3] = '.'; |
bertgereels | 2:6bfe732ba6bc | 45 | ip_address[4] = '1'; |
bertgereels | 2:6bfe732ba6bc | 46 | ip_address[5] = '6'; |
bertgereels | 2:6bfe732ba6bc | 47 | ip_address[6] = '8'; |
bertgereels | 2:6bfe732ba6bc | 48 | ip_address[7] = '.'; |
bertgereels | 2:6bfe732ba6bc | 49 | ip_address[8] = '0'; |
bertgereels | 2:6bfe732ba6bc | 50 | ip_address[9] = '.'; |
bertgereels | 2:6bfe732ba6bc | 51 | |
bertgereels | 1:b5c534165dfe | 52 | int temp[3]; |
bertgereels | 1:b5c534165dfe | 53 | int i = 0; |
bertgereels | 1:b5c534165dfe | 54 | do{ |
bertgereels | 1:b5c534165dfe | 55 | temp[i] = slaveId % 10; |
bertgereels | 1:b5c534165dfe | 56 | slaveId /= 10; |
bertgereels | 1:b5c534165dfe | 57 | i++; |
bertgereels | 1:b5c534165dfe | 58 | }while(slaveId !=0); |
bertgereels | 1:b5c534165dfe | 59 | |
bertgereels | 1:b5c534165dfe | 60 | char tempi[4]; |
bertgereels | 1:b5c534165dfe | 61 | sprintf(tempi, "%ld", temp[2]); |
bertgereels | 2:6bfe732ba6bc | 62 | ip_address[10] = *tempi; |
bertgereels | 1:b5c534165dfe | 63 | sprintf(tempi, "%ld", temp[1]); |
bertgereels | 2:6bfe732ba6bc | 64 | ip_address[11] = *tempi; |
bertgereels | 1:b5c534165dfe | 65 | sprintf(tempi, "%ld", temp[0]); |
bertgereels | 2:6bfe732ba6bc | 66 | ip_address[12] = *tempi; |
bertgereels | 2:6bfe732ba6bc | 67 | |
bertgereels | 2:6bfe732ba6bc | 68 | ip_address[13] = '\0'; |
bertgereels | 2:6bfe732ba6bc | 69 | |
bertgereels | 1:b5c534165dfe | 70 | eth_slave.init(ip_address, MASK, GATEWAY); |
bertgereels | 1:b5c534165dfe | 71 | eth_slave.connect(); |
bertgereels | 1:b5c534165dfe | 72 | |
bertgereels | 1:b5c534165dfe | 73 | sock_slave.bind(4000); |
bertgereels | 1:b5c534165dfe | 74 | |
bertgereels | 2:6bfe732ba6bc | 75 | command_info[0] = 0; |
bertgereels | 2:6bfe732ba6bc | 76 | |
bertgereels | 1:b5c534165dfe | 77 | CurrentSlaveState = STATE_WAIT_FOR_FRAME; |
bertgereels | 1:b5c534165dfe | 78 | break; |
bertgereels | 1:b5c534165dfe | 79 | } |
bertgereels | 0:88d3b9015f7c | 80 | case STATE_WAIT_FOR_FRAME: |
bertgereels | 0:88d3b9015f7c | 81 | { |
bertgereels | 1:b5c534165dfe | 82 | printf("Waiting for frame!\r\n"); |
bertgereels | 1:b5c534165dfe | 83 | int n = sock_slave.receiveFrom(master, in_buffer, sizeof(in_buffer)); |
bertgereels | 1:b5c534165dfe | 84 | in_buffer[n] = '\0'; |
bertgereels | 1:b5c534165dfe | 85 | CurrentSlaveState = STATE_HANDLE_FRAME; |
bertgereels | 0:88d3b9015f7c | 86 | break; |
bertgereels | 0:88d3b9015f7c | 87 | } |
bertgereels | 0:88d3b9015f7c | 88 | case STATE_HANDLE_FRAME: |
bertgereels | 0:88d3b9015f7c | 89 | { |
bertgereels | 1:b5c534165dfe | 90 | printf("Received message from server: '%s'\r\n", in_buffer); |
bertgereels | 2:6bfe732ba6bc | 91 | |
bertgereels | 2:6bfe732ba6bc | 92 | char *p = strtok(in_buffer, " "); |
bertgereels | 2:6bfe732ba6bc | 93 | command_info[0] = p; |
bertgereels | 2:6bfe732ba6bc | 94 | char *q = strtok(NULL, " "); |
bertgereels | 2:6bfe732ba6bc | 95 | command_info[1] = q; |
bertgereels | 2:6bfe732ba6bc | 96 | char *s = strtok(NULL, '\0'); |
bertgereels | 3:538e17979246 | 97 | command_info[2] = s; |
bertgereels | 2:6bfe732ba6bc | 98 | |
bertgereels | 2:6bfe732ba6bc | 99 | ack_id[0] = ip_address[10]; |
bertgereels | 2:6bfe732ba6bc | 100 | ack_id[1] = ip_address[11]; |
bertgereels | 2:6bfe732ba6bc | 101 | ack_id[2] = ip_address[12]; |
bertgereels | 3:538e17979246 | 102 | ack_id[3] = '\0'; |
bertgereels | 1:b5c534165dfe | 103 | |
bertgereels | 1:b5c534165dfe | 104 | CurrentSlaveState = STATE_HANDLE_REQUEST; |
bertgereels | 0:88d3b9015f7c | 105 | break; |
bertgereels | 0:88d3b9015f7c | 106 | } |
bertgereels | 0:88d3b9015f7c | 107 | case STATE_HANDLE_REQUEST: |
bertgereels | 0:88d3b9015f7c | 108 | { |
bertgereels | 1:b5c534165dfe | 109 | slaveLcd->clearLcd(); |
bertgereels | 1:b5c534165dfe | 110 | slaveRgb->turnOnLed(""); |
bertgereels | 1:b5c534165dfe | 111 | temperatureValue = 0.0; |
bertgereels | 1:b5c534165dfe | 112 | potentiometerValue = 0.0; |
bertgereels | 1:b5c534165dfe | 113 | |
bertgereels | 3:538e17979246 | 114 | response.clear(); |
bertgereels | 3:538e17979246 | 115 | memset(&response_array[0], 0, sizeof(response_array)); |
bertgereels | 1:b5c534165dfe | 116 | |
bertgereels | 2:6bfe732ba6bc | 117 | if(strcmp(command_info[0], "PUT") == 0){ |
bertgereels | 2:6bfe732ba6bc | 118 | if(strcmp(command_info[1], "/LCD") == 0){ |
bertgereels | 1:b5c534165dfe | 119 | slaveLcd->displayChars(command_info[2]); |
bertgereels | 2:6bfe732ba6bc | 120 | response.append("ACK").append(" ").append("2.04").append(" ").append(ack_id).append(""); |
bertgereels | 1:b5c534165dfe | 121 | } |
bertgereels | 2:6bfe732ba6bc | 122 | else if(strcmp(command_info[1], "/LED") == 0){ |
bertgereels | 1:b5c534165dfe | 123 | string kleurtje(command_info[2]); |
bertgereels | 1:b5c534165dfe | 124 | slaveRgb->turnOnLed(kleurtje); |
bertgereels | 2:6bfe732ba6bc | 125 | response.append("ACK").append(" ").append("2.04").append(" ").append(ack_id).append(""); |
bertgereels | 1:b5c534165dfe | 126 | } |
bertgereels | 2:6bfe732ba6bc | 127 | else if(strcmp(command_info[1], "/BUZZER") == 0){ |
bertgereels | 1:b5c534165dfe | 128 | string indexes(command_info[2]); |
bertgereels | 1:b5c534165dfe | 129 | slaveBuzzerMusic->playMusic(indexes); |
bertgereels | 2:6bfe732ba6bc | 130 | response.append("ACK").append(" ").append("2.04").append(" ").append(ack_id).append(""); |
bertgereels | 1:b5c534165dfe | 131 | } |
bertgereels | 1:b5c534165dfe | 132 | else |
bertgereels | 1:b5c534165dfe | 133 | { |
bertgereels | 3:538e17979246 | 134 | response.append("ACK").append(" ").append("4.0").append(" ").append(ack_id); |
bertgereels | 1:b5c534165dfe | 135 | } |
bertgereels | 1:b5c534165dfe | 136 | |
bertgereels | 1:b5c534165dfe | 137 | } |
bertgereels | 2:6bfe732ba6bc | 138 | else if(strcmp(command_info[0], "GET") == 0){ |
bertgereels | 2:6bfe732ba6bc | 139 | if(strcmp(command_info[1], "/temperature") == 0){ |
bertgereels | 1:b5c534165dfe | 140 | temperatureValue = slaveTemp->readTemperature(); |
bertgereels | 1:b5c534165dfe | 141 | char temp[] = ""; |
bertgereels | 1:b5c534165dfe | 142 | sprintf(temp, "%.3f", temperatureValue); |
bertgereels | 2:6bfe732ba6bc | 143 | response.append("ACK").append(" ").append("2.05").append(" ").append(ack_id).append(" ").append(temp); |
bertgereels | 1:b5c534165dfe | 144 | } |
bertgereels | 2:6bfe732ba6bc | 145 | else if(strcmp(command_info[1], "/potentiometer") == 0){ |
bertgereels | 1:b5c534165dfe | 146 | potentiometerValue = slavePot->getPotValue(); |
bertgereels | 1:b5c534165dfe | 147 | char temp[] = ""; |
bertgereels | 1:b5c534165dfe | 148 | sprintf(temp, "%.3f", potentiometerValue); |
bertgereels | 2:6bfe732ba6bc | 149 | response.append("ACK").append(" ").append("2.05").append(" ").append(ack_id).append(" ").append(temp); |
bertgereels | 1:b5c534165dfe | 150 | } |
bertgereels | 1:b5c534165dfe | 151 | else{ |
bertgereels | 2:6bfe732ba6bc | 152 | response.append("ACK").append(" ").append("4.0").append(" ").append(ack_id); |
bertgereels | 1:b5c534165dfe | 153 | } |
bertgereels | 1:b5c534165dfe | 154 | } |
bertgereels | 1:b5c534165dfe | 155 | else{ |
bertgereels | 2:6bfe732ba6bc | 156 | response.append("ACK").append(" ").append("4.0").append(" ").append(ack_id); |
bertgereels | 1:b5c534165dfe | 157 | } |
bertgereels | 1:b5c534165dfe | 158 | CurrentSlaveState = STATE_SEND_ACKNOWLEDGEMENT; |
bertgereels | 1:b5c534165dfe | 159 | break; |
bertgereels | 1:b5c534165dfe | 160 | } |
bertgereels | 1:b5c534165dfe | 161 | case STATE_SEND_ACKNOWLEDGEMENT: |
bertgereels | 1:b5c534165dfe | 162 | { |
bertgereels | 3:538e17979246 | 163 | strcpy(response_array, response.c_str()); |
bertgereels | 3:538e17979246 | 164 | sock_slave.sendTo(master,(char *)response_array, 512); |
bertgereels | 1:b5c534165dfe | 165 | |
bertgereels | 3:538e17979246 | 166 | response.clear(); |
bertgereels | 3:538e17979246 | 167 | |
bertgereels | 1:b5c534165dfe | 168 | CurrentSlaveState = STATE_WAIT_FOR_FRAME; |
bertgereels | 0:88d3b9015f7c | 169 | break; |
bertgereels | 0:88d3b9015f7c | 170 | } |
bertgereels | 0:88d3b9015f7c | 171 | |
bertgereels | 0:88d3b9015f7c | 172 | } |
bertgereels | 0:88d3b9015f7c | 173 | } |
bertgereels | 0:88d3b9015f7c | 174 | |
bertgereels | 0:88d3b9015f7c | 175 | |
bertgereels | 0:88d3b9015f7c | 176 | } |