FORD is FIXED, no B.S.!

This commit is contained in:
Leeroy committed 2026-03-22 07:23:56 +11:00
1 parent 5b8d3fd01b
commit 5b41b2ef52
2 files changed
+11 -49

No files matched your search

+11 -44
View File
@@ -55,7 +55,6 @@ typedef struct SubGhzProtocolDecoderFordV0 {
uint32_t serial;
uint8_t button;
uint32_t count;
uint8_t bs_magic;
} SubGhzProtocolDecoderFordV0;
#ifdef ENABLE_EMULATE_FEATURE
typedef struct SubGhzProtocolEncoderFordV0 {
@@ -69,7 +68,6 @@ typedef struct SubGhzProtocolEncoderFordV0 {
uint8_t button;
uint32_t count;
uint8_t bs;
uint8_t bs_magic;
} SubGhzProtocolEncoderFordV0;
#endif
typedef enum {
@@ -90,8 +88,7 @@ static void decode_ford_v0(
uint16_t key2,
uint32_t* serial,
uint8_t* button,
uint32_t* count,
uint8_t* bs_magic);
uint32_t* count);
#ifdef ENABLE_EMULATE_FEATURE
static void encode_ford_v0(
uint8_t header_byte,
@@ -150,10 +147,11 @@ const SubGhzProtocol ford_protocol_v0 = {
// BS = (counter_low_byte + 0x6F + (button << 4)) & 0xFF
// =============================================================================
#ifdef ENABLE_EMULATE_FEATURE
static uint8_t ford_v0_calculate_bs(uint32_t count, uint8_t button, uint8_t bs_magic) {
//Do the BS calculation, move right the overflow bit if neccesary
uint16_t result = ((uint16_t)count & 0xFF) + bs_magic + (button << 4);
return (uint8_t)(result - ((result & 0xFF00) ? 0x80 : 0));
static uint8_t ford_v0_calculate_bs(uint32_t serial, uint32_t count, uint8_t button) {
return (uint8_t)((((count >> 24) & 0xFF) + ((count >> 16) & 0xFF) + ((count >> 8) & 0xFF) +
(count & 0xFF) + ((serial >> 24) & 0xFF) + ((serial >> 16) & 0xFF) +
((serial >> 8) & 0xFF) + (serial & 0xFF) + (button << 4)) &
0xFF);
}
#endif
// =============================================================================
@@ -223,8 +221,7 @@ static void decode_ford_v0(
uint16_t key2,
uint32_t* serial,
uint8_t* button,
uint32_t* count,
uint8_t* bs_magic) {
uint32_t* count) {
uint8_t buf[13] = {0};
for(int i = 0; i < 8; ++i) {
@@ -235,7 +232,6 @@ static void decode_ford_v0(
buf[9] = (uint8_t)(key2 & 0xFF);
uint8_t tmp = buf[8];
uint8_t bs = tmp;
uint8_t parity = 0;
uint8_t parity_any = (tmp != 0);
while(tmp) {
@@ -277,9 +273,6 @@ static void decode_ford_v0(
*button = (buf[5] >> 4) & 0x0F;
*count = ((buf[5] & 0x0F) << 16) | (buf[6] << 8) | buf[7];
//Build the BS Magic number for this fob.
*bs_magic = bs + ((bs & 0x80) ? 0x80 : 0) - (*button << 4) - (uint8_t)(*count & 0xFF);
}
// =============================================================================
@@ -385,7 +378,6 @@ void* subghz_protocol_encoder_ford_v0_alloc(SubGhzEnvironment* environment) {
instance->button = 0;
instance->count = 0;
instance->bs = 0;
instance->bs_magic = 0;
FURI_LOG_I(TAG, "Encoder allocated");
return instance;
@@ -595,22 +587,14 @@ SubGhzProtocolStatus
instance->generic.cnt = instance->count;
FURI_LOG_I(TAG, "Counter: 0x%05lX", (unsigned long)instance->count);
flipper_format_rewind(flipper_format);
uint32_t bs_magic_temp = 0;
if(!flipper_format_read_uint32(flipper_format, "BSMagic", &bs_magic_temp, 1))
instance->bs_magic = 0x6F; //For Backward compatibility
else
instance->bs_magic = (uint8_t)bs_magic_temp;
// Calculate BS from counter and button, as well as the BS Magic Number we pulled on decode.
instance->bs = ford_v0_calculate_bs(instance->count, instance->button, instance->bs_magic);
instance->bs = ford_v0_calculate_bs(instance->serial, instance->count, instance->button);
FURI_LOG_I(
TAG,
"Calculated BS: 0x%02X (from Cnt=0x%05lX, Btn=0x%02X, BSMagic=0x%02X))",
"Calculated BS: 0x%02X (from Cnt=0x%05lX, Btn=0x%02X)",
instance->bs,
(unsigned long)instance->count,
instance->button,
instance->bs_magic);
instance->button);
encode_ford_v0(
header_byte,
@@ -723,12 +707,7 @@ static bool ford_v0_process_data(SubGhzProtocolDecoderFordV0* instance) {
uint16_t key2 = ~key2_raw;
decode_ford_v0(
instance->key1,
key2,
&instance->serial,
&instance->button,
&instance->count,
&instance->bs_magic);
instance->key1, key2, &instance->serial, &instance->button, &instance->count);
instance->key2 = key2;
return true;
@@ -767,7 +746,6 @@ void subghz_protocol_decoder_ford_v0_reset(void* context) {
instance->serial = 0;
instance->button = 0;
instance->count = 0;
instance->bs_magic = 0;
}
void subghz_protocol_decoder_ford_v0_feed(void* context, bool level, uint32_t duration) {
@@ -903,9 +881,6 @@ SubGhzProtocolStatus subghz_protocol_decoder_ford_v0_serialize(
flipper_format_write_uint32(flipper_format, "Btn", &temp, 1);
flipper_format_write_uint32(flipper_format, "Cnt", &instance->count, 1);
temp = (uint32_t)instance->bs_magic;
flipper_format_write_uint32(flipper_format, "BSMagic", &temp, 1);
}
return ret;
@@ -940,12 +915,6 @@ SubGhzProtocolStatus
flipper_format_read_uint32(flipper_format, "Cnt", &instance->count, 1);
instance->generic.cnt = instance->count;
uint32_t bs_magic_temp = 0;
if(flipper_format_read_uint32(flipper_format, "BSMagic", &bs_magic_temp, 1))
instance->bs_magic = bs_magic_temp;
else
instance->bs_magic = 0x6F; //For backward psf file compatibiility.
}
return ret;
@@ -977,7 +946,6 @@ void subghz_protocol_decoder_ford_v0_get_string(void* context, FuriString* outpu
"Cnt: %05lX"
" BS: %02X"
" CRC: %02X\r\n"
"BS Magic: %02X"
" Btn: %02X - %s\r\n",
instance->generic.protocol_name,
instance->generic.data_count_bit,
@@ -990,7 +958,6 @@ void subghz_protocol_decoder_ford_v0_get_string(void* context, FuriString* outpu
(unsigned long)instance->count,
(instance->key2 >> 8) & 0xFF,
instance->key2 & 0xFF,
instance->bs_magic,
instance->button,
button_name);
}
-5
View File
@@ -146,11 +146,6 @@ void protopirate_scene_saved_info_on_enter(void* context) {
furi_string_cat_printf(info_str, "BS: %02X\n", (uint8_t)temp_data);
}
flipper_format_rewind(ff);
if(flipper_format_read_uint32(ff, "BSMagic", &temp_data, 1)) {
furi_string_cat_printf(info_str, "BS Magic: %02X\n", (uint8_t)temp_data);
}
flipper_format_rewind(ff);
if(flipper_format_read_uint32(ff, "CRC", &temp_data, 1)) {
furi_string_cat_printf(info_str, "CRC: %02X\n", (uint8_t)temp_data);