From 5b437ff65b0f7ae2ba7b361737296ce9d886a113 Mon Sep 17 00:00:00 2001 From: ukw Date: Mon, 17 May 2010 10:34:46 +0000 Subject: [PATCH] Version 1.3.1: corrected command bitmask for SAMSUNG32 protocol, added GRUNDIG protocol to IRSND. git-svn-id: svn://mikrocontroller.net/irmp@13 aeb2e35e-bfc4-4214-b83c-9e8de998ed28 --- irmp.c | 24 +++--- irmp.exe | Bin 22016 -> 22016 bytes irmp.h | 14 +++- irsnd.c | 203 +++++++++++++++++++++++++++++++++++++++++++++----- irsnd.exe | Bin 12288 -> 12800 bytes irsndconfig.h | 3 +- 6 files changed, 209 insertions(+), 35 deletions(-) diff --git a/irmp.c b/irmp.c index 7c1225f..f4e2ef7 100644 --- a/irmp.c +++ b/irmp.c @@ -3,7 +3,7 @@ * * Copyright (c) 2009-2010 Frank Meyer - frank(at)fli4l.de * - * $Id: irmp.c,v 1.24 2010/05/16 21:58:13 fm Exp $ + * $Id: irmp.c,v 1.25 2010/05/17 10:31:43 fm Exp $ * * ATMEGA88 @ 8 MHz * @@ -363,12 +363,12 @@ typedef unsigned int16 uint16_t; #define SAMSUNG_START_BIT_PULSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * SAMSUNG_START_BIT_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1) #define SAMSUNG_START_BIT_PAUSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * SAMSUNG_START_BIT_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1) #define SAMSUNG_START_BIT_PAUSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * SAMSUNG_START_BIT_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1) -#define SAMSUNG_PULSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * SAMSUNG_PULSE_TIME * MIN_TOLERANCE_50 + 0.5) - 1) -#define SAMSUNG_PULSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * SAMSUNG_PULSE_TIME * MAX_TOLERANCE_50 + 0.5) + 1) -#define SAMSUNG_1_PAUSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * SAMSUNG_1_PAUSE_TIME * MIN_TOLERANCE_50 + 0.5) - 1) -#define SAMSUNG_1_PAUSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * SAMSUNG_1_PAUSE_TIME * MAX_TOLERANCE_50 + 0.5) + 1) -#define SAMSUNG_0_PAUSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * SAMSUNG_0_PAUSE_TIME * MIN_TOLERANCE_50 + 0.5) - 1) -#define SAMSUNG_0_PAUSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * SAMSUNG_0_PAUSE_TIME * MAX_TOLERANCE_50 + 0.5) + 1) +#define SAMSUNG_PULSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * SAMSUNG_PULSE_TIME * MIN_TOLERANCE_30 + 0.5) - 1) +#define SAMSUNG_PULSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * SAMSUNG_PULSE_TIME * MAX_TOLERANCE_30 + 0.5) + 1) +#define SAMSUNG_1_PAUSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * SAMSUNG_1_PAUSE_TIME * MIN_TOLERANCE_30 + 0.5) - 1) +#define SAMSUNG_1_PAUSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * SAMSUNG_1_PAUSE_TIME * MAX_TOLERANCE_30 + 0.5) + 1) +#define SAMSUNG_0_PAUSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * SAMSUNG_0_PAUSE_TIME * MIN_TOLERANCE_30 + 0.5) - 1) +#define SAMSUNG_0_PAUSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * SAMSUNG_0_PAUSE_TIME * MAX_TOLERANCE_30 + 0.5) + 1) #define MATSUSHITA_START_BIT_PULSE_LEN_MIN ((uint8_t)(F_INTERRUPTS * MATSUSHITA_START_BIT_PULSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1) #define MATSUSHITA_START_BIT_PULSE_LEN_MAX ((uint8_t)(F_INTERRUPTS * MATSUSHITA_START_BIT_PULSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1) @@ -1763,6 +1763,11 @@ irmp_ISR (void) } else if (irmp_pulse_time >= SAMSUNG_PULSE_LEN_MIN && irmp_pulse_time <= SAMSUNG_PULSE_LEN_MAX) { + irmp_param.protocol = IRMP_SAMSUNG32_PROTOCOL; + irmp_param.command_offset = SAMSUNG32_COMMAND_OFFSET; + irmp_param.command_end = SAMSUNG32_COMMAND_OFFSET + SAMSUNG32_COMMAND_LEN; + irmp_param.complete_len = SAMSUNG32_COMPLETE_DATA_LEN; + if (irmp_pause_time >= SAMSUNG_1_PAUSE_LEN_MIN && irmp_pause_time <= SAMSUNG_1_PAUSE_LEN_MAX) { DEBUG_PUTCHAR ('1'); @@ -1779,11 +1784,6 @@ irmp_ISR (void) } DEBUG_PRINTF ("Switching to SAMSUNG32 protocol\n"); - - irmp_param.protocol = IRMP_SAMSUNG32_PROTOCOL; - irmp_param.command_offset = SAMSUNG32_COMMAND_OFFSET; - irmp_param.command_end = SAMSUNG32_COMMAND_OFFSET + SAMSUNG32_COMMAND_LEN; - irmp_param.complete_len = SAMSUNG32_COMPLETE_DATA_LEN; } else { // timing incorrect! diff --git a/irmp.exe b/irmp.exe index 93e51e72cfb9130ce4336574e3ef19ff5f87aac1..9dc5f4b6e4c9a251ad59c31f14e0bc463668b0c6 100644 GIT binary patch delta 1325 zcmYL|c}&zt6vuzF%du!+K^HVCik1=-kGbc!%U*!>Kn1BsMM3LPMQbHd8xgBZ#09N| zpwntR5-W+NK}3_EF-QW|h@>7^?IoU6qatb>%qE_#+o59m{&?ScZ{B-(nNOyq4wTe^ zs_x-W20fjk_1Yhr3G@XKnl?%$lHVrZ$QUrrR97j}K_<8PXwA);#$1Kt3_M=6V00T?Ob(MH=DcEN=}Ql{EqBn zb0zjs^~VxQ9!Io>7O8?ht)ZnoJ=I&3ul6ff^183gvCSH>vO5?ob!}A{tu=H-k68V4 z)!YKxB(D~{TG|pKZ`(cr9ddkZr|F-+dDL<+%}7pZFzp=MFf0$Mg?lX?d$sBG|5(8@u8y5% zi=I<;v=#jP=ajm*^hK_FHEoh+j8>BtW~79+A+L5v?#LK6Tw`xL-voofo`LPX+7s{N zUhSxHC8H?BVzxxs%obC)kuzzH#rGl1g$v*kSO|-tAMSzG@F;ABZSWer2fJYy8i-Pm z7fnUEXaQP^R-z(QiM~h2P!l?XE}$#u778E>j=@7Q!%m!mbMYcvh|6#V{u_Kej+zXfV?7R8c7G! zBszvtnnown>GUI-PnXkmbQAT{U9_6k&}Q0B@6(sm%7!q=Ca@W7K3l=ovSQ|E+t~qj zh#h7IJIPwuMb^%4vj^-oGxNSYj=#rKIOaY(Pv?_)7N5!I@%`OnbS#(!SgNz#g!Vam;rVI2s(yKF3+dUB@#=d}?0m&eSuhPg2XA zmz_790cX$|=IZBSt~su9*IrkPtJ7t5k8n?Q7rJ-5Yu&%PpSy>7uqV&s^VE8pJe?i| z9BNw6=Zb_n%!c`J8C(U|!u4=a-TdV zfLdsd;`}jPMpx4!`V~D$>u3wTPCIEL8_6~t yc8KHRv}hB*iCdyeMC!46f}W(0*0HYZZhgF-sjFA=YMM<+18jjmLZfj;y6InU0LO#? delta 1264 zcmYL|drVYU5Qp!%EUTcnfGf~y5L+U;BAoZREcfmrtC46Gm0}cHOjVRhCA2EOViq*` zpy2CNV>MbS*ro>T)~iOe25YKd)!NnTIXH-*B&s3$~IusQQ0%3~cvI=AVE8dn-AXRPbl9^x%Xp=P{AEcPS0j~{o%dz&Y zV7GbFK4$#Uk!L`*3`Sl774k~ddi7OL-J#@>s5}TsvA&$xfpeW_Wf`u7Mq@&Uoq9_ORthcT@)^}Qx^f1S! zUu3w`2)A4P<$u`ApGV1JXKupAo?vi;vDs=>E`%=W3oF8loLL!4@YaTJZGi+i!x<;< zISawBGHcia)sl~5vOz#r#Jmk=$vZJeK%LwgI}iBGN3lG_gu@{)OGnfKb@)R$H2yLX(2jQI|LVKUy;Z28-+ zcfoiwYurgyo>dcerkot9LrYx0y+9cXr2pp@4)a#ZG-qUBV*KoepK$iqmoqN3?(fW$ z)R$~+d&f5}w9%URM(*&99M#c3`7#&`_APAdkA3-Co}p|rfAp=g4OGMIv1%9?XwJ-9 zHqf673t%zy!_9CPY=9;_4O`(=cmuY>4)`ZjkrO2$9c7_hl#k}4BD5S;p?cJSnou)p zL08bvs2kaE1b!7GtYI(C#Ra$+ug6>PcKjI*;1l>fzJWXN1N;~dA~7V9V4{;uGKI_{ zd1Sty6q8kC8`(`hC5OpTa*CWImq;7wCV!J438S&}H9D3;YS2ma4Vpve(n7k7uAvol zCp|#x=qY-g-le^C5Q}5UER$ukJhq6HvNBe|HnDxImVM5?WXIWA*2=E4c6N{b!-8x8 zkLDwJ5>MfN#yxxzpTcMG*}Q-+NEIG2O}r&a#5z$e_K8MuR$LW#MUM!IA=+q-X%n?x&6Tz|tt4$_ z+J&@hX%TLZJIlSteZcQN3-qX(?3YBOTV1HNDt_z^=tYa{l5N}KFrXJ#l{+= z-e@tp4b_wE$@Z-DRC$hhZh3;9Xs_;_=dJSY_qKSuyb4s5zH^C#snCFv;dJ;WoNM7- z0E=J=EQ3|>5Ih1e!fWt8?18=T861K9qmT=wT7;*e9F&Jj&@!|dRiI6%2JJ-$(HE!{ z{a`V^gC3yAC=^HH7(5Rb;-z>wUXA^@64zjf_u^Xo6>h@K_!7Q}pWtU$A$BsDM3YxY z0!bn%gjvjeWGcxa`D8IEB`e5UQc1RwkC&1|7WY%6nVh${-z5(TqJn17$#fQ-L*KJF zSJQfnatpPwFy>;ZY&v_&UN8qA&nNK7Jit%zGrXNAiDdD<_(;@RpMPAO5f??5=oN}) X*9L3RTAUWIC2B6s4CKsEcR<^}N!hDw diff --git a/irmp.h b/irmp.h index 6f718f8..4233a6f 100644 --- a/irmp.h +++ b/irmp.h @@ -3,7 +3,7 @@ * * Copyright (c) 2009-2010 Frank Meyer - frank(at)fli4l.de * - * $Id: irmp.h,v 1.14 2010/05/15 17:13:07 fm Exp $ + * $Id: irmp.h,v 1.15 2010/05/17 10:31:43 fm Exp $ * * ATMEGA88 @ 8 MHz * @@ -47,8 +47,8 @@ extern "C" #define SIRCS_1_PULSE_TIME 1200.0e-6 // 1200 usec pulse #define SIRCS_0_PULSE_TIME 600.0e-6 // 600 usec pulse #define SIRCS_PAUSE_TIME 600.0e-6 // 600 usec pause -#define SIRCS_REPETITION_TIME 45.0e-3 // repetition after 45ms -#define SIRCS_REPETITION_CNT 3 // SIRCS repeats each frame 3 times +#define SIRCS_REPETITION_CNT 3 // SIRCS sends each frame 3 times +#define SIRCS_REPETITION_TIME 25.0e-3 // repetition after 25ms #define SIRCS_ADDRESS_OFFSET 15 // skip 15 bits #define SIRCS_ADDRESS_LEN 5 // read up to 5 address bits #define SIRCS_COMMAND_OFFSET 0 // skip 0 bits @@ -90,6 +90,8 @@ extern "C" #define SAMSUNG32_COMMAND_OFFSET 16 // skip 16 bits #define SAMSUNG32_COMMAND_LEN 16 // read 16 command bits #define SAMSUNG32_COMPLETE_DATA_LEN 32 // complete length +#define SAMSUNG32_REPETITION_CNT 2 // SAMSUNG32 sends each frame 2 times +#define SAMSUNG32_REPETITION_TIME 47.0e-3 // repetition after 47 ms #define MATSUSHITA_START_BIT_PULSE_TIME 3488.0e-6 // 3488 usec pulse #define MATSUSHITA_START_BIT_PAUSE_TIME 3488.0e-6 // 3488 usec pause @@ -142,6 +144,7 @@ extern "C" #define DENON_PULSE_TIME 275.0e-6 // 275 usec pulse #define DENON_1_PAUSE_TIME 1900.0e-6 // 1900 usec pause #define DENON_0_PAUSE_TIME 1050.0e-6 // 1050 usec pause +#define DENON_REPETITION_CNT 2 // DENON sends each frame 2 times #define DENON_REPETITION_TIME 65.0e-3 // inverted repetition after 65ms #define DENON_ADDRESS_OFFSET 0 // skip 0 bits #define DENON_ADDRESS_LEN 5 // read 5 address bits @@ -183,6 +186,7 @@ extern "C" #define NUBERT_1_PAUSE_TIME 340.0e-6 // 340 usec pause #define NUBERT_0_PULSE_TIME 500.0e-6 // 500 usec pulse #define NUBERT_0_PAUSE_TIME 1300.0e-6 // 1300 usec pause +#define NUBERT_REPETITION_CNT 2 // Nubert sends 2 frames #define NUBERT_REPETITION_TIME 35.0e-3 // repetition after 35ms #define NUBERT_ADDRESS_OFFSET 0 // skip 0 bits #define NUBERT_ADDRESS_LEN 0 // read 0 address bits @@ -215,6 +219,8 @@ extern "C" #define GRUNDIG_BIT_TIME 528.0e-6 // 528 usec pulse/pause #define GRUNDIG_PRE_PAUSE_TIME 2639.0e-6 // 2639 usec pause after pre bit +#define GRUNDIG_REPETITION_CNT 2 // SIRCS sends each frame 3 times +#define GRUNDIG_REPETITION_TIME 20.0e-3 // repetition after 20ms #define GRUNDIG_ADDRESS_OFFSET 0 // skip 2 bits (2nd start + 1 toggle) #define GRUNDIG_ADDRESS_LEN 0 // read 5 address bits #define GRUNDIG_COMMAND_OFFSET 1 // skip 2 bits (1 start bit) @@ -223,7 +229,7 @@ extern "C" #define GRUNDIG_STOP_BIT 0 // has no stop bit #define GRUNDIG_LSB 1 // MSB...LSB -#define AUTO_REPETITION_TIME 50.0e-3 // SIRCS or SAMSUNG32: automatic repetition after 45-50ms +#define AUTO_REPETITION_TIME 50.0e-3 // SIRCS/SAMSUNG32/NUBERT: automatic repetition after 45-50ms #define TRUE 1 #define FALSE 0 diff --git a/irsnd.c b/irsnd.c index fb0ac47..eb3e29f 100644 --- a/irsnd.c +++ b/irsnd.c @@ -3,7 +3,7 @@ * * Copyright (c) 2010 Frank Meyer - frank(at)fli4l.de * - * $Id: irsnd.c,v 1.9 2010/04/28 14:58:59 fm Exp $ + * $Id: irsnd.c,v 1.10 2010/05/17 10:31:43 fm Exp $ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -56,7 +56,7 @@ typedef unsigned short uint16_t; #define SIRCS_1_PULSE_LEN (uint8_t)(F_INTERRUPTS * SIRCS_1_PULSE_TIME + 0.5) #define SIRCS_0_PULSE_LEN (uint8_t)(F_INTERRUPTS * SIRCS_0_PULSE_TIME + 0.5) #define SIRCS_PAUSE_LEN (uint8_t)(F_INTERRUPTS * SIRCS_PAUSE_TIME + 0.5) -#define SIRCS_REPETITION_LEN (uint16_t)(F_INTERRUPTS * SIRCS_REPETITION_TIME + 0.5) // use uint16_t! +#define SIRCS_REPETITION_LEN (uint16_t)(F_INTERRUPTS * SIRCS_REPETITION_TIME + 0.5) // use uint16_t! #define NEC_START_BIT_PULSE_LEN (uint8_t)(F_INTERRUPTS * NEC_START_BIT_PULSE_TIME + 0.5) #define NEC_START_BIT_PAUSE_LEN (uint8_t)(F_INTERRUPTS * NEC_START_BIT_PAUSE_TIME + 0.5) @@ -70,6 +70,8 @@ typedef unsigned short uint16_t; #define SAMSUNG_1_PAUSE_LEN (uint8_t)(F_INTERRUPTS * SAMSUNG_1_PAUSE_TIME + 0.5) #define SAMSUNG_0_PAUSE_LEN (uint8_t)(F_INTERRUPTS * SAMSUNG_0_PAUSE_TIME + 0.5) +#define SAMSUNG32_REPETITION_LEN (uint16_t)(F_INTERRUPTS * SAMSUNG32_REPETITION_TIME + 0.5) // use uint16_t! + #define MATSUSHITA_START_BIT_PULSE_LEN (uint8_t)(F_INTERRUPTS * MATSUSHITA_START_BIT_PULSE_TIME + 0.5) #define MATSUSHITA_START_BIT_PAUSE_LEN (uint8_t)(F_INTERRUPTS * MATSUSHITA_START_BIT_PAUSE_TIME + 0.5) #define MATSUSHITA_PULSE_LEN (uint8_t)(F_INTERRUPTS * MATSUSHITA_PULSE_TIME + 0.5) @@ -121,6 +123,10 @@ typedef unsigned short uint16_t; #define BANG_OLUFSEN_R_PAUSE_LEN (uint8_t)(F_INTERRUPTS * BANG_OLUFSEN_R_PAUSE_TIME + 0.5) #define BANG_OLUFSEN_TRAILER_BIT_PAUSE_LEN (uint8_t)(F_INTERRUPTS * BANG_OLUFSEN_TRAILER_BIT_PAUSE_TIME + 0.5) +#define GRUNDIG_PRE_PAUSE_LEN (uint8_t)(F_INTERRUPTS * GRUNDIG_PRE_PAUSE_TIME + 0.5) +#define GRUNDIG_BIT_LEN (uint8_t)(F_INTERRUPTS * GRUNDIG_BIT_TIME + 0.5) +#define GRUNDIG_REPETITION_LEN (uint16_t)(F_INTERRUPTS * GRUNDIG_REPETITION_TIME + 0.5) // use uint16_t! + #define IRSND_FREQ_32_KHZ (uint8_t) ((F_CPU / 32000 / 2) - 1) #define IRSND_FREQ_36_KHZ (uint8_t) ((F_CPU / 36000 / 2) - 1) #define IRSND_FREQ_38_KHZ (uint8_t) ((F_CPU / 38000 / 2) - 1) @@ -408,6 +414,20 @@ irsnd_send_data (IRMP_DATA * irmp_data_p) break; } #endif +#if IRSND_SUPPORT_GRUNDIG_PROTOCOL == 1 + case IRMP_GRUNDIG_PROTOCOL: + { + command = bitsrevervse (irmp_data_p->command, GRUNDIG_COMMAND_LEN); + + irsnd_buffer[0] = 0xFF; // S1111111 + irsnd_buffer[1] = 0xC0; // 11000000 + irsnd_buffer[2] = 0x80 | (command >> 2); // SCCCCCCC + irsnd_buffer[3] = (command << 6) & 0xC0; // CC000000 + + irsnd_busy = TRUE; + break; + } +#endif default: { break; @@ -437,8 +457,8 @@ irsnd_ISR (void) static uint8_t has_stop_bit; static uint8_t new_frame = TRUE; static uint8_t complete_data_len; - static uint8_t n_frames; // number of repetitions - static uint8_t frame_counter; // repetition counter + static uint8_t n_frames; // number of repetitions + static uint8_t frame_counter; // repetition counter static uint16_t repetition_pause; // pause before repetition, uint16_t! static uint16_t repetition_pause_counter; // pause before repetition, uint16_t! #if IRSND_SUPPORT_BANG_OLUFSEN_PROTOCOL == 1 @@ -464,6 +484,11 @@ irsnd_ISR (void) current_bit = 16; complete_data_len = 2 * DENON_COMPLETE_DATA_LEN + 1; } + else if (irsnd_protocol == IRMP_GRUNDIG_PROTOCOL) + { + current_bit = 15; + complete_data_len = 16 + GRUNDIG_COMPLETE_DATA_LEN; + } } else { @@ -498,8 +523,8 @@ irsnd_ISR (void) pause_0_len = SIRCS_PAUSE_LEN; has_stop_bit = SIRCS_STOP_BIT; complete_data_len = SIRCS_MINIMUM_DATA_LEN; - n_frames = SIRCS_REPETITION_CNT; - repetition_pause = SIRCS_REPETITION_LEN; // 45 ms pause + n_frames = SIRCS_REPETITION_CNT; // 3 frames + repetition_pause = SIRCS_REPETITION_LEN; // 25ms pause irsnd_set_freq (IRSND_FREQ_40_KHZ); break; } @@ -515,7 +540,8 @@ irsnd_ISR (void) pause_0_len = NEC_0_PAUSE_LEN; has_stop_bit = NEC_STOP_BIT; complete_data_len = NEC_COMPLETE_DATA_LEN; - n_frames = 1; + n_frames = 1; // 1 frame + repetition_pause = 0; irsnd_set_freq (IRSND_FREQ_38_KHZ); break; } @@ -531,7 +557,8 @@ irsnd_ISR (void) pause_0_len = SAMSUNG_0_PAUSE_LEN; has_stop_bit = SAMSUNG_STOP_BIT; complete_data_len = SAMSUNG_COMPLETE_DATA_LEN; - n_frames = 1; + n_frames = 1; // 1 frame + repetition_pause = 0; irsnd_set_freq (IRSND_FREQ_38_KHZ); break; } @@ -546,7 +573,8 @@ irsnd_ISR (void) pause_0_len = SAMSUNG_0_PAUSE_LEN; has_stop_bit = SAMSUNG_STOP_BIT; complete_data_len = SAMSUNG32_COMPLETE_DATA_LEN; - n_frames = 1; + n_frames = SAMSUNG32_REPETITION_CNT; // 2 frames + repetition_pause = SAMSUNG32_REPETITION_LEN; // 47 ms pause irsnd_set_freq (IRSND_FREQ_38_KHZ); break; } @@ -562,7 +590,8 @@ irsnd_ISR (void) pause_0_len = MATSUSHITA_0_PAUSE_LEN; has_stop_bit = MATSUSHITA_STOP_BIT; complete_data_len = MATSUSHITA_COMPLETE_DATA_LEN; - n_frames = 1; + n_frames = 1; // 1 frame + repetition_pause = 0; irsnd_set_freq (IRSND_FREQ_36_KHZ); break; } @@ -578,7 +607,8 @@ irsnd_ISR (void) pause_0_len = RECS80_0_PAUSE_LEN; has_stop_bit = RECS80_STOP_BIT; complete_data_len = RECS80_COMPLETE_DATA_LEN; - n_frames = 1; + n_frames = 1; // 1 frame + repetition_pause = 0; irsnd_set_freq (IRSND_FREQ_38_KHZ); break; } @@ -594,7 +624,8 @@ irsnd_ISR (void) pause_0_len = RECS80EXT_0_PAUSE_LEN; has_stop_bit = RECS80EXT_STOP_BIT; complete_data_len = RECS80EXT_COMPLETE_DATA_LEN; - n_frames = 1; + n_frames = 1; // 1 frame + repetition_pause = 0; irsnd_set_freq (IRSND_FREQ_38_KHZ); break; } @@ -610,7 +641,8 @@ irsnd_ISR (void) pause_0_len = RC5_BIT_LEN; has_stop_bit = RC5_STOP_BIT; complete_data_len = RC5_COMPLETE_DATA_LEN; - n_frames = 1; + n_frames = 1; // 1 frame + repetition_pause = 0; irsnd_set_freq (IRSND_FREQ_36_KHZ); break; } @@ -626,8 +658,8 @@ irsnd_ISR (void) pause_0_len = DENON_0_PAUSE_LEN; has_stop_bit = DENON_STOP_BIT; complete_data_len = DENON_COMPLETE_DATA_LEN; - n_frames = 2; - repetition_pause = DENON_REPETITION_LEN; // 65 ms pause after 1st frame (15 bits) + n_frames = DENON_REPETITION_CNT; // 2 frames, 2nd with inverted command + repetition_pause = DENON_REPETITION_LEN; // 65 ms pause after 1st frame irsnd_set_freq (IRSND_FREQ_32_KHZ); break; } @@ -643,8 +675,8 @@ irsnd_ISR (void) pause_0_len = NUBERT_0_PAUSE_LEN; has_stop_bit = NUBERT_STOP_BIT; complete_data_len = NUBERT_COMPLETE_DATA_LEN; - n_frames = 2; - repetition_pause = NUBERT_REPETITION_LEN; // 35 ms pause + n_frames = NUBERT_REPETITION_CNT; // 2 frames + repetition_pause = NUBERT_REPETITION_LEN; // 35 ms pause irsnd_set_freq (IRSND_FREQ_36_KHZ); break; } @@ -660,11 +692,29 @@ irsnd_ISR (void) pause_0_len = BANG_OLUFSEN_0_PAUSE_LEN; has_stop_bit = BANG_OLUFSEN_STOP_BIT; complete_data_len = BANG_OLUFSEN_COMPLETE_DATA_LEN; - n_frames = 1; + n_frames = 1; // 1 frame + repetition_pause = 0; last_bit_value = 0; irsnd_set_freq (IRSND_FREQ_455_KHZ); break; } +#endif +#if IRSND_SUPPORT_GRUNDIG_PROTOCOL == 1 + case IRMP_GRUNDIG_PROTOCOL: + { + startbit_pulse_len = GRUNDIG_BIT_LEN; + startbit_pause_len = GRUNDIG_PRE_PAUSE_LEN; + pulse_1_len = GRUNDIG_BIT_LEN; + pause_1_len = GRUNDIG_BIT_LEN; + pulse_0_len = GRUNDIG_BIT_LEN; + pause_0_len = GRUNDIG_BIT_LEN; + has_stop_bit = GRUNDIG_STOP_BIT; + complete_data_len = GRUNDIG_COMPLETE_DATA_LEN; + n_frames = GRUNDIG_REPETITION_CNT; // 2 frames + repetition_pause = GRUNDIG_REPETITION_LEN; // 20msec pause + irsnd_set_freq (IRSND_FREQ_36_KHZ); + break; + } #endif default: { @@ -929,6 +979,123 @@ irsnd_ISR (void) break; } #endif // IRSND_SUPPORT_RC5_PROTOCOL + +#if IRSND_SUPPORT_GRUNDIG_PROTOCOL == 1 + case IRMP_GRUNDIG_PROTOCOL: + { + uint8_t next_bit = FALSE; + + if (current_bit == 0xFF || current_bit == 15) // start bit of 1st or 2nd frame + { + if (pulse_counter == 0) + { + pulse_len = startbit_pulse_len; + pause_len = startbit_pause_len; + } + + if (pulse_counter < pulse_len) + { + if (pulse_counter == 0) + { + irsnd_on (); + } + pulse_counter++; + } + else if (pause_counter < pause_len) + { + if (pause_counter == 0) + { + irsnd_off (); + } + pause_counter++; + } + else + { + current_bit++; + pulse_counter = 0; + pause_counter = 0; + } + } + else // send n'th bit + { + uint8_t first_pulse; + + first_pulse = (irsnd_buffer[current_bit / 8] & (1<<(7-(current_bit % 8)))) ? TRUE : FALSE; + + if (first_pulse) + { + if (pulse_counter < GRUNDIG_BIT_LEN) + { + if (pulse_counter == 0) + { + irsnd_on (); + } + pulse_counter++; + } + else if (pause_counter < GRUNDIG_BIT_LEN) + { + if (pause_counter == 0) + { + irsnd_off (); + } + pause_counter++; + } + else + { + next_bit = TRUE; + } + } + else + { + if (pause_counter < GRUNDIG_BIT_LEN) + { + if (pause_counter == 0) + { + irsnd_off (); + } + pause_counter++; + } + else if (pulse_counter < GRUNDIG_BIT_LEN) + { + if (pulse_counter == 0) + { + irsnd_on (); + } + pulse_counter++; + } + else + { + next_bit = TRUE; + } + } + + if (next_bit) + { + current_bit++; + + if (current_bit >= complete_data_len) + { + current_bit = 0xFF; + frame_counter++; + + if (frame_counter == n_frames) + { + irsnd_busy = FALSE; + frame_counter = 0; + } + + new_frame = TRUE; + irsnd_off (); + } + + pulse_counter = 0; + pause_counter = 0; + } + } + break; + } +#endif // IRSND_SUPPORT_GRUNDIG_PROTOCOL + default: { irsnd_busy = FALSE; diff --git a/irsnd.exe b/irsnd.exe index bec88b33768fd8f6057532d9803f8b5e4a0c29a6..5bce0d73e4606cfaff8cae55630e45ff989a7ebb 100644 GIT binary patch delta 3660 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 diff --git a/irsndconfig.h b/irsndconfig.h index 597a1a9..81772bf 100644 --- a/irsndconfig.h +++ b/irsndconfig.h @@ -3,7 +3,7 @@ * * Copyright (c) 2010 Frank Meyer - frank(at)fli4l.de * - * $Id$ + * $Id: irsndconfig.h,v 1.2 2010/05/17 10:31:43 fm Exp $ * * ATMEGA88 @ 8 MHz * @@ -33,6 +33,7 @@ #define IRSND_SUPPORT_RECS80EXT_PROTOCOL 1 // flag: support RECS80EXT uses ~100 bytes #define IRSND_SUPPORT_NUBERT_PROTOCOL 1 // flag: support NUBERT uses ~100 bytes #define IRSND_SUPPORT_BANG_OLUFSEN_PROTOCOL 1 // flag: support Bang&Olufsen uses ~250 bytes +#define IRSND_SUPPORT_GRUNDIG_PROTOCOL 1 // flag: support Grundig uses ~250 bytes /*--------------------------------------------------------------------------------------------------------------------------------------------------- -- 2.39.2