mirror of
https://github.com/OneOfEleven/uv-k5-firmware-custom.git
synced 2025-06-20 15:08:37 +03:00
AIRCOPY update
This commit is contained in:
138
app/aircopy.c
138
app/aircopy.c
@ -27,95 +27,128 @@
|
||||
#include "ui/inputbox.h"
|
||||
#include "ui/ui.h"
|
||||
|
||||
static const uint16_t Obfuscation[8] = {0x6C16, 0xE614, 0x912E, 0x400D, 0x3521, 0x40D5, 0x0313, 0x80E9};
|
||||
#define AIRCOPY_MAGIC_START 0xABCD
|
||||
#define AIRCOPY_MAGIC_END 0xDCBA
|
||||
|
||||
const uint8_t g_air_copy_block_max = 120;
|
||||
uint8_t g_air_copy_block_number;
|
||||
uint8_t g_errors_during_air_copy;
|
||||
#define AIRCOPY_LAST_EEPROM_ADDR 0x1E00
|
||||
|
||||
static const uint16_t Obfuscation[] = {
|
||||
0x6C16, 0xE614, 0x912E, 0x400D, 0x3521, 0x40D5, 0x0313, 0x80E9
|
||||
};
|
||||
|
||||
const uint8_t g_aircopy_block_max = 120;
|
||||
uint8_t g_aircopy_block_number;
|
||||
uint8_t g_aircopy_rx_errors;
|
||||
aircopy_state_t g_aircopy_state;
|
||||
uint16_t g_fsk_buffer[36];
|
||||
uint16_t g_aircopy_fsk_buffer[36];
|
||||
uint8_t g_aircopy_send_count_down_10ms;
|
||||
unsigned int g_aircopy_fsk_write_index;
|
||||
|
||||
void AIRCOPY_SendMessage(void)
|
||||
{
|
||||
unsigned int i;
|
||||
unsigned int i;
|
||||
const uint16_t eeprom_addr = (uint16_t)g_aircopy_block_number * 64;
|
||||
|
||||
// *********
|
||||
|
||||
g_fsk_buffer[1] = (g_air_copy_block_number & 0x3FF) << 6;
|
||||
// packet start
|
||||
g_aircopy_fsk_buffer[0] = AIRCOPY_MAGIC_START;
|
||||
|
||||
EEPROM_ReadBuffer(g_fsk_buffer[1], &g_fsk_buffer[2], 64);
|
||||
// eeprom address
|
||||
g_aircopy_fsk_buffer[1] = eeprom_addr;
|
||||
|
||||
g_fsk_buffer[34] = CRC_Calculate(&g_fsk_buffer[1], 2 + 64);
|
||||
// data
|
||||
EEPROM_ReadBuffer(eeprom_addr, &g_aircopy_fsk_buffer[2], 64);
|
||||
|
||||
// data CRC
|
||||
g_aircopy_fsk_buffer[34] = CRC_Calculate(&g_aircopy_fsk_buffer[1], 2 + 64);
|
||||
|
||||
// packet end
|
||||
g_aircopy_fsk_buffer[35] = AIRCOPY_MAGIC_END;
|
||||
|
||||
// *********
|
||||
|
||||
// scramble the packet
|
||||
for (i = 0; i < 34; i++)
|
||||
g_fsk_buffer[i + 1] ^= Obfuscation[i % 8];
|
||||
g_aircopy_fsk_buffer[1 + i] ^= Obfuscation[i % ARRAY_SIZE(Obfuscation)];
|
||||
|
||||
if (++g_air_copy_block_number >= g_air_copy_block_max)
|
||||
RADIO_SetTxParameters();
|
||||
|
||||
BK4819_SendFSKData(g_aircopy_fsk_buffer);
|
||||
BK4819_SetupPowerAmplifier(0, 0);
|
||||
BK4819_ToggleGpioOut(BK4819_GPIO5_PIN1, false);
|
||||
|
||||
if (++g_aircopy_block_number >= g_aircopy_block_max)
|
||||
{
|
||||
g_aircopy_state = AIRCOPY_TX_COMPLETE;
|
||||
g_update_display = true;
|
||||
}
|
||||
|
||||
RADIO_SetTxParameters();
|
||||
|
||||
BK4819_SendFSKData(g_fsk_buffer);
|
||||
BK4819_SetupPowerAmplifier(0, 0);
|
||||
BK4819_ToggleGpioOut(BK4819_GPIO5_PIN1, false);
|
||||
|
||||
g_air_copy_send_count_down = 30;
|
||||
// TX pause/gap time
|
||||
#if 0
|
||||
g_aircopy_send_count_down_10ms = 300 / 10; // 300ms
|
||||
#else
|
||||
g_aircopy_send_count_down_10ms = 30 / 10; // 30ms
|
||||
#endif
|
||||
}
|
||||
|
||||
void AIRCOPY_StorePacket(void)
|
||||
{
|
||||
uint16_t Status;
|
||||
|
||||
if (g_fsk_wite_index < 36)
|
||||
if (g_aircopy_fsk_write_index < ARRAY_SIZE(g_aircopy_fsk_buffer))
|
||||
return;
|
||||
|
||||
g_fsk_wite_index = 0;
|
||||
g_update_display = true;
|
||||
g_aircopy_fsk_write_index = 0;
|
||||
g_update_display = true;
|
||||
|
||||
Status = BK4819_ReadRegister(BK4819_REG_0B);
|
||||
|
||||
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 & (1u << 4)) == 0 && g_aircopy_fsk_buffer[0] == AIRCOPY_MAGIC_START && g_aircopy_fsk_buffer[35] == AIRCOPY_MAGIC_END)
|
||||
{
|
||||
uint16_t CRC;
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < 34; i++)
|
||||
g_fsk_buffer[i + 1] ^= Obfuscation[i % 8];
|
||||
g_aircopy_fsk_buffer[1 + i] ^= Obfuscation[i % ARRAY_SIZE(Obfuscation)];
|
||||
|
||||
CRC = CRC_Calculate(&g_fsk_buffer[1], 2 + 64);
|
||||
CRC = CRC_Calculate(&g_aircopy_fsk_buffer[1], 2 + 64);
|
||||
|
||||
if (g_fsk_buffer[34] == CRC)
|
||||
if (g_aircopy_fsk_buffer[34] == CRC)
|
||||
{
|
||||
const uint16_t *pData;
|
||||
uint16_t Offset = g_fsk_buffer[1];
|
||||
if (Offset < 0x1E00)
|
||||
uint16_t eeprom_addr = g_aircopy_fsk_buffer[1];
|
||||
|
||||
if (eeprom_addr < AIRCOPY_LAST_EEPROM_ADDR)
|
||||
{
|
||||
pData = &g_fsk_buffer[2];
|
||||
const uint16_t *pData = &g_aircopy_fsk_buffer[2];
|
||||
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
EEPROM_WriteBuffer(Offset, pData);
|
||||
pData += 4;
|
||||
Offset += 8;
|
||||
EEPROM_WriteBuffer(eeprom_addr, pData);
|
||||
pData += 4;
|
||||
eeprom_addr += 8;
|
||||
}
|
||||
|
||||
if (Offset == 0x1E00)
|
||||
{
|
||||
//g_aircopy_block_number++;
|
||||
g_aircopy_block_number = eeprom_addr / 64;
|
||||
|
||||
if (eeprom_addr >= AIRCOPY_LAST_EEPROM_ADDR)
|
||||
{ // reached end of eeprom config area
|
||||
|
||||
g_aircopy_state = AIRCOPY_RX_COMPLETE;
|
||||
g_update_display = true;
|
||||
}
|
||||
|
||||
g_air_copy_block_number++;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
g_errors_during_air_copy++;
|
||||
g_aircopy_rx_errors++;
|
||||
}
|
||||
|
||||
static void AIRCOPY_Key_DIGITS(key_code_t Key, bool key_pressed, bool key_held)
|
||||
@ -154,7 +187,7 @@ static void AIRCOPY_Key_DIGITS(key_code_t Key, bool key_pressed, bool key_held)
|
||||
// round the frequency to nearest step size
|
||||
Frequency = ((Frequency + (g_rx_vfo->step_freq / 2)) / g_rx_vfo->step_freq) * g_rx_vfo->step_freq;
|
||||
|
||||
g_air_copy_freq = Frequency;
|
||||
g_aircopy_freq = Frequency;
|
||||
#ifdef ENABLE_AIRCOPY_FREQ
|
||||
SETTINGS_SaveSettings(); // remeber the frequency for the next time
|
||||
#endif
|
||||
@ -188,14 +221,14 @@ static void AIRCOPY_Key_EXIT(bool key_pressed, bool key_held)
|
||||
else
|
||||
{ // enter RX mode
|
||||
|
||||
g_aircopy_state = AIRCOPY_RX;
|
||||
g_update_display = true;
|
||||
g_aircopy_state = AIRCOPY_RX;
|
||||
g_update_display = true;
|
||||
GUI_DisplayScreen();
|
||||
|
||||
g_fsk_wite_index = 0;
|
||||
g_air_copy_block_number = 0;
|
||||
g_errors_during_air_copy = 0;
|
||||
g_input_box_index = 0;
|
||||
g_aircopy_fsk_write_index = 0;
|
||||
g_aircopy_block_number = 0;
|
||||
g_aircopy_rx_errors = 0;
|
||||
g_input_box_index = 0;
|
||||
|
||||
BK4819_PrepareFSKReceive();
|
||||
}
|
||||
@ -209,16 +242,17 @@ static void AIRCOPY_Key_MENU(bool key_pressed, bool key_held)
|
||||
if (!key_held && key_pressed)
|
||||
{ // enter TX mode
|
||||
|
||||
g_aircopy_state = AIRCOPY_TX;
|
||||
g_update_display = true;
|
||||
g_aircopy_state = AIRCOPY_TX;
|
||||
g_update_display = true;
|
||||
GUI_DisplayScreen();
|
||||
|
||||
g_fsk_wite_index = 0;
|
||||
g_air_copy_block_number = 0;
|
||||
g_input_box_index = 0;
|
||||
g_fsk_buffer[0] = 0xABCD;
|
||||
g_fsk_buffer[1] = 0;
|
||||
g_fsk_buffer[35] = 0xDCBA;
|
||||
g_input_box_index = 0;
|
||||
|
||||
g_aircopy_fsk_write_index = 0;
|
||||
g_aircopy_block_number = 0;
|
||||
g_aircopy_fsk_buffer[0] = AIRCOPY_MAGIC_START;
|
||||
g_aircopy_fsk_buffer[1] = 0; // block number
|
||||
g_aircopy_fsk_buffer[35] = AIRCOPY_MAGIC_END;
|
||||
|
||||
AIRCOPY_SendMessage();
|
||||
}
|
||||
|
Reference in New Issue
Block a user