Dev: minor cleanup of include blockers, they are now consistent.
[marnav.git] / src / marnav / io / seatalk_reader.hpp
blob551a6949df561a6a62df811274f7a9784f5e78cc
1 #ifndef __MARNAV__IO__SEATALK_READER__HPP__
2 #define __MARNAV__IO__SEATALK_READER__HPP__
4 #include <marnav/io/device.hpp>
5 #include <marnav/seatalk/message.hpp>
7 namespace marnav
9 namespace io
11 /// This class reads SeaTalk messages from a device. Normally this would
12 /// be a serial character device (e.g. /dev/ttyS0 or /dev/ttyUSB0).
13 ///
14 /// In order to use this SeaTalk reader, it must be subclassed.
15 ///
16 /// @example read_seatalk.cpp
17 class seatalk_reader
19 public:
20 virtual ~seatalk_reader();
22 seatalk_reader() = delete;
23 seatalk_reader(std::unique_ptr<device> && dev);
24 seatalk_reader(const seatalk_reader &) = delete;
25 seatalk_reader(seatalk_reader &&) = default;
27 seatalk_reader & operator=(const seatalk_reader &) = delete;
28 seatalk_reader & operator=(seatalk_reader &&) = default;
30 void close();
31 bool read();
32 uint32_t get_collisions() const { return ctx.collisions; }
34 protected:
35 virtual void process_message(const seatalk::raw &) = 0;
37 private:
38 enum class State { READ, ESCAPE, PARITY };
40 struct context {
41 State state;
42 uint8_t index;
43 uint8_t remaining;
44 uint8_t data[seatalk::MAX_MESSAGE_SIZE];
46 uint8_t raw;
47 uint32_t collisions;
50 void emit_message();
52 uint8_t parity(uint8_t a) const;
53 void write_cmd(uint8_t c);
54 void write_data(uint8_t c);
55 void process_seatalk();
56 bool read_data();
58 context ctx;
59 std::unique_ptr<device> dev; ///< Device to read data from.
64 #endif