diff --git a/musique/main.cc b/musique/main.cc index 2888d05..2727f51 100644 --- a/musique/main.cc +++ b/musique/main.cc @@ -167,7 +167,8 @@ struct Runner midi::Serial_Midi midi; Interpreter interpreter; std::shared_ptr serial_state; - std::optional serial_event_loop; + std::thread serial_event_loop; + std::atomic serial_event_loop_stop = false; /// Setup interpreter and midi connection with given port explicit Runner(std::optional output_port) @@ -183,8 +184,8 @@ struct Runner midi.serialport = serial_state; serialport::initialize(); - serial_event_loop = std::jthread([this](std::stop_token token) mutable{ - serialport::event_loop(token, *serial_state); + serial_event_loop = std::thread([this]() mutable { + serialport::event_loop(serial_event_loop_stop, *serial_state); }); interpreter.midi_connection = &midi; @@ -209,6 +210,13 @@ struct Runner Runner& operator=(Runner const&) = delete; Runner& operator=(Runner &&) = delete; + ~Runner() { + serial_event_loop_stop = true; + if (serial_event_loop.joinable()) { + serial_event_loop.join(); + } + } + /// Consider given input file as new definition of parametless function /// /// Useful for deffering execution of files to the point when all configuration of midi devices diff --git a/musique/serialport/serialport.cc b/musique/serialport/serialport.cc index 6e682e0..057120a 100644 --- a/musique/serialport/serialport.cc +++ b/musique/serialport/serialport.cc @@ -38,9 +38,9 @@ namespace serialport{ return 8; } - void event_loop(std::stop_token token, State &state) + void event_loop(std::atomic &stop, State &state) { - while(!token.stop_requested()){ + while(!stop){ try { /// Search for the right device auto const ports = serial::list_ports(); @@ -61,18 +61,18 @@ namespace serialport{ } } } - + /// Start connection serial::Serial serial_conn(connection_port, 115200, serial::Timeout::simpleTimeout(1000)); - + /*if(serial_conn.isOpen()) std::cout << "[SERIAL] Serial open\n"; else std::cout << "[SERIAL] Serial not open\n"; - + std::cout << "[SERIAL] commence serial communication\n"; */ diff --git a/musique/serialport/serialport.hh b/musique/serialport/serialport.hh index 783bf04..08e6d90 100644 --- a/musique/serialport/serialport.hh +++ b/musique/serialport/serialport.hh @@ -3,7 +3,6 @@ #include #include -#include #include #include #include @@ -24,10 +23,10 @@ namespace serialport{ void send(uint8_t message_type, uint8_t note_number); void set(unsigned position, std::uint32_t value); }; - + void initialize(); - void event_loop(std::stop_token token, State &state); + void event_loop(std::atomic &stop, State &state); std::uint8_t get_byte(); } -#endif //MUSIQUE_SERIALPORT_SERIALPORT_HH \ No newline at end of file +#endif //MUSIQUE_SERIALPORT_SERIALPORT_HH