DC11: disconnect handling / compile fix for ESP32
This commit is contained in:
parent
c70f1503a7
commit
e1666690b5
2 changed files with 22 additions and 12 deletions
26
dc11.cpp
26
dc11.cpp
|
@ -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
8
dc11.h
|
@ -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];
|
||||
|
|
Loading…
Add table
Reference in a new issue