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

Committer:
bertgereels
Date:
Wed Mar 14 07:59:21 2018 +0000
Revision:
1:b5c534165dfe
Parent:
0:88d3b9015f7c
Child:
2:6bfe732ba6bc
Added slave state machine.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bertgereels 0:88d3b9015f7c 1 #include "master.h"
bertgereels 0:88d3b9015f7c 2 #include "command.h"
bertgereels 1:b5c534165dfe 3 #include "EthernetInterface.h"
bertgereels 0:88d3b9015f7c 4 #include <string.h>
bertgereels 0:88d3b9015f7c 5 #include <stdio.h>
bertgereels 0:88d3b9015f7c 6
bertgereels 1:b5c534165dfe 7 #define MAX_PACKET_SIZE 512
bertgereels 1:b5c534165dfe 8
bertgereels 0:88d3b9015f7c 9 namespace ProjectOne{
bertgereels 0:88d3b9015f7c 10
bertgereels 0:88d3b9015f7c 11 Serial pc(USBTX, USBRX);
bertgereels 1:b5c534165dfe 12
bertgereels 1:b5c534165dfe 13 const char* Master::MASK = "255.255.255.0";
bertgereels 1:b5c534165dfe 14 const char* Master::GATEWAY = "192.168.0.1";
bertgereels 1:b5c534165dfe 15
bertgereels 1:b5c534165dfe 16 EthernetInterface eth_master;
bertgereels 1:b5c534165dfe 17 UDPSocket sock_master;
bertgereels 1:b5c534165dfe 18 Endpoint client;
bertgereels 0:88d3b9015f7c 19
bertgereels 1:b5c534165dfe 20 Master::Master(int master_id){
bertgereels 1:b5c534165dfe 21 masterId = master_id;
bertgereels 0:88d3b9015f7c 22 CurrentMasterState = STATE_INIT;
bertgereels 0:88d3b9015f7c 23 }
bertgereels 0:88d3b9015f7c 24
bertgereels 0:88d3b9015f7c 25 void Master::handlePcData(void){
bertgereels 1:b5c534165dfe 26 char in_buffer[MAX_PACKET_SIZE];
bertgereels 1:b5c534165dfe 27 char client_ip[] = {'1','9','2','.','1','6','8','.','0','.','x','x','x'};
bertgereels 1:b5c534165dfe 28 char ip_address[] = {'1','9','2','.','1','6','8','.','0','.','x','x','x'};
bertgereels 0:88d3b9015f7c 29 switch(CurrentMasterState){
bertgereels 0:88d3b9015f7c 30 case STATE_INIT:
bertgereels 0:88d3b9015f7c 31 {
bertgereels 1:b5c534165dfe 32 //serial init
bertgereels 0:88d3b9015f7c 33 pc.baud(9600);
bertgereels 1:b5c534165dfe 34 sendMessageToPc("-----------------");
bertgereels 1:b5c534165dfe 35 sendMessageToPc("Initiating master");
bertgereels 1:b5c534165dfe 36 sendMessageToPc("-----------------");
bertgereels 1:b5c534165dfe 37
bertgereels 1:b5c534165dfe 38 int temp[3];
bertgereels 1:b5c534165dfe 39 int i = 0;
bertgereels 1:b5c534165dfe 40 do{
bertgereels 1:b5c534165dfe 41 temp[i] = masterId % 10;
bertgereels 1:b5c534165dfe 42 masterId /= 10;
bertgereels 1:b5c534165dfe 43 i++;
bertgereels 1:b5c534165dfe 44 }while(masterId !=0);
bertgereels 1:b5c534165dfe 45
bertgereels 1:b5c534165dfe 46 char tempi[4];
bertgereels 1:b5c534165dfe 47 sprintf(tempi, "%ld", temp[2]);
bertgereels 1:b5c534165dfe 48 ip_address[10] = *tempi;
bertgereels 1:b5c534165dfe 49 sprintf(tempi, "%ld", temp[1]);
bertgereels 1:b5c534165dfe 50 ip_address[11] = *tempi;
bertgereels 1:b5c534165dfe 51 sprintf(tempi, "%ld", temp[0]);
bertgereels 1:b5c534165dfe 52 ip_address[12] = *tempi;
bertgereels 1:b5c534165dfe 53
bertgereels 1:b5c534165dfe 54 eth_master.init(ip_address, MASK, GATEWAY);
bertgereels 1:b5c534165dfe 55 eth_master.connect();
bertgereels 1:b5c534165dfe 56
bertgereels 1:b5c534165dfe 57 CurrentMasterState = STATE_RECEIVING_FROM_PC;
bertgereels 0:88d3b9015f7c 58 break;
bertgereels 0:88d3b9015f7c 59 }
bertgereels 1:b5c534165dfe 60 case STATE_RECEIVING_FROM_PC:
bertgereels 0:88d3b9015f7c 61 {
bertgereels 1:b5c534165dfe 62 printf("Enter your command.\r\n");
bertgereels 1:b5c534165dfe 63 char temp1;
bertgereels 0:88d3b9015f7c 64
bertgereels 1:b5c534165dfe 65 char_counter_command = 0;
bertgereels 1:b5c534165dfe 66 for(int i = 0; i <= MAX_PACKET_SIZE; i ++){
bertgereels 1:b5c534165dfe 67 temp1 = pc.getc();
bertgereels 1:b5c534165dfe 68 if((int)temp1 == 13){
bertgereels 1:b5c534165dfe 69 CurrentMasterState = STATE_HANDLE_ID;
bertgereels 0:88d3b9015f7c 70 break;
bertgereels 0:88d3b9015f7c 71 }
bertgereels 1:b5c534165dfe 72 inputCommandArray[char_counter_command] = temp1;
bertgereels 1:b5c534165dfe 73 char_counter_command++;
bertgereels 0:88d3b9015f7c 74 }
bertgereels 1:b5c534165dfe 75 printf("The command you entered is: '%s'\r\n", inputCommandArray);
bertgereels 1:b5c534165dfe 76 CurrentMasterState = STATE_HANDLE_ID;
bertgereels 0:88d3b9015f7c 77
bertgereels 0:88d3b9015f7c 78 break;
bertgereels 0:88d3b9015f7c 79 }
bertgereels 1:b5c534165dfe 80 case STATE_HANDLE_ID:
bertgereels 1:b5c534165dfe 81 {
bertgereels 1:b5c534165dfe 82 sendMessageToPc("Enter client ID:");
bertgereels 1:b5c534165dfe 83 char_counter_id = 0;
bertgereels 1:b5c534165dfe 84 char temp2;
bertgereels 1:b5c534165dfe 85 for(int i = 0; i <= 3; i ++){
bertgereels 1:b5c534165dfe 86 temp2 = pc.getc();
bertgereels 1:b5c534165dfe 87 if((int)temp2 == 13){
bertgereels 1:b5c534165dfe 88 CurrentMasterState = STATE_SEND_UDP_PACKET;
bertgereels 1:b5c534165dfe 89 break;
bertgereels 1:b5c534165dfe 90 }
bertgereels 1:b5c534165dfe 91 client_id[char_counter_id] = temp2;
bertgereels 1:b5c534165dfe 92 char_counter_id++;
bertgereels 1:b5c534165dfe 93 }
bertgereels 1:b5c534165dfe 94 client_ip[10] = client_id[0];
bertgereels 1:b5c534165dfe 95 client_ip[11] = client_id[1];
bertgereels 1:b5c534165dfe 96 client_ip[12] = client_id[2];
bertgereels 1:b5c534165dfe 97 client.set_address((const char *)client_ip,4000);
bertgereels 1:b5c534165dfe 98
bertgereels 1:b5c534165dfe 99 CurrentMasterState = STATE_SEND_UDP_PACKET;
bertgereels 1:b5c534165dfe 100 break;
bertgereels 1:b5c534165dfe 101 }
bertgereels 1:b5c534165dfe 102 case STATE_SEND_UDP_PACKET:
bertgereels 0:88d3b9015f7c 103 {
bertgereels 1:b5c534165dfe 104 sock_master.init();
bertgereels 1:b5c534165dfe 105 sock_master.sendTo(client, inputCommandArray, sizeof(inputCommandArray));
bertgereels 1:b5c534165dfe 106 memset(&inputCommandArray[0], 0, sizeof(inputCommandArray)); //clear input array
bertgereels 1:b5c534165dfe 107 CurrentMasterState = STATE_HANDLE_RESPONSE;
bertgereels 1:b5c534165dfe 108 break;
bertgereels 1:b5c534165dfe 109 }
bertgereels 1:b5c534165dfe 110 case STATE_HANDLE_RESPONSE:
bertgereels 1:b5c534165dfe 111 {
bertgereels 1:b5c534165dfe 112 memset(&in_buffer[0], 0, sizeof(in_buffer)); //buffer clear voor ontvangst
bertgereels 1:b5c534165dfe 113 //start timer
bertgereels 1:b5c534165dfe 114 int n = sock_master.receiveFrom(client, in_buffer, sizeof(in_buffer));
bertgereels 1:b5c534165dfe 115 sock_master.close();
bertgereels 1:b5c534165dfe 116 //stop timer, niet voltooid -> error state
bertgereels 1:b5c534165dfe 117 printf("Received response: '%s'\r\n", in_buffer);
bertgereels 1:b5c534165dfe 118 memset(&in_buffer[0], 0, sizeof(in_buffer)); //buffer clear na ontvangst
bertgereels 1:b5c534165dfe 119 CurrentMasterState = STATE_RECEIVING_FROM_PC;
bertgereels 1:b5c534165dfe 120 break;
bertgereels 1:b5c534165dfe 121 }
bertgereels 1:b5c534165dfe 122 case STATE_ERROR_STATE:
bertgereels 1:b5c534165dfe 123 {
bertgereels 1:b5c534165dfe 124 printf("Error: did not receive a response from the client in time");
bertgereels 1:b5c534165dfe 125 memset(&in_buffer[0], 0, sizeof(in_buffer)); //buffer clear
bertgereels 1:b5c534165dfe 126 CurrentMasterState = STATE_RECEIVING_FROM_PC;
bertgereels 0:88d3b9015f7c 127 break;
bertgereels 0:88d3b9015f7c 128 }
bertgereels 0:88d3b9015f7c 129 }
bertgereels 0:88d3b9015f7c 130 }
bertgereels 0:88d3b9015f7c 131
bertgereels 0:88d3b9015f7c 132 void Master::sendMessageToPc(char *message_to_pc){
bertgereels 0:88d3b9015f7c 133 printf(message_to_pc);
bertgereels 0:88d3b9015f7c 134 printf("\r\n");
bertgereels 0:88d3b9015f7c 135 }
bertgereels 0:88d3b9015f7c 136
bertgereels 0:88d3b9015f7c 137 }
bertgereels 0:88d3b9015f7c 138
bertgereels 0:88d3b9015f7c 139
bertgereels 0:88d3b9015f7c 140
bertgereels 0:88d3b9015f7c 141
bertgereels 0:88d3b9015f7c 142
bertgereels 0:88d3b9015f7c 143