I wrote this a long time ago, while sick.
This commit is contained in:
parent
f39139f910
commit
7f28aa39f0
1 changed files with 155 additions and 9 deletions
164
main/main.c
164
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", "<int>", "move value in us");
|
||||
servo_args.value->ival[0] = 1200;
|
||||
|
||||
servo_args.duration = arg_int0("d", "duration", "<int>", "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);
|
||||
}
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue