This commit is contained in:
2024-09-04 04:01:15 +03:00
parent ff754d60a6
commit b962cbb419
11 changed files with 174 additions and 116 deletions

View File

@ -1,19 +1,16 @@
/*
* IR_CMD_Handler.c
*
* Created on: Aug 25, 2024
* Author: DashyFox
*/
#include "IR_CMD_Handler.h"
#include "IR.h"
#include "SimpleTimer.h"
#include "ShiftReg.h"
#include "Print.h"
#define IR_Timeout 137
#define ResetInputProgerss_Timeout 2500
#define InitialRepeatTime 100 // Начальный интервал времени между вызовами функции при удержании
#define MinRepeatTime 30 // Минимально допустимый интервал времени между вызовами функции при удержании
#define HoldTime 500 // Время, необходимое для определения удержания
#define RepeatDecay 10 // Шаг уменьшения времени между вызовами функции при удержании
#define NULL_NumberParam 0xFFFF
//extern unsigned char IR_Command;
@ -34,18 +31,27 @@ uint8_t inputDigit = 0; // left = 0 to right
uint16_t inputParam = NULL_NumberParam;
void IR_Home_Process();
uint32_t holdStartTime = 0; // Время начала удержания
uint32_t lastRepeatTime = 0; // Последнее время повторного вызова функции
uint32_t currentRepeatTime = InitialRepeatTime; // Текущее значение интервала между вызовами функции
void IR_Home_Process();
void IR_ParamEnter();
void IR_CMD_Clear();
void (*InputHandler)(void) = IR_Home_Process;
void NullFunc(){};
void (*onParamEnter)() = NullFunc;
void (*onHoldRepeat)() = NullFunc; // Указатель на функцию, вызываемую при удержании
void paramEnter(void(*onEnter_)()){
InputHandler = IR_ParamEnter;
onParamEnter = onEnter_;
}
// Установка функции для вызова при удержании
void setHoldRepeatHandler(void (*handler)()) {
onHoldRepeat = handler;
}
void IR_CMD_Handler() {
@ -54,8 +60,7 @@ void IR_CMD_Handler() {
if (dataHandled_flag && (millis() - IR_Timeout_timer > IR_Timeout)) {
dataHandled_flag = 0;
}
if (inputInProgerss
&& (millis() - inputInProgerss_timer > ResetInputProgerss_Timeout)) {
if (inputInProgerss && (millis() - inputInProgerss_timer > ResetInputProgerss_Timeout)) {
IR_CMD_Clear();
}
@ -65,15 +70,34 @@ void IR_CMD_Handler() {
IR_Timeout_timer = millis();
// works once per button press
if (memcmp(&data, &old_data, sizeof(IRData)) != 0
|| !dataHandled_flag) {
if (memcmp(&data, &old_data, sizeof(IRData)) != 0 || !dataHandled_flag) {
dataHandled_flag = 1;
if (IR_Address == 0x01) {
onHoldRepeat = NullFunc;
InputHandler();
inputInProgerss = 1;
inputInProgerss_timer = millis();
holdStartTime = millis(); // Запоминаем время начала удержания
lastRepeatTime = holdStartTime; // Инициализируем таймер повторного вызова
currentRepeatTime = InitialRepeatTime; // Сбрасываем интервал повторного вызова
}
memcpy(&old_data, &data, sizeof(IRData));
} else {
// Проверка на удержание кнопки
if (millis() - holdStartTime > HoldTime) { // Если кнопка удерживается дольше HoldTime
if (millis() - lastRepeatTime > currentRepeatTime) { // Если прошло достаточно времени для повторного вызова
lastRepeatTime = millis(); // Обновляем время последнего вызова
onHoldRepeat(); // Вызываем функцию при удержании
// Уменьшаем интервал до минимального значения
if (currentRepeatTime > MinRepeatTime) {
currentRepeatTime -= RepeatDecay;
if (currentRepeatTime < MinRepeatTime) {
currentRepeatTime = MinRepeatTime;
}
}
}
}
}
IR_Timeout_timer = millis();
ClearIRStatus();
@ -81,7 +105,6 @@ void IR_CMD_Handler() {
}
void IR_CMD_Clear() {
InputHandler = IR_Home_Process;
inputDigit = 0;
inputInProgerss = 0;
@ -122,6 +145,3 @@ void IR_ParamEnter() {
}
}
}