From 348cd663d172b0910344d90e0bd76e21227f32f3 Mon Sep 17 00:00:00 2001 From: strawmanbobi Date: Sun, 16 Jun 2019 22:04:20 +0800 Subject: [PATCH] updated embeded, windows and jni examples --- .../ir_decoder/include/ir_decode.h | 168 ++++++++++++++++++ .../Application/ir_decoder/include/ir_defs.h | 8 +- .../Application/ir_decoder/src/ir_ac_apply.c | 10 ++ .../src/ir_ac_parse_forbidden_info.c | 10 +- .../ir_decoder/src/ir_ac_parse_frame_info.c | 26 +-- .../Application/ir_decoder/src/ir_decode.c | 67 ++++++- .../ir_decoder/src/ir_tv_control.c | 2 +- .../libs/ir_decode_0.2.1-linux-x64.so | Bin 0 -> 59368 bytes jni-example/decodesdk/libs/libirda_decoder.so | Bin 163024 -> 0 bytes .../src/net/irext/decode/sdk/IRDecode.java | 2 +- .../ir_decoder/include/ir_decode.h | 168 ++++++++++++++++++ .../ir_decoder/include/ir_defs.h | 8 +- .../ir_decoder/src/ir_ac_apply.c | 10 ++ .../src/ir_ac_parse_forbidden_info.c | 10 +- .../ir_decoder/src/ir_ac_parse_frame_info.c | 26 +-- .../DecodeTestWin/ir_decoder/src/ir_decode.c | 84 ++++++++- .../ir_decoder/src/ir_tv_control.c | 2 +- 17 files changed, 549 insertions(+), 52 deletions(-) create mode 100644 jni-example/decodesdk/libs/ir_decode_0.2.1-linux-x64.so delete mode 100644 jni-example/decodesdk/libs/libirda_decoder.so diff --git a/cc26xx-example/ti/BLE-CC264x/ble_cc26xx/Projects/ble/SimpleBLEPeripheral-IREXT/CC26xx/Source/Application/ir_decoder/include/ir_decode.h b/cc26xx-example/ti/BLE-CC264x/ble_cc26xx/Projects/ble/SimpleBLEPeripheral-IREXT/CC26xx/Source/Application/ir_decoder/include/ir_decode.h index b2fff07..4132128 100644 --- a/cc26xx-example/ti/BLE-CC264x/ble_cc26xx/Projects/ble/SimpleBLEPeripheral-IREXT/CC26xx/Source/Application/ir_decoder/include/ir_decode.h +++ b/cc26xx-example/ti/BLE-CC264x/ble_cc26xx/Projects/ble/SimpleBLEPeripheral-IREXT/CC26xx/Source/Application/ir_decoder/include/ir_decode.h @@ -34,6 +34,168 @@ extern "C" #define SUB_CATEGORY_QUATERNARY 0 #define SUB_CATEGORY_HEXADECIMAL 1 +// remote control key definition +#define KEY_TV_POWER 0 +#define KEY_TV_MUTE 1 +#define KEY_TV_UP 2 +#define KEY_TV_DOWN 3 +#define KEY_TV_LEFT 4 +#define KEY_TV_RIGHT 5 +#define KEY_TV_OK 6 +#define KEY_TV_VOL_PLUS 7 +#define KEY_TV_VOL_MINUS 8 +#define KEY_TV_BACK 9 +#define KEY_TV_INPUT 10 +#define KEY_TV_MENU 11 +#define KEY_TV_HOME 12 +#define KEY_TV_SETTINGS 13 + +#define KEY_AC_POWER 0 +#define KEY_AC_TEMP_PLUS 1 +#define KEY_AC_TEMP_MINUS 2 +#define KEY_AC_MODE_SWITCH 8 +#define KEY_AC_WIND_SPEED 9 +#define KEY_AC_WIND_DIRECTION 10 + +#define KEY_STB_POWER 0 +#define KEY_STB_MUTE 1 +#define KEY_STB_UP 2 +#define KEY_STB_DOWN 3 +#define KEY_STB_LEFT 4 +#define KEY_STB_RIGHT 5 +#define KEY_STB_OK 6 +#define KEY_STB_VOL_PLUS 7 +#define KEY_STB_VOL_MINUS 8 +#define KEY_STB_BACK 9 +#define KEY_STB_INPUT 10 +#define KEY_STB_MENU 11 +#define KEY_STB_PAGE_UP 12 +#define KEY_STB_PAGE_DOWN 13 + +#define KEY_NETBOX_POWER 0 +#define KEY_NETBOX_UP 1 +#define KEY_NETBOX_DOWN 2 +#define KEY_NETBOX_LEFT 3 +#define KEY_NETBOX_RIGHT 4 +#define KEY_NETBOX_OK 5 +#define KEY_NETBOX_VOL_PLUS 6 +#define KEY_NETBOX_VOL_MINUS 7 +#define KEY_NETBOX_BACK 8 +#define KEY_NETBOX_MENU 9 +#define KEY_NETBOX_HOME 10 + +#define KEY_IPTV_POWER 0 +#define KEY_IPTV_MUTE 1 +#define KEY_IPTV_UP 2 +#define KEY_IPTV_DOWN 3 +#define KEY_IPTV_LEFT 4 +#define KEY_IPTV_RIGHT 5 +#define KEY_IPTV_OK 6 +#define KEY_IPTV_VOL_PLUS 7 +#define KEY_IPTV_VOL_MINUS 8 +#define KEY_IPTV_BACK 9 +#define KEY_IPTV_INPUT 10 +#define KEY_IPTV_MENU 11 +#define KEY_IPTV_PAGE_UP 12 +#define KEY_IPTV_PAGE_DOWN 13 + +#define KEY_DVD_POWER 0 +#define KEY_DVD_UP 1 +#define KEY_DVD_DOWN 2 +#define KEY_DVD_LEFT 3 +#define KEY_DVD_RIGHT 4 +#define KEY_DVD_OK 5 +#define KEY_DVD_VOL_PLUS 6 +#define KEY_DVD_VOL_MINUS 7 +#define KEY_DVD_PLAY 8 +#define KEY_DVD_PAUSE 9 +#define KEY_DVD_EJECT 10 +#define KEY_DVD_REWIND 11 +#define KEY_DVD_FASTFORWARD 12 +#define KEY_DVD_MENU 13 + +#define KEY_FAN_POWER 0 +#define KEY_FAN_WIND_PLUS 6 +#define KEY_FAN_WIND_MUNIS 7 +#define KEY_FAN_SWING 8 +#define KEY_FAN_WIND_SPEED 9 +#define KEY_FAN_WIND_TYPE 10 + +#define KEY_PROJECTOR_POWER 0 +#define KEY_PROJECTOR_UP 1 +#define KEY_PROJECTOR_DOWN 2 +#define KEY_PROJECTOR_LEFT 3 +#define KEY_PROJECTOR_RIGHT 4 +#define KEY_PROJECTOR_OK 5 +#define KEY_PROJECTOR_VOL_PLUS 6 +#define KEY_PROJECTOR_VOL_MINUS 7 +#define KEY_PROJECTOR_ZOOM_OUT 8 +#define KEY_PROJECTOR_MENU 9 +#define KEY_PROJECTOR_ZOOM_IN 10 +#define KEY_PROJECTOR_BACK 11 + +#define KEY_STEREO_POWER 0 +#define KEY_STEREO_UP 1 +#define KEY_STEREO_DOWN 2 +#define KEY_STEREO_LEFT 3 +#define KEY_STEREO_RIGHT 4 +#define KEY_STEREO_OK 5 +#define KEY_STEREO_VOL_PLUS 6 +#define KEY_STEREO_VOL_MINUS 7 +#define KEY_STEREO_MUTE 8 +#define KEY_STEREO_MENU 9 + +#define KEY_BULB_POWER 0 +#define KEY_BULB_COLOR_1 1 +#define KEY_BULB_COLOR_2 2 +#define KEY_BULB_COLOR_3 3 +#define KEY_BULB_COLOR_4 4 +#define KEY_BULB_COLOR_0 5 +#define KEY_BULB_BRIGHT_PLUS 6 +#define KEY_BULB_BRIGHT_MINUS 7 +#define KEY_BULB_BRIGHT_POWER_ON 8 +#define KEY_BULB_BRIGHT_RAINBOW 9 +#define KEY_BULB_BRIGHT_POWER_OFF 10 + +#define KEY_CLEANROBOT_POWER 0 +#define KEY_CLEANROBOT_FOWWARD 1 +#define KEY_CLEANROBOT_BACKWARD 2 +#define KEY_CLEANROBOT_LEFT 3 +#define KEY_CLEANROBOT_RIGHT 4 +#define KEY_CLEANROBOT_START 5 +#define KEY_CLEANROBOT_STOP 6 +#define KEY_CLEANROBOT_AUTO 8 +#define KEY_CLEANROBOT_SPOT 9 +#define KEY_CLEANROBOT_SPEED 10 +#define KEY_CLEANROBOT_TIMER 11 +#define KEY_CLEANROBOT_CHARGE 12 +#define KEY_CLEANROBOT_PRESERVE 13 + +#define KEY_AIRCLEANER_POWER 0 +#define KEY_AIRCLEANER_ION 5 +#define KEY_AIRCLEANER_AUTO 8 +#define KEY_AIRCLEANER_WIND_SPEED 9 +#define KEY_AIRCLEANER_MODE_SWITCH 10 +#define KEY_AIRCLEANER_TIMER 11 +#define KEY_AIRCLEANER_LIGHT 12 +#define KEY_AIRCLEANER_FORCE 13 + +#define KEY_DYSON_POWER 0 +#define KEY_DYSON_WIND_SPEED_PLUS 1 +#define KEY_DYSON_WIND_SPEED_MINUS 2 +#define KEY_DYSON_TIMER_MINUS 3 +#define KEY_DYSON_TIMER_PLUS 4 +#define KEY_DYSON_AUTO 5 +#define KEY_DYSON_TEMP_PLUS 6 +#define KEY_DYSON_TEMP_MINUS 7 +#define KEY_DYSON_SWING 8 +#define KEY_DYSON_DIFFUSION 9 +#define KEY_DYSON_FAV 10 +#define KEY_DYSON_TIMER 11 +#define KEY_DYSON_SLEEP 12 +#define KEY_DYSON_COOL 13 + + // exported functions /** * function ir_file_open @@ -153,6 +315,12 @@ extern INT8 get_supported_wind_direction(UINT8 *supported_wind_direction); extern void ir_lib_free_inner_buffer(); #endif +// this function is preferred being called by JNI only +UINT16 ir_decode_combo(const UINT8 category, const UINT8 sub_category, + UINT8* binary, UINT16 binary_length, + UINT8 key_code, UINT16* user_data, + t_remote_ac_status* ac_status, BOOL change_wind_direction); + #ifdef __cplusplus } #endif diff --git a/cc26xx-example/ti/BLE-CC264x/ble_cc26xx/Projects/ble/SimpleBLEPeripheral-IREXT/CC26xx/Source/Application/ir_decoder/include/ir_defs.h b/cc26xx-example/ti/BLE-CC264x/ble_cc26xx/Projects/ble/SimpleBLEPeripheral-IREXT/CC26xx/Source/Application/ir_decoder/include/ir_defs.h index b16e660..940e6b5 100644 --- a/cc26xx-example/ti/BLE-CC264x/ble_cc26xx/Projects/ble/SimpleBLEPeripheral-IREXT/CC26xx/Source/Application/ir_decoder/include/ir_defs.h +++ b/cc26xx-example/ti/BLE-CC264x/ble_cc26xx/Projects/ble/SimpleBLEPeripheral-IREXT/CC26xx/Source/Application/ir_decoder/include/ir_defs.h @@ -32,6 +32,11 @@ extern "C" #define FORMAT_HEX 16 #define FORMAT_DECIMAL 10 +// #define USE_DYNAMIC_TAG 1 + +#if defined USE_DYNAMIC_TAG +#include +#endif typedef unsigned char UINT8; typedef signed char INT8; @@ -54,12 +59,13 @@ void noprint(const char *fmt, ...); #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) +#if ((defined BOARD_PC) || (defined BOARD_PC_JNI)) && (defined DEBUG) #define ir_printf printf #else #define ir_printf noprint #endif #define USER_DATA_SIZE 1636 +// #define USER_DATA_SIZE 4096 #ifdef __cplusplus } diff --git a/cc26xx-example/ti/BLE-CC264x/ble_cc26xx/Projects/ble/SimpleBLEPeripheral-IREXT/CC26xx/Source/Application/ir_decoder/src/ir_ac_apply.c b/cc26xx-example/ti/BLE-CC264x/ble_cc26xx/Projects/ble/SimpleBLEPeripheral-IREXT/CC26xx/Source/Application/ir_decoder/src/ir_ac_apply.c index 905ddc8..267df48 100644 --- a/cc26xx-example/ti/BLE-CC264x/ble_cc26xx/Projects/ble/SimpleBLEPeripheral-IREXT/CC26xx/Source/Application/ir_decoder/src/ir_ac_apply.c +++ b/cc26xx-example/ti/BLE-CC264x/ble_cc26xx/Projects/ble/SimpleBLEPeripheral-IREXT/CC26xx/Source/Application/ir_decoder/src/ir_ac_apply.c @@ -495,6 +495,11 @@ static INT8 apply_checksum_spec_byte_onebyte(UINT8 *ac_code, t_tag_checksum_data static UINT8 has_function(struct ac_protocol *protocol, UINT8 function) { + if (function < AC_FUNCTION_POWER || function > AC_FUNCTION_WIND_FIX) + { + return FALSE; + } + if (0 != protocol->function1.len) { if (0 != protocol->function1.comp_data[function - 1].seg_len) @@ -518,6 +523,11 @@ INT8 apply_function(struct ac_protocol *protocol, UINT8 function) { UINT16 i = 0; + if (function < AC_FUNCTION_POWER || function > AC_FUNCTION_WIND_FIX) + { + return IR_DECODE_FAILED; + } + // function index starts from 1 (AC_FUNCTION_POWER), do -1 operation at first if (0 == protocol->function1.len) { diff --git a/cc26xx-example/ti/BLE-CC264x/ble_cc26xx/Projects/ble/SimpleBLEPeripheral-IREXT/CC26xx/Source/Application/ir_decoder/src/ir_ac_parse_forbidden_info.c b/cc26xx-example/ti/BLE-CC264x/ble_cc26xx/Projects/ble/SimpleBLEPeripheral-IREXT/CC26xx/Source/Application/ir_decoder/src/ir_ac_parse_forbidden_info.c index 0ea1c47..331a243 100644 --- a/cc26xx-example/ti/BLE-CC264x/ble_cc26xx/Projects/ble/SimpleBLEPeripheral-IREXT/CC26xx/Source/Application/ir_decoder/src/ir_ac_parse_forbidden_info.c +++ b/cc26xx-example/ti/BLE-CC264x/ble_cc26xx/Projects/ble/SimpleBLEPeripheral-IREXT/CC26xx/Source/Application/ir_decoder/src/ir_ac_parse_forbidden_info.c @@ -22,7 +22,7 @@ extern t_ac_protocol *context; INT8 parse_nmode_data_speed(char *pdata, t_ac_n_mode seq) { - char buf[16] = {0}; + char buf[16] = { 0 }; char *p = pdata; UINT16 pos = 0; UINT16 cnt = 0, index = 0; @@ -47,7 +47,7 @@ INT8 parse_nmode_data_speed(char *pdata, t_ac_n_mode seq) INT8 parse_nmode_data_temp(char *pdata, t_ac_n_mode seq) { - char buf[16] = {0}; + char buf[16] = { 0 }; char *p = pdata; UINT16 pos = 0; UINT16 cnt = 0, index = 0; @@ -71,8 +71,8 @@ INT8 parse_nmode_data_temp(char *pdata, t_ac_n_mode seq) INT8 parse_nmode_pos(char *buf, t_ac_n_mode index) { UINT16 i = 0; - char data[64] = {0}; - // char start[8] = {0}; + char data[64] = { 0 }; + // char start[8] = { 0 }; if (ir_strlen(buf) == 1) { if (buf[0] == 'S' || buf[0] == 's') @@ -111,7 +111,7 @@ INT8 parse_nmode(struct tag_head *tag, t_ac_n_mode index) UINT16 i = 0; UINT16 preindex = 0; - char buf[64] = {0}; + char buf[64] = { 0 }; if (tag->p_data[0] == 'N' && tag->p_data[1] == 'A') { diff --git a/cc26xx-example/ti/BLE-CC264x/ble_cc26xx/Projects/ble/SimpleBLEPeripheral-IREXT/CC26xx/Source/Application/ir_decoder/src/ir_ac_parse_frame_info.c b/cc26xx-example/ti/BLE-CC264x/ble_cc26xx/Projects/ble/SimpleBLEPeripheral-IREXT/CC26xx/Source/Application/ir_decoder/src/ir_ac_parse_frame_info.c index b96bca1..0a86f46 100644 --- a/cc26xx-example/ti/BLE-CC264x/ble_cc26xx/Projects/ble/SimpleBLEPeripheral-IREXT/CC26xx/Source/Application/ir_decoder/src/ir_ac_parse_frame_info.c +++ b/cc26xx-example/ti/BLE-CC264x/ble_cc26xx/Projects/ble/SimpleBLEPeripheral-IREXT/CC26xx/Source/Application/ir_decoder/src/ir_ac_parse_frame_info.c @@ -19,7 +19,7 @@ Revision log: INT8 parse_boot_code(struct tag_head *tag) { - UINT8 buf[16] = {0}; + UINT8 buf[16] = { 0 }; UINT8 *p = NULL; UINT16 pos = 0; UINT16 cnt = 0, index = 0; @@ -53,8 +53,8 @@ INT8 parse_boot_code(struct tag_head *tag) INT8 parse_zero(struct tag_head *tag) { - UINT8 low[16] = {0}; - UINT8 high[16] = {0}; + UINT8 low[16] = { 0 }; + UINT8 high[16] = { 0 }; UINT16 index = 0; UINT8 *p = NULL; @@ -84,8 +84,8 @@ INT8 parse_zero(struct tag_head *tag) INT8 parse_one(struct tag_head *tag) { - UINT8 low[16] = {0}; - UINT8 high[16] = {0}; + UINT8 low[16] = { 0 }; + UINT8 high[16] = { 0 }; UINT16 index = 0; UINT8 *p = NULL; @@ -115,7 +115,7 @@ INT8 parse_one(struct tag_head *tag) INT8 parse_delay_code_data(UINT8 *pdata) { - UINT8 buf[16] = {0}; + UINT8 buf[16] = { 0 }; UINT8 *p = NULL; UINT16 pos = 0; UINT16 cnt = 0, index = 0; @@ -146,7 +146,7 @@ INT8 parse_delay_code_data(UINT8 *pdata) INT8 parse_delay_code_pos(UINT8 *buf) { UINT16 i = 0; - UINT8 data[64] = {0}, start[8] = {0}; + UINT8 data[64] = { 0 }, start[8] = { 0 }; if (NULL == buf) { @@ -171,7 +171,7 @@ INT8 parse_delay_code_pos(UINT8 *buf) INT8 parse_delay_code(struct tag_head *tag) { - UINT8 buf[64] = {0}; + UINT8 buf[64] = { 0 }; UINT16 i = 0; UINT16 preindex = 0; preindex = 0; @@ -228,7 +228,7 @@ INT8 parse_frame_len(struct tag_head *tag, UINT16 len) INT8 parse_endian(struct tag_head *tag) { - UINT8 buf[8] = {0}; + UINT8 buf[8] = { 0 }; if (NULL == tag) { @@ -241,7 +241,7 @@ INT8 parse_endian(struct tag_head *tag) INT8 parse_lastbit(struct tag_head *tag) { - UINT8 buf[8] = {0}; + UINT8 buf[8] = { 0 }; if (NULL == tag) { @@ -254,7 +254,7 @@ INT8 parse_lastbit(struct tag_head *tag) INT8 parse_repeat_times(struct tag_head *tag) { - char asc_code[8] = {0}; + char asc_code[8] = { 0 }; if (NULL == tag) { return IR_DECODE_FAILED; @@ -270,7 +270,7 @@ INT8 parse_repeat_times(struct tag_head *tag) INT8 parse_delay_code_tag48_pos(UINT8 *buf) { UINT16 i = 0; - UINT8 data[64] = {0}, start[8] = {0}; + UINT8 data[64] = { 0 }, start[8] = { 0 }; if (NULL == buf) { @@ -297,7 +297,7 @@ INT8 parse_bit_num(struct tag_head *tag) { UINT16 i = 0; UINT16 preindex = 0; - UINT8 buf[64] = {0}; + UINT8 buf[64] = { 0 }; if (NULL == tag) { diff --git a/cc26xx-example/ti/BLE-CC264x/ble_cc26xx/Projects/ble/SimpleBLEPeripheral-IREXT/CC26xx/Source/Application/ir_decoder/src/ir_decode.c b/cc26xx-example/ti/BLE-CC264x/ble_cc26xx/Projects/ble/SimpleBLEPeripheral-IREXT/CC26xx/Source/Application/ir_decoder/src/ir_decode.c index 299d4ef..ce86a3a 100644 --- a/cc26xx-example/ti/BLE-CC264x/ble_cc26xx/Projects/ble/SimpleBLEPeripheral-IREXT/CC26xx/Source/Application/ir_decoder/src/ir_decode.c +++ b/cc26xx-example/ti/BLE-CC264x/ble_cc26xx/Projects/ble/SimpleBLEPeripheral-IREXT/CC26xx/Source/Application/ir_decoder/src/ir_decode.c @@ -22,6 +22,8 @@ Revision log: struct ir_bin_buffer binary_file; struct ir_bin_buffer *p_ir_buffer = &binary_file; +const char* release = "0.2.1"; + #if defined USE_DYNAMIC_TAG struct tag_head *tags; #else @@ -31,7 +33,7 @@ struct tag_head tags[TAG_COUNT_FOR_PROTOCOL]; UINT8 *ir_hex_code = NULL; UINT8 ir_hex_len = 0; -UINT8 byteArray[PROTOCOL_SIZE] = {0}; +UINT8 byteArray[PROTOCOL_SIZE] = { 0 }; size_t binary_length = 0; UINT8 *binary_content = NULL; @@ -175,7 +177,8 @@ INT8 ir_binary_open(const UINT8 category, const UINT8 sub_category, UINT8* binar } -UINT16 ir_decode(UINT8 key_code, UINT16* user_data, t_remote_ac_status* ac_status, BOOL change_wind_direction) +UINT16 ir_decode(UINT8 key_code, UINT16* user_data, + t_remote_ac_status* ac_status, BOOL change_wind_direction) { if (IR_TYPE_COMMANDS == ir_binary_type) { @@ -187,6 +190,13 @@ UINT16 ir_decode(UINT8 key_code, UINT16* user_data, t_remote_ac_status* ac_statu { return 0; } + ir_printf("ac status is not null in decode core : power = %d, mode = %d, " + "temp = %d, wind_dir = %d, wind_speed = %d, " + "keycode = %d, change_wind_direction = %d\n", + ac_status->ac_power, ac_status->ac_mode, + ac_status->ac_temp, ac_status->ac_wind_dir, + ac_status->ac_wind_speed, + key_code, change_wind_direction); return ir_ac_control(*ac_status, user_data, key_code, change_wind_direction); } } @@ -196,10 +206,12 @@ INT8 ir_close() { if (IR_TYPE_COMMANDS == ir_binary_type) { + ir_printf("tv binary close\n"); return ir_tv_binary_close(); } else { + ir_printf("ac binary close\n"); return ir_ac_binary_close(); } } @@ -273,7 +285,7 @@ static INT8 ir_ac_binary_open(UINT8 *binary, UINT16 binary_length) return IR_DECODE_SUCCEEDED; } -static UINT16 ir_ac_control(t_remote_ac_status ac_status, UINT16 *user_data, UINT8 function_code, +static UINT16 ir_ac_control(t_remote_ac_status ac_status, UINT16 *user_data, UINT8 key_code, BOOL change_wind_direction) { UINT16 time_length = 0; @@ -282,6 +294,36 @@ static UINT16 ir_ac_control(t_remote_ac_status ac_status, UINT16 *user_data, UIN UINT16 i = 0; #endif + UINT8 function_code = 0; + + switch(key_code) + { + case 0: + function_code = AC_FUNCTION_POWER; + break; + case 1: + function_code = AC_FUNCTION_MODE; + break; + case 2: + function_code = AC_FUNCTION_TEMPERATURE_UP; + break; + case 3: + function_code = AC_FUNCTION_TEMPERATURE_DOWN; + break; + case 7: + function_code = AC_FUNCTION_TEMPERATURE_UP; + break; + case 8: + function_code = AC_FUNCTION_TEMPERATURE_DOWN; + break; + case 9: + function_code = AC_FUNCTION_WIND_SPEED; + break; + case 10: + function_code = AC_FUNCTION_WIND_SWING; + break; + } + if (0 == context->default_code.len) { ir_printf("\ndefault code is empty\n"); @@ -646,6 +688,25 @@ static INT8 ir_tv_binary_close() } //////// TV End //////// +// combo decode for JNI which means call open, decode and then close in one JNI call +UINT16 ir_decode_combo(const UINT8 category, const UINT8 sub_category, + UINT8* binary, UINT16 binary_length, + UINT8 key_code, UINT16* user_data, + t_remote_ac_status* ac_status, BOOL change_wind_direction) +{ + UINT16 decoded_length = 0; + if (IR_DECODE_SUCCEEDED == + ir_binary_open(category, sub_category, binary, binary_length)) + { + decoded_length = ir_decode(key_code, user_data, ac_status, change_wind_direction); + ir_close(); + return decoded_length; + } + else + { + return 0; + } +} #if (defined BOARD_PC || defined BOARD_PC_DLL) void ir_lib_free_inner_buffer() diff --git a/cc26xx-example/ti/BLE-CC264x/ble_cc26xx/Projects/ble/SimpleBLEPeripheral-IREXT/CC26xx/Source/Application/ir_decoder/src/ir_tv_control.c b/cc26xx-example/ti/BLE-CC264x/ble_cc26xx/Projects/ble/SimpleBLEPeripheral-IREXT/CC26xx/Source/Application/ir_decoder/src/ir_tv_control.c index f116b35..dd7869a 100644 --- a/cc26xx-example/ti/BLE-CC264x/ble_cc26xx/Projects/ble/SimpleBLEPeripheral-IREXT/CC26xx/Source/Application/ir_decoder/src/ir_tv_control.c +++ b/cc26xx-example/ti/BLE-CC264x/ble_cc26xx/Projects/ble/SimpleBLEPeripheral-IREXT/CC26xx/Source/Application/ir_decoder/src/ir_tv_control.c @@ -315,7 +315,7 @@ static void print_ir_time(t_ir_data *data, UINT8 key_index, UINT16 *ir_time) } else if (ir_decode_flag == IRDA_DECODE_2_BITS) { - // for quanternary formatted code + // for quaternary formatted code process_decode_number(key_code, data, 2, ir_time); } else if (ir_decode_flag == IRDA_DECODE_4_BITS) diff --git a/jni-example/decodesdk/libs/ir_decode_0.2.1-linux-x64.so b/jni-example/decodesdk/libs/ir_decode_0.2.1-linux-x64.so new file mode 100644 index 0000000000000000000000000000000000000000..85bdf33a8727cc2673db9b198e263c8a541253aa GIT binary patch literal 59368 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 I5W95#FHp`eg#Z8m diff --git a/jni-example/decodesdk/src/net/irext/decode/sdk/IRDecode.java b/jni-example/decodesdk/src/net/irext/decode/sdk/IRDecode.java index 1bfb76e..8a656ae 100644 --- a/jni-example/decodesdk/src/net/irext/decode/sdk/IRDecode.java +++ b/jni-example/decodesdk/src/net/irext/decode/sdk/IRDecode.java @@ -49,7 +49,7 @@ public class IRDecode { } private IRDecode() { - String libPath = "/data/irext/libirda_decoder.so"; + String libPath = "/data/irext/ir_decode_0.2.1-linux-x64.so"; System.out.println("loading decode library " + libPath); System.load(libPath); } diff --git a/win32-example/DecodeTestWin/ir_decoder/include/ir_decode.h b/win32-example/DecodeTestWin/ir_decoder/include/ir_decode.h index b2fff07..4132128 100644 --- a/win32-example/DecodeTestWin/ir_decoder/include/ir_decode.h +++ b/win32-example/DecodeTestWin/ir_decoder/include/ir_decode.h @@ -34,6 +34,168 @@ extern "C" #define SUB_CATEGORY_QUATERNARY 0 #define SUB_CATEGORY_HEXADECIMAL 1 +// remote control key definition +#define KEY_TV_POWER 0 +#define KEY_TV_MUTE 1 +#define KEY_TV_UP 2 +#define KEY_TV_DOWN 3 +#define KEY_TV_LEFT 4 +#define KEY_TV_RIGHT 5 +#define KEY_TV_OK 6 +#define KEY_TV_VOL_PLUS 7 +#define KEY_TV_VOL_MINUS 8 +#define KEY_TV_BACK 9 +#define KEY_TV_INPUT 10 +#define KEY_TV_MENU 11 +#define KEY_TV_HOME 12 +#define KEY_TV_SETTINGS 13 + +#define KEY_AC_POWER 0 +#define KEY_AC_TEMP_PLUS 1 +#define KEY_AC_TEMP_MINUS 2 +#define KEY_AC_MODE_SWITCH 8 +#define KEY_AC_WIND_SPEED 9 +#define KEY_AC_WIND_DIRECTION 10 + +#define KEY_STB_POWER 0 +#define KEY_STB_MUTE 1 +#define KEY_STB_UP 2 +#define KEY_STB_DOWN 3 +#define KEY_STB_LEFT 4 +#define KEY_STB_RIGHT 5 +#define KEY_STB_OK 6 +#define KEY_STB_VOL_PLUS 7 +#define KEY_STB_VOL_MINUS 8 +#define KEY_STB_BACK 9 +#define KEY_STB_INPUT 10 +#define KEY_STB_MENU 11 +#define KEY_STB_PAGE_UP 12 +#define KEY_STB_PAGE_DOWN 13 + +#define KEY_NETBOX_POWER 0 +#define KEY_NETBOX_UP 1 +#define KEY_NETBOX_DOWN 2 +#define KEY_NETBOX_LEFT 3 +#define KEY_NETBOX_RIGHT 4 +#define KEY_NETBOX_OK 5 +#define KEY_NETBOX_VOL_PLUS 6 +#define KEY_NETBOX_VOL_MINUS 7 +#define KEY_NETBOX_BACK 8 +#define KEY_NETBOX_MENU 9 +#define KEY_NETBOX_HOME 10 + +#define KEY_IPTV_POWER 0 +#define KEY_IPTV_MUTE 1 +#define KEY_IPTV_UP 2 +#define KEY_IPTV_DOWN 3 +#define KEY_IPTV_LEFT 4 +#define KEY_IPTV_RIGHT 5 +#define KEY_IPTV_OK 6 +#define KEY_IPTV_VOL_PLUS 7 +#define KEY_IPTV_VOL_MINUS 8 +#define KEY_IPTV_BACK 9 +#define KEY_IPTV_INPUT 10 +#define KEY_IPTV_MENU 11 +#define KEY_IPTV_PAGE_UP 12 +#define KEY_IPTV_PAGE_DOWN 13 + +#define KEY_DVD_POWER 0 +#define KEY_DVD_UP 1 +#define KEY_DVD_DOWN 2 +#define KEY_DVD_LEFT 3 +#define KEY_DVD_RIGHT 4 +#define KEY_DVD_OK 5 +#define KEY_DVD_VOL_PLUS 6 +#define KEY_DVD_VOL_MINUS 7 +#define KEY_DVD_PLAY 8 +#define KEY_DVD_PAUSE 9 +#define KEY_DVD_EJECT 10 +#define KEY_DVD_REWIND 11 +#define KEY_DVD_FASTFORWARD 12 +#define KEY_DVD_MENU 13 + +#define KEY_FAN_POWER 0 +#define KEY_FAN_WIND_PLUS 6 +#define KEY_FAN_WIND_MUNIS 7 +#define KEY_FAN_SWING 8 +#define KEY_FAN_WIND_SPEED 9 +#define KEY_FAN_WIND_TYPE 10 + +#define KEY_PROJECTOR_POWER 0 +#define KEY_PROJECTOR_UP 1 +#define KEY_PROJECTOR_DOWN 2 +#define KEY_PROJECTOR_LEFT 3 +#define KEY_PROJECTOR_RIGHT 4 +#define KEY_PROJECTOR_OK 5 +#define KEY_PROJECTOR_VOL_PLUS 6 +#define KEY_PROJECTOR_VOL_MINUS 7 +#define KEY_PROJECTOR_ZOOM_OUT 8 +#define KEY_PROJECTOR_MENU 9 +#define KEY_PROJECTOR_ZOOM_IN 10 +#define KEY_PROJECTOR_BACK 11 + +#define KEY_STEREO_POWER 0 +#define KEY_STEREO_UP 1 +#define KEY_STEREO_DOWN 2 +#define KEY_STEREO_LEFT 3 +#define KEY_STEREO_RIGHT 4 +#define KEY_STEREO_OK 5 +#define KEY_STEREO_VOL_PLUS 6 +#define KEY_STEREO_VOL_MINUS 7 +#define KEY_STEREO_MUTE 8 +#define KEY_STEREO_MENU 9 + +#define KEY_BULB_POWER 0 +#define KEY_BULB_COLOR_1 1 +#define KEY_BULB_COLOR_2 2 +#define KEY_BULB_COLOR_3 3 +#define KEY_BULB_COLOR_4 4 +#define KEY_BULB_COLOR_0 5 +#define KEY_BULB_BRIGHT_PLUS 6 +#define KEY_BULB_BRIGHT_MINUS 7 +#define KEY_BULB_BRIGHT_POWER_ON 8 +#define KEY_BULB_BRIGHT_RAINBOW 9 +#define KEY_BULB_BRIGHT_POWER_OFF 10 + +#define KEY_CLEANROBOT_POWER 0 +#define KEY_CLEANROBOT_FOWWARD 1 +#define KEY_CLEANROBOT_BACKWARD 2 +#define KEY_CLEANROBOT_LEFT 3 +#define KEY_CLEANROBOT_RIGHT 4 +#define KEY_CLEANROBOT_START 5 +#define KEY_CLEANROBOT_STOP 6 +#define KEY_CLEANROBOT_AUTO 8 +#define KEY_CLEANROBOT_SPOT 9 +#define KEY_CLEANROBOT_SPEED 10 +#define KEY_CLEANROBOT_TIMER 11 +#define KEY_CLEANROBOT_CHARGE 12 +#define KEY_CLEANROBOT_PRESERVE 13 + +#define KEY_AIRCLEANER_POWER 0 +#define KEY_AIRCLEANER_ION 5 +#define KEY_AIRCLEANER_AUTO 8 +#define KEY_AIRCLEANER_WIND_SPEED 9 +#define KEY_AIRCLEANER_MODE_SWITCH 10 +#define KEY_AIRCLEANER_TIMER 11 +#define KEY_AIRCLEANER_LIGHT 12 +#define KEY_AIRCLEANER_FORCE 13 + +#define KEY_DYSON_POWER 0 +#define KEY_DYSON_WIND_SPEED_PLUS 1 +#define KEY_DYSON_WIND_SPEED_MINUS 2 +#define KEY_DYSON_TIMER_MINUS 3 +#define KEY_DYSON_TIMER_PLUS 4 +#define KEY_DYSON_AUTO 5 +#define KEY_DYSON_TEMP_PLUS 6 +#define KEY_DYSON_TEMP_MINUS 7 +#define KEY_DYSON_SWING 8 +#define KEY_DYSON_DIFFUSION 9 +#define KEY_DYSON_FAV 10 +#define KEY_DYSON_TIMER 11 +#define KEY_DYSON_SLEEP 12 +#define KEY_DYSON_COOL 13 + + // exported functions /** * function ir_file_open @@ -153,6 +315,12 @@ extern INT8 get_supported_wind_direction(UINT8 *supported_wind_direction); extern void ir_lib_free_inner_buffer(); #endif +// this function is preferred being called by JNI only +UINT16 ir_decode_combo(const UINT8 category, const UINT8 sub_category, + UINT8* binary, UINT16 binary_length, + UINT8 key_code, UINT16* user_data, + t_remote_ac_status* ac_status, BOOL change_wind_direction); + #ifdef __cplusplus } #endif diff --git a/win32-example/DecodeTestWin/ir_decoder/include/ir_defs.h b/win32-example/DecodeTestWin/ir_decoder/include/ir_defs.h index b16e660..940e6b5 100644 --- a/win32-example/DecodeTestWin/ir_decoder/include/ir_defs.h +++ b/win32-example/DecodeTestWin/ir_decoder/include/ir_defs.h @@ -32,6 +32,11 @@ extern "C" #define FORMAT_HEX 16 #define FORMAT_DECIMAL 10 +// #define USE_DYNAMIC_TAG 1 + +#if defined USE_DYNAMIC_TAG +#include +#endif typedef unsigned char UINT8; typedef signed char INT8; @@ -54,12 +59,13 @@ void noprint(const char *fmt, ...); #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) +#if ((defined BOARD_PC) || (defined BOARD_PC_JNI)) && (defined DEBUG) #define ir_printf printf #else #define ir_printf noprint #endif #define USER_DATA_SIZE 1636 +// #define USER_DATA_SIZE 4096 #ifdef __cplusplus } diff --git a/win32-example/DecodeTestWin/ir_decoder/src/ir_ac_apply.c b/win32-example/DecodeTestWin/ir_decoder/src/ir_ac_apply.c index 905ddc8..267df48 100644 --- a/win32-example/DecodeTestWin/ir_decoder/src/ir_ac_apply.c +++ b/win32-example/DecodeTestWin/ir_decoder/src/ir_ac_apply.c @@ -495,6 +495,11 @@ static INT8 apply_checksum_spec_byte_onebyte(UINT8 *ac_code, t_tag_checksum_data static UINT8 has_function(struct ac_protocol *protocol, UINT8 function) { + if (function < AC_FUNCTION_POWER || function > AC_FUNCTION_WIND_FIX) + { + return FALSE; + } + if (0 != protocol->function1.len) { if (0 != protocol->function1.comp_data[function - 1].seg_len) @@ -518,6 +523,11 @@ INT8 apply_function(struct ac_protocol *protocol, UINT8 function) { UINT16 i = 0; + if (function < AC_FUNCTION_POWER || function > AC_FUNCTION_WIND_FIX) + { + return IR_DECODE_FAILED; + } + // function index starts from 1 (AC_FUNCTION_POWER), do -1 operation at first if (0 == protocol->function1.len) { diff --git a/win32-example/DecodeTestWin/ir_decoder/src/ir_ac_parse_forbidden_info.c b/win32-example/DecodeTestWin/ir_decoder/src/ir_ac_parse_forbidden_info.c index 0ea1c47..331a243 100644 --- a/win32-example/DecodeTestWin/ir_decoder/src/ir_ac_parse_forbidden_info.c +++ b/win32-example/DecodeTestWin/ir_decoder/src/ir_ac_parse_forbidden_info.c @@ -22,7 +22,7 @@ extern t_ac_protocol *context; INT8 parse_nmode_data_speed(char *pdata, t_ac_n_mode seq) { - char buf[16] = {0}; + char buf[16] = { 0 }; char *p = pdata; UINT16 pos = 0; UINT16 cnt = 0, index = 0; @@ -47,7 +47,7 @@ INT8 parse_nmode_data_speed(char *pdata, t_ac_n_mode seq) INT8 parse_nmode_data_temp(char *pdata, t_ac_n_mode seq) { - char buf[16] = {0}; + char buf[16] = { 0 }; char *p = pdata; UINT16 pos = 0; UINT16 cnt = 0, index = 0; @@ -71,8 +71,8 @@ INT8 parse_nmode_data_temp(char *pdata, t_ac_n_mode seq) INT8 parse_nmode_pos(char *buf, t_ac_n_mode index) { UINT16 i = 0; - char data[64] = {0}; - // char start[8] = {0}; + char data[64] = { 0 }; + // char start[8] = { 0 }; if (ir_strlen(buf) == 1) { if (buf[0] == 'S' || buf[0] == 's') @@ -111,7 +111,7 @@ INT8 parse_nmode(struct tag_head *tag, t_ac_n_mode index) UINT16 i = 0; UINT16 preindex = 0; - char buf[64] = {0}; + char buf[64] = { 0 }; if (tag->p_data[0] == 'N' && tag->p_data[1] == 'A') { diff --git a/win32-example/DecodeTestWin/ir_decoder/src/ir_ac_parse_frame_info.c b/win32-example/DecodeTestWin/ir_decoder/src/ir_ac_parse_frame_info.c index b96bca1..0a86f46 100644 --- a/win32-example/DecodeTestWin/ir_decoder/src/ir_ac_parse_frame_info.c +++ b/win32-example/DecodeTestWin/ir_decoder/src/ir_ac_parse_frame_info.c @@ -19,7 +19,7 @@ Revision log: INT8 parse_boot_code(struct tag_head *tag) { - UINT8 buf[16] = {0}; + UINT8 buf[16] = { 0 }; UINT8 *p = NULL; UINT16 pos = 0; UINT16 cnt = 0, index = 0; @@ -53,8 +53,8 @@ INT8 parse_boot_code(struct tag_head *tag) INT8 parse_zero(struct tag_head *tag) { - UINT8 low[16] = {0}; - UINT8 high[16] = {0}; + UINT8 low[16] = { 0 }; + UINT8 high[16] = { 0 }; UINT16 index = 0; UINT8 *p = NULL; @@ -84,8 +84,8 @@ INT8 parse_zero(struct tag_head *tag) INT8 parse_one(struct tag_head *tag) { - UINT8 low[16] = {0}; - UINT8 high[16] = {0}; + UINT8 low[16] = { 0 }; + UINT8 high[16] = { 0 }; UINT16 index = 0; UINT8 *p = NULL; @@ -115,7 +115,7 @@ INT8 parse_one(struct tag_head *tag) INT8 parse_delay_code_data(UINT8 *pdata) { - UINT8 buf[16] = {0}; + UINT8 buf[16] = { 0 }; UINT8 *p = NULL; UINT16 pos = 0; UINT16 cnt = 0, index = 0; @@ -146,7 +146,7 @@ INT8 parse_delay_code_data(UINT8 *pdata) INT8 parse_delay_code_pos(UINT8 *buf) { UINT16 i = 0; - UINT8 data[64] = {0}, start[8] = {0}; + UINT8 data[64] = { 0 }, start[8] = { 0 }; if (NULL == buf) { @@ -171,7 +171,7 @@ INT8 parse_delay_code_pos(UINT8 *buf) INT8 parse_delay_code(struct tag_head *tag) { - UINT8 buf[64] = {0}; + UINT8 buf[64] = { 0 }; UINT16 i = 0; UINT16 preindex = 0; preindex = 0; @@ -228,7 +228,7 @@ INT8 parse_frame_len(struct tag_head *tag, UINT16 len) INT8 parse_endian(struct tag_head *tag) { - UINT8 buf[8] = {0}; + UINT8 buf[8] = { 0 }; if (NULL == tag) { @@ -241,7 +241,7 @@ INT8 parse_endian(struct tag_head *tag) INT8 parse_lastbit(struct tag_head *tag) { - UINT8 buf[8] = {0}; + UINT8 buf[8] = { 0 }; if (NULL == tag) { @@ -254,7 +254,7 @@ INT8 parse_lastbit(struct tag_head *tag) INT8 parse_repeat_times(struct tag_head *tag) { - char asc_code[8] = {0}; + char asc_code[8] = { 0 }; if (NULL == tag) { return IR_DECODE_FAILED; @@ -270,7 +270,7 @@ INT8 parse_repeat_times(struct tag_head *tag) INT8 parse_delay_code_tag48_pos(UINT8 *buf) { UINT16 i = 0; - UINT8 data[64] = {0}, start[8] = {0}; + UINT8 data[64] = { 0 }, start[8] = { 0 }; if (NULL == buf) { @@ -297,7 +297,7 @@ INT8 parse_bit_num(struct tag_head *tag) { UINT16 i = 0; UINT16 preindex = 0; - UINT8 buf[64] = {0}; + UINT8 buf[64] = { 0 }; if (NULL == tag) { diff --git a/win32-example/DecodeTestWin/ir_decoder/src/ir_decode.c b/win32-example/DecodeTestWin/ir_decoder/src/ir_decode.c index a60d202..227fbe2 100644 --- a/win32-example/DecodeTestWin/ir_decoder/src/ir_decode.c +++ b/win32-example/DecodeTestWin/ir_decoder/src/ir_decode.c @@ -22,6 +22,8 @@ Revision log: struct ir_bin_buffer binary_file; struct ir_bin_buffer *p_ir_buffer = &binary_file; +const char* release = "0.2.1"; + #if defined USE_DYNAMIC_TAG struct tag_head *tags; #else @@ -31,7 +33,7 @@ struct tag_head tags[TAG_COUNT_FOR_PROTOCOL]; UINT8 *ir_hex_code = NULL; UINT8 ir_hex_len = 0; -UINT8 byteArray[PROTOCOL_SIZE] = {0}; +UINT8 byteArray[PROTOCOL_SIZE] = { 0 }; size_t binary_length = 0; UINT8 *binary_content = NULL; @@ -53,12 +55,19 @@ lp_apply_ac_parameter apply_table[AC_APPLY_MAX] = }; // static functions declarations +#if !defined NO_FS static INT8 ir_ac_file_open(const char *file_name); +#endif + static INT8 ir_ac_binary_open(UINT8 *binary, UINT16 binary_length); static UINT16 ir_ac_control(t_remote_ac_status ac_status, UINT16 *user_data, UINT8 function_code, BOOL change_wind_direction); static INT8 ir_ac_binary_close(); + +#if !defined NO_FS static INT8 ir_tv_file_open(const char *file_name); +#endif + static INT8 ir_tv_binary_open(UINT8 *binary, UINT16 binary_length); static INT8 ir_tv_binary_parse(UINT8 ir_hex_encode); static UINT16 ir_tv_control(UINT8 key, UINT16 *l_user_data); @@ -118,7 +127,7 @@ INT8 ir_file_open(const UINT8 category, const UINT8 sub_category, const char* fi #else INT8 ir_file_open(const UINT8 category, const UINT8 sub_category, const char* file_name) { - return IR_DECODE_SUCCESS; + return IR_DECODE_SUCCEEDED; } #endif @@ -168,7 +177,8 @@ INT8 ir_binary_open(const UINT8 category, const UINT8 sub_category, UINT8* binar } -UINT16 ir_decode(UINT8 key_code, UINT16* user_data, t_remote_ac_status* ac_status, BOOL change_wind_direction) +UINT16 ir_decode(UINT8 key_code, UINT16* user_data, + t_remote_ac_status* ac_status, BOOL change_wind_direction) { if (IR_TYPE_COMMANDS == ir_binary_type) { @@ -180,6 +190,13 @@ UINT16 ir_decode(UINT8 key_code, UINT16* user_data, t_remote_ac_status* ac_statu { return 0; } + ir_printf("ac status is not null in decode core : power = %d, mode = %d, " + "temp = %d, wind_dir = %d, wind_speed = %d, " + "keycode = %d, change_wind_direction = %d\n", + ac_status->ac_power, ac_status->ac_mode, + ac_status->ac_temp, ac_status->ac_wind_dir, + ac_status->ac_wind_speed, + key_code, change_wind_direction); return ir_ac_control(*ac_status, user_data, key_code, change_wind_direction); } } @@ -189,10 +206,12 @@ INT8 ir_close() { if (IR_TYPE_COMMANDS == ir_binary_type) { + ir_printf("tv binary close\n"); return ir_tv_binary_close(); } else { + ir_printf("ac binary close\n"); return ir_ac_binary_close(); } } @@ -206,9 +225,9 @@ void ir_lib_free_inner_buffer(); // static function definitions //////// AC Begin //////// +#if !defined NO_FS static INT8 ir_ac_file_open(const char *file_name) { -#if !defined NO_FS size_t ret = 0; #if !defined WIN32 FILE *stream = fopen(file_name, "rb"); @@ -252,9 +271,9 @@ static INT8 ir_ac_file_open(const char *file_name) binary_length = 0; return IR_DECODE_FAILED; } -#endif return IR_DECODE_SUCCEEDED; } +#endif static INT8 ir_ac_binary_open(UINT8 *binary, UINT16 binary_length) { @@ -266,7 +285,7 @@ static INT8 ir_ac_binary_open(UINT8 *binary, UINT16 binary_length) return IR_DECODE_SUCCEEDED; } -static UINT16 ir_ac_control(t_remote_ac_status ac_status, UINT16 *user_data, UINT8 function_code, +static UINT16 ir_ac_control(t_remote_ac_status ac_status, UINT16 *user_data, UINT8 key_code, BOOL change_wind_direction) { UINT16 time_length = 0; @@ -275,6 +294,36 @@ static UINT16 ir_ac_control(t_remote_ac_status ac_status, UINT16 *user_data, UIN UINT16 i = 0; #endif + UINT8 function_code = 0; + + switch(key_code) + { + case 0: + function_code = AC_FUNCTION_POWER; + break; + case 1: + function_code = AC_FUNCTION_MODE; + break; + case 2: + function_code = AC_FUNCTION_TEMPERATURE_UP; + break; + case 3: + function_code = AC_FUNCTION_TEMPERATURE_DOWN; + break; + case 7: + function_code = AC_FUNCTION_TEMPERATURE_UP; + break; + case 8: + function_code = AC_FUNCTION_TEMPERATURE_DOWN; + break; + case 9: + function_code = AC_FUNCTION_WIND_SPEED; + break; + case 10: + function_code = AC_FUNCTION_WIND_SWING; + break; + } + if (0 == context->default_code.len) { ir_printf("\ndefault code is empty\n"); @@ -543,9 +592,9 @@ INT8 get_supported_wind_direction(UINT8 *supported_wind_direction) //////// AC End //////// //////// TV Begin //////// +#if !defined NO_FS static INT8 ir_tv_file_open(const char *file_name) { -#if !defined NO_FS size_t ret = 0; #if !defined WIN32 @@ -590,9 +639,9 @@ static INT8 ir_tv_file_open(const char *file_name) binary_length = 0; return IR_DECODE_FAILED; } -#endif return IR_DECODE_SUCCEEDED; } +#endif static INT8 ir_tv_binary_open(UINT8 *binary, UINT16 binary_length) { @@ -639,6 +688,25 @@ static INT8 ir_tv_binary_close() } //////// TV End //////// +// combo decode for JNI which means call open, decode and then close in one JNI call +UINT16 ir_decode_combo(const UINT8 category, const UINT8 sub_category, + UINT8* binary, UINT16 binary_length, + UINT8 key_code, UINT16* user_data, + t_remote_ac_status* ac_status, BOOL change_wind_direction) +{ + UINT16 decoded_length = 0; + if (IR_DECODE_SUCCEEDED == + ir_binary_open(category, sub_category, binary, binary_length)) + { + decoded_length = ir_decode(key_code, user_data, ac_status, change_wind_direction); + ir_close(); + return decoded_length; + } + else + { + return 0; + } +} #if (defined BOARD_PC || defined BOARD_PC_DLL) void ir_lib_free_inner_buffer() diff --git a/win32-example/DecodeTestWin/ir_decoder/src/ir_tv_control.c b/win32-example/DecodeTestWin/ir_decoder/src/ir_tv_control.c index f116b35..dd7869a 100644 --- a/win32-example/DecodeTestWin/ir_decoder/src/ir_tv_control.c +++ b/win32-example/DecodeTestWin/ir_decoder/src/ir_tv_control.c @@ -315,7 +315,7 @@ static void print_ir_time(t_ir_data *data, UINT8 key_index, UINT16 *ir_time) } else if (ir_decode_flag == IRDA_DECODE_2_BITS) { - // for quanternary formatted code + // for quaternary formatted code process_decode_number(key_code, data, 2, ir_time); } else if (ir_decode_flag == IRDA_DECODE_4_BITS)