Поменял алгоритм работы кнопок в меню

This commit is contained in:
Dmitriy 2024-11-19 02:11:11 +03:00
parent c85da270c2
commit c2072b26f9

View File

@ -26,13 +26,12 @@ const PROGMEM char Device_Date[] = "09/09/24"; // дата производ
const unsigned long block = 500000; // блокировка устройства при превышении этой суммы денег const unsigned long block = 500000; // блокировка устройства при превышении этой суммы денег
//======Переменные обработки клавиш================= //======Переменные обработки клавиш=================
boolean lastReading = false; // флаг предыдущего состояния кнопки boolean lastReading[2] = {false, false}; // флаг предыдущего состояния кнопки
boolean buttonSingle = false; // флаг состояния "краткое нажатие" boolean buttonSingle[2] = {false, false}; // флаг состояния "краткое нажатие"
boolean buttonDouble = false; // флаг состояния "двойное нажатие" boolean buttonDouble[2] = {false, false}; // флаг состояния "двойное нажатие"
boolean buttonHold = false; // флаг состояния "долгое нажатие" boolean buttonHold[2] = {false, false}; // флаг состояния "долгое нажатие"
unsigned long onTime = 0; // переменная обработки временного интервала unsigned long onTime[2] = {0, 0}; // переменная обработки временного интервала
unsigned long lastSwitchTime = 0; // переменная времени предыдущего переключения состояния unsigned long lastSwitchTime[2] = {0, 0}; // переменная времени предыдущего переключения состояния
unsigned long ledStartTime = 0; // переменная-флаг времени начала включения LED
const int bounceTime = 10; // задержка для подавления дребезга const int bounceTime = 10; // задержка для подавления дребезга
const int holdTime = 1000; // время, в течение которого нажатие можно считать удержанием кнопки const int holdTime = 1000; // время, в течение которого нажатие можно считать удержанием кнопки
@ -135,50 +134,56 @@ LiquidCrystal_I2C lcd(0x27, SIZE_SCREEN_LINE, SIZE_SCREEN); //
void read_buttons(byte x) void read_buttons(byte x)
{ {
boolean reading = !digitalRead(x); boolean reading = !digitalRead(x);
int index = (x == buttonPin_Service ? 0 : 1);
if (reading && !lastReading) // проверка первичного нажатия if (reading && !lastReading[index]) // проверка первичного нажатия
{ {
onTime = millis(); onTime[index] = millis();
!index ? Serial.println("click button Service") : Serial.println("click button Start");
} }
if (reading && lastReading) // проверка удержания if (reading && lastReading[index]) // проверка удержания
{ {
if ((millis() - onTime) > holdTime) if ((millis() - onTime[index]) > holdTime)
{ {
buttonHold = true; buttonHold[index] = true;
!index ? Serial.println("buttonHold Service") : Serial.println("buttonHold Start");
digitalWrite(LEDPin, !digitalRead(LEDPin)); // при удержании кнопки мигает светодиод digitalWrite(LEDPin, !digitalRead(LEDPin)); // при удержании кнопки мигает светодиод
isButtonHoldRepeate(x);
} }
} }
if (!reading && lastReading) // проверка отпускания кнопки if (!reading && lastReading[index]) // проверка отпускания кнопки
{ {
if (((millis() - onTime) > bounceTime) && !buttonHold) if (((millis() - onTime[index]) > bounceTime) && !buttonHold[index])
{ {
if ((millis() - lastSwitchTime) >= doubleTime) if ((millis() - lastSwitchTime[index]) >= doubleTime)
{ {
lastSwitchTime = millis(); lastSwitchTime[index] = millis();
buttonSingle = true; buttonSingle[index] = true;
!index ? Serial.println("buttonSingle Service") : Serial.println("buttonSingle Start");
} }
else else
{ {
lastSwitchTime = millis(); lastSwitchTime[index] = millis();
buttonDouble = true; buttonDouble[index] = true;
buttonSingle = false; !index ? Serial.println("buttonDouble Service") : Serial.println("buttonDouble Start");
isButtonDouble(); buttonSingle[index] = false;
buttonDouble = false; // сброс состояния после выполнения команды buttonDouble[index] = false; // сброс состояния после выполнения команды
isButtonDouble(x);
} }
} }
if (buttonHold) if (buttonHold[index])
{ {
buttonDouble = false; buttonDouble[index] = false;
isButtonHold(); buttonHold[index] = false; // сброс состояния после выполнения команды
buttonHold = false; // сброс состояния после выполнения команды isButtonHold(x);
} }
} }
lastReading = reading; lastReading[index] = reading;
if (buttonSingle && (millis() - lastSwitchTime) > doubleTime) if (buttonSingle[index] && (millis() - lastSwitchTime[index]) > doubleTime)
{ {
buttonDouble = false; buttonDouble[index] = false;
isButtonSingle(); buttonSingle[index] = false; // сброс состояния после выполнения команды
buttonSingle = false; // сброс состояния после выполнения команды isButtonSingle(x);
} }
} }
@ -219,7 +224,7 @@ struct parameter_digit {
struct parameter_list { struct parameter_list {
byte param_index; byte param_index;
param_limit limit; param_limit limit;
char list_data[4][13]; char list_data[4][11];
}; };
struct parameter_header { struct parameter_header {
@ -587,8 +592,8 @@ const menu_screen menu_settings[] PROGMEM = {
}, },
{ {
"Luxura ", "Luxura ",
"FireSun UV ", "FS UV ",
"FireSun UV+K", "FS UV+K ",
"SunFlower" "SunFlower"
} }
} }
@ -858,12 +863,49 @@ void reset_short_counters()
} }
/* /*
удержание кнопки удержание кнопки на повторе
*/ */
void isButtonHold() void isButtonHoldRepeate(byte x)
{ {
need_reload_menu = true; need_reload_menu = true;
if(x == buttonPin_Start)
{
if(start_edit_parameter)
{
Serial.println("isButtonHoldRepeate");
if(current_menu_screen.menu_lines[current_line_index].type == DIGIT_PARAM_LINE)
{
if(all_byte_parameters[current_menu_screen.menu_lines[current_line_index].parameter.digit.param_index]++ >= current_menu_screen.menu_lines[current_line_index].parameter.digit.limit.max)
{
all_byte_parameters[current_menu_screen.menu_lines[current_line_index].parameter.digit.param_index] = current_menu_screen.menu_lines[current_line_index].parameter.digit.limit.min;
}
}
else if(current_menu_screen.menu_lines[current_line_index].type == LIST_PARAM_LINE)
{
if(all_byte_parameters[current_menu_screen.menu_lines[current_line_index].parameter.list.param_index]++ >= current_menu_screen.menu_lines[current_line_index].parameter.list.limit.max)
{
all_byte_parameters[current_menu_screen.menu_lines[current_line_index].parameter.list.param_index] = current_menu_screen.menu_lines[current_line_index].parameter.list.limit.min;
}
}
}
return;
}
}
/*
удержание кнопки
*/
void isButtonHold(byte x)
{
need_reload_menu = true;
if(x == buttonPin_Start)
{
return;
}
if(!menu_enable) if(!menu_enable)
{ {
menu_index = MAIN_MENU; menu_index = MAIN_MENU;
@ -875,20 +917,7 @@ void isButtonHold()
} }
else else
{ {
if(start_edit_parameter) if(!start_edit_parameter)
{
start_edit_parameter = false;
need_hide_cursor = false;
if(current_menu_screen.menu_lines[current_line_index].type == DIGIT_PARAM_LINE)
{
save_byte_parameter(current_menu_screen.menu_lines[current_line_index].parameter.digit.param_index);
}
else if(current_menu_screen.menu_lines[current_line_index].type == LIST_PARAM_LINE)
{
save_byte_parameter(current_menu_screen.menu_lines[current_line_index].parameter.list.param_index);
}
}
else
{ {
if(menu_index == MAIN_MENU) if(menu_index == MAIN_MENU)
{ {
@ -912,11 +941,11 @@ void isButtonHold()
/* /*
одиночное нажатие кнопки одиночное нажатие кнопки
*/ */
void isButtonSingle() void isButtonSingle(byte x)
{ {
need_reload_menu = true; need_reload_menu = true;
if(start_edit_parameter) if(start_edit_parameter && (x == buttonPin_Start || x == buttonPin_Service))
{ {
if(current_menu_screen.menu_lines[current_line_index].type == DIGIT_PARAM_LINE) if(current_menu_screen.menu_lines[current_line_index].type == DIGIT_PARAM_LINE)
{ {
@ -933,7 +962,7 @@ void isButtonSingle()
} }
} }
} }
else else if(x == buttonPin_Service)
{ {
last_cursor_index = cursor_index; last_cursor_index = cursor_index;
cursor_index++; cursor_index++;
@ -956,10 +985,14 @@ void isButtonSingle()
/* /*
двойное нажатие кнопки двойное нажатие кнопки
*/ */
void isButtonDouble() void isButtonDouble(byte x)
{ {
need_reload_menu = true; need_reload_menu = true;
if(x == buttonPin_Start) {
return;
}
if(current_menu_screen.menu_lines[current_line_index].type == MENU_LINE) if(current_menu_screen.menu_lines[current_line_index].type == MENU_LINE)
{ {
last_menu_index[menu_inter] = menu_index; last_menu_index[menu_inter] = menu_index;
@ -978,6 +1011,17 @@ void isButtonDouble()
start_edit_parameter = true; start_edit_parameter = true;
hide_cursor(); hide_cursor();
need_hide_cursor = true; need_hide_cursor = true;
} else {
start_edit_parameter = false;
need_hide_cursor = false;
if(current_menu_screen.menu_lines[current_line_index].type == DIGIT_PARAM_LINE)
{
save_byte_parameter(current_menu_screen.menu_lines[current_line_index].parameter.digit.param_index);
}
else if(current_menu_screen.menu_lines[current_line_index].type == LIST_PARAM_LINE)
{
save_byte_parameter(current_menu_screen.menu_lines[current_line_index].parameter.list.param_index);
}
} }
} }
} }
@ -995,7 +1039,7 @@ void show_line(byte index_line)
else if(current_menu_screen.menu_lines[index_line].type == DIGIT_PARAM_LINE) else if(current_menu_screen.menu_lines[index_line].type == DIGIT_PARAM_LINE)
{ {
char line[SIZE_SCREEN_LINE * 2]; char line[SIZE_SCREEN_LINE * 2];
char format[9] = "%s %d %s"; char format[11] = "%s %d %s ";
if(start_edit_parameter && index_line == current_line_index) if(start_edit_parameter && index_line == current_line_index)
{ {
format[2] = '>'; format[2] = '>';
@ -1008,7 +1052,7 @@ void show_line(byte index_line)
else if(current_menu_screen.menu_lines[index_line].type == LIST_PARAM_LINE) else if(current_menu_screen.menu_lines[index_line].type == LIST_PARAM_LINE)
{ {
char line[SIZE_SCREEN_LINE * 2]; char line[SIZE_SCREEN_LINE * 2];
char format[6] = "%s %s"; char format[8] = "%s %s ";
if(start_edit_parameter && index_line == current_line_index) if(start_edit_parameter && index_line == current_line_index)
{ {
format[2] = '>'; format[2] = '>';
@ -1283,6 +1327,7 @@ void menu()
while (menu_enable == true) while (menu_enable == true)
{ {
read_buttons(buttonPin_Service); read_buttons(buttonPin_Service);
read_buttons(buttonPin_Start);
if(need_clear_menu) if(need_clear_menu)
{ {
@ -1436,6 +1481,7 @@ void setup()
void loop() void loop()
{ {
read_buttons(buttonPin_Service); read_buttons(buttonPin_Service);
read_buttons(buttonPin_Start);
hide_cursor(); hide_cursor();
need_hide_cursor = true; need_hide_cursor = true;