fix: client — spec compliance, memory leak, LED order

This commit is contained in:
eddy 2026-08-01 00:35:15 +02:00
commit bce5fc4107

View file

@ -3,6 +3,7 @@
#include <FastLED.h> #include <FastLED.h>
#include <mbedtls/md.h> #include <mbedtls/md.h>
#include <mbedtls/sha256.h>
#include <Preferences.h> #include <Preferences.h>
#include "version.h" #include "version.h"
@ -74,6 +75,8 @@ class MyClientCallbacks : public NimBLEClientCallbacks {
} }
}; };
static MyClientCallbacks clientCallbacks;
static bool isHexKey(const String &hex) { static bool isHexKey(const String &hex) {
for (int i = 0; i < hex.length(); i++) { for (int i = 0; i < hex.length(); i++) {
char c = hex.charAt(i); char c = hex.charAt(i);
@ -117,7 +120,7 @@ static void disconnectClient() {
static bool connectToServer() { static bool connectToServer() {
pClient = NimBLEDevice::createClient(); pClient = NimBLEDevice::createClient();
pClient->setClientCallbacks(new MyClientCallbacks()); pClient->setClientCallbacks(&clientCallbacks);
if (!pClient->connect(serverAddress)) { if (!pClient->connect(serverAddress)) {
Serial.println("BLE: connect failed"); Serial.println("BLE: connect failed");
@ -167,7 +170,7 @@ void setup() {
delay(2000); delay(2000);
Serial.println("=== SylDa Client ==="); Serial.println("=== SylDa Client ===");
FastLED.addLeds<NEOPIXEL, LED_PIN>(leds, NUM_LEDS); FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
leds[0] = CRGB::Red; leds[0] = CRGB::Red;
FastLED.show(); FastLED.show();
@ -266,7 +269,7 @@ void loop() {
preferences.putBytes(NVS_KEY_NAME, hmacKey, HMAC_KEY_LEN); preferences.putBytes(NVS_KEY_NAME, hmacKey, HMAC_KEY_LEN);
preferences.end(); preferences.end();
keyProvisioned = true; keyProvisioned = true;
allProvisioned = keyProvisioned && serverProvisioned; allProvisioned = keyProvisioned && uuidProvisioned && serverProvisioned;
Serial.println("OK"); Serial.println("OK");
Serial.println("HMAC key stored in NVS"); Serial.println("HMAC key stored in NVS");
if (allProvisioned && !bleReady) { if (allProvisioned && !bleReady) {
@ -291,7 +294,7 @@ void loop() {
preferences.putBytes(NVS_UUID_NAME, deviceUuid, ESP_UUID_LEN); preferences.putBytes(NVS_UUID_NAME, deviceUuid, ESP_UUID_LEN);
preferences.end(); preferences.end();
uuidProvisioned = true; uuidProvisioned = true;
allProvisioned = keyProvisioned && serverProvisioned; allProvisioned = keyProvisioned && uuidProvisioned && serverProvisioned;
Serial.println("OK"); Serial.println("OK");
Serial.println("UUID stored in NVS"); Serial.println("UUID stored in NVS");
} else { } else {
@ -306,7 +309,7 @@ void loop() {
preferences.putBytes(NVS_SERVER_NAME, serverUuid, ESP_UUID_LEN); preferences.putBytes(NVS_SERVER_NAME, serverUuid, ESP_UUID_LEN);
preferences.end(); preferences.end();
serverProvisioned = true; serverProvisioned = true;
allProvisioned = keyProvisioned && serverProvisioned; allProvisioned = keyProvisioned && uuidProvisioned && serverProvisioned;
Serial.println("OK"); Serial.println("OK");
Serial.println("Server UUID stored in NVS"); Serial.println("Server UUID stored in NVS");
if (allProvisioned && !bleReady) { if (allProvisioned && !bleReady) {
@ -349,14 +352,12 @@ void loop() {
bool btnActive = (millis() - btnChange > DEBOUNCE_MS) && btnStable; bool btnActive = (millis() - btnChange > DEBOUNCE_MS) && btnStable;
static bool prevBtnActive = false; static bool prevBtnActive = false;
static bool buttonToggle = false;
if (btnActive && !prevBtnActive) { if (btnActive && !prevBtnActive) {
buttonToggle = !buttonToggle; Serial.printf("Button: pressed\n");
Serial.printf("Button: toggle -> %s\n", buttonToggle ? "ON" : "OFF");
} }
prevBtnActive = btnActive; prevBtnActive = btnActive;
bool relay1State = t1Active || buttonToggle; bool relay1State = t1Active || btnActive;
bool relay2State = t2Active; bool relay2State = t2Active;
if (relay1State || relay2State) { if (relay1State || relay2State) {
@ -369,12 +370,15 @@ void loop() {
FastLED.show(); FastLED.show();
if (connected && pCmdChar != nullptr) { if (connected && pCmdChar != nullptr) {
static uint32_t lastCmd = 0;
if (millis() - lastCmd > 200) {
if (relay1State != relay1SendState) { if (relay1State != relay1SendState) {
uint8_t pkt[HMAC_PKT_SIZE]; uint8_t pkt[HMAC_PKT_SIZE];
buildHmacPacket(relay1State ? 0x01 : 0x00, pkt); buildHmacPacket(relay1State ? 0x01 : 0x00, pkt);
pCmdChar->writeValue(pkt, HMAC_PKT_SIZE, false); pCmdChar->writeValue(pkt, HMAC_PKT_SIZE, false);
relay1SendState = relay1State; relay1SendState = relay1State;
Serial.printf("TX: relay1 %s (seq=%lu)\n", relay1State ? "ON" : "OFF", seq); Serial.printf("TX: relay1 %s (seq=%lu)\n", relay1State ? "ON" : "OFF", seq);
lastCmd = millis();
} }
if (relay2State != relay2SendState) { if (relay2State != relay2SendState) {
uint8_t pkt[HMAC_PKT_SIZE]; uint8_t pkt[HMAC_PKT_SIZE];
@ -382,6 +386,8 @@ void loop() {
pCmdChar->writeValue(pkt, HMAC_PKT_SIZE, false); pCmdChar->writeValue(pkt, HMAC_PKT_SIZE, false);
relay2SendState = relay2State; relay2SendState = relay2State;
Serial.printf("TX: relay2 %s (seq=%lu)\n", relay2State ? "ON" : "OFF", seq); Serial.printf("TX: relay2 %s (seq=%lu)\n", relay2State ? "ON" : "OFF", seq);
lastCmd = millis();
}
} }
} }