فهرست منبع

Fixed procedure for sending IrDA commands, disabled interrupts for better stability (#329)

* Disable irq when send command
DrZlo13 5 سال پیش
والد
کامیت
5dbe2983aa
3فایلهای تغییر یافته به همراه14 افزوده شده و 2 حذف شده
  1. 0 2
      applications/irda/irda.c
  2. 7 0
      applications/irda/irda_nec.c
  3. 7 0
      applications/irda/irda_samsung.c

+ 0 - 2
applications/irda/irda.c

@@ -139,7 +139,6 @@ void render_packet(Canvas* canvas, State* state) {
 void input_packet(AppEvent* event, State* state) {
     if(event->value.input.input == InputOk) {
         if(event->value.input.state) {
-            vTaskSuspendAll();
             switch(state->packets[state->packet_id].protocol) {
             case IRDA_NEC:
                 ir_nec_send(
@@ -154,7 +153,6 @@ void input_packet(AppEvent* event, State* state) {
             default:
                 break;
             }
-            xTaskResumeAll();
         }
     }
 

+ 7 - 0
applications/irda/irda_nec.c

@@ -37,10 +37,17 @@ void ir_nec_send(uint16_t addr, uint8_t data) {
     // and I don’t know if this is my fault or a feature of the analyzer
     // TODO: check the dictionary and check with a known remote
     uint8_t nec_packet[4] = {~(uint8_t)addr, ~(uint8_t)(addr >> 8), ~(uint8_t)data, data};
+
+    osKernelLock();
+    __disable_irq();
+
     ir_nec_preambula();
     ir_nec_send_byte(nec_packet[0]);
     ir_nec_send_byte(nec_packet[1]);
     ir_nec_send_byte(nec_packet[2]);
     ir_nec_send_byte(nec_packet[3]);
     ir_nec_send_bit(1);
+
+    __enable_irq();
+    osKernelUnlock();
 }

+ 7 - 0
applications/irda/irda_samsung.c

@@ -29,10 +29,17 @@ void ir_samsung_send_byte(uint8_t data) {
 void ir_samsung_send(uint16_t addr, uint16_t data) {
     uint8_t samsung_packet[4] = {
         (uint8_t)addr, (uint8_t)(addr >> 8), (uint8_t)data, (uint8_t)(data >> 8)};
+
+    osKernelLock();
+    __disable_irq();
+
     ir_samsung_preambula();
     ir_samsung_send_byte(samsung_packet[0]);
     ir_samsung_send_byte(samsung_packet[1]);
     ir_samsung_send_byte(samsung_packet[2]);
     ir_samsung_send_byte(samsung_packet[3]);
     ir_samsung_send_bit(0);
+
+    __enable_irq();
+    osKernelUnlock();
 }