#pragma once #include "cpdecoder.hh" #include #include #include namespace ffmsep::tactile { inline constexpr std::uint8_t kStartByte = 0x3A; inline constexpr std::uint8_t kEndByteFirst = 0x0D; inline constexpr std::uint8_t kEndByteSecond = 0x0A; enum class FunctionCode : std::uint8_t { Unknown = 0x00, ReadMatrix = 0x01, ReadSingle = 0x02, ReadTemperature = 0x03, SetDeviceId = 0x51, SetMatrixSize = 0x52, CalibrationMode = 0x53, }; struct MatrixSize { std::uint8_t long_edge = 0; std::uint8_t short_edge = 0; }; struct TactileFrame { std::uint8_t device_address = 0; FunctionCode function = FunctionCode::Unknown; std::uint8_t data_length = 0; std::vector payload; }; std::optional parse_frame(const CPFrame& frame); std::vector parse_pressure_values(const TactileFrame& frame); std::optional parse_matrix_size_payload(const TactileFrame& frame); std::optional parse_patrix_coordinate_payload(const TactileFrame& frame); const CPCodec* tactile_codec(); void register_tactile_codec(); }