re-correct win32 example according to latest algorithm changes

This commit is contained in:
strawmanbobi
2018-10-02 20:00:34 +08:00
parent dd2eac8c02
commit d14b7c5060
10 changed files with 960 additions and 751 deletions

View File

@@ -290,4 +290,7 @@ __pycache__/
*.odx.cs
*.xsd.cs
win32-example/DecodeTestWin/DecodeTestWin.vcxproj
win32-example/DecodeTestWin/DecodeTestWin.vcxproj.filters
# End of https://www.gitignore.io/api/visualstudio

View File

@@ -1,6 +1,6 @@
#include "stdafx.h"
#include "DecodeTestWin.h"
#include "irda_decode.h"
#include "ir_decode.h"
using namespace std;
@@ -15,14 +15,13 @@ UINT8 *binary_content = NULL;
CWinApp theApp;
HINSTANCE hInDecodeDll = NULL;
remote_ac_status_t ac_status;
t_remote_ac_status ac_status;
UINT16 user_data[USER_DATA_SIZE] = { 0 };
typedef INT8(*lp_irda_ac_file_open) (char* file_name);
typedef INT8(*lp_irda_ac_lib_open) (UINT8 *binary, UINT16 binary_length);
typedef INT8(*lp_irda_ac_lib_close) (void);
typedef INT8(*lp_irda_ac_lib_parse) (void);
typedef UINT16(*lp_irda_ac_lib_control) (remote_ac_status_t ac_status, UINT16 *user_data, UINT8 function_code, BOOL change_wind_direction);
typedef INT8(*lp_ir_file_open) (const UINT8 category, const UINT8 sub_category, const char* file_name);
typedef INT8(*lp_ir_binary_open) (const UINT8 category, const UINT8 sub_category, UINT8* binary, UINT16 binary_length);
typedef INT8(*lp_ir_decode) (UINT8 key_code, UINT16* user_data, t_remote_ac_status* ac_status, BOOL change_wind_direction);
typedef INT8(*lp_ir_close) (void);
typedef INT8(*lp_get_temperature_range) (UINT8 ac_mode, INT8* temp_min, INT8* temp_max);
typedef INT8(*lp_get_supported_mode) (UINT8* supported_mode);
@@ -30,18 +29,10 @@ typedef INT8(*lp_get_supported_wind_speed) (UINT8 ac_mode, UINT8* supported_wind
typedef INT8(*lp_get_supported_swing) (UINT8 ac_mode, UINT8* supported_swing);
typedef INT8(*lp_get_supported_wind_direction) (UINT8* supported_wind_direction);
typedef INT8(*lp_irda_tv_file_open) (char* file_name);
typedef INT8(*lp_irda_tv_lib_open) (UINT8 *binary, UINT16 binary_length);
typedef INT8(*lp_irda_tv_lib_parse) (UINT8 irda_hex_encode);
typedef UINT16(*lp_irda_tv_lib_control) (UINT8 key_code, UINT16* user_data);
typedef INT8(*lp_irda_tv_lib_close) (void);
lp_irda_ac_file_open IRDAACFileOpen;
lp_irda_ac_lib_open IRDAACLibOpen;
lp_irda_ac_lib_parse IRDAACLibParse;
lp_irda_ac_lib_control IRDAACLibControl;
lp_irda_ac_lib_close IRDAACLibClose;
lp_ir_file_open IRFileOpen;
lp_ir_binary_open IRBinaryOpen;
lp_ir_decode IRDecode;
lp_ir_close IRClose;
lp_get_supported_mode GetSupportedMode;
lp_get_supported_swing GetSupportedSwing;
@@ -49,13 +40,6 @@ lp_get_supported_wind_speed GetSupportedWindSpeed;
lp_get_supported_wind_direction GetSupportedWindDirection;
lp_get_temperature_range GetTemperatureRange;
lp_irda_tv_file_open IRDATVFileOpen;
lp_irda_tv_lib_open IRDATVLibOpen;
lp_irda_tv_lib_parse IRDATVLibParse;
lp_irda_tv_lib_control IRDATVLibControl;
lp_irda_tv_lib_close IRDATVLibClose;
INT8 decode_as_ac(char* file_name)
{
// keyboard input
@@ -74,27 +58,21 @@ INT8 decode_as_ac(char* file_name)
BOOL need_control = TRUE;
// init air conditioner status
ac_status.acDisplay = 0;
ac_status.acSleep = 0;
ac_status.acTimer = 0;
ac_status.acPower = AC_POWER_OFF;
ac_status.acMode = AC_MODE_COOL;
ac_status.acTemp = AC_TEMP_20;
ac_status.acWindDir = AC_SWING_ON;
ac_status.acWindSpeed = AC_WS_AUTO;
ac_status.ac_display = 0;
ac_status.ac_sleep = 0;
ac_status.ac_timer = 0;
ac_status.ac_power = AC_POWER_OFF;
ac_status.ac_mode = AC_MODE_COOL;
ac_status.ac_temp = AC_TEMP_20;
ac_status.ac_wind_dir = AC_SWING_ON;
ac_status.ac_wind_speed = AC_WS_AUTO;
if (IR_DECODE_FAILED == IRDAACFileOpen(file_name))
if (IR_DECODE_FAILED == IRFileOpen(0, 0, file_name))
{
IRDAACLibClose();
IRClose();
return IR_DECODE_FAILED;
}
if (IR_DECODE_FAILED == IRDAACLibParse())
{
IR_PRINTF("ac lib parse failed\n");
IRDAACLibClose();
return IR_DECODE_FAILED;
}
do
{
in_char = getchar();
@@ -105,73 +83,73 @@ INT8 decode_as_ac(char* file_name)
case 'w':
case 'W':
// temperature plus
ac_status.acTemp = (ac_status.acTemp == AC_TEMP_30) ? AC_TEMP_30 : (ac_status.acTemp + 1);
ac_status.ac_temp = (t_ac_temperature)((ac_status.ac_temp == AC_TEMP_30) ? AC_TEMP_30 : (ac_status.ac_temp + 1));
function_code = AC_FUNCTION_TEMPERATURE_UP;
break;
case 's':
case 'S':
ac_status.acTemp = (ac_status.acTemp == AC_TEMP_16) ? AC_TEMP_16 : (ac_status.acTemp - 1);
ac_status.ac_temp = (t_ac_temperature)((ac_status.ac_temp == AC_TEMP_16) ? AC_TEMP_16 : (ac_status.ac_temp - 1));
function_code = AC_FUNCTION_TEMPERATURE_DOWN;
// temperature minus
break;
case 'a':
case 'A':
++ac_status.acWindSpeed;
ac_status.acWindSpeed = ac_status.acWindSpeed % AC_WS_MAX;
ac_status.ac_wind_speed = (t_ac_wind_speed) (ac_status.ac_wind_speed + 1);
ac_status.ac_wind_speed = (t_ac_wind_speed) (ac_status.ac_wind_speed % AC_WS_MAX);
function_code = AC_FUNCTION_WIND_SPEED;
// wind speed loop
break;
case 'd':
case 'D':
ac_status.acWindDir = (ac_status.acWindDir == 0) ? 1 : 0;
ac_status.ac_wind_dir = (t_ac_swing)((ac_status.ac_wind_dir == 0) ? 1 : 0);
function_code = AC_FUNCTION_WIND_SWING;
// wind swing loop
break;
case 'q':
case 'Q':
++ac_status.acMode;
ac_status.acMode = ac_status.acMode % AC_MODE_MAX;
ac_status.ac_mode = (t_ac_mode)(ac_status.ac_mode + 1);
ac_status.ac_mode = (t_ac_mode) (ac_status.ac_mode % AC_MODE_MAX);
function_code = AC_FUNCTION_MODE;
break;
case '1':
// turn on
ac_status.acPower = AC_POWER_ON;
ac_status.ac_power = AC_POWER_ON;
function_code = AC_FUNCTION_POWER;
break;
case '2':
// turn off
ac_status.acPower = AC_POWER_OFF;
ac_status.ac_power = AC_POWER_OFF;
// FUNCTION MAX refers to power off
// function_code = AC_FUNCTION_POWER;
break;
case '3':
if (IR_DECODE_SUCCEEDED == GetSupportedMode(&supported_mode))
{
IR_PRINTF("supported mode = %02X\n", supported_mode);
ir_printf("supported mode = %02X\n", supported_mode);
}
need_control = FALSE;
break;
case '4':
if (IR_DECODE_SUCCEEDED == GetSupportedSwing(ac_status.acMode, &supported_swing))
if (IR_DECODE_SUCCEEDED == GetSupportedSwing(ac_status.ac_mode, &supported_swing))
{
IR_PRINTF("supported swing in %d = %02X\n", ac_status.acMode, supported_swing);
ir_printf("supported swing in %d = %02X\n", ac_status.ac_mode, supported_swing);
}
need_control = FALSE;
break;
case '5':
if (IR_DECODE_SUCCEEDED == GetSupportedWindSpeed(ac_status.acMode, &supported_speed))
if (IR_DECODE_SUCCEEDED == GetSupportedWindSpeed(ac_status.ac_mode, &supported_speed))
{
IR_PRINTF("supported wind speed in %d = %02X\n", ac_status.acMode, supported_speed);
ir_printf("supported wind speed in %d = %02X\n", ac_status.ac_mode, supported_speed);
}
need_control = FALSE;
break;
case '6':
if (IR_DECODE_SUCCEEDED == GetTemperatureRange(ac_status.acMode, &min_temperature, &max_temperature))
if (IR_DECODE_SUCCEEDED == GetTemperatureRange(ac_status.ac_mode, &min_temperature, &max_temperature))
{
IR_PRINTF("supported temperature range in mode %d = %d, %d\n",
ac_status.acMode, min_temperature, max_temperature);
ir_printf("supported temperature range in mode %d = %d, %d\n",
ac_status.ac_mode, min_temperature, max_temperature);
}
need_control = FALSE;
break;
@@ -183,21 +161,21 @@ INT8 decode_as_ac(char* file_name)
if (TRUE == op_match && TRUE == need_control)
{
IR_PRINTF("switch AC to power = %d, mode = %d, temp = %d, speed = %d, swing = %d\n",
ac_status.acPower,
ac_status.acMode,
ac_status.acTemp,
ac_status.acWindSpeed,
ac_status.acWindDir
ir_printf("switch AC to power = %d, mode = %d, temp = %d, speed = %d, swing = %d\n",
ac_status.ac_power,
ac_status.ac_mode,
ac_status.ac_temp,
ac_status.ac_wind_speed,
ac_status.ac_wind_dir
);
IRDAACLibControl(ac_status, user_data, function_code, TRUE);
IRDecode(function_code, user_data, &ac_status, TRUE);
}
} while ('0' != in_char);
IRDAACLibClose();
IRClose();
// free binary buffer
irda_free(binary_content);
ir_free(binary_content);
binary_length = 0;
return IR_DECODE_SUCCEEDED;
@@ -210,31 +188,27 @@ INT8 decode_as_tv(char *file_name, UINT8 irda_hex_encode)
int key_code = -1;
int count = 0;
if (IR_DECODE_FAILED == IRDATVFileOpen(file_name))
if (IR_DECODE_FAILED == IRFileOpen(1, 1, file_name))
{
return IR_DECODE_FAILED;
}
if (IR_DECODE_FAILED == IRDATVLibParse(irda_hex_encode))
{
return IR_DECODE_FAILED;
}
do
{
in_char = getchar();
if (in_char >= '0' && in_char <= '9')
{
key_code = in_char - '0';
IRDATVLibControl(key_code, user_data);
IRDecode(key_code, user_data, NULL, FALSE);
}
else if (in_char >= 'a' && in_char <= 'f')
{
key_code = 10 + (in_char - 'a');
IRDATVLibControl(key_code, user_data);
IRDecode(key_code, user_data, NULL, FALSE);
}
else if (in_char == 'q')
{
IRDATVLibClose();
IRClose();
}
else
{
@@ -243,7 +217,7 @@ INT8 decode_as_tv(char *file_name, UINT8 irda_hex_encode)
} while ('Q' != in_char);
// free binary buffer
irda_free(binary_content);
ir_free(binary_content);
binary_length = 0;
return IR_DECODE_SUCCEEDED;
@@ -267,12 +241,11 @@ int main(int argc, char *argv[])
hInDecodeDll = LoadLibrary(_T("ir_decoder.dll"));
if (NULL != hInDecodeDll)
{
IR_PRINTF("load library successfully\n");
IRDAACFileOpen = (lp_irda_ac_file_open)GetProcAddress(hInDecodeDll, "irda_ac_file_open");
IRDAACLibOpen = (lp_irda_ac_lib_open)GetProcAddress(hInDecodeDll, "irda_ac_lib_open");
IRDAACLibParse = (lp_irda_ac_lib_parse)GetProcAddress(hInDecodeDll, "irda_ac_lib_parse");
IRDAACLibControl = (lp_irda_ac_lib_control)GetProcAddress(hInDecodeDll, "irda_ac_lib_control");
IRDAACLibClose = (lp_irda_ac_lib_close)GetProcAddress(hInDecodeDll, "irda_ac_lib_close");
ir_printf("load library successfully\n");
IRFileOpen = (lp_ir_file_open)GetProcAddress(hInDecodeDll, "ir_file_open");
IRBinaryOpen = (lp_ir_binary_open)GetProcAddress(hInDecodeDll, "ir_binary_open");
IRDecode = (lp_ir_decode)GetProcAddress(hInDecodeDll, "ir_decode");
IRClose = (lp_ir_close)GetProcAddress(hInDecodeDll, "ir_close");
GetSupportedMode = (lp_get_supported_mode)GetProcAddress(hInDecodeDll, "get_supported_mode");
GetSupportedSwing = (lp_get_supported_swing)GetProcAddress(hInDecodeDll, "get_supported_swing");
@@ -280,39 +253,33 @@ int main(int argc, char *argv[])
GetSupportedWindDirection = (lp_get_supported_wind_direction)GetProcAddress(hInDecodeDll, "get_supported_wind_direction");
GetTemperatureRange = (lp_get_temperature_range)GetProcAddress(hInDecodeDll, "get_temperature_range");
IRDATVFileOpen = (lp_irda_tv_file_open)GetProcAddress(hInDecodeDll, "irda_tv_file_open");
IRDATVLibOpen = (lp_irda_tv_lib_open)GetProcAddress(hInDecodeDll, "irda_tv_lib_open");
IRDATVLibParse = (lp_irda_tv_lib_parse)GetProcAddress(hInDecodeDll, "irda_tv_lib_parse");
IRDATVLibControl = (lp_irda_tv_lib_control)GetProcAddress(hInDecodeDll, "irda_tv_lib_control");
IRDATVLibClose = (lp_irda_tv_lib_close)GetProcAddress(hInDecodeDll, "irda_tv_lib_close");
char function = '0';
UINT8 irda_hex_encode = 0;
if (4 != argc)
{
IR_PRINTF("number of args error !\n");
ir_printf("number of args error !\n");
return -1;
}
function = argv[1][0];
irda_hex_encode = (UINT8)(argv[3][0] - '0');
IR_PRINTF("decode functionality = %c\n", function);
ir_printf("decode functionality = %c\n", function);
switch (function)
{
case '0':
IR_PRINTF("decode binary file as AC\n");
ir_printf("decode binary file as AC\n");
decode_as_ac(argv[2]);
break;
case '1':
IR_PRINTF("decode binary file as TV : %d\n", irda_hex_encode);
ir_printf("decode binary file as TV : %d\n", irda_hex_encode);
decode_as_tv(argv[2], irda_hex_encode);
break;
default:
IR_PRINTF("decode functionality error !\n");
ir_printf("decode functionality error !\n");
break;
}
@@ -320,7 +287,7 @@ int main(int argc, char *argv[])
}
else
{
IR_PRINTF("load library failed\n");
ir_printf("load library failed\n");
}
}
}

View File

@@ -35,7 +35,7 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v140</PlatformToolset>
<PlatformToolset>v141_xp</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
<UseOfMfc>Dynamic</UseOfMfc>
@@ -118,7 +118,7 @@
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;BOARD_PC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>true</SDLCheck>
</ClCompile>
<Link>
@@ -149,9 +149,11 @@
<Text Include="ReadMe.txt" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="C:\Users\straw\Desktop\irda_defs.h" />
<ClInclude Include="DecodeTestWin.h" />
<ClInclude Include="irda_decode.h" />
<ClInclude Include="ir_ac_control.h" />
<ClInclude Include="ir_decode.h" />
<ClInclude Include="ir_defs.h" />
<ClInclude Include="ir_tv_control.h" />
<ClInclude Include="Resource.h" />
<ClInclude Include="stdafx.h" />
<ClInclude Include="targetver.h" />

View File

@@ -30,10 +30,16 @@
<ClInclude Include="DecodeTestWin.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="irda_decode.h">
<ClInclude Include="ir_decode.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="C:\Users\straw\Desktop\irda_defs.h">
<ClInclude Include="ir_defs.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="ir_ac_control.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="ir_tv_control.h">
<Filter>头文件</Filter>
</ClInclude>
</ItemGroup>

View File

@@ -0,0 +1,439 @@
/**************************************************************************************
Filename: ir_ac_control.h
Revised: Date: 2016-12-31
Revision: Revision: 1.0
Description: This file provides methods for AC IR control
Revision log:
* 2016-10-12: created by strawmanbobi
**************************************************************************************/
#ifndef IRDA_DECODER_IR_AC_CONTROL_H
#define IRDA_DECODER_IR_AC_CONTROL_H
#ifdef __cplusplus
extern "C"
{
#endif
#include "ir_defs.h"
#define TAG_COUNT_FOR_PROTOCOL 29
#define TAG_INVALID 0xffff
#define MAX_DELAYCODE_NUM 16
#define MAX_BITNUM 16
#define AC_PARAMETER_TYPE_1 0
#define AC_PARAMETER_TYPE_2 1
typedef enum
{
AC_POWER_ON = 0,
AC_POWER_OFF,
AC_POWER_MAX
} t_ac_power;
typedef enum
{
AC_TEMP_16 = 0,
AC_TEMP_17,
AC_TEMP_18,
AC_TEMP_19,
AC_TEMP_20,
AC_TEMP_21,
AC_TEMP_22,
AC_TEMP_23,
AC_TEMP_24,
AC_TEMP_25,
AC_TEMP_26,
AC_TEMP_27,
AC_TEMP_28,
AC_TEMP_29,
AC_TEMP_30,
AC_TEMP_MAX
} t_ac_temperature;
typedef enum
{
AC_MODE_COOL = 0,
AC_MODE_HEAT,
AC_MODE_AUTO,
AC_MODE_FAN,
AC_MODE_DRY,
AC_MODE_MAX
} t_ac_mode;
typedef enum
{
AC_FUNCTION_POWER = 1,
AC_FUNCTION_MODE,
AC_FUNCTION_TEMPERATURE_UP,
AC_FUNCTION_TEMPERATURE_DOWN,
AC_FUNCTION_WIND_SPEED,
AC_FUNCTION_WIND_SWING,
AC_FUNCTION_WIND_FIX,
AC_FUNCTION_MAX,
} t_ac_function;
typedef enum
{
AC_WS_AUTO = 0,
AC_WS_LOW,
AC_WS_MEDIUM,
AC_WS_HIGH,
AC_WS_MAX
} t_ac_wind_speed;
typedef enum
{
AC_SWING_ON = 0,
AC_SWING_OFF,
AC_SWING_MAX
} t_ac_swing;
typedef enum
{
SWING_TYPE_SWING_ONLY = 0,
SWING_TYPE_NORMAL,
SWING_TYPE_NOT_SPECIFIED,
SWING_TYPE_MAX
} swing_type;
typedef enum
{
TEMP_TYPE_DYNAMIC = 0,
TEMP_TYPE_STATIC,
TEMP_TYPE_MAX,
} t_temp_type;
// enumeration for application polymorphism
typedef enum
{
AC_APPLY_POWER = 0,
AC_APPLY_MODE,
AC_APPLY_TEMPERATURE_UP,
AC_APPLY_TEMPERATURE_DOWN,
AC_APPLY_WIND_SPEED,
AC_APPLY_WIND_SWING,
AC_APPLY_WIND_FIX,
AC_APPLY_MAX
} t_ac_apply;
typedef struct _ac_hex
{
UINT8 len;
UINT8 *data;
} t_ac_hex;
typedef struct _ac_level
{
UINT16 low;
UINT16 high;
} t_ac_level;
typedef struct _ac_bootcode
{
UINT16 len;
UINT16 data[16];
} t_ac_bootcode;
typedef struct _ac_delaycode
{
INT16 pos;
UINT16 time[8];
UINT16 time_cnt;
} t_ac_delaycode;
/*
* the array of tag_100X application data
* seg_len : length for each segment
* byte_pos : the position of update byte
* byte_value : the value to be updated to position
*/
typedef struct _tag_comp_type_1
{
UINT8 seg_len;
UINT8 *segment;
} t_tag_comp;
typedef struct _tag_swing_info
{
swing_type type;
UINT8 mode_count;
UINT8 dir_index;
} t_swing_info;
typedef struct _tag_power_1
{
UINT8 len;
t_tag_comp comp_data[AC_POWER_MAX];
} t_power_1;
typedef struct _tag_temp_1
{
UINT8 len;
UINT8 type;
t_tag_comp comp_data[AC_TEMP_MAX];
} t_temp_1;
typedef struct tag_mode_1
{
UINT8 len;
t_tag_comp comp_data[AC_MODE_MAX];
} t_mode_1;
typedef struct tag_speed_1
{
UINT8 len;
t_tag_comp comp_data[AC_WS_MAX];
} t_speed_1;
typedef struct tag_swing_1
{
UINT8 len;
UINT16 count;
t_tag_comp *comp_data;
} t_swing_1;
typedef struct tag_temp_2
{
UINT8 len;
UINT8 type;
t_tag_comp comp_data[AC_TEMP_MAX];
} t_temp_2;
typedef struct tag_mode_2
{
UINT8 len;
t_tag_comp comp_data[AC_MODE_MAX];
} t_mode_2;
typedef struct tag_speed_2
{
UINT8 len;
t_tag_comp comp_data[AC_WS_MAX];
} t_speed_2;
typedef struct tag_swing_2
{
UINT8 len;
UINT16 count;
t_tag_comp *comp_data;
} t_swing_2;
#if defined SUPPORT_HORIZONTAL_SWING
typedef struct tag_horiswing_1
{
UINT16 len;
t_tag_comp comp_data[AC_HORI_SWING_MAX];
} hori_swing_1;
#endif
typedef struct _tag_checksum_data
{
UINT8 len;
UINT8 type;
UINT8 start_byte_pos;
UINT8 end_byte_pos;
UINT8 checksum_byte_pos;
UINT8 checksum_plus;
UINT8 *spec_pos;
} t_tag_checksum_data;
typedef struct tag_checksum
{
UINT8 len;
UINT16 count;
t_tag_checksum_data *checksum_data;
} t_checksum;
typedef struct tag_function_1
{
UINT8 len;
t_tag_comp comp_data[AC_FUNCTION_MAX - 1];
} t_function_1;
typedef struct tag_function_2
{
UINT8 len;
t_tag_comp comp_data[AC_FUNCTION_MAX - 1];
} t_function_2;
typedef struct tag_solo_code
{
UINT8 len;
UINT8 solo_func_count;
UINT8 solo_function_codes[AC_FUNCTION_MAX - 1];
} t_solo_code;
typedef struct _ac_bitnum
{
INT16 pos;
UINT16 bits;
} t_ac_bit_num;
typedef enum
{
N_COOL = 0,
N_HEAT,
N_AUTO,
N_FAN,
N_DRY,
N_MODE_MAX,
} t_ac_n_mode;
typedef enum
{
CHECKSUM_TYPE_BYTE = 1,
CHECKSUM_TYPE_BYTE_INVERSE,
CHECKSUM_TYPE_HALF_BYTE,
CHECKSUM_TYPE_HALF_BYTE_INVERSE,
CHECKSUM_TYPE_SPEC_HALF_BYTE,
CHECKSUM_TYPE_SPEC_HALF_BYTE_INVERSE,
CHECKSUM_TYPE_SPEC_HALF_BYTE_ONE_BYTE,
CHECKSUM_TYPE_SPEC_HALF_BYTE_INVERSE_ONE_BYTE,
CHECKSUM_TYPE_MAX,
} t_checksum_type;
typedef struct _ac_n_mode_info
{
UINT8 enable;
UINT8 all_speed;
UINT8 all_temp;
UINT8 temp[AC_TEMP_MAX];
UINT8 temp_cnt;
UINT8 speed[AC_WS_MAX];
UINT8 speed_cnt;
} t_ac_n_mode_info;
typedef struct ac_protocol
{
UINT8 endian;
// t_ac_hex default_code;
t_ac_hex default_code;
t_ac_level zero;
t_ac_level one;
t_ac_bootcode boot_code;
t_ac_delaycode dc[MAX_DELAYCODE_NUM];
t_power_1 power1;
t_temp_1 temp1;
t_mode_1 mode1;
t_speed_1 speed1;
t_swing_1 swing1;
t_checksum checksum;
t_function_1 function1;
t_function_2 function2;
t_temp_2 temp2;
t_mode_2 mode2;
t_speed_2 speed2;
t_swing_2 swing2;
t_swing_info si;
t_solo_code sc;
UINT8 swing_status;
BOOL change_wind_direction;
UINT16 dc_cnt;
t_ac_bit_num bit_num[MAX_BITNUM];
UINT16 bit_num_cnt;
UINT16 repeat_times;
t_ac_n_mode_info n_mode[N_MODE_MAX];
UINT16 code_cnt;
UINT8 last_bit;
UINT16 *time;
UINT8 solo_function_mark;
UINT16 frame_length;
} t_ac_protocol;
typedef struct tag_head
{
UINT16 tag;
UINT16 len;
UINT16 offset;
UINT8 *p_data;
} t_tag_head;
struct ir_bin_buffer
{
UINT8 *data;
UINT16 len;
UINT16 offset;
};
typedef struct REMOTE_AC_STATUS
{
t_ac_power ac_power;
t_ac_temperature ac_temp;
t_ac_mode ac_mode;
t_ac_swing ac_wind_dir;
t_ac_wind_speed ac_wind_speed;
UINT8 ac_display;
UINT8 ac_sleep;
UINT8 ac_timer;
} t_remote_ac_status;
// function polymorphism
typedef INT8 (*lp_apply_ac_parameter)(t_remote_ac_status ac_status, UINT8 function_code);
#define TAG_AC_BOOT_CODE 1
#define TAG_AC_ZERO 2
#define TAG_AC_ONE 3
#define TAG_AC_DELAY_CODE 4
#define TAG_AC_FRAME_LENGTH 5
#define TAG_AC_ENDIAN 6
#define TAG_AC_LAST_BIT 7
#define TAG_AC_POWER_1 21
#define TAG_AC_DEFAULT_CODE 22
#define TAG_AC_TEMP_1 23
#define TAG_AC_MODE_1 24
#define TAG_AC_SPEED_1 25
#define TAG_AC_SWING_1 26
#define TAG_AC_CHECKSUM_TYPE 27
#define TAG_AC_SOLO_FUNCTION 28
#define TAG_AC_FUNCTION_1 29
#define TAG_AC_TEMP_2 30
#define TAG_AC_MODE_2 31
#define TAG_AC_SPEED_2 32
#define TAG_AC_SWING_2 33
#define TAG_AC_FUNCTION_2 34
#define TAG_AC_BAN_FUNCTION_IN_COOL_MODE 41
#define TAG_AC_BAN_FUNCTION_IN_HEAT_MODE 42
#define TAG_AC_BAN_FUNCTION_IN_AUTO_MODE 43
#define TAG_AC_BAN_FUNCTION_IN_FAN_MODE 44
#define TAG_AC_BAN_FUNCTION_IN_DRY_MODE 45
#define TAG_AC_SWING_INFO 46
#define TAG_AC_REPEAT_TIMES 47
#define TAG_AC_BIT_NUM 48
// definition about size
#define PROTOCOL_SIZE (sizeof(t_ac_protocol))
/* exported variables */
extern UINT8 *ir_hex_code;
extern UINT8 ir_hex_len;
extern t_ac_protocol *context;
extern INT8 ir_ac_lib_parse();
extern INT8 free_ac_context();
extern BOOL is_solo_function(UINT8 function_code);
#ifdef __cplusplus
}
#endif
#endif //IRDA_DECODER_IR_AC_CONTROL_H

View File

@@ -0,0 +1,160 @@
/**************************************************************************************
Filename: ir_decode.h
Revised: Date: 2016-10-01
Revision: Revision: 1.0
Description: This file provides algorithms for IR decode
Revision log:
* 2016-10-01: created by strawmanbobi
**************************************************************************************/
#ifndef _IRDA_DECODE_H_
#define _IRDA_DECODE_H_
#ifdef __cplusplus
extern "C"
{
#endif
#include <stdio.h>
#include "ir_defs.h"
#include "ir_ac_control.h"
#include "ir_tv_control.h"
#define IR_DECODE_FAILED (-1)
#define IR_DECODE_SUCCEEDED (0)
#define IR_CATEGORY_AC 1
#define IR_CATEGORY_TV 2
#define IR_TYPE_STATUS 0
#define IR_TYPE_COMMANDS 1
#define SUB_CATEGORY_QUATERNARY 0
#define SUB_CATEGORY_HEXADECIMAL 1
// exported functions
/**
* function ir_file_open
*
* description: open IR binary code from file
*
* parameters: category (in) - category ID get from indexing API
* sub_category (in) - subcategory ID get from indexing API
* file_name (in) - file name of IR binary
*
* returns: IR_DECODE_SUCCEEDED / IR_DECODE_FAILED
*
*/
extern INT8 ir_file_open(const UINT8 category, const UINT8 sub_category, const char* file_name);
/**
* function ir_binary_open
*
* description: open IR binary code from buffer
*
* parameters: category (in) - category ID get from indexing API
* sub_category (in) - subcategory ID get from indexing API
* binary (in) - pointer to binary buffer
* binary_length (in) - binary buffer size
*
* returns: IR_DECODE_SUCCEEDED / IR_DECODE_FAILED
*/
extern INT8 ir_binary_open(const UINT8 category, const UINT8 sub_category, UINT8* binary, UINT16 binary_length);
/**
* function ir_decode
*
* description: decode IR binary into INT16 array which indicates the IR levels
*
* parameters: key_code (in) - the code of pressed key
* user_data (out) - output decoded data in INT16 array format
* ac_status(in) - pointer to AC status (optional)
* change_wind_direction (in) - if control changes wind direction for AC (for AC only)
*
* returns: length of decoded data (0 indicates decode failure)
*/
extern UINT16 ir_decode(UINT8 key_code, UINT16* user_data, t_remote_ac_status* ac_status, BOOL change_wind_direction);
/**
* function ir_close
*
* description: close IR binary code
*
* parameters: N/A
*
* returns: IR_DECODE_SUCCEEDED / IR_DECODE_FAILED
*/
extern INT8 ir_close();
/**
* function get_temperature_range
*
* description: get the supported temperature range [min, max] for the opened AC IR binary
*
* parameters: ac_mode (in) specify in which AC mode the application need to get temperature info
* temp_min (out) the min temperature supported in a specified AC mode
* temp_max (out) the max temperature supported in a specified AC mode
*
* returns: IR_DECODE_SUCCEEDED / IR_DECODE_FAILED
*/
extern INT8 get_temperature_range(UINT8 ac_mode, INT8 *temp_min, INT8 *temp_max);
/**
* function get_supported_mode
*
* description: get supported mode for the opened AC IR binary
*
* parameters: supported_mode (out) mode supported by the remote in lower 5 bits
*
* returns: IR_DECODE_SUCCEEDED / IR_DECODE_FAILED
*/
extern INT8 get_supported_mode(UINT8 *supported_mode);
/**
* function get_supported_wind_speed
*
* description: get supported wind speed levels for the opened AC IR binary in certain mode
*
* parameters: ac_mode (in) specify in which AC mode the application need to get wind speed info
* supported_wind_speed (out) wind speed supported by the remote in lower 4 bits
*
* returns: IR_DECODE_SUCCEEDED / IR_DECODE_FAILED
*/
extern INT8 get_supported_wind_speed(UINT8 ac_mode, UINT8 *supported_wind_speed);
/**
* function get_supported_swing
*
* description: get supported swing functions for the opened AC IR binary in certain mode
*
* parameters: ac_mode (in) specify in which AC mode the application need to get swing info
* supported_swing (out) swing supported by the remote in lower 2 bits
*
* returns: IR_DECODE_SUCCEEDED / IR_DECODE_FAILED
*/
extern INT8 get_supported_swing(UINT8 ac_mode, UINT8 *supported_swing);
/**
* function get_supported_wind_direction
*
* description: get supported wind directions for the opened AC IR binary in certain mode
*
* parameters: supported_wind_direction (out) swing supported by the remote in lower 2 bits
*
* returns: IR_DECODE_SUCCEEDED / IR_DECODE_FAILED
*/
extern INT8 get_supported_wind_direction(UINT8 *supported_wind_direction);
// private extern function
#if (defined BOARD_PC || defined BOARD_PC_DLL)
extern void ir_lib_free_inner_buffer();
#endif
#ifdef __cplusplus
}
#endif
#endif // _IRDA_DECODE_H_

View File

@@ -0,0 +1,67 @@
/**************************************************************************************
Filename: ir_defs.h
Revised: Date: 2016-10-26
Revision: Revision: 1.0
Description: This file provides algorithms for IR decode
Revision log:
* 2016-10-01: created by strawmanbobi
**************************************************************************************/
#ifndef PARSE_IR_DEFS_H
#define PARSE_IR_DEFS_H
#ifdef __cplusplus
extern "C"
{
#endif
#if defined BOARD_ANDROID
#include <android/log.h>
#define LOG_TAG "ir_decode"
#endif
#if defined BOARD_CC26XX
#include "OSAL.h"
#endif
#define TRUE 1
#define FALSE 0
#define FORMAT_HEX 16
#define FORMAT_DECIMAL 10
typedef unsigned char UINT8;
typedef signed char INT8;
typedef unsigned short UINT16;
typedef signed short INT16;
typedef signed int INT;
typedef unsigned int UINT;
typedef int BOOL;
void noprint(const char *fmt, ...);
#if defined BOARD_CC26XX
#define ir_malloc(A) ICall_malloc(A)
#define ir_free(A) ICall_free(A)
#else
#define ir_malloc(A) malloc(A)
#define ir_free(A) free(A)
#endif
#define ir_memcpy(A, B, C) memcpy(A, B, C)
#define ir_memset(A, B, C) memset(A, B, C)
#define ir_strlen(A) strlen(A)
#if (defined BOARD_PC) && (!defined BOARD_PC_JNI)
#define ir_printf printf
#else
#define ir_printf noprint
#endif
#define USER_DATA_SIZE 1636
#ifdef __cplusplus
}
#endif
#endif //PARSE_IR_DEFS_H

View File

@@ -0,0 +1,215 @@
/**************************************************************************************
Filename: ir_lib.h
Revised: Date: 2016-02-23
Revision: Revision: 1.0
Description: This file provides algorithms for IR decode (compressed command type)
Revision log:
* 2016-10-21: created by strawmanbobi
**************************************************************************************/
#ifndef _IRDA_LIB_H_
#define _IRDA_LIB_H_
#ifdef __cplusplus
extern "C"
{
#endif
#include "ir_defs.h"
#define STB_CHANNEL_OFFSET 14
#define IRDA_FLAG_NORMAL 0
#define IRDA_FLAG_INVERSE 1
#define IRDA_LEVEL_LOW 0
#define IRDA_LEVEL_HIGH 1
#define IRDA_LSB 0
#define IRDA_MSB 1
enum
{
IRDA_DECODE_1_BIT = 0,
IRDA_DECODE_2_BITS,
IRDA_DECODE_4_BITS,
};
/*
* global type definitions
*/
typedef enum ir_flags
{
IRDA_BOOT = 0,
IRDA_STOP,
IRDA_SEP,
IRDA_ONE,
IRDA_ZERO,
IRDA_FLIP,
IRDA_TWO,
IRDA_THREE = 7,
IRDA_FOUR,
IRDA_FIVE,
IRDA_SIX,
IRDA_SEVEN,
IRDA_EIGHT,
IRDA_NINE,
IRDA_A,
IRDA_B,
IRDA_C,
IRDA_D,
IRDA_E,
IRDA_F,
IRDA_MAX = 20,
} t_ir_flags;
typedef struct ir_data
{
UINT8 bits;
UINT8 lsb;
UINT8 mode;
UINT8 index;
} t_ir_data;
#if !defined BOARD_51 && !defined BOARD_STM8
#pragma pack(1)
#endif
typedef struct ir_cycles
{
UINT8 flag;
UINT16 mask;
UINT16 space;
} t_ir_cycles;
#if !defined BOARD_51 && !defined BOARD_STM8
#pragma pack()
#endif
typedef enum tv_key_value
{
TV_POWER = 0,
TV_MUTE,
TV_UP,
TV_DOWN,
TV_LEFT,
TV_RIGHT,
TV_OK,
TV_VOL_UP,
TV_VOL_DOWN,
TV_BACK,
TV_INPUT,
TV_MENU,
TV_HOME,
TV_SET,
TV_0,
TV_1,
TV_2,
TV_3,
TV_4,
TV_5,
TV_6,
TV_7,
TV_8,
TV_9,
TV_KEY_MAX,
} t_tv_key_value;
typedef enum stb_key_value
{
STB_POWER = 0,
STB_MUTE,
STB_UP,
STB_DOWN,
STB_LEFT,
STB_RIGHT,
STB_OK,
STB_VOL_UP,
STB_VOL_DOWN,
STB_BACK,
STB_INPUT,
STB_MENU,
STB_PAGE_UP,
STB_PAGE_DOWN,
STB_0,
STB_1,
STB_2,
STB_3,
STB_4,
STB_5,
STB_6,
STB_7,
STB_8,
STB_9,
STB_KEY_MAX,
} t_stb_key_value;
typedef enum nw_key_value
{
NW_POWER = 0,
NW_UP,
NW_DOWN,
NW_LEFT,
NW_RIGHT,
NW_OK,
NW_VOL_UP,
NW_VOL_DOWN,
NW_BACK,
NW_MENU,
NW_HOME,
NW_0,
NW_1,
NW_2,
NW_3,
NW_4,
NW_5,
NW_6,
NW_7,
NW_8,
NW_9,
NW_KEY_MAX,
} t_nw_key_value;
typedef enum cm_key_value
{
CM_POWER = 0,
CM_UP,
CM_DOWN,
CM_LEFT,
CM_RIGHT,
CM_OK,
CM_VOL_UP,
CM_VOL_DOWN,
CM_FUNC_1,
CM_FUNC_2,
CM_FUNC_3,
CM_BACK,
CM_HOME,
CM_MENU,
CM_MODE,
CM_KEY_MAX,
} t_cm_key_value;
typedef struct ir_data_tv
{
char magic[4];
UINT8 per_keycode_bytes;
} t_ir_data_tv;
extern INT8 tv_lib_open(UINT8 *binary, UINT16 binary_length);
extern BOOL tv_lib_parse(UINT8 encode_type);
extern UINT16 tv_lib_control(UINT8 key, UINT16 *user_data);
extern UINT8 tv_lib_close();
#ifdef __cplusplus
}
#endif
#endif /* _IRDA_LIB_H_ */

View File

@@ -1,605 +0,0 @@
/**************************************************************************************************
Filename: irda_decode.h
Revised: Date: 2016-10-01
Revision: Revision: 1.0
Description: This file provides algorithms for IR decode
Revision log:
* 2016-10-01: created by strawmanbobi
**************************************************************************************************/
#ifndef _IRDA_DECODE_H_
#define _IRDA_DECODE_H_
#ifdef __cplusplus
extern "C"
{
#endif
#include <stdio.h>
#include "irda_defs.h"
#define TAG_COUNT_FOR_PROTOCOL 29
#define EXPECTED_MEM_SIZE 1024
#define TAG_INVALID 0xffff
#define MAX_DELAYCODE_NUM 16
#define MAX_BITNUM 16
#define IR_DECODE_FAILED (-1)
#define IR_DECODE_SUCCEEDED (0)
#define AC_PARAMETER_TYPE_1 0
#define AC_PARAMETER_TYPE_2 1
typedef enum
{
AC_POWER_ON = 0,
AC_POWER_OFF,
AC_POWER_MAX
} ac_power;
typedef enum
{
AC_TEMP_16 = 0,
AC_TEMP_17,
AC_TEMP_18,
AC_TEMP_19,
AC_TEMP_20,
AC_TEMP_21,
AC_TEMP_22,
AC_TEMP_23,
AC_TEMP_24,
AC_TEMP_25,
AC_TEMP_26,
AC_TEMP_27,
AC_TEMP_28,
AC_TEMP_29,
AC_TEMP_30,
AC_TEMP_MAX
} ac_temperature;
typedef enum
{
AC_MODE_COOL = 0,
AC_MODE_HEAT,
AC_MODE_AUTO,
AC_MODE_FAN,
AC_MODE_DRY,
AC_MODE_MAX
} ac_mode;
typedef enum
{
AC_FUNCTION_POWER = 1,
AC_FUNCTION_MODE,
AC_FUNCTION_TEMPERATURE_UP,
AC_FUNCTION_TEMPERATURE_DOWN,
AC_FUNCTION_WIND_SPEED,
AC_FUNCTION_WIND_SWING,
AC_FUNCTION_WIND_FIX,
AC_FUNCTION_MAX,
} ac_function;
typedef enum
{
AC_WS_AUTO = 0,
AC_WS_LOW,
AC_WS_MEDIUM,
AC_WS_HIGH,
AC_WS_MAX
} ac_wind_speed;
typedef enum
{
AC_SWING_ON = 0,
AC_SWING_OFF,
AC_SWING_MAX
} ac_swing;
typedef enum
{
SWING_TYPE_SWING_ONLY = 0,
SWING_TYPE_NORMAL,
SWING_TYPE_NOT_SPECIFIED,
SWING_TYPE_MAX
} swing_type;
typedef enum
{
TEMP_TYPE_DYNAMIC = 0,
TEMP_TYPE_STATIC,
TEMP_TYPE_MAX,
} temp_type;
// enumeration for application polymorphism
typedef enum
{
AC_APPLY_POWER = 0,
AC_APPLY_MODE,
AC_APPLY_TEMPERATURE_UP,
AC_APPLY_TEMPERATURE_DOWN,
AC_APPLY_WIND_SPEED,
AC_APPLY_WIND_SWING,
AC_APPLY_WIND_FIX,
AC_APPLY_MAX
} ac_apply;
typedef struct _ac_hex
{
UINT8 len;
UINT8 *data;
} ac_hex;
typedef struct _ac_level
{
UINT16 low;
UINT16 high;
} ac_level;
typedef struct _ac_bootcode
{
UINT16 len;
UINT16 data[16];
} ac_bootcode;
typedef struct _ac_delaycode
{
INT16 pos;
UINT16 time[8];
UINT16 time_cnt;
} ac_delaycode;
/*
* the array of tag_100X application data
* seg_len : length for each segment
* byte_pos : the position of update byte
* byte_value : the value to be updated to position
*/
typedef struct _tag_comp_type_1
{
UINT8 seg_len;
UINT8 *segment;
} tag_comp;
typedef struct _tag_swing_info
{
swing_type type;
UINT8 mode_count;
UINT8 dir_index;
} swing_info;
typedef struct _tag_power_1
{
UINT8 len;
tag_comp comp_data[AC_POWER_MAX];
} power_1;
typedef struct _tag_temp_1
{
UINT8 len;
UINT8 type;
tag_comp comp_data[AC_TEMP_MAX];
} temp_1;
typedef struct tag_mode_1
{
UINT8 len;
tag_comp comp_data[AC_MODE_MAX];
} mode_1;
typedef struct tag_speed_1
{
UINT8 len;
tag_comp comp_data[AC_WS_MAX];
} speed_1;
typedef struct tag_swing_1
{
UINT8 len;
UINT16 count;
tag_comp *comp_data;
} swing_1;
typedef struct tag_temp_2
{
UINT8 len;
UINT8 type;
tag_comp comp_data[AC_TEMP_MAX];
} temp_2;
typedef struct tag_mode_2
{
UINT8 len;
tag_comp comp_data[AC_MODE_MAX];
} mode_2;
typedef struct tag_speed_2
{
UINT8 len;
tag_comp comp_data[AC_WS_MAX];
} speed_2;
typedef struct tag_swing_2
{
UINT8 len;
UINT16 count;
tag_comp *comp_data;
} swing_2;
#if defined SUPPORT_HORIZONTAL_SWING
typedef struct tag_horiswing_1
{
UINT16 len;
tag_comp comp_data[AC_HORI_SWING_MAX];
} hori_swing_1;
#endif
typedef struct _tag_checksum_data
{
UINT8 len;
UINT8 type;
UINT8 start_byte_pos;
UINT8 end_byte_pos;
UINT8 checksum_byte_pos;
UINT8 checksum_plus;
UINT8 *spec_pos;
} tag_checksum_data;
typedef struct tag_checksum
{
UINT8 len;
UINT16 count;
tag_checksum_data *checksum_data;
} tchecksum;
typedef struct tag_function_1
{
UINT8 len;
tag_comp comp_data[AC_FUNCTION_MAX - 1];
} function_1;
typedef struct tag_function_2
{
UINT8 len;
tag_comp comp_data[AC_FUNCTION_MAX - 1];
} function_2;
typedef struct tag_solo_code
{
UINT8 len;
UINT8 solo_func_count;
UINT8 solo_function_codes[AC_FUNCTION_MAX - 1];
} solo_code;
typedef struct _ac_bitnum
{
INT16 pos;
UINT16 bits;
} ac_bitnum;
typedef enum
{
N_COOL = 0,
N_HEAT,
N_AUTO,
N_FAN,
N_DRY,
N_MODE_MAX,
} ac_n_mode;
typedef enum
{
CHECKSUM_TYPE_BYTE = 1,
CHECKSUM_TYPE_BYTE_INVERSE,
CHECKSUM_TYPE_HALF_BYTE,
CHECKSUM_TYPE_HALF_BYTE_INVERSE,
CHECKSUM_TYPE_SPEC_HALF_BYTE,
CHECKSUM_TYPE_SPEC_HALF_BYTE_INVERSE,
CHECKSUM_TYPE_SPEC_HALF_BYTE_ONE_BYTE,
CHECKSUM_TYPE_SPEC_HALF_BYTE_INVERSE_ONE_BYTE,
CHECKSUM_TYPE_MAX,
} checksum_type;
typedef struct _ac_n_mode_info
{
UINT8 enable;
UINT8 allspeed;
UINT8 alltemp;
UINT8 temp[AC_TEMP_MAX];
UINT8 temp_cnt;
UINT8 speed[AC_WS_MAX];
UINT8 speed_cnt;
} ac_n_mode_info;
typedef struct ac_protocol
{
UINT8 endian;
// ac_hex default_code;
ac_hex default_code;
ac_level zero;
ac_level one;
ac_bootcode bootcode;
ac_delaycode dc[MAX_DELAYCODE_NUM];
power_1 power1;
temp_1 temp1;
mode_1 mode1;
speed_1 speed1;
swing_1 swing1;
tchecksum checksum;
function_1 function1;
function_2 function2;
temp_2 temp2;
mode_2 mode2;
speed_2 speed2;
swing_2 swing2;
swing_info si;
solo_code sc;
UINT8 swing_status;
BOOL change_wind_direction;
UINT16 dc_cnt;
ac_bitnum bitnum[MAX_BITNUM];
UINT16 bitnum_cnt;
UINT16 repeat_times;
UINT16 frame_length;
ac_n_mode_info n_mode[N_MODE_MAX];
UINT16 code_cnt;
UINT8 lastbit;
UINT16 *time;
UINT8 solo_function_mark;
} protocol;
typedef struct tag_head
{
UINT16 tag;
UINT16 len;
unsigned short offset;
UINT8 *pdata;
} t_tag_head;
struct ir_bin_buffer
{
UINT8 *data;
UINT16 len;
UINT16 offset;
};
typedef struct REMOTE_AC_STATUS
{
UINT8 acPower;
UINT8 acTemp;
UINT8 acMode;
UINT8 acWindDir;
UINT8 acWindSpeed;
UINT8 acDisplay;
UINT8 acSleep;
UINT8 acTimer;
} remote_ac_status_t;
// function polymorphism
typedef INT8 (*lp_apply_ac_parameter) (remote_ac_status_t ac_status, UINT8 function_code);
#define TAG_AC_BOOT_CODE 1
#define TAG_AC_ZERO 2
#define TAG_AC_ONE 3
#define TAG_AC_DELAY_CODE 4
#define TAG_AC_FRAME_LENGTH 5
#define TAG_AC_ENDIAN 6
#define TAG_AC_LASTBIT 7
#define TAG_AC_POWER_1 21
#define TAG_AC_DEFAULT_CODE 22
#define TAG_AC_TEMP_1 23
#define TAG_AC_MODE_1 24
#define TAG_AC_SPEED_1 25
#define TAG_AC_SWING_1 26
#define TAG_AC_CHECKSUM_TYPE 27
#define TAG_AC_SOLO_FUNCTION 28
#define TAG_AC_FUNCTION_1 29
#define TAG_AC_TEMP_2 30
#define TAG_AC_MODE_2 31
#define TAG_AC_SPEED_2 32
#define TAG_AC_SWING_2 33
#define TAG_AC_FUNCTION_2 34
#define TAG_AC_BAN_FUNCTION_IN_COOL_MODE 41
#define TAG_AC_BAN_FUNCTION_IN_HEAT_MODE 42
#define TAG_AC_BAN_FUNCTION_IN_AUTO_MODE 43
#define TAG_AC_BAN_FUNCTION_IN_FAN_MODE 44
#define TAG_AC_BAN_FUNCTION_IN_DRY_MODE 45
#define TAG_AC_SWING_INFO 46
#define TAG_AC_REPEAT_TIMES 47
#define TAG_AC_BITNUM 48
// definition about size
#define PROTOCOL_SIZE (sizeof(protocol))
/* exported variables */
extern UINT8* ir_hex_code;
extern UINT8 ir_hex_len;
extern protocol* context;
extern remote_ac_status_t ac_status;
extern UINT16 user_data[];
/* exported functions */
///////////////////////////////////////////////// AC Begin /////////////////////////////////////////////////
/*
* function irda_context_init
*
* parameters:
*
* return: IR_DECODE_SUCCEEDED / IR_DECODE_FAILED
*/
extern INT8 irda_context_init();
/*
* function irda_ac_file_open
*
* parameters: file name of remote binary
*
* return: IR_DECODE_SUCCEEDED / IR_DECODE_FAILED
*/
extern INT8 irda_ac_file_open(const char* file_name);
/*
* function irda_ac_lib_open
*
* parameters: binary (in) binary content
* binary_length (in) length of binary content
*
* return: IR_DECODE_SUCCEEDED / IR_DECODE_FAILED
*/
extern INT8 irda_ac_lib_open(UINT8 *binary, UINT16 binary_length);
/*
* function irda_ac_lib_parse
*
* parameters:
*
* return: IR_DECODE_SUCCEEDED / IR_DECODE_FAILED
*/
extern INT8 irda_ac_lib_parse();
/*
* function irda_ac_lib_control
*
* parameters: ac_status (in) indicates the current status of air conditioner to be controlled
* user_data (out) wave code array to be transmitted
* function_code (in) indicates the AC function to be updated
* change_wind_direction (in) indicates if the wind direction need to be changed
*
* return: length of wave code array
*/
extern UINT16 irda_ac_lib_control(remote_ac_status_t ac_status, UINT16 *user_data, UINT8 function_code,
BOOL change_wind_direction);
/*
* function irda_ac_lib_close
*
* parameters:
*
* return: IR_DECODE_SUCCEEDED / IR_DECODE_FAILED
*/
extern void irda_ac_lib_close();
///////////////////////////////////////////////// AC End /////////////////////////////////////////////////
///////////////////////////////////////////////// TV Begin /////////////////////////////////////////////////
/*
* function irda_tv_file_open
*
* parameters: file name of remote binary
*
* return: IR_DECODE_SUCCEEDED / IR_DECODE_FAILED
*/
INT8 irda_tv_file_open(const char* file_name);
/*
* function irda_tv_lib_open
*
* parameters: binary (in) binary content
* binary_length (in) length of binary content
*
* return: IR_DECODE_SUCCEEDED / IR_DECODE_FAILED
*/
INT8 irda_tv_lib_open(UINT8 *binary, UINT16 binary_length);
/*
* function irda_tv_lib_parse
*
* parameters:
*
* return: IR_DECODE_SUCCEEDED / IR_DECODE_FAILED
*/
extern INT8 irda_tv_lib_parse(UINT8 irda_hex_encode);
/*
* function irda_tv_lib_control
*
* parameters: key_code (in) indicates the number of pressed key
* user_data (out) wave code array to be transmitted
*
* return: length of wave code array
*/
extern UINT16 irda_tv_lib_control(UINT8 key_code, UINT16* user_data);
/*
* function irda_tv_lib_close
*
* parameters:
*
* return: IR_DECODE_SUCCEEDED / IR_DECODE_FAILED
*/
extern INT8 irda_tv_lib_close();
///////////////////////////////////////////////// TV End /////////////////////////////////////////////////
///////////////////////////////////////////////// Utils Begin /////////////////////////////////////////////////
/*
* function get_temperature_range
*
* parameters: ac_mode (in) specify in which AC mode the application need to get temperature info
* temp_min (out) the min temperature supported in a specified AC mode
* temp_max (out) the max temperature supported in a specified AC mode
*
* return: IR_DECODE_SUCCEEDED / IR_DECODE_FAILED
*/
extern INT8 get_temperature_range(UINT8 ac_mode, INT8* temp_min, INT8* temp_max);
/*
* function get_supported_mode
*
* parameters: supported_mode (out) mode supported by the remote in lower 5 bits
*
* return: IR_DECODE_SUCCEEDED / IR_DECODE_FAILED
*/
extern INT8 get_supported_mode(UINT8* supported_mode);
/*
* function get_supported_wind_speed
*
* parameters: ac_mode (in) specify in which AC mode the application need to get wind speed info
* supported_wind_speed (out) wind speed supported by the remote in lower 4 bits
*
* return: IR_DECODE_SUCCEEDED / IR_DECODE_FAILED
*/
extern INT8 get_supported_wind_speed(UINT8 ac_mode, UINT8* supported_wind_speed);
/*
* function get_supported_swing
*
* parameters: ac_mode (in) specify in which AC mode the application need to get swing info
* supported_swing (out) swing supported by the remote in lower 2 bits
*
* return: IR_DECODE_SUCCEEDED / IR_DECODE_FAILED
*/
extern INT8 get_supported_swing(UINT8 ac_mode, UINT8* supported_swing);
/*
* function get_supported_wind_direction
*
* parameters: supported_wind_direction (out) swing supported by the remote in lower 2 bits
*
* return: IR_DECODE_SUCCEEDED / IR_DECODE_FAILED
*/
extern INT8 get_supported_wind_direction(UINT8* supported_wind_direction);
///////////////////////////////////////////////// Utils End /////////////////////////////////////////////////
#ifdef __cplusplus
}
#endif
#endif // _IRDA_DECODE_H_

View File

@@ -1,45 +0,0 @@
/**************************************************************************************************
Filename: irda_defs.h
Revised: Date: 2016-10-26
Revision: Revision: 1.0
Description: This file provides algorithms for IR decode
Revision log:
* 2016-10-01: created by strawmanbobi
**************************************************************************************************/
#ifndef PARSE_IR_DEFS_H
#define PARSE_IR_DEFS_H
#ifdef __cplusplus
extern "C"
{
#endif
#if defined BOARD_ANDROID
#include <android/log.h>
#define LOG_TAG "irda_decode"
#endif
#define TRUE 1
#define FALSE 0
typedef unsigned char UINT8;
typedef signed char INT8;
typedef unsigned short UINT16;
typedef signed short INT16;
typedef int BOOL;
#define irda_malloc(A) malloc(A)
#define irda_free(A) free(A)
#define irda_memcpy(A, B, C) memcpy(A, B, C)
#define irda_memset(A, B, C) memset(A, B, C)
#define irda_strlen(A) strlen(A)
#define IR_PRINTF printf
#define USER_DATA_SIZE 2048
#ifdef __cplusplus
}
#endif
#endif //PARSE_IR_DEFS_H