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

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