diff --git a/dc11.cpp b/dc11.cpp index a251e66..c61d26d 100644 --- a/dc11.cpp +++ b/dc11.cpp @@ -1,6 +1,11 @@ // (C) 2024 by Folkert van Heusden // Released under MIT license +#if defined(ESP32) +#include +#else +#include +#endif #include #include #include @@ -17,6 +22,8 @@ dc11::dc11(const int base_port, bus *const b): base_port(base_port), b(b) { + pfds = new pollfd[dc11_n_lines * 2](); + // TODO move to begin() th = new std::thread(std::ref(*this)); } @@ -29,6 +36,8 @@ dc11::~dc11() th->join(); delete th; } + + delete [] pfds; } void dc11::trigger_interrupt(const int line_nr) @@ -117,16 +126,19 @@ void dc11::operator()() if (pfds[i].revents != POLLIN) continue; + int line_nr = i - dc11_n_lines; + char buffer[32] { }; int rc = read(pfds[i].fd, buffer, sizeof buffer); if (rc <= 0) { // closed or error? DOLOG(info, false, "Failed reading from port %d", i - dc11_n_lines + 1); + + registers[line_nr * 4 + 0] |= 0140000; // "ERROR", CARRIER TRANSITION + close(pfds[i].fd); pfds[i].fd = -1; } else { - int line_nr = i - dc11_n_lines; - std::unique_lock lck(input_lock[line_nr]); for(int k=0; k 32 && c < 127 ? c : ' ', line_nr); + if (write(pfds[dc11_n_lines + line_nr].fd, &c, 1) != 1) { DOLOG(info, false, "DC11 line %d disconnected\n", line_nr + 1); diff --git a/dc11.h b/dc11.h index afc34cd..f191525 100644 --- a/dc11.h +++ b/dc11.h @@ -8,11 +8,6 @@ #include #include #include -#if defined(ESP32) -#include -#else -#include -#endif #include "gen.h" #include "bus.h" @@ -23,6 +18,7 @@ #define DC11_END (DC11_BASE + (4 * 4 + 1) * 2) // 4 interfaces, + 2 to point after it class bus; +struct pollfd; // 4 interfaces constexpr const int dc11_n_lines = 4; @@ -36,7 +32,7 @@ private: std::atomic_bool stop_flag { false }; std::thread *th { nullptr }; - pollfd pfds[dc11_n_lines * 2] { }; + pollfd *pfds { nullptr }; std::vector recv_buffers[dc11_n_lines]; std::condition_variable have_data[dc11_n_lines]; std::mutex input_lock[dc11_n_lines];