diff --git a/README.md b/README.md index 441e2fb..7c5e7ba 100644 --- a/README.md +++ b/README.md @@ -12,10 +12,10 @@ De BLE-verbinding is beveiligd met **HMAC-SHA256 authenticatie** (application-le |---|---| | Relais 1 | Op **G1** | | Relais 2 | Op **G2** | -| Touch sensor 1 | HS-S43A Digital Capacitive Switch Module op **G8** (actief LOW) | -| Touch sensor 2 | HS-S43A Digital Capacitive Switch Module op **G6** (actief LOW) | +| Touch sensor 1 | HS-S43A Digital Capacitive Switch Module op **G8** (actief HIGH) | +| Touch sensor 2 | HS-S43A Digital Capacitive Switch Module op **G6** (actief HIGH) | | Knop | Op **G41** (active low) | -| Status LED | Op **G35** (WS2812 RGB, rood = geen verbinding, geel = verbinding <60s, uit = stabiel) | +| Status LED | Op **G46** (rood = geen verbinding, geel = verbinding <60s, uit = stabiel) | ### Pinout @@ -25,7 +25,7 @@ G2 = RELAY2 G6 = TOUCH2 (INPUT) G8 = TOUCH1 (INPUT) G41 = BUTTON (INPUT, active low) -G35 = LED (WS2812 RGB, OUTPUT) +G46 = LED (OUTPUT) ``` ### Aansluiting @@ -39,7 +39,7 @@ Relais + → G1 / G2 Relais - → GND ``` -> **HS-S43A touch sensor:** Digitale output (actief LOW — pin naar GND bij aanraking). Gebruik `INPUT_PULLUP` modus. De sensor trekt de pin actief laag bij detectie. +> **HS-S43A touch sensor:** Digitale output (actief HIGH). Geen pullup nodig — de sensor geeft actief 0V of 3.3V. ## LED-signalering diff --git a/android/app/src/main/assets/firmware/client/firmware.bin b/android/app/src/main/assets/firmware/client/firmware.bin index ca1b829..edd2861 100644 Binary files a/android/app/src/main/assets/firmware/client/firmware.bin and b/android/app/src/main/assets/firmware/client/firmware.bin differ diff --git a/android/app/src/main/assets/firmware/server/firmware.bin b/android/app/src/main/assets/firmware/server/firmware.bin index 3a35b83..83a42b6 100644 Binary files a/android/app/src/main/assets/firmware/server/firmware.bin and b/android/app/src/main/assets/firmware/server/firmware.bin differ diff --git a/android/app/src/main/java/nl/eddydevink/sylda/BleRelayManager.kt b/android/app/src/main/java/nl/eddydevink/sylda/BleRelayManager.kt index f74686d..d1a6826 100644 --- a/android/app/src/main/java/nl/eddydevink/sylda/BleRelayManager.kt +++ b/android/app/src/main/java/nl/eddydevink/sylda/BleRelayManager.kt @@ -32,7 +32,6 @@ import javax.crypto.Mac import javax.crypto.spec.GCMParameterSpec import javax.crypto.spec.SecretKeySpec import kotlin.text.Charsets -import kotlinx.coroutines.CompletableDeferred class BleRelayManager( private val context: Context, @@ -84,6 +83,14 @@ class BleRelayManager( private var ecdhNotifyBuf: ByteArray = ByteArray(0) private var ecdhCccdPending = false + private class CompletableDeferred { + private var result: T? = null + private var completed = false + @Synchronized fun complete(value: T) { result = value; completed = true } + @Synchronized fun isDone(): Boolean = completed + @Synchronized fun get(): T? = result + } + interface OtaNotifyCallback { fun onOtaNotify(status: Int, seq: Int) } @@ -283,7 +290,6 @@ class BleRelayManager( private fun connectToDevice(device: android.bluetooth.BluetoothDevice) { handler.post { callbacks.onStatusChanged(BleStatus.Connecting) } Log.d(TAG, "Connecting to ${device.address}") - bluetoothGatt?.close() bluetoothGatt = device.connectGatt(context, false, gattCallback) } @@ -494,10 +500,10 @@ class BleRelayManager( Thread { val start = System.currentTimeMillis() - while (!ecdhDeferred!!.isCompleted && System.currentTimeMillis() - start < ECDH_TIMEOUT_MS) { + while (!ecdhDeferred!!.isDone() && System.currentTimeMillis() - start < ECDH_TIMEOUT_MS) { Thread.sleep(50) } - if (!ecdhDeferred!!.isCompleted) { + if (!ecdhDeferred!!.isDone()) { Log.w(TAG, "ECDH: notify timeout") handler.post { callbacks.onStatusChanged(BleStatus.CommError) diff --git a/android/app/src/main/java/nl/eddydevink/sylda/OtaManager.kt b/android/app/src/main/java/nl/eddydevink/sylda/OtaManager.kt index f4741ae..0b2d3c9 100644 --- a/android/app/src/main/java/nl/eddydevink/sylda/OtaManager.kt +++ b/android/app/src/main/java/nl/eddydevink/sylda/OtaManager.kt @@ -98,7 +98,11 @@ class OtaManager( return@withContext false } - delay(500) + try { + withTimeout(OTA_START_TIMEOUT_MS) { + while (true) { delay(100); ensureActive() } + } + } catch (_: kotlinx.coroutines.TimeoutCancellationException) {} val totalChunks = (fw.size + chunkDataSize - 1) / chunkDataSize var seq = 0 diff --git a/scripts/release.sh b/scripts/release.sh index f36595b..b073d8b 100755 --- a/scripts/release.sh +++ b/scripts/release.sh @@ -66,18 +66,10 @@ mkdir -p "$RELEASE_DIR" cp "$ANDROID_DIR/app/build/outputs/apk/release/app-release.apk" "$RELEASE_DIR/" cp "$ANDROID_DIR/app/build/outputs/bundle/release/app-release.aab" "$RELEASE_DIR/" - -# Server firmware -cp "$FIRMWARE_DIR/server/bootloader.bin" "$RELEASE_DIR/server-bootloader.bin" -cp "$FIRMWARE_DIR/server/partitions.bin" "$RELEASE_DIR/server-partitions.bin" -cp "$FIRMWARE_DIR/server/boot_app0.bin" "$RELEASE_DIR/server-boot_app0.bin" -cp "$FIRMWARE_DIR/server/firmware.bin" "$RELEASE_DIR/server-firmware.bin" - -# Client firmware -cp "$FIRMWARE_DIR/client/bootloader.bin" "$RELEASE_DIR/client-bootloader.bin" -cp "$FIRMWARE_DIR/client/partitions.bin" "$RELEASE_DIR/client-partitions.bin" -cp "$FIRMWARE_DIR/client/boot_app0.bin" "$RELEASE_DIR/client-boot_app0.bin" -cp "$FIRMWARE_DIR/client/firmware.bin" "$RELEASE_DIR/client-firmware.bin" +cp "$FIRMWARE_DIR/bootloader.bin" "$RELEASE_DIR/" +cp "$FIRMWARE_DIR/partitions.bin" "$RELEASE_DIR/" +cp "$FIRMWARE_DIR/boot_app0.bin" "$RELEASE_DIR/" +cp "$FIRMWARE_DIR/firmware.bin" "$RELEASE_DIR/" log "Checksums..." cd "$RELEASE_DIR"