diff --git a/src/example/decode_example/Win32/.gitignore b/src/example/decode_example/Win32/.gitignore new file mode 100644 index 0000000..5dacf45 --- /dev/null +++ b/src/example/decode_example/Win32/.gitignore @@ -0,0 +1,10 @@ +x64/ +Debug/ +Release/ +DecodeTestWin/Debug/ +DecodeTestWin/Release/ +*.sdf +*.opensdf +.vs +DecodeTestWin.VC.db +DecodeTestWin.sdf \ No newline at end of file diff --git a/src/example/decode_example/Win32/DecodeTestWin.sln b/src/example/decode_example/Win32/DecodeTestWin.sln new file mode 100644 index 0000000..cdbfe4c --- /dev/null +++ b/src/example/decode_example/Win32/DecodeTestWin.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.23107.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DecodeTestWin", "DecodeTestWin\DecodeTestWin.vcxproj", "{66988DFB-7EA1-4A04-B72A-D51C4A061E57}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {66988DFB-7EA1-4A04-B72A-D51C4A061E57}.Debug|x64.ActiveCfg = Debug|x64 + {66988DFB-7EA1-4A04-B72A-D51C4A061E57}.Debug|x64.Build.0 = Debug|x64 + {66988DFB-7EA1-4A04-B72A-D51C4A061E57}.Debug|x86.ActiveCfg = Debug|Win32 + {66988DFB-7EA1-4A04-B72A-D51C4A061E57}.Debug|x86.Build.0 = Debug|Win32 + {66988DFB-7EA1-4A04-B72A-D51C4A061E57}.Release|x64.ActiveCfg = Release|x64 + {66988DFB-7EA1-4A04-B72A-D51C4A061E57}.Release|x64.Build.0 = Release|x64 + {66988DFB-7EA1-4A04-B72A-D51C4A061E57}.Release|x86.ActiveCfg = Release|Win32 + {66988DFB-7EA1-4A04-B72A-D51C4A061E57}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/src/example/decode_example/Win32/DecodeTestWin/DecodeTestWin.aps b/src/example/decode_example/Win32/DecodeTestWin/DecodeTestWin.aps new file mode 100644 index 0000000..fd1351e Binary files /dev/null and b/src/example/decode_example/Win32/DecodeTestWin/DecodeTestWin.aps differ diff --git a/src/example/decode_example/Win32/DecodeTestWin/DecodeTestWin.cpp b/src/example/decode_example/Win32/DecodeTestWin/DecodeTestWin.cpp new file mode 100644 index 0000000..09fb2b1 --- /dev/null +++ b/src/example/decode_example/Win32/DecodeTestWin/DecodeTestWin.cpp @@ -0,0 +1,337 @@ +#include "stdafx.h" +#include "DecodeTestWin.h" +#include "irda_decode.h" + +using namespace std; + +#ifdef _DEBUG +#define new DEBUG_NEW +#endif + +// global variable definition +long binary_length = 0; +UINT8 *binary_content = NULL; + +CWinApp theApp; +HINSTANCE hInDecodeDll = NULL; + +remote_ac_status_t 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_get_temperature_range) (UINT8 ac_mode, INT8* temp_min, INT8* temp_max); +typedef INT8(*lp_get_supported_mode) (UINT8* supported_mode); +typedef INT8(*lp_get_supported_wind_speed) (UINT8 ac_mode, UINT8* supported_wind_speed); +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_get_supported_mode GetSupportedMode; +lp_get_supported_swing GetSupportedSwing; +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 + int in_char = 0; + int count = 0; + BOOL op_match = TRUE; + UINT8 function_code = AC_FUNCTION_MAX; + + // get status + UINT8 supported_mode = 0x00; + INT8 min_temperature = 0; + INT8 max_temperature = 0; + UINT8 supported_speed = 0x00; + UINT8 supported_swing = 0x00; + + 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; + + if (IR_DECODE_FAILED == IRDAACFileOpen(file_name)) + { + IRDAACLibClose(); + return IR_DECODE_FAILED; + } + + if (IR_DECODE_FAILED == IRDAACLibParse()) + { + IR_PRINTF("\nac lib parse failed\n"); + IRDAACLibClose(); + return IR_DECODE_FAILED; + } + do + { + in_char = getchar(); + op_match = TRUE; + need_control = TRUE; + switch (in_char) + { + case 'w': + case 'W': + // temperature plus + ac_status.acTemp = (ac_status.acTemp == AC_TEMP_30) ? AC_TEMP_30 : (ac_status.acTemp + 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); + 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; + function_code = AC_FUNCTION_WIND_SPEED; + // wind speed loop + break; + case 'd': + case 'D': + ac_status.acWindDir = (ac_status.acWindDir == 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; + function_code = AC_FUNCTION_MODE; + break; + case '1': + // turn on + ac_status.acPower = AC_POWER_ON; + function_code = AC_FUNCTION_POWER; + break; + case '2': + // turn off + ac_status.acPower = 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("\nsupported mode = %02X\n", supported_mode); + } + need_control = FALSE; + break; + + case '4': + if (IR_DECODE_SUCCEEDED == GetSupportedSwing(ac_status.acMode, &supported_swing)) + { + IR_PRINTF("\nsupported swing in %d = %02X\n", ac_status.acMode, supported_swing); + } + need_control = FALSE; + break; + case '5': + if (IR_DECODE_SUCCEEDED == GetSupportedWindSpeed(ac_status.acMode, &supported_speed)) + { + IR_PRINTF("\nsupported wind speed in %d = %02X\n", ac_status.acMode, supported_speed); + } + need_control = FALSE; + break; + + case '6': + if (IR_DECODE_SUCCEEDED == GetTemperatureRange(ac_status.acMode, &min_temperature, &max_temperature)) + { + IR_PRINTF("\nsupported temperature range in mode %d = %d, %d\n", + ac_status.acMode, min_temperature, max_temperature); + } + need_control = FALSE; + break; + + default: + op_match = FALSE; + break; + } + + 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 + ); + + IRDAACLibControl(ac_status, user_data, function_code, TRUE); + } + } while ('0' != in_char); + + IRDAACLibClose(); + + // free binary buffer + irda_free(binary_content); + binary_length = 0; + + return IR_DECODE_SUCCEEDED; +} + +INT8 decode_as_tv(char *file_name, UINT8 irda_hex_encode) +{ + // keyboard input + int in_char = 0; + int key_code = -1; + int count = 0; + + if (IR_DECODE_FAILED == IRDATVFileOpen(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); + } + else if (in_char >= 'a' && in_char <= 'f') + { + key_code = 10 + (in_char - 'a'); + IRDATVLibControl(key_code, user_data); + } + else if (in_char == 'q') + { + IRDATVLibClose(); + } + else + { + // do nothing + } + } while ('Q' != in_char); + + // free binary buffer + irda_free(binary_content); + binary_length = 0; + + return IR_DECODE_SUCCEEDED; +} + +int main(int argc, char *argv[]) +{ + int nRetCode = 0; + + HMODULE hModule = ::GetModuleHandle(nullptr); + + if (hModule != nullptr) + { + if (!AfxWinInit(hModule, nullptr, ::GetCommandLine(), 0)) + { + wprintf(L"error: MFC failed to initialize\n"); + nRetCode = 1; + } + else + { + hInDecodeDll = LoadLibrary(_T("ir_decoder.dll")); + if (NULL != hInDecodeDll) + { + IR_PRINTF("load library successfully"); + 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"); + + GetSupportedMode = (lp_get_supported_mode)GetProcAddress(hInDecodeDll, "get_supported_mode"); + GetSupportedSwing = (lp_get_supported_swing)GetProcAddress(hInDecodeDll, "get_supported_swing"); + GetSupportedWindSpeed = (lp_get_supported_wind_speed)GetProcAddress(hInDecodeDll, "get_supported_wind_speed"); + 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"); + return -1; + } + + function = argv[1][0]; + irda_hex_encode = (UINT8)(argv[3][0] - '0'); + IR_PRINTF("decode functionality = %c\n", function); + + switch (function) + { + case '0': + 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); + decode_as_tv(argv[2], irda_hex_encode); + break; + + default: + IR_PRINTF("decode functionality error !\n"); + break; + } + + FreeLibrary(hInDecodeDll); + } + else + { + IR_PRINTF("load library failed"); + } + } + } + else + { + wprintf(L"error: GetModuleHandle failed\n"); + nRetCode = 1; + } + + system("pause"); + + return nRetCode; +} \ No newline at end of file diff --git a/src/example/decode_example/Win32/DecodeTestWin/DecodeTestWin.h b/src/example/decode_example/Win32/DecodeTestWin/DecodeTestWin.h new file mode 100644 index 0000000..d00d47e --- /dev/null +++ b/src/example/decode_example/Win32/DecodeTestWin/DecodeTestWin.h @@ -0,0 +1,3 @@ +#pragma once + +#include "resource.h" diff --git a/src/example/decode_example/Win32/DecodeTestWin/DecodeTestWin.rc b/src/example/decode_example/Win32/DecodeTestWin/DecodeTestWin.rc new file mode 100644 index 0000000..741488f Binary files /dev/null and b/src/example/decode_example/Win32/DecodeTestWin/DecodeTestWin.rc differ diff --git a/src/example/decode_example/Win32/DecodeTestWin/DecodeTestWin.vcxproj b/src/example/decode_example/Win32/DecodeTestWin/DecodeTestWin.vcxproj new file mode 100644 index 0000000..ac11f8e --- /dev/null +++ b/src/example/decode_example/Win32/DecodeTestWin/DecodeTestWin.vcxproj @@ -0,0 +1,174 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {66988DFB-7EA1-4A04-B72A-D51C4A061E57} + Win32Proj + DecodeTestWin + 8.1 + + + + Application + true + v140 + Unicode + Dynamic + + + Application + false + v140 + true + Unicode + Dynamic + + + Application + true + v140 + Unicode + Dynamic + + + Application + false + v140 + true + Unicode + Dynamic + + + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + Use + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Use + Level3 + Disabled + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + Use + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + Level3 + Use + MaxSpeed + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + + + + + + + + + + + + + Create + Create + Create + Create + + + + + + + + + \ No newline at end of file diff --git a/src/example/decode_example/Win32/DecodeTestWin/DecodeTestWin.vcxproj.filters b/src/example/decode_example/Win32/DecodeTestWin/DecodeTestWin.vcxproj.filters new file mode 100644 index 0000000..504757a --- /dev/null +++ b/src/example/decode_example/Win32/DecodeTestWin/DecodeTestWin.vcxproj.filters @@ -0,0 +1,53 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + + + 源文件 + + + 源文件 + + + + + 资源文件 + + + \ No newline at end of file diff --git a/src/example/decode_example/Win32/DecodeTestWin/DecodeTestWin.vcxproj.user b/src/example/decode_example/Win32/DecodeTestWin/DecodeTestWin.vcxproj.user new file mode 100644 index 0000000..abe8dd8 --- /dev/null +++ b/src/example/decode_example/Win32/DecodeTestWin/DecodeTestWin.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/example/decode_example/Win32/DecodeTestWin/ReadMe.txt b/src/example/decode_example/Win32/DecodeTestWin/ReadMe.txt new file mode 100644 index 0000000..216e0bb --- /dev/null +++ b/src/example/decode_example/Win32/DecodeTestWin/ReadMe.txt @@ -0,0 +1,39 @@ +======================================================================== + 控制台应用程序:DecodeTestWin 项目概述 +======================================================================== + +应用程序向导已为您创建了此 DecodeTestWin 应用程序。 + +本文件概要介绍组成 DecodeTestWin 应用程序的每个文件的内容。 + + +DecodeTestWin.vcxproj + 这是使用应用程序向导生成的 VC++ 项目的主项目文件,其中包含生成该文件的 Visual C++ 的版本信息,以及有关使用应用程序向导选择的平台、配置和项目功能的信息。 + +DecodeTestWin.vcxproj.filters + 这是使用“应用程序向导”生成的 VC++ 项目筛选器文件。它包含有关项目文件与筛选器之间的关联信息。在 IDE 中,通过这种关联,在特定节点下以分组形式显示具有相似扩展名的文件。例如,“.cpp”文件与“源文件”筛选器关联。 + +DecodeTestWin.cpp + 这是主应用程序源文件。 + +///////////////////////////////////////////////////////////////////////////// +应用程序向导创建了下列资源: + +DecodeTestWin.rc + 这是程序使用的所有 Microsoft Windows 资源的列表。它包括 RES 子目录中存储的图标、位图和光标。此文件可以直接在 Microsoft Visual C++ 中进行编辑。 + +Resource.h + 这是标准头文件,可用于定义新的资源 ID。Microsoft Visual C++ 将读取并更新此文件。 + +///////////////////////////////////////////////////////////////////////////// +其他标准文件: + +StdAfx.h, StdAfx.cpp + 这些文件用于生成名为 DecodeTestWin.pch 的预编译头 (PCH) 文件和名为 StdAfx.obj 的预编译类型文件。 + +///////////////////////////////////////////////////////////////////////////// +其他注释: + +应用程序向导使用“TODO:”注释来指示应添加或自定义的源代码部分。 + +///////////////////////////////////////////////////////////////////////////// diff --git a/src/example/decode_example/Win32/DecodeTestWin/Resource.h b/src/example/decode_example/Win32/DecodeTestWin/Resource.h new file mode 100644 index 0000000..109571d --- /dev/null +++ b/src/example/decode_example/Win32/DecodeTestWin/Resource.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by DecodeTestWin.rc +// + +#define IDS_APP_TITLE 103 + + +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 101 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1000 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/src/example/decode_example/Win32/DecodeTestWin/irda_decode.h b/src/example/decode_example/Win32/DecodeTestWin/irda_decode.h new file mode 100644 index 0000000..c8d0322 --- /dev/null +++ b/src/example/decode_example/Win32/DecodeTestWin/irda_decode.h @@ -0,0 +1,605 @@ +/************************************************************************************************** +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 +#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_ diff --git a/src/example/decode_example/Win32/DecodeTestWin/irda_defs.h b/src/example/decode_example/Win32/DecodeTestWin/irda_defs.h new file mode 100644 index 0000000..d6cb9b4 --- /dev/null +++ b/src/example/decode_example/Win32/DecodeTestWin/irda_defs.h @@ -0,0 +1,45 @@ +/************************************************************************************************** +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 +#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 diff --git a/src/example/decode_example/Win32/DecodeTestWin/stdafx.cpp b/src/example/decode_example/Win32/DecodeTestWin/stdafx.cpp new file mode 100644 index 0000000..fd4f341 --- /dev/null +++ b/src/example/decode_example/Win32/DecodeTestWin/stdafx.cpp @@ -0,0 +1 @@ +#include "stdafx.h" diff --git a/src/example/decode_example/Win32/DecodeTestWin/stdafx.h b/src/example/decode_example/Win32/DecodeTestWin/stdafx.h new file mode 100644 index 0000000..5fbc9de --- /dev/null +++ b/src/example/decode_example/Win32/DecodeTestWin/stdafx.h @@ -0,0 +1,24 @@ +#pragma once + +#include "targetver.h" + +#include +#include +#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS +#define _AFX_NO_MFC_CONTROLS_IN_DIALOGS + +#ifndef VC_EXTRALEAN +#define VC_EXTRALEAN +#endif + +#include +#include +#include +#ifndef _AFX_NO_OLE_SUPPORT +#include +#endif +#ifndef _AFX_NO_AFXCMN_SUPPORT +#include +#endif // _AFX_NO_AFXCMN_SUPPORT + +#include diff --git a/src/example/decode_example/Win32/DecodeTestWin/targetver.h b/src/example/decode_example/Win32/DecodeTestWin/targetver.h new file mode 100644 index 0000000..14f63fa --- /dev/null +++ b/src/example/decode_example/Win32/DecodeTestWin/targetver.h @@ -0,0 +1,4 @@ +#pragma once + + +#include diff --git a/src/example/decode_example/Win32/ipch/DECODETESTWIN-d13ce8ef/DECODETESTWIN-d09a2698.ipch b/src/example/decode_example/Win32/ipch/DECODETESTWIN-d13ce8ef/DECODETESTWIN-d09a2698.ipch new file mode 100644 index 0000000..ab4f75a Binary files /dev/null and b/src/example/decode_example/Win32/ipch/DECODETESTWIN-d13ce8ef/DECODETESTWIN-d09a2698.ipch differ diff --git a/src/example/decode_example/Win32/ipch/DECODETESTWIN-d13ce8ef/DECODETESTWIN-f545b35e.ipch b/src/example/decode_example/Win32/ipch/DECODETESTWIN-d13ce8ef/DECODETESTWIN-f545b35e.ipch new file mode 100644 index 0000000..ab01428 Binary files /dev/null and b/src/example/decode_example/Win32/ipch/DECODETESTWIN-d13ce8ef/DECODETESTWIN-f545b35e.ipch differ diff --git a/src/sample/emulator/empty b/src/example/ir_driver_gpio/empty similarity index 100% rename from src/sample/emulator/empty rename to src/example/ir_driver_gpio/empty diff --git a/src/ir_decoder/.gitignore b/src/ir_decoder/.gitignore index 268226e..504ad78 100644 --- a/src/ir_decoder/.gitignore +++ b/src/ir_decoder/.gitignore @@ -13,4 +13,6 @@ Release/ .DS_Store .vs ir_decoder.vcxproj.user -irda_decoder.exe.stackdump \ No newline at end of file +irda_decoder.exe.stackdump +ir_decoder.VC.db +ir_decoder.VC.VC.opendb \ No newline at end of file diff --git a/src/ir_decoder/ir_decode.def b/src/ir_decoder/ir_decode.def index 4c67494..a4cf6cf 100644 --- a/src/ir_decoder/ir_decode.def +++ b/src/ir_decoder/ir_decode.def @@ -3,16 +3,19 @@ LIBRARY EXPORTS irda_context_init @1 -irda_ac_lib_open @2 -irda_ac_lib_parse @3 -irda_ac_lib_control @4 -irda_ac_lib_close @5 -irda_tv_lib_open @6 -irda_tv_lib_parse @7 -irda_tv_lib_control @8 -irda_tv_lib_close @9 -get_temperature_range @10 -get_supported_mode @11 -get_supported_wind_speed @12 -get_supported_swing @13 -get_supported_wind_direction @14 \ No newline at end of file +irda_ac_file_open @2 +irda_ac_lib_open @3 +irda_ac_lib_parse @4 +irda_ac_lib_control @5 +irda_ac_lib_close @6 + +irda_tv_file_open @7 +irda_tv_lib_open @8 +irda_tv_lib_parse @9 +irda_tv_lib_control @10 +irda_tv_lib_close @11 +get_temperature_range @12 +get_supported_mode @13 +get_supported_wind_speed @14 +get_supported_swing @15 +get_supported_wind_direction @16 \ No newline at end of file diff --git a/src/ir_decoder/irda_main.c b/src/ir_decoder/irda_main.c index 6582fba..eff5671 100644 --- a/src/ir_decoder/irda_main.c +++ b/src/ir_decoder/irda_main.c @@ -34,7 +34,7 @@ UINT16 user_data[USER_DATA_SIZE]; INT8 irda_tv_file_open(const char* file_name); -INT8 decode_as_ac(const char* file_name) +INT8 decode_as_ac(char* file_name) { // keyboard input int in_char = 0; diff --git a/src/sample/ir_driver_gpio/empty b/src/sample/ir_driver_gpio/empty deleted file mode 100644 index e69de29..0000000