35 class CommBridge<std::tuple<TxPackets...>, std::tuple<RxPackets...>>
41 static std::unique_ptr<CommBridge>
create(
const device* uart_dev)
43 return std::unique_ptr<CommBridge>(
new CommBridge(uart_dev));
61 LOG_MODULE_DECLARE(
CommBridge, CONFIG_COMM_BRIDGE_LOG_LEVEL);
65 LOG_WRN(
"Receive already enabled");
69 uart_irq_callback_user_data_set(m_UartDev, uart_rx_callback,
this);
70 uart_irq_rx_enable(m_UartDev);
73 LOG_INF(
"UART RX interrupt enabled");
86 uart_irq_rx_disable(m_UartDev);
88 LOG_MODULE_DECLARE(
CommBridge, CONFIG_COMM_BRIDGE_LOG_LEVEL);
89 LOG_INF(
"UART RX interrupt disabled");
95 template <
typename... Packets>
96 requires(
sizeof...(Packets) == 0 || (RPL::Serializable<Packets, TxPackets...> && ...))
97 void
send(const Packets&... packets)
99 LOG_MODULE_DECLARE(
CommBridge, CONFIG_COMM_BRIDGE_LOG_LEVEL);
102 if constexpr (
sizeof...(Packets) == 0)
107 k_sem_take(&m_TxDoneSem, K_FOREVER);
109 auto res = m_Serializer.serialize(m_TxBuffer, TxBufferSize, packets...);
112 LOG_ERR(
"Serialize failed");
113 k_sem_give(&m_TxDoneSem);
117 m_TxSize = res.value();
119 for (
size_t i = 0; i < m_TxSize; ++i)
121 uart_poll_out(m_UartDev, m_TxBuffer[i]);
124 k_sem_give(&m_TxDoneSem);
130 template <
typename T>
131 requires(
sizeof...(RxPackets) == 0 ? false : RPL::Deserializable<T, RxPackets...>)
134 return m_Deserializer.template
get<T>();
141 m_Parser(m_Deserializer)
143 LOG_MODULE_DECLARE(
CommBridge, CONFIG_COMM_BRIDGE_LOG_LEVEL);
144 LOG_INF(
"Creating CommBridge");
145 if (!device_is_ready(m_UartDev))
147 LOG_ERR(
"UART not ready");
151 k_sem_init(&m_TxDoneSem, 1, 1);
153 LOG_INF(
"CommBridge initialized, UART device: %s", m_UartDev->name);
157 static constexpr size_t calculateTxBufferSize()
159 if constexpr (
sizeof...(TxPackets) == 0)
165 return (RPL::Serializer<TxPackets...>::template frame_size<TxPackets>() + ...);
169 static constexpr size_t TxBufferSize = calculateTxBufferSize();
170 static constexpr size_t RxBufferSize = CONFIG_COMM_BRIDGE_MAX_RX_SIZE;
172 const device* m_UartDev;
174 RPL::Serializer<TxPackets...> m_Serializer{};
175 uint8_t m_TxBuffer[TxBufferSize > 0 ? TxBufferSize : 1]{};
179 RPL::Deserializer<RxPackets...> m_Deserializer{};
180 RPL::Parser<RxPackets...> m_Parser;
181 uint8_t m_RxBuffer[RxBufferSize]{};
183 bool m_RxEnabled{
false};
188 static void uart_rx_callback(
const device* dev,
void* user_data)
190 LOG_MODULE_DECLARE(CommBridge, CONFIG_COMM_BRIDGE_LOG_LEVEL);
191 auto* bridge =
static_cast<CommBridge*
>(user_data);
193 if (!uart_irq_update(dev))
198 if (uart_irq_rx_ready(dev))
201 int len = uart_fifo_read(dev, buffer,
sizeof(buffer));
204 bridge->m_Parser.push_data(buffer, len);