EXIT : Simple IR Data Decoder

extern TIM_HandleTypeDef htim17;
uint32_t pulse_width;
uint8_t flag=1,counter;
uint16_t data_packet[96];
if(flag)
  {
    pulse_width=TIM17 -> CNT ; // counter value
	data_packet[counter++]=pulse_width;
	TIM17->CNT=0;              // restart counter(optional) 
	flag=0;
  }
  else
  {
   HAL_TIM_Base_Start(&htim17); // start timer
   flag=1;
   TIM17->CNT=0;                // start counter with value 0
  }
#define HEADER_CODE_START 4500    // Change according to IR Line Code
#define HEADER_CODE_END   4600    // Change according to IR Line Code
#define LOGIC_HIGH_START  1600    // Change according to BIT 1 Code
#define LOGIC_HIGH_END    1700    // Change according to BIT 1 Code
#define LOGIC_LOW_START   500     // Change according to BIT 0 Code
#define LOGIC_LOW_END     600     // Change according to BIT 0 Code
#define MAX_BIT           32      // Change according to Number of bit received
uint16_t pulse_width;
uint8_t flag=1,u8_header,IR_Code[MAX_BIT]; 
int counter;
if(flag)
  {
        pulse_width=TIM17 -> CNT ;
		if(pulse_width>HEADER_CODE_START && pulse_width<HEADER_CODE_END) {u8_header=1;counter=-1;}
		if(u8_header){
		if(pulse_width>LOGIC_HIGH_START && pulse_width<LOGIC_HIGH_END)IR_Code[counter]=1;
		else if(pulse_width>LOGIC_LOW_START && pulse_width<LOGIC_LOW_END)IR_Code[counter]=0;
		counter++;
		if(counter>(MAX_BIT-1)){
			// Your control logic here
			u8_header=0;
		              }
		}
		TIM17->CNT=0;
		flag=0;
  }
  else
  {
   HAL_TIM_Base_Start(&htim17);
   flag=1;
   TIM17->CNT=0;
  }
/*****                       load condition             **********************/
	if(IR_Code[19] ==0 && IR_Code[18]==0 && IR_Code[17] ==0 && IR_Code[16]==1) 
	HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_11); //key 1 pressed
	if(IR_Code[19] ==0 && IR_Code[18]==0 && IR_Code[17] ==1 && IR_Code[16]==0) 
	HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_12); //key 2 pressed
/*****************************************************************************/