feat: implement frame builders
cel_crsf_build_rc_frame() packs 16 channels (11-bit) into 22 bytes. cel_crsf_build_ping_frame() builds device ping (0x28). cel_crsf_build_param_read_frame() and cel_crsf_build_param_write_frame() build parameter protocol frames (0x2C/0x2D).
This commit is contained in:
@@ -169,6 +169,76 @@ void test_parse_module_addr(void) {
|
||||
TEST_ASSERT_EQUAL_UINT8(4, frame.payload_len);
|
||||
}
|
||||
|
||||
/* Frame builder tests */
|
||||
|
||||
void test_build_rc_frame_null_dst(void) {
|
||||
int16_t ch[16];
|
||||
TEST_ASSERT_EQUAL_UINT(0, cel_crsf_build_rc_frame(NULL, ch));
|
||||
}
|
||||
|
||||
void test_build_rc_frame_null_channels(void) {
|
||||
uint8_t dst[32];
|
||||
size_t len = cel_crsf_build_rc_frame(dst, NULL);
|
||||
TEST_ASSERT_GREATER_THAN(0, len);
|
||||
TEST_ASSERT_EQUAL_UINT8(0xC8, dst[0]);
|
||||
}
|
||||
|
||||
void test_build_rc_frame_roundtrip(void) {
|
||||
int16_t ch[16];
|
||||
cel_crsf_channel_default(ch);
|
||||
ch[0] = CEL_CRSF_CH_MAX;
|
||||
|
||||
uint8_t dst[32];
|
||||
size_t len = cel_crsf_build_rc_frame(dst, ch);
|
||||
|
||||
cel_crsf_frame frame;
|
||||
TEST_ASSERT_EQUAL_INT(0, cel_crsf_frame_parse(&frame, dst, len));
|
||||
TEST_ASSERT_EQUAL_UINT8(CEL_CRSF_TYPE_RC_CHANNELS_PACKED, frame.type);
|
||||
}
|
||||
|
||||
void test_build_ping_frame_null_dst(void) {
|
||||
TEST_ASSERT_EQUAL_UINT(0, cel_crsf_build_ping_frame(NULL));
|
||||
}
|
||||
|
||||
void test_build_ping_frame_valid(void) {
|
||||
uint8_t dst[16];
|
||||
size_t len = cel_crsf_build_ping_frame(dst);
|
||||
TEST_ASSERT_GREATER_THAN(0, len);
|
||||
TEST_ASSERT_EQUAL_UINT8(0xEE, dst[0]);
|
||||
|
||||
cel_crsf_frame frame;
|
||||
TEST_ASSERT_EQUAL_INT(0, cel_crsf_frame_parse(&frame, dst, len));
|
||||
TEST_ASSERT_EQUAL_UINT8(CEL_CRSF_TYPE_DEVICE_PING, frame.type);
|
||||
}
|
||||
|
||||
void test_build_param_read_frame_null_dst(void) {
|
||||
TEST_ASSERT_EQUAL_UINT(0, cel_crsf_build_param_read_frame(NULL, 0, 0));
|
||||
}
|
||||
|
||||
void test_build_param_read_frame_valid(void) {
|
||||
uint8_t dst[16];
|
||||
size_t len = cel_crsf_build_param_read_frame(dst, 0x42, 0);
|
||||
TEST_ASSERT_GREATER_THAN(0, len);
|
||||
|
||||
cel_crsf_frame frame;
|
||||
TEST_ASSERT_EQUAL_INT(0, cel_crsf_frame_parse(&frame, dst, len));
|
||||
TEST_ASSERT_EQUAL_UINT8(CEL_CRSF_TYPE_PARAM_READ, frame.type);
|
||||
}
|
||||
|
||||
void test_build_param_write_frame_null_dst(void) {
|
||||
TEST_ASSERT_EQUAL_UINT(0, cel_crsf_build_param_write_frame(NULL, 0, 0));
|
||||
}
|
||||
|
||||
void test_build_param_write_frame_valid(void) {
|
||||
uint8_t dst[16];
|
||||
size_t len = cel_crsf_build_param_write_frame(dst, 0x42, 0xFF);
|
||||
TEST_ASSERT_GREATER_THAN(0, len);
|
||||
|
||||
cel_crsf_frame frame;
|
||||
TEST_ASSERT_EQUAL_INT(0, cel_crsf_frame_parse(&frame, dst, len));
|
||||
TEST_ASSERT_EQUAL_UINT8(CEL_CRSF_TYPE_PARAM_WRITE, frame.type);
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
UNITY_BEGIN();
|
||||
RUN_TEST(test_crc_empty);
|
||||
@@ -195,5 +265,14 @@ int main(void) {
|
||||
RUN_TEST(test_parse_bad_crc);
|
||||
RUN_TEST(test_parse_empty_payload);
|
||||
RUN_TEST(test_parse_module_addr);
|
||||
RUN_TEST(test_build_rc_frame_null_dst);
|
||||
RUN_TEST(test_build_rc_frame_null_channels);
|
||||
RUN_TEST(test_build_rc_frame_roundtrip);
|
||||
RUN_TEST(test_build_ping_frame_null_dst);
|
||||
RUN_TEST(test_build_ping_frame_valid);
|
||||
RUN_TEST(test_build_param_read_frame_null_dst);
|
||||
RUN_TEST(test_build_param_read_frame_valid);
|
||||
RUN_TEST(test_build_param_write_frame_null_dst);
|
||||
RUN_TEST(test_build_param_write_frame_valid);
|
||||
return UNITY_END();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user