Kaynağa Gözat

IrDA test app^ acquire state only when needed, fix exit, remove delay in main program cycle (#335)

DrZlo13 5 yıl önce
ebeveyn
işleme
0846de20a4
1 değiştirilmiş dosya ile 18 ekleme ve 6 silme
  1. 18 6
      applications/irda/irda.c

+ 18 - 6
applications/irda/irda.c

@@ -294,20 +294,27 @@ void irda(void* p) {
     AppEvent event;
     AppEvent event;
     while(1) {
     while(1) {
         osStatus_t event_status = osMessageQueueGet(event_queue, &event, NULL, 500);
         osStatus_t event_status = osMessageQueueGet(event_queue, &event, NULL, 500);
-        State* state = (State*)acquire_mutex_block(&state_mutex);
 
 
         if(event_status == osOK) {
         if(event_status == osOK) {
             if(event.type == EventTypeKey) {
             if(event.type == EventTypeKey) {
+                State* state = (State*)acquire_mutex_block(&state_mutex);
+
                 // press events
                 // press events
                 if(event.value.input.type == InputTypeShort &&
                 if(event.value.input.type == InputTypeShort &&
                    event.value.input.key == InputKeyBack) {
                    event.value.input.key == InputKeyBack) {
+                    api_interrupt_remove(irda_timer_capture_callback, InterruptTypeTimerCapture);
+                    release_mutex(&state_mutex, state);
+
                     // remove all view_ports create by app
                     // remove all view_ports create by app
-                    view_port_enabled_set(view_port, false);
                     gui_remove_view_port(gui, view_port);
                     gui_remove_view_port(gui, view_port);
+                    view_port_free(view_port);
 
 
                     // free decoder
                     // free decoder
                     free_decoder(decoder);
                     free_decoder(decoder);
 
 
+                    delete_mutex(&state_mutex);
+                    osMessageQueueDelete(event_queue);
+
                     // exit
                     // exit
                     furiac_exit(NULL);
                     furiac_exit(NULL);
                 }
                 }
@@ -327,6 +334,10 @@ void irda(void* p) {
                 }
                 }
 
 
                 modes[state->mode_id].input(&event, state);
                 modes[state->mode_id].input(&event, state);
+
+                release_mutex(&state_mutex, state);
+                view_port_update(view_port);
+
             } else if(event.type == EventTypeRX) {
             } else if(event.type == EventTypeRX) {
                 IrDADecoderOutputData out;
                 IrDADecoderOutputData out;
                 const uint8_t out_data_length = 4;
                 const uint8_t out_data_length = 4;
@@ -342,6 +353,8 @@ void irda(void* p) {
 
 
                 if(decoded) {
                 if(decoded) {
                     // save only if we in packet mode
                     // save only if we in packet mode
+                    State* state = (State*)acquire_mutex_block(&state_mutex);
+
                     if(state->mode_id == 1) {
                     if(state->mode_id == 1) {
                         if(out.protocol == IRDA_NEC) {
                         if(out.protocol == IRDA_NEC) {
                             printf("P=NEC ");
                             printf("P=NEC ");
@@ -361,9 +374,11 @@ void irda(void* p) {
                         }
                         }
                     }
                     }
 
 
+                    release_mutex(&state_mutex, state);
+                    view_port_update(view_port);
+
                     // blink anyway
                     // blink anyway
                     gpio_write(green_led_record, false);
                     gpio_write(green_led_record, false);
-                    delay(10);
                     gpio_write(green_led_record, true);
                     gpio_write(green_led_record, true);
                 }
                 }
             }
             }
@@ -371,8 +386,5 @@ void irda(void* p) {
         } else {
         } else {
             // event timeout
             // event timeout
         }
         }
-
-        release_mutex(&state_mutex, state);
-        view_port_update(view_port);
     }
     }
 }
 }