Modfied SMeter and CAT

This commit is contained in:
phdlee 2018-05-03 16:20:09 +09:00
parent e961cd8ac9
commit 12984486a6
8 changed files with 100 additions and 112 deletions

27
VersionInfo.txt Normal file
View File

@ -0,0 +1,27 @@
This file will guide you to change the source code file.
For Windows-based Arduino IDE users, the directory name and the Main source file name must be the same.
You do not need to learn github to download .hex files or source code that I release.
However, if you want to see what I'm doing right now, you should use the github homepage.
You do not need to learn git to suggest source code. If you give me an e-mail, I will correct it at any time.
If you have not joined the BITX Group, join group. There will be discussions on various topics every day.
I am getting a lot of hints from the group.
Ian KD8CEC
kd8cec@gmail.com
==================================================================
Files modified in Version1.074 Beta
1.Delted Files.
2.Added Files
3.Modified Files
- ubitx_20.ino
- ubitx_ui.ino
- cat_libs.ino
- ubitx.h
- ubitx_eemap.h

View File

@ -31,8 +31,8 @@
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
**************************************************************************/ **************************************************************************/
#define printLineF1(x) (printLineF(1, x))
#define printLineF2(x) (printLineF(0, x)) #include "ubitx.h"
//for broken protocol //for broken protocol
#define CAT_RECEIVE_TIMEOUT 500 #define CAT_RECEIVE_TIMEOUT 500
@ -654,7 +654,7 @@ void SetIFSValue(void)
//void CatRxStatus(byte fromType) //void CatRxStatus(byte fromType)
void CatRxStatus(void) //for remove warning void CatRxStatus(void) //for remove warning
{ {
byte sMeterValue = 1; byte sMeterValue = 0;
/* /*
http://www.ka7oei.com/ft817_meow.html http://www.ka7oei.com/ft817_meow.html
@ -667,6 +667,33 @@ void CatRxStatus(void) //for remove warning
Bit 7 is 0 if there is a signal present, or 1 if the receiver is squelched. Bit 7 is 0 if there is a signal present, or 1 if the receiver is squelched.
*/ */
// The lower 4 bits (0-3) of this byte indicate the current S-meter reading. 00 refers to an S-Zero reading, 04 = S4, 09 = S9, 0A = "10 over," 0B = "20 over" and so on up to 0F. // The lower 4 bits (0-3) of this byte indicate the current S-meter reading. 00 refers to an S-Zero reading, 04 = S4, 09 = S9, 0A = "10 over," 0B = "20 over" and so on up to 0F.
//0~8
switch (scaledSMeter)
{
case 8 : sMeterValue = 0x0B;
break;
case 7 : sMeterValue = 0x0A;
break;
case 6 : sMeterValue = 0x09;
break;
case 5 : sMeterValue = 0x07;
break;
case 4 : sMeterValue = 0x05;
break;
case 3 : sMeterValue = 0x04;
break;
case 2 : sMeterValue = 0x02;
break;
case 1 : sMeterValue = 0x01;
break;
}
/*
sMeterValue = (scaledSMeter * 2) -1;
if (sMeterValue > 0)
sMeterValue--;
*/
CAT_BUFF[0] = sMeterValue & 0b00001111; CAT_BUFF[0] = sMeterValue & 0b00001111;
SendCatData(1); SendCatData(1);
} }

View File

