int get_keyevent(bool* key) { struct KeyState { bool* ptr; unsigned long pressStart; bool active; bool reportedShort; bool reportedLong; }; static KeyState states[10]; static int count = 0; const unsigned long tMin = 50; // ms const unsigned long tGap = 1000; // ms unsigned long now = millis(); // Lookup or register int index = -1; for (int i = 0; i < count; ++i) { if (states[i].ptr == key) { index = i; break; } } if (index == -1 && count < 10) { states[count] = { key, 0, false, false, false }; index = count++; } if (index == -1) return 0; KeyState& s = states[index]; // Rising edge: start tracking if (*key && !s.active) { s.active = true; s.pressStart = now; s.reportedShort = false; s.reportedLong = false; } // If still held if (*key && s.active) { unsigned long tHeld = now - s.pressStart; if (tHeld >= tMin && tHeld < tGap && !s.reportedShort) { s.reportedShort = true; return 1; // short press } if (tHeld >= tGap && !s.reportedLong) { s.reportedLong = true; return 2; // long press } } // Reset after release if (!*key && s.active) { s.active = false; } return 0; } // usage void loop() { int event = get_keyevent(&softKey); if (event == 1) { // short press } else if (event == 2) { // long press } }