for switch

This commit is contained in:
wmano
2025-08-25 22:58:48 +08:00
parent 411a3d157e
commit f9e7fa9956
25 changed files with 502 additions and 524 deletions
+211
View File
@@ -0,0 +1,211 @@
#include <rtthread.h>
#include <rtdevice.h>
#include "chrg_tty.h"
struct chrg_tty_t chrgtty[TOTAL_TTY] = {
[IDX_TTY_RS485] = {
.dev = RT_NULL,
.name = DEV_NAME_RS485,
.index = IDX_TTY_RS485,
},
[IDX_TTY_LCD] = {
.dev = RT_NULL,
.name = DEV_NAME_LCD,
.index = IDX_TTY_LCD,
},
[IDX_TTY_NORTH] = {
.dev = RT_NULL,
.name = DEV_NAME_NORTH,
.index = IDX_TTY_NORTH,
},
[IDX_TTY_SOUTH] = {
.dev = RT_NULL,
.name = DEV_NAME_SOUTH,
.index = IDX_TTY_SOUTH,
}
};
static rt_err_t chrg_rs485_tty_input (rt_device_t dev, rt_size_t size)
{
rt_err_t ret = RT_EOK;
struct chrg_tty_t *pTTY = &chrgtty[IDX_TTY_RS485];
pTTY->msg.dev = dev;
pTTY->msg.size = size;
ret = rt_mq_send(&pTTY->mq_rx, &pTTY->msg, sizeof(struct rx_msg_t));
if (ret == -RT_EFULL) {
rt_kprintf("msg queue is full!\r\n");
}
return ret;
}
static rt_err_t chrg_lcd_tty_input (rt_device_t dev, rt_size_t size)
{
rt_err_t ret = RT_EOK;
struct chrg_tty_t *pTTY = &chrgtty[IDX_TTY_LCD];
pTTY->msg.dev = dev;
pTTY->msg.size = size;
ret = rt_mq_send(&pTTY->mq_rx, &pTTY->msg, sizeof(struct rx_msg_t));
if (ret == -RT_EFULL) {
rt_kprintf("msg queue is full!\r\n");
}
return ret;
}
static rt_err_t chrg_north_tty_input (rt_device_t dev, rt_size_t size)
{
rt_err_t ret = RT_EOK;
struct chrg_tty_t *pTTY = &chrgtty[IDX_TTY_NORTH];
pTTY->msg.dev = dev;
pTTY->msg.size = size;
ret = rt_mq_send(&pTTY->mq_rx, &pTTY->msg, sizeof(struct rx_msg_t));
if (ret == -RT_EFULL) {
rt_kprintf("msg queue is full!\r\n");
}
return ret;
}
static rt_err_t chrg_south_tty_input (rt_device_t dev, rt_size_t size)
{
rt_err_t ret = RT_EOK;
struct chrg_tty_t *pTTY = &chrgtty[IDX_TTY_SOUTH];
pTTY->msg.dev = dev;
pTTY->msg.size = size;
ret = rt_mq_send(&pTTY->mq_rx, &pTTY->msg, sizeof(struct rx_msg_t));
if (ret == -RT_EFULL) {
rt_kprintf("msg queue is full!\r\n");
}
return ret;
}
static void chrg_tty_recv_entry (void *data)
{
struct chrg_tty_t *pTTY = (struct chrg_tty_t *)data;
rt_err_t ret = RT_EOK;
rt_int32_t rx_len = 0;
rt_uint8_t rx_raw[RT_SERIAL_RB_BUFSZ];
while (1) {
rt_memset(&pTTY->msg, 0, sizeof(struct rx_msg_t));
ret = rt_mq_recv(&pTTY->mq_rx, &pTTY->msg, sizeof(struct rx_msg_t), RT_WAITING_FOREVER);
if (ret == RT_EOK) {
rt_memset(rx_raw, 0, RT_SERIAL_RB_BUFSZ);
rx_len = rt_device_read(pTTY->msg.dev, 0, rx_raw, pTTY->msg.size);
if (rx_len > 0) {
}
}
}
}
rt_err_t chrg_tty_thread (struct chrg_tty_t *pTTY)
{
rt_err_t ret = RT_EOK;
rt_thread_t tid_tty;
struct serial_configure cfg = {
.baud_rate = BAUD_RATE_115200,
.data_bits = DATA_BITS_8,
.stop_bits = STOP_BITS_1,
.parity = PARITY_NONE,
.bit_order = BIT_ORDER_LSB,
.invert = NRZ_NORMAL,
.bufsz = RT_SERIAL_RB_BUFSZ,
.flowcontrol = RT_SERIAL_FLOWCONTROL_NONE,
};
if (RT_NULL == pTTY->dev) {
rt_kprintf("dev is null.\r\n");
return RT_ERROR;
}
rt_mq_init(&pTTY->mq_rx, pTTY->name, pTTY->pool_msg,
sizeof(struct rx_msg_t), sizeof(pTTY->pool_msg), RT_IPC_FLAG_FIFO);
ret = rt_device_open(pTTY->dev, RT_DEVICE_OFLAG_RDWR|RT_DEVICE_FLAG_INT_RX);
if (ret != RT_EOK) {
rt_kprintf("open '%s' failed.\r\n", pTTY->name);
return ret;
}
ret = rt_device_control(pTTY->dev, RT_DEVICE_CTRL_CONFIG, &cfg);
if (ret != RT_EOK) {
rt_kprintf("control '%s' failed.\r\n", pTTY->name);
return ret;
}
switch (pTTY->index) {
case IDX_TTY_RS485:
rt_device_set_rx_indicate(pTTY->dev, chrg_rs485_tty_input);
break;
case IDX_TTY_LCD:
rt_device_set_rx_indicate(pTTY->dev, chrg_lcd_tty_input);
break;
case IDX_TTY_NORTH:
rt_device_set_rx_indicate(pTTY->dev, chrg_north_tty_input);
break;
case IDX_TTY_SOUTH:
rt_device_set_rx_indicate(pTTY->dev, chrg_south_tty_input);
break;
default:
return RT_ERROR;
}
tid_tty = rt_thread_create(pTTY->name, chrg_tty_recv_entry,
pTTY, 4096, RT_MAIN_THREAD_PRIORITY+2, 20);
if (tid_tty != RT_NULL) {
rt_thread_startup(tid_tty);
} else {
rt_kprintf("create thread '%s' failed.\r\n", pTTY->name);
return -RT_ERROR;
}
return RT_EOK;
}
static int chrg_tty_init (void)
{
struct chrg_tty_t *pTTY = RT_NULL;
int i = 0;
for (i = 0; i < TOTAL_TTY; i++) {
if (IDX_TTY_RS485 == i) {
continue;
}
pTTY = &chrgtty[i];
pTTY->dev = rt_device_find(pTTY->name);
if (RT_NULL == pTTY->dev) {
rt_kprintf("dev '%s' not found.\r\n", pTTY->name);
return RT_ERROR;
}
chrg_tty_thread(pTTY);
}
return RT_EOK;
}
INIT_APP_EXPORT(chrg_tty_init);