modified protocol for nextion lcd

This commit is contained in:
phdlee 2018-06-09 18:26:11 +09:00
parent e81413fa02
commit 72ccd3b0e4
3 changed files with 40 additions and 352 deletions

View File

@ -1,4 +1,5 @@
/*
Softserial for Nextion LCD and Control MCU
KD8CEC, Ian Lee
-----------------------------------------------------------------------
It is a library rewritten in C format based on SoftwareSerial.c.
@ -253,26 +254,6 @@ void SWSerial_Read(uint8_t * receive_cmdBuffer)
receive_cmdBuffer[i] = swr_receive_buffer[i];
}
/*
int SWSerial_Read(void)
{
// Empty buffer?
if (_receive_buffer_head == _receive_buffer_tail)
return -1;
// Read from "head"
uint8_t d = _receive_buffer[_receive_buffer_head]; // grab next byte
_receive_buffer_head = (_receive_buffer_head + 1) % _SS_MAX_RX_BUFF;
return d;
}
int SWSerial_Available(void)
{
return (_receive_buffer_tail + _SS_MAX_RX_BUFF - _receive_buffer_head) % _SS_MAX_RX_BUFF;
}
*/
void SWSerial_Write(uint8_t b)
{
volatile uint8_t *reg = _transmitPortRegister;
@ -348,7 +329,5 @@ void SWSerial_Begin(long speedBaud)
}
//Start Listen
//_buffer_overflow = false;
//_receive_buffer_head = _receive_buffer_tail = 0;
setRxIntMsk(true);
}

View File

@ -58,8 +58,10 @@ extern byte I2C_LCD_SECOND_ADDRESS; //only using Dual LCD Mode
#ifdef UBITX_DISPLAY_NEXTION
#define USE_SW_SERIAL
#undef ENABLE_ADCMONITOR
#elif defined(UBITX_CONTROL_MCU)
#define USE_SW_SERIAL
#undef ENABLE_ADCMONITOR
#endif
//==============================================================================

View File

@ -1,10 +1,5 @@
/*************************************************************************
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.
KD8CEC's uBITX Display Routine for Nextion LCD
-----------------------------------------------------------------------------
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
@ -28,11 +23,9 @@
//========================================================================
#ifdef UBITX_DISPLAY_NEXTION
/*************************************************************************
Nextion Library for 20 x 4 LCD
Nextion Library for uBItX
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);
@ -57,10 +50,6 @@ void LCD2004_Init()
softBuffLines[1][TEXT_LINE_LENGTH + 1] = 0x00;
}
void LCD_CreateChar(uint8_t location, uint8_t charmap[])
{
}
void LCD_Init(void)
{
LCD2004_Init();
@ -179,6 +168,19 @@ byte L_displayOption2; //byte displayOption2 (Reserve)
#define CMD_CALLSIGN 'c' //sc
#define CMD_VERSION 'v' //sv
#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
char nowdisp = 0;
#define SWS_HEADER_CHAR_TYPE 'c' //1Byte Protocol Prefix
@ -186,22 +188,22 @@ char nowdisp = 0;
#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', '='};
char softSTRHeader[11] = {'p', 'm', '.', 's', '0', '.', 't', 'x', 't', '=', '\"'};
char softINTHeader[10] = {'p', 'm', '.', '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++)
softSTRHeader[4] = varIndex;
for (int i = 0; i < 11; i++)
SWSerial_Write(softSTRHeader[i]);
}
else
{
softINTHeader[7] = varIndex;
for (int i = 0; i < 13; i++)
softINTHeader[4] = varIndex;
for (int i = 0; i < 10; i++)
SWSerial_Write(softINTHeader[i]);
}
}
@ -294,13 +296,13 @@ void SendEEPromData(char varIndex, int eepromStartIndex, int eepromEndIndex, cha
SWSerial_Write(0xFF);
}
char softBuff1Num[17] = {'p', 'a', 'g', 'e', '0', '.', 'c', '0', '.', 'v', 'a', 'l', '=', 0, 0xFF, 0xFF, 0xFF};
char softBuff1Num[14] = {'p', 'm', '.', '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;
softBuff1Num[4] = varType;
softBuff1Num[10] = sendValue + 0x30;
for (int i = 0; i < 17; i++)
for (int i = 0; i < 14; i++)
SWSerial_Write(softBuff1Num[i]);
}
@ -609,95 +611,7 @@ void sendUIData(int sendType)
}
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];
@ -706,19 +620,6 @@ 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)
{
@ -747,13 +648,6 @@ void SWS_Process(void)
//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);
@ -767,10 +661,12 @@ void SWS_Process(void)
else if (commandType == TS_CMD_BAND)
{
char currentBandIndex = -1;
if (tuneTXType == 2 || tuneTXType == 3 || tuneTXType == 102 || tuneTXType == 103) { //only ham band move
if (tuneTXType == 2 || tuneTXType == 3 || tuneTXType == 102 || tuneTXType == 103)
{ //only ham band move
currentBandIndex = getIndexHambanBbyFreq(frequency);
if (currentBandIndex >= 0) {
if (currentBandIndex >= 0)
{
saveBandFreqByIndex(frequency, modeToByte(), currentBandIndex);
}
}
@ -823,156 +719,6 @@ void SWS_Process(void)
}
}
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;
@ -1004,51 +750,6 @@ void idle_process()
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
@ -1091,8 +792,14 @@ void Display_AutoKeyTextIndex(byte textIndex)
softBuffLines[diplayAutoCWLine][1] = ':';
SendTextLineBuff(diplayAutoCWLine);
//LCD_Write(byteToChar(textIndex));
//LCD_Write(':');
}
void LCD_CreateChar(uint8_t location, uint8_t charmap[])
{
}
void updateLine2Buffer(char displayType)
{
}
//not use with Nextion LCD