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