@ -36,8 +36,8 @@
#define EXTEND_KEY_GROUP1 //MODE, BAND(-), BAND(+), STEP #define EXTEND_KEY_GROUP1 //MODE, BAND(-), BAND(+), STEP
//#define EXTEND_KEY_GROUP2 //Numeric (0~9), Point(.), Enter //Not supported in Version 1.0x //#define EXTEND_KEY_GROUP2 //Numeric (0~9), Point(.), Enter //Not supported in Version 1.0x
#define ENABLE_FACTORYALIGN //#define ENABLE_FACTORYALIGN
//#define ENABLE_ADCMONITOR //Starting with Version 1.07, you can read ADC values directly from uBITX Manager. So this function is not necessary. #define ENABLE_ADCMONITOR //Starting with Version 1.07, you can read ADC values directly from uBITX Manager. So this function is not necessary.
extern byte I2C_LCD_MASTER_ADDRESS; //0x27 //if Set I2C Address by uBITX Manager, read from EEProm extern byte I2C_LCD_MASTER_ADDRESS; //0x27 //if Set I2C Address by uBITX Manager, read from EEProm
extern byte I2C_LCD_SECOND_ADDRESS; //only using Dual LCD Mode extern byte I2C_LCD_SECOND_ADDRESS; //only using Dual LCD Mode
@ -149,6 +149,9 @@ extern byte I2C_LCD_SECOND_ADDRESS; //only using Dual LCD Mode
extern unsigned long frequency; extern unsigned long frequency;
extern byte WsprMSGCount; extern byte WsprMSGCount;
extern byte sMeterLevels[9]; extern byte sMeterLevels[9];
extern int currentSMeter; //ADC Value for S.Meter
extern byte scaledSMeter; //Calculated S.Meter Level
extern byte KeyValues[16][3]; //Set : Start Value, End Value, Key Type, 16 Set (3 * 16 = 48) extern byte KeyValues[16][3]; //Set : Start Value, End Value, Key Type, 16 Set (3 * 16 = 48)
extern void printLine1(const char *c); extern void printLine1(const char *c);

View File

@ -6,7 +6,7 @@
// So I put + in the sense that it was improved one by one based on Original Firmware. // So I put + in the sense that it was improved one by one based on Original Firmware.
// This firmware has been gradually changed based on the original firmware created by Farhan, Jack, Jerry and others. // This firmware has been gradually changed based on the original firmware created by Farhan, Jack, Jerry and others.
#define FIRMWARE_VERSION_INFO F("+v1.073") #define FIRMWARE_VERSION_INFO F("+v1.074")
#define FIRMWARE_VERSION_NUM 0x02 //1st Complete Project : 1 (Version 1.061), 2st Project : 2 #define FIRMWARE_VERSION_NUM 0x02 //1st Complete Project : 1 (Version 1.061), 2st Project : 2
/** /**
@ -182,6 +182,10 @@ byte line2DisplayStatus = 0; //0:Clear, 1 : menu, 1: DisplayFrom Idle,
char lcdMeter[17]; char lcdMeter[17];
byte sMeterLevels[9]; byte sMeterLevels[9];
//Current ADC Value for S.Meter, and S Meter Level
int currentSMeter = 0;
byte scaledSMeter = 0;
byte I2C_LCD_MASTER_ADDRESS; //0x27 //if Set I2C Address by uBITX Manager, read from EEProm byte I2C_LCD_MASTER_ADDRESS; //0x27 //if Set I2C Address by uBITX Manager, read from EEProm
byte I2C_LCD_SECOND_ADDRESS; //only using Dual LCD Mode byte I2C_LCD_SECOND_ADDRESS; //only using Dual LCD Mode

View File

@ -708,19 +708,15 @@ void DisplayMeter(byte meterType, byte meterValue, char drawPosition)
LCD_SetCursor(drawPosition, lineNumber); LCD_SetCursor(drawPosition, lineNumber);
//for (int i = 0; i <26; i++) //meter 5 + +db 1 = 6
LCD_Write(lcdMeter[0]); LCD_Write(lcdMeter[0]);
LCD_Write(lcdMeter[1]); LCD_Write(lcdMeter[1]);
LCD_Write(lcdMeter[2]);
} }
} }
byte testValue = 0;
char checkCount = 0; char checkCount = 0;
char checkCountSMeter = 0; char checkCountSMeter = 0;
int currentSMeter = 0;
byte scaledSMeter = 0;
void idle_process() void idle_process()
{ {
//space for user graphic display //space for user graphic display
@ -740,23 +736,17 @@ void idle_process()
} }
} }
//EX for Meters
/*
DisplayMeter(0, testValue++, 7);
if (testValue > 30)
testValue = 0;
*/
//S-Meter Display //S-Meter Display
if (((displayOption1 & 0x08) == 0x08 && (sdrModeOn == 0)) && (++checkCountSMeter > SMeterLatency)) if (((displayOption1 & 0x08) == 0x08 && (sdrModeOn == 0)) && (++checkCountSMeter > SMeterLatency))
{ {
int newSMeter; int newSMeter;
//VK2ETA S-Meter from MAX9814 TC pin / divide 4 by KD8CEC for reduce EEPromSize //VK2ETA S-Meter from MAX9814 TC pin / divide 4 by KD8CEC for reduce EEPromSize
newSMeter = analogRead(ANALOG_SMETER); newSMeter = analogRead(ANALOG_SMETER) / 4;
//Faster attack, Slower release //Faster attack, Slower release
currentSMeter = (newSMeter > currentSMeter ? ((currentSMeter * 3 + newSMeter * 7) + 5) / 10 : ((currentSMeter * 7 + newSMeter * 3) + 5) / 10) / 4; //currentSMeter = (newSMeter > currentSMeter ? ((currentSMeter * 3 + newSMeter * 7) + 5) / 10 : ((currentSMeter * 7 + newSMeter * 3) + 5) / 10) / 4;
currentSMeter = newSMeter;
scaledSMeter = 0; scaledSMeter = 0;
for (byte s = 8; s >= 1; s--) { for (byte s = 8; s >= 1; s--) {
@ -766,7 +756,7 @@ void idle_process()
} }
} }
DisplayMeter(0, scaledSMeter, 14); DisplayMeter(0, scaledSMeter, 13);
checkCountSMeter = 0; //Reset Latency time checkCountSMeter = 0; //Reset Latency time
} //end of S-Meter } //end of S-Meter

