diff --git a/neopixel-keiran.ino b/neopixel-keiran.ino index 4125086..a8355ef 100644 --- a/neopixel-keiran.ino +++ b/neopixel-keiran.ino @@ -6,8 +6,6 @@ #include "Adafruit_BluefruitLE_SPI.h" #include "Adafruit_BluefruitLE_UART.h" -#include "math.h" - #if SOFTWARE_SERIAL_AVAILABLE #include #endif @@ -26,42 +24,58 @@ extern uint8_t packetbuffer[]; Adafruit_BluefruitLE_SPI ble(BLUEFRUIT_SPI_CS, BLUEFRUIT_SPI_IRQ, BLUEFRUIT_SPI_RST); -void bluefruit_setup(){ - Serial.print(F("Initialising the Bluefruit LE module: ")); +volatile boolean irq_event_available = false; +void DfuIrqHandle(void) { + irq_event_available = true; +} + +void bluetooth_setup(){ + Serial.print(F("Initialising the Bluefruit LE module")); if ( !ble.begin(VERBOSE_MODE) ) { Serial.println(F("Couldn't find Bluefruit, make sure it's in CoMmanD mode & check wiring?")); while(1); // halt } - Serial.println( F("OK!") ); if ( FACTORYRESET_ENABLE ) { - /* Perform a factory reset to make sure everything is in a known state */ - Serial.println(F("Performing a factory reset: ")); + Serial.println(F("Performing a factory reset")); if ( ! ble.factoryReset() ){ Serial.println(F("Couldn't factory reset")); while(1); // halt } } - ble.println(F("AT+GAPDEVNAME=Suit LEDs")); + pinMode(BLUEFRUIT_SPI_IRQ, INPUT_PULLUP); + attachInterrupt(digitalPinToInterrupt(BLUEFRUIT_SPI_IRQ), DfuIrqHandle, FALLING); ble.echo(false); // disable command echo + ble.sendCommandCheckOK(F("AT+GAPDEVNAME=Suit LEDs")); // Change name displayed in bluetooth scans + ble.sendCommandCheckOK(F("AT+DFUIRQ=on")); // Change DFU Pin to IRQ Mode ble.verbose(false); // disable debug info //Serial.println("Requesting Bluefruit info:"); //ble.info(); + ble.setConnectCallback(on_connect); + ble.setDisconnectCallback(on_disconnect); + ble.setBleUartRxCallback(on_rx); + ble.setMode(BLUEFRUIT_MODE_DATA); + Serial.println(F("Bluetooth ready")); } -void bluetooth_wait(){ - Serial.println(F("Waiting for bluetooth to connect...")); - while (! ble.isConnected()) { - delay(500); - } - Serial.println(F("Connected")); - ble.setMode(BLUEFRUIT_MODE_DATA); - //Serial.println(F("Connected. Switched to DATA mode.")); +void on_connect(){ + Serial.println(F("on_connect")); +} +void on_disconnect(){ + Serial.println(F("on_disconnect")); +} +void on_rx(){ + Serial.println(F("on_rx")); + /*uint8_t len = readPacket(&ble, BLE_READPACKET_TIMEOUT); + if (len == 0) return; + Serial.println(F("data")); + if (packetbuffer[1] == 'P'){ + Serial.println(char(packetbuffer[2])); + } else { + printHex(packetbuffer, len); + }*/ } uint32_t pack_color(uint8_t r, uint8_t g, uint8_t b) { - //r = r >> 6; - //g = g >> 6; - //b = b >> 6; return ((uint32_t)r << 16) | ((uint32_t)g << 8) | b; } uint32_t pack_color(uint8_t r, uint8_t g, uint8_t b, uint8_t w) { @@ -80,17 +94,6 @@ uint8_t white(uint32_t color){ return (color >> 24) & 0xFF; } -/* jesus fuck.. save my eyes */ -/*uint32_t dim_color(uint32_t color){ - return pack_color( - red(color) / DIM_FACTOR, - green(color) / DIM_FACTOR, - blue(color) / DIM_FACTOR, - white(color) / DIM_FACTOR - ); -}*/ - - class Strip { private: uint8_t pin; @@ -99,14 +102,6 @@ class Strip { unsigned long last; uint8_t offset; Adafruit_NeoPixel pixel; - /*uint32_t pattern[6] = { - pack_color(255, 0, 0), // 0 degrees, red - pack_color(255, 255, 0), // 60 degrees, yellow - pack_color(0, 255, 0), // 120 degrees, green - pack_color(0, 255, 255), // 180 degrees, cyan - pack_color(0, 0, 255), // 240 degrees, blue - pack_color(255, 0, 255) // 300 degrees, magenta - };*/ public: Strip(uint8_t led_pin, uint8_t strip_len, uint16_t wait_ms) { @@ -128,79 +123,6 @@ class Strip { pixel.show(); } - /*private: - uint32_t avg_bias(uint32_t col1, uint32_t col2, float perc){ - uint8_t w1 = white(col1); - uint8_t r1 = red(col1); - uint8_t g1 = green(col1); - uint8_t b1 = blue(col1); - uint8_t w2 = white(col2); - uint8_t r2 = red(col2); - uint8_t g2 = green(col2); - uint8_t b2 = blue(col2); - float remain = 1.0 - perc; - return pack_color( - (uint8_t)(remain * r1 + perc * r2), - (uint8_t)(remain * g1 + perc * g2), - (uint8_t)(remain * b1 + perc * b2), - (uint8_t)(remain * w1 + perc * w2) - ); - } - - private: - uint32_t trig_hue(uint8_t pix_index){ - uint8_t r = (uint8_t)(sin(PI * (pix_index + 72) / 96) * 255); - uint8_t g = (uint8_t)(sin(PI * (pix_index + 12) / 96) * 255); - uint8_t b = (uint8_t)(sin(PI * (pix_index + 144) / 96) * 255); - Serial.print(r); - Serial.print(','); - Serial.print(g); - Serial.print(','); - Serial.print(b); - Serial.println(); - return dim_color(pack_color(r, g, b)); - } - - private: - void cycle_trig_fade(){ - pixel.begin(); - for (uint8_t led_index=0; led_index= 6){ - index_upper = 0; - } - float percent = index_float - index_int; - color_val = avg_bias(pattern[index_int], pattern[index_upper], percent); - } - if (offset >= 144){ - continue; - } - uint8_t loc; - if (offset + led_index > num_pixels - 1){ - loc = led_index + offset - num_pixels + 1; - } else { - loc = offset + led_index; - } - pixel.setPixelColor(loc, dim_color(color_val)); - } - pixel.show(); - }*/ - private: void rainbow(){ uint8_t r = 255; @@ -255,8 +177,6 @@ class Strip { unsigned long now = millis(); if (now - wait > last){ last = now; - //cycle_trig_fade(); - //cycle_fade(); rainbow(); offset += 1; if (offset == num_pixels){ @@ -271,20 +191,14 @@ Strip strip = Strip(6, 144, 100); void setup(void) { while (!Serial); // required for Flora & Micro Serial.begin(115200); - bluefruit_setup(); + bluetooth_setup(); strip.off(); Serial.println(F("setup() finished")); - bluetooth_wait(); } void loop(void) { - strip.update(); - uint8_t len = readPacket(&ble, BLE_READPACKET_TIMEOUT); - if (len == 0) return; - Serial.println(F("data")); - if (packetbuffer[1] == 'P'){ - Serial.println(char(packetbuffer[2])); - } else { - printHex(packetbuffer, len); + if (irq_event_available) { + ble.handleDfuIrq(); } + strip.update(); } diff --git a/packetParser.cpp b/packetParser.cpp index d576041..55f0ac5 100644 --- a/packetParser.cpp +++ b/packetParser.cpp @@ -19,53 +19,19 @@ /* Buffer to hold incoming characters */ uint8_t packetbuffer[READ_BUFSIZE+1]; -/**************************************************************************/ -/*! - @brief Casts the four bytes at the specified address to a float -*/ -/**************************************************************************/ -float parsefloat(uint8_t *buffer) { - float f = ((float *)buffer)[0]; - return f; -} - -/**************************************************************************/ -/*! - @brief Prints a hexadecimal value in plain characters - @param data Pointer to the byte data - @param numBytes Data length in bytes -*/ -/**************************************************************************/ -void printHex(const uint8_t * data, const uint32_t numBytes) -{ +void printHex(const uint8_t * data, const uint32_t numBytes) { uint32_t szPos; - for (szPos=0; szPos < numBytes; szPos++) - { + for (szPos=0; szPos < numBytes; szPos++) { Serial.print(F("0x")); - // Append leading 0 for small values - if (data[szPos] <= 0xF) - { - Serial.print(F("0")); - Serial.print(data[szPos] & 0xf, HEX); - } - else - { - Serial.print(data[szPos] & 0xff, HEX); - } + Serial.print(data[szPos], HEX); // Add a trailing space if appropriate - if ((numBytes > 1) && (szPos != numBytes - 1)) - { + if ((numBytes > 1) && (szPos != numBytes - 1)) { Serial.print(F(" ")); } } Serial.println(); } -/**************************************************************************/ -/*! - @brief Waits for incoming data and parses it -*/ -/**************************************************************************/ uint8_t readPacket(Adafruit_BLE *ble, uint16_t timeout) { uint16_t origtimeout = timeout, replyidx = 0; @@ -93,9 +59,7 @@ uint8_t readPacket(Adafruit_BLE *ble, uint16_t timeout) if (timeout == 0) break; delay(1); } - //Serial.println(); - //return; packetbuffer[replyidx] = 0; // null term if (!replyidx) // no data or timeout @@ -113,8 +77,7 @@ uint8_t readPacket(Adafruit_BLE *ble, uint16_t timeout) xsum = ~xsum; // Throw an error message if the checksum's don't match - if (xsum != checksum) - { + if (xsum != checksum){ Serial.print("Checksum mismatch in packet : "); printHex(packetbuffer, replyidx+1); return 0;