Beim Testen des Beispiels habe ich direkt einen Fehler entdeckt.
void NxNum::set(long value) {
setAtt(pmsVal, value);
}
dort stand vorher pmsText, was natürlich nicht geht.
Ich habe ein Feld stdText (page 0, id 1) und stdNum (page 0, id 2) definiert,
beide mit "send component id" bei "Touch release event".
Der Beispielcode spielt in erster Line an dem Nummern Feld rum.
Der Kode setzt die Nummer auf die Zahl der abgelaufenen Sekunden seit Start.
Der Touch Event der Nummer löst ein get .val aus, das erschien mir als das Einfachste.
"c" zeigt die Debug-Ausgabeeinstellungen an, "c=0" schaltet alle aus, "c=-1" alle ein,
"c" schaltet einzelne Optionen um.
silent unterdrückt die Ausgabe von commandHandler.
#include <WhandallSerial.h>
#include <WhandallNextion.h>
void processCmd(const char* buf);
const char PROGMEM pmsEvt[] = "evt 0x";
const char PROGMEM pmsCntt[] = " cnt ";
const char pmsNumber[] PROGMEM = "stdNum";
const char pmsText[] PROGMEM = "stdText";
const char pmsEquals[] PROGMEM = " = ";
const char pmsPage0[] PROGMEM = "page 0";
const char pmsBkcmd3[] PROGMEM = "bkcmd=3";
SSerial con(dbSerial, processCmd);
SSerial Nxi(NexSerial, NxObject::inHandler);
void pReasonT(nxReason reason, NxText* which) {
pReasonX(reason, which);
}
void pReasonN(nxReason reason, NxNum* which) {
pReasonX(reason, which);
}
void pReasonX(nxReason reason, NxObject* which) {
dbSerial.print(FPM(which->name()));
dbSerial.write(' ');
pNxReason(reason);
dbSerial.println();
}
bool silent = false;
bool newNumbersValue;
int32_t numbersValue;
void numAction(nxReason reason, NxNum* which) {
if (reason != done) {
pReasonX(reason, which);
}
if (reason == up) {
which->get();
} else if (reason == retNum) {
newNumbersValue = true;
numbersValue = which->accNumResult();
}
}
NxText nxTxt(0, 1, pmsText, pReasonT);
NxNum nxNum(0, 2, pmsNumber, numAction);
const char announce[] PROGMEM = "Mini Example";
void setup() {
dbSerial.begin(250000);
NexSerial.begin(115200);
con.begin(64);
Nxi.begin(64, optTripleFF | optKeepDlm);
NxObject::setGlobalHandler(pagePosHandler, commandHandler);
NxObject::prControl.fromEEProm();
dbSerial.println(AF(announce));
NexCommand_P(pmsBkcmd3);
NexCommand_P(pmsPage0);
}
void loop() {
static uint32_t lastIncrement;
static int32_t numValue;
uint32_t topLoop = millis();
con.loop();
Nxi.loop();
if (topLoop - lastIncrement >= 1000) {
lastIncrement = topLoop;
nxNum.set(++numValue);
}
if (newNumbersValue) {
newNumbersValue = false;
dbSerial.print(F("stdNum hat den Wert "));
dbSerial.print(numbersValue);
dbSerial.println(F(" an das Hauptprogramm abgegeben"));
}
}
void withOneByte(const char* buf, void (*alAction)(uint8_t)) {
(*alAction)((uint8_t)strtol(++buf, NULL, 0));
}
void withAdrLenPrefix(const char* buf, void (*alAction)(const uint8_t*, int, const char*), const char* pfx = NULL) {
int len = 16;
char* satis;
uint8_t* res = (uint8_t*)strtol(++buf, &satis, 0);
if (*satis == ',' || *satis == ' ') {
len = (int)strtol(++satis, &satis, 0);
}
(*alAction)(res, len, pfx);
}
void withAdrLenPrefixLong(const char* buf, void (*alAction)(unsigned long, int, const char*), const char* pfx = NULL) {
int len;
char* satis;
unsigned long res = strtoul(++buf, &satis, 0);
if (*satis == ',' || *satis == ' ') {
len = (int)strtol(++satis, &satis, 0);
} else {
len = 16;
}
(*alAction)(res, len, pfx);
}
void processCmd(const char* buf) {
if (*buf == '!') {
if (*++buf) {
NexCommand(buf);
} else {
dbSerial.println(F("pass to Nextion"));
}
} else if (!NxObject::prControl.command('c', buf)) {
bool doClosingNewline = false;
switch (*buf) {
case 'v':
dbSerial.println(AF(announce));
break;
default:
dbSerial.print(F("Unknown CMD '"));
dbSerial.print(buf);
dbSerial.println(F("'"));
dbSerial.print(F("try v or !"));
doClosingNewline = true;
}
if (doClosingNewline) {
dbSerial.println();
}
}
}
void pagePosHandler(nxReason reason, const void* hPtr) {
hPtr = hPtr;
switch (reason) {
case pageChange:
case pageRefresh:
break;
case unhandledId:
{
MsgTouch& tou = *(MsgTouch*)hPtr;
pNxReason(reason);
dbSerial.write(' ');
tou.print();
dbSerial.println();
}
break;
case transReady:
break;
case transDone:
break;
case down:
case up:
case done:
case error:
case retNum:
case retStr:
case downPos:
case upPos:
case downSleepPos:
case upSleepPos:
case sleep:
case wakeUp:
case reseted:
case launched:
case upgraded:
default:
break;
}
}
const char pmsUnex[] PROGMEM = "unexpected";
void commandHandler(nxReason reason, const void* hPtr) {
if (!silent) {
pNxReason(reason);
switch (reason) {
case done:
break;
case error:
dbSerial.write(',');
dbSerial.write(' ');
NxObject::printCurrError();
break;
case retNum:
dbSerial.write(' ');
dbSerial.print(((MsgNumData*)hPtr)->value);
break;
case retStr:
dbSerial.write(' ');
((MsgStrData*)hPtr)->pText();
break;
default:
dbSerial.write(' ');
dbSerial.print(FPM(pmsUnex));
break;
}
dbSerial.println();
}
}