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:
Fri Mar 23 13:42:13 2018 +0000
Revision:
3:538e17979246
Parent:
2:6bfe732ba6bc
Cleared response array before constructing ack.

Who changed what in which revision?

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