Fix aircopy bypassing TX restrictions & refactor
And scrapes together a few more bytes.
This commit is contained in:
294
app/aircopy.c
294
app/aircopy.c
@@ -28,18 +28,26 @@
|
|||||||
#include "ui/inputbox.h"
|
#include "ui/inputbox.h"
|
||||||
#include "ui/ui.h"
|
#include "ui/ui.h"
|
||||||
|
|
||||||
static const uint16_t Obfuscation[8] = {0x6C16, 0xE614, 0x912E, 0x400D, 0x3521, 0x40D5, 0x0313, 0x80E9};
|
static const uint16_t Obfuscation[8] = { 0x6C16, 0xE614, 0x912E, 0x400D, 0x3521, 0x40D5, 0x0313, 0x80E9 };
|
||||||
|
|
||||||
AIRCOPY_State_t gAircopyState;
|
AIRCOPY_State_t gAircopyState;
|
||||||
uint16_t gAirCopyBlockNumber;
|
uint16_t gAirCopyBlockNumber;
|
||||||
uint16_t gErrorsDuringAirCopy;
|
uint16_t gErrorsDuringAirCopy;
|
||||||
uint8_t gAirCopyIsSendMode;
|
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,170 +70,172 @@ 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++)
|
|
||||||
g_FSK_Buffer[i + 1] ^= Obfuscation[i % 8];
|
|
||||||
|
|
||||||
CRC = CRC_Calculate(&g_FSK_Buffer[1], 2 + 64);
|
|
||||||
if (g_FSK_Buffer[34] == CRC)
|
|
||||||
{
|
|
||||||
const uint16_t *pData;
|
|
||||||
uint16_t Offset;
|
|
||||||
|
|
||||||
Offset = g_FSK_Buffer[1];
|
|
||||||
if (Offset < 0x1E00)
|
|
||||||
{
|
|
||||||
pData = &g_FSK_Buffer[2];
|
|
||||||
for (i = 0; i < 8; i++)
|
|
||||||
{
|
|
||||||
EEPROM_WriteBuffer(Offset, pData);
|
|
||||||
pData += 4;
|
|
||||||
Offset += 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Offset == 0x1E00)
|
|
||||||
gAircopyState = AIRCOPY_COMPLETE;
|
|
||||||
|
|
||||||
gAirCopyBlockNumber++;
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
gErrorsDuringAirCopy++;
|
|
||||||
|
for (unsigned int i = 0; i < 34; i++) {
|
||||||
|
g_FSK_Buffer[i + 1] ^= Obfuscation[i % 8];
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t CRC = CRC_Calculate(&g_FSK_Buffer[1], 2 + 64);
|
||||||
|
if (g_FSK_Buffer[34] != CRC) {
|
||||||
|
gErrorsDuringAirCopy++;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t Offset = g_FSK_Buffer[1];
|
||||||
|
|
||||||
|
if (Offset >= 0x1E00) {
|
||||||
|
gErrorsDuringAirCopy++;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const uint16_t *pData = &g_FSK_Buffer[2];
|
||||||
|
for (unsigned int i = 0; i < 8; i++) {
|
||||||
|
EEPROM_WriteBuffer(Offset, pData);
|
||||||
|
pData += 4;
|
||||||
|
Offset += 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Offset == 0x1E00) {
|
||||||
|
gAircopyState = AIRCOPY_COMPLETE;
|
||||||
|
}
|
||||||
|
|
||||||
|
gAirCopyBlockNumber++;
|
||||||
}
|
}
|
||||||
|
|
||||||
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);
|
|
||||||
gRequestDisplayScreen = DISPLAY_AIRCOPY;
|
|
||||||
if (gInputBoxIndex < 6)
|
|
||||||
{
|
|
||||||
#ifdef ENABLE_VOICE
|
|
||||||
gAnotherVoiceID = (VOICE_ID_t)Key;
|
|
||||||
#endif
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
gInputBoxIndex = 0;
|
|
||||||
Frequency = StrToUL(INPUTBOX_GetAscii()) * 100;
|
|
||||||
|
|
||||||
for (i = 0; i < BAND_N_ELEM; i++)
|
|
||||||
{
|
|
||||||
if (Frequency >= frequencyBandTable[i].lower && Frequency < frequencyBandTable[i].upper)
|
|
||||||
{
|
|
||||||
#ifdef ENABLE_VOICE
|
|
||||||
gAnotherVoiceID = (VOICE_ID_t)Key;
|
|
||||||
#endif
|
|
||||||
gRxVfo->Band = i;
|
|
||||||
Frequency = FREQUENCY_RoundToStep(Frequency, gRxVfo->StepFrequency);
|
|
||||||
gRxVfo->freq_config_RX.Frequency = Frequency;
|
|
||||||
gRxVfo->freq_config_TX.Frequency = Frequency;
|
|
||||||
RADIO_ConfigureSquelchAndOutputPower(gRxVfo);
|
|
||||||
gCurrentVfo = gRxVfo;
|
|
||||||
RADIO_SetupRegisters(true);
|
|
||||||
BK4819_SetupAircopy();
|
|
||||||
BK4819_ResetFSK();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
gRequestDisplayScreen = DISPLAY_AIRCOPY;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
INPUTBOX_Append(Key);
|
||||||
|
|
||||||
|
gRequestDisplayScreen = DISPLAY_AIRCOPY;
|
||||||
|
|
||||||
|
if (gInputBoxIndex < 6) {
|
||||||
|
#ifdef ENABLE_VOICE
|
||||||
|
gAnotherVoiceID = (VOICE_ID_t)Key;
|
||||||
|
#endif
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
gInputBoxIndex = 0;
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef ENABLE_VOICE
|
||||||
|
gAnotherVoiceID = (VOICE_ID_t)Key;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
Frequency = FREQUENCY_RoundToStep(Frequency, gRxVfo->StepFrequency);
|
||||||
|
gRxVfo->Band = i;
|
||||||
|
gRxVfo->freq_config_RX.Frequency = Frequency;
|
||||||
|
gRxVfo->freq_config_TX.Frequency = Frequency;
|
||||||
|
RADIO_ConfigureSquelchAndOutputPower(gRxVfo);
|
||||||
|
gCurrentVfo = gRxVfo;
|
||||||
|
RADIO_SetupRegisters(true);
|
||||||
|
BK4819_SetupAircopy();
|
||||||
|
BK4819_ResetFSK();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
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)
|
|
||||||
{
|
|
||||||
gFSKWriteIndex = 0;
|
|
||||||
gAirCopyBlockNumber = 0;
|
|
||||||
gErrorsDuringAirCopy = 0;
|
|
||||||
gInputBoxIndex = 0;
|
|
||||||
gAirCopyIsSendMode = 0;
|
|
||||||
|
|
||||||
BK4819_PrepareFSKReceive();
|
|
||||||
|
|
||||||
gAircopyState = AIRCOPY_TRANSFER;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
gInputBox[--gInputBoxIndex] = 10;
|
|
||||||
|
|
||||||
gRequestDisplayScreen = DISPLAY_AIRCOPY;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (gInputBoxIndex == 0) {
|
||||||
|
gFSKWriteIndex = 0;
|
||||||
|
gAirCopyBlockNumber = 0;
|
||||||
|
gInputBoxIndex = 0;
|
||||||
|
gErrorsDuringAirCopy = 0;
|
||||||
|
gAirCopyIsSendMode = 0;
|
||||||
|
|
||||||
|
BK4819_PrepareFSKReceive();
|
||||||
|
|
||||||
|
gAircopyState = AIRCOPY_TRANSFER;
|
||||||
|
} else {
|
||||||
|
gInputBox[--gInputBoxIndex] = 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
|
||||||
gAirCopyBlockNumber = 0;
|
|
||||||
gInputBoxIndex = 0;
|
|
||||||
gAirCopyIsSendMode = 1;
|
|
||||||
g_FSK_Buffer[0] = 0xABCD;
|
|
||||||
g_FSK_Buffer[1] = 0;
|
|
||||||
g_FSK_Buffer[35] = 0xDCBA;
|
|
||||||
|
|
||||||
AIRCOPY_SendMessage();
|
|
||||||
|
|
||||||
GUI_DisplayScreen();
|
|
||||||
|
|
||||||
gAircopyState = AIRCOPY_TRANSFER;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gFSKWriteIndex = 0;
|
||||||
|
gAirCopyBlockNumber = 0;
|
||||||
|
gInputBoxIndex = 0;
|
||||||
|
gAirCopyIsSendMode = 1;
|
||||||
|
g_FSK_Buffer[0] = 0xABCD;
|
||||||
|
g_FSK_Buffer[1] = 0;
|
||||||
|
g_FSK_Buffer[35] = 0xDCBA;
|
||||||
|
|
||||||
|
GUI_DisplayScreen();
|
||||||
|
|
||||||
|
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:
|
case KEY_3:
|
||||||
case KEY_3:
|
case KEY_4:
|
||||||
case KEY_4:
|
case KEY_5:
|
||||||
case KEY_5:
|
case KEY_6:
|
||||||
case KEY_6:
|
case KEY_7:
|
||||||
case KEY_7:
|
case KEY_8:
|
||||||
case KEY_8:
|
case KEY_9:
|
||||||
case KEY_9:
|
AIRCOPY_Key_DIGITS(Key, bKeyPressed, bKeyHeld);
|
||||||
AIRCOPY_Key_DIGITS(Key, bKeyPressed, bKeyHeld);
|
break;
|
||||||
break;
|
case KEY_MENU:
|
||||||
case KEY_MENU:
|
AIRCOPY_Key_MENU(bKeyPressed, bKeyHeld);
|
||||||
AIRCOPY_Key_MENU(bKeyPressed, bKeyHeld);
|
break;
|
||||||
break;
|
case KEY_EXIT:
|
||||||
case KEY_EXIT:
|
AIRCOPY_Key_EXIT(bKeyPressed, bKeyHeld);
|
||||||
AIRCOPY_Key_EXIT(bKeyPressed, bKeyHeld);
|
break;
|
||||||
break;
|
default:
|
||||||
default:
|
break;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
32
app/app.c
32
app/app.c
@@ -714,18 +714,19 @@ static void CheckRadioInterrupts(void)
|
|||||||
BK4819_ToggleGpioOut(BK4819_GPIO6_PIN2_GREEN, false);
|
BK4819_ToggleGpioOut(BK4819_GPIO6_PIN2_GREEN, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef ENABLE_AIRCOPY
|
#ifdef ENABLE_AIRCOPY
|
||||||
if (interrupt_status_bits & BK4819_REG_02_FSK_FIFO_ALMOST_FULL &&
|
if (interrupt_status_bits & BK4819_REG_02_FSK_FIFO_ALMOST_FULL &&
|
||||||
gScreenToDisplay == DISPLAY_AIRCOPY &&
|
gScreenToDisplay == DISPLAY_AIRCOPY &&
|
||||||
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();
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
AIRCOPY_StorePacket();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1281,13 +1282,8 @@ 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()) {
|
||||||
{
|
GUI_DisplayScreen();
|
||||||
if (--gAircopySendCountdown == 0)
|
|
||||||
{
|
|
||||||
AIRCOPY_SendMessage();
|
|
||||||
GUI_DisplayScreen();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@@ -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;
|
||||||
|
@@ -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
3
misc.c
@@ -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
3
misc.h
@@ -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;
|
||||||
|
Reference in New Issue
Block a user