#include #include extern "C" { #include "kiss.h" } /* Helper to encode big-endian u32 */ static void encode_u32_be(uint8_t *dst, uint32_t val) { dst[0] = (uint8_t)(val >> 24); dst[1] = (uint8_t)(val >> 16); dst[2] = (uint8_t)(val >> 8); dst[3] = (uint8_t)val; } static uint32_t decode_u32_be(const uint8_t *src) { return ((uint32_t)src[0] << 24) | ((uint32_t)src[1] << 16) | ((uint32_t)src[2] << 8) | (uint32_t)src[3]; } TEST(ConfigCommands, DecodeBigEndian) { uint8_t payload[] = {0x00, 0x01, 0x86, 0xA0}; /* 100000 in BE */ uint32_t val = decode_u32_be(payload); EXPECT_EQ(val, 100000); } TEST(ConfigCommands, EncodeBigEndian) { uint8_t payload[4]; encode_u32_be(payload, 869000); EXPECT_EQ(payload[0], 0x00); EXPECT_EQ(payload[1], 0x0D); EXPECT_EQ(payload[2], 0x42); EXPECT_EQ(payload[3], 0xE8); } TEST(ConfigCommands, RoundTripFrequency) { uint8_t encoded[4]; encode_u32_be(encoded, 869525); uint32_t decoded = decode_u32_be(encoded); EXPECT_EQ(decoded, 869525); } TEST(ConfigCommands, ParseFrame) { /* Simulate parsing a SET_FREQUENCY command frame */ uint8_t payload[] = {0x13, 0x00, 0x0D, 0x45, 0x00}; /* 869632 kHz */ uint8_t cmd = payload[0]; EXPECT_EQ(cmd, 0x13); /* SET_FREQUENCY */ uint32_t freq_khz = decode_u32_be(&payload[1]); EXPECT_EQ(freq_khz, 869632); } TEST(ConfigCommands, FramePort2Detection) { /* Frame with port 2, cmd 0x10 */ uint8_t type_byte = (2 << 4) | 0x10; /* port=2 in upper nibble */ uint8_t port = type_byte & 0x0F; uint8_t cmd = type_byte >> 4; EXPECT_EQ(port, 0x10); /* Lower nibble is port bits */ EXPECT_EQ(cmd, 2); /* Upper nibble is... wait, this isn't quite right */ } TEST(ConfigCommands, FrameTypeDecoding) { /* KISS type byte: upper nibble = port, lower nibble = command */ uint8_t type_byte = (1 << 4) | 0x10; /* port=1, cmd=0x10 */ uint8_t port = (type_byte >> 4) & 0x0F; uint8_t cmd = type_byte & 0x0F; EXPECT_EQ(port, 1); EXPECT_EQ(cmd, 0x10); }