Skip to content

Commit 6e4ed0c

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

File tree

6 files changed

+97
-59
lines changed

6 files changed

+97
-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: 50 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ void ESP32UARTChannel::begin(const ChannelConfig& conf)
4646
}
4747

4848
uart_set_pin(_uart_num, tx, rx, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
49+
configureGPIO(conf);
4950

5051
if (conf.isInverted)
5152
uart_set_line_inverse(_uart_num, UART_SIGNAL_TXD_INV | UART_SIGNAL_RXD_INV);
@@ -68,6 +69,27 @@ void ESP32UARTChannel::end()
6869
_uart_q = NULL;
6970
}
7071

72+
void ESP32UARTChannel::configureGPIO(const ChannelConfig& conf)
73+
{
74+
controlPins = conf.pins;
75+
76+
fnSystem.set_pin_mode(controlPins.rts, gpio_mode_t::GPIO_MODE_INPUT);
77+
fnSystem.set_pin_mode(controlPins.cts, gpio_mode_t::GPIO_MODE_OUTPUT);
78+
fnSystem.digital_write(controlPins.cts, DIGI_LOW);
79+
80+
fnSystem.set_pin_mode(controlPins.dtr, gpio_mode_t::GPIO_MODE_INPUT);
81+
fnSystem.set_pin_mode(controlPins.dsr, gpio_mode_t::GPIO_MODE_OUTPUT);
82+
fnSystem.digital_write(controlPins.dsr, DIGI_LOW);
83+
84+
fnSystem.set_pin_mode(controlPins.dcd, gpio_mode_t::GPIO_MODE_OUTPUT);
85+
fnSystem.digital_write(controlPins.dcd, DIGI_HIGH);
86+
87+
fnSystem.set_pin_mode(controlPins.ri, gpio_mode_t::GPIO_MODE_OUTPUT);
88+
fnSystem.digital_write(controlPins.ri, DIGI_HIGH);
89+
90+
return;
91+
}
92+
7193
void ESP32UARTChannel::updateFIFO()
7294
{
7395
uart_event_t event;
@@ -117,36 +139,46 @@ size_t ESP32UARTChannel::dataOut(const void *buffer, size_t size)
117139
return uart_write_bytes(_uart_num, (const char *)buffer, size);
118140
}
119141

142+
bool ESP32UARTChannel::getPin(int pin)
143+
{
144+
if (pin < 0)
145+
return 0;
146+
return fnSystem.digital_read(pin) == DIGI_LOW;
147+
}
148+
149+
void ESP32UARTChannel::setPin(int pin, bool state)
150+
{
151+
if (pin >= 0)
152+
fnSystem.digital_write(pin, !state);
153+
return;
154+
}
155+
120156
bool ESP32UARTChannel::getDTR()
121157
{
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 */
158+
return getPin(controlPins.dtr);
127159
}
128160

129161
void ESP32UARTChannel::setDSR(bool state)
130162
{
131-
#if !defined(FUJINET_OVER_USB) && defined(PIN_RS232_DSR)
132-
fnSystem.digital_write(PIN_RS232_DSR, !state);
133-
#endif
134-
return;
163+
setPin(controlPins.dsr, state);
135164
}
136165

137166
bool ESP32UARTChannel::getRTS()
138167
{
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 */
168+
return getPin(controlPins.rts);
144169
}
145170

146171
void ESP32UARTChannel::setCTS(bool state)
147172
{
148-
#if !defined(FUJINET_OVER_USB) && defined(PIN_RS232_CTS)
149-
fnSystem.digital_write(PIN_RS232_CTS, !state);
150-
#endif
151-
return;
173+
setPin(controlPins.cts, state);
174+
}
175+
176+
void ESP32UARTChannel::setDCD(bool state)
177+
{
178+
setPin(controlPins.dcd, state);
179+
}
180+
181+
void ESP32UARTChannel::setRI(bool state)
182+
{
183+
setPin(controlPins.ri, state);
152184
}

lib/hardware/ESP32UARTChannel.h

Lines changed: 43 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,38 @@ 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+
void configureGPIO(const ChannelConfig& conf);
109+
bool getPin(int pin);
110+
void setPin(int pin, bool state);
111+
75112
void updateFIFO() override;
76113
size_t dataOut(const void *buffer, size_t length) override;
77114

@@ -85,12 +122,12 @@ class ESP32UARTChannel : public IOChannel, public RS232ChannelProtocol
85122
void setBaudrate(uint32_t baud) override;
86123

87124
// 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
125+
bool getDTR() override; // modem DTR input → actually reads RS-232 DSR pin
126+
void setDSR(bool state) override; // modem DSR output → actually drives RS-232 DTR pin
127+
bool getRTS() override; // modem RTS input → actually reads RS-232 CTS pin
128+
void setCTS(bool state) override; // modem CTS output → actually drives RS-232 RTS pin
129+
void setDCD(bool state) override; // modem DCD output → drives RS-232 DCD pin
130+
void setRI(bool state) override; // modem RI output → drives RS-232 RI pin
94131
};
95132

96133
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)