Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: nextion_lcd.cpp
- Revision:
- 2:71b3736a1bd7
diff -r 4f6bcf445501 -r 71b3736a1bd7 nextion_lcd.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nextion_lcd.cpp Fri Oct 21 10:54:03 2022 +0000
@@ -0,0 +1,457 @@
+
+#include "mbed.h"
+#include "main.h"
+#include "nextion_lcd.h"
+#include "APP.h"
+#include "main.h"
+static UnbufferedSerial *nx_lcd;
+
+char lcd_print_buf[64];
+Ticker LCD_RX_TIME_OUT;
+unsigned char page=0;//lcd画面ページ
+unsigned char page_bak=0;//lcd画面ページ(一個前のページ)
+unsigned char PAUSE_F=0;//一時停止;
+unsigned char lcd_rx_buf_cnt=0;
+char lcd_rx_buf[64];
+int nx_lineIndex;
+char lot_edit_set[32];
+unsigned char LOT_EDIT_F=0;
+
+
+extern char lcd_print_buf[64];
+extern unsigned char a_read_ng;//audio file read ng
+
+extern unsigned char tp_mask;//1=タッチパネルマスク
+
+void nx_lcd_rx ();
+void nx_sw_chk(void);
+unsigned char touch_id=0;
+unsigned char vc_ds_sw=0;//DUAL STATE SWの論理確認用
+unsigned char val_get=0;//ボリューム取得完了フラグ(1で完了)
+unsigned char val_st=0;//ボリューム状態
+unsigned char page_get=0;//ページ取得済み1
+unsigned char page_st=0xFF;//ページNo
+
+unsigned char touch_p=0xFF;//ボタンタッチ時のページ識別ID
+unsigned char touch_t=0xFF;//ボタンのトグル状態 1=on 0=off(タッチパネル設定でボタンを離した時にもデータ送信設定した場合の識別)
+
+unsigned char lcd_page=0;//lcdからページを取得した場合、ページNoが入る
+
+
+char temdat[3];
+char dcdat[3];
+///ロット編集結果の取り込み//(SD保存する場合は、config.cppのLOT_DAT_WR()を実行
+void lot_edit_chk(void){
+ for(unsigned char cp=0; cp<lcd_rx_buf_cnt ; cp++){
+ lot_edit_set[cp]=lcd_rx_buf[cp];
+ }
+ lot_edit_set[lcd_rx_buf_cnt-1]=NULL;//で終端
+ buf_clr();
+ LOT_EDIT_F=1;//1=ロット編集あり
+
+}
+void nx_printf(char *txt){
+ char tx_buf[64];
+ unsigned char len = strlen(txt);//文字列の長さを確認
+ nx_lcd->write(txt,len);
+}
+
+///受信タイムアウト処理/////
+void LCD_RX_TIMEOUT_IRQ(void){
+ LCD_RX_TIME_OUT.detach();//シリアル受信タイムアウトカウンタ停止
+ buf_clr();
+}
+void buf_clr(void){
+ char rxdat[8];
+ //読み捨て処理
+ while(nx_lcd->readable()==1){
+ nx_lcd->read(rxdat,1);
+ }
+
+ for(unsigned char clrcnt=0; clrcnt<sizeof(lcd_rx_buf); clrcnt++){
+ lcd_rx_buf[clrcnt]=0x00;
+
+ }
+ lcd_rx_buf_cnt=0;
+ nx_lineIndex=0;
+
+}
+
+unsigned char nx_val_get(char *obj){
+ char buf[64];
+ unsigned char time_out=0;
+ unsigned char tp_mask_bak=tp_mask;
+ if(tp_mask_bak==1){
+ tp_mask=0;//1=タッチパネルマスク解除
+ }
+ val_get=0;
+ val_st=0xFF;
+ sprintf(buf,"get %s.val",obj);
+ nx_printf(buf);
+ nx_lcd->write(temdat,3);
+ fflush(stdout);
+ while(val_get==0 && time_out<200){//受信割り込みタイムアウトを100msにしているのでそれ以上は待つこと
+ time_out++;
+ wait_ms(10);
+ }
+ if(tp_mask_bak==1){
+ tp_mask=1;//1=タッチパネルマスク
+ }
+ if(time_out>=200){
+ tp_mask=1;//1=タッチパネルマスク
+ return 0xFF;
+ }else{
+ tp_mask=1;//1=タッチパネルマスク
+ return val_st;
+ }
+}
+
+void nx_val_set(char *obj,char cont){
+ char buf[64];
+ unsigned char time_out=0;
+ val_get=0;
+ sprintf(buf,"%s.val=%d",obj,cont);
+ nx_printf(buf);
+ nx_lcd->write(temdat,3);
+ fflush(stdout);
+}
+
+unsigned char nx_val_get_cbox(char no){
+ char buf[64];
+ unsigned long time_out=0;
+ unsigned char tp_mask_bak=tp_mask;
+ if(tp_mask_bak==1){
+ tp_mask=0;//1=タッチパネルマスク解除
+ }
+ val_get=0;
+ sprintf(buf,"get c%d.val",no);
+ nx_printf(buf);
+ nx_lcd->write(temdat,3);
+ fflush(stdout);
+ while(val_get==0 && time_out<200){//受信割り込みタイムアウトを100msにしているのでそれ以上は待つこと
+ time_out++;
+ wait_ms(10);
+ }
+ if(tp_mask_bak==1){
+ tp_mask=1;//1=タッチパネルマスク
+ }
+ if(time_out>=200){
+ return 0xFF;
+ }else{
+ return val_st;
+ }
+}
+unsigned char nx_get(char *obj){
+ char buf[64];
+
+ unsigned char time_out=0;
+ unsigned char tp_mask_bak=tp_mask;
+ if(tp_mask_bak==1){
+ tp_mask=0;//1=タッチパネルマスク解除
+ }
+ val_get=0;
+ val_st=0xFF;
+ buf_clr();
+ sprintf(buf,"get %s",obj);
+ nx_printf(buf);
+ nx_lcd->write(temdat,3);
+ fflush(stdout);
+ while(val_get==0 && time_out<200){//受信割り込みタイムアウトを100msにしているのでそれ以上は待つこと
+ time_out++;
+ wait_ms(1);
+ }
+ if(tp_mask_bak==1){
+ tp_mask=1;//1=タッチパネルマスク
+ }
+ if(time_out>=200){
+ sprintf(lcd_print_buf,"RTC受信不良 cnt=%d",lcd_rx_buf_cnt);
+ lcd_print("t0",lcd_print_buf);
+ for(;;);
+ return 0;
+ }else{
+ return val_st;
+ }
+}
+unsigned char nx_page_get(){
+ char buf[64];
+ unsigned char time_out=0;
+ unsigned char tp_mask_bak=tp_mask;
+ if(tp_mask_bak==1){
+ tp_mask=0;//1=タッチパネルマスク解除
+ }
+ page_get=0;
+ page_st=0xFF;
+ buf_clr();
+ nx_printf("sendme");
+ nx_lcd->write(temdat,3);
+ fflush(stdout);
+
+ while(page_get==0 && time_out<200){//受信割り込みタイムアウトを100msにしているのでそれ以上は待つこと
+ time_out++;
+ wait_ms(10);
+ }
+ if(tp_mask_bak==1){
+ tp_mask=1;//1=タッチパネルマスク解除
+ }
+ if(time_out>=200){
+ printf("page get ng\r\n");
+ fflush(stdout);
+ return 0xFF;
+ }else{
+ //printf("page=%d\r\n",page_st);
+ fflush(stdout);
+ return page_st;
+ }
+}
+
+//LCD I/Fデータ受信割り込み//////
+void nx_lcd_rx () {
+ unsigned char rxsize=nx_lcd->size();
+ char rxdat[8];
+ nx_lcd->read(rxdat,1);
+ lcd_rx_buf[lcd_rx_buf_cnt]=rxdat[0];//マスク中は読み捨て
+ // sprintf(lcd_print_buf,"rxsize=%d\r\n",rxsize);
+ //pc_printf(lcd_print_buf);
+ if(tp_mask==0){//1=タッチパネルマスク
+ lcd_rx_buf_cnt++;
+ ///タイムアウトセット最初のデータ受信から一定時間終端コードがこない場合は、タイムアウト処理する
+ //下記を記載するとos err
+ if(lcd_rx_buf_cnt==1){//1バイト目を受信したらタイムアウトカウンタを起動する。
+ LCD_RX_TIME_OUT.attach(&LCD_RX_TIMEOUT_IRQ,0.2); ////0.1
+ }
+ //バッファオーバーフロー処理////
+ if(lcd_rx_buf_cnt>sizeof(lcd_rx_buf)){
+ buf_clr();
+ }
+ ////終端コード受信時の処理///
+ if(lcd_rx_buf[lcd_rx_buf_cnt-3]==0xFF && lcd_rx_buf[lcd_rx_buf_cnt-2]==0xFF && lcd_rx_buf[lcd_rx_buf_cnt-1]==0xFF){
+ switch (lcd_rx_buf[0]) {
+ ////caseはnextion lcdのSWに割り当てられたidを記載する///
+ case 0x65 : ///通常のボタン押下//
+ touch_p=lcd_rx_buf[1]; //ボタンタッチ時のページ識別ID
+ touch_id=lcd_rx_buf[2]; //タッチボタンのIDを取得
+ touch_t=lcd_rx_buf[3]; //タッチ時か、リリース時かを識別
+ // printf("touch_id=%x\r\n",touch_id);
+ if(page==P_MAIN && touch_id==BT1_PAUSE){//一時停止がおされた場合
+ PAUSE_F=1;//一時停止
+ }
+ if(touch_p !=page){
+ printf("TOUCH PAGE NG!!\r\n");
+ lcd_print("t0","タッチパネル通信異常が発生しました。");
+ ALM_HOLD_SET();
+ }
+ break;
+ case 0x66 : //page取得///
+ page_get=1;
+ page_st=lcd_rx_buf[1];
+ break;
+ case 0x71 : //val取得////
+ val_st=lcd_rx_buf[1];
+ val_get=1;
+ break;
+
+
+ }
+ buf_clr();
+ }
+ if(lcd_rx_buf[lcd_rx_buf_cnt-1]==0x21 &&lcd_rx_buf[lcd_rx_buf_cnt-2]==0x21 && lcd_rx_buf_cnt>=1){
+ lot_edit_chk();
+ }
+ }
+}
+
+
+void nextion_lcd_ini(void){
+ temdat[0]=0xFF;
+ temdat[1]=0xFF;
+ temdat[2]=0xFF;
+
+ dcdat[0]=0x22;
+
+ nx_lcd= new UnbufferedSerial(PA_9,PA_10,115200);//J4
+ //nx_lcd= new UnbufferedSerial(USBTX, USBRX,9600);
+ wait_ms(100);
+ nx_printf("rest");
+ fflush(stdout);
+ nx_lcd->write(temdat,3);
+ fflush(stdout);
+ //wait_ms(1000);
+ //os5では、バッファにデータが残っているとattach時にハング(受信割り込みで復帰)するのでクリア時に読み捨てをいれて対処
+ buf_clr();
+ //シリアル通信の割り込み処理
+ nx_lcd->attach(nx_lcd_rx, SerialBase::RxIrq);
+
+
+
+}
+void lcd_text_color_chg(char *obj,unsigned long color,char wait_set){//(例:lcd_text_color_chg("b0",63488,50);ボタン0のテキストが赤に変わる(緑は2016)
+ char buf[32];
+ sprintf(buf,"%s.pco=%d",obj,color);
+ nx_printf(buf);
+ nx_lcd->write(temdat,3);
+ fflush(stdout);
+ wait_ms(wait_set);
+
+}
+void lcd_bc_color_chg(char *obj,unsigned long color,char wait_set){//(例:lcd_bc_color_chg("b0",63488,50);ボタン0の背景色が赤に変わる(緑は2016)
+ char buf[32];
+ sprintf(buf,"%s.bco=%d",obj,color);
+ nx_printf(buf);
+ nx_lcd->write(temdat,3);
+ fflush(stdout);
+ wait_ms(wait_set);
+
+}
+
+void lcd_print(char *obj,char *txt){
+ float wait_set=0;///2021/05/18 お試し 旧 unsigned char
+ char temdat2[1];
+ temdat2[0]=0x22;
+ char buf[32];
+ unsigned char len = strlen(txt);//文字列の長さを確認
+ //wait_set=len*2;//9600bpsの場合1文字送信時間は1ms程度なので、マージンを取って2倍する。]
+ wait_set=(len*2)/10;/////2021/05/18 お試し 旧 wait_set=len
+
+ sprintf(buf,"%s.txt=",obj);
+ nx_printf(buf);
+ nx_lcd->write(dcdat,1);
+ nx_printf(txt);
+ nx_lcd->write(dcdat,1);
+ nx_lcd->write(temdat,3);
+ fflush(stdout);
+ wait_ms(wait_set);
+ //printf("len=%d wait=%d\r\n",len,wait_set);
+}
+void lcd_print_cb(char *obj,char *txt){
+ float wait_set=0;///2021/05/18 お試し 旧 unsigned char
+ char temdat2[1];
+ temdat2[0]=0x22;
+ char buf[256];
+ unsigned char len = strlen(txt);//文字列の長さを確認
+ //wait_set=len*2;//9600bpsの場合1文字送信時間は1ms程度なので、マージンを取って2倍する。]
+ wait_set=(len*2)/10;/////2021/05/18 お試し 旧 wait_set=len
+
+ sprintf(buf,"%s.path+=",obj);
+ nx_printf(buf);
+ nx_lcd->write(dcdat,1);
+ nx_printf(txt);
+ nx_lcd->write(dcdat,1);
+ nx_lcd->write(temdat,3);
+ fflush(stdout);
+ wait_ms(wait_set);
+ //printf("len=%d wait=%d\r\n",len,wait_set);
+}
+void lcd_page_set_olg(unsigned char page_set,unsigned char wait_set){//(例:lcd_page_set(1,50);//ページ1に切り替わる wait 50ms
+
+ char buf[32];
+ sprintf(buf,"page %d",page_set);
+ nx_printf(buf);
+ nx_lcd->write(temdat,3);
+ fflush(stdout);
+ wait_ms(wait_set);
+
+}
+
+void lcd_page_set(unsigned char page_set,unsigned char wait_set){//(例:lcd_page_set(1,50);//ページ1に切り替わる wait 50ms
+ unsigned char page_set_rt=0;
+ tp_mask=0;//1=タッチパネルマスク page変更時は、強制解除
+ buf_clr();
+ while(page_set_rt<2){
+ lcd_page_set_olg(page_set,wait_set);
+ buf_clr();
+ if(nx_page_get()==page_set){
+ page=page_set;
+ break;
+ }
+ page_set_rt++;
+ }
+ if(page_set_rt>=2){
+ printf("PAGE SET NG\r\n");
+ fflush(stdout);
+ lcd_print("t0","タッチパネル通信異常が発生しました。");
+ ALM_HOLD_SET();
+ }else{
+ //printf("PAGE SET OK\r\n");
+ fflush(stdout);
+ }
+
+}
+void lcd_progressbar(char *obj,unsigned char val,unsigned char wait_set){//(例:lcd_progressbar("j0",50,50);//プログレスバー表示が50になる wait 50ms
+ char buf[32];
+ sprintf(buf,"%s.val=%d",obj,val);
+ nx_printf(buf);
+ nx_lcd->write(temdat,3);
+ wait_ms(wait_set);
+}
+
+void lcd_pic_chg(char *obj,unsigned char val,unsigned char wait_set){//(例:lcd_pic_chg("p0",3,50);//p0の画像指定が3に代わる(画像切り替えができる)wait 50ms
+ char buf[64];
+ sprintf(buf,"%s.pic=%d",obj,val);
+ nx_printf(buf);
+ nx_lcd->write(temdat,3);
+ fflush(stdout);
+ wait_ms(wait_set);
+}
+void nx_dsbt_st_set(char *obj,unsigned char val,unsigned char wait_set){//例:nx_dsbt_st_set("bt0",0,50);dualステートボタンを強制OFF(50ms wait)
+ char buf[64];
+ sprintf(buf,"%s.val=%d",obj,val);
+ nx_printf(buf);
+ nx_lcd->write(temdat,3);
+ fflush(stdout);
+ wait_ms(wait_set);
+}
+void lcd_page_chk(){//(例:lcd_page_chk(); lcdのページ番号を要求
+ unsigned char timeout=0;
+ lcd_page=0;//lcdからページを取得した場合、ページNoが入る
+
+ nx_printf("sendme");
+ nx_lcd->write(temdat,3);
+ fflush(stdout);
+ //////lcd_pageに値が受信割り込みで入るまでwait////
+ while(lcd_page==0 && timeout<30){
+ timeout++;
+ wait_ms(10);
+ }
+}
+void lcd_bt_en(char *obj,unsigned char val,unsigned char wait_set){//(例:lcd_bten(b0,0,50); b0が無効 lcd_bt_en(b0,1,50); b0がゆうこう有効
+ char buf[64];
+ sprintf(buf,"tsw %s,%d",obj,val);
+ nx_printf(buf);
+ nx_lcd->write(temdat,3);
+ fflush(stdout);
+ wait_ms(wait_set);
+}
+void lcd_audio_play(unsigned char id,unsigned char loop,unsigned char wait_set){//(例:lcd_audio_play(0,0,50);//0番のaudioをループ無し再生、コマンドwait 50ms
+ char buf[64];
+ sprintf(buf,"play 0,%d,%d",id,loop);//ch,id,loop
+ nx_printf(buf);
+ nx_lcd->write(temdat,3);
+ fflush(stdout);
+ wait_ms(wait_set);
+}
+
+void lcd_audio_cont(unsigned char val,unsigned char wait_set){//val=0 再生停止 1 resume 2 puse
+ char buf[64];
+ sprintf(buf,"audio0=%d",val);
+ nx_printf(buf);
+ nx_lcd->write(temdat,3);
+ fflush(stdout);
+ wait_ms(wait_set);
+}
+void lcd_audio_vol(unsigned char val,unsigned char wait_set){//val=0から100
+ char buf[64];
+ sprintf(buf,"volume=%d",val);
+ nx_printf(buf);
+ nx_lcd->write(temdat,3);
+ fflush(stdout);
+ wait_ms(wait_set);
+}
+
+void lcd_backlight(unsigned char val){//例 lcd_backlight(50); //明るさがセンターになる。
+ char buf[32];
+ sprintf(buf,"dim=%d",val);
+ nx_printf(buf);
+ nx_lcd->write(temdat,3);
+ fflush(stdout);
+
+}