diff --git a/lib/obp60task/OBP60Extensions.cpp b/lib/obp60task/OBP60Extensions.cpp index 8baefe6..4ac5dd0 100644 --- a/lib/obp60task/OBP60Extensions.cpp +++ b/lib/obp60task/OBP60Extensions.cpp @@ -81,7 +81,7 @@ void hardwareInit(GwApi *api) Wire.begin(); // Init PCF8574 digital outputs - Wire.setClock(I2C_SPEED); // Set I2C clock on 10 kHz + Wire.setClock(I2C_SPEED); // Set I2C clock as defined if(pcf8574_Out.begin()){ // Initialize PCF8574 pcf8574_Out.write8(255); // Clear all outputs } diff --git a/lib/obp60task/OBP60Keypad.h b/lib/obp60task/OBPKeyboardTask.cpp similarity index 75% rename from lib/obp60task/OBP60Keypad.h rename to lib/obp60task/OBPKeyboardTask.cpp index eafe3a2..7e8b93f 100644 --- a/lib/obp60task/OBP60Keypad.h +++ b/lib/obp60task/OBPKeyboardTask.cpp @@ -1,9 +1,9 @@ -#ifndef _OBP60FUNCTIONS_H -#define _OBP60FUNCTIONS_H - +// SPDX-License-Identifier: GPL-2.0-or-later +#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3 #include #include "OBP60Hardware.h" - +#include "OBPKeyboardTask.h" + // Global vars // Touch keypad over ESP32 touch sensor inputs @@ -58,10 +58,10 @@ void initKeys(CommonData &commonData) { commonData.keydata[5].h = height; } - #ifdef HARDWARE_V21 - // Keypad functions for original OBP60 hardware - int readKeypad(GwLog* logger, uint thSensitivity, bool use_syspage) { - +#ifdef HARDWARE_V21 +// Keypad functions for original OBP60 hardware +int readKeypad(GwLog* logger, uint thSensitivity, bool use_syspage) { + // Touch sensor values // 35000 - Not touched // 50000 - Light toched with fingertip @@ -233,35 +233,35 @@ void initKeys(CommonData &commonData) { keycodeold2 = keycode2; return keystatus; - } - #endif +} +#endif - #ifdef BOARD_OBP40S3 - int readSensorpads(){ - // Read key code - if(digitalRead(UP) == LOW){ +#ifdef BOARD_OBP40S3 +int readSensorpads(){ + // Read key code + if (digitalRead(UP) == LOW) { keycode = 10; // Left swipe - } - else if(digitalRead(DOWN) == LOW){ - keycode = 9; // Right swipe - } - else if(digitalRead(CONF) == LOW){ - keycode = 3; // Key 3 - } - else if(digitalRead(MENUE) == LOW){ - keycode = 1; // Key 1 - } - else if(digitalRead(EXIT) == LOW){ - keycode = 2; // Key 2 - } - else{ - keycode = 0; // No key activ - } - return keycode; } + else if (digitalRead(DOWN) == LOW) { + keycode = 9; // Right swipe + } + else if (digitalRead(CONF) == LOW) { + keycode = 3; // Key 3 + } + else if (digitalRead(MENUE) == LOW) { + keycode = 1; // Key 1 + } + else if (digitalRead(EXIT) == LOW) { + keycode = 2; // Key 2 + } + else { + keycode = 0; // No key activ + } + return keycode; +} - // Keypad functions for OBP60 clone (thSensitivity is inactiv) - int readKeypad(GwLog* logger, uint thSensitivity, bool use_syspage) { +// Keypad functions for OBP60 clone (thSensitivity is inactiv) +int readKeypad(GwLog* logger, uint thSensitivity, bool use_syspage) { pinMode(UP, INPUT); pinMode(DOWN, INPUT); pinMode(CONF, INPUT); @@ -273,31 +273,64 @@ void initKeys(CommonData &commonData) { // Detect key if (keycode > 0 ){ - if(keycode != keycodeold){ - starttime = millis(); // Start key pressed - keycodeold = keycode; - } - // If key pressed longer than 100ms - if(millis() > starttime + 100 && keycode == keycodeold) { - if (use_syspage and keycode == 3) { - keystatus = 12; - } else { - keystatus = keycode; + if(keycode != keycodeold){ + starttime = millis(); // Start key pressed + keycodeold = keycode; + } + // If key pressed longer than 100ms + if(millis() > starttime + 100 && keycode == keycodeold) { + if (use_syspage and keycode == 3) { + keystatus = 12; + } else { + keystatus = keycode; + } + // Copy keycode + keycodeold = keycode; + // 100% Task-CPU RLY? + while(readSensorpads() > 0){} // Wait for pad release + delay(keydelay); } - // Copy keycode - keycodeold = keycode; - while(readSensorpads() > 0){} // Wait for pad release - delay(keydelay); - } } - else{ - keycode = 0; - keycodeold = 0; - keystatus = 0; + else { + keycode = 0; + keycodeold = 0; + keystatus = 0; } return keystatus; - } - #endif +} +#endif + +void keyboardTask(void *param) { + + // params needed: + // queue + // logger + // sensitivity + // use_syspage for deep sleep activation + + KbTaskData *data = (KbTaskData *)param; + + int keycode = 0; + data->logger->logDebug(GwLog::LOG, "Start keyboard task"); + + while (true) { + keycode = readKeypad(data->logger, data->sensitivity, data->use_syspage); + //send a key event + if (keycode != 0) { + xQueueSend(data->queue, &keycode, 0); + data->logger->logDebug(GwLog::LOG,"kbtask: send keycode: %d", keycode); + } + delay(20); // 50Hz update rate (20ms) + } + vTaskDelete(NULL); +} + +void createKeyboardTask(KbTaskData *param) { + TaskHandle_t xHandle = NULL; + if (xTaskCreate(keyboardTask, "keyboard", configMINIMAL_STACK_SIZE + 1024, param, configMAX_PRIORITIES-1, &xHandle) != pdPASS) { + param->logger->logDebug(GwLog::ERROR, "Failed to create keyboard task!"); + }; +} #endif diff --git a/lib/obp60task/OBPKeyboardTask.h b/lib/obp60task/OBPKeyboardTask.h new file mode 100644 index 0000000..8cfa957 --- /dev/null +++ b/lib/obp60task/OBPKeyboardTask.h @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once +#include "GwLog.h" +#include "Pagedata.h" + +typedef struct { + QueueHandle_t queue; + GwLog* logger = nullptr; + uint sensitivity = 100; +#ifdef BOARD_OBP40S3 + bool use_syspage = true; +#endif +} KbTaskData; + +void initKeys(CommonData &commonData); +void createKeyboardTask(KbTaskData *param); diff --git a/lib/obp60task/obp60task.cpp b/lib/obp60task/obp60task.cpp index 2f6fc86..fb6c5cb 100644 --- a/lib/obp60task/obp60task.cpp +++ b/lib/obp60task/obp60task.cpp @@ -13,10 +13,12 @@ #include #include // GxEPD2 lib for b/w E-Ink displays #include "OBP60Extensions.h" // Functions lib for extension board -#include "OBP60Keypad.h" // Functions for keypad +#include "OBPKeyboardTask.h" // Functions lib for keyboard handling #include "BoatDataCalibration.h" // Functions lib for data instance calibration #include "OBPRingBuffer.h" // Functions lib with ring buffer for history storage of some boat data #include "OBPDataOperations.h" // Functions lib for data operations such as true wind calculation +#include "OBP60QRWiFi.h" // Functions lib for WiFi QR code +#include "OBPSensorTask.h" // Functions lib for sensor data #ifdef BOARD_OBP40S3 #include "driver/rtc_io.h" // Needs for weakup from deep sleep @@ -26,8 +28,6 @@ // Pictures #include "images/OBP_400x300.xbm" // OBP Logo #include "images/unknown.xbm" // unknown page indicator -#include "OBP60QRWiFi.h" // Functions lib for WiFi QR code -#include "OBPSensorTask.h" // Functions lib for sensor data // Global vars bool initComplete = false; // Initialization complete @@ -119,35 +119,6 @@ void OBP60Init(GwApi *api){ } -typedef struct { - int page0 = 0; - QueueHandle_t queue; - GwLog* logger = nullptr; -// GwApi* api = NULL; - uint sensitivity = 100; - bool use_syspage = true; -} MyData; - -// Keyboard Task -void keyboardTask(void *param){ - MyData *data=(MyData *)param; - - int keycode = 0; - data->logger->logDebug(GwLog::LOG,"Start keyboard task"); - - // Loop for keyboard task - while (true){ - keycode = readKeypad(data->logger, data->sensitivity, data->use_syspage); - //send a key event - if(keycode != 0){ - xQueueSend(data->queue, &keycode, 0); - data->logger->logDebug(GwLog::LOG,"Send keycode: %d", keycode); - } - delay(20); // 50Hz update rate (20ms) - } - vTaskDelete(NULL); -} - class BoatValueList{ public: static const int MAXVALUES=100; @@ -718,18 +689,18 @@ void OBP60Task(GwApi *api){ doImageRequest(api, &pageNumber, pages, request); }); - //now we have prepared the page data - //we start a separate task that will fetch our keys... - MyData allParameters; - allParameters.logger=api->getLogger(); - allParameters.page0=3; - allParameters.queue=xQueueCreate(10,sizeof(int)); - allParameters.sensitivity= api->getConfig()->getInt(GwConfigDefinitions::tSensitivity); + // now we have prepared the page data + // we start a separate task that will fetch our keys... + KbTaskData kbparams; + kbparams.logger = api->getLogger(); + kbparams.queue = xQueueCreate(10, sizeof(int)); + kbparams.sensitivity = api->getConfig()->getInt(GwConfigDefinitions::tSensitivity); #ifdef BOARD_OBP40S3 - allParameters.use_syspage = syspage_enabled; + kbparams.use_syspage = syspage_enabled; #endif - xTaskCreate(keyboardTask,"keyboard",2000,&allParameters,configMAX_PRIORITIES-1,NULL); - SharedData *shared=new SharedData(api); + createKeyboardTask(&kbparams); + // we start a separate task to collect sensor data + SharedData *shared = new SharedData(api); createSensorTask(shared); // Task Loop @@ -836,7 +807,7 @@ void OBP60Task(GwApi *api){ // Check the keyboard message int keyboardMessage=0; - while (xQueueReceive(allParameters.queue,&keyboardMessage,0)){ + while (xQueueReceive(kbparams.queue,&keyboardMessage, 0)) { LOG_DEBUG(GwLog::LOG,"new key from keyboard %d",keyboardMessage); keypressed = true;