From c56840f03cf139d60c6d90b55cf16e70f6ae2bc2 Mon Sep 17 00:00:00 2001 From: Trygve Laugstøl Date: Sun, 21 Jun 2015 00:15:04 +0200 Subject: o Going all header file based and single-executable to launch all apps. o Ading CMake magic to generate the launcher --- apps/sm-serial-read-all.cpp | 175 -------------------------------------------- 1 file changed, 175 deletions(-) delete mode 100644 apps/sm-serial-read-all.cpp (limited to 'apps/sm-serial-read-all.cpp') diff --git a/apps/sm-serial-read-all.cpp b/apps/sm-serial-read-all.cpp deleted file mode 100644 index 5fa3f79..0000000 --- a/apps/sm-serial-read-all.cpp +++ /dev/null @@ -1,175 +0,0 @@ -#include "trygvis/sensor.h" -#include "trygvis/sensor/io.h" -#include "json.hpp" -#include "apps.h" -#include -#include - -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; - -sample_format_type format; -string hostname = get_hostname(); - -class port_handler { -public: - port_handler(string &port_name, serial_port &port, unique_ptr parser) : - port_name(port_name), port(port), parser(move(parser)) { - } - - void run() { - auto packet = make_shared>(1024); - - while (port.is_open()) { - std::size_t some = port.read_some(buffer); - - mutable_buffers_1 chunk = boost::asio::buffer(data, some); - parser->process(chunk); - } - - cerr << "port closed" << endl; - dead_ = true; - } - - bool dead() const { - return dead_; - } - - const string port_name; - -private: - static const size_t size = 1024; - bool dead_ = false; - serial_port &port; - uint8_t data[size]; - mutable_buffers_1 buffer = boost::asio::buffer(data, size); - - unique_ptr parser; -}; - -// This only supports Linux -#if 1 - -#include -#include - -vector &&find_ports() { - DIR *dir = opendir("/dev"); - vector ports; - - if (!dir) { - return move(ports); - } - - struct dirent *entry; - while ((entry = readdir(dir)) != NULL) { - string name = entry->d_name; - - if (name.find("ttyS") || name.find("ttyUSB") || name.find("ttyACM")) { - ports.emplace_back("/dev/" + name); - } - } - - closedir(dir); - - return move(ports); -} - -#endif - -class sm_serial_read_all : public app { - -public: - sm_serial_read_all() : app("sm-serial-read-all") { - } - - ~sm_serial_read_all() = default; - - bool run = true; - - void add_options(po::options_description_easy_init &options) override { - options - ("help", "produce help message") - ("port", po::value()->required(), "The serial port to read") - ("format", po::value(&format)->default_value(sample_format_type::KEY_VALUE), "Output format"); - } - - static - void handler_thread(port_handler *handler) { - handler->run(); - } - - int main(app_execution &execution) override { - auto desc = execution.desc; - auto vm = execution.vm; - - io_service io_service; - uint32_t baud_rate = 115200; - - map active_ports; - - KeyDictionary outputDict; - auto output_stream = shared_ptr(&cout, noop_deleter); - auto output = open_sample_output_stream(output_stream, outputDict, format); - auto tso = thread_safe_sample_output_stream(move(output)); - shared_ptr thread_safe_output(move(tso)); - - while (run) { - // Port cleanup - for (auto it = active_ports.begin(); it != active_ports.end(); ++it) { - if (it->second->dead()) { - cerr << "Removing dead port " << it->second->port_name << endl; - it = active_ports.erase(it); - } - } - - // Discover new ports - auto ports = find_ports(); - - for (auto port_name : ports) { - if (active_ports.find(port_name) != active_ports.end()) { - cerr << "New port " << port_name; - - 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)); - - KeyDictionary parserDict; // TODO: dette feiler - unique_ptr parser = open_sample_stream_parser(thread_safe_output, parserDict, sample_format_type::KEY_VALUE); - - auto handler = new port_handler(port_name, port, move(parser)); - active_ports[port_name] = handler; - std::thread thread(handler_thread, handler); - } - } - - sleep(1); - } - - return EXIT_SUCCESS; - } - -}; - -} -} - -using namespace trygvis::apps; - -int main(int argc, char *argv[]) { - sm_serial_read_all app; - return launch_app(argc, argv, app); -} -- cgit v1.2.3