added limit to maximum value of button

added basic LED support
This commit is contained in:
Maksym 2024-12-08 19:10:39 +01:00
parent e27bc0d3e0
commit f1629b7327
2 changed files with 36 additions and 7 deletions

View File

@ -13,4 +13,5 @@ platform = raspberrypi
board = adafruit_kb2040 board = adafruit_kb2040
framework = arduino framework = arduino
upload_protocol = picotool upload_protocol = picotool
monitor_speed = 115200 monitor_speed = 115200
lib_deps = fastled/FastLED@^3.9.4

View File

@ -2,10 +2,14 @@
#include <pico.h> #include <pico.h>
#include <hardware/pwm.h> #include <hardware/pwm.h>
#include <Keyboard.h> #include <Keyboard.h>
#include <FastLED.h>
#define PORT 2 #define PORT 2
#define PORT2 3 #define PORT2 3
#define THRESHOLD 10 #define THRESHOLD 10
#define LEDPORT 5
CRGB leds[2];
class HallButton class HallButton
{ {
@ -15,14 +19,18 @@ public:
uint64_t firstPulseLength[3]; // value of button uint64_t firstPulseLength[3]; // value of button
int64_t value; int64_t value;
uint64_t _median; uint64_t _median;
int64_t maxValue;
bool isFirstClick = true;
bool isDataReadyToRead = false; bool isDataReadyToRead = false;
bool isButtonPressed = false; bool isButtonPressed = false;
uint64_t nextTogglePoint = 0; // value when to toggle state of button uint64_t nextTogglePoint = 0; // value when to toggle state of button
size_t ledId;
HallButton(uint8_t gpioNum, char buttonOnKeyboard) HallButton(uint8_t gpioNum, char buttonOnKeyboard, size_t ledId)
{ {
this->gpioNum = gpioNum; this->gpioNum = gpioNum;
this->buttonOnKeyboard = buttonOnKeyboard; this->buttonOnKeyboard = buttonOnKeyboard;
this->ledId = ledId;
} }
void HandleISR(bool gpioState, uint64_t currentTime) void HandleISR(bool gpioState, uint64_t currentTime)
@ -45,13 +53,19 @@ public:
return; return;
_median = median(firstPulseLength[0], firstPulseLength[1], firstPulseLength[2]); _median = median(firstPulseLength[0], firstPulseLength[1], firstPulseLength[2]);
value = filtered((float)_median); value = filtered((float)_median);
if (nextTogglePoint == 0) if (value > maxValue)
nextTogglePoint = value + THRESHOLD; if (isFirstClick)
maxValue = value;
else
value = maxValue;
if (isButtonPressed) if (isButtonPressed)
{ {
if (value < nextTogglePoint) if (value < nextTogglePoint)
{ {
Release(); Release();
if (isFirstClick)
isFirstClick = false;
} }
if ((int64_t)value - (int64_t)nextTogglePoint > THRESHOLD) if ((int64_t)value - (int64_t)nextTogglePoint > THRESHOLD)
nextTogglePoint = value - THRESHOLD; nextTogglePoint = value - THRESHOLD;
@ -94,6 +108,7 @@ private:
return; return;
Keyboard.press(buttonOnKeyboard); Keyboard.press(buttonOnKeyboard);
isButtonPressed = true; isButtonPressed = true;
LEDTick(isButtonPressed, ledId);
} }
void Release() void Release()
{ {
@ -101,10 +116,16 @@ private:
return; return;
Keyboard.release(buttonOnKeyboard); Keyboard.release(buttonOnKeyboard);
isButtonPressed = false; isButtonPressed = false;
LEDTick(isButtonPressed, ledId);
}
static void LEDTick(bool status, size_t ledId)
{
leds[ledId] = status ? CRGB::Red : CRGB::Black;
FastLED.show();
} }
}; };
HallButton btn[2] = {HallButton(PORT, 't'), HallButton(PORT2, 'y')}; HallButton btn[2] = {HallButton(PORT, 't', 1), HallButton(PORT2, 'y', 0)};
void isr(uint gpio, uint32_t events) void isr(uint gpio, uint32_t events)
{ {
@ -133,12 +154,19 @@ void setup()
gpio_set_irq_enabled_with_callback(PORT2, GPIO_IRQ_EDGE_RISE | GPIO_IRQ_EDGE_FALL, true, isr); gpio_set_irq_enabled_with_callback(PORT2, GPIO_IRQ_EDGE_RISE | GPIO_IRQ_EDGE_FALL, true, isr);
// Serial.begin(9600); // Serial.begin(9600);
Keyboard.begin(); Keyboard.begin();
FastLED.addLeds<NEOPIXEL, LEDPORT>(leds, 2);
} }
void printDebugInfo() void printDebugInfo()
{ {
Serial.printf("%llu,%llu,%llu,%llu,%i,", btn[0].firstPulseLength[btn[0].counter], btn[0]._median, btn[0].value, btn[0].nextTogglePoint, btn[0].isButtonPressed); static uint32_t lastTime = 0;
Serial.printf("%llu,%llu,%llu,%llu,%i\n", btn[1].firstPulseLength[btn[1].counter], btn[1]._median, btn[1].value, btn[1].nextTogglePoint, btn[1].isButtonPressed); uint32_t time = millis();
if (time - lastTime >= 1)
{
Serial.printf("%d,%d,%llu,%llu,%i,", btn[0].isFirstClick, btn[0].maxValue, btn[0].value, btn[0].nextTogglePoint, btn[0].isButtonPressed);
Serial.printf("%d,%d,%llu,%llu,%i\n", btn[1].isFirstClick, btn[1].maxValue, btn[1].value, btn[1].nextTogglePoint, btn[1].isButtonPressed);
lastTime = time;
}
} }
void loop() void loop()
{ {