/************************************************************************************** Filename: ir_irframe.c Revised: Date: 2016-10-01 Revision: Revision: 1.0 Description: This file provides algorithms for IR frame build Revision log: * 2016-10-01: created by strawmanbobi **************************************************************************************/ #include "include/ir_ac_build_frame.h" #include "include/ir_decode.h" extern t_ac_protocol* context; //return bit number per byte,default value is 8 UINT8 bits_per_byte(UINT8 index) { UINT8 i = 0; UINT8 size = 0; if (context->bit_num_cnt == 0) return 8; //defaut value if (context->bit_num_cnt >= MAX_BITNUM) size = MAX_BITNUM; else size = (UINT8) context->bit_num_cnt; for (i = 0; i < size; i++) { if (context->bit_num[i].pos == index) return (UINT8) context->bit_num[i].bits; if (context->bit_num[i].pos > index) return 8; } return 8; } UINT16 add_delaycode(UINT8 index) { UINT16 i = 0; UINT16 j = 0; UINT8 size = 0; UINT8 tail_delay_code = 0; UINT16 tail_pos = 0; if (context->dc_cnt != 0) { size = (UINT8) context->dc_cnt; for (i = 0; i < size; i++) { if (context->dc[i].pos == index) { for (j = 0; j < context->dc[i].time_cnt; j++) { context->time[context->code_cnt++] = context->dc[i].time[j]; } } else if (context->dc[i].pos == -1) { tail_delay_code = 1; tail_pos = i; } } } if ((context->last_bit == 0) && (index == (ir_hex_len - 1))) { context->time[context->code_cnt++] = context->one.low; //high } if (context->dc_cnt != 0) { if ((index == (ir_hex_len - 1)) && (tail_delay_code == 1)) { for (i = 0; i < context->dc[tail_pos].time_cnt; i++) { context->time[context->code_cnt++] = context->dc[tail_pos].time[i]; } } } return context->dc[i].time_cnt; } UINT16 create_ir_frame() { UINT16 i = 0, j = 0; UINT8 bit_num = 0; UINT8 *ir_data = ir_hex_code; UINT8 mask = 0; UINT16 frame_length = 0; context->code_cnt = 0; // boot code for (i = 0; i < context->boot_code.len; i++) { context->time[context->code_cnt++] = context->boot_code.data[i]; } for (i = 0; i < ir_hex_len; i++) { bit_num = bits_per_byte((UINT8) i); for (j = 0; j < bit_num; j++) { if (context->endian == 0) mask = (UINT8) ((1 << (bit_num - 1)) >> j); else mask = (UINT8) (1 << j); if (ir_data[i] & mask) { context->time[context->code_cnt++] = context->one.low; context->time[context->code_cnt++] = context->one.high; } else { context->time[context->code_cnt++] = context->zero.low; context->time[context->code_cnt++] = context->zero.high; } } add_delaycode((UINT8) i); } frame_length = context->code_cnt; for (i = 0; i < (context->repeat_times - 1); i++) { for (j = 0; j < frame_length; j++) { context->time[context->code_cnt++] = context->time[j]; } } return context->code_cnt; }