Fix aircopy bypassing TX restrictions & refactor

And scrapes together a few more bytes.
This commit is contained in:
Juan Antonio
2023-12-09 17:06:24 +01:00
committed by egzumer
parent eb6a3d0867
commit 2e69acbdc4
7 changed files with 171 additions and 170 deletions

View File

@@ -37,9 +37,17 @@ uint8_t gAirCopyIsSendMode;
uint16_t g_FSK_Buffer[36]; uint16_t g_FSK_Buffer[36];
void AIRCOPY_SendMessage(void) bool AIRCOPY_SendMessage(void)
{ {
unsigned int i; static uint8_t gAircopySendCountdown = 1;
if (gAircopyState != AIRCOPY_TRANSFER) {
return 1;
}
if (--gAircopySendCountdown) {
return 1;
}
g_FSK_Buffer[1] = (gAirCopyBlockNumber & 0x3FF) << 6; g_FSK_Buffer[1] = (gAirCopyBlockNumber & 0x3FF) << 6;
@@ -47,11 +55,13 @@ void AIRCOPY_SendMessage(void)
g_FSK_Buffer[34] = CRC_Calculate(&g_FSK_Buffer[1], 2 + 64); g_FSK_Buffer[34] = CRC_Calculate(&g_FSK_Buffer[1], 2 + 64);
for (i = 0; i < 34; i++) for (unsigned int i = 0; i < 34; i++) {
g_FSK_Buffer[i + 1] ^= Obfuscation[i % 8]; g_FSK_Buffer[i + 1] ^= Obfuscation[i % 8];
}
if (++gAirCopyBlockNumber >= 0x78) if (++gAirCopyBlockNumber >= 0x78) {
gAircopyState = AIRCOPY_COMPLETE; gAircopyState = AIRCOPY_COMPLETE;
}
RADIO_SetTxParameters(); RADIO_SetTxParameters();
@@ -60,70 +70,70 @@ void AIRCOPY_SendMessage(void)
BK4819_ToggleGpioOut(BK4819_GPIO1_PIN29_PA_ENABLE, false); BK4819_ToggleGpioOut(BK4819_GPIO1_PIN29_PA_ENABLE, false);
gAircopySendCountdown = 30; gAircopySendCountdown = 30;
return 0;
} }
void AIRCOPY_StorePacket(void) void AIRCOPY_StorePacket(void)
{ {
uint16_t Status; if (gFSKWriteIndex < 36) {
if (gFSKWriteIndex < 36)
return; return;
}
gFSKWriteIndex = 0; gFSKWriteIndex = 0;
gUpdateDisplay = true; gUpdateDisplay = true;
Status = BK4819_ReadRegister(BK4819_REG_0B); uint16_t Status = BK4819_ReadRegister(BK4819_REG_0B);
BK4819_PrepareFSKReceive(); BK4819_PrepareFSKReceive();
// Doc says bit 4 should be 1 = CRC OK, 0 = CRC FAIL, but original firmware checks for FAIL. // Doc says bit 4 should be 1 = CRC OK, 0 = CRC FAIL, but original firmware checks for FAIL.
if ((Status & 0x0010U) == 0 && g_FSK_Buffer[0] == 0xABCD && g_FSK_Buffer[35] == 0xDCBA) if ((Status & 0x0010U) != 0 || g_FSK_Buffer[0] != 0xABCD || g_FSK_Buffer[35] != 0xDCBA) {
{ gErrorsDuringAirCopy++;
uint16_t CRC; return;
unsigned int i; }
for (i = 0; i < 34; i++) for (unsigned int i = 0; i < 34; i++) {
g_FSK_Buffer[i + 1] ^= Obfuscation[i % 8]; g_FSK_Buffer[i + 1] ^= Obfuscation[i % 8];
}
CRC = CRC_Calculate(&g_FSK_Buffer[1], 2 + 64); uint16_t CRC = CRC_Calculate(&g_FSK_Buffer[1], 2 + 64);
if (g_FSK_Buffer[34] == CRC) if (g_FSK_Buffer[34] != CRC) {
{ gErrorsDuringAirCopy++;
const uint16_t *pData; return;
uint16_t Offset; }
Offset = g_FSK_Buffer[1]; uint16_t Offset = g_FSK_Buffer[1];
if (Offset < 0x1E00)
{ if (Offset >= 0x1E00) {
pData = &g_FSK_Buffer[2]; gErrorsDuringAirCopy++;
for (i = 0; i < 8; i++) return;
{ }
const uint16_t *pData = &g_FSK_Buffer[2];
for (unsigned int i = 0; i < 8; i++) {
EEPROM_WriteBuffer(Offset, pData); EEPROM_WriteBuffer(Offset, pData);
pData += 4; pData += 4;
Offset += 8; Offset += 8;
} }
if (Offset == 0x1E00) if (Offset == 0x1E00) {
gAircopyState = AIRCOPY_COMPLETE; gAircopyState = AIRCOPY_COMPLETE;
}
gAirCopyBlockNumber++; gAirCopyBlockNumber++;
return;
}
}
}
gErrorsDuringAirCopy++;
} }
static void AIRCOPY_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) static void AIRCOPY_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
{ {
if (!bKeyHeld && bKeyPressed) if (bKeyHeld || !bKeyPressed) {
{ return;
uint32_t Frequency; }
unsigned int i;
INPUTBOX_Append(Key); INPUTBOX_Append(Key);
gRequestDisplayScreen = DISPLAY_AIRCOPY; gRequestDisplayScreen = DISPLAY_AIRCOPY;
if (gInputBoxIndex < 6)
{ if (gInputBoxIndex < 6) {
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
gAnotherVoiceID = (VOICE_ID_t)Key; gAnotherVoiceID = (VOICE_ID_t)Key;
#endif #endif
@@ -131,17 +141,23 @@ static void AIRCOPY_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
} }
gInputBoxIndex = 0; gInputBoxIndex = 0;
Frequency = StrToUL(INPUTBOX_GetAscii()) * 100; uint32_t Frequency = StrToUL(INPUTBOX_GetAscii()) * 100;
for (unsigned int i = 0; i < BAND_N_ELEM; i++) {
if (Frequency < frequencyBandTable[i].lower || Frequency >= frequencyBandTable[i].upper) {
continue;
}
if (TX_freq_check(Frequency)) {
continue;
}
for (i = 0; i < BAND_N_ELEM; i++)
{
if (Frequency >= frequencyBandTable[i].lower && Frequency < frequencyBandTable[i].upper)
{
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
gAnotherVoiceID = (VOICE_ID_t)Key; gAnotherVoiceID = (VOICE_ID_t)Key;
#endif #endif
gRxVfo->Band = i;
Frequency = FREQUENCY_RoundToStep(Frequency, gRxVfo->StepFrequency); Frequency = FREQUENCY_RoundToStep(Frequency, gRxVfo->StepFrequency);
gRxVfo->Band = i;
gRxVfo->freq_config_RX.Frequency = Frequency; gRxVfo->freq_config_RX.Frequency = Frequency;
gRxVfo->freq_config_TX.Frequency = Frequency; gRxVfo->freq_config_TX.Frequency = Frequency;
RADIO_ConfigureSquelchAndOutputPower(gRxVfo); RADIO_ConfigureSquelchAndOutputPower(gRxVfo);
@@ -151,39 +167,39 @@ static void AIRCOPY_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
BK4819_ResetFSK(); BK4819_ResetFSK();
return; return;
} }
}
gRequestDisplayScreen = DISPLAY_AIRCOPY; gRequestDisplayScreen = DISPLAY_AIRCOPY;
} }
}
static void AIRCOPY_Key_EXIT(bool bKeyPressed, bool bKeyHeld) static void AIRCOPY_Key_EXIT(bool bKeyPressed, bool bKeyHeld)
{ {
if (!bKeyHeld && bKeyPressed) if (bKeyHeld || !bKeyPressed) {
{ return;
if (gInputBoxIndex == 0) }
{
if (gInputBoxIndex == 0) {
gFSKWriteIndex = 0; gFSKWriteIndex = 0;
gAirCopyBlockNumber = 0; gAirCopyBlockNumber = 0;
gErrorsDuringAirCopy = 0;
gInputBoxIndex = 0; gInputBoxIndex = 0;
gErrorsDuringAirCopy = 0;
gAirCopyIsSendMode = 0; gAirCopyIsSendMode = 0;
BK4819_PrepareFSKReceive(); BK4819_PrepareFSKReceive();
gAircopyState = AIRCOPY_TRANSFER; gAircopyState = AIRCOPY_TRANSFER;
} } else {
else
gInputBox[--gInputBoxIndex] = 10; gInputBox[--gInputBoxIndex] = 10;
}
gRequestDisplayScreen = DISPLAY_AIRCOPY; gRequestDisplayScreen = DISPLAY_AIRCOPY;
} }
}
static void AIRCOPY_Key_MENU(bool bKeyPressed, bool bKeyHeld) static void AIRCOPY_Key_MENU(bool bKeyPressed, bool bKeyHeld)
{ {
if (!bKeyHeld && bKeyPressed) if (bKeyHeld || !bKeyPressed) {
{ return;
}
gFSKWriteIndex = 0; gFSKWriteIndex = 0;
gAirCopyBlockNumber = 0; gAirCopyBlockNumber = 0;
gInputBoxIndex = 0; gInputBoxIndex = 0;
@@ -192,18 +208,14 @@ static void AIRCOPY_Key_MENU(bool bKeyPressed, bool bKeyHeld)
g_FSK_Buffer[1] = 0; g_FSK_Buffer[1] = 0;
g_FSK_Buffer[35] = 0xDCBA; g_FSK_Buffer[35] = 0xDCBA;
AIRCOPY_SendMessage();
GUI_DisplayScreen(); GUI_DisplayScreen();
gAircopyState = AIRCOPY_TRANSFER; gAircopyState = AIRCOPY_TRANSFER;
} }
}
void AIRCOPY_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) void AIRCOPY_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
{ {
switch (Key) switch (Key) {
{
case KEY_0: case KEY_0:
case KEY_1: case KEY_1:
case KEY_2: case KEY_2:

View File

@@ -37,11 +37,10 @@ extern uint8_t gAirCopyIsSendMode;
extern uint16_t g_FSK_Buffer[36]; extern uint16_t g_FSK_Buffer[36];
void AIRCOPY_SendMessage(void); bool AIRCOPY_SendMessage(void);
void AIRCOPY_StorePacket(void); void AIRCOPY_StorePacket(void);
void AIRCOPY_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld); void AIRCOPY_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld);
#endif #endif
#endif #endif

View File

@@ -720,9 +720,10 @@ static void CheckRadioInterrupts(void)
gAircopyState == AIRCOPY_TRANSFER && gAircopyState == AIRCOPY_TRANSFER &&
gAirCopyIsSendMode == 0) gAirCopyIsSendMode == 0)
{ {
unsigned int i; for (unsigned int i = 0; i < 4; i++) {
for (i = 0; i < 4; i++)
g_FSK_Buffer[gFSKWriteIndex++] = BK4819_ReadRegister(BK4819_REG_5F); g_FSK_Buffer[gFSKWriteIndex++] = BK4819_ReadRegister(BK4819_REG_5F);
}
AIRCOPY_StorePacket(); AIRCOPY_StorePacket();
} }
#endif #endif
@@ -1281,15 +1282,10 @@ void APP_TimeSlice10ms(void)
#ifdef ENABLE_AIRCOPY #ifdef ENABLE_AIRCOPY
if (gScreenToDisplay == DISPLAY_AIRCOPY && gAircopyState == AIRCOPY_TRANSFER && gAirCopyIsSendMode == 1) if (gScreenToDisplay == DISPLAY_AIRCOPY && gAircopyState == AIRCOPY_TRANSFER && gAirCopyIsSendMode == 1)
{ {
if (gAircopySendCountdown > 0) if (!AIRCOPY_SendMessage()) {
{
if (--gAircopySendCountdown == 0)
{
AIRCOPY_SendMessage();
GUI_DisplayScreen(); GUI_DisplayScreen();
} }
} }
}
#endif #endif
CheckKeys(); CheckKeys();

