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 "driver/spi_master.h" | ||||||
| #include "esp_system.h" | #include "esp_system.h" | ||||||
| #include "esp_log.h" | #include "esp_log.h" | ||||||
|  | #include "esp_console.h" | ||||||
|  | #include "esp_vfs_dev.h" | ||||||
| #include "nvs_flash.h" | #include "nvs_flash.h" | ||||||
| #include "esp_http_client.h" | #include "esp_http_client.h" | ||||||
|  | #include "driver/uart.h" | ||||||
| #include "driver/mcpwm.h" | #include "driver/mcpwm.h" | ||||||
| #include "soc/mcpwm_reg.h" | #include "soc/mcpwm_reg.h" | ||||||
| #include "soc/mcpwm_struct.h" | #include "soc/mcpwm_struct.h" | ||||||
|  | #include "linenoise/linenoise.h" | ||||||
|  | #include "argtable3/argtable3.h" | ||||||
| 
 | 
 | ||||||
| #include "esp32-wifi-manager.h" | #include "esp32-wifi-manager.h" | ||||||
| 
 | 
 | ||||||
|  | @ -28,10 +33,19 @@ | ||||||
| #define BASE_URL "http://192.168.0.1/"
 | #define BASE_URL "http://192.168.0.1/"
 | ||||||
| #define CMD_BEEP "cmd=audio resplay 0 1 3\n" | #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; | static uint8_t id; | ||||||
| 
 | 
 | ||||||
| EventGroupHandle_t wm_event_group; | 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_err_t _http_event_handle(esp_http_client_event_t *evt) { | ||||||
|   //ESP_LOGI(TAG, "Returning request for %s", (char*)evt->user_data);
 |   //ESP_LOGI(TAG, "Returning request for %s", (char*)evt->user_data);
 | ||||||
| 
 | 
 | ||||||
|  | @ -84,6 +98,8 @@ void ping() { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void shoot() { | void shoot() { | ||||||
|  |   ESP_LOGI(TAG, "shooting"); | ||||||
|  | 
 | ||||||
|   esp_http_client_config_t config = { |   esp_http_client_config_t config = { | ||||||
|     .url = "http://192.168.0.1/v1/camera/shoot", |     .url = "http://192.168.0.1/v1/camera/shoot", | ||||||
|     .method = HTTP_METHOD_POST, |     .method = HTTP_METHOD_POST, | ||||||
|  | @ -126,20 +142,24 @@ void loop() { | ||||||
|   xEventGroupWaitBits(wm_event_group, WIFI_CONNECTED, false, true, portMAX_DELAY); |   xEventGroupWaitBits(wm_event_group, WIFI_CONNECTED, false, true, portMAX_DELAY); | ||||||
|   ping(); |   ping(); | ||||||
| 
 | 
 | ||||||
|  |   vTaskDelay(1000 / portTICK_PERIOD_MS); | ||||||
|  | 
 | ||||||
|   while(true) { |   while(true) { | ||||||
|     shoot(); |     shoot(); | ||||||
| 
 | 
 | ||||||
|  |     if(CONFIG_SERVO_ENABLE) { | ||||||
|       vTaskDelay(3000 / portTICK_PERIOD_MS); |       vTaskDelay(3000 / portTICK_PERIOD_MS); | ||||||
| 
 | 
 | ||||||
|       mcpwm_set_duty_in_us(MCPWM_UNIT_0, MCPWM_TIMER_0, MCPWM_OPR_A, 1200); |       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); |       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_gpio_init(MCPWM_UNIT_0, MCPWM0A, 21); | ||||||
| 
 | 
 | ||||||
|   mcpwm_config_t pwm_config; |   mcpwm_config_t pwm_config; | ||||||
|  | @ -149,12 +169,107 @@ void servo() { | ||||||
|   pwm_config.counter_mode = MCPWM_UP_COUNTER; |   pwm_config.counter_mode = MCPWM_UP_COUNTER; | ||||||
|   pwm_config.duty_mode = MCPWM_DUTY_MODE_0; |   pwm_config.duty_mode = MCPWM_DUTY_MODE_0; | ||||||
|   mcpwm_init(MCPWM_UNIT_0, MCPWM_TIMER_0, &pwm_config); //Configure PWM0A & PWM0B with above settings
 |   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) { |   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() { | void app_main() { | ||||||
|   esp_err_t ret; |   esp_err_t ret; | ||||||
| 
 | 
 | ||||||
|  | @ -185,6 +300,37 @@ void app_main() { | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   xTaskCreate(&loop, "loop",  2048, NULL, 6, NULL); |   //initialize_console();
 | ||||||
|   xTaskCreate(&servo, "servo",  2048, NULL, 6, NULL); |   //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