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@1:b5c534165dfe, 2018-03-14 (annotated)
- 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?
User | Revision | Line number | New 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 |