#include <zephyr/kernel.h>
#include <string.h>
// Конфигурация
#define MSG_SIZE 32 // Максимальная длина строки
#define QUEUE_MAX_MSGS 10 // Максимальное количество сообщений в очереди
#define LCD_THREAD_STACK 1024
#define LCD_THREAD_PRIO 7
// Структура сообщения
struct lcd_msg_t {
char text[MSG_SIZE];
uint8_t row;
};
// Определяем очередь сообщений
K_MSGQ_DEFINE(lcd_msgq, sizeof(struct lcd_msg_t), QUEUE_MAX_MSGS, 4);
// Заглушки функций драйвера (замените на свои)
extern void lcd_set_cursor(uint8_t row, uint8_t col);
extern void lcd_print_raw(const char *str);
// Поток отрисовки
void lcd_render_thread(void *p1, void *p2, void *p3)
{
struct lcd_msg_t msg;
while (1) {
// Ждем сообщение из очереди (поток спит, пока очередь пуста)
if (k_msgq_get(&lcd_msgq, &msg, K_FOREVER) == 0) {
// 1. Установка позиции
lcd_set_cursor(msg.row, 0);
// 2. Печать строки
lcd_print_raw(msg.text);
// 3. Задержка для стабильности 1602A (чтобы не тух экран)
k_msleep(50);
}
}
}
// Регистрация потока
K_THREAD_DEFINE(lcd_thread_id, LCD_THREAD_STACK, lcd_render_thread,
NULL, NULL, NULL, LCD_THREAD_PRIO, 0, 0);
// API для отправки текста из других потоков
int safe_lcd_print(const char *text, uint8_t row)
{
struct lcd_msg_t msg;
msg.row = row;
strncpy(msg.text, text, MSG_SIZE - 1);
msg.text[MSG_SIZE - 1] = '\0';
// Кладем в очередь. Если очередь полна, не ждем (K_NO_WAIT)
return k_msgq_put(&lcd_msgq, &msg, K_NO_WAIT);
}