Add LiveSeek and Mhz Keypad function

This commit is contained in:
phdlee 2024-01-05 23:39:39 +09:00
parent eb16d92727
commit 29b97660e7
2 changed files with 362 additions and 0 deletions

273
ceccommon.c Normal file
View File

@ -0,0 +1,273 @@
/* Copyright 2023 KD8CEC
* https://github.com/kd8cec
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "ceccommon.h"
typedef struct
{
uint8_t LOW_VALUE;
uint8_t HIGH_VALUE;
} TADC_RANGE;
uint8_t CW_TONE = 70; //*10 Hz, because BK4819 using 10Hz Step, as YAESU : PITCH, ICOM,KENWOOD : TONE
uint8_t CW_SPEED = 10; //WPM 5 ~ 50
uint8_t CW_KEYTYPE = 0;
uint8_t CEC_LiveSeekMode = 0; //0:NONE, 1:LIVE, 2:LIVE+1, 3:LIVE+2
TADC_RANGE CW_KEY_ADC[3];
//================================= For Reduce Use Memory ====================
//gMR_ChannelAttributes[207]; -> function
//resize to 7 byte and Move to ceccommon.c
uint16_t CEC_GetRssi()
{
int _wait_count = 0;
while (((BK4819_ReadRegister(0x63) & 0b11111111) >= 255 ) && _wait_count++ < 100)
SYSTICK_DelayUs(100);
return BK4819_GetRSSI();
}
void DisplayIntLog(char* displayMessage, int _logInt1, int _logInt2)
{
uint8_t tmpBuff[32];
memset(gStatusLine, 0, sizeof(gStatusLine));
memset(gFrameBuffer, 0, sizeof(gFrameBuffer));
sprintf(tmpBuff, "%s : %d", displayMessage, _logInt1);
UI_PrintString(tmpBuff, 2, 127, 0, 8);
sprintf(tmpBuff, "1: %u", _logInt1);
UI_PrintString(tmpBuff, 2, 127, 2, 8);
sprintf(tmpBuff, "2: %u", _logInt2);
UI_PrintString(tmpBuff, 2, 127, 4, 8);
ST7565_BlitFullScreen();
}
//-----------------------------------------------------------------------------------------
//=================== Variables shared and used in various places , To Rduce memory usage
uint8_t CommBuff[COMBUFF_LENGTH]; //for Common Use for
uint8_t CommBuffUsingType = 0;
uint32_t CommBuffLastUseTime = 0; //10milisec using millis10() function
uint8_t CommValue1 = 0; //temp varaible
uint8_t CommValue2 = 0;
uint8_t CommValue3 = 0;
uint8_t strBuff[32]; //For sprintf
//-----------------------------------------------------------------------------------------
//=================== End of Common Variables =============================================
uint8_t lastSeekDirection = 0;
uint32_t rssiStartFreq = 0;
uint32_t addRssiCount = 0;
void UI_PrintStringSmallLeft(const char *pString, uint8_t Start, uint8_t End, uint8_t Line)
{
const size_t Length = strlen(pString);
size_t i;
const unsigned int char_width = ARRAY_SIZE(gFontSmall[0]);
const unsigned int char_spacing = char_width + 1;
uint8_t *pFb = gFrameBuffer[Line] + Start;
for (i = 0; i < Length; i++)
{
if (pString[i] > ' ')
{
const unsigned int index = (unsigned int)pString[i] - ' ' - 1;
if (index < ARRAY_SIZE(gFontSmall))
memmove(pFb + (i * char_spacing) + 1, &gFontSmall[index], char_width);
}
}
}
/*
void DrawFrequencySmall(uint32_t _frequency, int _startX, int _Length, int _lineNumber)
{
sprintf(strBuff, "%3u.%03u", _frequency / 100000, (_frequency / 100) % 1000);
UI_PrintStringSmallLeft(strBuff, _startX, _startX + _Length, _lineNumber);
}
*/
void DrawFrequencySmall(uint32_t _frequency, int _startX, int _Length, int _lineNumber)
{
// 58096 48 3284 61428 eff4 firmware
// 58036 48 3284 61368 efb8 firmware
//sprintf(strBuff, "%1u.%03u", (_frequency / 100000) % 10, (_frequency / 100) % 1000);
sprintf(strBuff, "%3u.%03u", _frequency / 100000, (_frequency / 100) % 1000);
//UI_PrintStringSmallLeft(strBuff, _startX, _startX + _Length, _lineNumber);
memset(gFrameBuffer[_lineNumber], 0, 128);
UI_PrintStringSmallNormal(strBuff, _startX, 0, _lineNumber);
}
void DrawCommBuffToSpectrum(void)
{
//Low Value
int _lowValue = 999;
int drawYPosition = 53;
if (CEC_LiveSeekMode < LIVESEEK_RCV_SPECTRUM1)
return;
if (addRssiCount < 3)
return;
for (int i = 0; i < COMBUFF_LENGTH; i++)
{
if (CommBuff[i] > 0 && _lowValue > CommBuff[i])
_lowValue = CommBuff[i];
}
//DrawFrequencyKhzSmall(gTxVfo->freq_config_RX.Frequency, lastSeekDirection == 12 ? 100 : 0, 55, 3);
//DrawFrequencyKhzSmall(gTxVfo->freq_config_RX.Frequency + (gTxVfo->StepFrequency * 64) * (lastSeekDirection == 12 ? -1 : 1),
// 57, 55, 3);
//DrawFrequencyKhzSmall(gTxVfo->freq_config_RX.Frequency + (gTxVfo->StepFrequency * 127) * (lastSeekDirection == 12 ? -1 : 1),
// lastSeekDirection == 12 ? 0 : 100, 55, 3);
memset(gFrameBuffer[6], 0, 128); //Clear Last Line
for (int i = 0; i < COMBUFF_LENGTH; i++)
{
int _drawXPosition = (lastSeekDirection == 10 ? 127 - i : i);
int _drawYValue = CommBuff[i] - _lowValue;
if (_drawYValue > 50)
_drawYValue = 50;
else if (_drawYValue < 0)
_drawYValue = 0;
UI_DrawLineBuffer(gFrameBuffer, _drawXPosition, drawYPosition, _drawXPosition, (drawYPosition - _drawYValue), true);
}
uint32_t _drawFreq = rssiStartFreq;
int _drawTextPosition = 0;
//int _drawTextPosition = lastSeekDirection == 12 ? 127 - addRssiCount: 0 + addRssiCount;
if (lastSeekDirection == 12)
{
_drawTextPosition = 127 - addRssiCount;
if (_drawTextPosition > 73)
_drawTextPosition = 73;
else if (_drawTextPosition < 0)
{
_drawTextPosition = 0;
_drawFreq = gTxVfo->freq_config_RX.Frequency - (gTxVfo->StepFrequency * 127);
}
}
else
{
_drawTextPosition = addRssiCount - 55;
if (_drawTextPosition < 0)
_drawTextPosition = 0;
else if (_drawTextPosition > 73)
{
_drawTextPosition = 73;
_drawFreq = gTxVfo->freq_config_RX.Frequency + (gTxVfo->StepFrequency * 127);
}
}
DrawFrequencySmall(_drawFreq, _drawTextPosition, 55, 3);
ST7565_BlitFullScreen();
}
//500msec interval execute function
void CEC_TimeSlice500ms(void)
{
if (CommBuffUsingType == COMBUFF_USE_SEEK_RSSI && (millis10() -CommBuffLastUseTime > 70))
{
//Clear
CommBuffUsingType = COMBUFF_USE_SEEK_NONE;
if (gScreenToDisplay == DISPLAY_MAIN)
{
gMonitor = false;
if (addRssiCount > 3)
{
if (CommValue1 != FUNCTION_MONITOR)
RADIO_SetupRegisters(true);
UI_DisplayMain();
}
}
}
}
//Frequency Apply Receive Mode
//DEFAULT
//_applyOption 0 : No Delaytime
#define STOP_RSSI_LIMIT 50
#define STOP_RSSI_TIME 500
void CEC_ApplyChangeRXFreq(int _applyOption)
{
if (CEC_LiveSeekMode == LIVESEEK_NONE)
return;
BK4819_SetFrequency(gTxVfo->freq_config_RX.Frequency);
BK4819_RX_TurnOn();
//BK4819_SetFrequency(frequency);
//APP_StartListeningLive(FUNCTION_MONITOR, false);
//if (gEeprom.SQUELCH_LEVEL == 0)
// AUDIO_AudioPathOn();
int32_t tmpRssi = CEC_GetRssi() / 3;
tmpRssi = (tmpRssi < 0 ? 0 : tmpRssi);
if (_applyOption >= 10 && _applyOption <= 12) //Save RSSI Result, 10 : Direction -1, 12 : Direction : 1
{
CommBuffUsingType = COMBUFF_USE_SEEK_RSSI;
if (lastSeekDirection != _applyOption || (millis10() -CommBuffLastUseTime > 70))
{
memset(CommBuff, 0, sizeof(CommBuff));
rssiStartFreq = gTxVfo->freq_config_RX.Frequency;
addRssiCount = 0;
CommValue1 = gCurrentFunction;
}
addRssiCount++;
lastSeekDirection = _applyOption;
int _insertIndex = COMBUFF_LENGTH -1;
if (addRssiCount < COMBUFF_LENGTH /2)
{
_insertIndex = COMBUFF_LENGTH /2 + addRssiCount;
}
else
{
//for (int i = 0; i < COMBUFF_LENGTH -1; i++)
// CommBuff[i] = CommBuff[i + 1];
memmove(&CommBuff[0], &CommBuff[1], sizeof(CommBuff) - 1);
}
CommBuff[_insertIndex] = tmpRssi > 255 ? 255 : tmpRssi;
CommBuffLastUseTime = millis10();
}
if (gEeprom.SQUELCH_LEVEL == 0)
{
if (addRssiCount > 2)
APP_StartListening(FUNCTION_MONITOR);
//delay(200);
}
else if (tmpRssi > STOP_RSSI_LIMIT)
{
APP_StartListening(FUNCTION_MONITOR);
delay(STOP_RSSI_TIME);
RADIO_SetupRegisters(true);
}
}

