Terminal-Task erstellen

inkl. Loginsystem via Konsole

------------------------------------------------------------------
terminal_task.c:
------------------------------------------------------------------
#include "terminal_task.h"
#include "cmsis_os.h"
#include "usart.h"
#include "string.h"
#include <stdio.h>
#include <stdlib.h>

#define TERMINAL_RX_BUF_LEN 128
static char line_buffer[TERMINAL_RX_BUF_LEN];
static uint16_t line_index = 0;

typedef enum {
    USER_NONE,
    USER_ADMIN,
    USER_CONFIG,
    USER_SERVICE
} user_role_t;

static user_role_t current_user = USER_NONE;
static const char* user_names[] = { "none", "admin", "config", "service" };
static const char* user_pw[]    = { "", "adminpw", "configpw", "servicepw" };

static const uint8_t device_address = 1; // IOC1:

static void terminal_send(const char* msg)
{
    HAL_UART_Transmit(&huart8, (uint8_t*)msg, strlen(msg), HAL_MAX_DELAY);
}

static void terminal_prompt(void)
{
    char msg[64];
    snprintf(msg, sizeof(msg), "(%s)IOC%d\\: ", user_names[current_user], device_address);
    terminal_send(msg);
}

void terminal_task(void *argument)
{
    terminal_send("\r\nWelcome to IOC Terminal!\r\n");
    terminal_send("Please login with: login <user> <pass>\r\n");
    terminal_prompt();

    while (1)
    {
        uint8_t ch;
        HAL_UART_Receive(&huart8, &ch, 1, HAL_MAX_DELAY);

        if(ch == '\r' || ch == '\n')
        {
            line_buffer[line_index] = 0; // Null-Terminierung
            terminal_send("\r\n");

            // Command Parsing:
            char cmd[32], arg1[32], arg2[32], arg3[32];
            int args = sscanf(line_buffer, "%31s %31s %31s %31s", cmd, arg1, arg2, arg3);

            if(args > 0)
            {
                if(strcmp(cmd, "login") == 0)
                {
                    if(args != 3)
                    {
                        terminal_send("Usage: login <user> <pass>\r\n");
                    }
                    else if(strcmp(arg1, "admin") == 0 && strcmp(arg2, user_pw[USER_ADMIN]) == 0)
                    {
                        current_user = USER_ADMIN;
                        terminal_send("Login successful.\r\n");
                    }
                    else if(strcmp(arg1, "config") == 0 && strcmp(arg2, user_pw[USER_CONFIG]) == 0)
                    {
                        current_user = USER_CONFIG;
                        terminal_send("Login successful.\r\n");
                    }
                    else if(strcmp(arg1, "service") == 0 && strcmp(arg2, user_pw[USER_SERVICE]) == 0)
                    {
                        current_user = USER_SERVICE;
                        terminal_send("Login successful.\r\n");
                    }
                    else
                    {
                        terminal_send("Login failed.\r\n");
                    }
                }
                else if(strcmp(cmd, "logout") == 0)
                {
                    current_user = USER_NONE;
                    terminal_send("Logged out.\r\n");
                }
                else if(strcmp(cmd, "help") == 0)
                {
                    terminal_send("Available commands:\r\n");
                    terminal_send("login <user> <pass>\r\n");
                    terminal_send("logout\r\n");
                    terminal_send("led <id>\r\n");
                    terminal_send("led <id> set <value>\r\n");
                    terminal_send("help\r\n");
                }
                else if(strcmp(cmd, "led") == 0 && args >= 2)
                {
                    int id = atoi(arg1);

                    if(args == 2)
                    {
                        terminal_send("Toggle LED\r\n");
                        // toggle_led(id);
                    }
                    else if(args == 4 && strcmp(arg2, "set") == 0)
                    {
                        int val = atoi(arg3);
                        // set_led(id, val);
                        terminal_send("LED set.\r\n");
                    }
                }
                else
                {
                    terminal_send("Unknown command.\r\n");
                }
            }

            terminal_prompt();

            line_index = 0;
            memset(line_buffer, 0, sizeof(line_buffer));
        }
        else
        {
            if(line_index < TERMINAL_RX_BUF_LEN - 1)
            {
                line_buffer[line_index++] = ch;
                HAL_UART_Transmit(&huart8, &ch, 1, HAL_MAX_DELAY); // Echo
            }
        }
    }
}

------------------------------------------------------------------
terminal_task.h:
------------------------------------------------------------------
#ifndef TERMINAL_TASK_H
#define TERMINAL_TASK_H

#include "main.h"

void terminal_task(void *argument);

#endif // TERMINAL_TASK_H
------------------------------------------------------------------
So sollte es dann Aussehen:
------------------------------------------------------------------
Welcome to IOC Terminal!
Please login with: login <user> <pass>
(none)IOC1\: login admin
Usage: login <user> <pass>
(none)IOC1\: login admin adminpw
Login successful.
(admin)IOC1\: help
Available commands:
login <user> <pass>
logout
led <id>
led <id> set <value>
help
(admin)IOC1\: logout
Logged out.
(none)IOC1\: 

Tags:

Comments

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Search


Categories


Recent Posts


Tags