API
For Arduino developers
NexTouch.cpp
Go to the documentation of this file.
1 
16 #include "NexTouch.h"
17 
18 uint8_t NexTouch::__buffer[256] = {0};
19 
27 {
28  uint16_t i;
29  uint8_t c;
30  while (nexSerial.available() > 0)
31  {
32  delay(10);
33  c = nexSerial.read();
34 
35  if (NEX_RET_EVENT_TOUCH_HEAD == c)
36  {
37  if (nexSerial.available() >= 6)
38  {
39  __buffer[0] = c;
40  for (i = 1; i < 7; i++)
41  {
42  __buffer[i] = nexSerial.read();
43  }
44  __buffer[i] = 0x00;
45 
46  if (0xFF == __buffer[4] && 0xFF == __buffer[5] && 0xFF == __buffer[6])
47  {
48  iterate(list, (NexPid)__buffer[1], (NexCid)__buffer[2], (NexEventType)__buffer[3]);
49  }
50 
51  }
52  }
53  }
54  return 0;
55 }
56 
69 NexTouch::NexTouch(NexPid pid, NexCid cid, char *name,
70  NexTouchEventCb pop, void *pop_ptr,
71  NexTouchEventCb push, void *push_ptr)
72 {
73  this->pid = pid;
74  this->cid = cid;
75  this->name = name;
76  this->cbPush = push;
77  this->cbPop = pop;
78  this->__cbpop_ptr = pop_ptr;
79  this->__cbpush_ptr = push_ptr;
80 }
81 
87 NexPid NexTouch::getPid(void)
88 {
89  return pid;
90 }
91 
97 NexCid NexTouch::getCid(void)
98 {
99  return cid;
100 }
101 
107 const char* NexTouch::getObjName(void)
108 {
109  return name;
110 }
111 
117 void NexTouch::print(void)
118 {
119  dbSerialPrint("[");
120  dbSerialPrint((uint32_t)this);
121  dbSerialPrint(":");
122  dbSerialPrint(pid);
123  dbSerialPrint(",");
124  dbSerialPrint(cid);
125  dbSerialPrint(",");
126  if (name)
127  {
128  dbSerialPrint(name);
129  }
130  else
131  {
132  dbSerialPrint("(null)");
133  }
134  dbSerialPrint(",");
135  dbSerialPrint((uint32_t)cbPush);
136  dbSerialPrint(",");
137  dbSerialPrint((uint32_t)cbPop);
138  dbSerialPrintln("]");
139 }
140 
141 void NexTouch::attachPush(NexTouchEventCb push, void *ptr)
142 {
143  this->cbPush = push;
144  this->__cbpush_ptr = ptr;
145 }
146 
147 void NexTouch::detachPush(void)
148 {
149  this->cbPush = NULL;
150  this->__cbpush_ptr = NULL;
151 }
152 
153 void NexTouch::attachPop(NexTouchEventCb pop, void *ptr)
154 {
155  this->cbPop = pop;
156  this->__cbpop_ptr = ptr;
157 }
158 
159 void NexTouch::detachPop(void)
160 {
161  this->cbPop = NULL;
162  this->__cbpop_ptr = NULL;
163 }
164 
165 void NexTouch::iterate(NexTouch **list, NexPid pid, NexCid cid, NexEventType event)
166 {
167  NexTouch *e = NULL;
168  uint16_t i = 0;
169 
170  if (NULL == list)
171  {
172  return;
173  }
174 
175  for(i = 0; (e = list[i]) != NULL; i++)
176  {
177  if (e->getPid() == pid && e->getCid() == cid)
178  {
179  e->print();
180  if (NEX_EVENT_PUSH == event)
181  {
182  e->push();
183  }
184  else if (NEX_EVENT_POP == event)
185  {
186  e->pop();
187  }
188 
189  break;
190  }
191  }
192 }
193 
194 void NexTouch::push(void)
195 {
196  if (cbPush)
197  {
198  cbPush(__cbpush_ptr);
199  }
200 }
201 
202 void NexTouch::pop(void)
203 {
204  if (cbPop)
205  {
206  cbPop(__cbpop_ptr);
207  }
208 }
209 
219 bool NexTouch::recvRetCommandFinished(uint32_t timeout)
220 {
221  bool ret = false;
222  uint8_t temp[4] = {0};
223 
224  nexSerial.setTimeout(timeout);
225  if (sizeof(temp) != nexSerial.readBytes((char *)temp, sizeof(temp)))
226  {
227  ret = false;
228  }
229 
230  if (temp[0] == NEX_RET_CMD_FINISHED
231  && temp[1] == 0xFF
232  && temp[2] == 0xFF
233  && temp[3] == 0xFF
234  )
235  {
236  ret = true;
237  }
238 
239  if (ret)
240  {
241  dbSerialPrintln("recvRetCommandFinished ok");
242  }
243  else
244  {
245  dbSerialPrintln("recvRetCommandFinished err");
246  }
247 
248  return ret;
249 }
250 
256 void NexTouch::sendCommand(const char* cmd)
257 {
258  while (nexSerial.available())
259  {
260  nexSerial.read();
261  }
262 
263  nexSerial.print(cmd);
264  nexSerial.write(0xFF);
265  nexSerial.write(0xFF);
266  nexSerial.write(0xFF);
267 }
268 
279 uint16_t NexTouch::recvRetString(char *buffer, uint16_t len, uint32_t timeout)
280 {
281  uint16_t ret = 0;
282  bool str_start_flag = false;
283  uint8_t cnt_0xff = 0;
284  String temp = String("");
285  uint8_t c = 0;
286  long start;
287 
288  if (!buffer || len == 0)
289  {
290  goto __return;
291  }
292 
293  start = millis();
294  while (millis() - start <= timeout)
295  {
296  while (nexSerial.available())
297  {
298  c = nexSerial.read();
299  if (str_start_flag)
300  {
301  if (0xFF == c)
302  {
303  cnt_0xff++;
304  if (cnt_0xff >= 3)
305  {
306  break;
307  }
308  }
309  else
310  {
311  temp += (char)c;
312  }
313  }
314  else if (NEX_RET_STRING_HEAD == c)
315  {
316  str_start_flag = true;
317  }
318  }
319 
320  if (cnt_0xff >= 3)
321  {
322  break;
323  }
324  }
325 
326  ret = temp.length();
327  ret = ret > len ? len : ret;
328  strncpy(buffer, temp.c_str(), ret);
329 
330 __return:
331 
332  dbSerialPrint("recvRetString[");
333  dbSerialPrint(temp.length());
334  dbSerialPrint(",");
335  dbSerialPrint(temp);
336  dbSerialPrintln("]");
337 
338  return ret;
339 }
340 
351 bool NexTouch::recvRetNumber(uint32_t *number, uint32_t timeout)
352 {
353  bool ret = false;
354  uint8_t temp[8] = {0};
355 
356  if (!number)
357  {
358  goto __return;
359  }
360 
361  nexSerial.setTimeout(timeout);
362  if (sizeof(temp) != nexSerial.readBytes((char *)temp, sizeof(temp)))
363  {
364  goto __return;
365  }
366 
367  if (temp[0] == NEX_RET_NUMBER_HEAD
368  && temp[5] == 0xFF
369  && temp[6] == 0xFF
370  && temp[7] == 0xFF
371  )
372  {
373  *number = (temp[4] << 24) | (temp[3] << 16) | (temp[2] << 8) | (temp[1]);
374  ret = true;
375  }
376 
377 __return:
378 
379  if (ret)
380  {
381  dbSerialPrint("recvRetNumber :");
382  dbSerialPrintln(*number);
383  }
384  else
385  {
386  dbSerialPrintln("recvRetNumber err");
387  }
388 
389  return ret;
390 }
391 
392 bool NexTouch::getBrightness(uint32_t *brightness)
393 {
394  sendCommand("get dim");
395  return recvRetNumber(brightness);
396 }
397 
404 bool nexInit(void)
405 {
406  nexSerial.begin(9600);
408  NexTouch::sendCommand("page 0");
409  delay(100);
410  return true;
411 }
412 
420 bool nexLoop(NexTouch **nex_listen_list)
421 {
422  NexTouch::mainEventLoop(nex_listen_list);
423  return false;
424 }
425 
434 bool sendCurrentPageId(uint8_t* pageId)
435 {
436 
437  bool ret = false;
438  uint8_t temp[5] = {0};
439 
440  if (!pageId)
441  {
442  goto __return;
443  }
444  NexTouch::sendCommand("sendme");
445  delay(50);
446  nexSerial.setTimeout(500);
447  if (sizeof(temp) != nexSerial.readBytes((char *)temp, sizeof(temp)))
448  {
449  goto __return;
450  }
451 
452  if (temp[0] == NEX_RET_CURRENT_PAGE_ID_HEAD
453  && temp[2] == 0xFF
454  && temp[3] == 0xFF
455  && temp[4] == 0xFF
456  )
457  {
458  *pageId = temp[1];
459  ret = true;
460  }
461 
462  __return:
463 
464  if (ret)
465  {
466  dbSerialPrint("recvPageId :");
467  dbSerialPrintln(*pageId);
468  }
469  else
470  {
471  dbSerialPrintln("recvPageId err");
472  }
473 
474  return ret;
475 
476 }
477 
485 {
486  bool ret = false;
487  NexTouch::sendCommand("touch_j");
488  delay(10);
490  {
491  dbSerialPrintln("TouchCalibration ok ");
492  ret = true;
493  }
494  else
495  {
496  dbSerialPrintln("TouchCalibration err ");
497  }
498 
499  return ret;
500 }
501 
509 {
510  bool ret = false;
511  NexTouch::sendCommand("cle_c");
512  delay(10);
514  {
515  dbSerialPrintln("disableTouchFocus ok ");
516  ret = true;
517  }
518  else
519  {
520  dbSerialPrintln("disableTouchFocus err ");
521  }
522 
523  return ret;
524 }
525 
533 {
534 
535  bool ret = false;
536  NexTouch::sendCommand("com_stop");
537  delay(10);
539  {
540  dbSerialPrintln("pauseSerialCommand ok ");
541  ret = true;
542  }
543  else
544  {
545  dbSerialPrintln("pauseSerialCommand err ");
546  }
547 
548  return ret;
549 }
550 
558 {
559  bool ret = false;
560  NexTouch::sendCommand("com_star");
561  delay(10);
563  {
564  dbSerialPrintln("recoverySerialCommand ok ");
565  ret = true;
566  }
567  else
568  {
569  dbSerialPrintln("recoverySerialCommand err ");
570  }
571 
572  return ret;
573 }
574 
583 bool setCurrentBrightness(uint8_t dimValue)
584 {
585  bool ret = false;
586  char buf[10] = {0};
587  String cmd;
588  utoa(dimValue, buf, 10);
589  cmd += "dim=";
590  cmd += buf;
591  NexTouch::sendCommand(cmd.c_str());
592  delay(10);
593 
595  {
596  dbSerialPrint("setCurrentBrightness[ ");
597  dbSerialPrint(dimValue);
598  dbSerialPrintln("]ok ");
599 
600  ret = true;
601  }
602  else
603  {
604  dbSerialPrintln("setCurrentBrightness err ");
605  }
606 
607  return ret;
608 }
609 
618 bool setDefaultBrightness(uint8_t dimDefaultValue)
619 {
620  bool ret = false;
621  char buf[10] = {0};
622  String cmd;
623  utoa(dimDefaultValue, buf, 10);
624  cmd += "dims=";
625  cmd += buf;
626  NexTouch::sendCommand(cmd.c_str());
627  delay(10);
628 
630  {
631  dbSerialPrint("setDefaultBrightness[");
632  dbSerialPrint(dimDefaultValue);
633  dbSerialPrintln("]ok");
634  ret = true;
635  }
636  else
637  {
638  dbSerialPrintln("setDefaultBrightness err ");
639  }
640 
641  return ret;
642 }
643 
652 bool sleepMode(uint8_t mode)
653 {
654  bool ret = false;
655  char buf[10] = {0};
656  String cmd;
657  if(mode != 0 && mode != 1)
658  {
659  dbSerialPrintln("mode input ok ");
660  return ret;
661  }
662  utoa(mode, buf, 10);
663  cmd += "sleep=";
664  cmd += buf;
665  NexTouch::sendCommand(cmd.c_str());
666  delay(10);
667 
669  {
670  dbSerialPrintln("sleepMode ok ");
671  ret = true;
672  }
673  else
674  {
675  dbSerialPrintln("sleepMode err ");
676  }
677 
678  return ret;
679 }
680 
689 bool setCurrentBaudrate(uint32_t baudrate)
690 {
691  bool ret = false;
692  char buf[10] = {0};
693  String cmd;
694  utoa(baudrate, buf, 10);
695  cmd += "baud=";
696  cmd += buf;
697  NexTouch::sendCommand(cmd.c_str());
698  delay(10);
699 
701  {
702  dbSerialPrintln("setCurrentBaudrate ok ");
703  ret = true;
704  }
705  else
706  {
707  dbSerialPrintln("setCurrentBaudrate err ");
708  }
709 
710  return ret;
711 }
712 
721 bool setDefaultBaudrate(uint32_t defaultBaudrate)
722 {
723  bool ret = false;
724  char buf[10] = {0};
725  String cmd;
726  utoa(defaultBaudrate, buf, 10);
727  cmd += "bauds=";
728  cmd += buf;
729  NexTouch::sendCommand(cmd.c_str());
730  delay(10);
731 
733  {
734  dbSerialPrintln("setDefaultBaudrate ok ");
735  ret = true;
736  }
737  else
738  {
739  dbSerialPrintln("setDefaultBaudrate err ");
740  }
741 
742  return ret;
743 }
744 
745 
746 
747 
748 
749 
750 
751 
752 
753 
754 
755 
756 
757 
758 
759 
760 
761 
762 
763 
764 
NexPid getPid(void)
Get page id.
Definition: NexTouch.cpp:87
bool setDefaultBaudrate(uint32_t defaultBaudrate)
Set default baudrate.
Definition: NexTouch.cpp:721
NexTouch(NexPid pid, NexCid cid, char *name, NexTouchEventCb pop=NULL, void *pop_ptr=NULL, NexTouchEventCb push=NULL, void *push_ptr=NULL)
Constructor of Nextouch.
Definition: NexTouch.cpp:69
bool nexInit(void)
Init Nextion's baudrate,page id.
Definition: NexTouch.cpp:404
static void sendCommand(const char *cmd)
Send command to Nextion.
Definition: NexTouch.cpp:256
const char * getObjName(void)
Get component name.
Definition: NexTouch.cpp:107
bool nexLoop(NexTouch **nex_listen_list)
Call mainEventLoop,watting for Nextion's touch event.
Definition: NexTouch.cpp:420
void print(void)
Print current object address,page id,component id, component name,pop event function address...
Definition: NexTouch.cpp:117
static uint8_t mainEventLoop(NexTouch **list)
Watting for Nextion's touch event.
Definition: NexTouch.cpp:26
bool disableTouchFocus(void)
Disable all touch hot.
Definition: NexTouch.cpp:508
NexCid getCid(void)
Get component id.
Definition: NexTouch.cpp:97
bool setDefaultBrightness(uint8_t dimDefaultValue)
Set default backlight brightness value.
Definition: NexTouch.cpp:618
bool sendCurrentPageId(uint8_t *pageId)
Return current page id.
Definition: NexTouch.cpp:434
API of Nextion.
bool recoverySerialCommand(void)
Recovery serial instruction execution.
Definition: NexTouch.cpp:557
bool sleepMode(uint8_t mode)
Set device in sleep mode.
Definition: NexTouch.cpp:652
bool setCurrentBaudrate(uint32_t baudrate)
Set current baudrate.
Definition: NexTouch.cpp:689
bool pauseSerialCommand(void)
Pause serial instruction execution.
Definition: NexTouch.cpp:532
static bool recvRetNumber(uint32_t *number, uint32_t timeout=500)
Receive uint32_t data.
Definition: NexTouch.cpp:351
static uint16_t recvRetString(char *buffer, uint16_t len, uint32_t timeout=500)
Receive string data.
Definition: NexTouch.cpp:279
bool setCurrentBrightness(uint8_t dimValue)
Set current backlight brightness value.
Definition: NexTouch.cpp:583
static bool recvRetCommandFinished(uint32_t timeout=100)
Command is executed successfully.
Definition: NexTouch.cpp:219
Root Class of Nextion Components.
Definition: NexTouch.h:57
bool touchCalibration(void)
Touch screen calibration.
Definition: NexTouch.cpp:484