Files
iris-kit/lib/IRext/ir_ac_binary_parse.c
2024-03-22 09:18:57 +08:00

143 lines
3.2 KiB
C

/**************************************************************************************
Filename: ir_ac_binary_parse.c
Revised: Date: 2017-01-03
Revision: Revision: 1.0
Description: This file provides methods for AC binary parse
Revision log:
* 2017-01-03: created by strawmanbobi
**************************************************************************************/
#include "include/ir_ac_binary_parse.h"
#include "include/ir_decode.h"
#define BOARD_ESP8266
UINT16 tag_head_offset = 0;
extern struct ir_bin_buffer *p_ir_buffer;
#if defined USE_DYNAMIC_TAG
extern struct tag_head* tags;
#else
extern struct tag_head tags[];
#endif
UINT8 tag_count = 0;
const UINT16 tag_index[TAG_COUNT_FOR_PROTOCOL] =
{
1, 2, 3, 4, 5, 6, 7,
21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
41, 42, 43, 44, 45, 46, 47, 48
};
INT8 binary_parse_offset()
{
int i = 0;
#if defined BOARD_ESP8266
UINT8 *phead = (UINT8 *)&p_ir_buffer->data[1];
#else
UINT16 *phead = (UINT16 *)&p_ir_buffer->data[1];
#endif // BOARD_ESP8266
tag_count = p_ir_buffer->data[0];
if (TAG_COUNT_FOR_PROTOCOL != tag_count)
{
return IR_DECODE_FAILED;
}
tag_head_offset = (UINT16) ((tag_count << (UINT16) 1) + 1);
#if defined USE_DYNAMIC_TAG
tags = (t_tag_head *) ir_malloc(tag_count * sizeof(t_tag_head));
if (NULL == tags)
{
return IR_DECODE_FAILED;
}
#endif
for (i = 0; i < tag_count; i++)
{
tags[i].tag = tag_index[i];
#if defined BOARD_STM8 && defined COMPILER_IAR
UINT16 offset = *(phead + i);
tags[i].offset = (offset >> 8) | (offset << 8);
#elif defined BOARD_ESP8266
UINT16 tmp_a = *(phead + i * 2);
UINT16 tmp_b = *(phead + i * 2 + 1);
tags[i].offset = tmp_b << 8 | tmp_a;
#else
tags[i].offset = *(phead + i);
#endif
if (tags[i].offset == TAG_INVALID)
{
tags[i].len = 0;
}
}
return IR_DECODE_SUCCEEDED;
}
INT8 binary_parse_len()
{
UINT16 i = 0, j = 0;
for (i = 0; i < (tag_count - 1); i++)
{
if (tags[i].offset == TAG_INVALID)
{
continue;
}
for (j = (UINT16) (i + 1); j < tag_count; j++)
{
if (tags[j].offset != TAG_INVALID)
{
break;
}
}
if (j < tag_count)
{
tags[i].len = tags[j].offset - tags[i].offset;
}
else
{
tags[i].len = p_ir_buffer->len - tags[i].offset - tag_head_offset;
return IR_DECODE_SUCCEEDED;
}
}
if (tags[tag_count - 1].offset != TAG_INVALID)
{
tags[tag_count - 1].len = p_ir_buffer->len - tag_head_offset - tags[tag_count - 1].offset;
}
return IR_DECODE_SUCCEEDED;
}
void binary_tags_info()
{
#if defined BOARD_PC && defined DEBUG
UINT16 i = 0;
for (i = 0; i < tag_count; i++)
{
if (tags[i].len == 0)
{
continue;
}
ir_printf("tag(%d).len = %d\n", tags[i].tag, tags[i].len);
}
#endif
}
INT8 binary_parse_data()
{
UINT16 i = 0;
for (i = 0; i < tag_count; i++)
{
tags[i].p_data = p_ir_buffer->data + tags[i].offset + tag_head_offset;
}
return IR_DECODE_SUCCEEDED;
}