1109 lines
27 KiB
Arduino
1109 lines
27 KiB
Arduino
|
/*************************************************************************
|
||
|
KD8CEC's uBITX Display Routine for LCD2004 Parrel
|
||
|
1.This is the display code for the default LCD mounted in uBITX.
|
||
|
2.Display related functions of uBITX. Some functions moved from uBITX_Ui.
|
||
|
3.uBITX Idle time Processing
|
||
|
Functions that run at times that do not affect TX, CW, and CAT
|
||
|
It is called in 1/10 time unit.
|
||
|
-----------------------------------------------------------------------------
|
||
|
This program is free software: you can redistribute it and/or modify
|
||
|
it under the terms of the GNU General Public License as published by
|
||
|
the Free Software Foundation, either version 3 of the License, or
|
||
|
(at your option) any later version.
|
||
|
|
||
|
This program is distributed in the hope that it will be useful,
|
||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
GNU General Public License for more details.
|
||
|
|
||
|
You should have received a copy of the GNU General Public License
|
||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
|
|
||
|
**************************************************************************/
|
||
|
#include "ubitx.h"
|
||
|
#include "ubitx_lcd.h"
|
||
|
|
||
|
//========================================================================
|
||
|
//Begin of Nextion LCD Library by KD8CEC
|
||
|
//========================================================================
|
||
|
#ifdef UBITX_DISPLAY_NEXTION
|
||
|
/*************************************************************************
|
||
|
Nextion Library for 20 x 4 LCD
|
||
|
KD8CEC
|
||
|
**************************************************************************/
|
||
|
//#include <SoftwareSerial.h>
|
||
|
//SoftwareSerial softSerial(8, 9); // RX, TX
|
||
|
extern void SWSerial_Begin(long speedBaud);
|
||
|
extern void SWSerial_Write(uint8_t b);
|
||
|
extern int SWSerial_Available(void);
|
||
|
extern int SWSerial_Read(void);
|
||
|
extern void SWSerial_Print(uint8_t *b);
|
||
|
|
||
|
#define TEXT_LINE_LENGTH 20
|
||
|
char softBuffLines[2][TEXT_LINE_LENGTH + 1];
|
||
|
char softBuffSended[2][TEXT_LINE_LENGTH + 1];
|
||
|
char softBuffTemp[TEXT_LINE_LENGTH + 1]; //for STR Command
|
||
|
|
||
|
char c[30], b[30];
|
||
|
char softBuff[20];
|
||
|
char softTemp[20];
|
||
|
|
||
|
void LCD2004_Init()
|
||
|
{
|
||
|
SWSerial_Begin(9600);
|
||
|
memset(softBuffLines[0], ' ', TEXT_LINE_LENGTH);
|
||
|
softBuffLines[0][TEXT_LINE_LENGTH + 1] = 0x00;
|
||
|
memset(softBuffLines[1], ' ', TEXT_LINE_LENGTH);
|
||
|
softBuffLines[1][TEXT_LINE_LENGTH + 1] = 0x00;
|
||
|
}
|
||
|
|
||
|
void LCD_CreateChar(uint8_t location, uint8_t charmap[])
|
||
|
{
|
||
|
}
|
||
|
|
||
|
void LCD_Init(void)
|
||
|
{
|
||
|
LCD2004_Init();
|
||
|
initMeter(); //for Meter Display
|
||
|
}
|
||
|
|
||
|
//===================================================================
|
||
|
//Begin of Nextion LCD Protocol
|
||
|
//
|
||
|
// v0~v9, va~vz : Numeric (Transceiver -> Nextion LCD)
|
||
|
// s0~s9 : String (Text) (Transceiver -> Nextion LCD)
|
||
|
// vlSendxxx, vloxxx: Reserve for Nextion (Nextion LCD -> Transceiver)
|
||
|
//
|
||
|
//===================================================================
|
||
|
#define CMD_NOW_DISP '0' //c0
|
||
|
char L_nowdisp = -1; //Sended nowdisp
|
||
|
|
||
|
#define CMD_VFO_TYPE 'v' //cv
|
||
|
char L_vfoActive; //vfoActive
|
||
|
|
||
|
#define CMD_CURR_FREQ 'c' //vc
|
||
|
unsigned long L_vfoCurr; //vfoA
|
||
|
#define CMD_CURR_MODE 'c' //cc
|
||
|
byte L_vfoCurr_mode; //vfoA_mode
|
||
|
|
||
|
#define CMD_VFOA_FREQ 'a' //va
|
||
|
unsigned long L_vfoA; //vfoA
|
||
|
#define CMD_VFOA_MODE 'a' //ca
|
||
|
byte L_vfoA_mode; //vfoA_mode
|
||
|
|
||
|
#define CMD_VFOB_FREQ 'b' //vb
|
||
|
unsigned long L_vfoB; //vfoB
|
||
|
#define CMD_VFOB_MODE 'b' //cb
|
||
|
byte L_vfoB_mode; //vfoB_mode
|
||
|
|
||
|
#define CMD_IS_RIT 'r' //cr
|
||
|
char L_ritOn;
|
||
|
#define CMD_RIT_FREQ 'r' //vr
|
||
|
unsigned long L_ritTxFrequency; //ritTxFrequency
|
||
|
|
||
|
#define CMD_IS_TX 't' //ct
|
||
|
char L_inTx;
|
||
|
|
||
|
#define CMD_IS_DIALLOCK 'l' //cl
|
||
|
byte L_isDialLock; //byte isDialLock
|
||
|
|
||
|
#define CMD_IS_SPLIT 's' //cs
|
||
|
byte L_Split; //isTxType
|
||
|
#define CMD_IS_TXSTOP 'x' //cx
|
||
|
byte L_TXStop; //isTxType
|
||
|
|
||
|
#define CMD_TUNEINDEX 'n' //cn
|
||
|
byte L_tuneStepIndex; //byte tuneStepIndex
|
||
|
|
||
|
#define CMD_SMETER 'p' //cs
|
||
|
byte L_scaledSMeter; //scaledSMeter
|
||
|
|
||
|
#define CMD_SIDE_TONE 't' //vt
|
||
|
unsigned long L_sideTone; //sideTone
|
||
|
#define CMD_KEY_TYPE 'k' //ck
|
||
|
byte L_cwKeyType; //L_cwKeyType 0: straight, 1 : iambica, 2: iambicb
|
||
|
|
||
|
#define CMD_CW_SPEED 's' //vs
|
||
|
unsigned int L_cwSpeed; //cwSpeed
|
||
|
|
||
|
#define CMD_CW_DELAY 'y' //vy
|
||
|
byte L_cwDelayTime; //cwDelayTime
|
||
|
|
||
|
#define CMD_CW_STARTDELAY 'e' //ve
|
||
|
byte L_delayBeforeCWStartTime; //byte delayBeforeCWStartTime
|
||
|
|
||
|
#define CMD_ATT_LEVEL 'f' //vf
|
||
|
byte L_attLevel;
|
||
|
|
||
|
byte L_isIFShift; //1 = ifShift, 2 extend
|
||
|
#define CMD_IS_IFSHIFT 'i' //ci
|
||
|
|
||
|
int L_ifShiftValue;
|
||
|
#define CMD_IFSHIFT_VALUE 'i' //vi
|
||
|
|
||
|
byte L_sdrModeOn;
|
||
|
#define CMD_SDR_MODE 'j' //cj
|
||
|
|
||
|
#define CMD_UBITX_INFO 'm' //cm Complete Send uBITX Information
|
||
|
|
||
|
//Once Send Data, When boot
|
||
|
//arTuneStep, When boot, once send
|
||
|
//long arTuneStep[5];
|
||
|
#define CMD_AR_TUNE1 '1' //v1
|
||
|
#define CMD_AR_TUNE2 '2' //v2
|
||
|
#define CMD_AR_TUNE3 '3' //v3
|
||
|
#define CMD_AR_TUNE4 '4' //v4
|
||
|
#define CMD_AR_TUNE5 '5' //v5
|
||
|
|
||
|
|
||
|
#define CMD_IS_CW_SHIFT_DISPLAY 'h' //ch
|
||
|
byte L_isShiftDisplayCWFreq; //byte isShiftDisplayCWFreq
|
||
|
|
||
|
#define CMD_CW_SHIFT_ADJUST 'h' //vh
|
||
|
int L_shiftDisplayAdjustVal; //int shiftDisplayAdjustVal
|
||
|
|
||
|
//0:CW Display Shift Confirm, 1 : IFshift save
|
||
|
#define CMD_COMM_OPTION 'o' //vo
|
||
|
byte L_commonOption0; //byte commonOption0
|
||
|
|
||
|
//0:Line Toggle, 1 : Always display Callsign, 2 : scroll display, 3 : s.meter
|
||
|
#define CMD_DISP_OPTION1 'p' //vp
|
||
|
byte L_displayOption1; //byte displayOption1
|
||
|
#define CMD_DISP_OPTION2 'q' //vq
|
||
|
byte L_displayOption2; //byte displayOption2 (Reserve)
|
||
|
|
||
|
#define CMD_TEXT_LINE0 '0' //s0
|
||
|
#define CMD_TEXT_LINE1 '1' //s1
|
||
|
|
||
|
#define CMD_CW_TEXT 'a' //sa
|
||
|
#define CMD_CALLSIGN 'c' //sc
|
||
|
#define CMD_VERSION 'v' //sv
|
||
|
|
||
|
char nowdisp = 0;
|
||
|
|
||
|
#define SWS_HEADER_CHAR_TYPE 'c' //1Byte Protocol Prefix
|
||
|
#define SWS_HEADER_INT_TYPE 'v' //Numeric Protocol Prefex
|
||
|
#define SWS_HEADER_STR_TYPE 's' //for TEXT Line compatiable Character LCD Control
|
||
|
|
||
|
//Control must have prefix 'v' or 's'
|
||
|
char softSTRHeader[14] = {'p', 'a', 'g', 'e', '0', '.', 's', '0', '.', 't', 'x', 't', '=', '\"'};
|
||
|
char softINTHeader[13] = {'p', 'a', 'g', 'e', '0', '.', 'v', '0', '.', 'v', 'a', 'l', '='};
|
||
|
|
||
|
//send data for Nextion LCD
|
||
|
void SendHeader(char varType, char varIndex)
|
||
|
{
|
||
|
if (varType == SWS_HEADER_STR_TYPE)
|
||
|
{
|
||
|
softSTRHeader[7] = varIndex;
|
||
|
for (int i = 0; i < 14; i++)
|
||
|
SWSerial_Write(softSTRHeader[i]);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
softINTHeader[7] = varIndex;
|
||
|
for (int i = 0; i < 13; i++)
|
||
|
SWSerial_Write(softINTHeader[i]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void SendCommandUL(char varIndex, unsigned long sendValue)
|
||
|
{
|
||
|
SendHeader(SWS_HEADER_INT_TYPE, varIndex);
|
||
|
|
||
|
memset(softTemp, 0, 20);
|
||
|
ultoa(sendValue, softTemp, DEC);
|
||
|
SWSerial_Print(softTemp);
|
||
|
SWSerial_Write(0xff);
|
||
|
SWSerial_Write(0xff);
|
||
|
SWSerial_Write(0xff);
|
||
|
}
|
||
|
|
||
|
void SendCommandL(char varIndex, long sendValue)
|
||
|
{
|
||
|
SendHeader(SWS_HEADER_INT_TYPE, varIndex);
|
||
|
|
||
|
memset(softTemp, 0, 20);
|
||
|
ltoa(sendValue, softTemp, DEC);
|
||
|
SWSerial_Print(softTemp);
|
||
|
SWSerial_Write(0xff);
|
||
|
SWSerial_Write(0xff);
|
||
|
SWSerial_Write(0xff);
|
||
|
}
|
||
|
|
||
|
void SendCommandStr(char varIndex, char* sendValue)
|
||
|
{
|
||
|
SendHeader(SWS_HEADER_STR_TYPE, varIndex);
|
||
|
|
||
|
SWSerial_Print(sendValue);
|
||
|
SWSerial_Write('\"');
|
||
|
SWSerial_Write(0xFF);
|
||
|
SWSerial_Write(0xFF);
|
||
|
SWSerial_Write(0xFF);
|
||
|
}
|
||
|
|
||
|
//Send String data with duplicate check
|
||
|
void SendTextLineBuff(char lineNumber)
|
||
|
{
|
||
|
//Check Duplicated data
|
||
|
if (strcmp(softBuffLines[lineNumber], softBuffSended[lineNumber]))
|
||
|
{
|
||
|
SendHeader(SWS_HEADER_STR_TYPE, lineNumber + 0x30); //s0.txt, s1.txt
|
||
|
|
||
|
SWSerial_Print(softBuffLines[lineNumber]);
|
||
|
SWSerial_Write('\"');
|
||
|
SWSerial_Write(0xFF);
|
||
|
SWSerial_Write(0xFF);
|
||
|
SWSerial_Write(0xFF);
|
||
|
|
||
|
strcpy(softBuffSended[lineNumber], softBuffLines[lineNumber]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void SendTextLineStr(char lineNumber, char* sendValue)
|
||
|
{
|
||
|
int i = 0;
|
||
|
for (i = 0; i < 16; i++)
|
||
|
{
|
||
|
if (sendValue[i] == 0x00)
|
||
|
break;
|
||
|
else
|
||
|
softBuffLines[lineNumber][i] = sendValue[i];
|
||
|
}
|
||
|
|
||
|
for (;i < 20; i++)
|
||
|
{
|
||
|
softBuffLines[lineNumber][i] = ' ';
|
||
|
}
|
||
|
|
||
|
softBuffLines[lineNumber][TEXT_LINE_LENGTH + 1] = 0x00;
|
||
|
SendTextLineBuff(lineNumber);
|
||
|
}
|
||
|
|
||
|
void SendEEPromData(char varIndex, int eepromStartIndex, int eepromEndIndex, char offsetTtype)
|
||
|
{
|
||
|
SendHeader(SWS_HEADER_STR_TYPE, varIndex);
|
||
|
|
||
|
for (int i = eepromStartIndex; i <= eepromEndIndex; i++)
|
||
|
{
|
||
|
SWSerial_Write(EEPROM.read((offsetTtype == 0 ? USER_CALLSIGN_DAT : WSPR_MESSAGE1) + i));
|
||
|
}
|
||
|
|
||
|
SWSerial_Write('\"');
|
||
|
SWSerial_Write(0xFF);
|
||
|
SWSerial_Write(0xFF);
|
||
|
SWSerial_Write(0xFF);
|
||
|
}
|
||
|
|
||
|
char softBuff1Num[17] = {'p', 'a', 'g', 'e', '0', '.', 'c', '0', '.', 'v', 'a', 'l', '=', 0, 0xFF, 0xFF, 0xFF};
|
||
|
void SendCommand1Num(char varType, char sendValue) //0~9 : Mode, nowDisp, ActiveVFO, IsDialLock, IsTxtType, IsSplitType
|
||
|
{
|
||
|
softBuff1Num[7] = varType;
|
||
|
softBuff1Num[13] = sendValue + 0x30;
|
||
|
|
||
|
for (int i = 0; i < 17; i++)
|
||
|
SWSerial_Write(softBuff1Num[i]);
|
||
|
}
|
||
|
|
||
|
void SetSWActivePage(char newPageIndex)
|
||
|
{
|
||
|
if (L_nowdisp != newPageIndex)
|
||
|
{
|
||
|
L_nowdisp = newPageIndex;
|
||
|
SendCommand1Num(CMD_NOW_DISP, L_nowdisp);
|
||
|
}
|
||
|
}
|
||
|
//===================================================================
|
||
|
//End of Nextion LCD Protocol
|
||
|
//===================================================================
|
||
|
|
||
|
// The generic routine to display one line on the LCD
|
||
|
void printLine(unsigned char linenmbr, const char *c) {
|
||
|
SendTextLineStr(linenmbr, c);
|
||
|
}
|
||
|
|
||
|
void printLineF(char linenmbr, const __FlashStringHelper *c)
|
||
|
{
|
||
|
int i;
|
||
|
char tmpBuff[21];
|
||
|
PGM_P p = reinterpret_cast<PGM_P>(c);
|
||
|
|
||
|
for (i = 0; i < 21; i++){
|
||
|
unsigned char fChar = pgm_read_byte(p++);
|
||
|
tmpBuff[i] = fChar;
|
||
|
if (fChar == 0)
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
printLine(linenmbr, tmpBuff);
|
||
|
}
|
||
|
|
||
|
#define LCD_MAX_COLUMN 20
|
||
|
void printLineFromEEPRom(char linenmbr, char lcdColumn, byte eepromStartIndex, byte eepromEndIndex, char offsetTtype)
|
||
|
{
|
||
|
int colIndex = lcdColumn;
|
||
|
for (byte i = eepromStartIndex; i <= eepromEndIndex; i++)
|
||
|
{
|
||
|
if (++lcdColumn <= LCD_MAX_COLUMN)
|
||
|
softBuffLines[linenmbr][colIndex++] = EEPROM.read((offsetTtype == 0 ? USER_CALLSIGN_DAT : WSPR_MESSAGE1) + i);
|
||
|
else
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
SendTextLineBuff(linenmbr);
|
||
|
}
|
||
|
|
||
|
// short cut to print to the first line
|
||
|
void printLine1(const char *c)
|
||
|
{
|
||
|
printLine(1,c);
|
||
|
}
|
||
|
// short cut to print to the first line
|
||
|
void printLine2(const char *c)
|
||
|
{
|
||
|
printLine(0,c);
|
||
|
}
|
||
|
|
||
|
void clearLine2()
|
||
|
{
|
||
|
printLine2("");
|
||
|
line2DisplayStatus = 0;
|
||
|
}
|
||
|
|
||
|
// short cut to print to the first line
|
||
|
void printLine1Clear(){
|
||
|
printLine(1,"");
|
||
|
}
|
||
|
// short cut to print to the first line
|
||
|
void printLine2Clear(){
|
||
|
printLine(0, "");
|
||
|
}
|
||
|
|
||
|
void printLine2ClearAndUpdate(){
|
||
|
printLine(0, "");
|
||
|
line2DisplayStatus = 0;
|
||
|
updateDisplay();
|
||
|
}
|
||
|
|
||
|
//==================================================================================
|
||
|
//End of Display Base Routines
|
||
|
//==================================================================================
|
||
|
|
||
|
//==================================================================================
|
||
|
//Begin of User Interface Routines
|
||
|
//==================================================================================
|
||
|
//Main Display for Nextion LCD
|
||
|
//unsigned long
|
||
|
byte nowPageIndex = 0;
|
||
|
|
||
|
//sendType == 1 not check different
|
||
|
void sendUIData(int sendType)
|
||
|
{
|
||
|
char nowActiveVFO = vfoActive == VFO_A ? 0 : 1;
|
||
|
|
||
|
//#define CMD_VFO_TYPE 'v' //cv
|
||
|
if (L_vfoActive != nowActiveVFO)
|
||
|
{
|
||
|
L_vfoActive = nowActiveVFO;
|
||
|
SendCommand1Num(CMD_VFO_TYPE, L_vfoActive);
|
||
|
}
|
||
|
|
||
|
//#define CMD_CURR_FREQ 'c' //vc
|
||
|
if (L_vfoCurr != frequency)
|
||
|
{
|
||
|
L_vfoCurr = frequency;
|
||
|
SendCommandUL(CMD_CURR_FREQ, frequency);
|
||
|
}
|
||
|
|
||
|
//#define CMD_CURR_MODE 'c' //cc
|
||
|
byte vfoCurr_mode = modeToByte();
|
||
|
if (L_vfoCurr_mode != vfoCurr_mode)
|
||
|
{
|
||
|
L_vfoCurr_mode = vfoCurr_mode;
|
||
|
SendCommand1Num(CMD_CURR_MODE, L_vfoCurr_mode);
|
||
|
}
|
||
|
|
||
|
//if auto cw key mode, exit
|
||
|
//if (isCWAutoMode != 0 || menuOn != 0)
|
||
|
if (isCWAutoMode != 0)
|
||
|
return;
|
||
|
|
||
|
//nowPageIndex = 0;
|
||
|
if (menuOn==0)
|
||
|
{
|
||
|
if (sendType == 0)
|
||
|
{
|
||
|
SetSWActivePage(0);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
SetSWActivePage(0);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//Text Line Mode
|
||
|
SetSWActivePage(1);
|
||
|
}
|
||
|
|
||
|
//#define CMD_VFOA_FREQ 'a' //va
|
||
|
//VFOA
|
||
|
if (L_vfoA != vfoA)
|
||
|
{
|
||
|
L_vfoA = vfoA;
|
||
|
SendCommandUL(CMD_VFOA_FREQ, L_vfoA);
|
||
|
}
|
||
|
|
||
|
//#define CMD_VFOA_MODE 'a' //ca
|
||
|
if (L_vfoA_mode != vfoA_mode)
|
||
|
{
|
||
|
L_vfoA_mode = vfoA_mode;
|
||
|
SendCommand1Num(CMD_VFOA_MODE, L_vfoA_mode);
|
||
|
}
|
||
|
|
||
|
//#define CMD_VFOB_FREQ 'b' //vb
|
||
|
//VFOB
|
||
|
if (L_vfoB != vfoB)
|
||
|
{
|
||
|
L_vfoB = vfoB;
|
||
|
SendCommandUL(CMD_VFOB_FREQ, L_vfoB);
|
||
|
}
|
||
|
|
||
|
//#define CMD_VFOB_MODE 'b' //cb
|
||
|
if (L_vfoB_mode != vfoB_mode)
|
||
|
{
|
||
|
L_vfoB_mode = vfoB_mode;
|
||
|
SendCommand1Num(CMD_VFOB_MODE, L_vfoB_mode);
|
||
|
}
|
||
|
|
||
|
//byte isDialLock = ((isTxType & 0x01) == 0x01) ? 1 : 0;
|
||
|
if (L_isDialLock != isDialLock)
|
||
|
{
|
||
|
L_isDialLock = isDialLock;
|
||
|
SendCommand1Num(CMD_IS_DIALLOCK, L_isDialLock);
|
||
|
}
|
||
|
|
||
|
//#define CMD_IS_RIT 'r' //cr
|
||
|
if (L_ritOn != ritOn)
|
||
|
{
|
||
|
L_ritOn = ritOn;
|
||
|
SendCommand1Num(CMD_IS_RIT, L_ritOn);
|
||
|
}
|
||
|
|
||
|
//#define CMD_RIT_FREQ 'r' //vr
|
||
|
//unsigned long L_ritTxFrequency; //ritTxFrequency
|
||
|
if (L_ritTxFrequency != ritTxFrequency)
|
||
|
{
|
||
|
L_ritTxFrequency = ritTxFrequency;
|
||
|
SendCommandUL(CMD_RIT_FREQ, L_ritTxFrequency);
|
||
|
}
|
||
|
|
||
|
//#define CMD_IS_TX 't' //ct
|
||
|
//char L_inTx;
|
||
|
if (L_inTx != inTx)
|
||
|
{
|
||
|
L_inTx = inTx;
|
||
|
SendCommand1Num(CMD_IS_TX, L_inTx);
|
||
|
}
|
||
|
|
||
|
//#define CMD_IS_DIALLOCK 'l' //cl
|
||
|
//byte L_isDialLock; //byte isDialLock
|
||
|
if (L_isDialLock != isDialLock)
|
||
|
{
|
||
|
L_isDialLock = isDialLock;
|
||
|
SendCommand1Num(CMD_IS_DIALLOCK, L_isDialLock);
|
||
|
}
|
||
|
|
||
|
//#define CMD_IS_SPLIT 's' //cs
|
||
|
//byte L_Split; //isTxType
|
||
|
if (L_Split != splitOn)
|
||
|
{
|
||
|
L_Split = splitOn;
|
||
|
SendCommand1Num(CMD_IS_SPLIT, L_Split);
|
||
|
}
|
||
|
|
||
|
|
||
|
//#define CMD_IS_TXSTOP 'x' //cx
|
||
|
byte isTXStop = ((isTxType & 0x01) == 0x01);
|
||
|
if (L_TXStop != isTXStop)
|
||
|
{
|
||
|
L_TXStop = isTXStop;
|
||
|
SendCommand1Num(CMD_IS_TXSTOP, L_TXStop);
|
||
|
}
|
||
|
|
||
|
//#define CMD_TUNEINDEX 'n' //cn
|
||
|
if (L_tuneStepIndex != tuneStepIndex)
|
||
|
{
|
||
|
L_tuneStepIndex = tuneStepIndex;
|
||
|
SendCommand1Num(CMD_TUNEINDEX, L_tuneStepIndex);
|
||
|
}
|
||
|
|
||
|
//#define CMD_SMETER 'p' //cp
|
||
|
if (L_scaledSMeter != scaledSMeter)
|
||
|
{
|
||
|
L_scaledSMeter = scaledSMeter;
|
||
|
SendCommand1Num(CMD_SMETER, L_scaledSMeter);
|
||
|
}
|
||
|
|
||
|
//#define CMD_SIDE_TONE 't' //vt
|
||
|
if (L_sideTone != sideTone)
|
||
|
{
|
||
|
L_sideTone = sideTone;
|
||
|
SendCommandL(CMD_SIDE_TONE, L_sideTone);
|
||
|
}
|
||
|
|
||
|
//#define CMD_KEY_TYPE 'k' //ck
|
||
|
if (L_cwKeyType != cwKeyType)
|
||
|
{
|
||
|
L_cwKeyType = cwKeyType;
|
||
|
SendCommand1Num(CMD_KEY_TYPE, L_cwKeyType);
|
||
|
}
|
||
|
|
||
|
//#define CMD_CW_SPEED 's' //vs
|
||
|
if (L_cwSpeed != cwSpeed)
|
||
|
{
|
||
|
L_cwSpeed = cwSpeed;
|
||
|
SendCommandL(CMD_CW_SPEED, L_cwSpeed);
|
||
|
}
|
||
|
|
||
|
//#define CMD_CW_DELAY 'y' //vy
|
||
|
if (L_cwDelayTime != cwDelayTime)
|
||
|
{
|
||
|
L_cwDelayTime = cwDelayTime;
|
||
|
SendCommandL(CMD_CW_DELAY, L_cwDelayTime);
|
||
|
}
|
||
|
|
||
|
//#define CMD_CW_STARTDELAY 'e' //ve
|
||
|
if (L_delayBeforeCWStartTime != delayBeforeCWStartTime)
|
||
|
{
|
||
|
L_delayBeforeCWStartTime = delayBeforeCWStartTime;
|
||
|
SendCommandL(CMD_CW_STARTDELAY, L_delayBeforeCWStartTime);
|
||
|
}
|
||
|
|
||
|
//#define CMD_ATT_LEVEL 'f' //vf
|
||
|
if (L_attLevel != attLevel)
|
||
|
{
|
||
|
L_attLevel = attLevel;
|
||
|
SendCommandL(CMD_ATT_LEVEL, L_attLevel);
|
||
|
}
|
||
|
|
||
|
//#define CMD_IS_IFSHIFT 'i'
|
||
|
if (L_isIFShift != isIFShift)
|
||
|
{
|
||
|
L_isIFShift = isIFShift;
|
||
|
SendCommand1Num(CMD_IS_IFSHIFT, L_isIFShift);
|
||
|
}
|
||
|
|
||
|
//#define CMD_IFSHIFT_VALUE 'i'
|
||
|
if (L_ifShiftValue != ifShiftValue)
|
||
|
{
|
||
|
L_ifShiftValue = ifShiftValue;
|
||
|
SendCommandL(CMD_IFSHIFT_VALUE, L_ifShiftValue);
|
||
|
}
|
||
|
|
||
|
//#define CMD_SDR_MODE 'j' //cj
|
||
|
if (L_sdrModeOn != sdrModeOn)
|
||
|
{
|
||
|
L_sdrModeOn = sdrModeOn;
|
||
|
SendCommand1Num(CMD_SDR_MODE, L_sdrModeOn);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void updateDisplay() {
|
||
|
//clearLine1();
|
||
|
sendUIData(0); //UI
|
||
|
|
||
|
/*
|
||
|
int i;
|
||
|
unsigned long tmpFreq = frequency; //
|
||
|
|
||
|
memset(c, 0, sizeof(c));
|
||
|
|
||
|
if (inTx){
|
||
|
if (isCWAutoMode == 2) {
|
||
|
for (i = 0; i < 4; i++)
|
||
|
c[3-i] = (i < autoCWSendReservCount ? byteToChar(autoCWSendReserv[i]) : ' ');
|
||
|
|
||
|
//display Sending Index
|
||
|
c[4] = byteToChar(sendingCWTextIndex);
|
||
|
c[5] = '=';
|
||
|
}
|
||
|
else {
|
||
|
if (cwTimeout > 0)
|
||
|
strcpy(c, " CW:");
|
||
|
else
|
||
|
strcpy(c, " TX:");
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
if (ritOn)
|
||
|
strcpy(c, "RIT ");
|
||
|
else {
|
||
|
if (cwMode == 0)
|
||
|
{
|
||
|
if (isUSB)
|
||
|
strcpy(c, "USB ");
|
||
|
else
|
||
|
strcpy(c, "LSB ");
|
||
|
}
|
||
|
else if (cwMode == 1)
|
||
|
{
|
||
|
strcpy(c, "CWL ");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
strcpy(c, "CWU ");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (vfoActive == VFO_A) // VFO A is active
|
||
|
strcat(c, "A:");
|
||
|
else
|
||
|
strcat(c, "B:");
|
||
|
}
|
||
|
|
||
|
//Fixed by Mitani Massaru (JE4SMQ)
|
||
|
if (isShiftDisplayCWFreq == 1)
|
||
|
{
|
||
|
if (cwMode == 1) //CWL
|
||
|
tmpFreq = tmpFreq - sideTone + shiftDisplayAdjustVal;
|
||
|
else if (cwMode == 2) //CWU
|
||
|
tmpFreq = tmpFreq + sideTone + shiftDisplayAdjustVal;
|
||
|
}
|
||
|
|
||
|
//display frequency
|
||
|
for (int i = 15; i >= 6; i--) {
|
||
|
if (tmpFreq > 0) {
|
||
|
if (i == 12 || i == 8) c[i] = '.';
|
||
|
else {
|
||
|
c[i] = tmpFreq % 10 + 0x30;
|
||
|
tmpFreq /= 10;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
c[i] = ' ';
|
||
|
}
|
||
|
|
||
|
if (sdrModeOn)
|
||
|
strcat(c, " SDR");
|
||
|
else
|
||
|
strcat(c, " SPK");
|
||
|
|
||
|
//remarked by KD8CEC
|
||
|
//already RX/TX status display, and over index (20 x 4 LCD)
|
||
|
//if (inTx)
|
||
|
// strcat(c, " TX");
|
||
|
printLine(1, c);
|
||
|
|
||
|
byte diplayVFOLine = 1;
|
||
|
if ((displayOption1 & 0x01) == 0x01)
|
||
|
diplayVFOLine = 0;
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
// tern static uint8_t swr_receive_buffer[20];
|
||
|
extern uint8_t receivedCommandLength;
|
||
|
extern void SWSerial_Read(uint8_t * receive_cmdBuffer);
|
||
|
//extern void byteToMode(byte modeValue, byte autoSetModebyFreq);
|
||
|
uint8_t swr_buffer[20];
|
||
|
|
||
|
#define TS_CMD_MODE 1
|
||
|
#define TS_CMD_FREQ 2
|
||
|
#define TS_CMD_BAND 3
|
||
|
#define TS_CMD_VFO 4
|
||
|
#define TS_CMD_SPLIT 5
|
||
|
#define TS_CMD_RIT 6
|
||
|
#define TS_CMD_TXSTOP 7
|
||
|
#define TS_CMD_SDR 8
|
||
|
#define TS_CMD_LOCK 9 //Dial Lock
|
||
|
#define TS_CMD_ATT 10 //ATT
|
||
|
#define TS_CMD_IFS 11 //IFS Enabled
|
||
|
#define TS_CMD_IFSVALUE 12 //IFS VALUE
|
||
|
|
||
|
//SoftwareSerial_Process
|
||
|
void SWS_Process(void)
|
||
|
{
|
||
|
//Received Command from touch screen
|
||
|
if (receivedCommandLength > 0)
|
||
|
{
|
||
|
SWSerial_Read(swr_buffer);
|
||
|
|
||
|
int8_t comandLength = receivedCommandLength;
|
||
|
int8_t commandStartIndex = -1;
|
||
|
receivedCommandLength = 0;
|
||
|
|
||
|
//Data Process
|
||
|
//comandLength //Find start Length
|
||
|
for (int i = 0; i < comandLength - 3; i++)
|
||
|
{
|
||
|
if (swr_buffer[i] == 0x59 && swr_buffer[i+ 1] == 0x58 && swr_buffer[i + 2] == 0x68)
|
||
|
{
|
||
|
commandStartIndex = i;
|
||
|
break;
|
||
|
}
|
||
|
} //end of for
|
||
|
|
||
|
if (commandStartIndex != -1)
|
||
|
{
|
||
|
//Complete received command from touch screen
|
||
|
uint8_t commandType = swr_buffer[commandStartIndex + 3];
|
||
|
|
||
|
/*
|
||
|
#define TS_CMD_MODE 1
|
||
|
#define TS_CMD_FREQ 2
|
||
|
#define TS_CMD_BAND 3
|
||
|
*/
|
||
|
#define TS_CMD_BAND 3
|
||
|
|
||
|
if (commandType == TS_CMD_MODE)
|
||
|
{
|
||
|
byteToMode(swr_buffer[commandStartIndex + 4], 1);
|
||
|
}
|
||
|
else if (commandType == TS_CMD_FREQ)
|
||
|
{
|
||
|
unsigned long *tempFreq;
|
||
|
tempFreq = (unsigned long *)(&swr_buffer[commandStartIndex + 4]);
|
||
|
frequency = *tempFreq;
|
||
|
}
|
||
|
else if (commandType == TS_CMD_BAND)
|
||
|
{
|
||
|
char currentBandIndex = -1;
|
||
|
if (tuneTXType == 2 || tuneTXType == 3 || tuneTXType == 102 || tuneTXType == 103) { //only ham band move
|
||
|
currentBandIndex = getIndexHambanBbyFreq(frequency);
|
||
|
|
||
|
if (currentBandIndex >= 0) {
|
||
|
saveBandFreqByIndex(frequency, modeToByte(), currentBandIndex);
|
||
|
}
|
||
|
}
|
||
|
setNextHamBandFreq(frequency, swr_buffer[commandStartIndex + 4] == 1 ? -1 : 1); //Prior Band
|
||
|
}
|
||
|
else if (commandType == TS_CMD_VFO)
|
||
|
{
|
||
|
menuVfoToggle(1); //Vfo Toggle
|
||
|
}
|
||
|
else if (commandType == TS_CMD_SPLIT)
|
||
|
{
|
||
|
menuSplitOnOff(1);
|
||
|
}
|
||
|
else if (commandType == TS_CMD_RIT)
|
||
|
{
|
||
|
menuRitToggle(1);
|
||
|
}
|
||
|
else if (commandType == TS_CMD_TXSTOP)
|
||
|
{
|
||
|
menuTxOnOff(1, 0x01);
|
||
|
}
|
||
|
else if (commandType == TS_CMD_SDR)
|
||
|
{
|
||
|
menuSDROnOff(1);
|
||
|
}
|
||
|
else if (commandType == TS_CMD_LOCK)
|
||
|
{
|
||
|
if (vfoActive == VFO_A)
|
||
|
setDialLock((isDialLock & 0x01) == 0x01 ? 0 : 1, 0); //Reverse Dial lock
|
||
|
else
|
||
|
setDialLock((isDialLock & 0x02) == 0x02 ? 0 : 1, 0); //Reverse Dial lock
|
||
|
}
|
||
|
else if (commandType == TS_CMD_ATT)
|
||
|
{
|
||
|
attLevel = swr_buffer[commandStartIndex + 4];
|
||
|
}
|
||
|
else if (commandType == TS_CMD_IFS)
|
||
|
{
|
||
|
isIFShift = isIFShift ? 0 : 1; //Toggle
|
||
|
}
|
||
|
else if (commandType == TS_CMD_IFSVALUE)
|
||
|
{
|
||
|
ifShiftValue = *(long *)(&swr_buffer[commandStartIndex + 4]);
|
||
|
}
|
||
|
|
||
|
setFrequency(frequency);
|
||
|
SetCarrierFreq();
|
||
|
updateDisplay();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void updateLine2Buffer(char displayType)
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
char line2Buffer[20];
|
||
|
//KD8CEC 200Hz ST
|
||
|
//L14.150 200Hz ST
|
||
|
//U14.150 +150khz
|
||
|
int freqScrollPosition = 0;
|
||
|
|
||
|
//Example Line2 Optinal Display
|
||
|
//immediate execution, not call by scheulder
|
||
|
//warning : unused parameter 'displayType' <-- ignore, this is reserve
|
||
|
void updateLine2Buffer(char displayType)
|
||
|
{
|
||
|
return;
|
||
|
unsigned long tmpFreq = 0;
|
||
|
if (ritOn)
|
||
|
{
|
||
|
strcpy(line2Buffer, "RitTX:");
|
||
|
|
||
|
//display frequency
|
||
|
tmpFreq = ritTxFrequency;
|
||
|
|
||
|
//Fixed by Mitani Massaru (JE4SMQ)
|
||
|
if (isShiftDisplayCWFreq == 1)
|
||
|
{
|
||
|
if (cwMode == 1) //CWL
|
||
|
tmpFreq = tmpFreq - sideTone + shiftDisplayAdjustVal;
|
||
|
else if (cwMode == 2) //CWU
|
||
|
tmpFreq = tmpFreq + sideTone + shiftDisplayAdjustVal;
|
||
|
}
|
||
|
|
||
|
for (int i = 15; i >= 6; i--) {
|
||
|
if (tmpFreq > 0) {
|
||
|
if (i == 12 || i == 8) line2Buffer[i] = '.';
|
||
|
else {
|
||
|
line2Buffer[i] = tmpFreq % 10 + 0x30;
|
||
|
tmpFreq /= 10;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
line2Buffer[i] = ' ';
|
||
|
}
|
||
|
|
||
|
return;
|
||
|
} //end of ritOn display
|
||
|
|
||
|
//other VFO display
|
||
|
if (vfoActive == VFO_B)
|
||
|
{
|
||
|
tmpFreq = vfoA;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
tmpFreq = vfoB;
|
||
|
}
|
||
|
|
||
|
// EXAMPLE 1 & 2
|
||
|
//U14.150.100
|
||
|
//display frequency
|
||
|
for (int i = 9; i >= 0; i--) {
|
||
|
if (tmpFreq > 0) {
|
||
|
if (i == 2 || i == 6) line2Buffer[i] = '.';
|
||
|
else {
|
||
|
line2Buffer[i] = tmpFreq % 10 + 0x30;
|
||
|
tmpFreq /= 10;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
line2Buffer[i] = ' ';
|
||
|
}
|
||
|
|
||
|
memset(&line2Buffer[10], ' ', 10);
|
||
|
|
||
|
if (isIFShift)
|
||
|
{
|
||
|
line2Buffer[6] = 'M';
|
||
|
line2Buffer[7] = ' ';
|
||
|
//IFShift Offset Value
|
||
|
line2Buffer[8] = 'I';
|
||
|
line2Buffer[9] = 'F';
|
||
|
|
||
|
line2Buffer[10] = ifShiftValue >= 0 ? '+' : 0;
|
||
|
line2Buffer[11] = 0;
|
||
|
line2Buffer[12] = ' ';
|
||
|
|
||
|
//11, 12, 13, 14, 15
|
||
|
memset(b, 0, sizeof(b));
|
||
|
ltoa(ifShiftValue, b, DEC);
|
||
|
strncat(line2Buffer, b, 5);
|
||
|
|
||
|
for (int i = 12; i < 17; i++)
|
||
|
{
|
||
|
if (line2Buffer[i] == 0)
|
||
|
line2Buffer[i] = ' ';
|
||
|
}
|
||
|
} // end of display IF
|
||
|
else // step & Key Type display
|
||
|
{
|
||
|
//Step
|
||
|
long tmpStep = arTuneStep[tuneStepIndex -1];
|
||
|
|
||
|
byte isStepKhz = 0;
|
||
|
if (tmpStep >= 1000)
|
||
|
{
|
||
|
isStepKhz = 2;
|
||
|
}
|
||
|
|
||
|
for (int i = 14; i >= 12 - isStepKhz; i--) {
|
||
|
if (tmpStep > 0) {
|
||
|
line2Buffer[i + isStepKhz] = tmpStep % 10 + 0x30;
|
||
|
tmpStep /= 10;
|
||
|
}
|
||
|
else
|
||
|
line2Buffer[i +isStepKhz] = ' ';
|
||
|
}
|
||
|
|
||
|
if (isStepKhz == 0)
|
||
|
{
|
||
|
line2Buffer[15] = 'H';
|
||
|
line2Buffer[16] = 'z';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
line2Buffer[17] = ' ';
|
||
|
|
||
|
//Check CW Key cwKeyType = 0; //0: straight, 1 : iambica, 2: iambicb
|
||
|
if (cwKeyType == 0)
|
||
|
{
|
||
|
line2Buffer[18] = 'S';
|
||
|
line2Buffer[19] = 'T';
|
||
|
}
|
||
|
else if (cwKeyType == 1)
|
||
|
{
|
||
|
line2Buffer[18] = 'I';
|
||
|
line2Buffer[19] = 'A';
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
line2Buffer[18] = 'I';
|
||
|
line2Buffer[19] = 'B';
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
*/
|
||
|
|
||
|
char checkCount = 0;
|
||
|
char checkCountSMeter = 0;
|
||
|
|
||
|
//execute interval : 0.25sec
|
||
|
void idle_process()
|
||
|
{
|
||
|
sendUIData(1);
|
||
|
|
||
|
//S-Meter Display
|
||
|
if (((displayOption1 & 0x08) == 0x08 && (sdrModeOn == 0)) && (++checkCountSMeter > SMeterLatency))
|
||
|
{
|
||
|
int newSMeter;
|
||
|
|
||
|
//VK2ETA S-Meter from MAX9814 TC pin
|
||
|
newSMeter = analogRead(ANALOG_SMETER) / 4;
|
||
|
|
||
|
//Faster attack, Slower release
|
||
|
//currentSMeter = (newSMeter > currentSMeter ? ((currentSMeter * 3 + newSMeter * 7) + 5) / 10 : ((currentSMeter * 7 + newSMeter * 3) + 5) / 10);
|
||
|
//currentSMeter = ((currentSMeter * 7 + newSMeter * 3) + 5) / 10;
|
||
|
currentSMeter = newSMeter;
|
||
|
|
||
|
scaledSMeter = 0;
|
||
|
for (byte s = 8; s >= 1; s--) {
|
||
|
if (currentSMeter > sMeterLevels[s]) {
|
||
|
scaledSMeter = s;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
checkCountSMeter = 0; //Reset Latency time
|
||
|
} //end of S-Meter
|
||
|
|
||
|
/*
|
||
|
return;
|
||
|
//space for user graphic display
|
||
|
if (menuOn == 0)
|
||
|
{
|
||
|
if ((displayOption1 & 0x10) == 0x10) //always empty topline
|
||
|
return;
|
||
|
|
||
|
//if line2DisplayStatus == 0 <-- this condition is clear Line, you can display any message
|
||
|
if (line2DisplayStatus == 0 || (((displayOption1 & 0x04) == 0x04) && line2DisplayStatus == 2)) {
|
||
|
if (checkCount++ > 1)
|
||
|
{
|
||
|
updateLine2Buffer(0); //call by scheduler
|
||
|
printLine2(line2Buffer);
|
||
|
line2DisplayStatus = 2;
|
||
|
checkCount = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//S-Meter Display
|
||
|
if (((displayOption1 & 0x08) == 0x08 && (sdrModeOn == 0)) && (++checkCountSMeter > SMeterLatency))
|
||
|
{
|
||
|
int newSMeter;
|
||
|
|
||
|
//VK2ETA S-Meter from MAX9814 TC pin
|
||
|
newSMeter = analogRead(ANALOG_SMETER) / 4;
|
||
|
|
||
|
//Faster attack, Slower release
|
||
|
//currentSMeter = (newSMeter > currentSMeter ? ((currentSMeter * 3 + newSMeter * 7) + 5) / 10 : ((currentSMeter * 7 + newSMeter * 3) + 5) / 10);
|
||
|
//currentSMeter = ((currentSMeter * 7 + newSMeter * 3) + 5) / 10;
|
||
|
currentSMeter = newSMeter;
|
||
|
|
||
|
scaledSMeter = 0;
|
||
|
for (byte s = 8; s >= 1; s--) {
|
||
|
if (currentSMeter > sMeterLevels[s]) {
|
||
|
scaledSMeter = s;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
checkCountSMeter = 0; //Reset Latency time
|
||
|
} //end of S-Meter
|
||
|
}
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
//When boot time, send data
|
||
|
void SendUbitxData(void)
|
||
|
{
|
||
|
SendCommandL(CMD_AR_TUNE1, arTuneStep[0]);
|
||
|
SendCommandL(CMD_AR_TUNE2, arTuneStep[1]);
|
||
|
SendCommandL(CMD_AR_TUNE3, arTuneStep[2]);
|
||
|
SendCommandL(CMD_AR_TUNE4, arTuneStep[3]);
|
||
|
SendCommandL(CMD_AR_TUNE5, arTuneStep[4]);
|
||
|
|
||
|
SendCommandL(CMD_IS_CW_SHIFT_DISPLAY, isShiftDisplayCWFreq);
|
||
|
SendCommandL(CMD_CW_SHIFT_ADJUST, shiftDisplayAdjustVal);
|
||
|
SendCommandL(CMD_COMM_OPTION, commonOption0);
|
||
|
SendCommandL(CMD_DISP_OPTION1, displayOption1);
|
||
|
SendCommandL(CMD_DISP_OPTION2, displayOption2);
|
||
|
|
||
|
SendCommandStr(CMD_VERSION, "+v1.0N1"); //Version
|
||
|
SendEEPromData(CMD_CALLSIGN, 0, userCallsignLength -1, 0);
|
||
|
|
||
|
//Complte Send Info
|
||
|
SendCommand1Num(CMD_UBITX_INFO, 1);
|
||
|
|
||
|
//Page Init
|
||
|
L_nowdisp = 0;
|
||
|
SendCommand1Num(CMD_NOW_DISP, L_nowdisp);
|
||
|
}
|
||
|
|
||
|
|
||
|
//AutoKey LCD Display Routine
|
||
|
void Display_AutoKeyTextIndex(byte textIndex)
|
||
|
{
|
||
|
byte diplayAutoCWLine = 0;
|
||
|
|
||
|
if ((displayOption1 & 0x01) == 0x01)
|
||
|
diplayAutoCWLine = 1;
|
||
|
//LCD_SetCursor(0, diplayAutoCWLine);
|
||
|
|
||
|
softBuffLines[diplayAutoCWLine][0] = byteToChar(textIndex);
|
||
|
softBuffLines[diplayAutoCWLine][1] = ':';
|
||
|
|
||
|
SendTextLineBuff(diplayAutoCWLine);
|
||
|
//LCD_Write(byteToChar(textIndex));
|
||
|
//LCD_Write(':');
|
||
|
}
|
||
|
|
||
|
//not use with Nextion LCD
|
||
|
void DisplayCallsign(byte callSignLength)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
//Not use with Nextion LCD
|
||
|
void DisplayVersionInfo(const __FlashStringHelper * fwVersionInfo)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
#endif
|