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