Implementatie van de opdracht Round Robin

Dependencies:   C12832

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?

UserRevisionLine numberNew 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 }