Skip to content

Commit 84028dc

Browse files
committed
Make ESP32UARTChannel configure the GPIO for RTS/CTS/DTR/DSR/DCD/RI
1 parent 9754c72 commit 84028dc

File tree

6 files changed

+106
-59
lines changed

6 files changed

+106
-59
lines changed

lib/bus/rs232/rs232.cpp

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -315,29 +315,6 @@ void systemBus::setup()
315315
_port = &_serial;
316316
}
317317

318-
#ifdef ESP_PLATFORM
319-
// // INT PIN
320-
// fnSystem.set_pin_mode(PIN_RS232_RI, gpio_mode_t::GPIO_MODE_OUTPUT_OD, SystemManager::pull_updown_t::PULL_UP);
321-
// fnSystem.digital_write(PIN_RS232_RI, DIGI_HIGH);
322-
// PROC PIN
323-
fnSystem.set_pin_mode(PIN_RS232_RI, gpio_mode_t::GPIO_MODE_OUTPUT, SystemManager::pull_updown_t::PULL_UP);
324-
fnSystem.digital_write(PIN_RS232_RI, DIGI_HIGH);
325-
// INVALID PIN
326-
//fnSystem.set_pin_mode(PIN_RS232_INVALID, PINMODE_INPUT | PINMODE_PULLDOWN); // There's no PULLUP/PULLDOWN on pins 34-39
327-
fnSystem.set_pin_mode(PIN_RS232_INVALID, gpio_mode_t::GPIO_MODE_INPUT);
328-
// CMD PIN
329-
//fnSystem.set_pin_mode(PIN_RS232_DTR, PINMODE_INPUT | PINMODE_PULLUP); // There's no PULLUP/PULLDOWN on pins 34-39
330-
fnSystem.set_pin_mode(PIN_RS232_DTR, gpio_mode_t::GPIO_MODE_INPUT);
331-
// CKI PIN
332-
//fnSystem.set_pin_mode(PIN_CKI, PINMODE_OUTPUT);
333-
// CKO PIN
334-
335-
fnSystem.set_pin_mode(PIN_RS232_CTS, gpio_mode_t::GPIO_MODE_OUTPUT);
336-
fnSystem.digital_write(PIN_RS232_CTS,DIGI_LOW);
337-
338-
fnSystem.set_pin_mode(PIN_RS232_DSR,gpio_mode_t::GPIO_MODE_OUTPUT);
339-
fnSystem.digital_write(PIN_RS232_DSR,DIGI_LOW);
340-
#endif /* ESP_PLATFORM */
341318
#else /* FUJINET_OVER_USB */
342319
_serial.begin();
343320
_port = &_serial;

lib/hardware/ESP32UARTChannel.cpp

Lines changed: 60 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,38 @@ void ESP32UARTChannel::begin(const ChannelConfig& conf)
5858
// Install UART driver using an event queue here
5959
uart_driver_install(_uart_num, uart_buffer_size, 0, uart_queue_size, &_uart_q,
6060
intr_alloc_flags);
61+
62+
controlPins = conf.pins;
63+
64+
if (controlPins.rts >= 0)
65+
fnSystem.set_pin_mode(controlPins.rts, gpio_mode_t::GPIO_MODE_INPUT);
66+
if (controlPins.cts >= 0)
67+
{
68+
fnSystem.set_pin_mode(controlPins.cts, gpio_mode_t::GPIO_MODE_OUTPUT);
69+
fnSystem.digital_write(controlPins.cts, DIGI_LOW);
70+
}
71+
72+
if (controlPins.dtr >= 0)
73+
fnSystem.set_pin_mode(controlPins.dtr, gpio_mode_t::GPIO_MODE_INPUT);
74+
if (controlPins.dsr >= 0)
75+
{
76+
fnSystem.set_pin_mode(controlPins.dsr, gpio_mode_t::GPIO_MODE_OUTPUT);
77+
fnSystem.digital_write(controlPins.dsr, DIGI_LOW);
78+
}
79+
80+
if (controlPins.dcd >= 0)
81+
{
82+
fnSystem.set_pin_mode(controlPins.dcd, gpio_mode_t::GPIO_MODE_OUTPUT);
83+
fnSystem.digital_write(controlPins.dcd, DIGI_HIGH);
84+
}
85+
86+
if (controlPins.ri >= 0)
87+
{
88+
fnSystem.set_pin_mode(controlPins.ri, gpio_mode_t::GPIO_MODE_OUTPUT);
89+
fnSystem.digital_write(controlPins.ri, DIGI_HIGH);
90+
}
91+
92+
return;
6193
}
6294