89
ceccommon.h Normal file
View File

@ -0,0 +1,89 @@
/* Copyright 2023 KD8CEC
* https://github.com/kd8cec
*
* This is the source code used to minimize memory usage.
* Global variables among the source code written by KD8CEC will be shared and used.
* Most source code written by KD8CEC will INCLUDE this file.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef CEC_COMMON_H
#define CEC_COMMON_H
#include <stdbool.h>
#include <math.h>
#include <stdio.h>
#include "driver\bk4819.h"
#include "driver\keyboard.h"
#include "audio.h"
#include "string.h"
#include <stdint.h>
#include <string.h>
#include "external/printf/printf.h"
//#include "gpsinfo.h"
#include "driver\eeprom.h"
#include "misc.h"
#include "radio.h"
#include "driver\system.h"
#include "driver\st7565.h"
#include "settings.h"
#include "driver\systick.h"
#include "ui\helper.h"
#include "ui\ui.h"
#include "ui\main.h"
#include "font.h"
#include "functions.h"
#include "app\app.h"
#define _MAX_READ_CH_ATTRIBUTES 7
#define COMBUFF_USE_SEEK_RSSI 01
#define COMBUFF_USE_SEEK_NONE 99
#define COMBUFF_LENGTH 128
#define CEC_EEPROM_START1 0x1D50 //0x1D50 ~ 0x1DFF
#define CEC_EEPROM_START2 0x1D00 //0x1D00 ~ 0x1D4F
#define CEC_EEPROM_START3 0x1BD0 //0x1BD0 ~ 0x1BFF (48Byte)
#define CEC_EEPROM_START4 0x1F90 //0x1F90 ~ 0x1FFF (96Byte)
#define CEC_EEPROM_DATA1 0x0F5B //5 0x0F5A ~ 0x0F5F (6Byte, but 0x0F5A is buffer with Channel Name) + (index * 16) index Count = 20, 5byte * 20 = 100byte
#define CEC_EEPROM_DATA2 0x1E0A //7 0x1E0A ~ 0x1E0A (7byte) + (index * 16) index Count = 12, 7byte * 12 = 84byte
#define EEPROM_WELCOMESTRING1 0x0EB0 //16Byte
#define EEPROM_WELCOMESTRING2 0x0EC0 //16Byte
#define EEPROM_CONFIGSTART
#define CEC_EEPROM_CALLSIGN EEPROM_WELCOMESTRING1 //CALLSIGN SPACE GRID, ex)KD8CEC EM37, KD8CEC/TEST EM37
#define CEC_EEPROM USERNAME EEPROM_WELCOMESTRING1 //NAME STATUS using APRS
#define CW_LR_MODE + //ICOM STYLE, - : YAESU STYLE (uBITX : CWL, CWR)
//extern ChannelAttributes_t gMR_ChannelAttributes[_MAX_READ_CH_ATTRIBUTES];
extern uint8_t CommBuff[COMBUFF_LENGTH]; //for Common Use for
extern uint8_t CommBuffUsingType;
extern uint32_t CommBuffLastUseTime;
extern uint8_t CW_TONE; //Hz Default 700Hz
extern uint8_t CW_SPEED;
extern uint8_t CW_KEYTYPE;
extern uint8_t CEC_LiveSeekMode; //0:NONE, 1:LIVE, 2:LIVE+1, 3:LIVE+2
#define LIVESEEK_NONE 0 //NONE
#define LIVESEEK_RCV 1 //SPEAKER ONLY
#define LIVESEEK_RCV_SPECTRUM1 2 //SPECTRUM SMALL
#define LIVESEEK_RCV_SPECTRUM2 3 //SPECTRUM LARGE (Not Use, Reserve)
#define GET_FREQ_OFFSET(__rxmode__) ( CW_LR_MODE (__rxmode__ == MODULATION_CW ||__rxmode__ == MODULATION_CWN ? (CWTone) : 0))
#define delay(delayTime) SYSTEM_DelayMs(delayTime)
ChannelAttributes_t MR_ChannelAttributes(int _channelIndex);
void SetMR_ChannelAttributes(int channel, ChannelAttributes_t att);
void CEC_ApplyChangeRXFreq(int _applyOption);
void CEC_TimeSlice500ms(void);
void DrawCommBuffToSpectrum(void);
uint32_t millis10(); //scheduler.c
#endif