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-23
- Revision:
- 3:538e17979246
- Parent:
- 2:6bfe732ba6bc
File content as of revision 3:538e17979246:
#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 ack_id[4]; char response_array[512]; switch(CurrentSlaveState){ case STATE_INIT: { printf("----------------\r\n"); printf("Initiating slave\r\n"); printf("----------------\r\n"); memset(&ip_address[0], 0, sizeof(ip_address)); ip_address[0] = '1'; ip_address[1] = '9'; ip_address[2] = '2'; ip_address[3] = '.'; ip_address[4] = '1'; ip_address[5] = '6'; ip_address[6] = '8'; ip_address[7] = '.'; ip_address[8] = '0'; ip_address[9] = '.'; 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; ip_address[13] = '\0'; eth_slave.init(ip_address, MASK, GATEWAY); eth_slave.connect(); sock_slave.bind(4000); command_info[0] = 0; 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); char *p = strtok(in_buffer, " "); command_info[0] = p; char *q = strtok(NULL, " "); command_info[1] = q; char *s = strtok(NULL, '\0'); command_info[2] = s; ack_id[0] = ip_address[10]; ack_id[1] = ip_address[11]; ack_id[2] = ip_address[12]; ack_id[3] = '\0'; CurrentSlaveState = STATE_HANDLE_REQUEST; break; } case STATE_HANDLE_REQUEST: { slaveLcd->clearLcd(); slaveRgb->turnOnLed(""); temperatureValue = 0.0; potentiometerValue = 0.0; response.clear(); memset(&response_array[0], 0, sizeof(response_array)); 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(ack_id).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(ack_id).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(ack_id).append(""); } else { response.append("ACK").append(" ").append("4.0").append(" ").append(ack_id); } } 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.05").append(" ").append(ack_id).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.05").append(" ").append(ack_id).append(" ").append(temp); } else{ response.append("ACK").append(" ").append("4.0").append(" ").append(ack_id); } } else{ response.append("ACK").append(" ").append("4.0").append(" ").append(ack_id); } CurrentSlaveState = STATE_SEND_ACKNOWLEDGEMENT; break; } case STATE_SEND_ACKNOWLEDGEMENT: { strcpy(response_array, response.c_str()); sock_slave.sendTo(master,(char *)response_array, 512); response.clear(); CurrentSlaveState = STATE_WAIT_FOR_FRAME; break; } } } }