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:
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?

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