Files
TEF6686_ESP32/include/TEF6686.h

645 lines
21 KiB
C++

#pragma once
#include "Arduino.h"
#include "Tuner_Drv_Lithio.h"
#include "Tuner_Interface.h"
#include "RdsPiBuffer.hpp"
#include "change_detector.h"
#include "rtc.hpp"
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
};
static const uint16_t fixedPI[] = {0x4C10, 0x4C11, 0x4C12};
static const char* const PTY_EU[] {
"None",
"News",
"Current Affairs",
"Information",
"Sport",
"Education",
"Drama",
"Culture",
"Science",
"Varied",
"Pop",
"Rock",
"Easy Listening",
"Light Classical",
"Serious Classical",
"Other Music",
"Weather",
"Finance",
"Children's Progs",
"Social Affairs",
"Religion",
"Phone-In",
"Travel",
"Leisure",
"Jazz",
"Country",
"National Music",
"Oldies",
"Folk",
"Documentary",
"Alarm Test",
"Alarm!!!",
"Receiver fault"
};
static const char* const PTY_USA[] {
"None",
"News",
"Information",
"Sports",
"Talk",
"Rock",
"Classic Rock",
"Adult Hits",
"Soft Rock",
"Top 40",
"Country",
"Oldies",
"Soft Music",
"Nostalgia",
"Jazz",
"Classical",
"Rhythm and Blues",
"Soft R & B",
"Language",
"Religious Music",
"Religious Talk",
"Personality",
"Public",
"College",
"Spanish Talk",
"Spanish Music",
"Hip Hop",
"Unknown",
"Unknown",
"Weather",
"Emergency Test",
"EMERGENCY!",
"Receiver fault"
};
static const uint16_t oda_app_ids[] {
0x0000, 0x0093, 0x0BCB, 0x0C24, 0x0CC1, 0x0D45, 0x0D8B, 0x0E2C, 0x0E31, 0x0F87,
0x125F, 0x1BDA, 0x1C5E, 0x1C68, 0x1CB1, 0x1D47, 0x1DC2, 0x1DC5, 0x1E8F, 0x4400,
0x4AA1, 0x4AB7, 0x4BA2, 0x4BD7, 0x4BD8, 0x4C59, 0x4D87, 0x4D95, 0x4D9A, 0x50DD,
0x5757, 0x6363, 0x6365, 0x6552, 0x6A7A, 0x7373, 0xA112, 0xA911, 0xABCE, 0xABCF,
0xBE22, 0xC350, 0xC3A1, 0xC3B0, 0xC3C3, 0xC4D4, 0xC549, 0xC563, 0xC6A7, 0xC737,
0xCB73, 0xCB97, 0xCC21, 0xCD19, 0xCD46, 0xCD47, 0xCD9E, 0xCE6B, 0xE123, 0xE1C1,
0xE319, 0xE411, 0xE440, 0xE4A6, 0xE5D7, 0xE911, 0xFF70, 0xFF7F, 0xFF80, 0xFF81
};
static const char* const ECCtext[] {
"Bundesrepublik Deutschland", // 0
"Ελληνική Δημοκρατία / (Hellenic Republic)", // 1
"Kingdom of Morroco", // 2
"Republica Moldova", // 3
"People's Democratic Republic of Algeria", // 4
"Κυπριακή Δημοκρατία / (Republic of Cyprus)", // 5
"Česká republika", // 6
"Ireland", // 7
"Eesti Vabariik / (Republic of Estonia)", // 8
"Principat d'Andorra", // 9
"Repubblica di San Marino", // 10
"Rzeczpospolita Polska", // 11
"Türkiye Cumhuriyeti", // 12
"State of Israel", // 13
"Confoederatio Helvetica", // 14 - they are neutral that much, that they fucking use a latin name for the country instead of their three official ones
"Status Civitatis Vaticanae", // 15
"The former Yugoslav Republic of Macedonia", // 16
"Repubblica Italiana", // 17
"Hashemite Kingdom of Jordan", // 18
"Slovenská republika", // 19
"Koninkrijk België / Royaume de Belgique", // 20
"Suomen tasavalta / (Republic of Finland)", // 21
"Syrian Arab Republic", // 22
"Republic of Serbia", // 23
"Україна / (Ukraine)", // 24
"Российская Федерация / (Russian Federation)", // 25
"Groussherzogtum Lëtzebuerg / (Grand Duchy of Luxembourg)", // 26
"Republic of Tunisia", // 27
"State of Palestine", // 28
"Република България / (Republic of Bulgaria)", // 29
"Republic of Portugal (Madeira)", // 30
"Koninkrijk der Nederlanden", // 31
"Republic of Portugal", // 32
"Republika e Shqipërisë (Republic of Albania)", // 33
"Kongeriget Danmark", // 34
"Fürstentum Liechtenstein", // 35
"Latvijas Republika", // 36
"Republika Slovenija", // 37
"Bundesrepublik Österreich", // 38
"United Kingdom of Great Britain and Northern Ireland (Gibraltar)", // 39
"Lýðveldið Ísland / (Iceland)", // 40
"Republic of Lebanon", // 41
"Magyarország / (Hungary)", // 42
"Republic of Iraq", // 43
"Principality of Monaco", // 44
"Republic of Malta", // 45
"United Kingdom of Great Britain and Northern Ireland", // 46
"Lietuvos Respublika / (Republic of Lithuania)", // 47
"Republika Hrvatska / (Republic of Croatia)", // 48
"Libya", // 49
"Kingdom of Spain (Canary Islands)", // 50
"România", // 51
"Reino de España / (Kingdom of Spain)", // 52
"Konungariket Sverige / (Kingdom of Sweden)", // 53
"Arab Republic of Egypt", // 54
"République de France", // 55
"Kongeriket Norge", // 56
"Republic of Belarus", // 57
"Bosnia and Herzegovina", // 58
"Montenegro", // 59
"Republic of Armenia", // 60
"Republic of Azerbaijan", // 61
"Republika e Kosovës", // 62
"Kyrgyz Republic", // 63
"Turkmenistan", // 64
"Republic of Tajikistan", // 65
"Republic of Uzbekistan", // 66
"Republic of Malawi", // 67
"Republic of Mali", // 68
"Islamic Republic of Mauritania", // 69
"Republic of Mauritius", // 70
"Mongolia", // 71
"Republic of Mozambique", // 72
"Republic of Namibia", // 73
"Republic of the Niger", // 74
"Federal Republic of Nigeria", // 75
"Sultanate of Oman", // 76
"State of Qatar", // 77
"Republic of Rwanda", // 78
"Democratic Republic of Sao Tome and Principe", // 79
"Kingdom of Saudi Arabia", // 80
"Republic of Senegal", // 81
"Republic of Seychelles", // 82
"Republic of Sierra Leone", // 83
"Federal Republic of Somalia", // 84
"Republic of South Africa", // 85
"Republic of South Sudan", // 86
"Republic of the Sudan", // 87
"Kingdom of Swaziland", // 88
"United Republic of Tanzania", // 89
"Republic of Togo", // 90
"Republic of Uganda", // 91
"Polisario Front / Kingdom of Morocco (Western Sahara)", // 92
"Republic of Yemen", // 93
"Republic of Zambia", // 94
"Republic of Zimbabwe", // 95
"Republic of Angola", // 96
"United Kingdom of Great Britain and Northern Ireland (Ascension Island)", // 97
"Kingdom of Bahrain", // 98
"Republic of Benin", // 99
"Republic of Botswana", // 100
"Burkina Faso", // 101
"Republic of Burundi", // 102
"Republic of Cabinda / Republic of Angola", // 103
"Republic of Cameroon", // 104
"Republic of Cabo Verde (Cape Verde)", // 105
"Central African Republic", // 106
"Republic of Chad", // 107
"Union of the Comoros", // 108
"Democratic Republic of the Congo", // 109
"Republic of the Congo", // 110
"Republic of Côte d'Ivoire (Ivory Coast)", // 111
"Republic of Djibouti", // 112
"Republic of Equatorial Guinea", // 113
"State of Eritrea", // 114
"Federal Democratic Republic of Ethiopia", // 115
"Gabonese Republic", // 116
"Islamic Republic of the Gambia", // 117
"Georgia", // 118
"Republic of Ghana", // 119
"Republic of Guinea", // 120
"Republic of Guinea-Bissau", // 121
"Republic of Kazakhstan", // 122
"Republic of Kenya", // 123
"State of Kuwait", // 124
"Kingdom of Lesotho", // 125
"Republic of Liberia", // 126
"Republic of Madagascar", // 127
"United Arab Emirates", // 128
"United Kingdom of Great Britain and Northern Ireland (Anguilla)", // 129
"Antigua and Barbuda", // 130
"Republic of Argentina", // 131
"Kingdom of the Netherlands (Aruba)", // 132
"Barbados", // 133
"Belize", // 134
"United Kingdom of Great Britain and Northern Ireland (Bermuda)", // 135
"Plurinational State of Bolivia", // 136
"República Federativa do Brasil", // 137
"Canada", // 138
"United Kingdom of Great Britain and Northern Ireland (Cayman Islands)", // 139
"Republic of Chile", // 140
"Republic of Colombia", // 141
"Republic of Costa Rica", // 142
"Republic of Cuba", // 143
"Commonwealth of Dominica", // 144
"Dominican Republic", // 145
"Republic of El Salvador", // 146
"Republic of Ecuador", // 147
"United Kingdom of Great Britain and Northern Ireland (Falkland Islands)", // 148
"Kingdom of Denmark (Greenland, NOT USA)", // 149
"Grenada", // 150
"Republic of France (Guadeloupe)", // 151
"Republic of Guatemala", // 152
"Republic of Guyana", // 153
"Republic of Haiti", // 154
"Republic of Honduras", // 155
"Jamaica", // 156
"Republic of France (Martinique)", // 157
"Estados Unidos Mexicanos", // 158
"United Kingdom of Great Britain and Northern Ireland (Montserrat)", // 159
"Netherlands Antilles (does not exist)", // 160
"Republic of Nicaragua", // 161
"Republic of Panama", // 162
"Republic of Paraguay", // 163
"Republic of Peru", // 164
"United States of America (Puerto Rico)", // 165
"Saint Kitts and Nevis", // 166
"Saint Lucia", // 167
"Republic of France (Saint Pierre and Miquelon)", // 168
"Saint Vincent and the Grenadines", // 169
"Republic of Suriname", // 170
"Republic of Trinidad and Tobago", // 171
"United Kingdom of Great Britain and Northern Ireland (Turks and Caicos Islands)", // 172
"United States of America", // 173
"Oriental Republic of Uruguay", // 174
"Bolivarian Republic of Venezuela", // 175
"United Kingdom of Great Britain and Northern Ireland (Virgin Islands)", // 176
"United States of America (Virgin Islands)", // 177
"Islamic Republic of Afghanistan", // 178
"Commonwealth of Australia - Capital Territory", // 179
"Commonwealth of Australia - New South Wales", // 180
"Commonwealth of Australia - Victoria", // 181
"Commonwealth of Australia - Queensland", // 182
"Commonwealth of Australia - South Australia", // 183
"Commonwealth of Australia - Western Australia", // 184
"Commonwealth of Australia - Tasmania", // 185
"Commonwealth of Australia - Northern Territory", // 186
"Kingdom of Bhutan", // 187
"Negara Brunei Darussalam", // 188
"Kingdom of Cambodia", // 189
"People's Republic of China", // 190
"Republic of Fiji", // 191
"People's Republic of China (Hong Kong)", // 192
"Republic of India", // 193
"Republic of Indonesia", // 194
"Islamic Republic of Iran", // 195
"Japan", // 196
"Republic of Kiribati", // 197
"Democratic People's Republic of Korea (North Korea)", // 198
"Republic of Korea (South Korea)", // 199
"Lao People's Democratic Republic", // 200
"People's Republic of China (Macao)", // 201
"Malaysia", // 202
"Republic of Maldives", // 203
"United States of America (Marshall Islands)", // 204
"Federated States of Micronesia", // 205
"Republic of the Union of Myanmar", // 206
"Republic of Nauru", // 207
"Federal Democratic Republic of Nepal", // 208
"New Zealand", // 209
"Islamic Republic of Pakistan", // 210
"Independent State of Papua New Guinea", // 211
"Republic of the Philippines", // 212
"Independent State of Samoa", // 213
"Republic of Singapore", // 214
"Solomon Islands", // 215
"Democratic Socialist Republic of Sri Lanka", // 216
"Republic of China (Taiwan)", // 217
"Kingdom of Thailand", // 218
"Kingdom of Tonga", // 219
"Republic of Vanuatu", // 220
"Socialist Republic of Viet Nam", // 221
"Commonwealth of the Bahamas", // 222
"United Kingdom of Great Britain and Northern Ireland (Bermuda) / Federative Republic of Brazil", // 223
"Federative Republic of Brazil / Republic of Ecuador", // 224
"Netherlands Antilles (does not exist) / Federative Republic of Brazil", // 225
"United States of America", // 226
"People's Republic of Bangladesh", // 227
"Rzeczpospolita Zachodniej Polski" // 228 - doesn't exist, YET, we don't want a fucking pimp for president here
};
static const char* const oda_app_names[] {
"None",
"Cross referencing DAB within RDS",
"Leisure & Practical Info for Drivers",
"ELECTRABEL-DSM 7",
"WiPla Broadcast Control Signal",
"RDS-TMC: ALERT-C / EN ISO 14819-1 (for testing use, only)",
"ELECTRABEL-DSM 18",
"ELECTRABEL-DSM 3",
"ELECTRABEL-DSM 13",
"ELECTRABEL-DSM 2",
"I-FM-RDS for Fixed and Mobile devices",
"ELECTRABEL-DSM 1",
"ELECTRABEL-DSM 20",
"ITIS In-vehicle database",
"ELECTRABEL-DSM 10",
"ELECTRABEL-DSM 4",
"CITIBUS 4",
"Encrypted TTI using ALERT-Plus only (for testing use, only)",
"ELECTRABEL-DSM 17",
"RDS-Light",
"RASANT",
"ELECTRABEL-DSM 9",
"ELECTRABEL-DSM 5",
"RadioText Plus / RT+ for group 2A RT",
"RadioText Plus / RT+ for eRT",
"CITIBUS 2",
"Radio Commerce System (RCS)",
"ELECTRABEL-DSM 16",
"ELECTRABEL-DSM 11",
"To warn people in case of disasters or emergency",
"Personal weather station",
"Hybradio RDS-Net (for testing use, only)",
"RDS2 - 9 bit AF lists ODA",
"Enhanced RadioText / eRT",
"Warning receiver",
"Enhanced early warning system",
"NL _ Alert system",
"Data FM Selective Multipoint Messaging",
"Fleximax",
"RF Power Monitoring",
"Push-Ad",
"NRSC Song title and artist",
"Personal Radio Service",
"iTunes tagging",
"Traffic Plus",
"eEAS",
"Smart Grid Broadcast Channel",
"ID Logic",
"Veil Enabled Interactive Device",
"UMC - Utility Message Channel",
"CITIBUS 1",
"ELECTRABEL-DSM 14",
"CITIBUS 3",
"TokenMe",
"RDS-TMC: ALERT-C",
"RDS-TMC: ALERT-C",
"ELECTRABEL-DSM 8",
"Encrypted TTI using ALERT-Plus only (for service use, only)",
"APS Gateway",
"Action code",
"ELECTRABEL-DSM 12",
"Beacon downlink",
"ELECTRABEL-DSM 15",
"ELECTRABEL-DSM 19",
"ELECTRABEL-DSM 6",
"EAS open protocol",
"Internet connection",
"RFT: Station logo",
"RFT: Slideshow",
"RFT: Journaline (work title)"
};
struct DABFrequencyLabel {
uint32_t frequency;
const char* label;
};
const DABFrequencyLabel DABfrequencyTable[] = {
{ 174928, "5A"}, { 176640, "5B"}, { 178352, "5C"}, { 180064, "5D"},
{ 181936, "6A"}, { 183648, "6B"}, { 185360, "6C"}, { 187072, "6D"},
{ 188928, "7A"}, { 190640, "7B"}, { 192352, "7C"}, { 194064, "7D"},
{ 195936, "8A"}, { 197648, "8B"}, { 199360, "8C"}, { 201072, "8D"},
{ 202928, "9A"}, { 204640, "9B"}, { 206352, "9C"}, { 208064, "9D"},
{ 209936, "10A"}, { 211648, "10B"}, { 213360, "10C"}, { 215072, "10D"},
{ 216928, "11A"}, { 218640, "11B"}, { 220352, "11C"}, { 222064, "11D"},
{ 223936, "12A"}, { 225648, "12B"}, { 227360, "12C"}, { 229072, "12D"},
{ 230784, "13A"}, { 232496, "13B"}, { 234208, "13C"}, { 235776, "13D"},
{ 237488, "13E"}, { 239200, "13F"}, {1452960, "LA"}, {1454672, "LB"},
{1456384, "LC"}, {1458096, "LD"}, {1459808, "LE"}, {1461520, "LF"},
{1463232, "LG"}, {1464944, "LH"}, {1466656, "LI"}, {1468368, "LJ"},
{1470080, "LK"}, {1471792, "LL"}, {1473504, "LM"}, {1475216, "LN"},
{1476928, "LO"}, {1478640, "LP"}, {1480352, "LQ"}, {1482064, "LR"},
{1483776, "LS"}, {1485488, "LT"}, {1487200, "LU"}, {1488912, "LV"},
{1490624, "LW"}
};
typedef struct _rds_ {
byte region;
Detector<byte, 1> PTY{0};
String stationName;
String stationText;
String stationText32;
String RTContent1;
String RTContent2;
Detector<String, 1> PTYN{""};
String ECCtext;
String stationIDtext;
String stationNameLong;
String stationStatetext;
String enhancedRTtext;
char picode[7];
char stationID[9];
char stationLongID[33];
char stationState[3];
char dabafeid[5];
char dabafchannel[4];
unsigned long blockcounter[33];
uint16_t rdsA, rdsB, rdsC, rdsD, rdsErr, rdsStat, correctPI, rdsplusTag1, rdsplusTag2, PICTlock = 0;
bool ps12error, ps34error, ps56error, ps78error;
int32_t offset;
uint16_t aid[10];
uint32_t dabaffreq;
byte aid_counter;
byte fastps;
Detector<unsigned int, 1> ECC{0};
bool rdsAerror;
bool rdsBerror;
bool rdsCerror;
bool rdsDerror;
Detector<bool, 1> hasArtificialhead{false};
Detector<bool, 1> hasCompressed{false};
bool hasDynamicPTY;
Detector<bool, 1> hasStereo{false};
bool hasRDS;
bool hasECC;
bool hasDABAF;
bool hasLongPS;
bool hasRT;
bool hasEnhancedRT;
Detector<bool, 1> TP{false};
Detector<bool, 1> TA{false};
Detector<bool, 1> hasEON{false};
bool hasAID;
Detector<bool, 1> hasTMC{false};
bool hasAF;
Detector<bool, 1> hasCT{false};
bool hasPTYN;
bool rtAB;
bool rtAB32;
Detector<bool, 1> hasRTplus{false};
bool filter;
bool rdsreset;
bool pierrors;
bool ctupdate = true;
bool sortaf;
bool rtbuffer = true;
bool afreg;
RdsPiBuffer piBuffer;
} rds_;
typedef struct _af_ {
uint16_t frequency;
int16_t score;
bool afvalid;
bool checked;
bool regional;
bool same;
} af_;
typedef struct _eon_ {
uint16_t mappedfreq;
uint16_t mappedfreq2;
uint16_t mappedfreq3;
uint16_t pi;
char picode[6];
String ps;
bool ta;
bool tp;
bool taset;
uint8_t pty;
bool ptyset;
} eon_;
typedef struct _logbook_ {
char picode[6];
uint16_t frequency;
int16_t SignalLevel;
String stationName;
String DateTime;
} logbook_;
class TEF6686 {
public:
af_ af[51];
eon_ eon[21];
rds_ rds;
logbook_ logbook[22];
uint16_t TestAF();
void TestAFEON();
void readRDS(byte showrdserrors);
void SetFreq(uint16_t frequency);
void SetFreqAM(uint16_t frequency);
void 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);
void getStatus(int16_t *level, uint16_t *USN, uint16_t *WAM, int16_t *offset, uint16_t *bandwidth, uint16_t *modulation, int8_t *snr);
void getStatusAM(int16_t *level, uint16_t *noise, uint16_t *cochannel, int16_t *offset, uint16_t *bandwidth, uint16_t *modulation, int8_t *snr);
void 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();
void power(bool mode);
void setAGC(uint8_t agc);
void setAMAGC(uint8_t agc);
void setiMS(bool mph);
void setEQ(bool eq);
void setDeemphasis(RADIO_FM_DEEMPHASIS 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, uint8_t level = 3);
void setAMNoiseBlanker(uint16_t start);
void setAMAttenuation(uint16_t start);
void setMute();
void setOffset(int8_t offset);
void setAMOffset(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);
void extendBW(bool yesno);
uint16_t getBlockA();
uint8_t af_counter;
uint8_t eon_counter;
uint8_t logbook_counter;
uint8_t rdsgroup;
unsigned long processed_rdsblocks;
bool mute;
bool afmethodB;
byte underscore;
bool ps_process;
byte af_updatecounter;
private:
void RDScharConverter(const char* input, wchar_t* output, size_t size, bool under);
bool isFixedCallsign(uint16_t stationID, char* stationIDStr);
String PSLongtext;
char ps_buffer[9];
char ps_buffer2[9];
char ptyn_buffer[9];
char eon_buffer[20][9];
bool pslong_process;
char eRT_buffer[129];
bool rt_process;
char rt_buffer[65];
char rt_buffer32[33];
char pslong_buffer[33];
char pslong_buffer2[33];
bool useRTPlus = true;
bool ABold;
bool afreset;
bool mpxmode;
bool _hasEnhancedRT;
char stationTextBuffer[65];
uint16_t piold;
bool rtABold;
bool rtAB32old;
wchar_t PStext[9] = L"";
wchar_t EONPStext[20][9];
wchar_t PTYNtext[9] = L"";
char RDSplus1[45];
char RDSplus2[45];
uint16_t currentfreq;
uint16_t currentfreq2;
bool togglebit;
bool runningbit;
uint8_t segments_received[16];
uint8_t segments_received_lps[8];
bool initab;
bool afinit;
bool errorfreepi;
bool rdsAerrorThreshold, rdsBerrorThreshold, rdsCerrorThreshold, rdsDerrorThreshold;
bool packet0, packet1, packet2, packet3, packet0long, packet1long, packet2long, packet3long;
uint16_t previous_rdsA, previous_rdsB, previous_rdsC, previous_rdsD;
bool afmethodBprobe;
bool eRTcoding;
uint16_t rdsCold;
uint8_t af_counterb;
uint8_t af_number;
uint8_t af_counterbcheck;
bool afmethodBtrigger;
uint16_t correctPIold;
uint8_t rtplusblock;
uint8_t DABAFblock;
uint8_t eRTblock;
uint8_t doublecounter;
uint16_t doubletestfreq;
time_t lastrdstime;
int32_t lasttimeoffset;
};