
Implementatie van de opdracht Round Robin
StateMachine.cpp@1:0016a14c76bb, 2020-11-03 (annotated)
- Committer:
- benboydens
- Date:
- Tue Nov 03 15:41:06 2020 +0000
- Revision:
- 1:0016a14c76bb
- Parent:
- 0:825bd2920b6d
Round Robin complete
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
benboydens | 0:825bd2920b6d | 1 | #include "StateMachine.h" |
benboydens | 0:825bd2920b6d | 2 | #include "LM75B.h" |
benboydens | 0:825bd2920b6d | 3 | #include "C12832.h" |
benboydens | 0:825bd2920b6d | 4 | |
benboydens | 0:825bd2920b6d | 5 | #define CLIENT_IP "192.168.0.24" |
benboydens | 0:825bd2920b6d | 6 | |
benboydens | 0:825bd2920b6d | 7 | |
benboydens | 0:825bd2920b6d | 8 | C12832 lcd(D11, D13, D12, D7, D10); // Using Arduino pin notation |
benboydens | 0:825bd2920b6d | 9 | LM75B lm75b(D14,D15); // Temperature sensor |
benboydens | 0:825bd2920b6d | 10 | AnalogIn pot1 (A0); // Potentiometer 1 |
benboydens | 0:825bd2920b6d | 11 | |
benboydens | 0:825bd2920b6d | 12 | // Joystick Pins |
benboydens | 0:825bd2920b6d | 13 | DigitalIn up(A2); |
benboydens | 0:825bd2920b6d | 14 | DigitalIn down(A3); |
benboydens | 0:825bd2920b6d | 15 | DigitalIn left(A4); |
benboydens | 0:825bd2920b6d | 16 | DigitalIn right(A5); |
benboydens | 0:825bd2920b6d | 17 | DigitalIn fire(D4); |
benboydens | 0:825bd2920b6d | 18 | |
benboydens | 0:825bd2920b6d | 19 | |
benboydens | 0:825bd2920b6d | 20 | StateMachine::StateMachine() |
benboydens | 0:825bd2920b6d | 21 | { |
benboydens | 0:825bd2920b6d | 22 | currentState = INIT; |
benboydens | 0:825bd2920b6d | 23 | startState = RECEIVE; |
benboydens | 0:825bd2920b6d | 24 | eth = new EthernetInterface(); |
benboydens | 0:825bd2920b6d | 25 | eth->set_network(CLIENT_IP, "255.255.255.0", "192.168.0.1"); |
benboydens | 0:825bd2920b6d | 26 | eth->connect(); |
benboydens | 0:825bd2920b6d | 27 | rcount = 3; |
benboydens | 0:825bd2920b6d | 28 | } |
benboydens | 0:825bd2920b6d | 29 | |
benboydens | 0:825bd2920b6d | 30 | StateMachine::~StateMachine() |
benboydens | 0:825bd2920b6d | 31 | { |
benboydens | 0:825bd2920b6d | 32 | delete eth; |
benboydens | 0:825bd2920b6d | 33 | } |
benboydens | 0:825bd2920b6d | 34 | |
benboydens | 0:825bd2920b6d | 35 | void StateMachine::start() |
benboydens | 0:825bd2920b6d | 36 | { |
benboydens | 0:825bd2920b6d | 37 | bool end = true; |
benboydens | 0:825bd2920b6d | 38 | while(end) { |
benboydens | 0:825bd2920b6d | 39 | switch(currentState) { |
benboydens | 0:825bd2920b6d | 40 | case INIT: |
benboydens | 0:825bd2920b6d | 41 | actionInit(); |
benboydens | 0:825bd2920b6d | 42 | currentState = startState; |
benboydens | 0:825bd2920b6d | 43 | break; |
benboydens | 0:825bd2920b6d | 44 | case TRANSMIT: |
benboydens | 0:825bd2920b6d | 45 | actionTransmit(); |
benboydens | 0:825bd2920b6d | 46 | currentState = RECEIVE; |
benboydens | 0:825bd2920b6d | 47 | break; |
benboydens | 0:825bd2920b6d | 48 | case RECEIVE: |
benboydens | 0:825bd2920b6d | 49 | actionReceive(); |
benboydens | 0:825bd2920b6d | 50 | for(int i = 3; i < rcount; i++) { |
benboydens | 0:825bd2920b6d | 51 | if (rbuffer[i] == ipbytes[3]) { |
benboydens | 0:825bd2920b6d | 52 | // received payload contains client id |
benboydens | 0:825bd2920b6d | 53 | currentState = END; |
benboydens | 0:825bd2920b6d | 54 | break; |
benboydens | 0:825bd2920b6d | 55 | } |
benboydens | 0:825bd2920b6d | 56 | } |
benboydens | 0:825bd2920b6d | 57 | break; |
benboydens | 0:825bd2920b6d | 58 | case END: |
benboydens | 0:825bd2920b6d | 59 | end = false; |
benboydens | 0:825bd2920b6d | 60 | break; |
benboydens | 0:825bd2920b6d | 61 | default: |
benboydens | 0:825bd2920b6d | 62 | currentState = CERROR; |
benboydens | 0:825bd2920b6d | 63 | break; |
benboydens | 0:825bd2920b6d | 64 | } |
benboydens | 0:825bd2920b6d | 65 | } |
benboydens | 0:825bd2920b6d | 66 | } |
benboydens | 0:825bd2920b6d | 67 | |
benboydens | 0:825bd2920b6d | 68 | |
benboydens | 0:825bd2920b6d | 69 | // choose ip address to send (up/down) and wich state to start (left/right) |
benboydens | 0:825bd2920b6d | 70 | void StateMachine::actionInit() |
benboydens | 0:825bd2920b6d | 71 | { |
benboydens | 0:825bd2920b6d | 72 | bool stop = true; |
benboydens | 0:825bd2920b6d | 73 | uint8_t senderId = 1; |
benboydens | 0:825bd2920b6d | 74 | while(stop) { |
benboydens | 0:825bd2920b6d | 75 | if(left) { |
benboydens | 0:825bd2920b6d | 76 | startState = RECEIVE; |
benboydens | 0:825bd2920b6d | 77 | } |
benboydens | 0:825bd2920b6d | 78 | if(right) { |
benboydens | 0:825bd2920b6d | 79 | startState = TRANSMIT; |
benboydens | 0:825bd2920b6d | 80 | } |
benboydens | 0:825bd2920b6d | 81 | if(up) { |
benboydens | 0:825bd2920b6d | 82 | senderId = senderId < 254 ? senderId+1 : 1; |
benboydens | 0:825bd2920b6d | 83 | } |
benboydens | 0:825bd2920b6d | 84 | if(down) { |
benboydens | 0:825bd2920b6d | 85 | senderId = senderId > 0 ? senderId-1 : 254; |
benboydens | 0:825bd2920b6d | 86 | } |
benboydens | 0:825bd2920b6d | 87 | if(fire) { |
benboydens | 0:825bd2920b6d | 88 | stop = false; |
benboydens | 0:825bd2920b6d | 89 | } |
benboydens | 0:825bd2920b6d | 90 | |
benboydens | 0:825bd2920b6d | 91 | // display info on lcd screen |
benboydens | 0:825bd2920b6d | 92 | lcd.cls(); |
benboydens | 0:825bd2920b6d | 93 | lcd.locate(0,3); |
benboydens | 0:825bd2920b6d | 94 | lcd.printf("Start state = %s", startState == RECEIVE ? "Received" : "Transmit"); |
benboydens | 0:825bd2920b6d | 95 | lcd.locate(1,3); |
benboydens | 0:825bd2920b6d | 96 | lcd.printf("Sender IP = 192.168.0.%d", senderId); |
benboydens | 0:825bd2920b6d | 97 | wait(0.05); |
benboydens | 0:825bd2920b6d | 98 | } |
benboydens | 0:825bd2920b6d | 99 | lcd.cls(); |
benboydens | 0:825bd2920b6d | 100 | |
benboydens | 0:825bd2920b6d | 101 | // set ipbytes (bytes are used because its easier then using strings also big endian notation is used) |
benboydens | 0:825bd2920b6d | 102 | ipbytes[0] = (char) 192; |
benboydens | 0:825bd2920b6d | 103 | ipbytes[1] = (char) 168; |
benboydens | 0:825bd2920b6d | 104 | ipbytes[2] = (char) 0; |
benboydens | 0:825bd2920b6d | 105 | ipbytes[3] = (char) senderId; |
benboydens | 0:825bd2920b6d | 106 | } |
benboydens | 0:825bd2920b6d | 107 | |
benboydens | 0:825bd2920b6d | 108 | |
benboydens | 0:825bd2920b6d | 109 | |
benboydens | 0:825bd2920b6d | 110 | // actions to be taken when node is a client |
benboydens | 0:825bd2920b6d | 111 | void StateMachine::actionTransmit() |
benboydens | 0:825bd2920b6d | 112 | { |
benboydens | 0:825bd2920b6d | 113 | // set client address |
benboydens | 0:825bd2920b6d | 114 | SocketAddress clientAddress; |
benboydens | 0:825bd2920b6d | 115 | clientAddress.set_ip_address(CLIENT_IP); |
benboydens | 0:825bd2920b6d | 116 | |
benboydens | 0:825bd2920b6d | 117 | // set server ip and port |
benboydens | 0:825bd2920b6d | 118 | SocketAddress address; |
benboydens | 0:825bd2920b6d | 119 | address.set_ip_bytes(ipbytes, NSAPI_IPv4); |
benboydens | 0:825bd2920b6d | 120 | address.set_port(4000); |
benboydens | 0:825bd2920b6d | 121 | |
benboydens | 0:825bd2920b6d | 122 | // display transmit info |
benboydens | 0:825bd2920b6d | 123 | lcd.cls(); |
benboydens | 0:825bd2920b6d | 124 | lcd.locate(0,0); |
benboydens | 0:825bd2920b6d | 125 | lcd.printf("Sending data to %s", address.get_ip_address()); |
benboydens | 0:825bd2920b6d | 126 | wait(1); |
benboydens | 0:825bd2920b6d | 127 | |
benboydens | 0:825bd2920b6d | 128 | // create socket and connect to server address |
benboydens | 0:825bd2920b6d | 129 | TCPSocket socket; |
benboydens | 0:825bd2920b6d | 130 | socket.open(eth); |
benboydens | 0:825bd2920b6d | 131 | socket.connect(address); |
benboydens | 0:825bd2920b6d | 132 | |
benboydens | 0:825bd2920b6d | 133 | // get values to send |
benboydens | 0:825bd2920b6d | 134 | uint16_t temp = lm75b.read(); |
benboydens | 0:825bd2920b6d | 135 | uint8_t pwm = ((float)pot1) * 255; |
benboydens | 0:825bd2920b6d | 136 | int* addressBytes = (int*) clientAddress.get_ip_bytes(); // get bytes of ip address |
benboydens | 0:825bd2920b6d | 137 | uint8_t clientId = (*addressBytes) >> 24; // get last number of ip address |
benboydens | 0:825bd2920b6d | 138 | |
benboydens | 0:825bd2920b6d | 139 | // create new payload |
benboydens | 0:825bd2920b6d | 140 | rbuffer[0] = (char) temp & 0xFF; |
benboydens | 0:825bd2920b6d | 141 | rbuffer[1] = (char) (temp >> 8); |
benboydens | 0:825bd2920b6d | 142 | rbuffer[2] = (char) pwm; |
benboydens | 0:825bd2920b6d | 143 | rbuffer[rcount] = (char) clientId; |
benboydens | 0:825bd2920b6d | 144 | |
benboydens | 0:825bd2920b6d | 145 | // print temp and pwm on lcd screen |
benboydens | 0:825bd2920b6d | 146 | lcd.cls(); |
benboydens | 0:825bd2920b6d | 147 | lcd.locate(0,3); |
benboydens | 0:825bd2920b6d | 148 | lcd.printf("Temperature = %d", temp); |
benboydens | 0:825bd2920b6d | 149 | lcd.locate(1,3); |
benboydens | 0:825bd2920b6d | 150 | lcd.printf("PWM value = %0.2f", ((float) pwm)/255); |
benboydens | 0:825bd2920b6d | 151 | wait(1); |
benboydens | 0:825bd2920b6d | 152 | |
benboydens | 0:825bd2920b6d | 153 | // send and close socket |
benboydens | 0:825bd2920b6d | 154 | socket.send(rbuffer, rcount + 1); |
benboydens | 0:825bd2920b6d | 155 | socket.close(); |
benboydens | 0:825bd2920b6d | 156 | } |
benboydens | 0:825bd2920b6d | 157 | |
benboydens | 0:825bd2920b6d | 158 | |
benboydens | 0:825bd2920b6d | 159 | |
benboydens | 0:825bd2920b6d | 160 | // actions to be taken when node is a server |
benboydens | 0:825bd2920b6d | 161 | void StateMachine::actionReceive() |
benboydens | 0:825bd2920b6d | 162 | { |
benboydens | 0:825bd2920b6d | 163 | // create server listingen on port 4000 |
benboydens | 0:825bd2920b6d | 164 | TCPServer srv(eth); |
benboydens | 0:825bd2920b6d | 165 | srv.bind(4000); |
benboydens | 0:825bd2920b6d | 166 | srv.listen(); |
benboydens | 0:825bd2920b6d | 167 | |
benboydens | 0:825bd2920b6d | 168 | // display receive info |
benboydens | 0:825bd2920b6d | 169 | lcd.cls(); |
benboydens | 0:825bd2920b6d | 170 | lcd.locate(0,0); |
benboydens | 0:825bd2920b6d | 171 | lcd.printf("Listening on %s:%d", CLIENT_IP, 4000); |
benboydens | 0:825bd2920b6d | 172 | wait(1); |
benboydens | 0:825bd2920b6d | 173 | |
benboydens | 0:825bd2920b6d | 174 | // open a socket and wait for the client on the server |
benboydens | 0:825bd2920b6d | 175 | TCPSocket client; |
benboydens | 0:825bd2920b6d | 176 | SocketAddress client_addr; |
benboydens | 0:825bd2920b6d | 177 | srv.accept(&client, &client_addr); |
benboydens | 0:825bd2920b6d | 178 | |
benboydens | 0:825bd2920b6d | 179 | // create buffer and wait for client to connect |
benboydens | 0:825bd2920b6d | 180 | rcount = client.recv(rbuffer, sizeof rbuffer); |
benboydens | 0:825bd2920b6d | 181 | printf("received: %d bytes\r\n", rcount); |
benboydens | 0:825bd2920b6d | 182 | |
benboydens | 0:825bd2920b6d | 183 | // convert received bytes into values |
benboydens | 0:825bd2920b6d | 184 | uint16_t temp = ((uint16_t) rbuffer[0]) | (((uint16_t) rbuffer[1]) << 8); |
benboydens | 0:825bd2920b6d | 185 | uint8_t pwm = (uint8_t) rbuffer[2]; |
benboydens | 0:825bd2920b6d | 186 | |
benboydens | 0:825bd2920b6d | 187 | // print temp and pwm on lcd screen |
benboydens | 0:825bd2920b6d | 188 | lcd.cls(); |
benboydens | 0:825bd2920b6d | 189 | lcd.locate(0,3); |
benboydens | 0:825bd2920b6d | 190 | lcd.printf("Temperature = %d", temp); |
benboydens | 0:825bd2920b6d | 191 | lcd.locate(1,3); |
benboydens | 0:825bd2920b6d | 192 | lcd.printf("PWM value = %0.2f", ((float) pwm)/255); |
benboydens | 0:825bd2920b6d | 193 | wait(1); |
benboydens | 0:825bd2920b6d | 194 | |
benboydens | 0:825bd2920b6d | 195 | client.close(); |
benboydens | 0:825bd2920b6d | 196 | srv.close(); |
benboydens | 0:825bd2920b6d | 197 | } |