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@2:6bfe732ba6bc, 2018-03-19 (annotated)
- Committer:
- bertgereels
- Date:
- Mon Mar 19 11:32:54 2018 +0000
- Revision:
- 2:6bfe732ba6bc
- Parent:
- 1:b5c534165dfe
- Child:
- 3:538e17979246
Project is now fully functional.
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 | 2:6bfe732ba6bc | 30 | //char *command_info[3]; |
bertgereels | 2:6bfe732ba6bc | 31 | //char ip_address[] = {'1','9','2','.','1','6','8','.','0','.','x','x','x'}; |
bertgereels | 2:6bfe732ba6bc | 32 | char ack_id[3]; |
bertgereels | 0:88d3b9015f7c | 33 | switch(CurrentSlaveState){ |
bertgereels | 1:b5c534165dfe | 34 | case STATE_INIT: |
bertgereels | 1:b5c534165dfe | 35 | { |
bertgereels | 1:b5c534165dfe | 36 | printf("----------------\r\n"); |
bertgereels | 1:b5c534165dfe | 37 | printf("Initiating slave\r\n"); |
bertgereels | 1:b5c534165dfe | 38 | printf("----------------\r\n"); |
bertgereels | 1:b5c534165dfe | 39 | |
bertgereels | 2:6bfe732ba6bc | 40 | memset(&ip_address[0], 0, sizeof(ip_address)); |
bertgereels | 2:6bfe732ba6bc | 41 | |
bertgereels | 2:6bfe732ba6bc | 42 | ip_address[0] = '1'; |
bertgereels | 2:6bfe732ba6bc | 43 | ip_address[1] = '9'; |
bertgereels | 2:6bfe732ba6bc | 44 | ip_address[2] = '2'; |
bertgereels | 2:6bfe732ba6bc | 45 | ip_address[3] = '.'; |
bertgereels | 2:6bfe732ba6bc | 46 | ip_address[4] = '1'; |
bertgereels | 2:6bfe732ba6bc | 47 | ip_address[5] = '6'; |
bertgereels | 2:6bfe732ba6bc | 48 | ip_address[6] = '8'; |
bertgereels | 2:6bfe732ba6bc | 49 | ip_address[7] = '.'; |
bertgereels | 2:6bfe732ba6bc | 50 | ip_address[8] = '0'; |
bertgereels | 2:6bfe732ba6bc | 51 | ip_address[9] = '.'; |
bertgereels | 2:6bfe732ba6bc | 52 | |
bertgereels | 1:b5c534165dfe | 53 | int temp[3]; |
bertgereels | 1:b5c534165dfe | 54 | int i = 0; |
bertgereels | 1:b5c534165dfe | 55 | do{ |
bertgereels | 1:b5c534165dfe | 56 | temp[i] = slaveId % 10; |
bertgereels | 1:b5c534165dfe | 57 | slaveId /= 10; |
bertgereels | 1:b5c534165dfe | 58 | i++; |
bertgereels | 1:b5c534165dfe | 59 | }while(slaveId !=0); |
bertgereels | 1:b5c534165dfe | 60 | |
bertgereels | 1:b5c534165dfe | 61 | char tempi[4]; |
bertgereels | 1:b5c534165dfe | 62 | sprintf(tempi, "%ld", temp[2]); |
bertgereels | 2:6bfe732ba6bc | 63 | ip_address[10] = *tempi; |
bertgereels | 1:b5c534165dfe | 64 | sprintf(tempi, "%ld", temp[1]); |
bertgereels | 2:6bfe732ba6bc | 65 | ip_address[11] = *tempi; |
bertgereels | 1:b5c534165dfe | 66 | sprintf(tempi, "%ld", temp[0]); |
bertgereels | 2:6bfe732ba6bc | 67 | ip_address[12] = *tempi; |
bertgereels | 2:6bfe732ba6bc | 68 | |
bertgereels | 2:6bfe732ba6bc | 69 | ip_address[13] = '\0'; |
bertgereels | 2:6bfe732ba6bc | 70 | |
bertgereels | 1:b5c534165dfe | 71 | eth_slave.init(ip_address, MASK, GATEWAY); |
bertgereels | 1:b5c534165dfe | 72 | eth_slave.connect(); |
bertgereels | 1:b5c534165dfe | 73 | |
bertgereels | 1:b5c534165dfe | 74 | sock_slave.bind(4000); |
bertgereels | 1:b5c534165dfe | 75 | |
bertgereels | 2:6bfe732ba6bc | 76 | command_info[0] = 0; |
bertgereels | 2:6bfe732ba6bc | 77 | |
bertgereels | 1:b5c534165dfe | 78 | CurrentSlaveState = STATE_WAIT_FOR_FRAME; |
bertgereels | 1:b5c534165dfe | 79 | break; |
bertgereels | 1:b5c534165dfe | 80 | } |
bertgereels | 0:88d3b9015f7c | 81 | case STATE_WAIT_FOR_FRAME: |
bertgereels | 0:88d3b9015f7c | 82 | { |
bertgereels | 1:b5c534165dfe | 83 | printf("Waiting for frame!\r\n"); |
bertgereels | 1:b5c534165dfe | 84 | int n = sock_slave.receiveFrom(master, in_buffer, sizeof(in_buffer)); |
bertgereels | 1:b5c534165dfe | 85 | in_buffer[n] = '\0'; |
bertgereels | 1:b5c534165dfe | 86 | CurrentSlaveState = STATE_HANDLE_FRAME; |
bertgereels | 0:88d3b9015f7c | 87 | break; |
bertgereels | 0:88d3b9015f7c | 88 | } |
bertgereels | 0:88d3b9015f7c | 89 | case STATE_HANDLE_FRAME: |
bertgereels | 0:88d3b9015f7c | 90 | { |
bertgereels | 1:b5c534165dfe | 91 | printf("Received message from server: '%s'\r\n", in_buffer); |
bertgereels | 2:6bfe732ba6bc | 92 | |
bertgereels | 2:6bfe732ba6bc | 93 | char *p = strtok(in_buffer, " "); |
bertgereels | 2:6bfe732ba6bc | 94 | command_info[0] = p; |
bertgereels | 2:6bfe732ba6bc | 95 | printf("Eerste strtok: '%s'\r\n", command_info[0]); |
bertgereels | 2:6bfe732ba6bc | 96 | char *q = strtok(NULL, " "); |
bertgereels | 2:6bfe732ba6bc | 97 | command_info[1] = q; |
bertgereels | 2:6bfe732ba6bc | 98 | printf("Tweede strtok: '%s'\r\n", command_info[1]); |
bertgereels | 2:6bfe732ba6bc | 99 | char *s = strtok(NULL, '\0'); |
bertgereels | 2:6bfe732ba6bc | 100 | command_info[2] = s; |
bertgereels | 2:6bfe732ba6bc | 101 | printf("Derde strtok: '%s'\r\n", command_info[2]); |
bertgereels | 2:6bfe732ba6bc | 102 | |
bertgereels | 2:6bfe732ba6bc | 103 | |
bertgereels | 2:6bfe732ba6bc | 104 | ack_id[0] = ip_address[10]; |
bertgereels | 2:6bfe732ba6bc | 105 | ack_id[1] = ip_address[11]; |
bertgereels | 2:6bfe732ba6bc | 106 | ack_id[2] = ip_address[12]; |
bertgereels | 1:b5c534165dfe | 107 | |
bertgereels | 1:b5c534165dfe | 108 | CurrentSlaveState = STATE_HANDLE_REQUEST; |
bertgereels | 0:88d3b9015f7c | 109 | break; |
bertgereels | 0:88d3b9015f7c | 110 | } |
bertgereels | 0:88d3b9015f7c | 111 | case STATE_HANDLE_REQUEST: |
bertgereels | 0:88d3b9015f7c | 112 | { |
bertgereels | 1:b5c534165dfe | 113 | slaveLcd->clearLcd(); |
bertgereels | 1:b5c534165dfe | 114 | slaveRgb->turnOnLed(""); |
bertgereels | 1:b5c534165dfe | 115 | temperatureValue = 0.0; |
bertgereels | 1:b5c534165dfe | 116 | potentiometerValue = 0.0; |
bertgereels | 1:b5c534165dfe | 117 | |
bertgereels | 1:b5c534165dfe | 118 | response = ""; |
bertgereels | 1:b5c534165dfe | 119 | |
bertgereels | 2:6bfe732ba6bc | 120 | if(strcmp(command_info[0], "PUT") == 0){ |
bertgereels | 2:6bfe732ba6bc | 121 | if(strcmp(command_info[1], "/LCD") == 0){ |
bertgereels | 1:b5c534165dfe | 122 | slaveLcd->displayChars(command_info[2]); |
bertgereels | 2:6bfe732ba6bc | 123 | response.append("ACK").append(" ").append("2.04").append(" ").append(ack_id).append(""); |
bertgereels | 1:b5c534165dfe | 124 | } |
bertgereels | 2:6bfe732ba6bc | 125 | else if(strcmp(command_info[1], "/LED") == 0){ |
bertgereels | 1:b5c534165dfe | 126 | string kleurtje(command_info[2]); |
bertgereels | 1:b5c534165dfe | 127 | slaveRgb->turnOnLed(kleurtje); |
bertgereels | 2:6bfe732ba6bc | 128 | response.append("ACK").append(" ").append("2.04").append(" ").append(ack_id).append(""); |
bertgereels | 1:b5c534165dfe | 129 | } |
bertgereels | 2:6bfe732ba6bc | 130 | else if(strcmp(command_info[1], "/BUZZER") == 0){ |
bertgereels | 1:b5c534165dfe | 131 | string indexes(command_info[2]); |
bertgereels | 1:b5c534165dfe | 132 | slaveBuzzerMusic->playMusic(indexes); |
bertgereels | 2:6bfe732ba6bc | 133 | response.append("ACK").append(" ").append("2.04").append(" ").append(ack_id).append(""); |
bertgereels | 1:b5c534165dfe | 134 | } |
bertgereels | 1:b5c534165dfe | 135 | else |
bertgereels | 1:b5c534165dfe | 136 | { |
bertgereels | 2:6bfe732ba6bc | 137 | response.append("ACK").append(" ").append("4.0").append("").append(ack_id); |
bertgereels | 1:b5c534165dfe | 138 | } |
bertgereels | 1:b5c534165dfe | 139 | |
bertgereels | 1:b5c534165dfe | 140 | } |
bertgereels | 2:6bfe732ba6bc | 141 | else if(strcmp(command_info[0], "GET") == 0){ |
bertgereels | 2:6bfe732ba6bc | 142 | if(strcmp(command_info[1], "/temperature") == 0){ |
bertgereels | 1:b5c534165dfe | 143 | temperatureValue = slaveTemp->readTemperature(); |
bertgereels | 1:b5c534165dfe | 144 | char temp[] = ""; |
bertgereels | 1:b5c534165dfe | 145 | sprintf(temp, "%.3f", temperatureValue); |
bertgereels | 2:6bfe732ba6bc | 146 | response.append("ACK").append(" ").append("2.05").append(" ").append(ack_id).append(" ").append(temp); |
bertgereels | 1:b5c534165dfe | 147 | } |
bertgereels | 2:6bfe732ba6bc | 148 | else if(strcmp(command_info[1], "/potentiometer") == 0){ |
bertgereels | 1:b5c534165dfe | 149 | potentiometerValue = slavePot->getPotValue(); |
bertgereels | 1:b5c534165dfe | 150 | char temp[] = ""; |
bertgereels | 1:b5c534165dfe | 151 | sprintf(temp, "%.3f", potentiometerValue); |
bertgereels | 2:6bfe732ba6bc | 152 | response.append("ACK").append(" ").append("2.05").append(" ").append(ack_id).append(" ").append(temp); |
bertgereels | 1:b5c534165dfe | 153 | } |
bertgereels | 1:b5c534165dfe | 154 | else{ |
bertgereels | 2:6bfe732ba6bc | 155 | response.append("ACK").append(" ").append("4.0").append(" ").append(ack_id); |
bertgereels | 1:b5c534165dfe | 156 | } |
bertgereels | 1:b5c534165dfe | 157 | } |
bertgereels | 1:b5c534165dfe | 158 | else{ |
bertgereels | 2:6bfe732ba6bc | 159 | response.append("ACK").append(" ").append("4.0").append(" ").append(ack_id); |
bertgereels | 1:b5c534165dfe | 160 | } |
bertgereels | 1:b5c534165dfe | 161 | CurrentSlaveState = STATE_SEND_ACKNOWLEDGEMENT; |
bertgereels | 1:b5c534165dfe | 162 | break; |
bertgereels | 1:b5c534165dfe | 163 | } |
bertgereels | 1:b5c534165dfe | 164 | case STATE_SEND_ACKNOWLEDGEMENT: |
bertgereels | 1:b5c534165dfe | 165 | { |
bertgereels | 1:b5c534165dfe | 166 | sock_slave.sendTo(master,(char *)response.c_str(), 512); |
bertgereels | 1:b5c534165dfe | 167 | |
bertgereels | 1:b5c534165dfe | 168 | memset(&response[0], 0, sizeof(response)); |
bertgereels | 1:b5c534165dfe | 169 | CurrentSlaveState = STATE_WAIT_FOR_FRAME; |
bertgereels | 0:88d3b9015f7c | 170 | break; |
bertgereels | 0:88d3b9015f7c | 171 | } |
bertgereels | 0:88d3b9015f7c | 172 | |
bertgereels | 0:88d3b9015f7c | 173 | } |
bertgereels | 0:88d3b9015f7c | 174 | } |
bertgereels | 0:88d3b9015f7c | 175 | |
bertgereels | 0:88d3b9015f7c | 176 | |
bertgereels | 0:88d3b9015f7c | 177 | } |