// Serial read and "parse"
// funguje celkem dobře oběma směry, vyžaduje terminátor 0xFF
// po odeslání id command v 1.cyklu načte command a pak 2 cykly načte prázdné (ARDU posílá ještě 2x 0xFF)
//#define BUF_SIZE 66 // max 64 byte, delší rozdělí po 64 bytech - opakuje se readSerial
#define BUF_SIZE 16 // 64 byte je zbytečné, v podstatě stačí 4+3 byte
//char newMessage[BUF_SIZE] = { "" };
bool newMessageAvailable = false;
// meessage from NEX parsing
uint8_t NEX_page; // page idx
uint8_t NEX_touch; // Touch Event
uint8_t NEX_id; // Component id
uint8_t NEX_value; // event/value
// meessage to NEX construction
char NEX_page_name; // page name
char NEX_component_name; // Component name
uint8_t NEX_page_id; // page id
uint8_t NEX_component_id; // Component id
uint8_t NEX_component_value; // Component value
char P_bracket = 'p['; // page bracket
char B_bracket = '.b['; // id bracket
char L_bracket = '['; // left bracket
char R_bracket = '].'; // right bracket
char V_bracket = '.val='; // value bracket ... vše nějak optimalizovat
char terminator[1] = { 0xFF };
//char terminator[3] = { 0xFF, 0xFF, 0xFF }; //řetězec to nevezme
/* možné konstrukce telegramu do NEX:
"p[" (page_id) "]" ".b[" (component id) "]" ".val=" (component value) "terminator" "terminator" "terminator"
(page_name) "." (component_name) ".val=" (component_value)
"p[" (page_id) "]" "." (component_name) ".val=" (component_value)
(page_name) ".b[" (component id) "]" ".val=" (component value)
*/
String newMessage;
uint8_t m_length; // length of new message
char TEST = 'X'; // X === 88 in ASCII
uint8_t iTEST = 65; // A === 65 in ASCII
void setup() {
Serial.begin(9600); // Spuštění sériové komunikace
Serial.setTimeout(50); // Zkrácení timeoutu na 50 ms pro rychlejší odezvu
Serial2.begin(9600, SERIAL_8N1, 16, 17); // hwUART2 e.g. pins RX=GPI16 TX=GPI17 for Nextion serial
}
void loop() {
/*
Serial2.println(" serin test ");
Serial2.print("j0.val=15");
Serial2.write(0xFF);
Serial2.write(0xFF);
Serial2.write(0xFF);
*/
/******************* from console on Serial ******************************************************************************/
// Kontrola, zda jsou v bufferu vůbec nějaká data k dispozici
if (Serial.available() > 0) {
// Načte text ze sériové linky, dokud nenarazí na odřádkování ('\n') // to ale NEX neposílá
// String newMessage = Serial.readStringUntil('\n');
String newMessage = Serial.readStringUntil('ÿ'); // ukončí při prvním znaku 0xFF,
//ale z NEX jdou ještě další dva 0xFF které načte ve dvou čtec.cyklech jako prázdné message
newMessage.trim(); // Odstraní případné neviditelné znaky na konci (např. '\r' při CR+LF)
m_length = newMessage.length();
Serial.print("Received from Serial ");
Serial.print(m_length);
Serial.println(" byte, indexed output :");
for(uint8_t index = 0; index < m_length+1; index++)
{
Serial.print(newMessage[index]); // mohu pracovat s jednotlivými byte pole
}
Serial.println("");
Serial.print("newMessage : ");
Serial.println(newMessage);
Serial.println(".....");
Serial2.print(newMessage);
Serial2.write(0xFF);
Serial2.write(0xFF);
Serial2.write(0xFF);
}
/******************* from NEX on Serial2 **********************************************************************************/
if (Serial2.available() > 0) {
// Načte text ze sériové linky, dokud nenarazí na klávesu Enter ('\n')
// String newMessage = Serial2.readStringUntil('\n'); // Nex neposílá \n a ardu vyskočí až timeoutem
// String newMessage = Serial2.readStringUntil('X'); // Nex pošlee X viz test a pak ardu nečeká na timeout
String newMessage = Serial2.readStringUntil(*terminator); // Nex pošlee X viz test a pak ardu nečeká na timeout
newMessage.trim(); // Odstraní případné neviditelné znaky na konci (např. '\r' při CR+LF)
m_length = newMessage.length();
// protože skončí na prvním výskytu 0xFF, tak pokračuje tiskem jen pro m_length>0, každý další výskyt 0xFF přečte a přeskočí
// ten počet 0xFF by se dal využít pro nějakou kontrolu
// POZOR - NEX nesmí posílat 0xFF nikde jinde než jako terminátor
if(m_length>0){
// Serial.print("Received from Serial2 ");
// Serial.print(m_length);
// Serial.println(" byte, indexed output ");
// for(uint8_t index = 0; index < m_length; index++)
// {
// Serial.print(":");
// Serial.print(newMessage[index],HEX); // mohu pracovat s jednotlivými byte pole, HEXa výpis
// }
// Serial.println("");
// for(uint8_t index = 0; index < m_length; index++)
// {
// Serial.print(":");
// (newMessage[index]<10) ? Serial.print(" ") : Serial.print(""); // zpracovávám byty ze Stringu jako int proměnné
// Serial.print(newMessage[index],DEC); // mohu pracovat s jednotlivými byte pole, DECim výpis
// }
// Serial.println("");
//// Serial.print("newMessage : ");
//// Serial.println(newMessage);
// Serial.println(".....");
NEX_touch = newMessage[0]; // Touch Event
if(NEX_touch == 0x65){
NEX_page = newMessage[1]; // Touch Event
NEX_id = newMessage[2]; // Attribute id
NEX_value = newMessage[3]; // Attribute value
Serial.print("Code : 0x");
Serial.println(NEX_touch,HEX);
Serial.print("Page : ");
Serial.println(NEX_page);
Serial.print("Component : ");
Serial.println(NEX_id);
Serial.print("Value : ");
Serial.println(NEX_value);
}
else{
Serial.print("Received from Serial2 ");
for(uint8_t index = 0; index < m_length; index++)
{
Serial.print(":");
Serial.print(newMessage[index],HEX); // mohu pracovat s jednotlivými byte pole, HEXa výpis
}
Serial.println("");
Serial.print("newMessage : ");
Serial.println(newMessage);
Serial.println("");
}
}
/* otestování konverzí - o.k.
Serial.println(char(65)); // převede int8 na char znak
Serial.println(int('A'), DEC); // převede char znak na int8
Serial.println(int(TEST), DEC); // převede char znak na int8
Serial.println(char(iTEST)); // převede int8 na char znak
*/
}
}