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

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?

UserRevisionLine numberNew 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 }