Files
iris-kit/lib/IRext/ir_ac_build_frame.c
2024-02-11 12:42:50 +08:00

142 lines
3.5 KiB
C

/**************************************************************************************
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;
}