IR remoute control multiple click button

Dependents:   Exam_TK Exam_TK

Revision:
0:94d6bf511846
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IRremouteMy.h	Fri Jul 12 07:35:10 2019 +0000
@@ -0,0 +1,212 @@
+#define ONE_PULSE 3000
+#define ZERO_PULSE 1000
+#define ONE_PULSE_TH 1000
+#define ZERO_PULSE_TH 700
+#define IR_BUFF_MAX  2
+
+#define IR_KEY_1 0xee917fc0
+#define IR_KEY_2 0xee51bfc0
+#define IR_KEY_3 0xee11ffc0
+#define IR_KEY_4 0xeed13fc0
+#define IR_KEY_5 0xefd03fc0
+#define IR_KEY_6 0xef10ffc0
+#define IR_KEY_7 0xfe01ffc0
+#define IR_KEY_8 0xfa857fc0
+#define IR_KEY_9 0xfd827fc0
+
+#define IR_KEY_0     0xf9867fc0 
+#define IR_KEY_STAR  0xfa45bfc0
+#define IR_KEY_SHARP 0xfc837fc0
+
+#define IR_KEY_U 0xf9c63fc0
+#define IR_KEY_D 0xeb54bfc0
+#define IR_KEY_L 0xfdc23fc0
+#define IR_KEY_R 0xe956bfc0
+#define IR_KEY_OK 0xf8c73fc0
+
+//------ IR Reciver time-------
+Timeout IrReciverTimer;
+Timer  duration_timer;
+
+//------ IR Reciver global-----
+uint8_t IrRecEn=1;
+uint8_t NewMode=0;
+uint8_t NewParametr=0;
+uint8_t bit_counter;
+uint8_t NewChar;
+uint16_t f_cnt,r_cnt;
+uint32_t IrChar,IrChar_t;
+char IRmessage_buff[16];
+uint8_t buff_cnt;
+uint8_t mode_ir;
+uint16_t parametr_t;
+//-----------------
+ void IRmessage_t()
+ {
+ char c;   
+ char *endptr;    
+        if (NewChar){
+           //pc.printf("0x%8x %d\r\n",IrChar,bit_counter);
+           switch(IrChar){
+                case IR_KEY_1:
+                    c='1';
+                    break;
+                case IR_KEY_2:
+                    c='2';
+                     break;
+                case IR_KEY_3:
+                    c='3';
+                    break;
+                case IR_KEY_4:
+                    c='4';
+                    break;
+                case IR_KEY_5:
+                    c='5';
+                    break;
+                case IR_KEY_6:
+                    c='6';
+                    break;
+                case IR_KEY_7:
+                    c='7';
+                    break;
+                case IR_KEY_8:
+                    c='8';
+                    break;                   
+                case IR_KEY_9:
+                    c='9';
+                    break;                    
+                case IR_KEY_0:
+                    c='0';
+                    break;          
+                case IR_KEY_STAR:
+                    c='*';
+                    break;    
+                case IR_KEY_SHARP:
+                    c='#';
+                    break;                              
+                case IR_KEY_U:
+                    c='U';
+                    break;          
+                case IR_KEY_D:
+                    c='D';
+                     break;          
+                case IR_KEY_L:
+                    c='L';
+                    break;          
+                case IR_KEY_R:
+                    c='R';
+                    break;          
+                case IR_KEY_OK:
+                    c='O';
+                    break;          
+           }           
+           NewChar=0;
+           bit_counter=0;
+           switch(c){
+                case '*':
+                    IRmessage_buff[buff_cnt]='.';
+                    mode_ir=strtol(IRmessage_buff,&endptr,10);
+                    buff_cnt=0;
+                    NewMode=1;
+                    break;
+                case '#':
+                    IRmessage_buff[buff_cnt]='.';
+                    parametr_t=strtol(IRmessage_buff,&endptr,10);
+                    buff_cnt=0;   
+                    NewParametr=1;                                
+                    break; 
+                case 'U':
+                    mode_ir=11;
+                    NewMode=1;                    
+                    break;  
+                case 'D':
+                    mode_ir=12;    
+                    NewMode=1;                                    
+                    break;                              
+                 case 'L':
+                    mode_ir=13;
+                    NewMode=1;                                        
+                    break;   
+                case 'R':
+                    mode_ir=14;   
+                    NewMode=1;                                     
+                    break; 
+                case 'O':
+                    mode_ir=1;  
+                    NewMode=1;                                     
+                    break;  
+                default:
+                    if(buff_cnt<15){
+                       IRmessage_buff[buff_cnt]=c;
+                       buff_cnt++;
+                    }
+                    break;                                                                                               
+          }
+        }   
+}                                                                                                                                            
+                  
+//-----IR Reciver ISR-----
+void IrReciver_risingedge()
+{
+    duration_timer.start();
+}
+
+//----------------------
+void IrReciverTimer_isr()
+{
+    IrChar=IrChar_t;
+    IrChar_t=0;
+    if(bit_counter==36)    
+        NewChar=1;
+    else
+        bit_counter=0;
+    IRmessage_t(); 
+}
+
+//--------------------------
+void IrReciver_fallingedge()
+{
+    uint16_t duration_time;
+    if(IrRecEn) {
+         duration_timer.stop();
+         duration_time=duration_timer.read_us();
+         duration_timer.reset();
+
+         IrChar_t=IrChar_t>>1;
+         if (duration_time>ONE_PULSE_TH) 
+            IrChar_t=IrChar_t|0x80000000;
+         else  
+             IrChar_t=IrChar_t&0x7fffffff;      
+         bit_counter++;
+         IrReciverTimer.detach();     
+         IrReciverTimer.attach_us(&IrReciverTimer_isr,50000);   
+    }
+}
+        
+//--------------------------------------
+void TRremoteIni(InterruptIn  *IrReciver)
+{
+  IrReciver->rise(&IrReciver_risingedge);
+  IrReciver->fall(&IrReciver_fallingedge);
+  bit_counter=0;
+  IrChar=0;
+  IrChar_t=0; 
+  IrRecEn=1;
+  NewChar=0; 
+  buff_cnt=0;
+}  
+ 
+//--------------------------------------------- 
+ void IRmessage(uint8_t *mode,uint8_t *mode_ind,uint16_t *parametr)
+{
+ if(NewMode){
+    *mode=*mode_ind=mode_ir;
+    NewMode=0;
+ }
+ if(NewParametr){  
+    *parametr=parametr_t; 
+    NewParametr=0;        
+ }
+}
+ 
+