#pragma once
#include <functional>
#include <memory>
#include <vector>
#include "../usb/UsbHelper.h"
namespace SimpleBLE {
namespace Dongl {
namespace Serial {
class Wire {
public:
enum class Error {
INVALID_LENGTH,
CRC_FAILURE
};
enum class State {
IDLE,
HEADER_LOW,
HEADER_HIGH,
PAYLOAD,
CHECKSUM_LOW,
CHECKSUM_HIGH
};
using PacketCallback = std::function<void(const std::vector<uint8_t>&)>;
using ErrorCallback = std::function<void(Error)>;
static constexpr size_t MAX_PAYLOAD_SIZE = 571;
static constexpr uint8_t SYNC_BYTE = 0xAA;
Wire(const std::string& device_path);
~Wire();
void send_packet(const std::vector<uint8_t>& payload);
void send_packet(const uint8_t* data, size_t length);
void set_packet_callback(PacketCallback callback);
void set_error_callback(ErrorCallback callback);
private:
void process_byte(uint8_t byte);
static uint16_t crc16(const uint8_t* data, size_t len);
std::unique_ptr<USB::UsbHelper> _usb_helper;
State _state;
uint16_t _length;
uint16_t _checksum;
size_t _buffer_index;
std::vector<uint8_t> _buffer;
PacketCallback _packet_callback;
ErrorCallback _error_callback;
};
} } }