princeton add support for different button coding type [ci skip]

This commit is contained in:
MX 2024-09-26 03:50:16 +03:00
parent 1932bd35a5
commit d2a8e9fb5e
No known key found for this signature in database
GPG key ID: 7CCC66B7DBDD1C83

View file

@ -134,9 +134,21 @@ static uint8_t subghz_protocol_princeton_get_btn_code(void) {
case 0xF:
btn = 0x2;
break;
// Second encoding type
case 0x30:
btn = 0xC0;
break;
case 0xC0:
btn = 0x30;
break;
case 0x03:
btn = 0xC0;
break;
case 0x0C:
btn = 0xC0;
break;
default:
btn = 0x2;
break;
}
} else if(custom_btn_id == SUBGHZ_CUSTOM_BTN_DOWN) {
@ -156,9 +168,21 @@ static uint8_t subghz_protocol_princeton_get_btn_code(void) {
case 0xF:
btn = 0x1;
break;
// Second encoding type
case 0x30:
btn = 0x03;
break;
case 0xC0:
btn = 0x03;
break;
case 0x03:
btn = 0x30;
break;
case 0x0C:
btn = 0x03;
break;
default:
btn = 0x1;
break;
}
} else if(custom_btn_id == SUBGHZ_CUSTOM_BTN_LEFT) {
@ -178,9 +202,21 @@ static uint8_t subghz_protocol_princeton_get_btn_code(void) {
case 0xF:
btn = 0x4;
break;
// Second encoding type
case 0x30:
btn = 0x0C;
break;
case 0xC0:
btn = 0x0C;
break;
case 0x03:
btn = 0x0C;
break;
case 0x0C:
btn = 0x30;
break;
default:
btn = 0x4;
break;
}
} else if(custom_btn_id == SUBGHZ_CUSTOM_BTN_RIGHT) {
@ -202,7 +238,6 @@ static uint8_t subghz_protocol_princeton_get_btn_code(void) {
break;
default:
btn = 0x8;
break;
}
}
@ -223,8 +258,15 @@ static bool
instance->generic.btn = subghz_protocol_princeton_get_btn_code();
// Reconstruction of the data
instance->generic.data =
((uint64_t)instance->generic.serial << 4 | (uint64_t)instance->generic.btn);
// If we have 8bit button code move serial to left by 8 bits (and 4 if 4 bits)
if(instance->generic.btn == 0x30 || instance->generic.btn == 0xC0 ||
instance->generic.btn == 0x03 || instance->generic.btn == 0x0C) {
instance->generic.data =
((uint64_t)instance->generic.serial << 8 | (uint64_t)instance->generic.btn);
} else {
instance->generic.data =
((uint64_t)instance->generic.serial << 4 | (uint64_t)instance->generic.btn);
}
size_t index = 0;
size_t size_upload = (instance->generic.data_count_bit * 2) + 2;
@ -264,8 +306,17 @@ static bool
* @param instance Pointer to a SubGhzBlockGeneric* instance
*/
static void subghz_protocol_princeton_check_remote_controller(SubGhzBlockGeneric* instance) {
instance->serial = instance->data >> 4;
instance->btn = instance->data & 0xF;
// Parse button modes for second encoding type (and serial is smaller)
// Button code is 8bit and has fixed values of one of these
// Exclude button code for each type from serial number before parsing
if((instance->data & 0xFF) == 0x30 || (instance->data & 0xFF) == 0xC0 ||
(instance->data & 0xFF) == 0x03 || (instance->data & 0xFF) == 0x0C) {
instance->serial = instance->data >> 8;
instance->btn = instance->data & 0xFF;
} else {
instance->serial = instance->data >> 4;
instance->btn = instance->data & 0xF;
}
// Save original button for later use
if(subghz_custom_btn_get_original() == 0) {
@ -533,19 +584,38 @@ void subghz_protocol_decoder_princeton_get_string(void* context, FuriString* out
uint32_t data_rev = subghz_protocol_blocks_reverse_key(
instance->generic.data, instance->generic.data_count_bit);
furi_string_cat_printf(
output,
"%s %dbit\r\n"
"Key:0x%08lX\r\n"
"Yek:0x%08lX\r\n"
"Sn:0x%05lX Btn:%01X\r\n"
"Te:%luus GT:Te*%lu\r\n",
instance->generic.protocol_name,
instance->generic.data_count_bit,
(uint32_t)(instance->generic.data & 0xFFFFFF),
data_rev,
instance->generic.serial,
instance->generic.btn,
instance->te,
instance->guard_time);
if(instance->generic.btn == 0x30 || instance->generic.btn == 0xC0 ||
instance->generic.btn == 0x03 || instance->generic.btn == 0x0C) {
furi_string_cat_printf(
output,
"%s %dbit\r\n"
"Key:0x%08lX\r\n"
"Yek:0x%08lX\r\n"
"Sn:0x%05lX Btn:%02X (8b)\r\n"
"Te:%luus GT:Te*%lu\r\n",
instance->generic.protocol_name,
instance->generic.data_count_bit,
(uint32_t)(instance->generic.data & 0xFFFFFF),
data_rev,
instance->generic.serial,
instance->generic.btn,
instance->te,
instance->guard_time);
} else {
furi_string_cat_printf(
output,
"%s %dbit\r\n"
"Key:0x%08lX\r\n"
"Yek:0x%08lX\r\n"
"Sn:0x%05lX Btn:%01X (4b)\r\n"
"Te:%luus GT:Te*%lu\r\n",
instance->generic.protocol_name,
instance->generic.data_count_bit,
(uint32_t)(instance->generic.data & 0xFFFFFF),
data_rev,
instance->generic.serial,
instance->generic.btn,
instance->te,
instance->guard_time);
}
}