CLI: gpio_set
This commit is contained in:
parent
8d88c07dec
commit
c2d2e5ef96
|
@ -43,6 +43,10 @@ int mstring_printf(mstring_t* mstr, const char format[], ...) {
|
|||
return ret;
|
||||
}
|
||||
|
||||
int mstring_vprintf(mstring_t* mstr, const char format[], va_list args) {
|
||||
return string_vprintf(mstr->str, format, args);
|
||||
}
|
||||
|
||||
const char* mstring_get_cstr(const mstring_t* mstr) {
|
||||
return string_get_cstr(mstr->str);
|
||||
}
|
||||
|
@ -77,4 +81,8 @@ void mstring_set_strn(mstring_t* mstr, const char str[], size_t n) {
|
|||
|
||||
void mstring_push_back(mstring_t* mstr, char c) {
|
||||
string_push_back(mstr->str, c);
|
||||
}
|
||||
|
||||
void mstring_right(mstring_t* mstr, size_t index) {
|
||||
string_right(mstr->str, index);
|
||||
}
|
|
@ -8,6 +8,7 @@
|
|||
*/
|
||||
#pragma once
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
typedef struct mstring_t mstring_t;
|
||||
|
||||
|
@ -62,6 +63,15 @@ void mstring_cat(mstring_t* mstr, const char* text);
|
|||
*/
|
||||
int mstring_printf(mstring_t* mstr, const char format[], ...);
|
||||
|
||||
/**
|
||||
*
|
||||
* @param mstr
|
||||
* @param format
|
||||
* @param args
|
||||
* @return int
|
||||
*/
|
||||
int mstring_vprintf(mstring_t* mstr, const char format[], va_list args);
|
||||
|
||||
/**
|
||||
* Get constant pointer to string value
|
||||
* @param mstr
|
||||
|
@ -121,4 +131,6 @@ void mstring_set_n(mstring_t* mstr, const mstring_t* mstr_ref, size_t offset, si
|
|||
|
||||
void mstring_set_strn(mstring_t* mstr, const char str[], size_t n);
|
||||
|
||||
void mstring_push_back(mstring_t* mstr, char c);
|
||||
void mstring_push_back(mstring_t* mstr, char c);
|
||||
|
||||
void mstring_right(mstring_t* mstr, size_t index);
|
|
@ -13,6 +13,8 @@ set(SOURCES
|
|||
"cli.c"
|
||||
"cli-uart.c"
|
||||
"cli-commands.c"
|
||||
"cli-command-gpio.c"
|
||||
"cli-args.c"
|
||||
)
|
||||
|
||||
set(INCLUDES
|
||||
|
|
|
@ -0,0 +1,62 @@
|
|||
#include <stdio.h>
|
||||
#include "cli-args.h"
|
||||
|
||||
size_t cli_args_get_first_word_length(mstring_t* args) {
|
||||
size_t ws = mstring_search_char(args, ' ', 0);
|
||||
if(ws == STRING_FAILURE) {
|
||||
ws = mstring_size(args);
|
||||
}
|
||||
|
||||
return ws;
|
||||
}
|
||||
|
||||
size_t cli_args_length(mstring_t* args) {
|
||||
return mstring_size(args);
|
||||
}
|
||||
|
||||
bool cli_args_read_int_and_trim(mstring_t* args, int* value) {
|
||||
size_t cmd_length = cli_args_get_first_word_length(args);
|
||||
|
||||
if(cmd_length == 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if(sscanf(mstring_get_cstr(args), "%d", value) == 1) {
|
||||
mstring_right(args, cmd_length);
|
||||
mstring_strim(args, " \r\n\t");
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool cli_args_read_string_and_trim(mstring_t* args, mstring_t* word) {
|
||||
size_t cmd_length = cli_args_get_first_word_length(args);
|
||||
|
||||
if(cmd_length == 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
mstring_set_n(word, args, 0, cmd_length);
|
||||
mstring_right(args, cmd_length);
|
||||
mstring_strim(args, " \r\n\t");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool cli_args_read_probably_quoted_string_and_trim(mstring_t* args, mstring_t* word) {
|
||||
if(mstring_size(args) > 1 && mstring_get_char(args, 0) == '\"') {
|
||||
size_t second_quote_pos = mstring_search_char(args, '\"', 1);
|
||||
|
||||
if(second_quote_pos == 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
mstring_set_n(word, args, 1, second_quote_pos - 1);
|
||||
mstring_right(args, second_quote_pos + 1);
|
||||
mstring_strim(args, " \r\n\t");
|
||||
return true;
|
||||
} else {
|
||||
return cli_args_read_string_and_trim(args, word);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,60 @@
|
|||
/**
|
||||
* @file cli-args.h
|
||||
* @author Sergey Gavrilov (who.just.the.doctor@gmail.com)
|
||||
* @version 1.0
|
||||
* @date 2021-12-01
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <m-string.h>
|
||||
|
||||
/** Extract int value and trim arguments string
|
||||
*
|
||||
* @param args - arguments string
|
||||
* @param word first argument, output
|
||||
* @return true - success
|
||||
* @return false - arguments string does not contain int
|
||||
*/
|
||||
bool cli_args_read_int_and_trim(mstring_t* args, int* value);
|
||||
|
||||
/**
|
||||
* @brief Extract first argument from arguments string and trim arguments string
|
||||
*
|
||||
* @param args arguments string
|
||||
* @param word first argument, output
|
||||
* @return true - success
|
||||
* @return false - arguments string does not contain anything
|
||||
*/
|
||||
bool cli_args_read_string_and_trim(mstring_t* args, mstring_t* word);
|
||||
|
||||
/**
|
||||
* @brief Extract the first quoted argument from the argument string and trim the argument string. If the argument is not quoted, calls args_read_string_and_trim.
|
||||
*
|
||||
* @param args arguments string
|
||||
* @param word first argument, output, without quotes
|
||||
* @return true - success
|
||||
* @return false - arguments string does not contain anything
|
||||
*/
|
||||
bool cli_args_read_probably_quoted_string_and_trim(mstring_t* args, mstring_t* word);
|
||||
|
||||
/************************************ HELPERS ***************************************/
|
||||
|
||||
/**
|
||||
* @brief Get length of first word from arguments string
|
||||
*
|
||||
* @param args arguments string
|
||||
* @return size_t length of first word
|
||||
*/
|
||||
size_t cli_args_get_first_word_length(mstring_t* args);
|
||||
|
||||
/**
|
||||
* @brief Get length of arguments string
|
||||
*
|
||||
* @param args arguments string
|
||||
* @return size_t length of arguments string
|
||||
*/
|
||||
size_t cli_args_length(mstring_t* args);
|
|
@ -0,0 +1,128 @@
|
|||
#include <driver/gpio.h>
|
||||
#include "cli.h"
|
||||
#include "cli-args.h"
|
||||
#include "cli-commands.h"
|
||||
#include "helpers.h"
|
||||
|
||||
typedef struct {
|
||||
const char* name;
|
||||
const gpio_num_t gpio_num;
|
||||
} GPIOItem;
|
||||
|
||||
#define MAKE_IO(pin_index) \
|
||||
{ .name = "IO" #pin_index, .gpio_num = GPIO_NUM_##pin_index }
|
||||
|
||||
#define MAKE_IO_NAMED(pin_name, pin_index) \
|
||||
{ .name = pin_name, .gpio_num = GPIO_NUM_##pin_index }
|
||||
|
||||
const GPIOItem gpio_items[] = {
|
||||
// SWD
|
||||
MAKE_IO(1),
|
||||
MAKE_IO_NAMED("SWCLK", 1),
|
||||
MAKE_IO(2),
|
||||
MAKE_IO_NAMED("SWDIO", 2),
|
||||
// I2C_PULL_UP
|
||||
MAKE_IO(3),
|
||||
MAKE_IO_NAMED("I2C_PULL_UP", 3),
|
||||
// GPIO
|
||||
MAKE_IO(7),
|
||||
MAKE_IO(8),
|
||||
MAKE_IO(9),
|
||||
// SPI
|
||||
MAKE_IO(10),
|
||||
MAKE_IO_NAMED("SWO", 10),
|
||||
MAKE_IO_NAMED("SPI_CS", 10),
|
||||
MAKE_IO(11),
|
||||
MAKE_IO_NAMED("SPI_MOSI", 11),
|
||||
MAKE_IO(12),
|
||||
MAKE_IO_NAMED("SPI_CLK", 12),
|
||||
MAKE_IO(13),
|
||||
MAKE_IO_NAMED("SPI_MISO", 13),
|
||||
// GPIO
|
||||
MAKE_IO(14),
|
||||
MAKE_IO(15),
|
||||
MAKE_IO(16),
|
||||
// CLI UART
|
||||
MAKE_IO(17),
|
||||
MAKE_IO_NAMED("CLI_TXD", 17),
|
||||
MAKE_IO(18),
|
||||
MAKE_IO_NAMED("CLI_RXD", 18),
|
||||
// GPIO
|
||||
MAKE_IO(21),
|
||||
MAKE_IO(33),
|
||||
MAKE_IO(34),
|
||||
MAKE_IO(35),
|
||||
MAKE_IO(36),
|
||||
MAKE_IO(37),
|
||||
// JTAG
|
||||
MAKE_IO(38),
|
||||
MAKE_IO_NAMED("JTAG_SRST", 38),
|
||||
MAKE_IO(39),
|
||||
MAKE_IO_NAMED("JTAG_TCK", 39),
|
||||
MAKE_IO(40),
|
||||
MAKE_IO_NAMED("JTAG_TDI", 40),
|
||||
MAKE_IO(41),
|
||||
MAKE_IO_NAMED("JTAG_TDO", 41),
|
||||
MAKE_IO(42),
|
||||
MAKE_IO_NAMED("JTAG_TMS", 41),
|
||||
};
|
||||
|
||||
size_t gpio_items_count = COUNT_OF(gpio_items);
|
||||
|
||||
static void cli_gpio_print_list(Cli* cli) {
|
||||
cli_write_str(cli, "pin names: ");
|
||||
for(size_t i = 0; i < gpio_items_count; i++) {
|
||||
cli_write_str(cli, gpio_items[i].name);
|
||||
if((i + 1) < gpio_items_count) {
|
||||
cli_write_str(cli, ", ");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static gpio_num_t gpio_search(mstring_t* gpio_name) {
|
||||
gpio_num_t gpio_num = GPIO_NUM_NC;
|
||||
for(size_t i = 0; i < gpio_items_count; i++) {
|
||||
if(mstring_cmp_cstr(gpio_name, gpio_items[i].name) == 0) {
|
||||
gpio_num = gpio_items[i].gpio_num;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return gpio_num;
|
||||
}
|
||||
|
||||
void cli_gpio_set(Cli* cli, mstring_t* args) {
|
||||
mstring_t* gpio_name = mstring_alloc();
|
||||
int gpio_value = 0;
|
||||
|
||||
do {
|
||||
if(!cli_args_read_string_and_trim(args, gpio_name) ||
|
||||
!cli_args_read_int_and_trim(args, &gpio_value)) {
|
||||
cli_write_str(cli, "Usage: gpio_set <pin_name> <value>");
|
||||
cli_write_eol(cli);
|
||||
cli_gpio_print_list(cli);
|
||||
break;
|
||||
}
|
||||
|
||||
gpio_num_t gpio_num = gpio_search(gpio_name);
|
||||
if(gpio_num == GPIO_NUM_NC) {
|
||||
cli_write_str(cli, "Invalid <pin_name>");
|
||||
cli_write_eol(cli);
|
||||
cli_gpio_print_list(cli);
|
||||
break;
|
||||
}
|
||||
|
||||
gpio_config_t io_conf;
|
||||
io_conf.intr_type = GPIO_PIN_INTR_DISABLE;
|
||||
io_conf.mode = GPIO_MODE_OUTPUT;
|
||||
io_conf.pin_bit_mask = (1 << gpio_num);
|
||||
io_conf.pull_down_en = 0;
|
||||
io_conf.pull_up_en = 0;
|
||||
gpio_config(&io_conf);
|
||||
gpio_set_level(gpio_num, gpio_value > 0);
|
||||
|
||||
cli_write_str(cli, "OK");
|
||||
} while(false);
|
||||
|
||||
mstring_free(gpio_name);
|
||||
}
|
|
@ -1,20 +1,37 @@
|
|||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <esp_mac.h>
|
||||
#include "cli.h"
|
||||
#include "cli-args.h"
|
||||
#include "cli-commands.h"
|
||||
#include "helpers.h"
|
||||
|
||||
void cli_id(Cli* cli, mstring_t* args);
|
||||
void cli_help(Cli* cli, mstring_t* args);
|
||||
void cli_version(Cli* cli, mstring_t* args);
|
||||
void cli_gpio_set(Cli* cli, mstring_t* args);
|
||||
|
||||
const CliItem cli_items[] = {
|
||||
{
|
||||
.name = "?",
|
||||
.callback = cli_help,
|
||||
},
|
||||
{
|
||||
.name = "id",
|
||||
.callback = cli_id,
|
||||
},
|
||||
{
|
||||
.name = "help",
|
||||
.callback = cli_help,
|
||||
},
|
||||
{
|
||||
.name = "version",
|
||||
.callback = cli_version,
|
||||
},
|
||||
{
|
||||
.name = "gpio_set",
|
||||
.callback = cli_gpio_set,
|
||||
},
|
||||
};
|
||||
|
||||
size_t cli_items_count = COUNT_OF(cli_items);
|
||||
|
@ -27,4 +44,24 @@ void cli_help(Cli* cli, mstring_t* args) {
|
|||
cli_write_eol(cli);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void cli_id(Cli* cli, mstring_t* args) {
|
||||
uint8_t mac_addr[6] = {0};
|
||||
ESP_ERROR_CHECK(esp_read_mac(mac_addr, ESP_MAC_WIFI_STA));
|
||||
cli_printf(
|
||||
cli,
|
||||
"%02X%02X%02X%02X%02X%02X",
|
||||
mac_addr[0],
|
||||
mac_addr[1],
|
||||
mac_addr[2],
|
||||
mac_addr[3],
|
||||
mac_addr[4],
|
||||
mac_addr[5]);
|
||||
}
|
||||
|
||||
void cli_version(Cli* cli, mstring_t* args) {
|
||||
cli_printf(cli, "IDF version: %s", IDF_VER);
|
||||
cli_write_eol(cli);
|
||||
cli_printf(cli, "FW version: %s", "0.1");
|
||||
}
|
13
main/cli.c
13
main/cli.c
|
@ -23,6 +23,7 @@ typedef enum {
|
|||
|
||||
struct Cli {
|
||||
mstring_t* line;
|
||||
mstring_t* prev_line;
|
||||
size_t cursor_position;
|
||||
|
||||
void* context;
|
||||
|
@ -33,6 +34,7 @@ struct Cli {
|
|||
Cli* cli_init(void) {
|
||||
Cli* cli = malloc(sizeof(Cli));
|
||||
cli->line = mstring_alloc();
|
||||
cli->prev_line = mstring_alloc();
|
||||
cli->context = NULL;
|
||||
cli->write_cb = NULL;
|
||||
cli->flush_cb = NULL;
|
||||
|
@ -83,6 +85,16 @@ void cli_write_eol(Cli* cli) {
|
|||
cli_write_str(cli, "\r\n");
|
||||
}
|
||||
|
||||
void cli_printf(Cli* cli, char* format, ...) {
|
||||
mstring_t* str = mstring_alloc();
|
||||
va_list args;
|
||||
va_start(args, format);
|
||||
mstring_vprintf(str, format, args);
|
||||
va_end(args);
|
||||
cli_write_str(cli, mstring_get_cstr(str));
|
||||
mstring_free(str);
|
||||
}
|
||||
|
||||
static void cli_write_motd(Cli* cli) {
|
||||
cli_write_str(cli, "Hello!\r\nThis is MOTD\r\n");
|
||||
}
|
||||
|
@ -109,6 +121,7 @@ static bool cli_handle_enter(Cli* cli) {
|
|||
bool result = false;
|
||||
const CliItem* item = NULL;
|
||||
|
||||
mstring_set(cli->prev_line, mstring_get_cstr(cli->line));
|
||||
mstring_strim(cli->line, " \n\r\t");
|
||||
|
||||
size_t ws = mstring_search_char(cli->line, ' ', 0);
|
||||
|
|
|
@ -33,4 +33,6 @@ void cli_write_char(Cli* cli, uint8_t c);
|
|||
|
||||
void cli_handle_char(Cli* cli, uint8_t c);
|
||||
|
||||
void cli_write_eol(Cli* cli);
|
||||
void cli_write_eol(Cli* cli);
|
||||
|
||||
void cli_printf(Cli* cli, char* format, ...);
|
Loading…
Reference in New Issue