Added basic input driver
This commit is contained in:
		
							parent
							
								
									ad4568ee1f
								
							
						
					
					
						commit
						ed74ba9e96
					
				
							
								
								
									
										95
									
								
								Input.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								Input.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,95 @@ | ||||
| // Copyright (C) 2024, Mark Qvist
 | ||||
| 
 | ||||
| // This program is free software: you can redistribute it and/or modify
 | ||||
| // it under the terms of the GNU General Public License as published by
 | ||||
| // the Free Software Foundation, either version 3 of the License, or
 | ||||
| // (at your option) any later version.
 | ||||
| 
 | ||||
| // This program is distributed in the hope that it will be useful,
 | ||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | ||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 | ||||
| // GNU General Public License for more details.
 | ||||
| 
 | ||||
| // You should have received a copy of the GNU General Public License
 | ||||
| // along with this program.  If not, see <https://www.gnu.org/licenses/>.
 | ||||
| 
 | ||||
| #ifndef INPUT_H | ||||
|   #define INPUT_H | ||||
|    | ||||
|   #define PIN_BUTTON pin_btn_usr1 | ||||
| 
 | ||||
|   #define PRESSED LOW | ||||
|   #define RELEASED HIGH | ||||
| 
 | ||||
|   #define EVENT_ALL                 0x00 | ||||
|   #define EVENT_CLICKS              0x01 | ||||
|   #define EVENT_BUTTON_DOWN         0x11 | ||||
|   #define EVENT_BUTTON_UP           0x12 | ||||
|   #define EVENT_BUTTON_CLICK        0x13 | ||||
|   #define EVENT_BUTTON_DOUBLE_CLICK 0x14 | ||||
|   #define EVENT_BUTTON_TRIPLE_CLICK 0x15 | ||||
|    | ||||
|   int button_events = EVENT_CLICKS; | ||||
|   int button_state = RELEASED; | ||||
|   int debounce_state = button_state; | ||||
|   unsigned long button_debounce_last = 0; | ||||
|   unsigned long button_debounce_delay = 25; | ||||
|   unsigned long button_down_last = 0; | ||||
|   unsigned long button_up_last = 0; | ||||
| 
 | ||||
|   // Forward declaration
 | ||||
|   void button_event(uint8_t event, unsigned long duration); | ||||
| 
 | ||||
|   void input_init() { | ||||
|     pinMode(PIN_BUTTON, INPUT_PULLUP); | ||||
|   } | ||||
| 
 | ||||
|   void input_get_all_events() { | ||||
|     button_events = EVENT_ALL; | ||||
|   } | ||||
| 
 | ||||
|   void input_get_click_events() { | ||||
|     button_events = EVENT_CLICKS; | ||||
|   } | ||||
| 
 | ||||
|   void input_read() { | ||||
|     int button_reading = digitalRead(PIN_BUTTON); | ||||
|     if (button_reading != debounce_state) { | ||||
|       button_debounce_last = millis(); | ||||
|       debounce_state = button_reading; | ||||
|     } | ||||
| 
 | ||||
|     if ((millis() - button_debounce_last) > button_debounce_delay) { | ||||
|       if (button_reading != button_state) { | ||||
|         // State changed
 | ||||
|         int previous_state = button_state; | ||||
|         button_state = button_reading; | ||||
| 
 | ||||
|         if (button_events == EVENT_ALL) { | ||||
|           if (button_state == PRESSED) { | ||||
|             button_event(EVENT_BUTTON_DOWN, 0); | ||||
|           } else if (button_state == RELEASED) { | ||||
|             button_event(EVENT_BUTTON_UP, 0); | ||||
|           } | ||||
|         } else if (button_events == EVENT_CLICKS) { | ||||
|           if (previous_state == PRESSED && button_state == RELEASED) { | ||||
|             button_up_last = millis(); | ||||
|             button_event(EVENT_BUTTON_CLICK, button_up_last-button_down_last); | ||||
|           } else if (previous_state == RELEASED && button_state == PRESSED) { | ||||
|             button_down_last = millis(); | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
|   } | ||||
| 
 | ||||
|   bool button_pressed() { | ||||
|     if (button_state == PRESSED) { | ||||
|       return true; | ||||
|     } else { | ||||
|       return false; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
| #endif | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user