Files
TEF6686_ESP32/src/TEF6686.h
T
andimikandGitHub fb2edabe71 Fixed OIRT band ends
lowest used frequency in Russia: 65,75 MHz, then 30 kHz steps, 
highes used frequency in Russia: 73,97 MHz, but we need to set it to 74 MHz

Remark: lines 50 and 51 need to be set **not** in kHz, but 1/10 x kHz value.

Source: https://www.fmlist.org
2023-06-26 23:31:36 +02:00

279 lines
8.0 KiB
C++

#define TEF6686_h
#include "Arduino.h"
#include "Tuner_Drv_Lithio.h"
#include "Tuner_Interface.h"
enum RDS_GROUPS {
RDS_GROUP_0A, RDS_GROUP_0B, RDS_GROUP_1A, RDS_GROUP_1B, RDS_GROUP_2A, RDS_GROUP_2B, RDS_GROUP_3A, RDS_GROUP_3B,
RDS_GROUP_4A, RDS_GROUP_4B, RDS_GROUP_5A, RDS_GROUP_5B, RDS_GROUP_6A, RDS_GROUP_6B, RDS_GROUP_7A, RDS_GROUP_7B,
RDS_GROUP_8A, RDS_GROUP_8B, RDS_GROUP_9A, RDS_GROUP_9B, RDS_GROUP_10A, RDS_GROUP_10B, RDS_GROUP_11A, RDS_GROUP_11B,
RDS_GROUP_12A, RDS_GROUP_12B, RDS_GROUP_13A, RDS_GROUP_13B, RDS_GROUP_14A, RDS_GROUP_14B, RDS_GROUP_15A, RDS_GROUP_15B
};
enum RADIO_BAND {
BAND_FM, BAND_LW, BAND_MW, BAND_SW
};
enum RADIO_TUNE_MODE {
TUNE_MAN, TUNE_AUTO, TUNE_MEM, TUNE_MI_BAND
};
#define TIMER_OFFSET_TIMER (TIMER_500_TICK)
#define TIMER_BW_TIMER (TIMER_500_TICK)
#define TIMER_SNR_TIMER (TIMER_500_TICK)
#define TIMER_500_TICK 500
#define BAT_LEVEL_EMPTY 1600
#define BAT_LEVEL_WARN 1700
#define BAT_LEVEL_FULL 2270
#define BAT_LEVEL_STAGE 4
#define FREQ_MW_STEP_9K 9
#define FREQ_MW_STEP_10K 10
#define FREQ_SW_STEP_5K 5
#define FREQ_FM_STEP_50K 5
#define FREQ_FM_STEP_30K 3
#define FREQ_LW_LOW_EDGE_MIN 144
#define FREQ_LW_HIGH_EDGE_MAX 519
#define FREQ_MW_LOW_EDGE_MIN_9K 522
#define FREQ_MW_LOW_EDGE_MIN_10K 520
#define FREQ_MW_HIGH_EDGE_MAX_9K 1791
#define FREQ_MW_HIGH_EDGE_MAX_10K 1700
#define FREQ_SW_LOW_EDGE_MIN 1700
#define FREQ_SW_LOW_EDGE_MAX (FREQ_SW_160M_START)
#define FREQ_SW_HIGH_EDGE_MIN (FREQ_SW_11M_END)
#define FREQ_SW_HIGH_EDGE_MAX (FREQ_SW_END)
#define FREQ_FM_START 65000
#define FREQ_FM_END 108000
#define FREQ_FM_OIRT_START 6575 // use values of 1/10 * kHz
#define FREQ_FM_OIRT_END 7400 // use values of 1/10 * kHz
// according to https://www.short-wave.info/index.php?feature=frequencies
#define FREQ_SW_START 1800
#define FREQ_SW_END 27000
#define FREQ_SW_160M_START 1800
#define FREQ_SW_160M_END 2000
#define FREQ_SW_120M_START 2300
#define FREQ_SW_120M_END 2495
#define FREQ_SW_90M_START 3200
#define FREQ_SW_90M_END 3400
#define FREQ_SW_75M_START 3900
#define FREQ_SW_75M_END 4000
#define FREQ_SW_60M_START 4750
#define FREQ_SW_60M_END 4995
#define FREQ_SW_49M_START 5900
#define FREQ_SW_49M_END 6200
#define FREQ_SW_41M_START 7200
#define FREQ_SW_41M_END 7450
#define FREQ_SW_31M_START 9400
#define FREQ_SW_31M_END 9900
#define FREQ_SW_25M_START 11600
#define FREQ_SW_25M_END 12100
#define FREQ_SW_22M_START 13570
#define FREQ_SW_22M_END 13870
#define FREQ_SW_19M_START 15100
#define FREQ_SW_19M_END 15800
#define FREQ_SW_16M_START 17480
#define FREQ_SW_16M_END 17900
#define FREQ_SW_15M_START 18900
#define FREQ_SW_15M_END 19020
#define FREQ_SW_13M_START 21450
#define FREQ_SW_13M_END 21850
#define FREQ_SW_11M_START 25670
#define FREQ_SW_11M_END 26100
#define SW_MI_BAND_GAP 0
#define SW_MI_BAND_11M 11
#define SW_MI_BAND_13M 13
#define SW_MI_BAND_15M 15
#define SW_MI_BAND_16M 16
#define SW_MI_BAND_19M 19
#define SW_MI_BAND_22M 22
#define SW_MI_BAND_25M 25
#define SW_MI_BAND_31M 31
#define SW_MI_BAND_41M 41
#define SW_MI_BAND_49M 49
#define SW_MI_BAND_60M 60
#define SW_MI_BAND_75M 75
#define SW_MI_BAND_90M 90
#define SW_MI_BAND_120M 120
#define SW_MI_BAND_160M 160
const char* const PTY_EU[] {
"None",
"News",
"Current Affairs",
"Information",
"Sport",
"Education",
"Drama",
"Cultures",
"Science",
"Varied Speech",
"Pop Music",
"Rock Music",
"Easy Listening",
"Light Classics",
"Serious Classics",
"Other Music",
"Weather",
"Finance",
"Children's Progs",
"Social Affair",
"Religion",
"Phone In",
"Travel & Touring",
"Leisure & Hobby",
"Jazz Music",
"Country Music",
"National Music",
"Oldies Music",
"Folk Music",
"Documentary",
"Alarm Test",
"Alarm!!!",
" "
};
const char* const PTY_USA[] {
"None",
"News",
"Information",
"Sports",
"Talk",
"Rock",
"Classic Rock",
"Adult Hits",
"Soft Rock",
"Top 40",
"Country",
"Oldies",
"Soft",
"Nostalgia",
"Jazz",
"Classical",
"Rhythm and Blues ",
"Soft R & B",
"Foreign_Language",
"Religious Music",
"Religious Talk",
"Personality",
"Public",
"College",
"Hablar Espanol",
"Musica Espanol",
"Hip Hop",
" ",
" ",
"Weather",
"Emergency Test",
"ALERT! ALERT!",
" "
};
typedef struct _rds_ {
byte region;
byte stationTypeCode;
byte MS;
String stationName;
String stationText;
char stationType[17];
char picode[6];
uint16_t hours, minutes, days, months, years, offsetplusmin, rdsA, rdsB, rdsC, rdsD, rdsErr;
int8_t offset;
int ECC;
bool rdsAerror;
bool rdsBerror;
bool rdsCerror;
bool rdsDerror;
bool hasRDS;
bool hasECC;
bool hasRT;
bool hasTP;
bool hasTA;
bool hasEON;
bool hasAF;
bool hasCT;
bool rtAB;
bool correct;
bool filter;
bool underscore;
bool rdsreset;
bool dynamicpi;
} rds_;
typedef struct _af_ {
uint16_t frequency;
} af_;
class TEF6686 {
public:
af_ af[50];
rds_ rds;
void readRDS(bool showrdserrors);
void SetFreq(uint16_t frequency);
void SetFreqAM(uint16_t frequency);
bool getProcessing(uint16_t &highcut, uint16_t &stereo, uint16_t &sthiblend, uint8_t &stband_1, uint8_t &stband_2, uint8_t &stband_3, uint8_t &stband_4);
bool getStatus(int16_t &level, uint16_t &USN, uint16_t &WAM, int16_t &offset, uint16_t &bandwidth, uint16_t &modulation);
bool getStatusAM(int16_t &level, uint16_t &noise, uint16_t &cochannel, int16_t &offset, uint16_t &bandwidth, uint16_t &modulation);
bool getIdentification(uint16_t &device, uint16_t &hw_version, uint16_t &sw_version);
void setSoftmuteFM(uint8_t mode);
void setSoftmuteAM(uint8_t mode);
void setMono(bool mono);
bool getStereoStatus();
void init(byte TEF);
void clearRDS(bool fullsearchrds);
void power(bool mode);
void setAGC(uint8_t agc);
void setiMS(bool mph);
void setEQ(bool eq);
void setDeemphasis(uint8_t timeconstant);
void setAudio(uint8_t audio);
void setFMABandw();
void setFMBandw(uint16_t bandwidth);
void setAMBandw(uint16_t bandwidth);
void setHighCutLevel(uint16_t limit);
void setHighCutOffset(uint8_t start);
void setStHiBlendLevel(uint16_t limit);
void setStHiBlendOffset(uint8_t start);
void setFMNoiseBlanker(uint16_t start);
void setAMCoChannel(uint16_t start);
void setAMNoiseBlanker(uint16_t start);
void setAMAttenuation(uint16_t start);
void setMute();
void setOffset(int8_t offset);
void setFMSI(uint8_t mode);
void setFMSI_Time(uint16_t attack, uint16_t decay);
void setFMSI_Gain(uint16_t band1, uint16_t band2, uint16_t band3, uint16_t band4);
void setFMSI_Bias(int16_t band1, int16_t band2, int16_t band3, int16_t band4);
void setStereoLevel(uint8_t start);
void setUnMute();
void setVolume(int8_t volume);
void tone(uint16_t time, int16_t amplitude, uint16_t frequency);
uint8_t af_counter;
bool mute;
private:
void RDScharConverter(const char* input, wchar_t* output, size_t size);
String convertToUTF8(const wchar_t* input);
char ps_buffer[9];
bool ps_process;
bool rt_process;
char rt_buffer[65];
bool useRTPlus = true;
bool checkDouble (uint16_t value);
bool ABold;
char stationTextBuffer[65];
uint64_t doublecheck;
uint16_t rdsBprevious;
uint16_t rdsCprevious;
uint16_t rdsDprevious;
bool correctpi;
bool rtABold;
wchar_t PStext[9] = L"";
byte ps_counter;
};