2023-08-11 03:37:33 +08: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.
|
|
|
|
*/
|
|
|
|
|
2023-08-11 00:51:57 +08:00
|
|
|
#include "frequencies.h"
|
2023-08-15 05:26:27 +08:00
|
|
|
#include "misc.h"
|
|
|
|
#include "settings.h"
|
2023-08-11 00:51:57 +08:00
|
|
|
|
|
|
|
const uint32_t LowerLimitFrequencyBandTable[7] = {
|
|
|
|
5000000,
|
|
|
|
10800000,
|
|
|
|
13600000,
|
|
|
|
17400000,
|
|
|
|
35000000,
|
|
|
|
40000000,
|
|
|
|
47000000,
|
|
|
|
};
|
|
|
|
|
2023-08-11 18:51:17 +08:00
|
|
|
const uint32_t MiddleFrequencyBandTable[7] = {
|
|
|
|
6500000,
|
|
|
|
12200000,
|
|
|
|
15000000,
|
|
|
|
26000000,
|
|
|
|
37000000,
|
|
|
|
43500000,
|
|
|
|
55000000,
|
|
|
|
};
|
|
|
|
|
2023-08-11 00:51:57 +08:00
|
|
|
const uint32_t UpperLimitFrequencyBandTable[7] = {
|
|
|
|
7600000,
|
|
|
|
13599990,
|
|
|
|
17399990,
|
|
|
|
34999990,
|
|
|
|
39999990,
|
|
|
|
46999990,
|
|
|
|
60000000,
|
|
|
|
};
|
|
|
|
|
2023-09-14 18:30:08 +08:00
|
|
|
#if defined(ENABLE_NOAA)
|
2023-08-11 18:51:17 +08:00
|
|
|
const uint32_t NoaaFrequencyTable[10] = {
|
|
|
|
16255000,
|
|
|
|
16240000,
|
|
|
|
16247500,
|
|
|
|
16242500,
|
|
|
|
16245000,
|
|
|
|
16250000,
|
|
|
|
16252500,
|
|
|
|
16152500,
|
|
|
|
16177500,
|
|
|
|
16327500,
|
|
|
|
};
|
2023-09-14 18:30:08 +08:00
|
|
|
#endif
|
2023-08-11 18:51:17 +08:00
|
|
|
|
2023-09-15 21:54:03 +08:00
|
|
|
const uint16_t StepFrequencyTable[7] = {
|
2023-08-11 18:51:17 +08:00
|
|
|
250,
|
|
|
|
500,
|
|
|
|
625,
|
|
|
|
1000,
|
|
|
|
1250,
|
2023-09-15 21:54:03 +08:00
|
|
|
2500,
|
|
|
|
833,
|
2023-08-11 00:51:57 +08:00
|
|
|
};
|
|
|
|
|
2023-08-11 18:51:17 +08:00
|
|
|
FREQUENCY_Band_t FREQUENCY_GetBand(uint32_t Frequency)
|
|
|
|
{
|
2023-09-07 20:02:32 +08:00
|
|
|
if (Frequency >= 5000000 && Frequency <= 7600000) {
|
2023-08-11 18:51:17 +08:00
|
|
|
return BAND1_50MHz;
|
|
|
|
}
|
2023-09-07 20:02:32 +08:00
|
|
|
if (Frequency >= 10800000 && Frequency <= 13599990) {
|
2023-08-11 18:51:17 +08:00
|
|
|
return BAND2_108MHz;
|
|
|
|
}
|
2023-09-07 20:02:32 +08:00
|
|
|
if (Frequency >= 13600000 && Frequency <= 17399990) {
|
2023-08-11 18:51:17 +08:00
|
|
|
return BAND3_136MHz;
|
|
|
|
}
|
2023-09-07 20:02:32 +08:00
|
|
|
if (Frequency >= 17400000 && Frequency <= 34999990) {
|
2023-08-11 18:51:17 +08:00
|
|
|
return BAND4_174MHz;
|
|
|
|
}
|
2023-09-07 20:02:32 +08:00
|
|
|
if (Frequency >= 35000000 && Frequency <= 39999990) {
|
2023-08-11 18:51:17 +08:00
|
|
|
return BAND5_350MHz;
|
|
|
|
}
|
2023-09-07 20:02:32 +08:00
|
|
|
if (Frequency >= 40000000 && Frequency <= 46999990) {
|
2023-08-11 18:51:17 +08:00
|
|
|
return BAND6_400MHz;
|
|
|
|
}
|
2023-09-07 20:02:32 +08:00
|
|
|
if (Frequency >= 47000000 && Frequency <= 60000000) {
|
2023-08-11 18:51:17 +08:00
|
|
|
return BAND7_470MHz;
|
|
|
|
}
|
|
|
|
|
|
|
|
return BAND6_400MHz;
|
|
|
|
}
|
|
|
|
|
2023-08-30 18:11:35 +08: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-08-11 18:51:17 +08:00
|
|
|
{
|
|
|
|
if (Frequency <= LowerLimit) {
|
|
|
|
return TxpLow;
|
|
|
|
}
|
|
|
|
if (UpperLimit <= Frequency) {
|
|
|
|
return TxpHigh;
|
|
|
|
}
|
|
|
|
if (Frequency <= Middle) {
|
2023-08-30 02:17:01 +08:00
|
|
|
TxpMid += ((TxpMid - TxpLow) * (Frequency - LowerLimit)) / (Middle - LowerLimit);
|
|
|
|
return TxpMid;
|
2023-08-11 18:51:17 +08:00
|
|
|
}
|
|
|
|
|
2023-08-30 02:17:01 +08:00
|
|
|
TxpMid += ((TxpHigh - TxpMid) * (Frequency - Middle)) / (UpperLimit - Middle);
|
|
|
|
return TxpMid;
|
2023-08-11 18:51:17 +08:00
|
|
|
}
|
|
|
|
|
2023-08-30 02:17:01 +08:00
|
|
|
uint32_t FREQUENCY_FloorToStep(uint32_t Upper, uint32_t Step, uint32_t Lower)
|
2023-08-11 18:51:17 +08:00
|
|
|
{
|
|
|
|
uint32_t Index;
|
|
|
|
|
2023-08-28 20:37:16 +08:00
|
|
|
Index = (Upper - Lower) / Step;
|
|
|
|
return Lower + (Step * Index);
|
2023-08-11 18:51:17 +08:00
|
|
|
}
|
|
|
|
|
2023-08-20 22:28:17 +08:00
|
|
|
int FREQUENCY_Check(VFO_Info_t *pInfo)
|
2023-08-15 05:26:27 +08:00
|
|
|
{
|
|
|
|
uint32_t Frequency;
|
|
|
|
|
2023-09-18 03:38:39 +08:00
|
|
|
if (pInfo->CHANNEL_SAVE > FREQ_CHANNEL_LAST) {
|
2023-08-15 05:26:27 +08:00
|
|
|
return -1;
|
|
|
|
}
|
2023-09-08 01:40:33 +08:00
|
|
|
Frequency = pInfo->pTX->Frequency;
|
2023-09-03 09:07:08 +08:00
|
|
|
switch (gSetting_F_LOCK) {
|
|
|
|
case F_LOCK_FCC:
|
|
|
|
if (Frequency >= 14400000 && Frequency <= 14799990) {
|
2023-08-15 05:26:27 +08:00
|
|
|
return 0;
|
|
|
|
}
|
2023-09-03 09:07:08 +08:00
|
|
|
if (Frequency >= 42000000 && Frequency <= 44999990) {
|
|
|
|
return 0;
|
2023-08-15 05:26:27 +08:00
|
|
|
}
|
2023-09-03 09:07:08 +08:00
|
|
|
break;
|
2023-08-15 05:26:27 +08:00
|
|
|
|
2023-09-03 09:07:08 +08:00
|
|
|
case F_LOCK_CE:
|
|
|
|
if (Frequency >= 14400000 && Frequency <= 14599990) {
|
2023-08-15 05:26:27 +08:00
|
|
|
return 0;
|
|
|
|
}
|
2023-09-03 09:07:08 +08:00
|
|
|
break;
|
2023-08-15 05:26:27 +08:00
|
|
|
|
2023-09-03 09:07:08 +08:00
|
|
|
case F_LOCK_GB:
|
|
|
|
if (Frequency >= 14400000 && Frequency <= 14799990) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
if (Frequency >= 43000000 && Frequency <= 43999990) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case F_LOCK_430:
|
|
|
|
if (Frequency >= 13600000 && Frequency <= 17399990) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
if (Frequency >= 40000000 && Frequency <= 42999990) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case F_LOCK_438:
|
|
|
|
if (Frequency >= 13600000 && Frequency <= 17399990) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
if (Frequency >= 40000000 && Frequency <= 43799990) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
if (Frequency >= 13600000 && Frequency <= 17399990) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
if (Frequency >= 35000000 && Frequency <= 39999990) {
|
|
|
|
if (gSetting_350TX && gSetting_350EN) {
|
2023-08-15 05:26:27 +08:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
2023-09-03 09:07:08 +08:00
|
|
|
if (Frequency >= 40000000 && Frequency <= 46999990) {
|
2023-08-15 05:26:27 +08:00
|
|
|
return 0;
|
|
|
|
}
|
2023-09-03 09:07:08 +08:00
|
|
|
if (Frequency >= 17400000 && Frequency <= 34999990) {
|
|
|
|
if (gSetting_200TX) {
|
|
|
|
return 0;
|
|
|
|
}
|
2023-08-15 05:26:27 +08:00
|
|
|
}
|
|
|
|
|
2023-09-03 09:07:08 +08:00
|
|
|
if (Frequency >= 47000000 && Frequency <= 60000000) {
|
|
|
|
if (gSetting_500TX) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
2023-08-15 05:26:27 +08:00
|
|
|
}
|
|
|
|
|
2023-09-03 09:07:08 +08:00
|
|
|
return -1;
|
2023-08-15 05:26:27 +08:00
|
|
|
}
|
|
|
|
|