6395
void ESP32UARTChannel::end()
@@ -117,36 +149,46 @@ size_t ESP32UARTChannel::dataOut(const void *buffer, size_t size)
117149
return uart_write_bytes(_uart_num, (const char *)buffer, size);
118150
}
119151

152+
bool ESP32UARTChannel::getPin(int pin)
153+
{
154+
if (pin < 0)
155+
return 0;
156+
return fnSystem.digital_read(pin) == DIGI_LOW;
157+
}
158+
159+
void ESP32UARTChannel::setPin(int pin, bool state)
160+
{
161+
if (pin >= 0)
162+
fnSystem.digital_write(pin, !state);
163+
return;
164+
}
165+
120166
bool ESP32UARTChannel::getDTR()
121167
{
122-
#if defined(FUJINET_OVER_USB) || !defined(PIN_RS232_DTR)
123-
return 0;
124-
#else /* FUJINET_OVER_USB */
125-
return fnSystem.digital_read(PIN_RS232_DTR) == DIGI_LOW;
126-
#endif /* FUJINET_OVER_USB */
168+
return getPin(controlPins.dtr);
127169
}
128170

129171
void ESP32UARTChannel::setDSR(bool state)
130172
{
131-
#if !defined(FUJINET_OVER_USB) && defined(PIN_RS232_DSR)
132-
fnSystem.digital_write(PIN_RS232_DSR, !state);
133-
#endif
134-
return;
173+
setPin(controlPins.dsr, state);
135174
}
136175

137176
bool ESP32UARTChannel::getRTS()
138177
{
139-
#if defined(FUJINET_OVER_USB) || !defined(PIN_RS232_RTS)
140-
return 0;
141-
#else /* FUJINET_OVER_USB */
142-
return fnSystem.digital_read(PIN_RS232_RTS) == DIGI_LOW;
143-
#endif /* FUJINET_OVER_USB */
178+
return getPin(controlPins.rts);
144179
}
145180

146181
void ESP32UARTChannel::setCTS(bool state)
147182
{
148-
#if !defined(FUJINET_OVER_USB) && defined(PIN_RS232_CTS)
149-
fnSystem.digital_write(PIN_RS232_CTS, !state);
150-
#endif
151-
return;
183+
setPin(controlPins.cts, state);
184+
}
185+
186+
void ESP32UARTChannel::setDCD(bool state)
187+
{
188+
setPin(controlPins.dcd, state);
189+
}
190+
191+
void ESP32UARTChannel::setRI(bool state)
192+
{
193+
setPin(controlPins.ri, state);
152194
}

lib/hardware/ESP32UARTChannel.h

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
#ifdef ESP_PLATFORM
88

9+
#include "pinmap.h"
910
#include <driver/uart.h>
1011
#include <hal/uart_types.h>
1112

@@ -16,6 +17,11 @@
1617
# define FN_UART_BUS UART_NUM_2
1718
#endif
1819

