diff --git a/core/data/src/main/java/com/rtbishop/look4sat/core/data/framework/IcomCivProtocol.kt b/core/data/src/main/java/com/rtbishop/look4sat/core/data/framework/IcomCivProtocol.kt index cc281ed5..8126ba48 100644 --- a/core/data/src/main/java/com/rtbishop/look4sat/core/data/framework/IcomCivProtocol.kt +++ b/core/data/src/main/java/com/rtbishop/look4sat/core/data/framework/IcomCivProtocol.kt @@ -330,12 +330,13 @@ object IcomCivProtocol { /** * Parse frequency + mode from a CMD_READ_FREQ reply payload. - * Payload layout after stripping command byte: [5 freq bytes] [mode byte] [filter byte] + * Payload layout after stripping command byte: [5 freq bytes] + * The IC-705 does not include a mode byte; if one is present it is parsed, otherwise mode is empty. */ fun parseFreqModePayload(payload: ByteArray): Pair? { - if (payload.size < 6) return null + if (payload.size < 5) return null val freqHz = decodeFrequencyBcd(payload.copyOfRange(0, 5)) - val mode = BYTE_TO_MODE[payload[5]] ?: return null + val mode = if (payload.size > 5) BYTE_TO_MODE[payload[5]] ?: return null else "" return freqHz to mode } diff --git a/core/data/src/test/java/com/rtbishop/look4sat/core/data/framework/IcomCivProtocolTest.kt b/core/data/src/test/java/com/rtbishop/look4sat/core/data/framework/IcomCivProtocolTest.kt new file mode 100644 index 00000000..e6e58f08 --- /dev/null +++ b/core/data/src/test/java/com/rtbishop/look4sat/core/data/framework/IcomCivProtocolTest.kt @@ -0,0 +1,33 @@ +package com.rtbishop.look4sat.core.data.framework + +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNotNull +import org.junit.Assert.assertNull +import org.junit.Test + +class IcomCivProtocolTest { + + private fun bytes(vararg values: Int) = ByteArray(values.size) { values[it].toByte() } + + @Test + fun parseFreqModePayload_ic705ReadFreqReply() { + // Reply captured from an IC-705 to CMD 0x03: frequency only, no mode byte + val reply = bytes(0xFE, 0xFE, 0xE0, 0xA4, 0x03, 0x60, 0x74, 0x95, 0x45, 0x01, 0xFD) + val response = IcomCivProtocol.parseResponse(reply, IcomCivProtocol.CMD_READ_FREQ) + assertNotNull(response) + assertEquals(145957460L to "", IcomCivProtocol.parseFreqModePayload(response!!.payload)) + } + + @Test + fun parseFreqModePayload_withModeByte() { + assertEquals( + 435611000L to "USB", + IcomCivProtocol.parseFreqModePayload(bytes(0x00, 0x10, 0x61, 0x35, 0x04, 0x01, 0x01)) + ) + } + + @Test + fun parseFreqModePayload_tooShort() { + assertNull(IcomCivProtocol.parseFreqModePayload(bytes(0x60, 0x74, 0x95, 0x45))) + } +}