Dein Warenkorb ist gerade leer!
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:

Schreibe einen Kommentar