DC11: disconnect handling / compile fix for ESP32

This commit is contained in:
folkert van heusden 2024-04-30 22:42:30 +02:00
parent c70f1503a7
commit e1666690b5
Signed by untrusted user who does not match committer: folkert
GPG key ID: 6B6455EDFEED3BD1
2 changed files with 22 additions and 12 deletions

View file

@ -1,6 +1,11 @@
// (C) 2024 by Folkert van Heusden // (C) 2024 by Folkert van Heusden
// Released under MIT license // Released under MIT license
#if defined(ESP32)
#include <lwip/sockets.h>
#else
#include <poll.h>
#endif
#include <cstring> #include <cstring>
#include <unistd.h> #include <unistd.h>
#include <arpa/inet.h> #include <arpa/inet.h>
@ -17,6 +22,8 @@ dc11::dc11(const int base_port, bus *const b):
base_port(base_port), base_port(base_port),
b(b) b(b)
{ {
pfds = new pollfd[dc11_n_lines * 2]();
// TODO move to begin() // TODO move to begin()
th = new std::thread(std::ref(*this)); th = new std::thread(std::ref(*this));
} }
@ -29,6 +36,8 @@ dc11::~dc11()
th->join(); th->join();
delete th; delete th;
} }
delete [] pfds;
} }
void dc11::trigger_interrupt(const int line_nr) void dc11::trigger_interrupt(const int line_nr)
@ -117,16 +126,19 @@ void dc11::operator()()
if (pfds[i].revents != POLLIN) if (pfds[i].revents != POLLIN)
continue; continue;
int line_nr = i - dc11_n_lines;
char buffer[32] { }; char buffer[32] { };
int rc = read(pfds[i].fd, buffer, sizeof buffer); int rc = read(pfds[i].fd, buffer, sizeof buffer);
if (rc <= 0) { // closed or error? if (rc <= 0) { // closed or error?
DOLOG(info, false, "Failed reading from port %d", i - dc11_n_lines + 1); 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); close(pfds[i].fd);
pfds[i].fd = -1; pfds[i].fd = -1;
} }
else { else {
int line_nr = i - dc11_n_lines;
std::unique_lock<std::mutex> lck(input_lock[line_nr]); std::unique_lock<std::mutex> lck(input_lock[line_nr]);
for(int k=0; k<rc; k++) for(int k=0; k<rc; k++)
@ -134,11 +146,11 @@ void dc11::operator()()
registers[line_nr * 4 + 0] |= 128; // DONE: bit 7 registers[line_nr * 4 + 0] |= 128; // DONE: bit 7
if (is_rx_interrupt_enabled(line_nr))
trigger_interrupt(line_nr);
have_data[line_nr].notify_all(); have_data[line_nr].notify_all();
} }
if (is_rx_interrupt_enabled(line_nr))
trigger_interrupt(line_nr);
} }
} }
@ -258,11 +270,13 @@ void dc11::write_word(const uint16_t addr, uint16_t v)
int line_nr = reg / 4; int line_nr = reg / 4;
int sub_reg = reg & 3; int sub_reg = reg & 3;
DOLOG(debug, true, "DC11: write register %06o (%d line_nr %d) to %06o", addr, reg, line_nr, v); DOLOG(debug, false, "DC11: write register %06o (%d line_nr %d) to %06o", addr, reg, line_nr, v);
if (sub_reg == 3) { // transmit buffer if (sub_reg == 3) { // transmit buffer
char c = v & 127; char c = v & 127;
DOLOG(debug, false, "DC11: transmit %c on line %d", c > 32 && c < 127 ? c : ' ', line_nr);
if (write(pfds[dc11_n_lines + line_nr].fd, &c, 1) != 1) { if (write(pfds[dc11_n_lines + line_nr].fd, &c, 1) != 1) {
DOLOG(info, false, "DC11 line %d disconnected\n", line_nr + 1); DOLOG(info, false, "DC11 line %d disconnected\n", line_nr + 1);

8
dc11.h
View file

@ -8,11 +8,6 @@
#include <mutex> #include <mutex>
#include <thread> #include <thread>
#include <vector> #include <vector>
#if defined(ESP32)
#include <lwip/sockets.h>
#else
#include <poll.h>
#endif
#include "gen.h" #include "gen.h"
#include "bus.h" #include "bus.h"
@ -23,6 +18,7 @@
#define DC11_END (DC11_BASE + (4 * 4 + 1) * 2) // 4 interfaces, + 2 to point after it #define DC11_END (DC11_BASE + (4 * 4 + 1) * 2) // 4 interfaces, + 2 to point after it
class bus; class bus;
struct pollfd;
// 4 interfaces // 4 interfaces
constexpr const int dc11_n_lines = 4; constexpr const int dc11_n_lines = 4;
@ -36,7 +32,7 @@ private:
std::atomic_bool stop_flag { false }; std::atomic_bool stop_flag { false };
std::thread *th { nullptr }; std::thread *th { nullptr };
pollfd pfds[dc11_n_lines * 2] { }; pollfd *pfds { nullptr };
std::vector<char> recv_buffers[dc11_n_lines]; std::vector<char> recv_buffers[dc11_n_lines];
std::condition_variable have_data[dc11_n_lines]; std::condition_variable have_data[dc11_n_lines];
std::mutex input_lock[dc11_n_lines]; std::mutex input_lock[dc11_n_lines];