View File

@@ -223,7 +223,7 @@ int32_t TX_freq_check(const uint32_t Frequency)
break; break;
case F_LOCK_NONE: case F_LOCK_NONE:
for (uint8_t i = 0; i < ARRAY_SIZE(frequencyBandTable); i++) for (uint32_t i = 0; i < ARRAY_SIZE(frequencyBandTable); i++)
if (Frequency >= frequencyBandTable[i].lower && Frequency < frequencyBandTable[i].upper) if (Frequency >= frequencyBandTable[i].lower && Frequency < frequencyBandTable[i].upper)
return 0; return 0;
break; break;

View File

@@ -84,7 +84,7 @@ uint32_t FREQUENCY_RoundToStep(uint32_t freq, uint16_t step);
STEP_Setting_t FREQUENCY_GetStepIdxFromSortedIdx(uint8_t sortedIdx); STEP_Setting_t FREQUENCY_GetStepIdxFromSortedIdx(uint8_t sortedIdx);
uint32_t FREQUENCY_GetSortedIdxFromStepIdx(uint8_t step); uint32_t FREQUENCY_GetSortedIdxFromStepIdx(uint8_t step);
int32_t TX_freq_check(const uint32_t Frequency); int32_t TX_freq_check(uint32_t Frequency);
int32_t RX_freq_check(const uint32_t Frequency); int32_t RX_freq_check(uint32_t Frequency);
#endif #endif

3
misc.c
View File

@@ -216,9 +216,6 @@ uint8_t gPttDebounceCounter;
uint8_t gMenuListCount; uint8_t gMenuListCount;
uint8_t gBackup_CROSS_BAND_RX_TX; uint8_t gBackup_CROSS_BAND_RX_TX;
uint8_t gScanDelay_10ms; uint8_t gScanDelay_10ms;
#ifdef ENABLE_AIRCOPY
uint8_t gAircopySendCountdown;
#endif
uint8_t gFSKWriteIndex; uint8_t gFSKWriteIndex;
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA

3
misc.h
View File

@@ -295,9 +295,6 @@ extern uint8_t gPttDebounceCounter;
extern uint8_t gMenuListCount; extern uint8_t gMenuListCount;
extern uint8_t gBackup_CROSS_BAND_RX_TX; extern uint8_t gBackup_CROSS_BAND_RX_TX;
extern uint8_t gScanDelay_10ms; extern uint8_t gScanDelay_10ms;
#ifdef ENABLE_AIRCOPY
extern uint8_t gAircopySendCountdown;
#endif
extern uint8_t gFSKWriteIndex; extern uint8_t gFSKWriteIndex;
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
extern bool gIsNoaaMode; extern bool gIsNoaaMode;