diff --git a/CHANGELOG.md b/CHANGELOG.md index 22f403ca5..31c18257b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,13 @@ ### Added: - Apps: - Games: Geometry Flip (by @goosedev72-projects) - - GPIO: [KT0803] FM Transmitter (by @goosedev72-projects) + - GPIO: + - [GPIO] Explorer (by @EvgeniGenchev07) + - [KT0803] FM Transmitter (by @goosedev72-projects) + - [SPI] Terminal (by @janwiesemann) + - GPIO/Debug: + - [FTDI232H] FlipTDI (by @Skorpionm) + - [INA2xx] INA Meter (by @cepetr) - GPIO/ESP: [ESP32] Ghost ESP (by @jaylikesbunda) - GPIO/FlipBoard: - FlipBoard Blinky (by @jamisonderek) @@ -10,12 +16,36 @@ - FlipBoard Simon (by @jamisonderek) - GPIO/FlipperHTTP: Free Roam (by @jblanked) - GPIO/GPS: [NMEA] Nearby Files (by @Stichoza) - - Media: Video Player (by @LTVA1) + - GPIO/Sensors: [MH-Z19] CO2 Logger (by @harryob2) + - iButton: iButton Converter (by @Leptopt1los) + - Infrared: + - Hitachi AC Remote (by @dogtopus) + - LIDAR Emulator (by @regaly) + - Midea AC Remote (by @xakep666) + - Mitsubishi AC Remote (by @achistyakov) + - Xbox Controller (by @gebeto) + - Media: + - Fmatrix (by @misterwaztaken) + - Image Viewer (by @polioan) + - Space Playground (by @alanfortlink) + - Video Player (by @LTVA1) - NFC: NFC-Eink (by @RebornedBrain) - RFID: Simultaneous UHF RFID Reader (by @haffnerriley) - Sub-GHz: - Chief Cooker (by @denr01) + - Flipper Share (by @lomalkin) + - HC-11 Modem (by @Giraut) - Sub Analyzer (by @RocketGod-git) + - Sub-GHz Scheduler (by @shalebridge, fixes by @xMasterX) + - Tools: + - FlipCrypt (by @Tyl3rA) + - Programmer Calculator (by @armixz) + - Resistance Calculator (by @instantiator) + - Tasks (by @MadLadSquad) + - Voltage Calculator (by @HappyAmos) + - USB: + - LEGO Dimensions Toy Pad (by @SegerEnd) + - USB-MIDI (by @kribesk, original by @DrZlo13) - SubGHz: - UL: Roger (static 28 bit) with add manually support (by @xMasterX & @mishamyte) - UL: V2 Phoenix full support (button switch, add manually, counter decrypt/encrypt) (by @xMasterX & @RocketGod-git, original code by @Skorpionm) @@ -51,10 +81,11 @@ - Seader: Fix ATS handling (by @NVX), reset SAM on error (by @bettse) - Sentry Safe: New interface, settings & help page (by @H4ckd4ddy) - Seos Compatible: Add keys v2 support with per-device encryption (by @bettse) - - Sub-GHz Remote: Add possibility to use custom buttons (by @MrLego8-9) + - Sub-GHz Playlist: Fix crash on disallowed frequencies (by @WillyJL) - Weather Station: Added support for solight TE44 (by @fersingb) - Weebo: Prevent 0x88 in UID[3] (by @bettse) - WiFi Marauder: Support for ESP32Marauder 1.8.4 (by @justcallmekoko) + - UL: Sub-GHz Remote: Add possibility to use custom buttons (by @MrLego8-9) - Sub-GHz: - UL: Add 868.46 MHz to default subghz freqs list (by @xMasterX) - UL: Reduce less popular freqs in default hopper preset, make it faster (by @xMasterX) diff --git a/applications/external b/applications/external index 102720481..a3cab1e76 160000 --- a/applications/external +++ b/applications/external @@ -1 +1 @@ -Subproject commit 10272048130f6bd7d09aaca31bce387eb1095ed1 +Subproject commit a3cab1e76416d087d2f8bfd1a0811b4fbb71deef diff --git a/lib/subghz/protocols/linear.c b/lib/subghz/protocols/linear.c index d089bd2b9..af5ddd2b1 100644 --- a/lib/subghz/protocols/linear.c +++ b/lib/subghz/protocols/linear.c @@ -117,33 +117,33 @@ static bool subghz_protocol_encoder_linear_get_upload(SubGhzProtocolEncoderLinea for(uint8_t i = instance->generic.data_count_bit; i > 1; i--) { if(bit_read(instance->generic.data, i - 1)) { //send bit 1 - instance->encoder.upload[index++] = - level_duration_make(true, (uint32_t)subghz_protocol_linear_const.te_short); - instance->encoder.upload[index++] = - level_duration_make(false, (uint32_t)subghz_protocol_linear_const.te_long); - } else { - //send bit 0 instance->encoder.upload[index++] = level_duration_make(true, (uint32_t)subghz_protocol_linear_const.te_long); instance->encoder.upload[index++] = level_duration_make(false, (uint32_t)subghz_protocol_linear_const.te_short); + } else { + //send bit 0 + instance->encoder.upload[index++] = + level_duration_make(true, (uint32_t)subghz_protocol_linear_const.te_short); + instance->encoder.upload[index++] = + level_duration_make(false, (uint32_t)subghz_protocol_linear_const.te_long); } } //Send end bit if(bit_read(instance->generic.data, 0)) { //send bit 1 - instance->encoder.upload[index++] = - level_duration_make(true, (uint32_t)subghz_protocol_linear_const.te_short); - //Send gap - instance->encoder.upload[index++] = - level_duration_make(false, (uint32_t)subghz_protocol_linear_const.te_short * 44); - } else { - //send bit 0 instance->encoder.upload[index++] = level_duration_make(true, (uint32_t)subghz_protocol_linear_const.te_long); //Send gap instance->encoder.upload[index++] = level_duration_make(false, (uint32_t)subghz_protocol_linear_const.te_short * 42); + } else { + //send bit 0 + instance->encoder.upload[index++] = + level_duration_make(true, (uint32_t)subghz_protocol_linear_const.te_short); + //Send gap + instance->encoder.upload[index++] = + level_duration_make(false, (uint32_t)subghz_protocol_linear_const.te_short * 44); } return true; @@ -251,11 +251,11 @@ void subghz_protocol_decoder_linear_feed(void* context, bool level, uint32_t dur } if(DURATION_DIFF(instance->decoder.te_last, subghz_protocol_linear_const.te_short) < subghz_protocol_linear_const.te_delta) { - subghz_protocol_blocks_add_bit(&instance->decoder, 1); + subghz_protocol_blocks_add_bit(&instance->decoder, 0); } else if( DURATION_DIFF(instance->decoder.te_last, subghz_protocol_linear_const.te_long) < subghz_protocol_linear_const.te_delta) { - subghz_protocol_blocks_add_bit(&instance->decoder, 0); + subghz_protocol_blocks_add_bit(&instance->decoder, 1); } if(instance->decoder.decode_count_bit == subghz_protocol_linear_const.min_count_bit_for_found) { @@ -275,14 +275,14 @@ void subghz_protocol_decoder_linear_feed(void* context, bool level, uint32_t dur subghz_protocol_linear_const.te_delta) && (DURATION_DIFF(duration, subghz_protocol_linear_const.te_long) < subghz_protocol_linear_const.te_delta)) { - subghz_protocol_blocks_add_bit(&instance->decoder, 1); + subghz_protocol_blocks_add_bit(&instance->decoder, 0); instance->decoder.parser_step = LinearDecoderStepSaveDuration; } else if( (DURATION_DIFF(instance->decoder.te_last, subghz_protocol_linear_const.te_long) < subghz_protocol_linear_const.te_delta) && (DURATION_DIFF(duration, subghz_protocol_linear_const.te_short) < subghz_protocol_linear_const.te_delta)) { - subghz_protocol_blocks_add_bit(&instance->decoder, 0); + subghz_protocol_blocks_add_bit(&instance->decoder, 1); instance->decoder.parser_step = LinearDecoderStepSaveDuration; } else { instance->decoder.parser_step = LinearDecoderStepReset; @@ -323,12 +323,15 @@ void subghz_protocol_decoder_linear_get_string(void* context, FuriString* output furi_assert(context); SubGhzProtocolDecoderLinear* instance = context; - uint32_t code_found_lo = instance->generic.data & 0x00000000ffffffff; + // Protocol is actually implemented wrong way around, bits are inverted. + // Instead of fixing it and breaking old saved remotes, + // only the display here is inverted to show correct values. + uint32_t code_found_reverse_lo = instance->generic.data & 0x00000000ffffffff; - uint64_t code_found_reverse = subghz_protocol_blocks_reverse_key( + uint64_t code_found = subghz_protocol_blocks_reverse_key( instance->generic.data, instance->generic.data_count_bit); - uint32_t code_found_reverse_lo = code_found_reverse & 0x00000000ffffffff; + uint32_t code_found_lo = code_found & 0x00000000ffffffff; furi_string_cat_printf( output,