Handle ear detection and microphone detection for dual pods better.

This commit is contained in:
darken
2022-01-25 22:54:53 +01:00
parent 2de2369600
commit 8f609ca989
21 changed files with 140 additions and 60 deletions
@@ -13,7 +13,8 @@ class BasicSingleApplePodsTest : BaseAirPodsTest() {
rawDeviceModel shouldBe 0x0520.toUShort()
rawStatus shouldBe 0x00.toUByte()
rawPodsBattery shouldBe 0xF5.toUByte()
rawCaseBattery shouldBe 0x0F.toUByte()
rawFlags shouldBe 0x0.toUShort()
rawCaseBattery shouldBe 0xF.toUShort()
rawCaseLidState shouldBe 0x01.toUByte()
rawDeviceColor shouldBe 0x01.toUByte()
rawSuffix shouldBe 0x00.toUByte()
@@ -1,6 +1,5 @@
package eu.darken.capod.pods.core.apple
import eu.darken.capod.pods.core.HasDualPods
import io.kotest.matchers.shouldBe
import kotlinx.coroutines.test.runBlockingTest
import org.junit.jupiter.api.Test
@@ -15,7 +14,8 @@ class DualApplePodsTest : BaseAirPodsTest() {
rawDeviceModel shouldBe 0x0e20.toUShort()
rawStatus shouldBe 0x54.toUByte()
rawPodsBattery shouldBe 0xAA.toUByte()
rawCaseBattery shouldBe 0xB5.toUByte()
rawFlags shouldBe 0xB.toUShort()
rawCaseBattery shouldBe 0x5.toUShort()
rawCaseLidState shouldBe 0x31.toUByte()
rawDeviceColor shouldBe 0x00.toUByte()
rawSuffix shouldBe 0x00.toUByte()
@@ -27,12 +27,14 @@ class DualApplePodsTest : BaseAirPodsTest() {
create<DualApplePods>("07 19 01 0E 20 >2B< AA B5 31 00 00 E0 0C A7 8A 60 4B D3 7D F4 60 4F 2C 73 E9 A7 F4") {
// 00101011
// --^-----
microPhonePod shouldBe HasDualPods.Pod.LEFT
isLeftPodMicrophone shouldBe true
isRightPodMicrophone shouldBe false
}
create<DualApplePods>("07 19 01 0E 20 >0B< AA B5 31 00 00 E0 0C A7 8A 60 4B D3 7D F4 60 4F 2C 73 E9 A7 F4") {
// 00001011
// --^-----
microPhonePod shouldBe HasDualPods.Pod.RIGHT
isLeftPodMicrophone shouldBe false
isRightPodMicrophone shouldBe true
}
}
@@ -14,7 +14,8 @@ class SingleApplePodsTest : BaseAirPodsTest() {
rawDeviceModel shouldBe 0x0A20.toUShort()
rawStatus shouldBe 0x62.toUByte()
rawPodsBattery shouldBe 0x04.toUByte()
rawCaseBattery shouldBe 0x80.toUByte()
rawFlags shouldBe 0x8.toUShort()
rawCaseBattery shouldBe 0x0.toUShort()
rawCaseLidState shouldBe 0x01.toUByte()
rawDeviceColor shouldBe 0x0F.toUByte()
rawSuffix shouldBe 0x40.toUByte()
@@ -16,7 +16,8 @@ class AirPodsGen1Test : BaseAirPodsTest() {
rawDeviceModel shouldBe 0x0220.toUShort()
rawStatus shouldBe 0x55.toUByte()
rawPodsBattery shouldBe 0xAF.toUByte()
rawCaseBattery shouldBe 0x56.toUByte()
rawFlags shouldBe 0x5.toUShort()
rawCaseBattery shouldBe 0x6.toUShort()
rawCaseLidState shouldBe 0x31.toUByte()
rawDeviceColor shouldBe 0x00.toUByte()
rawSuffix shouldBe 0x00.toUByte()
@@ -15,7 +15,8 @@ class AirPodsGen2Test : BaseAirPodsTest() {
rawDeviceModel shouldBe 0x0F20.toUShort()
rawStatus shouldBe 0x02.toUByte()
rawPodsBattery shouldBe 0xF9.toUByte()
rawCaseBattery shouldBe 0x8F.toUByte()
rawFlags shouldBe 0x8.toUShort()
rawCaseBattery shouldBe 0xF.toUShort()
rawCaseLidState shouldBe 0x01.toUByte()
rawDeviceColor shouldBe 0x00.toUByte()
rawSuffix shouldBe 0x05.toUByte()
@@ -15,7 +15,8 @@ class AirPodsGen3Test : BaseAirPodsTest() {
rawDeviceModel shouldBe 0x1320.toUShort()
rawStatus shouldBe 0x75.toUByte()
rawPodsBattery shouldBe 0xAA.toUByte()
rawCaseBattery shouldBe 0xB9.toUByte()
rawFlags shouldBe 0xB.toUShort()
rawCaseBattery shouldBe 0x9.toUShort()
rawCaseLidState shouldBe 0x31.toUByte()
rawDeviceColor shouldBe 0x00.toUByte()
rawSuffix shouldBe 0x04.toUByte()
@@ -15,7 +15,8 @@ class AirPodsMaxTest : BaseAirPodsTest() {
rawDeviceModel shouldBe 0x0A20.toUShort()
rawStatus shouldBe 0x62.toUByte()
rawPodsBattery shouldBe 0x04.toUByte()
rawCaseBattery shouldBe 0x80.toUByte()
rawFlags shouldBe 0x8.toUShort()
rawCaseBattery shouldBe 0x0.toUShort()
rawCaseLidState shouldBe 0x01.toUByte()
rawDeviceColor shouldBe 0x0F.toUByte()
rawSuffix shouldBe 0x40.toUByte()
@@ -36,7 +37,8 @@ class AirPodsMaxTest : BaseAirPodsTest() {
rawDeviceModel shouldBe 0x0A20.toUShort()
rawStatus shouldBe 0x02.toUByte()
rawPodsBattery shouldBe 0x05.toUByte()
rawCaseBattery shouldBe 0x80.toUByte()
rawFlags shouldBe 0x8.toUShort()
rawCaseBattery shouldBe 0x0.toUShort()
rawCaseLidState shouldBe 0x04.toUByte()
rawDeviceColor shouldBe 0x0F.toUByte()
rawSuffix shouldBe 0x44.toUByte()
@@ -1,6 +1,5 @@
package eu.darken.capod.pods.core.apple.airpods
import eu.darken.capod.pods.core.HasDualPods
import eu.darken.capod.pods.core.apple.BaseAirPodsTest
import eu.darken.capod.pods.core.apple.DualApplePods
import io.kotest.matchers.shouldBe
@@ -17,12 +16,14 @@ class AirPodsProTest : BaseAirPodsTest() {
rawDeviceModel shouldBe 0x0e20.toUShort()
rawStatus shouldBe 0x54.toUByte()
rawPodsBattery shouldBe 0xAA.toUByte()
rawCaseBattery shouldBe 0xB5.toUByte()
rawFlags shouldBe 0xB.toUShort()
rawCaseBattery shouldBe 0x5.toUShort()
rawCaseLidState shouldBe 0x31.toUByte()
rawDeviceColor shouldBe 0x00.toUByte()
rawSuffix shouldBe 0x00.toUByte()
microPhonePod shouldBe HasDualPods.Pod.RIGHT
isLeftPodMicrophone shouldBe true
isRightPodMicrophone shouldBe false
batteryLeftPodPercent shouldBe 1.0f
batteryRightPodPercent shouldBe 1.0f
@@ -39,7 +40,8 @@ class AirPodsProTest : BaseAirPodsTest() {
@Test
fun `test AirPods from my downstairs neighbour`() = runBlockingTest {
create<AirPodsPro>("07 19 01 0E 20 00 F3 8F 02 00 04 79 C6 3F F9 C3 15 D9 11 A1 3C B1 58 66 B9 8B 67") {
microPhonePod shouldBe HasDualPods.Pod.RIGHT
isLeftPodMicrophone shouldBe false
isRightPodMicrophone shouldBe true
batteryLeftPodPercent shouldBe null
batteryRightPodPercent shouldBe 0.3f
@@ -15,7 +15,8 @@ class BeatsFlexText : BaseAirPodsTest() {
rawDeviceModel shouldBe 0x1020.toUShort()
rawStatus shouldBe 0x0A.toUByte()
rawPodsBattery shouldBe 0xF4.toUByte()
rawCaseBattery shouldBe 0x8F.toUByte()
rawFlags shouldBe 0x8.toUShort()
rawCaseBattery shouldBe 0xF.toUShort()
rawCaseLidState shouldBe 0x00.toUByte()
rawDeviceColor shouldBe 0x01.toUByte()
rawSuffix shouldBe 0x00.toUByte()
@@ -15,7 +15,8 @@ class BeatsSolo3Test : BaseAirPodsTest() {
rawDeviceModel shouldBe 0x0620.toUShort()
rawStatus shouldBe 0x62.toUByte()
rawPodsBattery shouldBe 0x04.toUByte()
rawCaseBattery shouldBe 0x80.toUByte()
rawFlags shouldBe 0x8.toUShort()
rawCaseBattery shouldBe 0x0.toUShort()
rawCaseLidState shouldBe 0x01.toUByte()
rawDeviceColor shouldBe 0x0F.toUByte()
rawSuffix shouldBe 0x40.toUByte()
@@ -15,7 +15,8 @@ class BeatsStudio3Test : BaseAirPodsTest() {
rawDeviceModel shouldBe 0x0920.toUShort()
rawStatus shouldBe 0x62.toUByte()
rawPodsBattery shouldBe 0x04.toUByte()
rawCaseBattery shouldBe 0x80.toUByte()
rawFlags shouldBe 0x8.toUShort()
rawCaseBattery shouldBe 0x0.toUShort()
rawCaseLidState shouldBe 0x01.toUByte()
rawDeviceColor shouldBe 0x0F.toUByte()
rawSuffix shouldBe 0x40.toUByte()
@@ -15,7 +15,8 @@ class BeatsXTest : BaseAirPodsTest() {
rawDeviceModel shouldBe 0x0520.toUShort()
rawStatus shouldBe 0x00.toUByte()
rawPodsBattery shouldBe 0xF5.toUByte()
rawCaseBattery shouldBe 0x0F.toUByte()
rawFlags shouldBe 0x0.toUShort()
rawCaseBattery shouldBe 0xF.toUShort()
rawCaseLidState shouldBe 0x01.toUByte()
rawDeviceColor shouldBe 0x01.toUByte()
rawSuffix shouldBe 0x00.toUByte()
@@ -15,7 +15,8 @@ class PowerBeats3Test : BaseAirPodsTest() {
rawDeviceModel shouldBe 0x0320.toUShort()
rawStatus shouldBe 0x62.toUByte()
rawPodsBattery shouldBe 0x04.toUByte()
rawCaseBattery shouldBe 0x80.toUByte()
rawFlags shouldBe 0x8.toUShort()
rawCaseBattery shouldBe 0x0.toUShort()
rawCaseLidState shouldBe 0x01.toUByte()
rawDeviceColor shouldBe 0x0F.toUByte()
rawSuffix shouldBe 0x40.toUByte()
@@ -1,6 +1,5 @@
package eu.darken.capod.pods.core.apple.beats
import eu.darken.capod.pods.core.HasDualPods
import eu.darken.capod.pods.core.apple.BaseAirPodsTest
import eu.darken.capod.pods.core.apple.DualApplePods
import io.kotest.matchers.shouldBe
@@ -17,12 +16,14 @@ class PowerBeatsProTest : BaseAirPodsTest() {
rawDeviceModel shouldBe 0x0B20.toUShort()
rawStatus shouldBe 0x54.toUByte()
rawPodsBattery shouldBe 0xAA.toUByte()
rawCaseBattery shouldBe 0xB5.toUByte()
rawFlags shouldBe 0xB.toUShort()
rawCaseBattery shouldBe 0x5.toUShort()
rawCaseLidState shouldBe 0x31.toUByte()
rawDeviceColor shouldBe 0x00.toUByte()
rawSuffix shouldBe 0x00.toUByte()
microPhonePod shouldBe HasDualPods.Pod.RIGHT
isLeftPodMicrophone shouldBe true
isRightPodMicrophone shouldBe false
batteryLeftPodPercent shouldBe 1.0f
batteryRightPodPercent shouldBe 1.0f