/
galimzyanov.tech
/
pgcli
Обзор
Документация
Войти
/
galimzyanov.tech
/
pgcli
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
develop
examples/basic_usage.c
153 строки
4 KB
kirffa
[FIX] Исправляет ошибки обработки команд в примере
05 июн 2026, 21:43
05 июн 2026, 21:43
030045d
Код
Авторство
О чём код?
/** * Copyright (c) 2026 Галимзянов Кирилл Павлович * * Данный исходный код распространяется по лицензии MIT. * Полный текст лицензии находится в файле LICENSE, * поставляемом вместе с исходным кодом. * * SPDX-License-Identifier: MIT */ #include <stdio.h> #include "../include/pgcli/pgcli.h" #include "../include/pgcli/pgcli_color.h" static pgcli_status_t uart_init(void *ctx) { printf("UART initialized\n"); return PGCLI_OK; } static void uart_deinit(void *ctx) { printf("UART deinitialized\n"); } static int uart_send(const uint8_t *data, size_t len, void *ctx) { for (size_t i = 0; i < len; ++i) { putchar(data[i]); } fflush(stdout); return (int) len; } static int uart_receive(uint8_t *buf, size_t max_len, void *ctx) { int ch = getchar(); if (ch != EOF && max_len > 0) { buf[0] = (uint8_t) ch; return 1; } return 0; } static bool uart_data_available(void *ctx) { return true; } /* === Обработчики команд ================================================== */ static pgcli_status_t cmd_hello(pgcli_instance_t *cli, pgcli_args_t *args) { if (args->argc > 1) { pgcli_printfln(cli, "Hello, %s!\r\n", args->argv[1]); } else { pgcli_printfln(cli, PGCLI_DEBUG("Hello, World!")); } return PGCLI_OK; } static pgcli_status_t cmd_led(pgcli_instance_t *cli, pgcli_args_t *args) { if (args->argc != 2) { pgcli_writeln(cli, "Usage: led <on|off|toggle>"); return PGCLI_INVALID_ARGS; } if (pg_strcmp(args->argv[1], "on") == 0) { pgcli_writeln(cli, "LED ON"); } else if (pg_strcmp(args->argv[1], "off") == 0) { pgcli_writeln(cli, "LED OFF"); } else if (pg_strcmp(args->argv[1], "toggle") == 0) { pgcli_writeln(cli, "LED TOGGLE"); } else { pgcli_printf(cli, "Invalid argument: %s\r\n", args->argv[1]); return PGCLI_INVALID_ARGS; } return PGCLI_OK; } static pgcli_status_t cmd_read_reg(pgcli_instance_t *cli, pgcli_args_t *args) { if (args->argc != 2) { pgcli_writeln(cli, "Usage: reg <address>"); return PGCLI_INVALID_ARGS; } pgcli_write(cli, "Register at "); pgcli_write(cli, args->argv[1]); pgcli_write(cli, ": "); pgcli_write_hex(cli, 0x1234ABCD, 8); pgcli_write(cli, "\r\n"); return PGCLI_OK; } static pgcli_status_t cmd_help(pgcli_instance_t *cli, pgcli_args_t *args) { pgcli_writeln(cli, "Available commands: "); for (size_t i = 0; i < cli->num_commands; ++i) { pgcli_write(cli, " "); pgcli_write(cli, cli->commands[i].name); size_t name_len = pg_strlen(cli->commands[i].name); for (size_t j = name_len; j < 16; ++j) { pgcli_write(cli, " "); } pgcli_write(cli, "- "); pgcli_writeln(cli, cli->commands[i].help); } return PGCLI_OK; } /* === Главная функция ===================================================== */ int main(void) { pgcli_instance_t cli; pgcli_transport_t transport = { .init = uart_init, .deinit = uart_deinit, .send = uart_send, .receive = uart_receive, .data_available = uart_data_available, .user_ctx = NULL, }; if (pgcli_init(&cli, &transport, "emb> ") != PGCLI_OK) { pgcli_writeln(NULL, "Failed to initialize CLI"); return -1; } pgcli_add_command(&cli, "hello", "Say hello", cmd_hello); pgcli_add_command(&cli, "led", "Control LED", cmd_led); pgcli_add_command(&cli, "reg", "Read register", cmd_read_reg); pgcli_add_command(&cli, "help", "Show this help", cmd_help); pgcli_writeln(&cli, "CLI started. Type 'help' for available commands."); pgcli_write(&cli, "emb> "); while (1) { pgcli_process(&cli); } pgcli_deinit(&cli); return 0; }