优化4732调度与显示逻辑

This commit is contained in:
losehu
2024-09-21 16:14:28 +08:00
parent e519aab1a4
commit 1a934cbc30
4 changed files with 101 additions and 104 deletions

196
app/si.c
View File

@ -71,7 +71,7 @@ static const char SI47XX_MODE_NAMES[5][4] = {
static SI47XX_FilterBW bw = SI47XX_BW_6_kHz;
static SI47XX_SsbFilterBW ssbBw = SI47XX_SSB_BW_3_kHz;
static int8_t currentBandIndex = -1;
bool SNR_flag=true;
bool SNR_flag = true;
bool SI_run = true;
typedef struct // Band data
{
@ -160,8 +160,8 @@ static void light_open() {
light_time = LIGHT_TIME_SET[gEeprom.BACKLIGHT_TIME];
BACKLIGHT_TurnOn();
}
void WaitDisplay()
{
void WaitDisplay() {
UI_DisplayClear();
memset(gStatusLine, 0, sizeof(gStatusLine));
UI_PrintStringSmall("SI4732 Wait...", 0, 127, 3);
@ -169,6 +169,7 @@ void WaitDisplay()
ST7565_BlitFullScreen();
}
static void tune(uint32_t f) {
if (si4732mode == SI47XX_FM) {
if (f < 6400000 || f > 10800000) {
@ -179,7 +180,7 @@ static void tune(uint32_t f) {
return;
}
}
EEPROM_WriteBuffer(SI4732_FREQ_ADD + si4732mode * 4, (uint8_t *) &f, 4);
EEPROM_WriteBuffer(SI4732_FREQ_ADD + si4732mode * 4, (uint8_t * ) & f, 4);
f /= divider;
if (si4732mode == SI47XX_FM) {
@ -189,7 +190,7 @@ static void tune(uint32_t f) {
SI47XX_ClearRDS();
SI47XX_SetFreq(f);
SI47XX_SetAutomaticGainControl(att>0,att);
SI47XX_SetAutomaticGainControl(att > 0, att);
currentBandIndex = getCurrentBandIndex();
}
@ -201,7 +202,7 @@ void SI_init() {
SI47XX_PowerUp();
SI47XX_SetAutomaticGainControl(att>0, att);
SI47XX_SetAutomaticGainControl(att > 0, att);
}
@ -231,6 +232,8 @@ KeyboardState kbds = {KEY_INVALID, KEY_INVALID, 0};
void SI4732_Display() {
UI_DisplayClear();
memset(gStatusLine, 0, sizeof(gStatusLine));
if (INPUT_STATE) {
UI_PrintStringSmall(freqInputString, 2, 127, 1);
@ -290,20 +293,20 @@ void SI4732_Display() {
GUI_DisplaySmallest(String, 64 - strlen(String) * 2, LCD_HEIGHT - 5 - 9, false, true);
}
}
if(SNR_flag){
uint8_t rssi = rsqStatus.resp.RSSI;
if (rssi > 64) {
rssi = 64;
if (SNR_flag) {
uint8_t rssi = rsqStatus.resp.RSSI;
if (rssi > 64) {
rssi = 64;
}
for (int i = 0; i < rssi * 2; ++i) {
gFrameBuffer[0][i] |= 0b00111100;
}
sprintf(String, "SNR %u", rsqStatus.resp.SNR);
GUI_DisplaySmallest(String, 0, 15 - 8, false, true);
}
for (int i = 0; i < rssi * 2; ++i) {
gFrameBuffer[0][i] |= 0b00111100;
}
sprintf(String, "SNR %u", rsqStatus.resp.SNR);
GUI_DisplaySmallest(String, 0, 15 - 8, false, true);
}
}
@ -349,7 +352,7 @@ static void OnKeyDownFreqInput(uint8_t key) {
}
void HandleUserInput() {
bool HandleUserInput() {
kbds.prev = kbds.current;
kbds.current = GetKey();
bool KEY_TYPE1 = false, KEY_TYPE2 = false, KEY_TYPE3 = false;
@ -384,15 +387,15 @@ void HandleUserInput() {
light_open();
display_flag = 1;
}
SI_key(kbds.current, KEY_TYPE1, KEY_TYPE2, KEY_TYPE3, kbds.prev);
return SI_key(kbds.current, KEY_TYPE1, KEY_TYPE2, KEY_TYPE3, kbds.prev);
}
void SI_key(KEY_Code_t key, bool KEY_TYPE1, bool KEY_TYPE2, bool KEY_TYPE3, KEY_Code_t key_prev) {
bool SI_key(KEY_Code_t key, bool KEY_TYPE1, bool KEY_TYPE2, bool KEY_TYPE3, KEY_Code_t key_prev) {
// up-down keys
if (INPUT_STATE && KEY_TYPE3) {
OnKeyDownFreqInput(key_prev);
return;
return 1;
}
if (KEY_TYPE1 || KEY_TYPE3) {
if (KEY_TYPE3)key = key_prev;
@ -400,42 +403,42 @@ void SI_key(KEY_Code_t key, bool KEY_TYPE1, bool KEY_TYPE2, bool KEY_TYPE3, KEY_
case KEY_UP:
tune((siCurrentFreq + step) * divider);
resetBFO();
return;
return 1;
case KEY_DOWN:
tune((siCurrentFreq - step) * divider);
resetBFO();
return;
return 1;
#ifdef ENABLE_4732SSB
case KEY_SIDE1:
if (SI47XX_IsSSB()) {
if (bfo < INT16_MAX - 10) {
bfo += 10;
case KEY_SIDE1:
if (SI47XX_IsSSB()) {
if (bfo < INT16_MAX - 10) {
bfo += 10;
}
SI47XX_SetBFO(bfo);
}
SI47XX_SetBFO(bfo);
}
return;
case KEY_SIDE2:
if (SI47XX_IsSSB()) {
if (bfo > INT16_MIN + 10) {
bfo -= 10;
}
SI47XX_SetBFO(bfo);
return 1;
case KEY_SIDE2:
if (SI47XX_IsSSB()) {
if (bfo > INT16_MIN + 10) {
bfo -= 10;
}
SI47XX_SetBFO(bfo);
}
return;
}
return 1;
#endif
case KEY_2:
if (att < 37) {
att++;
SI47XX_SetAutomaticGainControl(1, att);
}
return;
return 1;
case KEY_8:
if (att > 0) {
att--;
SI47XX_SetAutomaticGainControl(att > 0, att);
}
return;
return 1;
default:
break;
}
@ -453,9 +456,9 @@ void SI_key(KEY_Code_t key, bool KEY_TYPE1, bool KEY_TYPE2, bool KEY_TYPE3, KEY_
step *= 2;
}
}
return;
return 1;
case KEY_4:
SNR_flag=!SNR_flag;
SNR_flag = !SNR_flag;
case KEY_7:
if (step > 1) {
if (step == 1 || step == 10 || step == 100 || step == 1000) {
@ -464,37 +467,37 @@ void SI_key(KEY_Code_t key, bool KEY_TYPE1, bool KEY_TYPE2, bool KEY_TYPE3, KEY_
step /= 5;
}
}
return;
return 1;
case KEY_6:
#ifdef ENABLE_4732SSB
if (SI47XX_IsSSB()) {
if (ssbBw == SI47XX_SSB_BW_1_0_kHz) {
ssbBw = SI47XX_SSB_BW_1_2_kHz;
} else {
ssbBw++;
}
SI47XX_SetSsbBandwidth(ssbBw);
} else {
if (SI47XX_IsSSB()) {
if (ssbBw == SI47XX_SSB_BW_1_0_kHz) {
ssbBw = SI47XX_SSB_BW_1_2_kHz;
} else {
ssbBw++;
}
SI47XX_SetSsbBandwidth(ssbBw);
} else {
#endif
if (bw == SI47XX_BW_1_kHz) {
bw = SI47XX_BW_6_kHz;
} else {
bw++;
}
SI47XX_SetBandwidth(bw, true);
if (bw == SI47XX_BW_1_kHz) {
bw = SI47XX_BW_6_kHz;
} else {
bw++;
}
SI47XX_SetBandwidth(bw, true);
#ifdef ENABLE_4732SSB
}
}
#endif
return;
return 1;
case KEY_5:
INPUT_STATE = 1;
FreqInput();
return;
return 1;
case KEY_0:
divider = 100;
WaitDisplay();
@ -507,13 +510,13 @@ if (SI47XX_IsSSB()) {
#ifdef ENABLE_4732SSB
else if (si4732mode == SI47XX_AM) {
else if (si4732mode == SI47XX_AM) {
SI47XX_SwitchMode(SI47XX_LSB);
SI47XX_SetSsbBandwidth(ssbBw);
// tune(711300);
step = 1;
}
SI47XX_SwitchMode(SI47XX_LSB);
SI47XX_SetSsbBandwidth(ssbBw);
// tune(711300);
step = 1;
}
#endif
else {
@ -524,17 +527,16 @@ if (SI47XX_IsSSB()) {
}
tune(Read_FreqSaved());
resetBFO();
return;
return 1;
#ifdef ENABLE_4732SSB
case KEY_F:
if (SI47XX_IsSSB()) {
uint32_t tmpF;
SI47XX_SwitchMode(si4732mode == SI47XX_LSB ? SI47XX_USB : SI47XX_LSB);
tune(Read_FreqSaved()); // to apply SSB
return;
}
return;
case KEY_F:
if (SI47XX_IsSSB()) {
uint32_t tmpF;
SI47XX_SwitchMode(si4732mode == SI47XX_LSB ? SI47XX_USB : SI47XX_LSB);
tune(Read_FreqSaved()); // to apply SSB
return 1;
}
#endif
case KEY_EXIT:
@ -542,17 +544,15 @@ if (SI47XX_IsSSB()) {
SI47XX_PowerDown();
SI47XX_PowerUp();
seeking = false;
return;
}
SI_run = false;
return;
} else SI_run = false;
return 1;
case KEY_3:
case KEY_9:
#ifdef ENABLE_4732SSB
if (SI47XX_IsSSB()) {
return;
}
if (SI47XX_IsSSB()) {
return 0;
}
#endif
if (si4732mode == SI47XX_FM) {
SI47XX_SetSeekFmSpacing(step);
@ -566,14 +566,12 @@ if (SI47XX_IsSSB()) {
seeking = true;
return;
return 1;
default:
break;
}
}
return 0;
}
@ -592,23 +590,21 @@ void SI4732_Main() {
if (light_time == 0)BACKLIGHT_TurnOff();
}
if (cnt == 500) {
if (si4732mode == SI47XX_FM) {
SI47XX_GetRDS();
}
if(SNR_flag) {
RSQ_GET();
UI_DisplayClear();
DrawPower();
ST7565_BlitStatusLine();
}
cnt = 0;
display_flag = 1;
if (si4732mode == SI47XX_FM) {
if(SI47XX_GetRDS()) display_flag = 1;
}
if (SNR_flag) {
RSQ_GET();
display_flag = 1;
}
}
if (cnt % 25 == 0) {
HandleUserInput();
if (HandleUserInput()) display_flag = 1;
}
if (seeking && cnt % 100 == 0) {
@ -616,7 +612,7 @@ void SI4732_Main() {
bool valid = false;
siCurrentFreq = SI47XX_getFrequency(&valid);
uint32_t f = siCurrentFreq * divider;
EEPROM_WriteBuffer(SI4732_FREQ_ADD + si4732mode * 4, (uint8_t *) &f, 4);
EEPROM_WriteBuffer(SI4732_FREQ_ADD + si4732mode * 4, (uint8_t * ) & f, 4);
if (valid) {
seeking = false;

View File

@ -8,11 +8,11 @@
void SI_init();
void SI_update();
void SI_key(KEY_Code_t key, bool KEY_TYPE1, bool KEY_TYPE2, bool KEY_TYPE3,KEY_Code_t key_prev) ;
bool SI_key(KEY_Code_t key, bool KEY_TYPE1, bool KEY_TYPE2, bool KEY_TYPE3,KEY_Code_t key_prev) ;
void SI_render();
void SI_deinit();
void Key_FM(KeyboardState kbds) ;
void HandleUserInput() ;
bool HandleUserInput() ;
void SI4732_Main();
#endif /* end of include guard: APP_SI_H */

View File

@ -44,7 +44,7 @@ void SI47XX_ClearRDS() {
rds.offset = NO_DATE_TIME;
}
void SI47XX_GetRDS() {
bool SI47XX_GetRDS() {
bool new_info = false;
uint8_t segment;
@ -267,6 +267,7 @@ void SI47XX_GetRDS() {
new_info = true;
}
}
return new_info;
}
#define DAYS_PER_YEAR 365U

View File

@ -128,7 +128,7 @@ bool SI47XX_GetLocalDateTime(DateTime *time);
bool SI47XX_GetLocalTime(Time *time);
void SI47XX_GetProgramType(char buffer[17]);
void SI47XX_ClearRDS();
void SI47XX_GetRDS();
bool SI47XX_GetRDS();
extern RDS rds;
extern si47x_rds_status rdsResponse;