aboutsummaryrefslogtreecommitdiff
path: root/apps/sm-serial-read.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'apps/sm-serial-read.cpp')
-rw-r--r--apps/sm-serial-read.cpp111
1 files changed, 111 insertions, 0 deletions
diff --git a/apps/sm-serial-read.cpp b/apps/sm-serial-read.cpp
new file mode 100644
index 0000000..5005554
--- /dev/null
+++ b/apps/sm-serial-read.cpp
@@ -0,0 +1,111 @@
+#include "trygvis/sensor.h"
+#include "trygvis/sensor/io.h"
+#include "json.hpp"
+#include "apps.h"
+#include <chrono>
+#include <thread>
+#include <boost/asio/serial_port.hpp>
+
+namespace trygvis {
+namespace apps {
+
+using namespace boost::asio;
+using namespace std;
+using namespace std::chrono;
+using namespace trygvis::apps;
+using namespace trygvis::sensor;
+using namespace trygvis::sensor::io;
+namespace po = boost::program_options;
+using json = nlohmann::json;
+
+namespace sm_serial_read_utils {
+
+class port_handler {
+public:
+ port_handler(string port_name, serial_port &serial_port, shared_ptr<KeyValueSampleStreamParser> input)
+ : port_name(port_name), port(serial_port), input(input) {}
+
+ void run() {
+ auto packet = make_shared<vector<uint8_t>>(1024);
+
+ while (port.is_open()) {
+ std::size_t some = port.read_some(buffer);
+
+ mutable_buffers_1 chunk = boost::asio::buffer(data, some);
+ input->process(chunk);
+ }
+
+ cerr << "port closed" << endl;
+ }
+
+
+private:
+ static const size_t size = 1024;
+ string port_name;
+ serial_port &port;
+ uint8_t data[size];
+ mutable_buffers_1 buffer = boost::asio::buffer(data, size);
+
+ shared_ptr<KeyValueSampleStreamParser> input;
+};
+}
+
+class sm_serial_read : public app {
+ typedef trygvis::apps::sm_serial_read_utils::port_handler port_handler;
+
+public:
+ sm_serial_read() : app("sm-serial-read") {}
+
+ ~sm_serial_read() = default;
+
+ sample_format_type format;
+
+ void add_options(po::options_description_easy_init &options) override {
+ options("port", po::value<string>()->required(), "The serial port to read");
+ options("format", po::value<sample_format_type>(&format)->default_value(sample_format_type::KEY_VALUE),
+ "Output format");
+ }
+
+ int main(app_execution &execution) override {
+ auto desc = execution.desc;
+ auto vm = execution.vm;
+
+ KeyDictionary dict;
+
+ uint32_t baud_rate = 115200;
+ auto port_name = vm["port"].as<string>();
+
+ io_service io_service;
+
+ serial_port port(io_service);
+ port.open(port_name);
+ port.set_option(serial_port_base::baud_rate(baud_rate));
+ port.set_option(serial_port_base::character_size(8));
+ port.set_option(serial_port_base::parity(serial_port_base::parity::none));
+ port.set_option(serial_port_base::stop_bits(serial_port_base::stop_bits::one));
+ port.set_option(serial_port_base::flow_control(serial_port_base::flow_control::none));
+
+ if (port.is_open()) {
+ cerr << "port is open" << endl;
+ } else {
+ cerr << "port is not open" << endl;
+ }
+
+ shared_ptr<ostream> outputStream = shared_ptr<ostream>(&cout, noop_deleter);
+ shared_ptr<SampleOutputStream> output = open_sample_output_stream(outputStream, dict, format);
+
+ shared_ptr<KeyValueSampleStreamParser> input = make_shared<KeyValueSampleStreamParser>(output, dict);
+
+ port_handler(port_name, port, input).run();
+
+ return EXIT_SUCCESS;
+ }
+};
+}
+}
+
+int main(int argc, const char *argv[]) {
+ using namespace trygvis::apps;
+
+ return real_main(new sm_serial_read(), argc, argv);
+}