CLI: gpio_set

This commit is contained in:
DrZlo13 2021-12-01 23:01:52 +10:00
parent 8d88c07dec
commit c2d2e5ef96
9 changed files with 326 additions and 2 deletions

View File

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

View File

@ -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);

View File

@ -13,6 +13,8 @@ set(SOURCES
"cli.c"
"cli-uart.c"
"cli-commands.c"
"cli-command-gpio.c"
"cli-args.c"
)
set(INCLUDES

62
main/cli-args.c Normal file
View File

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

60
main/cli-args.h Normal file
View File

@ -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);

128
main/cli-command-gpio.c Normal file
View File

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

View File

@ -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");
}

View File

@ -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);

View File

@ -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, ...);