Просмотр исходного кода

Bugfix: ISP Programmer and SubGhz (#2574)

* AVR_ISP: fix NULL pointer dereference
* SubGhz: double back with a blocked transmission in this region
* SubGhz: fix speaker, when a transmission is blocked in this region
* SubGhz: fix speaker
* SubGhz: return region
* AVR Flasher: cleanup code

Co-authored-by: Aleksandr Kutuzov <alleteam@gmail.com>
Skorpionm 2 лет назад
Родитель
Сommit
33e8bae78b

+ 6 - 1
applications/external/avr_isp_programmer/helpers/avr_isp.c

@@ -152,7 +152,12 @@ bool avr_isp_auto_set_spi_speed_start_pmode(AvrIsp* instance) {
             }
             }
         }
         }
     }
     }
-    if(instance->spi) avr_isp_spi_sw_free(instance->spi);
+
+    if(instance->spi) {
+        avr_isp_spi_sw_free(instance->spi);
+        instance->spi = NULL;
+    }
+
     return false;
     return false;
 }
 }
 
 

+ 6 - 1
applications/external/avr_isp_programmer/lib/driver/avr_isp_prog.c

@@ -317,7 +317,12 @@ static bool avr_isp_prog_auto_set_spi_speed_start_pmode(AvrIspProg* instance) {
             }
             }
         }
         }
     }
     }
-    if(instance->spi) avr_isp_spi_sw_free(instance->spi);
+
+    if(instance->spi) {
+        avr_isp_spi_sw_free(instance->spi);
+        instance->spi = NULL;
+    }
+
     return false;
     return false;
 }
 }
 
 

+ 5 - 1
applications/main/subghz/scenes/subghz_scene_read_raw.c

@@ -230,7 +230,11 @@ bool subghz_scene_read_raw_on_event(void* context, SceneManagerEvent event) {
                    (subghz->txrx->txrx_state == SubGhzTxRxStateSleep)) {
                    (subghz->txrx->txrx_state == SubGhzTxRxStateSleep)) {
                     if(!subghz_tx_start(subghz, subghz->txrx->fff_data)) {
                     if(!subghz_tx_start(subghz, subghz->txrx->fff_data)) {
                         subghz->txrx->rx_key_state = SubGhzRxKeyStateBack;
                         subghz->txrx->rx_key_state = SubGhzRxKeyStateBack;
-                        scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowOnlyRx);
+                        subghz_read_raw_set_status(
+                            subghz->subghz_read_raw,
+                            SubGhzReadRAWStatusIDLE,
+                            "",
+                            subghz->txrx->raw_threshold_rssi);
                     } else {
                     } else {
                         if(scene_manager_has_previous_scene(
                         if(scene_manager_has_previous_scene(
                                subghz->scene_manager, SubGhzSceneSaved) ||
                                subghz->scene_manager, SubGhzSceneSaved) ||

+ 1 - 3
applications/main/subghz/scenes/subghz_scene_transmitter.c

@@ -70,9 +70,7 @@ bool subghz_scene_transmitter_on_event(void* context, SceneManagerEvent event) {
             }
             }
             if((subghz->txrx->txrx_state == SubGhzTxRxStateIDLE) ||
             if((subghz->txrx->txrx_state == SubGhzTxRxStateIDLE) ||
                (subghz->txrx->txrx_state == SubGhzTxRxStateSleep)) {
                (subghz->txrx->txrx_state == SubGhzTxRxStateSleep)) {
-                if(!subghz_tx_start(subghz, subghz->txrx->fff_data)) {
-                    scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowOnlyRx);
-                } else {
+                if(subghz_tx_start(subghz, subghz->txrx->fff_data)) {
                     subghz->state_notifications = SubGhzNotificationStateTx;
                     subghz->state_notifications = SubGhzNotificationStateTx;
                     subghz_scene_transmitter_update_data_show(subghz);
                     subghz_scene_transmitter_update_data_show(subghz);
                     DOLPHIN_DEED(DolphinDeedSubGhzSend);
                     DOLPHIN_DEED(DolphinDeedSubGhzSend);

+ 5 - 2
applications/main/subghz/subghz_i.c

@@ -105,9 +105,11 @@ static bool subghz_tx(SubGhz* subghz, uint32_t frequency) {
     furi_hal_subghz_set_frequency_and_path(frequency);
     furi_hal_subghz_set_frequency_and_path(frequency);
     furi_hal_gpio_write(&gpio_cc1101_g0, false);
     furi_hal_gpio_write(&gpio_cc1101_g0, false);
     furi_hal_gpio_init(&gpio_cc1101_g0, GpioModeOutputPushPull, GpioPullNo, GpioSpeedLow);
     furi_hal_gpio_init(&gpio_cc1101_g0, GpioModeOutputPushPull, GpioPullNo, GpioSpeedLow);
-    subghz_speaker_on(subghz);
     bool ret = furi_hal_subghz_tx();
     bool ret = furi_hal_subghz_tx();
-    subghz->txrx->txrx_state = SubGhzTxRxStateTx;
+    if(ret) {
+        subghz_speaker_on(subghz);
+        subghz->txrx->txrx_state = SubGhzTxRxStateTx;
+    }
     return ret;
     return ret;
 }
 }
 
 
@@ -115,6 +117,7 @@ void subghz_idle(SubGhz* subghz) {
     furi_assert(subghz);
     furi_assert(subghz);
     furi_assert(subghz->txrx->txrx_state != SubGhzTxRxStateSleep);
     furi_assert(subghz->txrx->txrx_state != SubGhzTxRxStateSleep);
     furi_hal_subghz_idle();
     furi_hal_subghz_idle();
+    subghz_speaker_off(subghz);
     subghz->txrx->txrx_state = SubGhzTxRxStateIDLE;
     subghz->txrx->txrx_state = SubGhzTxRxStateIDLE;
 }
 }