M5Unit-RS485 0.1.0 git rev:8a0af48
Loading...
Searching...
No Matches
m5_unit_unified_rs485_wiring.hpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2026 M5Stack Technology CO LTD
3 *
4 * SPDX-License-Identifier: MIT
5 */
19#ifndef M5_UNIT_UNIFIED_RS485_WIRING_HPP
20#define M5_UNIT_UNIFIED_RS485_WIRING_HPP
21
23#include <M5UnitUnified.hpp>
24#include <wiring/m5_unit_unified_wiring.hpp> // core wiring: defaultUartSerial / uartPortHandle / defaultUartPort
25
26#if defined(ARDUINO)
27#include <HardwareSerial.h>
28#endif
29
30namespace m5 {
31namespace unit {
32namespace rs485 {
33namespace wiring {
34
35#if defined(__M5UNIFIED_HPP__)
36
41struct AtomicBasePinPair {
42 int8_t rx;
43 int8_t tx;
44};
45
50inline AtomicBasePinPair atomicBaseUartPins()
51{
52 switch (M5.getBoard()) {
53 case m5::board_t::board_M5AtomLite:
54 case m5::board_t::board_M5AtomMatrix:
55 return {22, 19};
56 case m5::board_t::board_M5AtomS3:
57 case m5::board_t::board_M5AtomS3Lite:
58 case m5::board_t::board_M5AtomS3R:
59 case m5::board_t::board_M5AtomEchoS3R:
60 case m5::board_t::board_M5AtomS3RCam:
61 case m5::board_t::board_M5AtomS3RExt:
62 return {5, 6};
63 default:
64 return {-1, -1};
65 }
66}
67
68#if defined(ARDUINO)
78inline bool addAtomicBaseUART(UnitUnified& units, Component& unit, const uint32_t baud = 115200,
79 const uint32_t config = SERIAL_8N1)
80{
81 const auto p = atomicBaseUartPins();
82 if (p.rx < 0 || p.tx < 0) {
83 M5_LIB_LOGE("wiring: addAtomicBaseUART unsupported board=0x%02x", static_cast<int>(M5.getBoard()));
84 return false;
85 }
86 M5_LIB_LOGI("wiring: addAtomicBaseUART board=0x%02x rx=%d tx=%d baud=%lu", static_cast<int>(M5.getBoard()),
87 static_cast<int>(p.rx), static_cast<int>(p.tx), static_cast<unsigned long>(baud));
88
89 HardwareSerial& serial = m5::unit::wiring::defaultUartSerial();
90 serial.end();
91 serial.begin(baud, config, p.rx, p.tx);
92 return units.add(unit, serial);
93}
94#else // ESP-IDF native
104inline bool addAtomicBaseUART(UnitUnified& units, Component& unit, const uint32_t baud = 115200,
105 const m5::unit::wiring::UartConfig config = m5::unit::wiring::UartConfig::Default)
106{
107 const auto p = atomicBaseUartPins();
108 if (p.rx < 0 || p.tx < 0) {
109 M5_LIB_LOGE("wiring: addAtomicBaseUART unsupported board=0x%02x", static_cast<int>(M5.getBoard()));
110 return false;
111 }
112 M5_LIB_LOGI("wiring(ESP-IDF): addAtomicBaseUART board=0x%02x rx=%d tx=%d baud=%u", static_cast<int>(M5.getBoard()),
113 static_cast<int>(p.rx), static_cast<int>(p.tx), static_cast<unsigned>(baud));
114
115 auto port = m5::unit::wiring::uartPortHandle(m5::unit::wiring::defaultUartPort(), static_cast<gpio_num_t>(p.rx),
116 static_cast<gpio_num_t>(p.tx), baud, config);
117 if (port == UART_NUM_MAX) {
118 return false;
119 }
120 return units.add(unit, port);
121}
122#endif // ARDUINO
123
126
130struct Tab5BuiltinRS485Pins {
131 int8_t rx;
132 int8_t tx;
133 int8_t dir;
134};
135
140inline Tab5BuiltinRS485Pins tab5BuiltinRS485Pins()
141{
142 switch (M5.getBoard()) {
143 case m5::board_t::board_M5Tab5:
144 return {21, 20, 34};
145 default:
146 return {-1, -1, -1};
147 }
148}
149
150#if defined(ARDUINO)
160inline bool addTab5BuiltinRS485UART(UnitUnified& units, UnitSIT3088& unit, const uint32_t baud = 115200,
161 const uint32_t config = SERIAL_8N1)
162{
163 const auto p = tab5BuiltinRS485Pins();
164 if (p.rx < 0 || p.tx < 0 || p.dir < 0) {
165 M5_LIB_LOGE("wiring: addTab5BuiltinRS485UART unsupported board=0x%02x", static_cast<int>(M5.getBoard()));
166 return false;
167 }
168 M5_LIB_LOGI("wiring: addTab5BuiltinRS485UART board=0x%02x rx=%d tx=%d dir=%d baud=%lu",
169 static_cast<int>(M5.getBoard()), static_cast<int>(p.rx), static_cast<int>(p.tx),
170 static_cast<int>(p.dir), static_cast<unsigned long>(baud));
171
172 auto cfg = unit.config();
173 cfg.dir_pin = p.dir;
174 unit.config(cfg);
175
176 HardwareSerial& serial = m5::unit::wiring::defaultUartSerial();
177 serial.end();
178 serial.begin(baud, config, p.rx, p.tx);
179 return units.add(unit, serial);
180}
181#else // ESP-IDF native
186inline bool addTab5BuiltinRS485UART(UnitUnified& units, UnitSIT3088& unit, const uint32_t baud = 115200,
187 const m5::unit::wiring::UartConfig config = m5::unit::wiring::UartConfig::Default)
188{
189 (void)units;
190 (void)unit;
191 (void)baud;
192 (void)config;
193 M5_LIB_LOGE("wiring(ESP-IDF): addTab5BuiltinRS485UART is not yet supported");
194 return false;
195}
196#endif // ARDUINO
198
199#endif // __M5UNIFIED_HPP__
200
201} // namespace wiring
202} // namespace rs485
203} // namespace unit
204} // namespace m5
205#endif // M5_UNIT_UNIFIED_RS485_WIRING_HPP
Top level namespace of M5Stack.
Unit-related namespace.
SIT3088 unit for M5UnitUnified (manual direction-controlled RS-485 transceiver)