got interrupts working
This commit is contained in:
@@ -6,8 +6,6 @@
|
|||||||
#include "Adafruit_BluefruitLE_SPI.h"
|
#include "Adafruit_BluefruitLE_SPI.h"
|
||||||
#include "Adafruit_BluefruitLE_UART.h"
|
#include "Adafruit_BluefruitLE_UART.h"
|
||||||
|
|
||||||
#include "math.h"
|
|
||||||
|
|
||||||
#if SOFTWARE_SERIAL_AVAILABLE
|
#if SOFTWARE_SERIAL_AVAILABLE
|
||||||
#include <SoftwareSerial.h>
|
#include <SoftwareSerial.h>
|
||||||
#endif
|
#endif
|
||||||
@@ -26,42 +24,58 @@ extern uint8_t packetbuffer[];
|
|||||||
|
|
||||||
Adafruit_BluefruitLE_SPI ble(BLUEFRUIT_SPI_CS, BLUEFRUIT_SPI_IRQ, BLUEFRUIT_SPI_RST);
|
Adafruit_BluefruitLE_SPI ble(BLUEFRUIT_SPI_CS, BLUEFRUIT_SPI_IRQ, BLUEFRUIT_SPI_RST);
|
||||||
|
|
||||||
void bluefruit_setup(){
|
volatile boolean irq_event_available = false;
|
||||||
Serial.print(F("Initialising the Bluefruit LE module: "));
|
void DfuIrqHandle(void) {
|
||||||
|
irq_event_available = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void bluetooth_setup(){
|
||||||
|
Serial.print(F("Initialising the Bluefruit LE module"));
|
||||||
if ( !ble.begin(VERBOSE_MODE) ) {
|
if ( !ble.begin(VERBOSE_MODE) ) {
|
||||||
Serial.println(F("Couldn't find Bluefruit, make sure it's in CoMmanD mode & check wiring?"));
|
Serial.println(F("Couldn't find Bluefruit, make sure it's in CoMmanD mode & check wiring?"));
|
||||||
while(1); // halt
|
while(1); // halt
|
||||||
}
|
}
|
||||||
Serial.println( F("OK!") );
|
|
||||||
if ( FACTORYRESET_ENABLE ) {
|
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() ){
|
if ( ! ble.factoryReset() ){
|
||||||
Serial.println(F("Couldn't factory reset"));
|
Serial.println(F("Couldn't factory reset"));
|
||||||
while(1); // halt
|
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.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
|
ble.verbose(false); // disable debug info
|
||||||
//Serial.println("Requesting Bluefruit info:");
|
//Serial.println("Requesting Bluefruit info:");
|
||||||
//ble.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(){
|
void on_connect(){
|
||||||
Serial.println(F("Waiting for bluetooth to connect..."));
|
Serial.println(F("on_connect"));
|
||||||
while (! ble.isConnected()) {
|
}
|
||||||
delay(500);
|
void on_disconnect(){
|
||||||
}
|
Serial.println(F("on_disconnect"));
|
||||||
Serial.println(F("Connected"));
|
}
|
||||||
ble.setMode(BLUEFRUIT_MODE_DATA);
|
void on_rx(){
|
||||||
//Serial.println(F("Connected. Switched to DATA mode."));
|
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) {
|
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;
|
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) {
|
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;
|
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 {
|
class Strip {
|
||||||
private:
|
private:
|
||||||
uint8_t pin;
|
uint8_t pin;
|
||||||
@@ -99,14 +102,6 @@ class Strip {
|
|||||||
unsigned long last;
|
unsigned long last;
|
||||||
uint8_t offset;
|
uint8_t offset;
|
||||||
Adafruit_NeoPixel pixel;
|
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:
|
public:
|
||||||
Strip(uint8_t led_pin, uint8_t strip_len, uint16_t wait_ms) {
|
Strip(uint8_t led_pin, uint8_t strip_len, uint16_t wait_ms) {
|
||||||
@@ -128,79 +123,6 @@ class Strip {
|
|||||||
pixel.show();
|
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<num_pixels; led_index++){
|
|
||||||
pixel.setPixelColor(led_index, trig_hue(led_index));
|
|
||||||
}
|
|
||||||
pixel.show();
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
void cycle_fade(){
|
|
||||||
pixel.begin();
|
|
||||||
for(uint8_t led_index=0; led_index<num_pixels; led_index++){
|
|
||||||
float index_float = 6.0 * led_index / num_pixels;
|
|
||||||
uint8_t index_int = int(index_float);
|
|
||||||
uint32_t color_val;
|
|
||||||
if (index_int == index_float){
|
|
||||||
color_val = pattern[index_int];
|
|
||||||
} else {
|
|
||||||
uint8_t index_upper = index_int + 1;
|
|
||||||
if (index_upper >= 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:
|
private:
|
||||||
void rainbow(){
|
void rainbow(){
|
||||||
uint8_t r = 255;
|
uint8_t r = 255;
|
||||||
@@ -255,8 +177,6 @@ class Strip {
|
|||||||
unsigned long now = millis();
|
unsigned long now = millis();
|
||||||
if (now - wait > last){
|
if (now - wait > last){
|
||||||
last = now;
|
last = now;
|
||||||
//cycle_trig_fade();
|
|
||||||
//cycle_fade();
|
|
||||||
rainbow();
|
rainbow();
|
||||||
offset += 1;
|
offset += 1;
|
||||||
if (offset == num_pixels){
|
if (offset == num_pixels){
|
||||||
@@ -271,20 +191,14 @@ Strip strip = Strip(6, 144, 100);
|
|||||||
void setup(void) {
|
void setup(void) {
|
||||||
while (!Serial); // required for Flora & Micro
|
while (!Serial); // required for Flora & Micro
|
||||||
Serial.begin(115200);
|
Serial.begin(115200);
|
||||||
bluefruit_setup();
|
bluetooth_setup();
|
||||||
strip.off();
|
strip.off();
|
||||||
Serial.println(F("setup() finished"));
|
Serial.println(F("setup() finished"));
|
||||||
bluetooth_wait();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop(void) {
|
void loop(void) {
|
||||||
strip.update();
|
if (irq_event_available) {
|
||||||
uint8_t len = readPacket(&ble, BLE_READPACKET_TIMEOUT);
|
ble.handleDfuIrq();
|
||||||
if (len == 0) return;
|
|
||||||
Serial.println(F("data"));
|
|
||||||
if (packetbuffer[1] == 'P'){
|
|
||||||
Serial.println(char(packetbuffer[2]));
|
|
||||||
} else {
|
|
||||||
printHex(packetbuffer, len);
|
|
||||||
}
|
}
|
||||||
|
strip.update();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,53 +19,19 @@
|
|||||||
/* Buffer to hold incoming characters */
|
/* Buffer to hold incoming characters */
|
||||||
uint8_t packetbuffer[READ_BUFSIZE+1];
|
uint8_t packetbuffer[READ_BUFSIZE+1];
|
||||||
|
|
||||||
/**************************************************************************/
|
void printHex(const uint8_t * data, const uint32_t numBytes) {
|
||||||
/*!
|
|
||||||
@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)
|
|
||||||
{
|
|
||||||
uint32_t szPos;
|
uint32_t szPos;
|
||||||
for (szPos=0; szPos < numBytes; szPos++)
|
for (szPos=0; szPos < numBytes; szPos++) {
|
||||||
{
|
|
||||||
Serial.print(F("0x"));
|
Serial.print(F("0x"));
|
||||||
// Append leading 0 for small values
|
Serial.print(data[szPos], HEX);
|
||||||
if (data[szPos] <= 0xF)
|
|
||||||
{
|
|
||||||
Serial.print(F("0"));
|
|
||||||
Serial.print(data[szPos] & 0xf, HEX);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Serial.print(data[szPos] & 0xff, HEX);
|
|
||||||
}
|
|
||||||
// Add a trailing space if appropriate
|
// Add a trailing space if appropriate
|
||||||
if ((numBytes > 1) && (szPos != numBytes - 1))
|
if ((numBytes > 1) && (szPos != numBytes - 1)) {
|
||||||
{
|
|
||||||
Serial.print(F(" "));
|
Serial.print(F(" "));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Serial.println();
|
Serial.println();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**************************************************************************/
|
|
||||||
/*!
|
|
||||||
@brief Waits for incoming data and parses it
|
|
||||||
*/
|
|
||||||
/**************************************************************************/
|
|
||||||
uint8_t readPacket(Adafruit_BLE *ble, uint16_t timeout)
|
uint8_t readPacket(Adafruit_BLE *ble, uint16_t timeout)
|
||||||
{
|
{
|
||||||
uint16_t origtimeout = timeout, replyidx = 0;
|
uint16_t origtimeout = timeout, replyidx = 0;
|
||||||
@@ -93,9 +59,7 @@ uint8_t readPacket(Adafruit_BLE *ble, uint16_t timeout)
|
|||||||
if (timeout == 0) break;
|
if (timeout == 0) break;
|
||||||
delay(1);
|
delay(1);
|
||||||
}
|
}
|
||||||
//Serial.println();
|
|
||||||
|
|
||||||
//return;
|
|
||||||
packetbuffer[replyidx] = 0; // null term
|
packetbuffer[replyidx] = 0; // null term
|
||||||
|
|
||||||
if (!replyidx) // no data or timeout
|
if (!replyidx) // no data or timeout
|
||||||
@@ -113,8 +77,7 @@ uint8_t readPacket(Adafruit_BLE *ble, uint16_t timeout)
|
|||||||
xsum = ~xsum;
|
xsum = ~xsum;
|
||||||
|
|
||||||
// Throw an error message if the checksum's don't match
|
// Throw an error message if the checksum's don't match
|
||||||
if (xsum != checksum)
|
if (xsum != checksum){
|
||||||
{
|
|
||||||
Serial.print("Checksum mismatch in packet : ");
|
Serial.print("Checksum mismatch in packet : ");
|
||||||
printHex(packetbuffer, replyidx+1);
|
printHex(packetbuffer, replyidx+1);
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user