I have started to rewrite the code based on the analysis of the parameters and timings. I have yet to look across the code for the various TPMS sensors to see if they use common code. I suspect that they do, but if they don’t it may make the approach impractical. I plan to investigate loading the parameters and timing values from files on the SD Card as well. I think the file approach may lead to a more sustainable approach.
The code rewrite starts with a structure, CC1101_Parameters, to hold the timing parameters and CC1101_Settings, to hold the settings for the CC1101 radio. The default values specified in the structures are the most common values for each property.
struct CC1101_Parameters {
int expectedbitcount = 72;
int expectedbytecount = 9;
int expectedfifobytecount = 21;
int syncbits = 16;
int cdwidth_min = 5500;
int cdwidth_max = 11500;
int shorttiming_min = 35;
int shorttiming_nom = 50;
int shorttiming_max = 79;
int longtiming_min = 80;
int longtiming_max = 120;
int synctiming_min = 175;
int synctiming_max = 1200;
int endtiming_min = 0;
int endtiming_max = 500;
}; // CC1101_Parameters
struct CC1101_Settings {
byte cc1101_defval_iocfg2 = 0x0C; // GDO2 Output Pin Configuration - Serial out (synchronous)
byte cc1101_defval_iocfg1 = 0x2E; // GDO1 Output Pin Configuration - not used
byte cc1101_defval_iocfg0 = 0x0E; // GDO0 Output Pin Configuration - Carrier Sense output
byte cc1101_defval_fifothr = 0x0F; // RX FIFO and TX FIFO Thresholds - 64 bytes in FIFO
byte cc1101_defval_sync1 = 0xD5; // Synchronization word, high byte 11010101 01001111
byte cc1101_defval_sync0 = 0x4F; // Synchronization word, low byte
byte cc1101_defval_pktlen = 0x09; // Packet Length
byte cc1101_defval_pktctrl1 = 0x00; // Packet Automation Control
byte cc1101_defval_pktctrl0 = 0x12; // Packet Automation Control - synchronous data
byte cc1101_defval_addr = 0x00; // Device Address
byte cc1101_defval_channr = 0x00; // Channel Number
byte cc1101_defval_fsctrl1 = 0x0F; // Frequency Synthesizer Control
byte cc1101_defval_fsctrl0 = 0x00; // Frequency Synthesizer Control
byte cc1101_defval_freq2 = 0x10; // Frequency Control Word, High Byte
byte cc1101_defval_freq1 = 0xB0; // Frequency Control Word, Middle Byte
byte cc1101_defval_freq0 = 0x71; // Frequency Control Word, Low Byte
byte cc1101_defval_deviatn = 0x40; // Modem Deviation Setting (+/-25.390625kHz)
byte cc1101_defval_mdmcfg4 = 0x59; // Modem Configuration (59 = data rate = 20kHz, RX bw 325kHz)
byte cc1101_defval_mdmcfg3 = 0x93; // Modem Configuration (now 93 = data rate = 20kHz)
byte cc1101_defval_mdmcfg2 = 0x10; // Modem Configuration (GFSK, No Sync or Manchester coding)
byte cc1101_defval_mdmcfg1 = 0x21; // Modem Configuration Channel spacing 100kHz
byte cc1101_defval_mdmcfg0 = 0xF8; // Modem Configuration
byte cc1101_defval_agcctrl2 = 0x87; // AGC Control
byte cc1101_defval_agcctrl1 = 0x58; // AGC Control
byte cc1101_defval_agcctrl0 = 0x80; // AGC Control
byte cc1101_defval_mcsm2 = 0x07; // Main Radio Control State Machine Configuration
byte cc1101_defval_mcsm1 = 0x3C; // Main Radio Control State Machine Configuration
byte cc1101_defval_mcsm0 = 0x18; // Main Radio Control State Machine Configuration
byte cc1101_defval_foccfg = 0x16; // Frequency Offset Compensation Configuration
byte cc1101_defval_bscfg = 0x6C; // Bit Synchronization Configuration
byte cc1101_defval_worevt1 = 0x87; // High Byte Event0 Timeout
byte cc1101_defval_worevt0 = 0x6B; // Low Byte Event0 Timeout
byte cc1101_defval_worctrl = 0xFB; // Wake On Radio Control
byte cc1101_defval_frend1 = 0x56; // Front End RX Configuration
byte cc1101_defval_frend0 = 0x10; // Front End TX Configuration
byte cc1101_defval_fscal3 = 0xE9; // Frequency Synthesizer Calibration
byte cc1101_defval_fscal2 = 0x2A; // Frequency Synthesizer Calibration
byte cc1101_defval_fscal1 = 0x00; // Frequency Synthesizer Calibration
byte cc1101_defval_fscal0 = 0x1F; // Frequency Synthesizer Calibration
byte cc1101_defval_rcctrl1 = 0x41; // RC Oscillator Configuration
byte cc1101_defval_rcctrl0 = 0x00; // RC Oscillator Configuration
byte cc1101_defval_fstest = 0x59; // Frequency Synthesizer Calibration Control
byte cc1101_defval_ptest = 0x7F; // Production Test
byte cc1101_defval_agctest = 0x3F; // AGC Test
byte cc1101_defval_test2 = 0x81; // Various Test Settings
byte cc1101_defval_test1 = 0x35; // Various Test Settings
byte cc1101_defval_test0 = 0x09; // Various Test Settings
}; // CC1101_Settings
The next bit of code makes use of switch case statements to set the values based on the selected configuration.
void cc1101_init_vars() {
switch (carSettings.freq) {
case TPMS_Frequencies::UK_433MHz:
switch (carSettings.tpmsSensorType) {
case TPMS_Sensors::Citroen:
cc1101_parameters.expectedbitcount = 88;
cc1101_parameters.expectedbytecount = 10;
cc1101_parameters.cdwidth_min = 8000;
break;
case TPMS_Sensors::Dacia:
cc1101_parameters.cdwidth_min = 7000;
cc1101_settings.cc1101_defval_freq0 = 0x0C;
cc1101_settings.cc1101_defval_deviatn = 0x41;
break;
case TPMS_Sensors::Ford:
cc1101_parameters.expectedbitcount = 64;
cc1101_parameters.expectedbytecount = 8;
cc1101_parameters.cdwidth_max = 10000;
break;
case TPMS_Sensors::Hyundai_i35:
cc1101_parameters.expectedbitcount = 64;
cc1101_parameters.expectedbytecount = 8;
cc1101_parameters.cdwidth_max = 9000;
cc1101_parameters.synctiming_min = 140;
cc1101_parameters.synctiming_max = 160;
break;
// ...
case TPMS_Sensors::Zoe:
cc1101_parameters.expectedbitcount = 64;
cc1101_parameters.expectedbytecount = 8;
cc1101_parameters.cdwidth_min = 7000;
cc1101_settings.cc1101_defval_freq0 = 0x0C;
cc1101_settings.cc1101_defval_deviatn = 0x41;
break;
default:
break;
}
break;
case TPMS_Frequencies::US_315MHz:
switch (carSettings.tpmsSensorType) {
case TPMS_Sensors::Citroen:
// UK 433 MHz Only
break;
case TPMS_Sensors::Dacia:
// UK 433 MHz Only
break;
case TPMS_Sensors::Ford:
cc1101_parameters.expectedbitcount = 64;
cc1101_parameters.expectedbytecount = 8;
cc1101_parameters.cdwidth_max = 10000;
cc1101_settings.cc1101_defval_freq2 = 0x0C;
cc1101_settings.cc1101_defval_freq1 = 0x1D;
cc1101_settings.cc1101_defval_freq0 = 0x57;
break;
case TPMS_Sensors::Hyundai_i35:
cc1101_parameters.expectedbitcount = 64;
cc1101_parameters.expectedbytecount = 8;
cc1101_parameters.cdwidth_max = 9000;
cc1101_parameters.synctiming_min = 140;
cc1101_parameters.synctiming_max = 160;
cc1101_settings.cc1101_defval_freq2 = 0x0C;
cc1101_settings.cc1101_defval_freq1 = 0x1D;
cc1101_settings.cc1101_defval_freq0 = 0x57;
break;
// ...
case TPMS_Sensors::Toyota_TRW_C070:
cc1101_parameters.expectedbitcount = 64;
cc1101_parameters.expectedbytecount = 8;
cc1101_parameters.cdwidth_max = 9000;
cc1101_parameters.synctiming_min = 140;
cc1101_parameters.synctiming_max = 160;
cc1101_settings.cc1101_defval_freq2 = 0x0C;
cc1101_settings.cc1101_defval_freq1 = 0x1D;
cc1101_settings.cc1101_defval_freq0 = 0x57;
break;
case TPMS_Sensors::TruckSolar:
// UK 433 MHz Only
break;
case TPMS_Sensors::Zoe:
// UK 433 MHz Only
break;
default:
break;
}
break;
default:
break;
}
}
The next step is to determine if common code can be written for receiving the data from each brand of TPMS sensor.
