| createCommand(CommandType, Object) |   | 32% |   | 40% | 19 | 23 | 20 | 33 | 0 | 1 |
| getBMSData() |   | 75% |   | 55% | 25 | 37 | 1 | 55 | 0 | 1 |
| parseRealTimeV14(byte[], byte[]) |   | 91% |   | 61% | 25 | 39 | 3 | 88 | 0 | 1 |
| createV1Command(CommandType, Object) |  | 0% |  | 0% | 10 | 10 | 7 | 7 | 1 | 1 |
| buildV1LightFrame(boolean) |  | 0% |  | 0% | 2 | 2 | 1 | 1 | 1 | 1 |
| buildV1LockFrame(boolean) |  | 0% |  | 0% | 2 | 2 | 2 | 2 | 1 | 1 |
| buildV1HornFrame() |  | 0% | | n/a | 1 | 1 | 1 | 1 | 1 | 1 |
| isDeviceReady(EUCData) |  | 0% |  | 0% | 7 | 7 | 5 | 5 | 1 | 1 |
| parseMainInfo(byte[]) |   | 87% |   | 62% | 22 | 35 | 1 | 36 | 0 | 1 |
| buildV1FastInfoFrame() |  | 0% |  | 0% | 2 | 2 | 1 | 1 | 1 | 1 |
| matchesQueryResponse(ProtocolQuerySpec, byte[]) |   | 65% |   | 22% | 10 | 11 | 3 | 7 | 0 | 1 |
| unescapeNBytes(List, int, int) |   | 68% |   | 50% | 4 | 6 | 3 | 14 | 0 | 1 |
| setDialect(int) |  | 0% |  | 0% | 2 | 2 | 5 | 5 | 1 | 1 |
| parseLegacyRealtime(byte[]) |   | 92% |   | 64% | 10 | 15 | 0 | 54 | 0 | 1 |
| parseRealTimeV12(byte[], byte[]) |   | 95% |   | 61% | 10 | 14 | 0 | 70 | 0 | 1 |
| getServiceUUID() |  | 0% |  | 0% | 2 | 2 | 4 | 4 | 1 | 1 |
| getDataCharacteristicUUID() |  | 0% |  | 0% | 2 | 2 | 4 | 4 | 1 | 1 |
| getCandidateDataCharacteristicUUIDs() |  | 0% | | n/a | 1 | 1 | 4 | 4 | 1 | 1 |
| decodeLegacyFirmware(byte[]) |   | 77% |   | 50% | 4 | 5 | 4 | 15 | 0 | 1 |
| parseTotalStats(byte[]) |   | 89% |   | 50% | 12 | 13 | 0 | 10 | 0 | 1 |
| extractV2Frames(byte[]) |   | 95% |   | 83% | 6 | 19 | 2 | 39 | 0 | 1 |
| matchesCustomQueryResponse(ProtocolQuerySpec, int, byte[]) |   | 90% |   | 60% | 11 | 15 | 0 | 14 | 0 | 1 |
| updateBmsSnapshot(Double, Double, List, List, List, Map) |   | 94% |   | 79% | 7 | 18 | 0 | 13 | 0 | 1 |
| buildV1Frame(int, byte[]) |   | 93% |   | 75% | 2 | 5 | 0 | 21 | 0 | 1 |
| parseV2Frame(byte[]) |   | 92% |   | 81% | 4 | 12 | 0 | 29 | 0 | 1 |
| parseLegacyFrame(byte[]) |   | 88% |   | 63% | 4 | 7 | 0 | 11 | 0 | 1 |
| decodeTotalMeters(byte[]) |   | 82% |   | 62% | 3 | 5 | 0 | 4 | 0 | 1 |
| findChecksumIndex(List, int, int) |   | 87% |   | 66% | 4 | 7 | 0 | 12 | 0 | 1 |
| decodeLegacySerial(byte[]) |   | 83% |   | 50% | 3 | 4 | 0 | 3 | 0 | 1 |
| getWriteCharacteristicUUID() |   | 66% |   | 50% | 1 | 2 | 2 | 4 | 0 | 1 |
| getCombinedCellVoltages(InMotionProtocol.InMotionBmsSnapshot) |   | 91% |   | 71% | 4 | 8 | 0 | 7 | 0 | 1 |
| mapLegacyModel(int) |   | 50% |   | 25% | 3 | 4 | 3 | 5 | 0 | 1 |
| parseBatteryInfo(byte[]) |  | 95% |   | 71% | 4 | 8 | 0 | 16 | 0 | 1 |
| decode(byte[]) |  | 95% |   | 83% | 2 | 7 | 0 | 14 | 0 | 1 |
| parseV14PackCells(byte[]) |  | 94% |   | 75% | 2 | 5 | 0 | 12 | 0 | 1 |
| getCommandSupport(CommandType) | | 0% | | n/a | 1 | 1 | 1 | 1 | 1 | 1 |
| matchesDeviceName(String) | | 0% | | n/a | 1 | 1 | 1 | 1 | 1 | 1 |
| getPollingPlan() |  | 98% |   | 50% | 1 | 2 | 1 | 64 | 0 | 1 |
| parseLegacyInfo(byte[]) |  | 90% |   | 50% | 2 | 3 | 0 | 5 | 0 | 1 |
| getSupportedCommandTypes() | | 0% | | n/a | 1 | 1 | 1 | 1 | 1 | 1 |
| getRawFrameFlow() | | 0% | | n/a | 1 | 1 | 1 | 1 | 1 | 1 |
| isLikelyLegacyChunk(byte[]) |  | 97% |   | 84% | 4 | 14 | 0 | 8 | 0 | 1 |
| isLikelyV2Chunk(byte[]) |  | 96% |   | 87% | 2 | 9 | 0 | 6 | 0 | 1 |
| findTail(List) |  | 95% |   | 87% | 1 | 5 | 0 | 4 | 0 | 1 |
| parseV14PackCellsResponse(int, byte[]) |  | 93% |   | 50% | 1 | 2 | 0 | 4 | 0 | 1 |
| allowsActivePolling() |  | 87% |   | 50% | 1 | 2 | 0 | 1 | 0 | 1 |
| extractLegacyFrames(byte[]) |  | 100% |  | 100% | 0 | 11 | 0 | 21 | 0 | 1 |
| InMotionProtocol(Logger) |  | 100% | | n/a | 0 | 1 | 0 | 28 | 0 | 1 |
| buildMessage(int, int, byte[]) |  | 100% |  | 100% | 0 | 5 | 0 | 10 | 0 | 1 |
| static {...} |  | 100% | | n/a | 0 | 1 | 0 | 8 | 0 | 1 |
| isValidChecksumEscaped(List, int, int) |  | 100% |   | 87% | 1 | 5 | 0 | 10 | 0 | 1 |
| unescapeRange(List, int, int) |  | 100% |   | 83% | 1 | 4 | 0 | 10 | 0 | 1 |
| findHeader(List) |  | 100% |  | 100% | 0 | 5 | 0 | 4 | 0 | 1 |
| updateBmsSnapshot$default(InMotionProtocol, Double, Double, List, List, List, Map, int, Object) |  | 100% | | n/a | 0 | 1 | 0 | 7 | 0 | 1 |
| enqueueP6StatsQueryIfDue(boolean) |  | 100% |   | 75% | 2 | 5 | 0 | 6 | 0 | 1 |
| buildV1PasswordFrame(String) |  | 100% |  | 100% | 0 | 2 | 0 | 3 | 0 | 1 |
| v1WriteEscaped(ByteArrayOutputStream, byte) |  | 100% |   | 66% | 2 | 4 | 0 | 6 | 0 | 1 |
| deriveV2RideTimeSeconds(long) |  | 100% |  | 100% | 0 | 2 | 0 | 2 | 0 | 1 |
| decodeLegacySerial$lambda$8(byte) |  | 100% | | n/a | 0 | 1 | 0 | 1 | 0 | 1 |
| buildV14PackCellsQuery(int) |  | 100% | | n/a | 0 | 1 | 0 | 1 | 0 | 1 |
| isPrefixedTotalStatsEncoding(byte[]) |  | 100% |   | 75% | 1 | 3 | 0 | 1 | 0 | 1 |
| parseRealTime(byte[], byte[]) |  | 100% |  | 100% | 0 | 2 | 0 | 3 | 0 | 1 |
| InMotionProtocol(Logger, int, DefaultConstructorMarker) |  | 100% | | n/a | 0 | 1 | 0 | 1 | 0 | 1 |
| enqueueP6StatsQueryIfDue$default(InMotionProtocol, boolean, int, Object) |  | 100% | | n/a | 0 | 1 | 0 | 1 | 0 | 1 |
| buildV1PinFrame$default(InMotionProtocol, String, int, Object) |  | 100% | | n/a | 0 | 1 | 0 | 1 | 0 | 1 |
| decodeTemperature(byte) |  | 100% | | n/a | 0 | 1 | 0 | 1 | 0 | 1 |
| isV12Model() |  | 100% | | n/a | 0 | 1 | 0 | 1 | 0 | 1 |
| decodeP6SignedOffset80Temperature(int) |  | 100% | | n/a | 0 | 1 | 0 | 1 | 0 | 1 |
| buildV1FactoryPasswordFrame() | | 100% | | n/a | 0 | 1 | 0 | 1 | 0 | 1 |
| buildV1PinFrame(String) | | 100% | | n/a | 0 | 1 | 0 | 1 | 0 | 1 |
| getManufacturer() | | 100% | | n/a | 0 | 1 | 0 | 1 | 0 | 1 |
| getDataFlow() | | 100% | | n/a | 0 | 1 | 0 | 1 | 0 | 1 |
| getWriteFlow() | | 100% | | n/a | 0 | 1 | 0 | 1 | 0 | 1 |
| close() | | 100% | | n/a | 0 | 1 | 0 | 1 | 0 | 1 |