Показать сообщение отдельно
Старый 27.03.2019, 16:55   #2
laba
Местный
 
Аватар для laba
 
Регистрация: 06.03.2009
Адрес: Питер
Сообщений: 3,693
Сказал(а) 'не согласен(а)'!: 10
Сказали 'не согласен'! 0 раз(а) в 0 сообщениях
Сказал(а) спасибо: 6,942
Поблагодарили 4,844 раз(а) в 1,822 сообщениях
Все 'Спасибо' этого пользователя. :
0 за это сообщение
0 Всего
Репутация: репутация неоспорима (5127)
По умолчанию

Есть кое-какие результаты.......
Функционал управления 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, функцию парсинга сообщений от дисплея:
Скрытый текст
// Функция парсинга строки
String getValue(String data, char separator, int index)
{
int found = 0;
int strIndex[] = {0, -1 };
int maxIndex = data.length()-1;
for(int i=0; i<=maxIndex && found<=index; i++){
if(data.charAt(i)==separator || i==maxIndex){
found++;
strIndex[0] = strIndex[1]+1;
strIndex[1] = (i == maxIndex) ? i+1 : i;}
}
return found>index ? data.substring(strIndex[0], strIndex[1]) : "";
}

Во вложении, находится проект для дисплея Nextion 3,5 дюйма(480х320), открывается в среде разработки Nextion Edition.
Вложения:
Тип файла: rar A21_Nextion_Control.rar (3.33 Мб, 169 просмотров)
__________________
HO, цифра, OpenDCC, S-88N, OpenCar, BiDiB
С приветом из подземки!!!

Последний раз редактировалось laba; 27.03.2019 в 18:20.
laba вне форума  
Вверх
6 пользователя(ей) сказали cпасибо: