Есть кое-какие результаты.......
Функционал управления A21 почти полностью реализован. Единственное, что есть мысль сделать страницу с некой библиотекой локов, из которой можно было бы выбирать лок для управления или настройки.
Весь скетч для A21 выкладывать не буду, т.к. он есть в соседней теме и кроме того ещё там ещё есть чего подчистить.
Для любителей поковыряться выложу кусок кода, которые парсит сообщения от дисплея.
Этот код помещается в Loop.
Скрытый текст
//-------------------- Функция программного сброса(перевод стека в начало програмного кода) -----------
void (*resetFunc)(void) = 0;//Программа начинает исполнятся с самого начала
//-----------------------------------------------------------------------------------------------------
if(Serial2.available()>0){// Если есть данные принятые от дисплея, то
String inString; // Объявляем строку для получения этих данных
int intVal=0;
int intVal2=0;
while (Serial2.available()) {
char inChar = Serial2.read(); delay(2);
inString += inChar;
//if (inChar=='\n')inString="";//конец строки - обнуляем строку
if (inChar == '#') {
String ID_command = getValue(inString, ':', 0);// ID команды
String val = getValue(inString, ':', 1);// значение
String sub_val = getValue(inString, ':', 2);// subID команды
intVal = val.toInt();// перевод строки в числовое значение
if(sub_val=="#")Serial.println("No sub_val!!! ");
else{
intVal2 = sub_val.toInt();// перевод строки в числовое значение
Serial.print("sub_val: ");
Serial.println(intVal2,DEC);}
inString="";
if(ID_command.equals("LAdr")){// если получили адрес лока, записываем его в переменную адреса
LocAddress = intVal;
Speed = intVal2;
notifyz21LocoSpeed(LocAddress, Speed, 28);
}
else if(ID_command.equals("FL")){// если получили команду вкл/выкл света
//Func_State = intVal;
notifyz21LocoFkt(LocAddress, intVal, 0);
}
else if(ID_command.equals("F")){// если получили команду вкл/выкл F
Serial.print("F");
Serial.print(intVal,DEC);// номер функции
Serial.print(" state ");
Serial.println(intVal2,DEC);// состояние функции
notifyz21LocoFkt(LocAddress, intVal2, intVal);
}
else if(ID_command.equals("ON")){// если получили команду "ON"
globalPower(csNormal);//
}
else if(ID_command.equals("OFF")){// если получили команду "OFF"
globalPower(csTrackVoltageOff);//
}
else if(ID_command.equals("ESTOP")){// если получили команду "ESTOP"
globalPower(csEmergencyStop);//
}
else if(ID_command.equals("RESET")){// если получили команду "RESET"
page_0();//отправляем команду дисплею, для отображения стартовой заставки
resetFunc();//вызываем функцию программного сброса
}
else if(ID_command.equals("ReadCV")){// если получили команду чтения CV
CV = intVal;
notifyz21CVREAD(0, CV-1);//читаем CV
}
else if(ID_command.equals("WriteCV")){// если получили команду записи CV
CV = intVal;
notifyz21CVWRITE(0, CV-1, intVal2);//пишем CV
}
else if(ID_command.equals("SW_R")){//
notifyz21Accessory(intVal, 1, 1);
}
else if(ID_command.equals("SW_G")){//
notifyz21Accessory(intVal, 0, 1);
}
}
// else if(inChar == '&'){
//Serial.print("RGB_Command: ");
//Serial.println(inString);}
}
}
Структура сообщения от дисплея следующая:
<Буквенный префикс><разделитель{:}><первое числовое значение><разделитель{:}><второе числовое значение><разделитель{:}><символ окончания строки(#)>
Например, имеем сообщение: LAdr:3:27:#
LAdr - сообщение относится к управлению локомотивом
3 - адрес декодера
27 - скорость
# - при получении этого символа, A21 обрабатывает полученные данные.
Несколько сообщений могут идти друг за другом.
LAdr:3:27:#FL:1:#F:1:1:#
Это сообщение отправит на лок с адресом 3, команду установки 27 шагов скорости, с включением головного освещения и активации F1.
Также ещё потребуется добавить в скетч, вне Loop, функцию парсинга сообщений от дисплея:
Во вложении, находится проект для дисплея Nextion 3,5 дюйма(480х320), открывается в среде разработки Nextion Edition.