![](/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
slave.cpp
- Committer:
- bertgereels
- Date:
- 2018-03-14
- Revision:
- 1:b5c534165dfe
- Parent:
- 0:88d3b9015f7c
- Child:
- 2:6bfe732ba6bc
File content as of revision 1:b5c534165dfe:
#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"; 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; } } } }