2023-09-09 08:03:56 +01:00
|
|
|
/* Copyright 2023 Dual Tachyon
|
|
|
|
* https://github.com/DualTachyon
|
|
|
|
*
|
|
|
|
* 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 "frequencies.h"
|
|
|
|
#include "misc.h"
|
|
|
|
#include "settings.h"
|
|
|
|
|
2023-10-13 15:12:32 +01:00
|
|
|
// the default AIRCOPY frequency to use
|
2023-10-12 14:55:10 +01:00
|
|
|
uint32_t g_aircopy_freq = 41002500;
|
2023-10-12 11:03:58 +01:00
|
|
|
|
2023-10-13 23:27:54 +01:00
|
|
|
// FM broadcast band lower/upper limit
|
|
|
|
const freq_band_table_t FM_RADIO_BAND = {760, 1080};
|
|
|
|
|
2023-09-27 21:28:30 +01:00
|
|
|
// the BK4819 has 2 bands it covers, 18MHz ~ 630MHz and 760MHz ~ 1300MHz
|
2023-10-13 15:12:32 +01:00
|
|
|
const freq_band_table_t BX4819_BAND1 = { 1800000, 63000000};
|
|
|
|
const freq_band_table_t BX4819_BAND2 = {84000000, 130000000};
|
2023-09-27 21:28:30 +01:00
|
|
|
|
2023-10-08 20:23:37 +01:00
|
|
|
const freq_band_table_t FREQ_BAND_TABLE[7] =
|
2023-09-09 08:03:56 +01:00
|
|
|
{
|
2023-09-14 09:56:30 +01:00
|
|
|
#ifndef ENABLE_WIDE_RX
|
2023-10-02 19:23:37 +01:00
|
|
|
// QS original
|
2023-10-02 14:13:27 +01:00
|
|
|
{ 5000000, 7600000},
|
|
|
|
{10800000, 13600000},
|
|
|
|
{13600000, 17400000},
|
|
|
|
{17400000, 35000000},
|
|
|
|
{35000000, 40000000},
|
|
|
|
{40000000, 47000000},
|
|
|
|
{47000000, 60000000}
|
2023-09-12 19:53:54 +01:00
|
|
|
#else
|
2023-10-02 19:23:37 +01:00
|
|
|
// extended range
|
2023-10-02 14:13:27 +01:00
|
|
|
{ 1800000, 10800000},
|
|
|
|
{10800000, 13600000},
|
|
|
|
{13600000, 17400000},
|
|
|
|
{17400000, 35000000},
|
|
|
|
{35000000, 40000000},
|
|
|
|
{40000000, 47000000},
|
|
|
|
{47000000, 130000000}
|
2023-09-12 19:53:54 +01:00
|
|
|
#endif
|
2023-09-09 08:03:56 +01:00
|
|
|
};
|
|
|
|
|
2023-09-14 09:56:30 +01:00
|
|
|
#ifdef ENABLE_NOAA
|
2023-10-13 15:12:32 +01:00
|
|
|
const uint32_t NOAA_FREQUENCY_TABLE[10] =
|
2023-09-09 08:03:56 +01:00
|
|
|
{
|
|
|
|
16255000,
|
|
|
|
16240000,
|
|
|
|
16247500,
|
|
|
|
16242500,
|
|
|
|
16245000,
|
|
|
|
16250000,
|
|
|
|
16252500,
|
|
|
|
16152500,
|
|
|
|
16177500,
|
2023-09-11 08:45:29 +01:00
|
|
|
16327500
|
2023-09-09 08:03:56 +01:00
|
|
|
};
|
|
|
|
#endif
|
|
|
|
|
2023-10-07 15:12:53 +01:00
|
|
|
#ifdef ENABLE_1250HZ_STEP
|
2023-10-02 19:23:37 +01:00
|
|
|
// includes 1.25kHz step
|
2023-10-08 20:23:37 +01:00
|
|
|
const uint16_t STEP_FREQ_TABLE[7] = {125, 250, 625, 1000, 1250, 2500, 833};
|
2023-10-07 15:12:53 +01:00
|
|
|
#else
|
|
|
|
// QS steps (*10 Hz)
|
2023-10-08 20:23:37 +01:00
|
|
|
const uint16_t STEP_FREQ_TABLE[7] = {250, 500, 625, 1000, 1250, 2500, 833};
|
2023-09-11 08:45:29 +01:00
|
|
|
#endif
|
2023-09-09 08:03:56 +01:00
|
|
|
|
2023-10-13 15:12:32 +01:00
|
|
|
frequency_band_t FREQUENCY_GetBand(uint32_t Frequency)
|
2023-09-09 08:03:56 +01:00
|
|
|
{
|
2023-09-28 10:17:45 +01:00
|
|
|
int band;
|
2023-10-08 20:23:37 +01:00
|
|
|
for (band = ARRAY_SIZE(FREQ_BAND_TABLE) - 1; band >= 0; band--)
|
|
|
|
if (Frequency >= FREQ_BAND_TABLE[band].lower)
|
|
|
|
// if (Frequency < FREQ_BAND_TABLE[band].upper)
|
2023-10-13 15:12:32 +01:00
|
|
|
return (frequency_band_t)band;
|
2023-10-02 19:23:37 +01:00
|
|
|
|
2023-09-28 10:17:45 +01:00
|
|
|
return BAND1_50MHz;
|
2023-10-02 14:13:27 +01:00
|
|
|
// return BAND_NONE;
|
2023-09-09 08:03:56 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
uint8_t FREQUENCY_CalculateOutputPower(uint8_t TxpLow, uint8_t TxpMid, uint8_t TxpHigh, int32_t LowerLimit, int32_t Middle, int32_t UpperLimit, int32_t Frequency)
|
|
|
|
{
|
2023-10-06 22:58:21 +01:00
|
|
|
uint8_t pwr = TxpMid;
|
|
|
|
|
2023-09-09 08:03:56 +01:00
|
|
|
if (Frequency <= LowerLimit)
|
|
|
|
return TxpLow;
|
|
|
|
|
2023-10-06 22:58:21 +01:00
|
|
|
if (Frequency >= UpperLimit)
|
2023-09-09 08:03:56 +01:00
|
|
|
return TxpHigh;
|
|
|
|
|
2023-10-06 22:58:21 +01:00
|
|
|
// linear interpolation
|
2023-09-09 08:03:56 +01:00
|
|
|
if (Frequency <= Middle)
|
2023-10-06 22:58:21 +01:00
|
|
|
pwr += ((TxpMid - TxpLow) * (Frequency - LowerLimit)) / (Middle - LowerLimit);
|
|
|
|
else
|
|
|
|
pwr += ((TxpHigh - TxpMid) * (Frequency - Middle)) / (UpperLimit - Middle);
|
|
|
|
return pwr;
|
2023-09-09 08:03:56 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
uint32_t FREQUENCY_FloorToStep(uint32_t Upper, uint32_t Step, uint32_t Lower)
|
|
|
|
{
|
2023-10-08 11:40:17 +01:00
|
|
|
#if 1
|
|
|
|
uint32_t Index;
|
|
|
|
|
|
|
|
if (Step == 833)
|
|
|
|
{
|
|
|
|
const uint32_t Delta = Upper - Lower;
|
|
|
|
uint32_t Base = (Delta / 2500) * 2500;
|
|
|
|
const uint32_t Index = ((Delta - Base) % 2500) / 833;
|
|
|
|
|
|
|
|
if (Index == 2)
|
|
|
|
Base++;
|
|
|
|
|
|
|
|
return Lower + Base + (Index * 833);
|
|
|
|
}
|
|
|
|
|
|
|
|
Index = (Upper - Lower) / Step;
|
|
|
|
|
|
|
|
return Lower + (Step * Index);
|
|
|
|
#else
|
|
|
|
return Lower + (((Upper - Lower) / Step) * Step);
|
|
|
|
#endif
|
2023-09-09 08:03:56 +01:00
|
|
|
}
|
|
|
|
|
2023-10-01 19:17:51 +01:00
|
|
|
int TX_freq_check(const uint32_t Frequency)
|
2023-09-27 21:28:30 +01:00
|
|
|
{ // return '0' if TX frequency is allowed
|
|
|
|
// otherwise return '-1'
|
|
|
|
|
2023-10-14 10:33:21 +01:00
|
|
|
if (Frequency < BX4819_BAND1.lower || Frequency > BX4819_BAND2.upper)
|
|
|
|
return -1; // BX radio chip does not work out this range
|
2023-10-02 09:31:35 +01:00
|
|
|
|
2023-10-13 15:12:32 +01:00
|
|
|
if (Frequency >= BX4819_BAND1.upper && Frequency < BX4819_BAND2.lower)
|
2023-10-14 10:33:21 +01:00
|
|
|
return -1; // BX radio chip does not work in this range
|
|
|
|
|
|
|
|
if (Frequency >= 10800000 && Frequency < 13600000)
|
|
|
|
return -1; // TX not allowed in the airband
|
|
|
|
|
|
|
|
if (Frequency < FREQ_BAND_TABLE[0].lower || Frequency > FREQ_BAND_TABLE[ARRAY_SIZE(FREQ_BAND_TABLE) - 1].upper)
|
|
|
|
return -1; // TX not allowed outside this range
|
2023-09-09 08:03:56 +01:00
|
|
|
|
2023-10-11 16:02:45 +01:00
|
|
|
switch (g_setting_freq_lock)
|
2023-09-09 08:03:56 +01:00
|
|
|
{
|
2023-10-14 10:33:21 +01:00
|
|
|
case FREQ_LOCK_OFF:
|
|
|
|
#ifdef ENABLE_TX_EVERYWHERE
|
2023-09-18 00:48:40 +01:00
|
|
|
return 0;
|
2023-10-14 10:33:21 +01:00
|
|
|
#else
|
|
|
|
if (Frequency >= 13600000 && Frequency < 17400000)
|
2023-09-18 00:48:40 +01:00
|
|
|
return 0;
|
2023-10-14 10:33:21 +01:00
|
|
|
if (Frequency >= 17400000 && Frequency < 35000000)
|
|
|
|
if (g_setting_200_tx_enable)
|
|
|
|
return 0;
|
|
|
|
if (Frequency >= 35000000 && Frequency < 40000000)
|
|
|
|
if (g_setting_350_tx_enable && g_setting_350_enable)
|
|
|
|
return 0;
|
|
|
|
if (Frequency >= 40000000 && Frequency < 47000000)
|
2023-09-18 00:48:40 +01:00
|
|
|
return 0;
|
2023-10-14 10:33:21 +01:00
|
|
|
if (Frequency >= 47000000 && Frequency <= 60000000)
|
|
|
|
if (g_setting_500_tx_enable)
|
|
|
|
return 0;
|
|
|
|
#endif
|
2023-09-18 00:48:40 +01:00
|
|
|
break;
|
|
|
|
|
2023-10-14 10:33:21 +01:00
|
|
|
case FREQ_LOCK_FCC:
|
2023-09-11 08:45:29 +01:00
|
|
|
if (Frequency >= 14400000 && Frequency < 14800000)
|
2023-09-09 08:03:56 +01:00
|
|
|
return 0;
|
2023-09-11 08:45:29 +01:00
|
|
|
if (Frequency >= 42000000 && Frequency < 45000000)
|
2023-09-09 08:03:56 +01:00
|
|
|
return 0;
|
|
|
|
break;
|
|
|
|
|
2023-10-14 10:33:21 +01:00
|
|
|
case FREQ_LOCK_CE:
|
2023-09-11 08:45:29 +01:00
|
|
|
if (Frequency >= 14400000 && Frequency < 14600000)
|
2023-09-09 08:03:56 +01:00
|
|
|
return 0;
|
2023-10-01 14:34:51 +01:00
|
|
|
if (Frequency >= 43000000 && Frequency < 44000000)
|
|
|
|
return 0;
|
2023-09-09 08:03:56 +01:00
|
|
|
break;
|
|
|
|
|
2023-10-14 10:33:21 +01:00
|
|
|
case FREQ_LOCK_GB:
|
2023-09-11 08:45:29 +01:00
|
|
|
if (Frequency >= 14400000 && Frequency < 14800000)
|
2023-09-09 08:03:56 +01:00
|
|
|
return 0;
|
2023-09-11 08:45:29 +01:00
|
|
|
if (Frequency >= 43000000 && Frequency < 44000000)
|
2023-09-09 08:03:56 +01:00
|
|
|
return 0;
|
|
|
|
break;
|
|
|
|
|
2023-10-14 10:33:21 +01:00
|
|
|
case FREQ_LOCK_430:
|
2023-09-11 08:45:29 +01:00
|
|
|
if (Frequency >= 13600000 && Frequency < 17400000)
|
2023-09-09 08:03:56 +01:00
|
|
|
return 0;
|
2023-09-11 08:45:29 +01:00
|
|
|
if (Frequency >= 40000000 && Frequency < 43000000)
|
2023-09-09 08:03:56 +01:00
|
|
|
return 0;
|
|
|
|
break;
|
|
|
|
|
2023-10-14 10:33:21 +01:00
|
|
|
case FREQ_LOCK_438:
|
2023-09-11 08:45:29 +01:00
|
|
|
if (Frequency >= 13600000 && Frequency < 17400000)
|
2023-09-09 08:03:56 +01:00
|
|
|
return 0;
|
2023-09-11 08:45:29 +01:00
|
|
|
if (Frequency >= 40000000 && Frequency < 43800000)
|
2023-09-09 08:03:56 +01:00
|
|
|
return 0;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2023-09-18 00:48:40 +01:00
|
|
|
// dis-allowed TX frequency
|
2023-09-09 08:03:56 +01:00
|
|
|
return -1;
|
|
|
|
}
|
2023-09-27 21:28:30 +01:00
|
|
|
|
2023-10-01 19:17:51 +01:00
|
|
|
int RX_freq_check(const uint32_t Frequency)
|
2023-09-27 21:28:30 +01:00
|
|
|
{ // return '0' if RX frequency is allowed
|
|
|
|
// otherwise return '-1'
|
|
|
|
|
2023-10-08 20:23:37 +01:00
|
|
|
if (Frequency < FREQ_BAND_TABLE[0].lower || Frequency > FREQ_BAND_TABLE[ARRAY_SIZE(FREQ_BAND_TABLE) - 1].upper)
|
2023-09-27 21:28:30 +01:00
|
|
|
return -1;
|
2023-10-02 14:13:27 +01:00
|
|
|
|
2023-10-13 15:12:32 +01:00
|
|
|
if (Frequency >= BX4819_BAND1.upper && Frequency < BX4819_BAND2.lower)
|
2023-09-27 21:28:30 +01:00
|
|
|
return -1;
|
|
|
|
|
|
|
|
return 0; // OK frequency
|
|
|
|
}
|