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

Revision:
1:b5c534165dfe
Parent:
0:88d3b9015f7c
Child:
2:6bfe732ba6bc
--- 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;
             }