fix(protocol): Fail invalid routes and simplify GPIO payloads#60
Conversation
- Propagate deserializer callback failures for CAN, UART, and GPIO so unexpected DataId values, channel indexes, and unsupported GPIO configurations abort the current transfer instead of being logged and ignored. - Collapse GPIO write and read-result packets into shared value payloads and rename GPIO config payload enums to reflect protocol semantics. Keep timestamped digital samples for uplink reads, but reject timestamped digital writes on host and firmware downlink paths.
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (9)
Walkthrough重命名 ChangesGPIO 协议枚举重命名与回调布尔返回值重构
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
变更概述
本次PR修复了librmcs库中的协议处理方式,并简化了GPIO有效负载结构。主要涉及两个方面的改进:
1. 反序列化器中的错误传播
核心库更新(
deserializer.cpp和deserializer.hpp)CAN和UART字段处理:修改了
process_can_field和process_uart_field方法,使其不再无条件返回true,而是将回调的返回值(can_deserialized_callback/uart_deserialized_callback)直接作为结果返回,从而使无效的DataId值或错误的处理能够正确地终止当前传输。GPIO字段处理:调整了
process_gpio_field的分支逻辑:falsecapture_timestamp标志则视为失败),两类读配置的回调均以返回值决定成败方法签名更新:将六个关键回调从
virtual void改为[[nodiscard]] virtual bool:can_deserialized_callbackuart_deserialized_callbackgpio_digital_data_deserialized_callbackgpio_analog_data_deserialized_callbackgpio_digital_read_config_deserialized_callbackgpio_analog_read_config_deserialized_callback固件端实现更新
C板固件 (
firmware/c_board/app/src/usb/vendor.hpp):true,匹配失败时返回false(替代原有的assert断言)timestamp_quarter_us存在则返回falsebool值RMCS板固件 (
firmware/rmcs_board/app/src/usb/vendor.hpp):主机端处理 (
host/src/protocol/handler.cpp):true,当上层拒绝处理时记录错误并返回falsefalse2. GPIO有效负载结构简化
协议定义修改 (
protocol.hpp)kDigitalWriteLow、kDigitalWriteHigh、kDigitalRead、kAnalogRead、kDigitalReadResultLow等枚举项重新组织为:kDigitalLow和kDigitalHigh(用于数字读写值)kAnalog(用于模拟数据)kDigitalReadConfig和kAnalogReadConfig(用于读配置)序列化器更新 (
serializer.hpp)write_gpio_digital_data→write_gpio_digital_value(支持可选的timestamp_quarter_us字段)write_gpio_analog_data→write_gpio_analog_valuewrite_gpio_digital_read_config现在设置kDigitalReadConfig有效负载类型write_gpio_analog_read_config现在设置kAnalogReadConfig有效负载类型write_gpio_digital_read_result和write_gpio_analog_read_resultrequired_gpio_size的switch表已适配新的有效负载枚举值固件端序列化调用更新
C板 (
firmware/c_board/app/src/gpio/gpio.hpp):publish_digital_input_sample改用write_gpio_digital_value替代write_gpio_digital_read_resultRMCS板 (
firmware/rmcs_board/app/src/gpio/gpio.hpp):主机端 (
host/src/protocol/handler.cpp):write_gpio_digital_data新增对时间戳的检查(若存在则拒绝)总体影响
这些改动提高了协议实现的健壮性,确保无效或意外的数据能够导致传输失败而非被无声忽略,使调试更加便利,并防止畸形消息导致的潜在问题。GPIO有效负载的整合减少了冗余,使协议结构更加清晰。