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
				
			
		
							
								
								
									
										158
									
								
								main/main.c
									
										
									
									
									
								
							
							
						
						
									
										158
									
								
								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(); | ||||
| 
 | ||||
|     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); | ||||
|       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…
	
	Add table
		
		Reference in a new issue