16 std::optional<uint8_t>
ping(uint8_t
id) {
17 if (!send_message(
id, Instruction::PING, 0,
nullptr, 0)) {
20 return check_error(
id);
23 std::optional<uint8_t>
read_data(uint8_t
id, uint8_t address, uint8_t *data,
25 if (!send_message(
id, Instruction::READ_DATA, address, &size, 1)) {
28 std::array<uint8_t, 6> buf;
29 if (!uart_.receive(buf.data(), buf.size() - 1, 5)) {
32 if (buf[0] != 0xFF || buf[1] != 0xFF) {
38 if (buf[3] != size + 2) {
41 if (!uart_.receive(data, size, 5)) {
44 if (!uart_.receive(&buf[5], 1, 5)) {
47 uint8_t checksum = sum(&buf[2], buf.size() - 3) + sum(data, size);
49 if (buf[5] != checksum) {
55 std::optional<uint8_t>
write_data(uint8_t
id, uint8_t address,
56 const uint8_t *data, uint8_t size) {
57 if (!send_message(
id, Instruction::WRITE_DATA, address, data, size)) {
60 return check_error(
id);
63 std::optional<uint8_t>
reg_write(uint8_t
id, uint8_t address,
64 const uint8_t *data, uint8_t size) {
65 if (!send_message(
id, Instruction::REG_WRITE, address, data, size)) {
68 return check_error(
id);
71 std::optional<uint8_t>
action(uint8_t
id) {
72 if (!send_message(
id, Instruction::ACTION, 0,
nullptr, 0)) {
75 return check_error(
id);
79 if (!send_message(
id, Instruction::RECOVERY, 0,
nullptr, 0)) {
82 return check_error(
id);
85 std::optional<uint8_t>
reset(uint8_t
id) {
86 if (!send_message(
id, Instruction::RESET, 0,
nullptr, 0)) {
89 return check_error(
id);
93 enum class Instruction : uint8_t {
105 peripheral::UartBase &uart_;
107 bool send_message(uint8_t
id, Instruction instruction, uint8_t address,
108 const uint8_t *data, uint8_t size) {
109 std::array<uint8_t, 5> buf{0xFF, 0xFF, id,
static_cast<uint8_t
>(size + 3),
110 std::to_underlying(instruction)};
112 if (!uart_.transmit(buf.data(), buf.size(), 5)) {
115 if (!uart_.transmit(&address, 1, 5)) {
118 uint8_t checksum = sum(&buf[2], buf.size() - 2) + address;
120 if (!uart_.transmit(data, size, 5)) {
123 for (uint8_t i = 0; i < size; i++) {
127 checksum = ~checksum;
128 return uart_.transmit(&checksum, 1, 5);
131 std::optional<uint8_t> check_error(uint8_t
id) {
135 std::array<uint8_t, 6> buf;
136 if (!uart_.receive(buf.data(), buf.size(), 5)) {
139 if (buf[0] != 0xFF || buf[1] != 0xFF) {
148 uint8_t checksum = sum(&buf[2], buf.size() - 3);
149 checksum = ~checksum;
150 if (buf[5] != checksum) {
156 static inline uint8_t sum(
const uint8_t *data, uint8_t size) {
158 for (uint8_t i = 0; i < size; ++i) {
std::optional< uint8_t > reg_write(uint8_t id, uint8_t address, const uint8_t *data, uint8_t size)
Definition scs_manager.hpp:63
std::optional< uint8_t > read_data(uint8_t id, uint8_t address, uint8_t *data, uint8_t size)
Definition scs_manager.hpp:23
std::optional< uint8_t > write_data(uint8_t id, uint8_t address, const uint8_t *data, uint8_t size)
Definition scs_manager.hpp:55