it takes pictures, it uses timers, its great
This commit is contained in:
		
							parent
							
								
									8bc2fbc65e
								
							
						
					
					
						commit
						996a8b687f
					
				
					 1 changed files with 72 additions and 3 deletions
				
			
		
							
								
								
									
										75
									
								
								main/main.c
									
										
									
									
									
								
							
							
						
						
									
										75
									
								
								main/main.c
									
										
									
									
									
								
							|  | @ -11,8 +11,8 @@ | |||
| #include <math.h> | ||||
| #include "freertos/FreeRTOS.h" | ||||
| #include "freertos/task.h" | ||||
| #include "freertos/timers.h" | ||||
| #include "freertos/event_groups.h" | ||||
| #include "driver/spi_master.h" | ||||
| #include "esp_system.h" | ||||
| #include "esp_log.h" | ||||
| #include "esp_console.h" | ||||
|  | @ -25,20 +25,28 @@ | |||
| #include "soc/mcpwm_struct.h" | ||||
| #include "linenoise/linenoise.h" | ||||
| #include "argtable3/argtable3.h" | ||||
| #include "driver/gpio.h" | ||||
| 
 | ||||
| #include "esp32-wifi-manager.h" | ||||
| 
 | ||||
| #define TAG "CACO" | ||||
| 
 | ||||
| #define GPIO_INPUT_IO_0    33 | ||||
| #define GPIO_INPUT_PIN_SEL  ((1ULL<<GPIO_INPUT_IO_0)) | ||||
| #define ESP_INTR_FLAG_DEFAULT 0 | ||||
| 
 | ||||
| #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) | ||||
| #define CONFIG_TIMEOUT_SHOOT (100 / portTICK_PERIOD_MS) | ||||
| 
 | ||||
| static uint8_t id; | ||||
| 
 | ||||
| EventGroupHandle_t wm_event_group; | ||||
| static EventGroupHandle_t wm_event_group; | ||||
| static xQueueHandle gpio_evt_queue = NULL; | ||||
| static xTimerHandle button_timer; | ||||
| 
 | ||||
| static struct { | ||||
|   struct arg_int *value; // how fast it will move in uS
 | ||||
|  | @ -145,7 +153,7 @@ void loop() { | |||
|   vTaskDelay(1000 / portTICK_PERIOD_MS); | ||||
| 
 | ||||
|   while(true) { | ||||
|     shoot(); | ||||
|     //shoot();
 | ||||
| 
 | ||||
|     if(CONFIG_SERVO_ENABLE) { | ||||
|       vTaskDelay(3000 / portTICK_PERIOD_MS); | ||||
|  | @ -270,6 +278,63 @@ static void initialize_console() { | |||
|   linenoiseHistorySetMaxLen(100); | ||||
| } | ||||
| 
 | ||||
| static void IRAM_ATTR gpio_isr_handler(void* arg) | ||||
| { | ||||
|     uint32_t gpio_num = (uint32_t) arg; | ||||
|     xQueueSendFromISR(gpio_evt_queue, &gpio_num, NULL); | ||||
| } | ||||
| 
 | ||||
| void gpio_loop() { | ||||
|   int8_t state = -1; | ||||
|   uint32_t io_num; | ||||
| 
 | ||||
|   for(;;) { | ||||
|     if(xQueueReceive(gpio_evt_queue, &io_num, portMAX_DELAY)) { | ||||
|       uint8_t level = gpio_get_level(io_num); | ||||
|       printf("GPIO[%d] intr, val: %d\n", io_num, level); | ||||
| 
 | ||||
|       // don't act on state level twice
 | ||||
|       if(level == state) continue; | ||||
| 
 | ||||
|       // track level for duplicate
 | ||||
|       state = level; | ||||
| 
 | ||||
|       if(level == 0) { | ||||
|         xTimerChangePeriod(button_timer, CONFIG_TIMEOUT_SHOOT, portMAX_DELAY); | ||||
|         xTimerStart(button_timer, portMAX_DELAY); | ||||
|       } else { | ||||
|         xTimerStop(button_timer, portMAX_DELAY); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| void handle_button_timer() { | ||||
|   shoot(); | ||||
| } | ||||
| 
 | ||||
| void gpio_init() { | ||||
|   gpio_config_t io_conf; | ||||
| 
 | ||||
|   io_conf.intr_type = GPIO_PIN_INTR_ANYEDGE; | ||||
|   io_conf.mode = GPIO_MODE_INPUT; | ||||
|   io_conf.pin_bit_mask = GPIO_INPUT_PIN_SEL; | ||||
|   io_conf.pull_down_en = 0; | ||||
|   io_conf.pull_up_en = 1; | ||||
|   gpio_config(&io_conf); | ||||
| 
 | ||||
|   gpio_install_isr_service(ESP_INTR_FLAG_DEFAULT); | ||||
|   gpio_isr_handler_add(GPIO_INPUT_IO_0, gpio_isr_handler, (void*) GPIO_INPUT_IO_0); | ||||
| 
 | ||||
|   //create a queue to handle gpio event from isr
 | ||||
|   gpio_evt_queue = xQueueCreate(10, sizeof(uint32_t)); | ||||
|   //start gpio task
 | ||||
| 
 | ||||
|   button_timer = xTimerCreate("gpio_timer", 1000, pdFALSE, (void*)NULL, handle_button_timer); | ||||
| 
 | ||||
|   xTaskCreate(gpio_loop, "gpio_loop", 2048, NULL, 10, NULL); | ||||
| } | ||||
| 
 | ||||
| void app_main() { | ||||
|   esp_err_t ret; | ||||
| 
 | ||||
|  | @ -300,6 +365,8 @@ void app_main() { | |||
|     } | ||||
|   } | ||||
| 
 | ||||
|   wifi_manager_scan(); | ||||
| 
 | ||||
|   //initialize_console();
 | ||||
|   //esp_console_register_help_command();
 | ||||
|   //register_servo_cmd();
 | ||||
|  | @ -310,6 +377,8 @@ void app_main() { | |||
| 
 | ||||
|   const char* prompt = LOG_COLOR_I "grii> " LOG_RESET_COLOR; | ||||
| 
 | ||||
|   gpio_init(); | ||||
| 
 | ||||
|   return; | ||||
|   while(true) { | ||||
|     char* line = linenoise(prompt); | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue