bird-lamp/firmware/src/main.cpp

92 lines
1.9 KiB
C++

#include <Arduino.h>
#include <Adafruit_NeoPixel.h>
#include <EEPROM.h>
#include <BluetoothLeUartServer.h>
#define NUMPIXELS 15
Adafruit_NeoPixel pixels(NUMPIXELS, 21, NEO_GRB + NEO_KHZ800);
uint64_t current_state = 0;
uint64_t last_state = 0;
BluetoothLeUartServer *server;
class MyCallbacks : public BluetoothLeUartServerCallbacks
{
virtual void onDeviceConnectedChanged(bool deviceConnected)
{
Serial.println("Device connected changed: " + String(deviceConnected));
};
virtual void onDataReceived(String data)
{
Serial.println("Got some data: " + data);
if (data.startsWith("s:"))
{
data.remove(0, 2);
current_state = strtoul(data.c_str(), NULL, 16);
if (current_state == last_state)
return;
EEPROM.write(0, current_state >> 24);
EEPROM.write(1, current_state >> 16);
EEPROM.write(2, current_state >> 8);
EEPROM.write(3, current_state);
EEPROM.commit();
}
else if (data == "s")
{
server->sendData("s:" + String(current_state, HEX));
}
};
};
void update_color();
void set_color(uint32_t c);
void setup()
{
Serial.begin(115200);
pixels.begin();
server = new BluetoothLeUartServer("Hannis birb lamp", "6e400001-b5a3-f393-e0a9-e50e24dcca9e", "6e400002-b5a3-f393-e0a9-e50e24dcca9e", "6e400003-b5a3-f393-e0a9-e50e24dcca9e");
server->setCallbacks(new MyCallbacks());
EEPROM.begin(4);
current_state = EEPROM.read(0) << 24 | EEPROM.read(1) << 16 | EEPROM.read(2) << 8 | EEPROM.read(3);
last_state = current_state;
update_color();
Serial.println("Setup done");
Serial.println(current_state);
}
void loop()
{
if (current_state != last_state)
{
update_color();
last_state = current_state;
}
delay(100);
}
void update_color()
{
if (current_state >> 24 == 0)
set_color(0);
else
set_color(current_state);
}
void set_color(uint32_t c)
{
for (int i = 0; i < NUMPIXELS; i++)
{
pixels.setPixelColor(i, c);
}
pixels.show();
}