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
// Released under MIT license
#if defined(ESP32)
#include <lwip/sockets.h>
#else
#include <poll.h>
#endif
#include <cstring>
#include <unistd.h>
#include <arpa/inet.h>
@ -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<std::mutex> lck(input_lock[line_nr]);
for(int k=0; k<rc; k++)
@ -134,11 +146,11 @@ void dc11::operator()()
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();
}
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 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
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) {
DOLOG(info, false, "DC11 line %d disconnected\n", line_nr + 1);

8
dc11.h
View file

@ -8,11 +8,6 @@
#include <mutex>
#include <thread>
#include <vector>
#if defined(ESP32)
#include <lwip/sockets.h>
#else
#include <poll.h>
#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<char> recv_buffers[dc11_n_lines];
std::condition_variable have_data[dc11_n_lines];
std::mutex input_lock[dc11_n_lines];