* Add Lilygo T-Impulse-Plus * Enable small screen layout 64x32 * trunk'd * Haptic Feedback (short and long press) * enable Charging Indicator * enable nrfutil uploads * trunk fmt * Add Lilygo T-Impulse-Plus * Enable small screen layout 64x32 * trunk'd * Haptic Feedback (short and long press) * enable Charging Indicator * enable nrfutil uploads * trunk fmt * enable proper device model * Dim the haptic duration a bit. * Fix GPS pins and speed. Module enable is active low, speed is 38400 * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * set correct geometry. * Add custom_meshtastic_* metadata to t-impulse-plus platformio.ini --------- Co-authored-by: Thomas Göttgens <tgoettgens@gmail.com> Co-authored-by: Ben Meadors <benmmeadors@gmail.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
98 lines
2.3 KiB
C++
98 lines
2.3 KiB
C++
#include "HapticFeedback.h"
|
|
|
|
#ifdef HAPTIC_FEEDBACK_PIN
|
|
|
|
#include <Arduino.h>
|
|
|
|
#ifdef HAPTIC_FEEDBACK_ACTIVE_LOW
|
|
#define HAPTIC_FEEDBACK_ON_STATE LOW
|
|
#define HAPTIC_FEEDBACK_OFF_STATE HIGH
|
|
#else
|
|
#define HAPTIC_FEEDBACK_ON_STATE HIGH
|
|
#define HAPTIC_FEEDBACK_OFF_STATE LOW
|
|
#endif
|
|
|
|
HapticFeedback *hapticFeedback = nullptr;
|
|
|
|
void initHapticFeedback()
|
|
{
|
|
if (!hapticFeedback)
|
|
hapticFeedback = new HapticFeedback();
|
|
}
|
|
|
|
HapticFeedback::HapticFeedback() : concurrency::OSThread("Haptic")
|
|
{
|
|
pinMode(HAPTIC_FEEDBACK_PIN, OUTPUT);
|
|
digitalWrite(HAPTIC_FEEDBACK_PIN, HAPTIC_FEEDBACK_OFF_STATE);
|
|
}
|
|
|
|
void HapticFeedback::motorWrite(bool on)
|
|
{
|
|
digitalWrite(HAPTIC_FEEDBACK_PIN, on ? HAPTIC_FEEDBACK_ON_STATE : HAPTIC_FEEDBACK_OFF_STATE);
|
|
}
|
|
|
|
void HapticFeedback::pulse(uint16_t durationMs)
|
|
{
|
|
motorWrite(true);
|
|
pulseOffAt = millis() + durationMs;
|
|
if (pulseOffAt == 0) // 0 is the "no pulse" sentinel
|
|
pulseOffAt = 1;
|
|
scheduleNext();
|
|
}
|
|
|
|
void HapticFeedback::armDelayedPulse(uint16_t delayMs, uint16_t durationMs)
|
|
{
|
|
delayedPulseAt = millis() + delayMs;
|
|
if (delayedPulseAt == 0)
|
|
delayedPulseAt = 1;
|
|
delayedPulseDuration = durationMs;
|
|
scheduleNext();
|
|
}
|
|
|
|
void HapticFeedback::cancelDelayedPulse()
|
|
{
|
|
delayedPulseAt = 0;
|
|
}
|
|
|
|
void HapticFeedback::scheduleNext()
|
|
{
|
|
uint32_t now = millis();
|
|
uint32_t next = 0;
|
|
if (pulseOffAt != 0)
|
|
next = pulseOffAt;
|
|
if (delayedPulseAt != 0 && (next == 0 || (int32_t)(delayedPulseAt - next) < 0))
|
|
next = delayedPulseAt;
|
|
if (next == 0)
|
|
return;
|
|
int32_t delay = (int32_t)(next - now);
|
|
setIntervalFromNow(delay > 0 ? (unsigned long)delay : 0);
|
|
}
|
|
|
|
int32_t HapticFeedback::runOnce()
|
|
{
|
|
uint32_t now = millis();
|
|
|
|
if (pulseOffAt != 0 && (int32_t)(now - pulseOffAt) >= 0) {
|
|
motorWrite(false);
|
|
pulseOffAt = 0;
|
|
}
|
|
|
|
if (delayedPulseAt != 0 && (int32_t)(now - delayedPulseAt) >= 0) {
|
|
uint16_t dur = delayedPulseDuration;
|
|
delayedPulseAt = 0;
|
|
pulse(dur);
|
|
}
|
|
|
|
uint32_t next = 0;
|
|
if (pulseOffAt != 0)
|
|
next = pulseOffAt;
|
|
if (delayedPulseAt != 0 && (next == 0 || (int32_t)(delayedPulseAt - next) < 0))
|
|
next = delayedPulseAt;
|
|
if (next == 0)
|
|
return 60 * 1000;
|
|
int32_t delay = (int32_t)(next - now);
|
|
return delay > 0 ? delay : 0;
|
|
}
|
|
|
|
#endif // HAPTIC_FEEDBACK_PIN
|