diff --git a/main/main.c b/main/main.c index fab1697..71fba20 100644 --- a/main/main.c +++ b/main/main.c @@ -15,11 +15,16 @@ #include "driver/spi_master.h" #include "esp_system.h" #include "esp_log.h" +#include "esp_console.h" +#include "esp_vfs_dev.h" #include "nvs_flash.h" #include "esp_http_client.h" +#include "driver/uart.h" #include "driver/mcpwm.h" #include "soc/mcpwm_reg.h" #include "soc/mcpwm_struct.h" +#include "linenoise/linenoise.h" +#include "argtable3/argtable3.h" #include "esp32-wifi-manager.h" @@ -28,10 +33,19 @@ #define BASE_URL "http://192.168.0.1/" #define CMD_BEEP "cmd=audio resplay 0 1 3\n" +#define CONFIG_SERVO_ENABLE (0) +#define CONFIG_SHOOT_DELAY_MS (30000) + static uint8_t id; EventGroupHandle_t wm_event_group; +static struct { + struct arg_int *value; // how fast it will move in uS + struct arg_int *duration; // for how long it will move + struct arg_end *end; +} servo_args; + esp_err_t _http_event_handle(esp_http_client_event_t *evt) { //ESP_LOGI(TAG, "Returning request for %s", (char*)evt->user_data); @@ -84,6 +98,8 @@ void ping() { } void shoot() { + ESP_LOGI(TAG, "shooting"); + esp_http_client_config_t config = { .url = "http://192.168.0.1/v1/camera/shoot", .method = HTTP_METHOD_POST, @@ -126,20 +142,24 @@ void loop() { xEventGroupWaitBits(wm_event_group, WIFI_CONNECTED, false, true, portMAX_DELAY); ping(); + vTaskDelay(1000 / portTICK_PERIOD_MS); + while(true) { shoot(); - vTaskDelay(3000 / portTICK_PERIOD_MS); + if(CONFIG_SERVO_ENABLE) { + vTaskDelay(3000 / portTICK_PERIOD_MS); - mcpwm_set_duty_in_us(MCPWM_UNIT_0, MCPWM_TIMER_0, MCPWM_OPR_A, 1200); - vTaskDelay(100 / portTICK_PERIOD_MS); - mcpwm_set_duty_in_us(MCPWM_UNIT_0, MCPWM_TIMER_0, MCPWM_OPR_A, 1500); + mcpwm_set_duty_in_us(MCPWM_UNIT_0, MCPWM_TIMER_0, MCPWM_OPR_A, 1200); + vTaskDelay(200 / portTICK_PERIOD_MS); + mcpwm_set_duty_in_us(MCPWM_UNIT_0, MCPWM_TIMER_0, MCPWM_OPR_A, 1500); + } - vTaskDelay(5000 / portTICK_PERIOD_MS); + vTaskDelay(CONFIG_SHOOT_DELAY_MS / portTICK_PERIOD_MS); } } -void servo() { +void pwm_init() { mcpwm_gpio_init(MCPWM_UNIT_0, MCPWM0A, 21); mcpwm_config_t pwm_config; @@ -149,12 +169,107 @@ void servo() { pwm_config.counter_mode = MCPWM_UP_COUNTER; pwm_config.duty_mode = MCPWM_DUTY_MODE_0; mcpwm_init(MCPWM_UNIT_0, MCPWM_TIMER_0, &pwm_config); //Configure PWM0A & PWM0B with above settings +} + +void servo() { + ESP_LOGI(TAG, "value: %d duration: %d", servo_args.value->ival[0], servo_args.duration->ival[0]); while(true) { - vTaskDelay(1000 / portTICK_PERIOD_MS); + mcpwm_set_duty_in_us(MCPWM_UNIT_0, MCPWM_TIMER_0, MCPWM_OPR_A, servo_args.value->ival[0]); + vTaskDelay(servo_args.duration->ival[0] / portTICK_PERIOD_MS); + mcpwm_set_duty_in_us(MCPWM_UNIT_0, MCPWM_TIMER_0, MCPWM_OPR_A, 1500); + + vTaskDelay(5000 / portTICK_PERIOD_MS); } } +bool running = false; + +static int servo_start(int argc, char **argv) { + int nerrors = arg_parse(argc, argv, (void**) &servo_args); + if (nerrors != 0) { + arg_print_errors(stderr, servo_args.end, argv[0]); + return 1; + } + + if(!running) { + running = true; + xTaskCreate(&servo, "servo", 4096, NULL, 6, NULL); + } + + return ESP_OK; +} + +void register_servo_cmd() { + servo_args.value = arg_int0("v", "value", "", "move value in us"); + servo_args.value->ival[0] = 1200; + + servo_args.duration = arg_int0("d", "duration", "", "duration in ms"); + + servo_args.end = arg_end(2); + + const esp_console_cmd_t start_cmd = { + .command = "start", + .help = "Starts the servo", + .hint = NULL, + .func = &servo_start, + .argtable = &servo_args + }; + + ESP_ERROR_CHECK( esp_console_cmd_register(&start_cmd) ); +} + +static void initialize_console() { + /* Disable buffering on stdin and stdout */ + setvbuf(stdin, NULL, _IONBF, 0); + setvbuf(stdout, NULL, _IONBF, 0); + + /* Minicom, screen, idf_monitor send CR when ENTER key is pressed */ + esp_vfs_dev_uart_set_rx_line_endings(ESP_LINE_ENDINGS_CR); + /* Move the caret to the beginning of the next line on '\n' */ + esp_vfs_dev_uart_set_tx_line_endings(ESP_LINE_ENDINGS_CRLF); + + /* Configure UART. Note that REF_TICK is used so that the baud rate remains + * correct while APB frequency is changing in light sleep mode. + */ + const uart_config_t uart_config = { + .baud_rate = CONFIG_CONSOLE_UART_BAUDRATE, + .data_bits = UART_DATA_8_BITS, + .parity = UART_PARITY_DISABLE, + .stop_bits = UART_STOP_BITS_1, + .use_ref_tick = true + }; + ESP_ERROR_CHECK( uart_param_config(CONFIG_CONSOLE_UART_NUM, &uart_config) ); + + /* Install UART driver for interrupt-driven reads and writes */ + ESP_ERROR_CHECK( uart_driver_install(CONFIG_CONSOLE_UART_NUM, + 256, 0, 0, NULL, 0) ); + + /* Tell VFS to use UART driver */ + esp_vfs_dev_uart_use_driver(CONFIG_CONSOLE_UART_NUM); + + /* Initialize the console */ + esp_console_config_t console_config = { + .max_cmdline_args = 8, + .max_cmdline_length = 256, + .hint_color = atoi(LOG_COLOR_CYAN) + }; + ESP_ERROR_CHECK( esp_console_init(&console_config) ); + + /* Configure linenoise line completion library */ + /* Enable multiline editing. If not set, long commands will scroll within + * single line. + */ + linenoiseSetMultiLine(1); + + /* Tell linenoise where to get command completions and hints */ + linenoiseSetCompletionCallback(&esp_console_get_completion); + linenoiseSetHintsCallback((linenoiseHintsCallback*) &esp_console_get_hint); + + /* Set command history size */ + linenoiseHistorySetMaxLen(100); +} + void app_main() { esp_err_t ret; @@ -185,6 +300,37 @@ void app_main() { } } - xTaskCreate(&loop, "loop", 2048, NULL, 6, NULL); - xTaskCreate(&servo, "servo", 2048, NULL, 6, NULL); + //initialize_console(); + //esp_console_register_help_command(); + //register_servo_cmd(); + + pwm_init(); + + xTaskCreate(&loop, "loop", 4096, NULL, 6, NULL); + + const char* prompt = LOG_COLOR_I "grii> " LOG_RESET_COLOR; + + return; + while(true) { + char* line = linenoise(prompt); + + if (line == NULL) { /* Ignore empty lines */ + continue; + } + + linenoiseHistoryAdd(line); + int ret; + esp_err_t err = esp_console_run(line, &ret); + if (err == ESP_ERR_NOT_FOUND) { + printf("Unrecognized command\n"); + } else if (err == ESP_ERR_INVALID_ARG) { + // command was empty + } else if (err == ESP_OK && ret != ESP_OK) { + printf("Command returned non-zero error code: 0x%x (%s)\n", ret, esp_err_to_name(err)); + } else if (err != ESP_OK) { + printf("Internal error: %s\n", esp_err_to_name(err)); + } + /* linenoise allocates line buffer on the heap, so need to free it */ + linenoiseFree(line); + } };