20+
struct RS232ControlPins
21+
{
22+
int rx, tx, rts, cts, dtr, dsr, dcd, ri;
23+
};
24+
1925
struct ChannelConfig
2026
{
2127
uart_config_t uart_config = {
@@ -35,6 +41,14 @@ struct ChannelConfig
3541
uart_port_t device;
3642
uint32_t read_timeout_ms = IOCHANNEL_DEFAULT_TIMEOUT;
3743
uint32_t discard_timeout_ms = IOCHANNEL_DEFAULT_TIMEOUT;
44+
RS232ControlPins pins = {
45+
.rts = PIN_RS232_RTS,
46+
.cts = PIN_RS232_CTS,
47+
.dtr = PIN_RS232_DTR,
48+
.dsr = PIN_RS232_DSR,
49+
.dcd = PIN_RS232_DCD,
50+
.ri = PIN_RS232_RI,
51+
};
3852

3953
ChannelConfig& baud(int baud) {
4054
uart_config.baud_rate = baud; return *this;
@@ -63,15 +77,37 @@ struct ChannelConfig
6377
ChannelConfig& discardTimeout(uint32_t millis) {
6478
discard_timeout_ms = millis; return *this;
6579
}
80+
ChannelConfig& rtsPin(int num) {
81+
pins.rts = num; return *this;
82+
}
83+
ChannelConfig& ctsPin(int num) {
84+
pins.cts = num; return *this;
85+
}
86+
ChannelConfig& dtrPin(int num) {
87+
pins.dtr = num; return *this;
88+
}
89+
ChannelConfig& dsrPin(int num) {
90+
pins.dsr = num; return *this;
91+
}
92+
ChannelConfig& dcdPin(int num) {
93+
pins.dcd = num; return *this;
94+
}
95+
ChannelConfig& ri(int num) {
96+
pins.ri = num; return *this;
97+
}
6698
};
6799

68100
class ESP32UARTChannel : public IOChannel, public RS232ChannelProtocol
69101
{
70102
private:
71103
uart_port_t _uart_num;
72104
QueueHandle_t _uart_q;
105+
RS232ControlPins controlPins;
73106

74107
protected:
108+
bool getPin(int pin);
109+
void setPin(int pin, bool state);
110+
75111
void updateFIFO() override;
76112
size_t dataOut(const void *buffer, size_t length) override;
77113

@@ -85,12 +121,12 @@ class ESP32UARTChannel : public IOChannel, public RS232ChannelProtocol
85121
void setBaudrate(uint32_t baud) override;
86122

87123
// FujiNet acts as modem (DCE), computer serial ports are DTE.
88-
// API names follow the modem (DCE) view, but the actual RS-232 pin differs.
89-
bool getDTR() override; // modem DTR input → actually reads RS-232 DSR pin
90-
void setDSR(bool state) override; // modem DSR output → actually drives RS-232 DTR pin
91-
bool getRTS() override; // modem RTS input → actually reads RS-232 CTS pin
92-
void setCTS(bool state) override; // modem CTS output → actually drives RS-232 RTS pin
93-
bool getRI() override { return 0; }; // Ring Indicator is only an input on DTE
124+
bool getDTR() override; // modem DTR input → actually reads RS-232 DSR pin
125+
void setDSR(bool state) override; // modem DSR output → actually drives RS-232 DTR pin
126+
bool getRTS() override; // modem RTS input → actually reads RS-232 CTS pin
127+
void setCTS(bool state) override; // modem CTS output → actually drives RS-232 RTS pin
128+
void setDCD(bool state) override; // modem DCD output → drives RS-232 DCD pin
129+
void setRI(bool state) override; // modem RI output → drives RS-232 RI pin
94130
};
95131

96132
extern ESP32UARTChannel fnDebugConsole;

lib/hardware/RS232ChannelProtocol.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ class RS232ChannelProtocol
1111
virtual void setDSR(bool state) = 0;
1212
virtual bool getRTS() = 0;
1313
virtual void setCTS(bool state) = 0;
14-
virtual bool getRI() = 0;
14+
virtual void setDCD(bool state) = 0;
15+
virtual void setRI(bool state) = 0;
1516
};
1617

1718
#endif /* RS232CHANNELPROTOCOL_H */

lib/hardware/TTYChannel.cpp

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -380,14 +380,4 @@ void TTYChannel::setCTS(bool state)
380380
return;
381381
}
382382

383-
bool TTYChannel::getRI()
384-
{
385-
int status;
386-
387-
if (ioctl(_fd, TIOCMGET, &status) == -1)
388-
return false;
389-
390-
return !!(status & TIOCM_RI);
391-
}
392-
393383
#endif /* ITS_A_UNIX_SYSTEM_I_KNOW_THIS */

lib/hardware/TTYChannel.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,8 @@ class TTYChannel : public IOChannel, public RS232ChannelProtocol
5656
void setDSR(bool state) override; // modem DSR output → actually drives RS-232 DTR pin
5757
bool getRTS() override; // modem RTS input → actually reads RS-232 CTS pin
5858
void setCTS(bool state) override; // modem CTS output → actually drives RS-232 RTS pin
59-
bool getRI() override; // Ring Indicator is only an input on DTE :-/
59+
void setDCD(bool state) override { return; }
60+
void setRI(bool state) override { return; }
6061

6162
void setPort(std::string device);
6263
std::string getPort();

0 commit comments

Comments
 (0)