Andriy Makukha / Mbed 2 deprecated football_project_wo_output

Dependencies:   mbed

Fork of football_project by MZJ

Committer:
elmbed
Date:
Sun Nov 29 13:52:53 2015 +0000
Revision:
18:affef3a7db2a
Parent:
17:d8b901d791fd
Child:
23:26f27c462976
Device to phone comms working

Who changed what in which revision?

UserRevisionLine numberNew contents of line
elmbed 17:d8b901d791fd 1 #include "TA.h"
elmbed 18:affef3a7db2a 2
elmbed 17:d8b901d791fd 3 #include <nrf51.h>
elmbed 17:d8b901d791fd 4 #include <mbed.h>
elmbed 17:d8b901d791fd 5 #include <device.h>
elmbed 17:d8b901d791fd 6 #include <vector>
elmbed 17:d8b901d791fd 7
elmbed 17:d8b901d791fd 8 /* !SR
elmbed 17:d8b901d791fd 9 * Can't find any boards which use the nrf51822 and have analog output enabled. Currently
elmbed 17:d8b901d791fd 10 * all analog stuff has been commented out.
elmbed 17:d8b901d791fd 11 */
elmbed 17:d8b901d791fd 12
elmbed 17:d8b901d791fd 13 #define NEED_CONSOLE_OUTPUT 1 /* Set this if you need //////////////////////DEBUG messages on the console;
elmbed 17:d8b901d791fd 14 * it will have an impact on code-size and power consumption. */
elmbed 17:d8b901d791fd 15
elmbed 17:d8b901d791fd 16 #define LOOPBACK_MODE 0 // Loopback mode
elmbed 17:d8b901d791fd 17
elmbed 17:d8b901d791fd 18 #if NEED_CONSOLE_OUTPUT
elmbed 17:d8b901d791fd 19 #define DEBUG(...) { printf(__VA_ARGS__); }
elmbed 17:d8b901d791fd 20 #else
elmbed 17:d8b901d791fd 21 #define DEBUG(...) /* nothing */
elmbed 17:d8b901d791fd 22 #endif /* #if NEED_CONSOLE_OUTPUT */
elmbed 17:d8b901d791fd 23
elmbed 17:d8b901d791fd 24
elmbed 17:d8b901d791fd 25 extern unsigned long millis();
elmbed 17:d8b901d791fd 26 extern unsigned long micros();
elmbed 17:d8b901d791fd 27 extern int random(int numberone, int numbertwo);
elmbed 17:d8b901d791fd 28
elmbed 17:d8b901d791fd 29 ByteBuffer TA::send_buffer;
elmbed 17:d8b901d791fd 30 ByteBuffer TA::receive_buffer;
elmbed 17:d8b901d791fd 31
elmbed 17:d8b901d791fd 32 uint8_t TA::node_id;// 1 //network ID used for this unit
elmbed 17:d8b901d791fd 33 uint8_t TA::network_id;// 99 //network ID used for this network
elmbed 17:d8b901d791fd 34 uint8_t TA::gateway_id;// 1 //the ID of the network controller
elmbed 17:d8b901d791fd 35 uint8_t TA::ack_time;// 50 // # of ms to wait for an ack
elmbed 17:d8b901d791fd 36
elmbed 17:d8b901d791fd 37 //encryption is OPTIONAL
elmbed 17:d8b901d791fd 38 //to enable encryption you will need to:
elmbed 17:d8b901d791fd 39 // - provide a 16-byte encryption KEY (same on all nodes that talk encrypted)
elmbed 17:d8b901d791fd 40 // - to call .Encrypt(KEY) to start encrypting
elmbed 17:d8b901d791fd 41 // - to stop encrypting call .Encrypt(NULL)
elmbed 17:d8b901d791fd 42 uint8_t TA::KEY[] = "ABCDABCDABCDABCD";
elmbed 17:d8b901d791fd 43 uint16_t TA::interPacketDelay;// = 1000; //wait this many ms between sending packets
elmbed 17:d8b901d791fd 44
elmbed 17:d8b901d791fd 45 // Need an instance of the Radio Module
elmbed 17:d8b901d791fd 46 //byte TA::sendSize;//=0;
elmbed 17:d8b901d791fd 47 //char TA::payload[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
elmbed 17:d8b901d791fd 48 //bool TA::requestACK;//=true;
elmbed 17:d8b901d791fd 49
elmbed 17:d8b901d791fd 50 //neopixels_spi TA::neopixels;
elmbed 17:d8b901d791fd 51
elmbed 17:d8b901d791fd 52
elmbed 17:d8b901d791fd 53 unsigned long millis();
elmbed 17:d8b901d791fd 54
elmbed 17:d8b901d791fd 55 unsigned long micros();
elmbed 17:d8b901d791fd 56
elmbed 17:d8b901d791fd 57
elmbed 17:d8b901d791fd 58 /** Macro for min()
elmbed 17:d8b901d791fd 59 *
elmbed 17:d8b901d791fd 60 * @param any
elmbed 17:d8b901d791fd 61 */
elmbed 17:d8b901d791fd 62 #define min(a,b) ((a)<(b)?(a):(b))
elmbed 17:d8b901d791fd 63 /** Macro for max()
elmbed 17:d8b901d791fd 64 *
elmbed 17:d8b901d791fd 65 * @param any
elmbed 17:d8b901d791fd 66 */
elmbed 17:d8b901d791fd 67 #define max(a,b) ((a)>(b)?(a):(b))
elmbed 17:d8b901d791fd 68
elmbed 17:d8b901d791fd 69 /** generates a random number between two numbers
elmbed 17:d8b901d791fd 70 *
elmbed 17:d8b901d791fd 71 * @param numberone minimum value for random number
elmbed 17:d8b901d791fd 72 * @param numbertwo maximum value for random number
elmbed 17:d8b901d791fd 73 */
elmbed 17:d8b901d791fd 74 int random(int numberone, int numbertwo) {
elmbed 17:d8b901d791fd 75 int random = 0;
elmbed 17:d8b901d791fd 76 if ((numberone < 0) && (numbertwo < 0)) {
elmbed 17:d8b901d791fd 77 numberone = numberone * -1;
elmbed 17:d8b901d791fd 78 numbertwo = numbertwo * -1;
elmbed 17:d8b901d791fd 79 random = -1 * (rand()%(numberone + numbertwo));
elmbed 17:d8b901d791fd 80 }
elmbed 17:d8b901d791fd 81 if ((numbertwo < 0) && (numberone >= 0)) {
elmbed 17:d8b901d791fd 82 numbertwo = numbertwo * -1;
elmbed 17:d8b901d791fd 83 random = (rand()%(numberone + numbertwo)) - numbertwo;
elmbed 17:d8b901d791fd 84 }
elmbed 17:d8b901d791fd 85 if ((numberone < 0) && (numbertwo >= 0)) {
elmbed 17:d8b901d791fd 86 numberone = numberone * -1;
elmbed 17:d8b901d791fd 87 random = (rand()%(numberone + numbertwo)) - numberone;
elmbed 17:d8b901d791fd 88 } else {
elmbed 17:d8b901d791fd 89 random = (rand()%(numberone + numbertwo)) - min(numberone, numbertwo);
elmbed 17:d8b901d791fd 90 }
elmbed 17:d8b901d791fd 91 return random;
elmbed 17:d8b901d791fd 92 }
elmbed 17:d8b901d791fd 93
elmbed 17:d8b901d791fd 94 // ########## End code taken from audrino library ##########
elmbed 17:d8b901d791fd 95
elmbed 17:d8b901d791fd 96 uint8_t TA::mask;
elmbed 17:d8b901d791fd 97
elmbed 17:d8b901d791fd 98 // outputs
elmbed 17:d8b901d791fd 99 //uint8_t TA::buzzPin;
elmbed 17:d8b901d791fd 100 uint8_t TA::red;
elmbed 17:d8b901d791fd 101 uint8_t TA::green;
elmbed 17:d8b901d791fd 102 uint8_t TA::blue;
elmbed 17:d8b901d791fd 103
elmbed 17:d8b901d791fd 104 neopixel_strip_t m_strip;
elmbed 17:d8b901d791fd 105
elmbed 17:d8b901d791fd 106 uint8_t dig_pin_num = 16;
elmbed 17:d8b901d791fd 107 uint8_t leds_per_strip = 18;
elmbed 17:d8b901d791fd 108 uint8_t led_to_enable = 1;
elmbed 17:d8b901d791fd 109
elmbed 17:d8b901d791fd 110 #if 0
elmbed 17:d8b901d791fd 111 DigitalOut TA::enable_1(p4);
elmbed 17:d8b901d791fd 112 DigitalOut TA::enable_2(p7);
elmbed 17:d8b901d791fd 113 DigitalOut TA::enable_3(p8);
elmbed 17:d8b901d791fd 114
elmbed 17:d8b901d791fd 115
elmbed 17:d8b901d791fd 116 DigitalOut TA::cap_enable(A3);
elmbed 17:d8b901d791fd 117 #endif
elmbed 17:d8b901d791fd 118 DigitalOut TA::buzzPin(p20);
elmbed 17:d8b901d791fd 119
elmbed 17:d8b901d791fd 120 #if 0
elmbed 17:d8b901d791fd 121 // inputs
elmbed 17:d8b901d791fd 122 DigitalIn TA::touch_1(A0);
elmbed 17:d8b901d791fd 123 DigitalIn TA::touch_2(A1);
elmbed 17:d8b901d791fd 124 DigitalIn TA::touch_3(A2);
elmbed 17:d8b901d791fd 125 #endif
elmbed 17:d8b901d791fd 126
elmbed 17:d8b901d791fd 127 std::vector<Message*> *messages;
elmbed 17:d8b901d791fd 128
elmbed 18:affef3a7db2a 129 //NeoStrip *neo;
elmbed 18:affef3a7db2a 130
elmbed 17:d8b901d791fd 131 TA::TA()
elmbed 17:d8b901d791fd 132 {
elmbed 18:affef3a7db2a 133 buzzPin = 1;
elmbed 17:d8b901d791fd 134 neopixel_init(&m_strip, dig_pin_num, leds_per_strip);
elmbed 17:d8b901d791fd 135 neopixel_clear(&m_strip);
elmbed 17:d8b901d791fd 136 messages = new std::vector<Message*>();
elmbed 18:affef3a7db2a 137
elmbed 17:d8b901d791fd 138 }
elmbed 17:d8b901d791fd 139
elmbed 17:d8b901d791fd 140 void TA::post_color(uint32_t rgb)
elmbed 17:d8b901d791fd 141 {
elmbed 18:affef3a7db2a 142 if (rgb == 0)
elmbed 18:affef3a7db2a 143 {
elmbed 18:affef3a7db2a 144 neopixel_clear(&m_strip);
elmbed 18:affef3a7db2a 145 return;
elmbed 18:affef3a7db2a 146 }
elmbed 17:d8b901d791fd 147
elmbed 17:d8b901d791fd 148 for (int i = 0; i <= leds_per_strip; ++i)
elmbed 17:d8b901d791fd 149 {
elmbed 17:d8b901d791fd 150 neopixel_set_color_and_show(&m_strip, i, (rgb >> 16) & 0xFF, (rgb >> 8) & 0xFF, rgb & 0xFF);
elmbed 18:affef3a7db2a 151 //neo->setPixel(i, rgb);
elmbed 17:d8b901d791fd 152 }
elmbed 18:affef3a7db2a 153
elmbed 18:affef3a7db2a 154 buzzPin = 1;
elmbed 17:d8b901d791fd 155 }
elmbed 17:d8b901d791fd 156
elmbed 17:d8b901d791fd 157 void TA::mask_color(uint32_t rgb)
elmbed 17:d8b901d791fd 158 {
elmbed 17:d8b901d791fd 159 // enable_1 = 0;
elmbed 17:d8b901d791fd 160 // enable_2 = 0;
elmbed 17:d8b901d791fd 161 // enable_3 = 0;
elmbed 17:d8b901d791fd 162 //neopixels.setRGBStrip1((rgb >> 16) & 0xFF, (rgb >> 8) & 0xFF, rgb & 0xFF);
elmbed 17:d8b901d791fd 163
elmbed 17:d8b901d791fd 164 //enable_1 = (mask & 0x01)?1:0;
elmbed 17:d8b901d791fd 165 //enable_2 = (mask & 0x02)?1:0;
elmbed 17:d8b901d791fd 166 //enable_3 = (mask & 0x04)?1:0;
elmbed 17:d8b901d791fd 167
elmbed 17:d8b901d791fd 168 for (int i = 0; i <= leds_per_strip; ++i)
elmbed 17:d8b901d791fd 169 {
elmbed 18:affef3a7db2a 170 // neopixel_set_color_and_show(&m_strip, i, (rgb >> 16) & 0xFF, (rgb >> 8) & 0xFF, rgb & 0xFF);
elmbed 17:d8b901d791fd 171 }
elmbed 17:d8b901d791fd 172 }
elmbed 17:d8b901d791fd 173
elmbed 17:d8b901d791fd 174 void TA::beep(uint16_t ms)
elmbed 17:d8b901d791fd 175 {
elmbed 17:d8b901d791fd 176 beeping = true;
elmbed 17:d8b901d791fd 177 beep_start = millis();
elmbed 17:d8b901d791fd 178 beep_duration = ms;
elmbed 17:d8b901d791fd 179 }
elmbed 17:d8b901d791fd 180
elmbed 17:d8b901d791fd 181 void TA::beep_off(void)
elmbed 17:d8b901d791fd 182 {
elmbed 17:d8b901d791fd 183 beeping = false;
elmbed 17:d8b901d791fd 184 }
elmbed 17:d8b901d791fd 185
elmbed 17:d8b901d791fd 186 void TA::powerup(uint8_t sound)
elmbed 17:d8b901d791fd 187 {
elmbed 17:d8b901d791fd 188 powerup_start = millis();
elmbed 17:d8b901d791fd 189 beeping = false;
elmbed 17:d8b901d791fd 190 pulsing = false;
elmbed 17:d8b901d791fd 191 powering_up1 = false;
elmbed 17:d8b901d791fd 192 powering_up2 = false;
elmbed 17:d8b901d791fd 193
elmbed 17:d8b901d791fd 194 if(sound == 1)
elmbed 17:d8b901d791fd 195 {
elmbed 17:d8b901d791fd 196 powering_up1 = true;
elmbed 17:d8b901d791fd 197 powerup_toggle = 300;
elmbed 17:d8b901d791fd 198 }
elmbed 17:d8b901d791fd 199
elmbed 17:d8b901d791fd 200 if(sound == 2)
elmbed 17:d8b901d791fd 201 {
elmbed 17:d8b901d791fd 202 powering_up2 = true;
elmbed 17:d8b901d791fd 203 powerup_toggle = 20;
elmbed 17:d8b901d791fd 204 }
elmbed 17:d8b901d791fd 205 }
elmbed 17:d8b901d791fd 206
elmbed 17:d8b901d791fd 207 void TA::pulse(uint16_t on_time, uint16_t period, uint16_t ms, uint32_t rgb)
elmbed 17:d8b901d791fd 208 {
elmbed 17:d8b901d791fd 209 current_color = rgb;
elmbed 17:d8b901d791fd 210 pulsing = true;
elmbed 17:d8b901d791fd 211 pulse_start = millis();
elmbed 17:d8b901d791fd 212 pulse_period = period;
elmbed 17:d8b901d791fd 213 pulse_on = on_time;
elmbed 17:d8b901d791fd 214 pulse_duration = ms;
elmbed 17:d8b901d791fd 215 }
elmbed 17:d8b901d791fd 216
elmbed 17:d8b901d791fd 217 void TA::pulse_off(void)
elmbed 17:d8b901d791fd 218 {
elmbed 17:d8b901d791fd 219 pulsing = false;
elmbed 17:d8b901d791fd 220 }
elmbed 17:d8b901d791fd 221
elmbed 17:d8b901d791fd 222 int TA::get_buffer_size(void)
elmbed 17:d8b901d791fd 223 {
elmbed 17:d8b901d791fd 224 return send_buffer.getSize();
elmbed 17:d8b901d791fd 225 }
elmbed 17:d8b901d791fd 226
elmbed 17:d8b901d791fd 227 bool TA::send(Message *m)
elmbed 17:d8b901d791fd 228 {
elmbed 17:d8b901d791fd 229 send_immediate(m);
elmbed 17:d8b901d791fd 230 return true;
elmbed 17:d8b901d791fd 231 }
elmbed 17:d8b901d791fd 232
elmbed 17:d8b901d791fd 233 void TA::send_immediate(Message *m)
elmbed 17:d8b901d791fd 234 {
elmbed 17:d8b901d791fd 235 Message *tmp = new Message;
elmbed 17:d8b901d791fd 236 DEBUG("in send_imediate: %d '%c'\n", m->cone, m->command);
elmbed 17:d8b901d791fd 237
elmbed 17:d8b901d791fd 238 tmp->command = m->command;
elmbed 17:d8b901d791fd 239 tmp->cone = m->cone;
elmbed 17:d8b901d791fd 240
elmbed 17:d8b901d791fd 241 // Fake version of the function, push this onto the reply queue
elmbed 17:d8b901d791fd 242 if (messages->size() < 50)
elmbed 17:d8b901d791fd 243 {
elmbed 17:d8b901d791fd 244 messages->push_back(tmp);
elmbed 17:d8b901d791fd 245 }
elmbed 17:d8b901d791fd 246 else
elmbed 17:d8b901d791fd 247 {
elmbed 17:d8b901d791fd 248 DEBUG("TA message queue too full!\n");
elmbed 17:d8b901d791fd 249 }
elmbed 17:d8b901d791fd 250 }
elmbed 17:d8b901d791fd 251
elmbed 17:d8b901d791fd 252 bool TA::sendRaw(uint8_t *message, uint8_t len, uint8_t cone)
elmbed 17:d8b901d791fd 253 {
elmbed 17:d8b901d791fd 254
elmbed 17:d8b901d791fd 255 return true;
elmbed 17:d8b901d791fd 256 }
elmbed 17:d8b901d791fd 257
elmbed 17:d8b901d791fd 258 bool TA::recieve(Message *m)
elmbed 17:d8b901d791fd 259 {
elmbed 17:d8b901d791fd 260 bool processed = true;
elmbed 17:d8b901d791fd 261 top:
elmbed 17:d8b901d791fd 262 processed = true;
elmbed 17:d8b901d791fd 263
elmbed 17:d8b901d791fd 264 //DEBUG("receiving\n");
elmbed 17:d8b901d791fd 265 if (messages->size() > 0)
elmbed 17:d8b901d791fd 266 {
elmbed 17:d8b901d791fd 267 Message *lm = messages->front();
elmbed 17:d8b901d791fd 268
elmbed 17:d8b901d791fd 269 DEBUG("got messaage with command: '%c'\n", lm->command);
elmbed 17:d8b901d791fd 270
elmbed 17:d8b901d791fd 271 // Now populate the outgoing message based on the incoming
elmbed 17:d8b901d791fd 272 if (lm->command == 'z')
elmbed 17:d8b901d791fd 273 {
elmbed 17:d8b901d791fd 274 m->cone = lm->cone;
elmbed 17:d8b901d791fd 275 }
elmbed 17:d8b901d791fd 276 else
elmbed 17:d8b901d791fd 277 {
elmbed 17:d8b901d791fd 278 DEBUG("Unknown command: '%c'\r\n", lm->command);
elmbed 17:d8b901d791fd 279 processed = false;
elmbed 17:d8b901d791fd 280 }
elmbed 17:d8b901d791fd 281
elmbed 17:d8b901d791fd 282 messages->erase(messages->begin());
elmbed 17:d8b901d791fd 283
elmbed 17:d8b901d791fd 284 if (lm)
elmbed 17:d8b901d791fd 285 {
elmbed 17:d8b901d791fd 286 delete lm;
elmbed 17:d8b901d791fd 287 }
elmbed 17:d8b901d791fd 288
elmbed 17:d8b901d791fd 289 if (!processed)
elmbed 17:d8b901d791fd 290 {
elmbed 17:d8b901d791fd 291 // Clear out the queue if we don't know what
elmbed 17:d8b901d791fd 292 // to do with the message
elmbed 17:d8b901d791fd 293 goto top;
elmbed 17:d8b901d791fd 294 }
elmbed 17:d8b901d791fd 295 }
elmbed 17:d8b901d791fd 296 else
elmbed 17:d8b901d791fd 297 {
elmbed 17:d8b901d791fd 298 processed = false;
elmbed 17:d8b901d791fd 299 }
elmbed 17:d8b901d791fd 300
elmbed 17:d8b901d791fd 301 return processed;
elmbed 17:d8b901d791fd 302 }
elmbed 17:d8b901d791fd 303
elmbed 17:d8b901d791fd 304 bool TA::waitForAck(int cone)
elmbed 17:d8b901d791fd 305 {
elmbed 17:d8b901d791fd 306
elmbed 17:d8b901d791fd 307 return true;
elmbed 17:d8b901d791fd 308 }
elmbed 17:d8b901d791fd 309
elmbed 17:d8b901d791fd 310 void TA::spin(void)
elmbed 17:d8b901d791fd 311 {
elmbed 18:affef3a7db2a 312 #if 0
elmbed 18:affef3a7db2a 313 static byte payload [6];
elmbed 18:affef3a7db2a 314 static bool message_in_queue = false;
elmbed 18:affef3a7db2a 315 static bool waiting_for_ack = false;
elmbed 18:affef3a7db2a 316 static byte dest_cone = 0;
elmbed 18:affef3a7db2a 317 static uint16_t index = 0;
elmbed 18:affef3a7db2a 318 static uint16_t ack_tries = 0;
elmbed 18:affef3a7db2a 319 static uint8_t send_tries = 0;
elmbed 18:affef3a7db2a 320 static unsigned long ack_start = 0;
elmbed 18:affef3a7db2a 321 static unsigned long random_wait = 0;
elmbed 18:affef3a7db2a 322 static unsigned long random_wait_start = 0;
elmbed 18:affef3a7db2a 323 static unsigned long mem_monitor_start = 0;
elmbed 18:affef3a7db2a 324
elmbed 18:affef3a7db2a 325 // if(millis() - mem_monitor_start > 2000){
elmbed 18:affef3a7db2a 326 // mem_monitor_start = millis();
elmbed 18:affef3a7db2a 327 // Ram_TableDisplay();
elmbed 18:affef3a7db2a 328 // }
elmbed 18:affef3a7db2a 329
elmbed 18:affef3a7db2a 330 #if 0
elmbed 18:affef3a7db2a 331 if(tripped())
elmbed 18:affef3a7db2a 332 {//buttons() && millis() - activated_start > 1000){
elmbed 18:affef3a7db2a 333 cap_enable = 1;
elmbed 18:affef3a7db2a 334 wait_ms(100);
elmbed 18:affef3a7db2a 335 cap_enable = 0;
elmbed 18:affef3a7db2a 336 //activated_start = millis();
elmbed 18:affef3a7db2a 337 //Serial.println(F("toggled cap sense power"));
elmbed 18:affef3a7db2a 338 }
elmbed 18:affef3a7db2a 339 #endif
elmbed 18:affef3a7db2a 340 if(powering_up2)
elmbed 18:affef3a7db2a 341 {
elmbed 18:affef3a7db2a 342 unsigned long t = millis() - powerup_start;
elmbed 18:affef3a7db2a 343
elmbed 18:affef3a7db2a 344 if(t > powerup_toggle)
elmbed 18:affef3a7db2a 345 {
elmbed 18:affef3a7db2a 346 buzzPin = !buzzPin;
elmbed 18:affef3a7db2a 347 powerup_toggle *= 1.2;
elmbed 18:affef3a7db2a 348 }
elmbed 18:affef3a7db2a 349
elmbed 18:affef3a7db2a 350 if(t > 1250)
elmbed 18:affef3a7db2a 351 {
elmbed 18:affef3a7db2a 352 buzzPin = 0;
elmbed 18:affef3a7db2a 353 powering_up2 = false;
elmbed 18:affef3a7db2a 354 }
elmbed 18:affef3a7db2a 355 }
elmbed 18:affef3a7db2a 356 else if(powering_up1)
elmbed 18:affef3a7db2a 357 {
elmbed 18:affef3a7db2a 358 unsigned long t = millis() - powerup_start;
elmbed 18:affef3a7db2a 359
elmbed 18:affef3a7db2a 360 if(t > powerup_toggle)
elmbed 18:affef3a7db2a 361 {
elmbed 18:affef3a7db2a 362 buzzPin = !buzzPin;
elmbed 18:affef3a7db2a 363 powerup_toggle *= 0.95;
elmbed 18:affef3a7db2a 364 powerup_start = millis();
elmbed 18:affef3a7db2a 365 }
elmbed 17:d8b901d791fd 366
elmbed 18:affef3a7db2a 367 if(powerup_toggle < 10)
elmbed 18:affef3a7db2a 368 {
elmbed 18:affef3a7db2a 369 buzzPin = 0;
elmbed 18:affef3a7db2a 370 powering_up1 = false;
elmbed 18:affef3a7db2a 371 }
elmbed 18:affef3a7db2a 372 }
elmbed 18:affef3a7db2a 373 else
elmbed 18:affef3a7db2a 374 {
elmbed 18:affef3a7db2a 375 if(beeping && (millis()-beep_start > beep_duration))
elmbed 18:affef3a7db2a 376 beeping = false;
elmbed 18:affef3a7db2a 377 if(pulsing && (millis()-pulse_start > pulse_duration))
elmbed 18:affef3a7db2a 378 pulsing = false;
elmbed 18:affef3a7db2a 379 if(beeping)
elmbed 18:affef3a7db2a 380 buzzPin = 1;
elmbed 18:affef3a7db2a 381 else if( pulsing && (((millis()-pulse_start) % pulse_period) < pulse_on))
elmbed 18:affef3a7db2a 382 {
elmbed 18:affef3a7db2a 383 if(!(mask & SILENT))
elmbed 18:affef3a7db2a 384 buzzPin = 1;
elmbed 18:affef3a7db2a 385 mask_color(0);
elmbed 18:affef3a7db2a 386 }
elmbed 18:affef3a7db2a 387 else
elmbed 18:affef3a7db2a 388 {
elmbed 18:affef3a7db2a 389 if(pulsing)
elmbed 18:affef3a7db2a 390 mask_color(current_color);
elmbed 18:affef3a7db2a 391 buzzPin = 0;
elmbed 18:affef3a7db2a 392 }
elmbed 18:affef3a7db2a 393 }
elmbed 18:affef3a7db2a 394 /*
elmbed 18:affef3a7db2a 395 if(!waiting_for_ack && radio.ReceiveComplete())
elmbed 18:affef3a7db2a 396 {
elmbed 18:affef3a7db2a 397 if(radio.CRCPass())
elmbed 18:affef3a7db2a 398 {
elmbed 18:affef3a7db2a 399 receive_buffer.put(radio.GetSender());
elmbed 18:affef3a7db2a 400 for(byte i = 0; i < *radio.DataLen; i++)
elmbed 18:affef3a7db2a 401 receive_buffer.put(radio.Data[i]);
elmbed 18:affef3a7db2a 402 }
elmbed 18:affef3a7db2a 403
elmbed 18:affef3a7db2a 404 if(radio.ACKRequested())
elmbed 18:affef3a7db2a 405 {
elmbed 18:affef3a7db2a 406 wait_us(1300);
elmbed 18:affef3a7db2a 407 radio.SendACK();
elmbed 18:affef3a7db2a 408 //Serial.println(F("Sent ACK"));
elmbed 18:affef3a7db2a 409 }
elmbed 18:affef3a7db2a 410 }
elmbed 18:affef3a7db2a 411 */
elmbed 18:affef3a7db2a 412
elmbed 18:affef3a7db2a 413 //if(index > 4999 || waiting_for_ack){
elmbed 18:affef3a7db2a 414 if(waiting_for_ack)
elmbed 18:affef3a7db2a 415 {
elmbed 18:affef3a7db2a 416 //Serial.println(F("Waiting for ack"));
elmbed 18:affef3a7db2a 417 bool success = radio.ACKReceived(dest_cone);
elmbed 18:affef3a7db2a 418
elmbed 18:affef3a7db2a 419 if(success || send_tries > 15)
elmbed 18:affef3a7db2a 420 {
elmbed 18:affef3a7db2a 421 //Serial.print(F("dequeued: "));
elmbed 18:affef3a7db2a 422 //Serial.println((uint16_t)payload[1]<<8 + payload[2]);
elmbed 18:affef3a7db2a 423 message_in_queue = false;
elmbed 18:affef3a7db2a 424 waiting_for_ack = false;
elmbed 18:affef3a7db2a 425 unsigned long t = micros() - ack_start;
elmbed 18:affef3a7db2a 426 //Serial.print(F("Received ACK, microseconds: "));
elmbed 18:affef3a7db2a 427 //Serial.println(t);
elmbed 18:affef3a7db2a 428 //ack_tries = 0;
elmbed 18:affef3a7db2a 429
elmbed 18:affef3a7db2a 430 message_in_queue = false;
elmbed 18:affef3a7db2a 431 send_tries = 0;
elmbed 18:affef3a7db2a 432
elmbed 18:affef3a7db2a 433 /*Serial.print(F("Sent "));
elmbed 18:affef3a7db2a 434 Serial.print((char)payload[0]);
elmbed 18:affef3a7db2a 435 Serial.print(F(", to cone "));
elmbed 18:affef3a7db2a 436 Serial.println(dest_cone);*/
elmbed 18:affef3a7db2a 437 }
elmbed 18:affef3a7db2a 438 else
elmbed 18:affef3a7db2a 439 {
elmbed 18:affef3a7db2a 440 if(micros() - ack_start > 10000)
elmbed 18:affef3a7db2a 441 {
elmbed 18:affef3a7db2a 442 //Serial.println(F("no ACK"));
elmbed 18:affef3a7db2a 443 waiting_for_ack = false;
elmbed 18:affef3a7db2a 444 random_wait_start = micros();
elmbed 18:affef3a7db2a 445 random_wait = random(1500,3000);
elmbed 18:affef3a7db2a 446 /*if(send_tries > 15){
elmbed 18:affef3a7db2a 447 Serial.print(F("Failed to deliver message to cone "));
elmbed 18:affef3a7db2a 448 Serial.println(dest_cone);
elmbed 18:affef3a7db2a 449 message_in_queue = false;
elmbed 18:affef3a7db2a 450 send_tries = 0;
elmbed 18:affef3a7db2a 451 }*/
elmbed 18:affef3a7db2a 452 if(send_tries > 4)
elmbed 18:affef3a7db2a 453 random_wait = random(3000,9000);
elmbed 18:affef3a7db2a 454 //Serial.print(F("Failed to deliver message, waiting "));
elmbed 18:affef3a7db2a 455 //Serial.println(random_wait);
elmbed 18:affef3a7db2a 456 //ack_tries = 0;
elmbed 18:affef3a7db2a 457
elmbed 18:affef3a7db2a 458 /*if(send_tries%50 == 0){
elmbed 18:affef3a7db2a 459 Serial.print(send_tries);
elmbed 18:affef3a7db2a 460 Serial.println(F(" tries"));
elmbed 18:affef3a7db2a 461 }*/
elmbed 18:affef3a7db2a 462 }
elmbed 18:affef3a7db2a 463 }
elmbed 18:affef3a7db2a 464 // ack_tries++;
elmbed 18:affef3a7db2a 465 }
elmbed 18:affef3a7db2a 466 else if(message_in_queue && micros() - random_wait > random_wait_start)
elmbed 18:affef3a7db2a 467 {// && index%64 == 0){
elmbed 18:affef3a7db2a 468 requestACK = true;
elmbed 18:affef3a7db2a 469 //Serial.println(F("sending"));
elmbed 18:affef3a7db2a 470 radio.Send(dest_cone, payload, 6, requestACK);
elmbed 18:affef3a7db2a 471 //Serial.println(F("sent"));
elmbed 18:affef3a7db2a 472 //Serial.print(F("Trying to send: "));
elmbed 18:affef3a7db2a 473 //uint16_t temp = (uint16_t)payload[1]<<8;
elmbed 18:affef3a7db2a 474 //temp += (uint8_t)payload[2];
elmbed 18:affef3a7db2a 475 //Serial.println((uint8_t)payload[0]);
elmbed 18:affef3a7db2a 476 send_tries++;
elmbed 18:affef3a7db2a 477 ack_start = micros();
elmbed 18:affef3a7db2a 478
elmbed 18:affef3a7db2a 479 if(!radio.ACKReceived(dest_cone))
elmbed 18:affef3a7db2a 480 waiting_for_ack = true; // the 'if' is here to prevent the radio from going to sleep and missing the ACK
elmbed 18:affef3a7db2a 481 else
elmbed 18:affef3a7db2a 482 message_in_queue = false;
elmbed 18:affef3a7db2a 483 }
elmbed 18:affef3a7db2a 484 else
elmbed 18:affef3a7db2a 485 {
elmbed 18:affef3a7db2a 486 /*if(send_buffer.getSize() > 0 && message_in_queue == false){
elmbed 18:affef3a7db2a 487 payload[0] = send_buffer.get();
elmbed 18:affef3a7db2a 488 //Serial.print(F("Got from queue: "));
elmbed 18:affef3a7db2a 489 //Serial.println((char)payload[0]);
elmbed 18:affef3a7db2a 490 message_in_queue = true;
elmbed 18:affef3a7db2a 491 }*/
elmbed 18:affef3a7db2a 492 while(send_buffer.getSize() > 4 && message_in_queue == false)
elmbed 18:affef3a7db2a 493 {
elmbed 18:affef3a7db2a 494 payload[0] = send_buffer.get();
elmbed 18:affef3a7db2a 495 payload[1] = send_buffer.get();
elmbed 18:affef3a7db2a 496 payload[2] = send_buffer.get();
elmbed 18:affef3a7db2a 497 payload[3] = send_buffer.get();
elmbed 18:affef3a7db2a 498 payload[4] = send_buffer.get();
elmbed 18:affef3a7db2a 499 dest_cone = send_buffer.get();
elmbed 18:affef3a7db2a 500 payload[5] = send_buffer.get();
elmbed 18:affef3a7db2a 501 /*Serial.println(F(""));
elmbed 18:affef3a7db2a 502 Serial.println(F("sending..."));
elmbed 18:affef3a7db2a 503 Serial.println(payload[0], BIN);
elmbed 18:affef3a7db2a 504 Serial.println(payload[1], BIN);
elmbed 18:affef3a7db2a 505 Serial.println(payload[2], BIN);
elmbed 18:affef3a7db2a 506 Serial.println(payload[3], BIN);
elmbed 18:affef3a7db2a 507 Serial.println(payload[4], BIN);
elmbed 18:affef3a7db2a 508 Serial.println(dest_cone, BIN);
elmbed 18:affef3a7db2a 509 Serial.println(payload[5], BIN);
elmbed 18:affef3a7db2a 510 Serial.println(F(""));*/
elmbed 18:affef3a7db2a 511 if((char)payload[5] == '%')
elmbed 18:affef3a7db2a 512 message_in_queue = true;
elmbed 18:affef3a7db2a 513 else
elmbed 18:affef3a7db2a 514 {
elmbed 18:affef3a7db2a 515 while(send_buffer.getSize() > 0 && send_buffer.get() != '%'); // if we didn't land on the end of a message, peel stuff off until we are
elmbed 18:affef3a7db2a 516 }
elmbed 18:affef3a7db2a 517 }
elmbed 18:affef3a7db2a 518 }
elmbed 18:affef3a7db2a 519
elmbed 18:affef3a7db2a 520 #endif
elmbed 17:d8b901d791fd 521 }
elmbed 17:d8b901d791fd 522
elmbed 17:d8b901d791fd 523 bool TA::activated(void)
elmbed 17:d8b901d791fd 524 {
elmbed 17:d8b901d791fd 525 return true;
elmbed 17:d8b901d791fd 526 }
elmbed 17:d8b901d791fd 527
elmbed 17:d8b901d791fd 528 bool TA::tripped(void)
elmbed 17:d8b901d791fd 529 {
elmbed 17:d8b901d791fd 530 return false;
elmbed 17:d8b901d791fd 531 }
elmbed 17:d8b901d791fd 532
elmbed 17:d8b901d791fd 533 uint8_t TA::buttons(void)
elmbed 17:d8b901d791fd 534 {
elmbed 17:d8b901d791fd 535 uint8_t buttons = 0;
elmbed 17:d8b901d791fd 536
elmbed 17:d8b901d791fd 537 return buttons;
elmbed 17:d8b901d791fd 538 }
elmbed 17:d8b901d791fd 539
elmbed 17:d8b901d791fd 540 void TA::setMask(uint8_t the_mask)
elmbed 17:d8b901d791fd 541 {
elmbed 17:d8b901d791fd 542 mask = the_mask;
elmbed 17:d8b901d791fd 543 }
elmbed 17:d8b901d791fd 544
elmbed 17:d8b901d791fd 545 void TA::initialize(uint8_t address)
elmbed 17:d8b901d791fd 546 {
elmbed 17:d8b901d791fd 547 }
elmbed 17:d8b901d791fd 548
elmbed 17:d8b901d791fd 549 /* Can't find a way of implementing this function.
elmbed 17:d8b901d791fd 550 *
elmbed 17:d8b901d791fd 551 * !SR
elmbed 17:d8b901d791fd 552 */
elmbed 17:d8b901d791fd 553 void TA::Ram_TableDisplay(void)
elmbed 17:d8b901d791fd 554 {
elmbed 17:d8b901d791fd 555
elmbed 17:d8b901d791fd 556 }
elmbed 17:d8b901d791fd 557
elmbed 17:d8b901d791fd 558 /* Not sure if this work. Taken from: https://developer.mbed.org/questions/6994/How-to-print-Free-RAM-available-RAM-or-u/
elmbed 17:d8b901d791fd 559 *
elmbed 17:d8b901d791fd 560 * !SR
elmbed 17:d8b901d791fd 561 */
elmbed 17:d8b901d791fd 562 void TA::get_free_memory(void)
elmbed 17:d8b901d791fd 563 {
elmbed 17:d8b901d791fd 564 char stackVariable;
elmbed 17:d8b901d791fd 565 char *heap;
elmbed 17:d8b901d791fd 566 unsigned long result;
elmbed 17:d8b901d791fd 567 heap = (char*)malloc(4);
elmbed 17:d8b901d791fd 568 result = &stackVariable - heap;
elmbed 17:d8b901d791fd 569 free(heap);
elmbed 17:d8b901d791fd 570
elmbed 17:d8b901d791fd 571 //serial->printf("Free memory: %ul\n\n",result);
elmbed 17:d8b901d791fd 572 }
elmbed 17:d8b901d791fd 573
elmbed 17:d8b901d791fd 574 void TA::check_mem(void)
elmbed 17:d8b901d791fd 575 {
elmbed 17:d8b901d791fd 576 uint8_t * heapptr, * stackptr;
elmbed 17:d8b901d791fd 577 unsigned int stack, heap = 0;
elmbed 17:d8b901d791fd 578
elmbed 17:d8b901d791fd 579 stackptr = (uint8_t *)malloc(4); // use stackptr temporarily
elmbed 17:d8b901d791fd 580 heapptr = stackptr; // save value of heap pointer
elmbed 17:d8b901d791fd 581 free(stackptr); // free up the memory again (sets stackptr to 0)
elmbed 17:d8b901d791fd 582
elmbed 17:d8b901d791fd 583 stack = __current_sp() ;
elmbed 17:d8b901d791fd 584 heap = (uint16_t)heapptr;
elmbed 17:d8b901d791fd 585 uint16_t last_call = *(stackptr++);
elmbed 17:d8b901d791fd 586
elmbed 17:d8b901d791fd 587 //serial->printf("Stack: 0x");
elmbed 17:d8b901d791fd 588 //serial->printf("%x ",stack);
elmbed 17:d8b901d791fd 589 //serial->printf("Heap: 0x");
elmbed 17:d8b901d791fd 590 //serial->printf("%x\n",heap);
elmbed 17:d8b901d791fd 591 //serial->printf("Last call: 0x");
elmbed 17:d8b901d791fd 592 // serial->printf("%x\n",last_call);
elmbed 17:d8b901d791fd 593 get_free_memory();
elmbed 17:d8b901d791fd 594 }
elmbed 17:d8b901d791fd 595