![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
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
Diff: slave.cpp
- Revision:
- 1:b5c534165dfe
- Parent:
- 0:88d3b9015f7c
- Child:
- 2:6bfe732ba6bc
diff -r 88d3b9015f7c -r b5c534165dfe slave.cpp --- a/slave.cpp Mon Feb 26 11:25:59 2018 +0000 +++ b/slave.cpp Wed Mar 14 07:59:21 2018 +0000 @@ -1,23 +1,147 @@ #include "slave.h" +#include "EthernetInterface.h" +#include <stdio.h> +#include <ctype.h> + +#define MAX_PACKET_SIZE 512 namespace ProjectOne{ + + const char* Slave::MASK = "255.255.255.0"; + const char* Slave::GATEWAY = "192.168.0.1"; - Slave::Slave(void){ - CurrentSlaveState = STATE_WAIT_FOR_FRAME; + EthernetInterface eth_slave; + UDPSocket sock_slave; + Endpoint master; + + Slave::Slave(int slave_id, Temperature *temperature, Potentiometer *potentiometer, LCD *lcd, RGB *rgb, BuzzerMusic *buzzerMusic) + { + slaveId = slave_id; + slaveTemp = temperature; + slavePot = potentiometer; + slaveLcd = lcd; + slaveRgb = rgb; + slaveBuzzerMusic = buzzerMusic; + CurrentSlaveState = STATE_INIT; } void Slave::handleIncomingFrame(void){ + char in_buffer[MAX_PACKET_SIZE]; + char *command_info[3]; + char ip_address[] = {'1','9','2','.','1','6','8','.','0','.','x','x','x'}; switch(CurrentSlaveState){ + case STATE_INIT: + { + printf("----------------\r\n"); + printf("Initiating slave\r\n"); + printf("----------------\r\n"); + + int temp[3]; + int i = 0; + do{ + temp[i] = slaveId % 10; + slaveId /= 10; + i++; + }while(slaveId !=0); + + char tempi[4]; + sprintf(tempi, "%ld", temp[2]); + ip_address[10] = *tempi; + sprintf(tempi, "%ld", temp[1]); + ip_address[11] = *tempi; + sprintf(tempi, "%ld", temp[0]); + ip_address[12] = *tempi; + + eth_slave.init(ip_address, MASK, GATEWAY); + eth_slave.connect(); + + sock_slave.bind(4000); + + CurrentSlaveState = STATE_WAIT_FOR_FRAME; + break; + } case STATE_WAIT_FOR_FRAME: { + printf("Waiting for frame!\r\n"); + int n = sock_slave.receiveFrom(master, in_buffer, sizeof(in_buffer)); + in_buffer[n] = '\0'; + CurrentSlaveState = STATE_HANDLE_FRAME; break; } case STATE_HANDLE_FRAME: { + printf("Received message from server: '%s'\r\n", in_buffer); + + int i = 0; + char *p = strtok (in_buffer, " "); + while (p != NULL) + { + command_info[i++] = p; + p = strtok (NULL, " "); + } + + CurrentSlaveState = STATE_HANDLE_REQUEST; break; } case STATE_HANDLE_REQUEST: { + slaveLcd->clearLcd(); + slaveRgb->turnOnLed(""); + temperatureValue = 0.0; + potentiometerValue = 0.0; + + response = ""; + + if(strcmp(command_info[0], "/PUT") == 0){ + if(strcmp(command_info[1], "LCD") == 0){ + slaveLcd->displayChars(command_info[2]); + response.append("ACK").append(" ").append("2.04").append(" ").append("101").append(""); + } + else if(strcmp(command_info[1], "LED") == 0){ + string kleurtje(command_info[2]); + slaveRgb->turnOnLed(kleurtje); + response.append("ACK").append(" ").append("2.04").append(" ").append("101").append(""); + } + else if(strcmp(command_info[1], "BUZZER") == 0){ + string indexes(command_info[2]); + slaveBuzzerMusic->playMusic(indexes); + response.append("ACK").append(" ").append("2.04").append(" ").append("101").append(""); + } + else + { + response.append("ACK").append(" ").append("4.0").append(" ").append("101"); + } + + } + else if(strcmp(command_info[0], "/GET") == 0){ + if(strcmp(command_info[1], "temperature") == 0){ + temperatureValue = slaveTemp->readTemperature(); + char temp[] = ""; + sprintf(temp, "%.3f", temperatureValue); + response.append("ACK").append(" ").append("2.5").append(" ").append("101").append(" ").append(temp); + } + else if(strcmp(command_info[1], "potentiometer") == 0){ + potentiometerValue = slavePot->getPotValue(); + char temp[] = ""; + sprintf(temp, "%.3f", potentiometerValue); + response.append("ACK").append(" ").append("2.5").append(" ").append("101").append(" ").append(temp); + } + else{ + response.append("ACK").append(" ").append("4.0").append(" ").append("101"); + } + } + else{ + response.append("ACK").append(" ").append("4.0").append(" ").append("101"); + } + CurrentSlaveState = STATE_SEND_ACKNOWLEDGEMENT; + break; + } + case STATE_SEND_ACKNOWLEDGEMENT: + { + sock_slave.sendTo(master,(char *)response.c_str(), 512); + + memset(&response[0], 0, sizeof(response)); + CurrentSlaveState = STATE_WAIT_FOR_FRAME; break; }