61 lines
		
	
	
		
			No EOL
		
	
	
		
			2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
		
			No EOL
		
	
	
		
			2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include "keys.hpp"
 | |
| 
 | |
| Keys::Keys() {
 | |
|   static constexpr auto MaxQueueableKeyPresses = 5;
 | |
|   mKeyPressQueueHandle = xQueueCreate(MaxQueueableKeyPresses, sizeof(KeyEvent));
 | |
|   xTaskCreate(KeyGrabberTask, "KeyGrabber", 1024, this, 1, &mKeyGrabbingTask);
 | |
|   xTaskCreate(KeyProccessor, "KeyProccessor", 4096, this, 1, &mKeyHandlingTask);
 | |
| }
 | |
| 
 | |
| void Keys::KeyGrabberTask(void *aSelf) {
 | |
|   auto self = reinterpret_cast<Keys *>(aSelf);
 | |
|   while (true) {
 | |
|     self->GrabKeys();
 | |
|     vTaskDelay(5 / portTICK_PERIOD_MS); // 5 ms between key grabs
 | |
|   }
 | |
| }
 | |
| void Keys::KeyProccessor(void *aSelf) {
 | |
|   auto self = reinterpret_cast<Keys *>(aSelf);
 | |
|   while (true) {
 | |
|     self->HandleKeyPresses();
 | |
|     vTaskDelay(50 / portTICK_PERIOD_MS);
 | |
|   }
 | |
| }
 | |
| 
 | |
| void Keys::HandleKeyPresses() {
 | |
|   KeyPressAbstract::KeyEvent eventToHandle;
 | |
|   while (xQueueReceive(mKeyPressQueueHandle, &eventToHandle, 0) == pdTRUE) {
 | |
|     if (mKeyEventHandler) {
 | |
|       mKeyEventHandler(eventToHandle);
 | |
|     }
 | |
|   }
 | |
| };
 | |
| 
 | |
| void Keys::QueueKeyEvent(KeyEvent aJustOccuredKeyEvent) {
 | |
|   BaseType_t higherPriorityTaskAwoke;
 | |
|   xQueueSendFromISR(mKeyPressQueueHandle, &aJustOccuredKeyEvent,
 | |
|                     &higherPriorityTaskAwoke);
 | |
| };
 | |
| 
 | |
| void Keys::GrabKeys() {
 | |
|   if (!customKeypad.getKeys()) {
 | |
|     return; // no activity return early.
 | |
|   }
 | |
|   for (int i = 0; i < LIST_MAX; i++) {
 | |
|     if (customKeypad.key[i].kstate == PRESSED ||
 | |
|         customKeypad.key[i].kstate == RELEASED) {
 | |
|       // May need to think about resetting sleep timer in key handler....
 | |
|       //   standbyTimer =
 | |
|       //       sleepTimeout; // Reset the sleep timer when a button is
 | |
|       //       pressed
 | |
|       auto eventType = customKeypad.key[i].kstate == PRESSED
 | |
|                            ? KeyEvent::Type::Press
 | |
|                            : KeyEvent::Type::Release;
 | |
|       const auto keyChar = customKeypad.key[i].kchar;
 | |
|       auto stateChange = customKeypad.key[i].stateChanged;
 | |
|       if (charKeyToKeyIds.count(keyChar) > 0 && stateChange) {
 | |
|         QueueKeyEvent(KeyEvent(charKeyToKeyIds.at(keyChar), eventType));
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| } |