#include #include #include #include #include #include #include #include "setup.h" BLEClient* pClient; bool connected = false; BLEUUID sMainUUID(S_MAIN_UUID); BLEUUID cPowerUUID(C_POWER_UUID); BLEUUID cColourUUID(C_COLOUR_UUID); BLEUUID cModeUUID(C_MODE_UUID); OWIRE myLED; CRGB leds[STRIP_LENGTH]; static void powerNotifyCallback(BLERemoteCharacteristic* pBLERemoteCharacteristic, uint8_t* pData, size_t length, bool isNotify) { int value = *pData; Serial.print("Setting Striplight brightness: "); Serial.println(value); fill_solid(leds, STRIP_LENGTH, CRGB::Red); FastLED.setBrightness(value); } static void colourNotifyCallback(BLERemoteCharacteristic* pBLERemoteCharacteristic, uint8_t* pData, size_t length, bool isNotify) { int value = *pData; Serial.print("Setting Striplight brightness: "); Serial.println(value); } static void modeNotifyCallback(BLERemoteCharacteristic* pBLERemoteCharacteristic, uint8_t* pData, size_t length, bool isNotify) { int value = *pData; Serial.print("Setting Striplight brightness: "); Serial.println(value); } class MyClientCallback : public BLEClientCallbacks { void onConnect(BLEClient* pclient) { connected = true; myLED.setModeAndColor(OW_SOLID, OW_RED); } void onDisconnect(BLEClient* pclient) { ESP.restart(); } }; void setup() { Serial.begin(115200); myLED.begin(4, false); myLED.setModeAndColor(OW_SOLID, OW_BLUE); FastLED.addLeds(leds, STRIP_LENGTH); Serial.println("Booting Client..."); BLEDevice::init("Light Pole Client"); pClient = BLEDevice::createClient(); pClient->setClientCallbacks(new MyClientCallback()); while (!connected) { BLEScan* pBLEScan = BLEDevice::getScan(); pBLEScan->setActiveScan(true); pBLEScan->setInterval(100); pBLEScan->setWindow(99); BLEScanResults scanResults = pBLEScan->start(5); for (int i = 0; i < scanResults.getCount(); i++) { BLEAdvertisedDevice device = scanResults.getDevice(i); BLEUUID service_uuid = device.getServiceUUID(); String device_name = device.getName().c_str(); Serial.print("Device Found! Name: '"); Serial.print(device_name); Serial.print("' Advertising Service: '"); Serial.print(service_uuid.equals(sMainUUID)); Serial.print("' Service UUID: '"); Serial.print(service_uuid.toString().c_str()); Serial.println("'"); Serial.println(); if (device.haveServiceUUID() && device.isAdvertisingService(sMainUUID)) { Serial.println("Found Server, attempting to connect..."); pClient->connect(&device); break; } } if (!connected) { Serial.println("Connection failed. Waiting 15 seconds before retrying."); myLED.setModeAndColor(OW_SOLID, OW_YELLOW); delay(15000); // Wait for 15 seconds before retrying myLED.setModeAndColor(OW_SOLID, OW_BLUE); } } if (connected) { BLERemoteService* sMain = pClient->getService(sMainUUID); if (sMain) { BLERemoteCharacteristic* cPower = sMain->getCharacteristic(cPowerUUID); if (cPower) { cPower->registerForNotify(powerNotifyCallback); cPower->getDescriptor(BLEUUID((uint16_t)0x2902))->writeValue((uint8_t*)"\x01", 1); } else { Serial.println("Power Characteristic not found."); } BLERemoteCharacteristic* cColour = sMain->getCharacteristic(cColourUUID); if (cColour) { cColour->registerForNotify(colourNotifyCallback); cColour->getDescriptor(BLEUUID((uint16_t)0x2902))->writeValue((uint8_t*)"\x01", 1); } else { Serial.println("Colour Characteristic not found."); } BLERemoteCharacteristic* cMode = sMain->getCharacteristic(cModeUUID); if (cMode) { cMode->registerForNotify(modeNotifyCallback); cMode->getDescriptor(BLEUUID((uint16_t)0x2902))->writeValue((uint8_t*)"\x01", 1); } else { Serial.println("Mode Characteristic not found."); } } else { Serial.println("Main Service not found."); } } } void loop() { // Nothing to do in the loop for this example }