+#if IRMP_SUPPORT_S100_PROTOCOL == 1\r
+ if (((irmp_pulse_time >= S100_START_BIT_LEN_MIN && irmp_pulse_time <= S100_START_BIT_LEN_MAX) ||\r
+ (irmp_pulse_time >= 2 * S100_START_BIT_LEN_MIN && irmp_pulse_time <= 2 * S100_START_BIT_LEN_MAX)) &&\r
+ ((irmp_pause_time >= S100_START_BIT_LEN_MIN && irmp_pause_time <= S100_START_BIT_LEN_MAX) ||\r
+ (irmp_pause_time >= 2 * S100_START_BIT_LEN_MIN && irmp_pause_time <= 2 * S100_START_BIT_LEN_MAX)))\r
+ { // it's S100\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("protocol = S100, start bit timings: pulse: %3d - %3d, pause: %3d - %3d or pulse: %3d - %3d, pause: %3d - %3d\n",\r
+ S100_START_BIT_LEN_MIN, S100_START_BIT_LEN_MAX,\r
+ 2 * S100_START_BIT_LEN_MIN, 2 * S100_START_BIT_LEN_MAX,\r
+ S100_START_BIT_LEN_MIN, S100_START_BIT_LEN_MAX,\r
+ 2 * S100_START_BIT_LEN_MIN, 2 * S100_START_BIT_LEN_MAX);\r
+#endif // ANALYZE\r
+\r
+ irmp_param_p = (IRMP_PARAMETER *) &s100_param;\r
+ last_pause = irmp_pause_time;\r
+\r
+ if ((irmp_pulse_time > S100_START_BIT_LEN_MAX && irmp_pulse_time <= 2 * S100_START_BIT_LEN_MAX) ||\r
+ (irmp_pause_time > S100_START_BIT_LEN_MAX && irmp_pause_time <= 2 * S100_START_BIT_LEN_MAX))\r
+ {\r
+ last_value = 0;\r
+ rc5_cmd_bit6 = 1<<6;\r
+ }\r
+ else\r
+ {\r
+ last_value = 1;\r
+ }\r
+ }\r
+ else\r
+#endif // IRMP_SUPPORT_S100_PROTOCOL == 1\r
+\r
+#if IRMP_SUPPORT_RC5_PROTOCOL == 1\r
+ if (((irmp_pulse_time >= RC5_START_BIT_LEN_MIN && irmp_pulse_time <= RC5_START_BIT_LEN_MAX) ||\r
+ (irmp_pulse_time >= 2 * RC5_START_BIT_LEN_MIN && irmp_pulse_time <= 2 * RC5_START_BIT_LEN_MAX)) &&\r
+ ((irmp_pause_time >= RC5_START_BIT_LEN_MIN && irmp_pause_time <= RC5_START_BIT_LEN_MAX) ||\r
+ (irmp_pause_time >= 2 * RC5_START_BIT_LEN_MIN && irmp_pause_time <= 2 * RC5_START_BIT_LEN_MAX)))\r
+ { // it's RC5\r
+#if IRMP_SUPPORT_FDC_PROTOCOL == 1\r
+ if (irmp_pulse_time >= FDC_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= FDC_START_BIT_PULSE_LEN_MAX &&\r
+ irmp_pause_time >= FDC_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= FDC_START_BIT_PAUSE_LEN_MAX)\r
+ {\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("protocol = RC5 or FDC\n");\r
+ ANALYZE_PRINTF ("FDC start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
+ FDC_START_BIT_PULSE_LEN_MIN, FDC_START_BIT_PULSE_LEN_MAX,\r
+ FDC_START_BIT_PAUSE_LEN_MIN, FDC_START_BIT_PAUSE_LEN_MAX);\r
+ ANALYZE_PRINTF ("RC5 start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
+ RC5_START_BIT_LEN_MIN, RC5_START_BIT_LEN_MAX,\r
+ RC5_START_BIT_LEN_MIN, RC5_START_BIT_LEN_MAX);\r
+#endif // ANALYZE\r
+ memcpy_P (&irmp_param2, &fdc_param, sizeof (IRMP_PARAMETER));\r
+ }\r
+ else\r
+#endif // IRMP_SUPPORT_FDC_PROTOCOL == 1\r
+\r
+#if IRMP_SUPPORT_RCCAR_PROTOCOL == 1\r
+ if (irmp_pulse_time >= RCCAR_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= RCCAR_START_BIT_PULSE_LEN_MAX &&\r
+ irmp_pause_time >= RCCAR_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= RCCAR_START_BIT_PAUSE_LEN_MAX)\r
+ {\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("protocol = RC5 or RCCAR\n");\r
+ ANALYZE_PRINTF ("RCCAR start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
+ RCCAR_START_BIT_PULSE_LEN_MIN, RCCAR_START_BIT_PULSE_LEN_MAX,\r
+ RCCAR_START_BIT_PAUSE_LEN_MIN, RCCAR_START_BIT_PAUSE_LEN_MAX);\r
+ ANALYZE_PRINTF ("RC5 start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
+ RC5_START_BIT_LEN_MIN, RC5_START_BIT_LEN_MAX,\r
+ RC5_START_BIT_LEN_MIN, RC5_START_BIT_LEN_MAX);\r
+#endif // ANALYZE\r
+ memcpy_P (&irmp_param2, &rccar_param, sizeof (IRMP_PARAMETER));\r
+ }\r
+ else\r
+#endif // IRMP_SUPPORT_RCCAR_PROTOCOL == 1\r
+ {\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("protocol = RC5, start bit timings: pulse: %3d - %3d, pause: %3d - %3d or pulse: %3d - %3d, pause: %3d - %3d\n",\r
+ RC5_START_BIT_LEN_MIN, RC5_START_BIT_LEN_MAX,\r
+ 2 * RC5_START_BIT_LEN_MIN, 2 * RC5_START_BIT_LEN_MAX,\r
+ RC5_START_BIT_LEN_MIN, RC5_START_BIT_LEN_MAX,\r
+ 2 * RC5_START_BIT_LEN_MIN, 2 * RC5_START_BIT_LEN_MAX);\r
+#endif // ANALYZE\r
+ }\r
+\r
+ irmp_param_p = (IRMP_PARAMETER *) &rc5_param;\r
+ last_pause = irmp_pause_time;\r
+\r
+ if ((irmp_pulse_time > RC5_START_BIT_LEN_MAX && irmp_pulse_time <= 2 * RC5_START_BIT_LEN_MAX) ||\r
+ (irmp_pause_time > RC5_START_BIT_LEN_MAX && irmp_pause_time <= 2 * RC5_START_BIT_LEN_MAX))\r
+ {\r
+ last_value = 0;\r
+ rc5_cmd_bit6 = 1<<6;\r
+ }\r
+ else\r
+ {\r
+ last_value = 1;\r
+ }\r
+ }\r
+ else\r
+#endif // IRMP_SUPPORT_RC5_PROTOCOL == 1\r
+\r
+#if IRMP_SUPPORT_DENON_PROTOCOL == 1\r
+ if ( (irmp_pulse_time >= DENON_PULSE_LEN_MIN && irmp_pulse_time <= DENON_PULSE_LEN_MAX) &&\r
+ ((irmp_pause_time >= DENON_1_PAUSE_LEN_MIN && irmp_pause_time <= DENON_1_PAUSE_LEN_MAX) ||\r
+ (irmp_pause_time >= DENON_0_PAUSE_LEN_MIN && irmp_pause_time <= DENON_0_PAUSE_LEN_MAX)))\r
+ { // it's DENON\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("protocol = DENON, start bit timings: pulse: %3d - %3d, pause: %3d - %3d or %3d - %3d\n",\r
+ DENON_PULSE_LEN_MIN, DENON_PULSE_LEN_MAX,\r
+ DENON_1_PAUSE_LEN_MIN, DENON_1_PAUSE_LEN_MAX,\r
+ DENON_0_PAUSE_LEN_MIN, DENON_0_PAUSE_LEN_MAX);\r
+#endif // ANALYZE\r
+ irmp_param_p = (IRMP_PARAMETER *) &denon_param;\r
+ }\r
+ else\r
+#endif // IRMP_SUPPORT_DENON_PROTOCOL == 1\r
+\r
+#if IRMP_SUPPORT_THOMSON_PROTOCOL == 1\r
+ if ( (irmp_pulse_time >= THOMSON_PULSE_LEN_MIN && irmp_pulse_time <= THOMSON_PULSE_LEN_MAX) &&\r
+ ((irmp_pause_time >= THOMSON_1_PAUSE_LEN_MIN && irmp_pause_time <= THOMSON_1_PAUSE_LEN_MAX) ||\r
+ (irmp_pause_time >= THOMSON_0_PAUSE_LEN_MIN && irmp_pause_time <= THOMSON_0_PAUSE_LEN_MAX)))\r
+ { // it's THOMSON\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("protocol = THOMSON, start bit timings: pulse: %3d - %3d, pause: %3d - %3d or %3d - %3d\n",\r
+ THOMSON_PULSE_LEN_MIN, THOMSON_PULSE_LEN_MAX,\r
+ THOMSON_1_PAUSE_LEN_MIN, THOMSON_1_PAUSE_LEN_MAX,\r
+ THOMSON_0_PAUSE_LEN_MIN, THOMSON_0_PAUSE_LEN_MAX);\r
+#endif // ANALYZE\r
+ irmp_param_p = (IRMP_PARAMETER *) &thomson_param;\r
+ }\r
+ else\r
+#endif // IRMP_SUPPORT_THOMSON_PROTOCOL == 1\r
+\r
+#if IRMP_SUPPORT_BOSE_PROTOCOL == 1\r
+ if (irmp_pulse_time >= BOSE_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= BOSE_START_BIT_PULSE_LEN_MAX &&\r
+ irmp_pause_time >= BOSE_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= BOSE_START_BIT_PAUSE_LEN_MAX)\r
+ {\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("protocol = BOSE, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
+ BOSE_START_BIT_PULSE_LEN_MIN, BOSE_START_BIT_PULSE_LEN_MAX,\r
+ BOSE_START_BIT_PAUSE_LEN_MIN, BOSE_START_BIT_PAUSE_LEN_MAX);\r
+#endif // ANALYZE\r
+ irmp_param_p = (IRMP_PARAMETER *) &bose_param;\r
+ }\r
+ else\r
+#endif // IRMP_SUPPORT_BOSE_PROTOCOL == 1\r
+\r
+#if IRMP_SUPPORT_RC6_PROTOCOL == 1\r
+ if (irmp_pulse_time >= RC6_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= RC6_START_BIT_PULSE_LEN_MAX &&\r
+ irmp_pause_time >= RC6_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= RC6_START_BIT_PAUSE_LEN_MAX)\r
+ { // it's RC6\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("protocol = RC6, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
+ RC6_START_BIT_PULSE_LEN_MIN, RC6_START_BIT_PULSE_LEN_MAX,\r
+ RC6_START_BIT_PAUSE_LEN_MIN, RC6_START_BIT_PAUSE_LEN_MAX);\r
+#endif // ANALYZE\r
+ irmp_param_p = (IRMP_PARAMETER *) &rc6_param;\r
+ last_pause = 0;\r
+ last_value = 1;\r
+ }\r
+ else\r
+#endif // IRMP_SUPPORT_RC6_PROTOCOL == 1\r
+\r
+#if IRMP_SUPPORT_RECS80EXT_PROTOCOL == 1\r
+ if (irmp_pulse_time >= RECS80EXT_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= RECS80EXT_START_BIT_PULSE_LEN_MAX &&\r
+ irmp_pause_time >= RECS80EXT_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= RECS80EXT_START_BIT_PAUSE_LEN_MAX)\r
+ { // it's RECS80EXT\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("protocol = RECS80EXT, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
+ RECS80EXT_START_BIT_PULSE_LEN_MIN, RECS80EXT_START_BIT_PULSE_LEN_MAX,\r
+ RECS80EXT_START_BIT_PAUSE_LEN_MIN, RECS80EXT_START_BIT_PAUSE_LEN_MAX);\r
+#endif // ANALYZE\r
+ irmp_param_p = (IRMP_PARAMETER *) &recs80ext_param;\r
+ }\r
+ else\r
+#endif // IRMP_SUPPORT_RECS80EXT_PROTOCOL == 1\r
+\r
+#if IRMP_SUPPORT_NUBERT_PROTOCOL == 1\r
+ if (irmp_pulse_time >= NUBERT_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= NUBERT_START_BIT_PULSE_LEN_MAX &&\r
+ irmp_pause_time >= NUBERT_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= NUBERT_START_BIT_PAUSE_LEN_MAX)\r
+ { // it's NUBERT\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("protocol = NUBERT, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
+ NUBERT_START_BIT_PULSE_LEN_MIN, NUBERT_START_BIT_PULSE_LEN_MAX,\r
+ NUBERT_START_BIT_PAUSE_LEN_MIN, NUBERT_START_BIT_PAUSE_LEN_MAX);\r
+#endif // ANALYZE\r
+ irmp_param_p = (IRMP_PARAMETER *) &nubert_param;\r
+ }\r
+ else\r
+#endif // IRMP_SUPPORT_NUBERT_PROTOCOL == 1\r
+\r
+#if IRMP_SUPPORT_FAN_PROTOCOL == 1\r
+ if (irmp_pulse_time >= FAN_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= FAN_START_BIT_PULSE_LEN_MAX &&\r
+ irmp_pause_time >= FAN_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= FAN_START_BIT_PAUSE_LEN_MAX)\r
+ { // it's FAN\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("protocol = FAN, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
+ FAN_START_BIT_PULSE_LEN_MIN, FAN_START_BIT_PULSE_LEN_MAX,\r
+ FAN_START_BIT_PAUSE_LEN_MIN, FAN_START_BIT_PAUSE_LEN_MAX);\r
+#endif // ANALYZE\r
+ irmp_param_p = (IRMP_PARAMETER *) &fan_param;\r
+ }\r
+ else\r
+#endif // IRMP_SUPPORT_FAN_PROTOCOL == 1\r
+\r
+#if IRMP_SUPPORT_SPEAKER_PROTOCOL == 1\r
+ if (irmp_pulse_time >= SPEAKER_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= SPEAKER_START_BIT_PULSE_LEN_MAX &&\r
+ irmp_pause_time >= SPEAKER_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= SPEAKER_START_BIT_PAUSE_LEN_MAX)\r
+ { // it's SPEAKER\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("protocol = SPEAKER, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
+ SPEAKER_START_BIT_PULSE_LEN_MIN, SPEAKER_START_BIT_PULSE_LEN_MAX,\r
+ SPEAKER_START_BIT_PAUSE_LEN_MIN, SPEAKER_START_BIT_PAUSE_LEN_MAX);\r
+#endif // ANALYZE\r
+ irmp_param_p = (IRMP_PARAMETER *) &speaker_param;\r
+ }\r
+ else\r
+#endif // IRMP_SUPPORT_SPEAKER_PROTOCOL == 1\r
+\r
+#if IRMP_SUPPORT_BANG_OLUFSEN_PROTOCOL == 1\r
+ if (irmp_pulse_time >= BANG_OLUFSEN_START_BIT1_PULSE_LEN_MIN && irmp_pulse_time <= BANG_OLUFSEN_START_BIT1_PULSE_LEN_MAX &&\r
+ irmp_pause_time >= BANG_OLUFSEN_START_BIT1_PAUSE_LEN_MIN && irmp_pause_time <= BANG_OLUFSEN_START_BIT1_PAUSE_LEN_MAX)\r
+ { // it's BANG_OLUFSEN\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("protocol = BANG_OLUFSEN\n");\r
+ ANALYZE_PRINTF ("start bit 1 timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
+ BANG_OLUFSEN_START_BIT1_PULSE_LEN_MIN, BANG_OLUFSEN_START_BIT1_PULSE_LEN_MAX,\r
+ BANG_OLUFSEN_START_BIT1_PAUSE_LEN_MIN, BANG_OLUFSEN_START_BIT1_PAUSE_LEN_MAX);\r
+ ANALYZE_PRINTF ("start bit 2 timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
+ BANG_OLUFSEN_START_BIT2_PULSE_LEN_MIN, BANG_OLUFSEN_START_BIT2_PULSE_LEN_MAX,\r
+ BANG_OLUFSEN_START_BIT2_PAUSE_LEN_MIN, BANG_OLUFSEN_START_BIT2_PAUSE_LEN_MAX);\r
+ ANALYZE_PRINTF ("start bit 3 timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
+ BANG_OLUFSEN_START_BIT3_PULSE_LEN_MIN, BANG_OLUFSEN_START_BIT3_PULSE_LEN_MAX,\r
+ BANG_OLUFSEN_START_BIT3_PAUSE_LEN_MIN, BANG_OLUFSEN_START_BIT3_PAUSE_LEN_MAX);\r
+ ANALYZE_PRINTF ("start bit 4 timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
+ BANG_OLUFSEN_START_BIT4_PULSE_LEN_MIN, BANG_OLUFSEN_START_BIT4_PULSE_LEN_MAX,\r
+ BANG_OLUFSEN_START_BIT4_PAUSE_LEN_MIN, BANG_OLUFSEN_START_BIT4_PAUSE_LEN_MAX);\r
+#endif // ANALYZE\r
+ irmp_param_p = (IRMP_PARAMETER *) &bang_olufsen_param;\r
+ last_value = 0;\r
+ }\r
+ else\r
+#endif // IRMP_SUPPORT_BANG_OLUFSEN_PROTOCOL == 1\r
+\r
+#if IRMP_SUPPORT_GRUNDIG_NOKIA_IR60_PROTOCOL == 1\r
+ if (irmp_pulse_time >= GRUNDIG_NOKIA_IR60_START_BIT_LEN_MIN && irmp_pulse_time <= GRUNDIG_NOKIA_IR60_START_BIT_LEN_MAX &&\r
+ irmp_pause_time >= GRUNDIG_NOKIA_IR60_PRE_PAUSE_LEN_MIN && irmp_pause_time <= GRUNDIG_NOKIA_IR60_PRE_PAUSE_LEN_MAX)\r
+ { // it's GRUNDIG\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("protocol = GRUNDIG, pre bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
+ GRUNDIG_NOKIA_IR60_START_BIT_LEN_MIN, GRUNDIG_NOKIA_IR60_START_BIT_LEN_MAX,\r
+ GRUNDIG_NOKIA_IR60_PRE_PAUSE_LEN_MIN, GRUNDIG_NOKIA_IR60_PRE_PAUSE_LEN_MAX);\r
+#endif // ANALYZE\r
+ irmp_param_p = (IRMP_PARAMETER *) &grundig_param;\r
+ last_pause = irmp_pause_time;\r
+ last_value = 1;\r
+ }\r
+ else\r
+#endif // IRMP_SUPPORT_GRUNDIG_NOKIA_IR60_PROTOCOL == 1\r
+\r
+#if IRMP_SUPPORT_MERLIN_PROTOCOL == 1 // check MERLIN before RUWIDO!\r
+ if (irmp_pulse_time >= MERLIN_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= MERLIN_START_BIT_PULSE_LEN_MAX &&\r
+ irmp_pause_time >= MERLIN_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= MERLIN_START_BIT_PAUSE_LEN_MAX)\r
+ { // it's MERLIN\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("protocol = MERLIN, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
+ MERLIN_START_BIT_PULSE_LEN_MIN, MERLIN_START_BIT_PULSE_LEN_MAX,\r
+ MERLIN_START_BIT_PAUSE_LEN_MIN, MERLIN_START_BIT_PAUSE_LEN_MAX);\r
+#endif // ANALYZE\r
+ irmp_param_p = (IRMP_PARAMETER *) &merlin_param;\r
+ last_pause = 0;\r
+ last_value = 1;\r
+ }\r
+ else\r
+#endif // IRMP_SUPPORT_MERLIN_PROTOCOL == 1\r
+\r
+#if IRMP_SUPPORT_SIEMENS_OR_RUWIDO_PROTOCOL == 1\r
+ if (((irmp_pulse_time >= SIEMENS_OR_RUWIDO_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= SIEMENS_OR_RUWIDO_START_BIT_PULSE_LEN_MAX) ||\r
+ (irmp_pulse_time >= 2 * SIEMENS_OR_RUWIDO_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= 2 * SIEMENS_OR_RUWIDO_START_BIT_PULSE_LEN_MAX)) &&\r
+ ((irmp_pause_time >= SIEMENS_OR_RUWIDO_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= SIEMENS_OR_RUWIDO_START_BIT_PAUSE_LEN_MAX) ||\r
+ (irmp_pause_time >= 2 * SIEMENS_OR_RUWIDO_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= 2 * SIEMENS_OR_RUWIDO_START_BIT_PAUSE_LEN_MAX)))\r
+ { // it's RUWIDO or SIEMENS\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("protocol = RUWIDO, start bit timings: pulse: %3d - %3d or %3d - %3d, pause: %3d - %3d or %3d - %3d\n",\r
+ SIEMENS_OR_RUWIDO_START_BIT_PULSE_LEN_MIN, SIEMENS_OR_RUWIDO_START_BIT_PULSE_LEN_MAX,\r
+ 2 * SIEMENS_OR_RUWIDO_START_BIT_PULSE_LEN_MIN, 2 * SIEMENS_OR_RUWIDO_START_BIT_PULSE_LEN_MAX,\r
+ SIEMENS_OR_RUWIDO_START_BIT_PAUSE_LEN_MIN, SIEMENS_OR_RUWIDO_START_BIT_PAUSE_LEN_MAX,\r
+ 2 * SIEMENS_OR_RUWIDO_START_BIT_PAUSE_LEN_MIN, 2 * SIEMENS_OR_RUWIDO_START_BIT_PAUSE_LEN_MAX);\r
+#endif // ANALYZE\r
+ irmp_param_p = (IRMP_PARAMETER *) &ruwido_param;\r
+ last_pause = irmp_pause_time;\r
+ last_value = 1;\r
+ }\r
+ else\r
+#endif // IRMP_SUPPORT_SIEMENS_OR_RUWIDO_PROTOCOL == 1\r
+\r
+#if IRMP_SUPPORT_FDC_PROTOCOL == 1\r
+ if (irmp_pulse_time >= FDC_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= FDC_START_BIT_PULSE_LEN_MAX &&\r
+ irmp_pause_time >= FDC_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= FDC_START_BIT_PAUSE_LEN_MAX)\r
+ {\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("protocol = FDC, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
+ FDC_START_BIT_PULSE_LEN_MIN, FDC_START_BIT_PULSE_LEN_MAX,\r
+ FDC_START_BIT_PAUSE_LEN_MIN, FDC_START_BIT_PAUSE_LEN_MAX);\r
+#endif // ANALYZE\r
+ irmp_param_p = (IRMP_PARAMETER *) &fdc_param;\r
+ }\r
+ else\r
+#endif // IRMP_SUPPORT_FDC_PROTOCOL == 1\r
+\r
+#if IRMP_SUPPORT_RCCAR_PROTOCOL == 1\r
+ if (irmp_pulse_time >= RCCAR_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= RCCAR_START_BIT_PULSE_LEN_MAX &&\r
+ irmp_pause_time >= RCCAR_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= RCCAR_START_BIT_PAUSE_LEN_MAX)\r
+ {\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("protocol = RCCAR, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
+ RCCAR_START_BIT_PULSE_LEN_MIN, RCCAR_START_BIT_PULSE_LEN_MAX,\r
+ RCCAR_START_BIT_PAUSE_LEN_MIN, RCCAR_START_BIT_PAUSE_LEN_MAX);\r
+#endif // ANALYZE\r
+ irmp_param_p = (IRMP_PARAMETER *) &rccar_param;\r
+ }\r
+ else\r
+#endif // IRMP_SUPPORT_RCCAR_PROTOCOL == 1\r
+\r
+#if IRMP_SUPPORT_KATHREIN_PROTOCOL == 1\r
+ if (irmp_pulse_time >= KATHREIN_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= KATHREIN_START_BIT_PULSE_LEN_MAX &&\r
+ irmp_pause_time >= KATHREIN_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= KATHREIN_START_BIT_PAUSE_LEN_MAX)\r
+ { // it's KATHREIN\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("protocol = KATHREIN, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
+ KATHREIN_START_BIT_PULSE_LEN_MIN, KATHREIN_START_BIT_PULSE_LEN_MAX,\r
+ KATHREIN_START_BIT_PAUSE_LEN_MIN, KATHREIN_START_BIT_PAUSE_LEN_MAX);\r
+#endif // ANALYZE\r
+ irmp_param_p = (IRMP_PARAMETER *) &kathrein_param;\r
+ }\r
+ else\r
+#endif // IRMP_SUPPORT_KATHREIN_PROTOCOL == 1\r
+\r
+#if IRMP_SUPPORT_NETBOX_PROTOCOL == 1\r
+ if (irmp_pulse_time >= NETBOX_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= NETBOX_START_BIT_PULSE_LEN_MAX &&\r
+ irmp_pause_time >= NETBOX_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= NETBOX_START_BIT_PAUSE_LEN_MAX)\r
+ { // it's NETBOX\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("protocol = NETBOX, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
+ NETBOX_START_BIT_PULSE_LEN_MIN, NETBOX_START_BIT_PULSE_LEN_MAX,\r
+ NETBOX_START_BIT_PAUSE_LEN_MIN, NETBOX_START_BIT_PAUSE_LEN_MAX);\r
+#endif // ANALYZE\r
+ irmp_param_p = (IRMP_PARAMETER *) &netbox_param;\r
+ }\r
+ else\r
+#endif // IRMP_SUPPORT_NETBOX_PROTOCOL == 1\r
+\r
+#if IRMP_SUPPORT_LEGO_PROTOCOL == 1\r
+ if (irmp_pulse_time >= LEGO_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= LEGO_START_BIT_PULSE_LEN_MAX &&\r
+ irmp_pause_time >= LEGO_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= LEGO_START_BIT_PAUSE_LEN_MAX)\r
+ {\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("protocol = LEGO, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
+ LEGO_START_BIT_PULSE_LEN_MIN, LEGO_START_BIT_PULSE_LEN_MAX,\r
+ LEGO_START_BIT_PAUSE_LEN_MIN, LEGO_START_BIT_PAUSE_LEN_MAX);\r
+#endif // ANALYZE\r
+ irmp_param_p = (IRMP_PARAMETER *) &lego_param;\r
+ }\r
+ else\r
+#endif // IRMP_SUPPORT_LEGO_PROTOCOL == 1\r
+\r
+#if IRMP_SUPPORT_A1TVBOX_PROTOCOL == 1\r
+ if (irmp_pulse_time >= A1TVBOX_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= A1TVBOX_START_BIT_PULSE_LEN_MAX &&\r
+ irmp_pause_time >= A1TVBOX_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= A1TVBOX_START_BIT_PAUSE_LEN_MAX)\r
+ { // it's A1TVBOX\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("protocol = A1TVBOX, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
+ A1TVBOX_START_BIT_PULSE_LEN_MIN, A1TVBOX_START_BIT_PULSE_LEN_MAX,\r
+ A1TVBOX_START_BIT_PAUSE_LEN_MIN, A1TVBOX_START_BIT_PAUSE_LEN_MAX);\r
+#endif // ANALYZE\r
+ irmp_param_p = (IRMP_PARAMETER *) &a1tvbox_param;\r
+ last_pause = 0;\r
+ last_value = 1;\r
+ }\r
+ else\r
+#endif // IRMP_SUPPORT_A1TVBOX_PROTOCOL == 1\r
+\r
+#if IRMP_SUPPORT_ORTEK_PROTOCOL == 1\r
+ if (irmp_pulse_time >= ORTEK_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= ORTEK_START_BIT_PULSE_LEN_MAX &&\r
+ irmp_pause_time >= ORTEK_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= ORTEK_START_BIT_PAUSE_LEN_MAX)\r
+ { // it's ORTEK (Hama)\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("protocol = ORTEK, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
+ ORTEK_START_BIT_PULSE_LEN_MIN, ORTEK_START_BIT_PULSE_LEN_MAX,\r
+ ORTEK_START_BIT_PAUSE_LEN_MIN, ORTEK_START_BIT_PAUSE_LEN_MAX);\r
+#endif // ANALYZE\r
+ irmp_param_p = (IRMP_PARAMETER *) &ortek_param;\r
+ last_pause = 0;\r
+ last_value = 1;\r
+ parity = 0;\r
+ }\r
+ else\r
+#endif // IRMP_SUPPORT_ORTEK_PROTOCOL == 1\r
+\r
+#if IRMP_SUPPORT_RCMM_PROTOCOL == 1\r
+ if (irmp_pulse_time >= RCMM32_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= RCMM32_START_BIT_PULSE_LEN_MAX &&\r
+ irmp_pause_time >= RCMM32_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= RCMM32_START_BIT_PAUSE_LEN_MAX)\r
+ { // it's RCMM\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("protocol = RCMM, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",\r
+ RCMM32_START_BIT_PULSE_LEN_MIN, RCMM32_START_BIT_PULSE_LEN_MAX,\r
+ RCMM32_START_BIT_PAUSE_LEN_MIN, RCMM32_START_BIT_PAUSE_LEN_MAX);\r
+#endif // ANALYZE\r
+ irmp_param_p = (IRMP_PARAMETER *) &rcmm_param;\r
+ }\r
+ else\r
+#endif // IRMP_SUPPORT_RCMM_PROTOCOL == 1\r
+ {\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("protocol = UNKNOWN\n");\r
+#endif // ANALYZE\r
+ irmp_start_bit_detected = 0; // wait for another start bit...\r
+ }\r
+\r
+ if (irmp_start_bit_detected)\r
+ {\r
+ memcpy_P (&irmp_param, irmp_param_p, sizeof (IRMP_PARAMETER));\r
+\r
+ if (! (irmp_param.flags & IRMP_PARAM_FLAG_IS_MANCHESTER))\r
+ {\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("pulse_1: %3d - %3d\n", irmp_param.pulse_1_len_min, irmp_param.pulse_1_len_max);\r
+ ANALYZE_PRINTF ("pause_1: %3d - %3d\n", irmp_param.pause_1_len_min, irmp_param.pause_1_len_max);\r
+#endif // ANALYZE\r
+ }\r
+ else\r
+ {\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("pulse: %3d - %3d or %3d - %3d\n", irmp_param.pulse_1_len_min, irmp_param.pulse_1_len_max,\r
+ 2 * irmp_param.pulse_1_len_min, 2 * irmp_param.pulse_1_len_max);\r
+ ANALYZE_PRINTF ("pause: %3d - %3d or %3d - %3d\n", irmp_param.pause_1_len_min, irmp_param.pause_1_len_max,\r
+ 2 * irmp_param.pause_1_len_min, 2 * irmp_param.pause_1_len_max);\r
+#endif // ANALYZE\r
+ }\r
+\r
+#if IRMP_SUPPORT_RC5_PROTOCOL == 1 && (IRMP_SUPPORT_FDC_PROTOCOL == 1 || IRMP_SUPPORT_RCCAR_PROTOCOL == 1)\r
+ if (irmp_param2.protocol)\r
+ {\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("pulse_0: %3d - %3d\n", irmp_param2.pulse_0_len_min, irmp_param2.pulse_0_len_max);\r
+ ANALYZE_PRINTF ("pause_0: %3d - %3d\n", irmp_param2.pause_0_len_min, irmp_param2.pause_0_len_max);\r
+ ANALYZE_PRINTF ("pulse_1: %3d - %3d\n", irmp_param2.pulse_1_len_min, irmp_param2.pulse_1_len_max);\r
+ ANALYZE_PRINTF ("pause_1: %3d - %3d\n", irmp_param2.pause_1_len_min, irmp_param2.pause_1_len_max);\r
+#endif // ANALYZE\r
+ }\r
+#endif\r
+\r
+\r
+#if IRMP_SUPPORT_RC6_PROTOCOL == 1\r
+ if (irmp_param.protocol == IRMP_RC6_PROTOCOL)\r
+ {\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("pulse_toggle: %3d - %3d\n", RC6_TOGGLE_BIT_LEN_MIN, RC6_TOGGLE_BIT_LEN_MAX);\r
+#endif // ANALYZE\r
+ }\r
+#endif\r
+\r
+ if (! (irmp_param.flags & IRMP_PARAM_FLAG_IS_MANCHESTER))\r
+ {\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("pulse_0: %3d - %3d\n", irmp_param.pulse_0_len_min, irmp_param.pulse_0_len_max);\r
+ ANALYZE_PRINTF ("pause_0: %3d - %3d\n", irmp_param.pause_0_len_min, irmp_param.pause_0_len_max);\r
+#endif // ANALYZE\r
+ }\r
+ else\r
+ {\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("pulse: %3d - %3d or %3d - %3d\n", irmp_param.pulse_0_len_min, irmp_param.pulse_0_len_max,\r
+ 2 * irmp_param.pulse_0_len_min, 2 * irmp_param.pulse_0_len_max);\r
+ ANALYZE_PRINTF ("pause: %3d - %3d or %3d - %3d\n", irmp_param.pause_0_len_min, irmp_param.pause_0_len_max,\r
+ 2 * irmp_param.pause_0_len_min, 2 * irmp_param.pause_0_len_max);\r
+#endif // ANALYZE\r
+ }\r
+\r
+#ifdef ANALYZE\r
+#if IRMP_SUPPORT_BANG_OLUFSEN_PROTOCOL == 1\r
+ if (irmp_param.protocol == IRMP_BANG_OLUFSEN_PROTOCOL)\r
+ {\r
+ ANALYZE_PRINTF ("pulse_r: %3d - %3d\n", irmp_param.pulse_0_len_min, irmp_param.pulse_0_len_max);\r
+ ANALYZE_PRINTF ("pause_r: %3d - %3d\n", BANG_OLUFSEN_R_PAUSE_LEN_MIN, BANG_OLUFSEN_R_PAUSE_LEN_MAX);\r
+ }\r
+#endif\r
+\r
+ ANALYZE_PRINTF ("command_offset: %2d\n", irmp_param.command_offset);\r
+ ANALYZE_PRINTF ("command_len: %3d\n", irmp_param.command_end - irmp_param.command_offset);\r
+ ANALYZE_PRINTF ("complete_len: %3d\n", irmp_param.complete_len);\r
+ ANALYZE_PRINTF ("stop_bit: %3d\n", irmp_param.stop_bit);\r
+#endif // ANALYZE\r
+ }\r
+\r
+ irmp_bit = 0;\r
+\r
+#if IRMP_SUPPORT_MANCHESTER == 1\r
+ if ((irmp_param.flags & IRMP_PARAM_FLAG_IS_MANCHESTER) &&\r
+ irmp_param.protocol != IRMP_RUWIDO_PROTOCOL && // Manchester, but not RUWIDO\r
+ irmp_param.protocol != IRMP_RC6_PROTOCOL) // Manchester, but not RC6\r
+ {\r
+ if (irmp_pause_time > irmp_param.pulse_1_len_max && irmp_pause_time <= 2 * irmp_param.pulse_1_len_max)\r
+ {\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("%8.3fms [bit %2d: pulse = %3d, pause = %3d] ", (double) (time_counter * 1000) / F_INTERRUPTS, irmp_bit, irmp_pulse_time, irmp_pause_time);\r
+ ANALYZE_PUTCHAR ((irmp_param.flags & IRMP_PARAM_FLAG_1ST_PULSE_IS_1) ? '0' : '1');\r
+ ANALYZE_NEWLINE ();\r
+#endif // ANALYZE\r
+ irmp_store_bit ((irmp_param.flags & IRMP_PARAM_FLAG_1ST_PULSE_IS_1) ? 0 : 1);\r
+ }\r
+ else if (! last_value) // && irmp_pause_time >= irmp_param.pause_1_len_min && irmp_pause_time <= irmp_param.pause_1_len_max)\r
+ {\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("%8.3fms [bit %2d: pulse = %3d, pause = %3d] ", (double) (time_counter * 1000) / F_INTERRUPTS, irmp_bit, irmp_pulse_time, irmp_pause_time);\r
+ ANALYZE_PUTCHAR ((irmp_param.flags & IRMP_PARAM_FLAG_1ST_PULSE_IS_1) ? '1' : '0');\r
+ ANALYZE_NEWLINE ();\r
+#endif // ANALYZE\r
+ irmp_store_bit ((irmp_param.flags & IRMP_PARAM_FLAG_1ST_PULSE_IS_1) ? 1 : 0);\r
+ }\r
+ }\r
+ else\r
+#endif // IRMP_SUPPORT_MANCHESTER == 1\r
+\r
+#if IRMP_SUPPORT_SERIAL == 1\r
+ if (irmp_param.flags & IRMP_PARAM_FLAG_IS_SERIAL)\r
+ {\r
+ ; // do nothing\r
+ }\r
+ else\r
+#endif // IRMP_SUPPORT_SERIAL == 1\r
+\r
+\r
+#if IRMP_SUPPORT_DENON_PROTOCOL == 1\r
+ if (irmp_param.protocol == IRMP_DENON_PROTOCOL)\r
+ {\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("%8.3fms [bit %2d: pulse = %3d, pause = %3d] ", (double) (time_counter * 1000) / F_INTERRUPTS, irmp_bit, irmp_pulse_time, irmp_pause_time);\r
+#endif // ANALYZE\r
+\r
+ if (irmp_pause_time >= DENON_1_PAUSE_LEN_MIN && irmp_pause_time <= DENON_1_PAUSE_LEN_MAX)\r
+ { // pause timings correct for "1"?\r
+#ifdef ANALYZE\r
+ ANALYZE_PUTCHAR ('1'); // yes, store 1\r
+ ANALYZE_NEWLINE ();\r
+#endif // ANALYZE\r
+ irmp_store_bit (1);\r
+ }\r
+ else // if (irmp_pause_time >= DENON_0_PAUSE_LEN_MIN && irmp_pause_time <= DENON_0_PAUSE_LEN_MAX)\r
+ { // pause timings correct for "0"?\r
+#ifdef ANALYZE\r
+ ANALYZE_PUTCHAR ('0'); // yes, store 0\r
+ ANALYZE_NEWLINE ();\r
+#endif // ANALYZE\r
+ irmp_store_bit (0);\r
+ }\r
+ }\r
+ else\r
+#endif // IRMP_SUPPORT_DENON_PROTOCOL == 1\r
+#if IRMP_SUPPORT_THOMSON_PROTOCOL == 1\r
+ if (irmp_param.protocol == IRMP_THOMSON_PROTOCOL)\r
+ {\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("%8.3fms [bit %2d: pulse = %3d, pause = %3d] ", (double) (time_counter * 1000) / F_INTERRUPTS, irmp_bit, irmp_pulse_time, irmp_pause_time);\r
+#endif // ANALYZE\r
+\r
+ if (irmp_pause_time >= THOMSON_1_PAUSE_LEN_MIN && irmp_pause_time <= THOMSON_1_PAUSE_LEN_MAX)\r
+ { // pause timings correct for "1"?\r
+#ifdef ANALYZE\r
+ ANALYZE_PUTCHAR ('1'); // yes, store 1\r
+ ANALYZE_NEWLINE ();\r
+#endif // ANALYZE\r
+ irmp_store_bit (1);\r
+ }\r
+ else // if (irmp_pause_time >= THOMSON_0_PAUSE_LEN_MIN && irmp_pause_time <= THOMSON_0_PAUSE_LEN_MAX)\r
+ { // pause timings correct for "0"?\r
+#ifdef ANALYZE\r
+ ANALYZE_PUTCHAR ('0'); // yes, store 0\r
+ ANALYZE_NEWLINE ();\r
+#endif // ANALYZE\r
+ irmp_store_bit (0);\r
+ }\r
+ }\r
+ else\r
+#endif // IRMP_SUPPORT_THOMSON_PROTOCOL == 1\r
+ {\r
+ ; // else do nothing\r
+ }\r
+\r
+ irmp_pulse_time = 1; // set counter to 1, not 0\r
+ irmp_pause_time = 0;\r
+ wait_for_start_space = 0;\r
+ }\r
+ }\r
+ else if (wait_for_space) // the data section....\r
+ { // counting the time of darkness....\r
+ uint_fast8_t got_light = FALSE;\r
+\r
+ if (irmp_input) // still dark?\r
+ { // yes...\r
+ if (irmp_bit == irmp_param.complete_len && irmp_param.stop_bit == 1)\r
+ {\r
+ if (\r
+#if IRMP_SUPPORT_MANCHESTER == 1\r
+ (irmp_param.flags & IRMP_PARAM_FLAG_IS_MANCHESTER) ||\r
+#endif\r
+#if IRMP_SUPPORT_SERIAL == 1\r
+ (irmp_param.flags & IRMP_PARAM_FLAG_IS_SERIAL) ||\r
+#endif\r
+ (irmp_pulse_time >= irmp_param.pulse_0_len_min && irmp_pulse_time <= irmp_param.pulse_0_len_max))\r
+ {\r
+#ifdef ANALYZE\r
+ if (! (irmp_param.flags & IRMP_PARAM_FLAG_IS_MANCHESTER))\r
+ {\r
+ ANALYZE_PRINTF ("stop bit detected\n");\r
+ }\r
+#endif // ANALYZE\r
+ irmp_param.stop_bit = 0;\r
+ }\r
+ else\r
+ {\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("error: stop bit timing wrong, irmp_bit = %d, irmp_pulse_time = %d, pulse_0_len_min = %d, pulse_0_len_max = %d\n",\r
+ irmp_bit, irmp_pulse_time, irmp_param.pulse_0_len_min, irmp_param.pulse_0_len_max);\r
+#endif // ANALYZE\r
+ irmp_start_bit_detected = 0; // wait for another start bit...\r
+ irmp_pulse_time = 0;\r
+ irmp_pause_time = 0;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ irmp_pause_time++; // increment counter\r
+\r
+#if IRMP_SUPPORT_SIRCS_PROTOCOL == 1\r
+ if (irmp_param.protocol == IRMP_SIRCS_PROTOCOL && // Sony has a variable number of bits:\r
+ irmp_pause_time > SIRCS_PAUSE_LEN_MAX && // minimum is 12\r
+ irmp_bit >= 12 - 1) // pause too long?\r
+ { // yes, break and close this frame\r
+ irmp_param.complete_len = irmp_bit + 1; // set new complete length\r
+ got_light = TRUE; // this is a lie, but helps (generates stop bit)\r
+ irmp_tmp_address |= (irmp_bit - SIRCS_MINIMUM_DATA_LEN + 1) << 8; // new: store number of additional bits in upper byte of address!\r
+ irmp_param.command_end = irmp_param.command_offset + irmp_bit + 1; // correct command length\r
+ irmp_pause_time = SIRCS_PAUSE_LEN_MAX - 1; // correct pause length\r
+ }\r
+ else\r
+#endif\r
+#if IRMP_SUPPORT_FAN_PROTOCOL == 1\r
+ if (irmp_param.protocol == IRMP_FAN_PROTOCOL && // FAN has no stop bit.\r
+ irmp_bit >= FAN_COMPLETE_DATA_LEN - 1) // last bit in frame\r
+ { // yes, break and close this frame\r
+ if (irmp_pulse_time <= FAN_0_PULSE_LEN_MAX && irmp_pause_time >= FAN_0_PAUSE_LEN_MIN)\r
+ {\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("Generating virtual stop bit\n");\r
+#endif // ANALYZE\r
+ got_light = TRUE; // this is a lie, but helps (generates stop bit)\r
+ }\r
+ else if (irmp_pulse_time >= FAN_1_PULSE_LEN_MIN && irmp_pause_time >= FAN_1_PAUSE_LEN_MIN)\r
+ {\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("Generating virtual stop bit\n");\r
+#endif // ANALYZE\r
+ got_light = TRUE; // this is a lie, but helps (generates stop bit)\r
+ }\r
+ }\r
+ else\r
+#endif\r
+#if IRMP_SUPPORT_SERIAL == 1\r
+ // NETBOX generates no stop bit, here is the timeout condition:\r
+ if ((irmp_param.flags & IRMP_PARAM_FLAG_IS_SERIAL) && irmp_param.protocol == IRMP_NETBOX_PROTOCOL &&\r
+ irmp_pause_time >= NETBOX_PULSE_LEN * (NETBOX_COMPLETE_DATA_LEN - irmp_bit))\r
+ {\r
+ got_light = TRUE; // this is a lie, but helps (generates stop bit)\r
+ }\r
+ else\r
+#endif\r
+#if IRMP_SUPPORT_GRUNDIG_NOKIA_IR60_PROTOCOL == 1\r
+ if (irmp_param.protocol == IRMP_GRUNDIG_PROTOCOL && !irmp_param.stop_bit)\r
+ {\r
+ if (irmp_pause_time > IR60_TIMEOUT_LEN && (irmp_bit == 5 || irmp_bit == 6))\r
+ {\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("Switching to IR60 protocol\n");\r
+#endif // ANALYZE\r
+ got_light = TRUE; // this is a lie, but generates a stop bit ;-)\r
+ irmp_param.stop_bit = TRUE; // set flag\r
+\r
+ irmp_param.protocol = IRMP_IR60_PROTOCOL; // change protocol\r
+ irmp_param.complete_len = IR60_COMPLETE_DATA_LEN; // correct complete len\r
+ irmp_param.address_offset = IR60_ADDRESS_OFFSET;\r
+ irmp_param.address_end = IR60_ADDRESS_OFFSET + IR60_ADDRESS_LEN;\r
+ irmp_param.command_offset = IR60_COMMAND_OFFSET;\r
+ irmp_param.command_end = IR60_COMMAND_OFFSET + IR60_COMMAND_LEN;\r
+\r
+ irmp_tmp_command <<= 1;\r
+ irmp_tmp_command |= first_bit;\r
+ }\r
+ else if (irmp_pause_time >= 2 * irmp_param.pause_1_len_max && irmp_bit >= GRUNDIG_COMPLETE_DATA_LEN - 2)\r
+ { // special manchester decoder\r
+ irmp_param.complete_len = GRUNDIG_COMPLETE_DATA_LEN; // correct complete len\r
+ got_light = TRUE; // this is a lie, but generates a stop bit ;-)\r
+ irmp_param.stop_bit = TRUE; // set flag\r
+ }\r
+ else if (irmp_bit >= GRUNDIG_COMPLETE_DATA_LEN)\r
+ {\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("Switching to NOKIA protocol, irmp_bit = %d\n", irmp_bit);\r
+#endif // ANALYZE\r
+ irmp_param.protocol = IRMP_NOKIA_PROTOCOL; // change protocol\r
+ irmp_param.address_offset = NOKIA_ADDRESS_OFFSET;\r
+ irmp_param.address_end = NOKIA_ADDRESS_OFFSET + NOKIA_ADDRESS_LEN;\r
+ irmp_param.command_offset = NOKIA_COMMAND_OFFSET;\r
+ irmp_param.command_end = NOKIA_COMMAND_OFFSET + NOKIA_COMMAND_LEN;\r
+\r
+ if (irmp_tmp_command & 0x300)\r
+ {\r
+ irmp_tmp_address = (irmp_tmp_command >> 8);\r
+ irmp_tmp_command &= 0xFF;\r
+ }\r
+ }\r
+ }\r
+ else\r
+#endif\r
+#if IRMP_SUPPORT_SIEMENS_OR_RUWIDO_PROTOCOL == 1\r
+ if (irmp_param.protocol == IRMP_RUWIDO_PROTOCOL && !irmp_param.stop_bit)\r
+ {\r
+ if (irmp_pause_time >= 2 * irmp_param.pause_1_len_max && irmp_bit >= RUWIDO_COMPLETE_DATA_LEN - 2)\r
+ { // special manchester decoder\r
+ irmp_param.complete_len = RUWIDO_COMPLETE_DATA_LEN; // correct complete len\r
+ got_light = TRUE; // this is a lie, but generates a stop bit ;-)\r
+ irmp_param.stop_bit = TRUE; // set flag\r
+ }\r
+ else if (irmp_bit >= RUWIDO_COMPLETE_DATA_LEN)\r
+ {\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("Switching to SIEMENS protocol\n");\r
+#endif // ANALYZE\r
+ irmp_param.protocol = IRMP_SIEMENS_PROTOCOL; // change protocol\r
+ irmp_param.address_offset = SIEMENS_ADDRESS_OFFSET;\r
+ irmp_param.address_end = SIEMENS_ADDRESS_OFFSET + SIEMENS_ADDRESS_LEN;\r
+ irmp_param.command_offset = SIEMENS_COMMAND_OFFSET;\r
+ irmp_param.command_end = SIEMENS_COMMAND_OFFSET + SIEMENS_COMMAND_LEN;\r
+\r
+ // 76543210\r
+ // RUWIDO: AAAAAAAAACCCCCCCp\r
+ // SIEMENS: AAAAAAAAAAACCCCCCCCCCp\r
+ irmp_tmp_address <<= 2;\r
+ irmp_tmp_address |= (irmp_tmp_command >> 6);\r
+ irmp_tmp_command &= 0x003F;\r
+// irmp_tmp_command <<= 4;\r
+ irmp_tmp_command |= last_value;\r
+ }\r
+ }\r
+ else\r
+#endif\r
+#if IRMP_SUPPORT_ROOMBA_PROTOCOL == 1\r
+ if (irmp_param.protocol == IRMP_ROOMBA_PROTOCOL && // Roomba has no stop bit\r
+ irmp_bit >= ROOMBA_COMPLETE_DATA_LEN - 1) // it's the last data bit...\r
+ { // break and close this frame\r
+ if (irmp_pulse_time >= ROOMBA_1_PULSE_LEN_MIN && irmp_pulse_time <= ROOMBA_1_PULSE_LEN_MAX)\r
+ {\r
+ irmp_pause_time = ROOMBA_1_PAUSE_LEN_EXACT;\r
+ }\r
+ else if (irmp_pulse_time >= ROOMBA_0_PULSE_LEN_MIN && irmp_pulse_time <= ROOMBA_0_PULSE_LEN_MAX)\r
+ {\r
+ irmp_pause_time = ROOMBA_0_PAUSE_LEN;\r
+ }\r
+\r
+ got_light = TRUE; // this is a lie, but helps (generates stop bit)\r
+ }\r
+ else\r
+#endif\r
+#if IRMP_SUPPORT_MANCHESTER == 1\r
+ if ((irmp_param.flags & IRMP_PARAM_FLAG_IS_MANCHESTER) &&\r
+ irmp_pause_time >= 2 * irmp_param.pause_1_len_max && irmp_bit >= irmp_param.complete_len - 2 && !irmp_param.stop_bit)\r
+ { // special manchester decoder\r
+ got_light = TRUE; // this is a lie, but generates a stop bit ;-)\r
+ irmp_param.stop_bit = TRUE; // set flag\r
+ }\r
+ else\r
+#endif // IRMP_SUPPORT_MANCHESTER == 1\r
+ if (irmp_pause_time > IRMP_TIMEOUT_LEN) // timeout?\r
+ { // yes...\r
+ if (irmp_bit == irmp_param.complete_len - 1 && irmp_param.stop_bit == 0)\r
+ {\r
+ irmp_bit++;\r
+ }\r
+#if IRMP_SUPPORT_JVC_PROTOCOL == 1\r
+ else if (irmp_param.protocol == IRMP_NEC_PROTOCOL && (irmp_bit == 16 || irmp_bit == 17)) // it was a JVC stop bit\r
+ {\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("Switching to JVC protocol, irmp_bit = %d\n", irmp_bit);\r
+#endif // ANALYZE\r
+ irmp_param.stop_bit = TRUE; // set flag\r
+ irmp_param.protocol = IRMP_JVC_PROTOCOL; // switch protocol\r
+ irmp_param.complete_len = irmp_bit; // patch length: 16 or 17\r
+ irmp_tmp_command = (irmp_tmp_address >> 4); // set command: upper 12 bits are command bits\r
+ irmp_tmp_address = irmp_tmp_address & 0x000F; // lower 4 bits are address bits\r
+ irmp_start_bit_detected = 1; // tricky: don't wait for another start bit...\r
+ }\r
+#endif // IRMP_SUPPORT_JVC_PROTOCOL == 1\r
+#if IRMP_SUPPORT_LGAIR_PROTOCOL == 1\r
+ else if (irmp_param.protocol == IRMP_NEC_PROTOCOL && (irmp_bit == 28 || irmp_bit == 29)) // it was a LGAIR stop bit\r
+ {\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("Switching to LGAIR protocol, irmp_bit = %d\n", irmp_bit);\r
+#endif // ANALYZE\r
+ irmp_param.stop_bit = TRUE; // set flag\r
+ irmp_param.protocol = IRMP_LGAIR_PROTOCOL; // switch protocol\r
+ irmp_param.complete_len = irmp_bit; // patch length: 16 or 17\r
+ irmp_tmp_command = irmp_lgair_command; // set command: upper 8 bits are command bits\r
+ irmp_tmp_address = irmp_lgair_address; // lower 4 bits are address bits\r
+ irmp_start_bit_detected = 1; // tricky: don't wait for another start bit...\r
+ }\r
+#endif // IRMP_SUPPORT_LGAIR_PROTOCOL == 1\r
+\r
+#if IRMP_SUPPORT_NEC42_PROTOCOL == 1\r
+#if IRMP_SUPPORT_NEC_PROTOCOL == 1\r
+ else if (irmp_param.protocol == IRMP_NEC42_PROTOCOL && irmp_bit == 32) // it was a NEC stop bit\r
+ {\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("Switching to NEC protocol\n");\r
+#endif // ANALYZE\r
+ irmp_param.stop_bit = TRUE; // set flag\r
+ irmp_param.protocol = IRMP_NEC_PROTOCOL; // switch protocol\r
+ irmp_param.complete_len = irmp_bit; // patch length: 16 or 17\r
+\r
+ // 0123456789ABC0123456789ABC0123456701234567\r
+ // NEC42: AAAAAAAAAAAAAaaaaaaaaaaaaaCCCCCCCCcccccccc\r
+ // NEC: AAAAAAAAaaaaaaaaCCCCCCCCcccccccc\r
+ irmp_tmp_address |= (irmp_tmp_address2 & 0x0007) << 13; // fm 2012-02-13: 12 -> 13\r
+ irmp_tmp_command = (irmp_tmp_address2 >> 3) | (irmp_tmp_command << 10);\r
+ }\r
+#endif // IRMP_SUPPORT_NEC_PROTOCOL == 1\r
+#if IRMP_SUPPORT_LGAIR_PROTOCOL == 1\r
+ else if (irmp_param.protocol == IRMP_NEC42_PROTOCOL && irmp_bit == 28) // it was a NEC stop bit\r
+ {\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("Switching to LGAIR protocol\n");\r
+#endif // ANALYZE\r
+ irmp_param.stop_bit = TRUE; // set flag\r
+ irmp_param.protocol = IRMP_LGAIR_PROTOCOL; // switch protocol\r
+ irmp_param.complete_len = irmp_bit; // patch length: 16 or 17\r
+ irmp_tmp_address = irmp_lgair_address;\r
+ irmp_tmp_command = irmp_lgair_command;\r
+ }\r
+#endif // IRMP_SUPPORT_LGAIR_PROTOCOL == 1\r
+#if IRMP_SUPPORT_JVC_PROTOCOL == 1\r
+ else if (irmp_param.protocol == IRMP_NEC42_PROTOCOL && (irmp_bit == 16 || irmp_bit == 17)) // it was a JVC stop bit\r
+ {\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("Switching to JVC protocol, irmp_bit = %d\n", irmp_bit);\r
+#endif // ANALYZE\r
+ irmp_param.stop_bit = TRUE; // set flag\r
+ irmp_param.protocol = IRMP_JVC_PROTOCOL; // switch protocol\r
+ irmp_param.complete_len = irmp_bit; // patch length: 16 or 17\r
+\r
+ // 0123456789ABC0123456789ABC0123456701234567\r
+ // NEC42: AAAAAAAAAAAAAaaaaaaaaaaaaaCCCCCCCCcccccccc\r
+ // JVC: AAAACCCCCCCCCCCC\r
+ irmp_tmp_command = (irmp_tmp_address >> 4) | (irmp_tmp_address2 << 9); // set command: upper 12 bits are command bits\r
+ irmp_tmp_address = irmp_tmp_address & 0x000F; // lower 4 bits are address bits\r
+ }\r
+#endif // IRMP_SUPPORT_JVC_PROTOCOL == 1\r
+#endif // IRMP_SUPPORT_NEC42_PROTOCOL == 1\r
+\r
+#if IRMP_SUPPORT_SAMSUNG48_PROTOCOL == 1\r
+ else if (irmp_param.protocol == IRMP_SAMSUNG48_PROTOCOL && irmp_bit == 32) // it was a SAMSUNG32 stop bit\r
+ {\r
+#ifdef ANALYZE\r
+ ANALYZE_PRINTF ("Switching to SAMSUNG32 protocol\n");\r
+#endif // ANALYZE\r
+ irmp_param.protocol = IRMP_SAMSUNG32_PROTOCOL;\r
+ irmp_param.command_offset = SAMSUNG32_COMMAND_OFFSET;\r
+ irmp_param.command_end = SAMSUNG32_COMMAND_OFFSET + SAMSUNG32_COMMAND_LEN;\r
+ irmp_param.complete_len = SAMSUNG32_COMPLETE_DATA_LEN;\r
+ }\r
+#endif // IRMP_SUPPORT_SAMSUNG_PROTOCOL == 1\r
+\r
+#if IRMP_SUPPORT_RCMM_PROTOCOL == 1\r
+ else if (irmp_param.protocol == IRMP_RCMM32_PROTOCOL && (irmp_bit == 12 || irmp_bit == 24)) // it was a RCMM stop bit\r
+ {\r
+ if (irmp_bit == 12)\r
+ {\r
+ irmp_tmp_command = (irmp_tmp_address & 0xFF); // set command: lower 8 bits are command bits\r
+ irmp_tmp_address >>= 8; // upper 4 bits are address bits\r