Przeglądaj źródła

[FL-2912] Forced RAW receive option for Infrared CLI #1891

Co-authored-by: あく <alleteam@gmail.com>
Georgii Surkov 3 lat temu
rodzic
commit
02c27becb0

+ 30 - 17
applications/main/infrared/infrared_cli.c

@@ -71,25 +71,9 @@ static void signal_received_callback(void* context, InfraredWorkerSignal* receiv
     }
 }
 
-static void infrared_cli_start_ir_rx(Cli* cli, FuriString* args) {
-    UNUSED(cli);
-    UNUSED(args);
-    InfraredWorker* worker = infrared_worker_alloc();
-    infrared_worker_rx_start(worker);
-    infrared_worker_rx_set_received_signal_callback(worker, signal_received_callback, cli);
-
-    printf("Receiving INFRARED...\r\nPress Ctrl+C to abort\r\n");
-    while(!cli_cmd_interrupt_received(cli)) {
-        furi_delay_ms(50);
-    }
-
-    infrared_worker_rx_stop(worker);
-    infrared_worker_free(worker);
-}
-
 static void infrared_cli_print_usage(void) {
     printf("Usage:\r\n");
-    printf("\tir rx\r\n");
+    printf("\tir rx [raw]\r\n");
     printf("\tir tx <protocol> <address> <command>\r\n");
     printf("\t<command> and <address> are hex-formatted\r\n");
     printf("\tAvailable protocols:");
@@ -108,6 +92,35 @@ static void infrared_cli_print_usage(void) {
     printf("\tir universal list <tv, ac>\r\n");
 }
 
+static void infrared_cli_start_ir_rx(Cli* cli, FuriString* args) {
+    UNUSED(cli);
+
+    bool enable_decoding = true;
+
+    if(!furi_string_empty(args)) {
+        if(!furi_string_cmp_str(args, "raw")) {
+            enable_decoding = false;
+        } else {
+            printf("Wrong arguments.\r\n");
+            infrared_cli_print_usage();
+            return;
+        }
+    }
+
+    InfraredWorker* worker = infrared_worker_alloc();
+    infrared_worker_rx_enable_signal_decoding(worker, enable_decoding);
+    infrared_worker_rx_start(worker);
+    infrared_worker_rx_set_received_signal_callback(worker, signal_received_callback, cli);
+
+    printf("Receiving %s INFRARED...\r\nPress Ctrl+C to abort\r\n", enable_decoding ? "" : "RAW");
+    while(!cli_cmd_interrupt_received(cli)) {
+        furi_delay_ms(50);
+    }
+
+    infrared_worker_rx_stop(worker);
+    infrared_worker_free(worker);
+}
+
 static bool infrared_cli_parse_message(const char* str, InfraredSignal* signal) {
     char protocol_name[32];
     InfraredMessage message;

+ 9 - 1
lib/infrared/worker/infrared_worker.c

@@ -57,6 +57,7 @@ struct InfraredWorker {
     InfraredDecoderHandler* infrared_decoder;
     NotificationApp* notification;
     bool blink_enable;
+    bool decode_enable;
 
     union {
         struct {
@@ -131,7 +132,8 @@ static void infrared_worker_process_timeout(InfraredWorker* instance) {
 static void
     infrared_worker_process_timings(InfraredWorker* instance, uint32_t duration, bool level) {
     const InfraredMessage* message_decoded =
-        infrared_decode(instance->infrared_decoder, level, duration);
+        instance->decode_enable ? infrared_decode(instance->infrared_decoder, level, duration) :
+                                  NULL;
     if(message_decoded) {
         instance->signal.message = *message_decoded;
         instance->signal.timings_cnt = 0;
@@ -233,6 +235,7 @@ InfraredWorker* infrared_worker_alloc() {
     instance->infrared_decoder = infrared_alloc_decoder();
     instance->infrared_encoder = infrared_alloc_encoder();
     instance->blink_enable = false;
+    instance->decode_enable = true;
     instance->notification = furi_record_open(RECORD_NOTIFICATION);
     instance->state = InfraredWorkerStateIdle;
 
@@ -316,6 +319,11 @@ void infrared_worker_rx_enable_blink_on_receiving(InfraredWorker* instance, bool
     instance->blink_enable = enable;
 }
 
+void infrared_worker_rx_enable_signal_decoding(InfraredWorker* instance, bool enable) {
+    furi_assert(instance);
+    instance->decode_enable = enable;
+}
+
 void infrared_worker_tx_start(InfraredWorker* instance) {
     furi_assert(instance);
     furi_assert(instance->state == InfraredWorkerStateIdle);

+ 8 - 0
lib/infrared/worker/infrared_worker.h

@@ -76,6 +76,14 @@ void infrared_worker_rx_set_received_signal_callback(
  */
 void infrared_worker_rx_enable_blink_on_receiving(InfraredWorker* instance, bool enable);
 
+/** Enable decoding of received infrared signals.
+ *
+ * @param[in]   instance - instance of InfraredWorker
+ * @param[in]   enable - true if you want to enable decoding
+ *                       false otherwise
+ */
+void infrared_worker_rx_enable_signal_decoding(InfraredWorker* instance, bool enable);
+
 /** Clarify is received signal either decoded or raw
  *
  * @param[in]   signal - received signal