Andriy Makukha / Mbed 2 deprecated football_project_wo_output

Dependencies:   mbed

Fork of football_project by MZJ

Committer:
elmbed
Date:
Sat Jan 09 21:46:34 2016 +0000
Revision:
44:4ad6133987ed
Parent:
38:76e49d045a3b
Child:
52:060fdec99780
Child:
56:dccf9b22d594
Slave cones get their node_id from the master cone

Who changed what in which revision?

UserRevisionLine numberNew contents of line
elmbed 18:affef3a7db2a 1 #include <RFM69.h>
elmbed 18:affef3a7db2a 2 #include <SPI.h>
elmbed 23:26f27c462976 3 #include "types.h"
elmbed 23:26f27c462976 4 #include "TA.h"
elmbed 18:affef3a7db2a 5
elmbed 44:4ad6133987ed 6 #define RADIO_STARTUP_ID 99
elmbed 18:affef3a7db2a 7 #define NETWORKID 101 //the same on all nodes that talk to each other
elmbed 18:affef3a7db2a 8
elmbed 18:affef3a7db2a 9 #define FREQUENCY RF69_915MHZ
elmbed 18:affef3a7db2a 10
elmbed 18:affef3a7db2a 11 //#define IS_RFM69HW //NOTE: uncomment this ONLY for RFM69HW or RFM69HCW
elmbed 18:affef3a7db2a 12 #define ENCRYPT_KEY "EncryptKey123456" // use same 16byte encryption key for all devices on net
elmbed 18:affef3a7db2a 13 #define ACK_TIME 50 // max msec for ACK wait
elmbed 18:affef3a7db2a 14 #define LED 9 // Anardino miniWireless has LEDs on D9
elmbed 18:affef3a7db2a 15 #define SERIAL_BAUD 115200
elmbed 18:affef3a7db2a 16 #define VERSION "1.0"
elmbed 18:affef3a7db2a 17
elmbed 18:affef3a7db2a 18 #define MSGBUFSIZE 64 // message buffersize, but for this demo we only use:
elmbed 18:affef3a7db2a 19 // 1-byte NODEID + 4-bytes for time + 1-byte for temp in C + 2-bytes for vcc(mV)
elmbed 18:affef3a7db2a 20
elmbed 18:affef3a7db2a 21 //RFM69::RFM69(PinName PinName mosi, PinName miso, PinName sclk,slaveSelectPin, PinName int)
elmbed 23:26f27c462976 22 RFM69 radio(P0_24,P0_23,P0_25,P0_28,P0_7);
elmbed 18:affef3a7db2a 23
elmbed 23:26f27c462976 24 static bool promiscuousMode = true; // set 'true' to sniff all packets on the same network
elmbed 44:4ad6133987ed 25 extern "C" void writeToPhone(char *format, ...);
elmbed 44:4ad6133987ed 26 extern unsigned long millis();
elmbed 44:4ad6133987ed 27
elmbed 44:4ad6133987ed 28 #ifdef MASTER
elmbed 44:4ad6133987ed 29 static bool is_master = true;
elmbed 44:4ad6133987ed 30 #else
elmbed 44:4ad6133987ed 31 static bool is_master = false;
elmbed 44:4ad6133987ed 32 #endif
elmbed 44:4ad6133987ed 33
elmbed 44:4ad6133987ed 34 static int my_node_id = NODE_ID;
elmbed 18:affef3a7db2a 35
elmbed 44:4ad6133987ed 36 struct node_id_mapping
elmbed 44:4ad6133987ed 37 {
elmbed 44:4ad6133987ed 38 int mac;
elmbed 44:4ad6133987ed 39 int node_id;
elmbed 44:4ad6133987ed 40 };
elmbed 18:affef3a7db2a 41
elmbed 44:4ad6133987ed 42 struct extended_message
elmbed 44:4ad6133987ed 43 {
elmbed 44:4ad6133987ed 44 Message m;
elmbed 44:4ad6133987ed 45 int mac;
elmbed 44:4ad6133987ed 46 };
elmbed 23:26f27c462976 47
elmbed 44:4ad6133987ed 48 static node_id_mapping nodes[10] = {0};
elmbed 44:4ad6133987ed 49 static int node_idx = 0;
elmbed 44:4ad6133987ed 50 static int my_mac = 0;
elmbed 18:affef3a7db2a 51
elmbed 18:affef3a7db2a 52 void radio_init()
elmbed 18:affef3a7db2a 53 {
elmbed 44:4ad6133987ed 54 radio.initialize(FREQUENCY, my_node_id, NETWORKID);
elmbed 23:26f27c462976 55 radio.encrypt(0);
elmbed 23:26f27c462976 56 radio.promiscuous(promiscuousMode);
elmbed 23:26f27c462976 57 }
elmbed 23:26f27c462976 58
elmbed 44:4ad6133987ed 59 static int get_node_id(int mac)
elmbed 44:4ad6133987ed 60 {
elmbed 44:4ad6133987ed 61 for (int i = 0; i < node_idx; ++i)
elmbed 44:4ad6133987ed 62 {
elmbed 44:4ad6133987ed 63 if (nodes[i].mac == mac)
elmbed 44:4ad6133987ed 64 {
elmbed 44:4ad6133987ed 65 return nodes[i].node_id;
elmbed 44:4ad6133987ed 66 }
elmbed 44:4ad6133987ed 67 }
elmbed 44:4ad6133987ed 68
elmbed 44:4ad6133987ed 69 return 0;
elmbed 44:4ad6133987ed 70 }
elmbed 28:8e74ddc4f70f 71
elmbed 44:4ad6133987ed 72 static void slave_process(extended_message *em)
elmbed 44:4ad6133987ed 73 {
elmbed 44:4ad6133987ed 74 if (em->m.command == 'R')
elmbed 44:4ad6133987ed 75 {
elmbed 44:4ad6133987ed 76 // We have been given a node id
elmbed 44:4ad6133987ed 77 my_node_id = em->m.value;
elmbed 44:4ad6133987ed 78
elmbed 44:4ad6133987ed 79 writeToPhone("NID: %d\r\n", my_node_id);
elmbed 44:4ad6133987ed 80
elmbed 44:4ad6133987ed 81 // Now reset the radio :)
elmbed 44:4ad6133987ed 82 radio_init();
elmbed 44:4ad6133987ed 83 }
elmbed 44:4ad6133987ed 84 }
elmbed 44:4ad6133987ed 85
elmbed 44:4ad6133987ed 86 static void master_process(Message *m)
elmbed 44:4ad6133987ed 87 {
elmbed 44:4ad6133987ed 88 byte payload[10] = {0};
elmbed 44:4ad6133987ed 89 int node_id = 0;
elmbed 44:4ad6133987ed 90
elmbed 44:4ad6133987ed 91 if (m->command == 'S')
elmbed 44:4ad6133987ed 92 {
elmbed 44:4ad6133987ed 93 // Message from a cone requesting an ID.
elmbed 44:4ad6133987ed 94 // The payload should be part of the MAC address
elmbed 44:4ad6133987ed 95 node_id = 0;
elmbed 44:4ad6133987ed 96
elmbed 44:4ad6133987ed 97 if (node_idx == 0)
elmbed 44:4ad6133987ed 98 {
elmbed 44:4ad6133987ed 99 node_id = 2;
elmbed 44:4ad6133987ed 100 }
elmbed 44:4ad6133987ed 101 else
elmbed 44:4ad6133987ed 102 {
elmbed 44:4ad6133987ed 103 node_id = nodes[node_idx-1].node_id + 1;
elmbed 44:4ad6133987ed 104 }
elmbed 44:4ad6133987ed 105
elmbed 44:4ad6133987ed 106 int node_found = get_node_id(m->value);
elmbed 44:4ad6133987ed 107
elmbed 44:4ad6133987ed 108 if (node_found == 0)
elmbed 44:4ad6133987ed 109 {
elmbed 44:4ad6133987ed 110 nodes[node_idx].node_id = node_id;
elmbed 44:4ad6133987ed 111 nodes[node_idx++].mac = m->value;
elmbed 44:4ad6133987ed 112 }
elmbed 44:4ad6133987ed 113 else
elmbed 44:4ad6133987ed 114 {
elmbed 44:4ad6133987ed 115 node_id = node_found;
elmbed 44:4ad6133987ed 116 }
elmbed 44:4ad6133987ed 117
elmbed 44:4ad6133987ed 118 // Send the cone it's ID
elmbed 44:4ad6133987ed 119 extended_message em;
elmbed 44:4ad6133987ed 120 em.m.cone = 99;
elmbed 44:4ad6133987ed 121 em.m.command = 'R';
elmbed 44:4ad6133987ed 122 em.m.value = node_id;
elmbed 44:4ad6133987ed 123 em.mac = m->value;
elmbed 44:4ad6133987ed 124
elmbed 44:4ad6133987ed 125 payload[0] = (byte)em.m.command;
elmbed 44:4ad6133987ed 126
elmbed 44:4ad6133987ed 127 payload[4] = (byte)em.m.value & 255;
elmbed 44:4ad6133987ed 128 payload[3] = (byte)(em.m.value >> 8);
elmbed 44:4ad6133987ed 129 payload[2] = (byte)(em.m.value >> 16);
elmbed 44:4ad6133987ed 130 payload[1] = (byte)(em.m.value >> 24);
elmbed 44:4ad6133987ed 131
elmbed 44:4ad6133987ed 132 payload[8] = (byte)em.mac & 255;
elmbed 44:4ad6133987ed 133 payload[7] = (byte)(em.mac >> 8);
elmbed 44:4ad6133987ed 134 payload[6] = (byte)(em.mac >> 16);
elmbed 44:4ad6133987ed 135 payload[5] = (byte)(em.mac >> 24);
elmbed 44:4ad6133987ed 136
elmbed 44:4ad6133987ed 137 radio.send(em.m.cone, payload, sizeof(payload));
elmbed 44:4ad6133987ed 138
elmbed 44:4ad6133987ed 139 writeToPhone("SND: %d %d 0x%x\r\n", em.m.cone, node_id, em.mac);
elmbed 44:4ad6133987ed 140 }
elmbed 44:4ad6133987ed 141 }
elmbed 28:8e74ddc4f70f 142
elmbed 23:26f27c462976 143 void radio_send(Message *m)
elmbed 23:26f27c462976 144 {
elmbed 23:26f27c462976 145 static byte payload [6] = {0};
elmbed 23:26f27c462976 146
elmbed 23:26f27c462976 147 if (m == NULL)
elmbed 23:26f27c462976 148 {
elmbed 23:26f27c462976 149 return;
elmbed 23:26f27c462976 150 }
elmbed 23:26f27c462976 151
elmbed 38:76e49d045a3b 152 //writeToPhone("SM: %c to: %d frm: %d (%d)\r\n", m->command, m->cone, NODE_ID, m->value); /// DEBUG-only message
elmbed 23:26f27c462976 153
elmbed 23:26f27c462976 154 payload[0] = (byte)m->command;
elmbed 44:4ad6133987ed 155
elmbed 23:26f27c462976 156 payload[4] = (byte)m->value & 255;
elmbed 23:26f27c462976 157 payload[3] = (byte)(m->value >> 8);
elmbed 23:26f27c462976 158 payload[2] = (byte)(m->value >> 16);
elmbed 23:26f27c462976 159 payload[1] = (byte)(m->value >> 24);
elmbed 44:4ad6133987ed 160
elmbed 23:26f27c462976 161 payload[5] = (byte)'%';
elmbed 28:8e74ddc4f70f 162
elmbed 28:8e74ddc4f70f 163 radio.send(m->cone, payload, sizeof(payload));
elmbed 18:affef3a7db2a 164 }
elmbed 18:affef3a7db2a 165
elmbed 23:26f27c462976 166 bool radio_receive_complete()
elmbed 23:26f27c462976 167 {
elmbed 23:26f27c462976 168 return radio.receiveDone();
elmbed 23:26f27c462976 169 }
elmbed 23:26f27c462976 170
elmbed 23:26f27c462976 171 bool radio_receive(Message *m)
elmbed 23:26f27c462976 172 {
elmbed 44:4ad6133987ed 173 Message lm;
elmbed 44:4ad6133987ed 174 extended_message em;
elmbed 44:4ad6133987ed 175
elmbed 23:26f27c462976 176 if (m == NULL)
elmbed 23:26f27c462976 177 {
elmbed 23:26f27c462976 178 return false;
elmbed 23:26f27c462976 179 }
elmbed 23:26f27c462976 180
elmbed 23:26f27c462976 181 if (radio.receiveDone())
elmbed 44:4ad6133987ed 182 {
elmbed 23:26f27c462976 183 if (radio.DATALEN < 6)
elmbed 23:26f27c462976 184 {
elmbed 23:26f27c462976 185 return false;
elmbed 23:26f27c462976 186 }
elmbed 23:26f27c462976 187
elmbed 44:4ad6133987ed 188 lm.cone = radio.SENDERID;
elmbed 44:4ad6133987ed 189 lm.command = radio.DATA[0];
elmbed 44:4ad6133987ed 190
elmbed 44:4ad6133987ed 191 lm.value = ((int)radio.DATA[1] << 24);
elmbed 44:4ad6133987ed 192 lm.value |= ((int)radio.DATA[2] << 16);
elmbed 44:4ad6133987ed 193 lm.value |= (((int)radio.DATA[3]) << 8);
elmbed 44:4ad6133987ed 194 lm.value |= (radio.DATA[4]);
elmbed 44:4ad6133987ed 195
elmbed 44:4ad6133987ed 196 if (is_master && lm.command == 'S')
elmbed 44:4ad6133987ed 197 {
elmbed 44:4ad6133987ed 198 // Don't pass on radio startup messages
elmbed 44:4ad6133987ed 199 master_process(&lm);
elmbed 44:4ad6133987ed 200 return false;
elmbed 44:4ad6133987ed 201 }
elmbed 44:4ad6133987ed 202 else if (!is_master && radio.TARGETID == RADIO_STARTUP_ID)
elmbed 29:ae208b014987 203 {
elmbed 44:4ad6133987ed 204
elmbed 44:4ad6133987ed 205 em.mac = (int)radio.DATA[8] & 0xff;
elmbed 44:4ad6133987ed 206 em.mac |= (int)radio.DATA[7] << 8;
elmbed 44:4ad6133987ed 207 em.mac |= (int)radio.DATA[6] << 16;
elmbed 44:4ad6133987ed 208 em.mac |= (int)radio.DATA[5] << 24;
elmbed 44:4ad6133987ed 209
elmbed 44:4ad6133987ed 210 writeToPhone("RP: 0x%x\r\n", em.mac);
elmbed 44:4ad6133987ed 211
elmbed 44:4ad6133987ed 212 if (em.mac != my_mac)
elmbed 44:4ad6133987ed 213 {
elmbed 44:4ad6133987ed 214 writeToPhone("DM 0x%x\r\n", em.mac);
elmbed 44:4ad6133987ed 215 return false; // This message was meant for someone else
elmbed 44:4ad6133987ed 216 }
elmbed 44:4ad6133987ed 217
elmbed 44:4ad6133987ed 218 memcpy(&em.m, &lm, sizeof(Message));
elmbed 44:4ad6133987ed 219 slave_process(&em);
elmbed 44:4ad6133987ed 220
elmbed 44:4ad6133987ed 221 }
elmbed 44:4ad6133987ed 222 else if (radio.TARGETID == my_node_id)
elmbed 44:4ad6133987ed 223 {
elmbed 44:4ad6133987ed 224 memcpy(m, &lm, sizeof(Message));
elmbed 38:76e49d045a3b 225
elmbed 38:76e49d045a3b 226 writeToPhone("GM: %d %c %d\r\n", radio.SENDERID, m->command, m->value); /// DEBUG-only message
AntonLS 32:64e5d7340d82 227
elmbed 29:ae208b014987 228 return true;
elmbed 29:ae208b014987 229 }
elmbed 23:26f27c462976 230 }
elmbed 23:26f27c462976 231
elmbed 23:26f27c462976 232 return false;
elmbed 23:26f27c462976 233 }
elmbed 23:26f27c462976 234
elmbed 23:26f27c462976 235 bool radio_ack_received(int cone)
elmbed 23:26f27c462976 236 {
elmbed 23:26f27c462976 237 return radio.ACKReceived(cone);
elmbed 23:26f27c462976 238 }
elmbed 23:26f27c462976 239
elmbed 44:4ad6133987ed 240 void radio_loop(int mac)
elmbed 18:affef3a7db2a 241 {
elmbed 44:4ad6133987ed 242 static unsigned long last_send = 0L;
elmbed 44:4ad6133987ed 243 unsigned long current = millis();
elmbed 44:4ad6133987ed 244 Message m;
elmbed 44:4ad6133987ed 245
elmbed 44:4ad6133987ed 246 if (my_mac == 0)
elmbed 44:4ad6133987ed 247 {
elmbed 44:4ad6133987ed 248 my_mac = mac;
elmbed 44:4ad6133987ed 249 }
elmbed 44:4ad6133987ed 250
elmbed 44:4ad6133987ed 251 if (is_master)
elmbed 44:4ad6133987ed 252 {
elmbed 44:4ad6133987ed 253 return; // Only needed for slave cones
elmbed 44:4ad6133987ed 254 }
elmbed 44:4ad6133987ed 255
elmbed 44:4ad6133987ed 256 if (my_node_id != RADIO_STARTUP_ID && current - last_send > 1000L)
elmbed 44:4ad6133987ed 257 {
elmbed 44:4ad6133987ed 258 writeToPhone("NID: %d\r\n", my_node_id);
elmbed 44:4ad6133987ed 259 last_send = current;
elmbed 44:4ad6133987ed 260 }
elmbed 44:4ad6133987ed 261
elmbed 44:4ad6133987ed 262 // Send out an i'm here message
elmbed 44:4ad6133987ed 263 if (my_node_id != RADIO_STARTUP_ID || current - last_send < 1000L)
elmbed 44:4ad6133987ed 264 {
elmbed 44:4ad6133987ed 265 return;
elmbed 44:4ad6133987ed 266 }
elmbed 44:4ad6133987ed 267
elmbed 44:4ad6133987ed 268 m.command = 'S';
elmbed 44:4ad6133987ed 269 m.cone = 1;
elmbed 44:4ad6133987ed 270 m.value = my_mac;
elmbed 44:4ad6133987ed 271
elmbed 44:4ad6133987ed 272 writeToPhone("SNM\r\n");
elmbed 44:4ad6133987ed 273
elmbed 44:4ad6133987ed 274 last_send = current;
elmbed 44:4ad6133987ed 275
elmbed 44:4ad6133987ed 276 radio_send(&m);
elmbed 18:affef3a7db2a 277 }
elmbed 23:26f27c462976 278