mirror of
https://protopirate.net/ProtoPirate/ProtoPirate.git
synced 2026-10-23 19:34:09 +00:00
FORD is FIXED, no B.S.!
This commit is contained in:
1 parent
5b8d3fd01b
commit
5b41b2ef52
2 files changed
+11
-49
No files matched your search
+11
-44
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
Reference in new issue
Block a user