Загрузка данных


#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);
}