View File

@ -583,17 +583,13 @@ void DisplayMeter(byte meterType, byte meterValue, char drawPosition)
LCD_Write('S'); LCD_Write('S');
LCD_Write(':'); LCD_Write(':');
for (int i = 0; i < 6; i++) //meter 5 + +db 1 = 6 for (int i = 0; i < 7; i++)
LCD_Write(lcdMeter[i]); LCD_Write(lcdMeter[i]);
} }
} }
byte testValue = 0;
char checkCount = 0; char checkCount = 0;
int currentSMeter = 0;
byte scaledSMeter = 0;
char checkCountSMeter = 0; char checkCountSMeter = 0;
char beforeKeyType = -1; char beforeKeyType = -1;
@ -676,12 +672,13 @@ void idle_process()
int newSMeter; int newSMeter;
displaySDRON = 0; displaySDRON = 0;
//VK2ETA S-Meter from MAX9814 TC pin //VK2ETA S-Meter from MAX9814 TC pin / divide 4 by KD8CEC for reduce EEPromSize
newSMeter = analogRead(ANALOG_SMETER); newSMeter = analogRead(ANALOG_SMETER) / 4;
//Faster attack, Slower release //Faster attack, Slower release
//currentSMeter = (newSMeter > currentSMeter ? ((currentSMeter * 3 + newSMeter * 7) + 5) / 10 : ((currentSMeter * 7 + newSMeter * 3) + 5) / 10); //currentSMeter = (newSMeter > currentSMeter ? ((currentSMeter * 3 + newSMeter * 7) + 5) / 10 : ((currentSMeter * 7 + newSMeter * 3) + 5) / 10);
currentSMeter = (currentSMeter * 3 + newSMeter * 7) / 10; //remarked becaused of have already Latency time //currentSMeter = (currentSMeter * 3 + newSMeter * 7) / 10; //remarked becaused of have already Latency time
currentSMeter = newSMeter;
scaledSMeter = 0; scaledSMeter = 0;
for (byte s = 8; s >= 1; s--) { for (byte s = 8; s >= 1; s--) {

View File

@ -642,90 +642,16 @@ void DisplayMeter(byte meterType, byte meterValue, char drawPosition)
if (meterType == 0 || meterType == 1 || meterType == 2) if (meterType == 0 || meterType == 1 || meterType == 2)
{ {
drawMeter(meterValue); drawMeter(meterValue);
//int lineNumber = 0;
//if ((displayOption1 & 0x01) == 0x01)
//lineNumber = 1;
LCD_SetCursor(drawPosition, 2); LCD_SetCursor(drawPosition, 2);
LCD_Write('S'); LCD_Write('S');
LCD_Write(':'); LCD_Write(':');
for (int i = 0; i < 6; i++) //meter 5 + +db 1 = 6 for (int i = 0; i < 7; i++) //meter 5 + +db 1 = 6
LCD_Write(lcdMeter[i]); LCD_Write(lcdMeter[i]);
} }
} }
//meterType : 0 = S.Meter, 1 = Forward Power Meter, 2 = SWR Meter
void DisplayMeter(byte meterType, int meterValue, char drawPosition)
{
#ifdef OPTION_SKINNYBARS //We want skinny meter bars with more text/numbers
memcpy(&(line2Buffer[drawPosition]), " ", 8); //Blank that section of 8 characters first
if (meterType == 0) { //SWR meter
drawMeter(meterValue); //Only 2 characters
line2Buffer[drawPosition] = 'S';
byte sValue = round((float)meterValue * 1.5); //6 bars available only to show 9 S values
sValue = sValue > 9 ? 9 : sValue; //Max S9
line2Buffer[drawPosition + 1] = '0' + sValue; //0 to 9
memcpy(&(line2Buffer[drawPosition + 2]), lcdMeter, 2); //Copy the S-Meter bars
//Add the +10, +20, etc...
if (meterValue > 6) {
//We are over S9
line2Buffer[drawPosition + 4] = '+';
line2Buffer[drawPosition + 5] = '0' + meterValue - 6; //1,2,3 etc...
line2Buffer[drawPosition + 6] = '0';
}
} else if (meterType == 1) { //Forward Power
drawMeter(round((float)meterValue / 40)); //4 watts per bar
//meterValue contains power value x 10 (one decimal point)
line2Buffer[drawPosition] = 'P';
meterValue = meterValue > 999 ? 999 : meterValue; //Limit to 99.9 watts!!!!
//Remove decimal value and divide by 10
meterValue = round((float)meterValue / 10);
if (meterValue < 10) {
line2Buffer[drawPosition + 1] = ' ';
line2Buffer[drawPosition + 2] = '0' + meterValue; //0 to 9
} else {
line2Buffer[drawPosition + 1] = '0' + meterValue / 10;
line2Buffer[drawPosition + 2] = '0' + (meterValue - ((meterValue / 10) * 10));
}
line2Buffer[drawPosition + 3] = 'W';
memcpy(&(line2Buffer[drawPosition + 4]), lcdMeter, 2); //Copy the S-Meter bars
} else { //SWR
drawMeter((int)(((float)meterValue - 21) / 100)); //no bar = < 1.2, then 1 bar = 1.2 to 2.2, 2 bars = 2.2 to 3.2, etc...
//meterValue contains SWR x 100 (two decimal point)
memcpy(&(line2Buffer[drawPosition]), "SWR", 3);
meterValue = round((float)meterValue / 10); //We now have swr x 10 (1 decimal point)
if (meterValue < 100) { //10 to 99, no decimal point
//Draw the decimal value
line2Buffer[drawPosition + 3] = '0' + meterValue / 10;
line2Buffer[drawPosition + 4] = '.';
line2Buffer[drawPosition + 5] = '0' + (meterValue - ((meterValue / 10) * 10));
} else {
memcpy(&(line2Buffer[drawPosition + 3]), "10+", 3); //over 10
}
memcpy(&(line2Buffer[drawPosition + 6]), lcdMeter, 2); //Copy the S-Meter bars
}
#else //We want fat bars, easy to read, with less text/numbers
//Serial.print("In displaymeter, meterValue: "); Serial.println(meterValue);
drawMeter(meterValue);
//Always line 2
char sym = 'S';
if (meterType == 1) sym = 'P';
else if (meterType == 2) sym = 'R'; //For SWR
line2Buffer[drawPosition] = sym;
memcpy(&(line2Buffer[drawPosition + 1]), lcdMeter, 7);
#endif //OPTION_SKINNYBARS
}
byte testValue = 0;
char checkCount = 0; char checkCount = 0;
int currentSMeter = 0;
//int sMeterLevels[] = {0, 5, 17, 41, 74, 140, 255, 365, 470};
byte scaledSMeter = 0;
char checkCountSMeter = 0; char checkCountSMeter = 0;
//execute interval : 0.25sec //execute interval : 0.25sec
@ -769,10 +695,12 @@ void idle_process()
int newSMeter; int newSMeter;
//VK2ETA S-Meter from MAX9814 TC pin //VK2ETA S-Meter from MAX9814 TC pin
newSMeter = analogRead(ANALOG_SMETER); newSMeter = analogRead(ANALOG_SMETER) / 4;
//Faster attack, Slower release //Faster attack, Slower release
currentSMeter = (newSMeter > currentSMeter ? ((currentSMeter * 3 + newSMeter * 7) + 5) / 10 : ((currentSMeter * 7 + newSMeter * 3) + 5) / 10); //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; scaledSMeter = 0;
for (byte s = 8; s >= 1; s--) { for (byte s = 8; s >= 1; s--) {

View File

@ -95,7 +95,7 @@ void initMeter(){
for (i = 0; i < 8; i++) for (i = 0; i < 8; i++)
tmpbytes[i] = pgm_read_byte(p_metes_bitmap + i + 48); tmpbytes[i] = pgm_read_byte(p_metes_bitmap + i + 48);
LCD_CreateChar(6, tmpbytes); LCD_CreateChar(7, tmpbytes);
} }
@ -128,13 +128,23 @@ void drawMeter(int needle)
{ {
#ifdef OPTION_SKINNYBARS #ifdef OPTION_SKINNYBARS
//Fill buffer with growing set of bars, up to needle value //Fill buffer with growing set of bars, up to needle value
lcdMeter[0] = 0x20;
lcdMeter[1] = 0x20;
for (int i = 0; i < 6; i++) { for (int i = 0; i < 6; i++) {
if (needle > i) if (needle > i)
lcdMeter[i / 3] = byte(i + 1); //Custom characters above lcdMeter[i / 3] = byte(i + 1); //Custom characters above
else if (i == 1 || i == 4) { //else if (i == 1 || i == 4) {
lcdMeter[i / 3] = 0x20; //blank // lcdMeter[i / 3] = 0x20; //blank
} //}
} }
if (needle > 7) {
lcdMeter[2] = byte(7); //Custom character "++"
} else if (needle > 6) {
lcdMeter[2] = '+'; //"+"
} else lcdMeter[2] = 0x20;
#else //Must be "fat" bars #else //Must be "fat" bars
//Fill buffer with growing set of bars, up to needle value //Fill buffer with growing set of bars, up to needle value
for (int i = 0; i < 6; i++) { for (int i = 0; i < 6; i++) {
@ -143,11 +153,13 @@ void drawMeter(int needle)
else else
lcdMeter[i] = 0x20; //blank lcdMeter[i] = 0x20; //blank
} }
if (needle > 7) { if (needle > 7) {
lcdMeter[6] = byte(7); //Custom character "++" lcdMeter[6] = byte(7); //Custom character "++"
} else if (needle > 6) { } else if (needle > 6) {
lcdMeter[6] = 0x2B; //"+" lcdMeter[6] = '+'; //"+"
} else lcdMeter[6] = 0x20; } else lcdMeter[6] = 0x20;
#endif //OPTION_FATBARS #endif //OPTION_FATBARS
} }