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
master.cpp@3:538e17979246, 2018-03-23 (annotated)
- 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?
User | Revision | Line number | New 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 |