diff --git a/android-example/app/build.gradle b/android-example/app/build.gradle index 9668410..3a24a5e 100644 --- a/android-example/app/build.gradle +++ b/android-example/app/build.gradle @@ -6,8 +6,8 @@ android { compileSdk 36 targetSdkVersion 36 minSdkVersion 26 - versionCode 7 - versionName '1.5.0' + versionCode 8 + versionName '1.5.2' } buildTypes { diff --git a/android-example/decodesdk/ir_decoder/src/include/ir_ac_apply.h b/android-example/decodesdk/ir_decoder/src/include/ir_ac_apply.h index af68831..4c149cf 100644 --- a/android-example/decodesdk/ir_decoder/src/include/ir_ac_apply.h +++ b/android-example/decodesdk/ir_decoder/src/include/ir_ac_apply.h @@ -26,15 +26,15 @@ extern "C" #define MIN_TAG_LENGTH_TYPE_1 4 #define MIN_TAG_LENGTH_TYPE_2 6 -INT8 apply_power(t_remote_ac_status ac_status, UINT8 function_code); +INT8 apply_power(t_remote_ac_status *ac_status, UINT8 function_code); -INT8 apply_mode(t_remote_ac_status ac_status, UINT8 function_code); +INT8 apply_mode(t_remote_ac_status *ac_status, UINT8 function_code); -INT8 apply_wind_speed(t_remote_ac_status ac_status, UINT8 function_code); +INT8 apply_wind_speed(t_remote_ac_status *ac_status, UINT8 function_code); -INT8 apply_swing(t_remote_ac_status ac_status, UINT8 function_code); +INT8 apply_swing(t_remote_ac_status *ac_status, UINT8 function_code); -INT8 apply_temperature(t_remote_ac_status ac_status, UINT8 function_code); +INT8 apply_temperature(t_remote_ac_status *ac_status, UINT8 function_code); INT8 apply_function(struct ac_protocol *protocol, UINT8 function); diff --git a/android-example/decodesdk/ir_decoder/src/include/ir_ac_control.h b/android-example/decodesdk/ir_decoder/src/include/ir_ac_control.h index 68bf99f..16d8406 100644 --- a/android-example/decodesdk/ir_decoder/src/include/ir_ac_control.h +++ b/android-example/decodesdk/ir_decoder/src/include/ir_ac_control.h @@ -342,7 +342,7 @@ typedef struct ac_protocol UINT8 swing_status; - BOOL change_wind_direction; + UINT8 change_wind_direction; UINT16 dc_cnt; t_ac_bit_num bit_num[MAX_BITNUM]; @@ -382,10 +382,11 @@ typedef struct REMOTE_AC_STATUS UINT8 ac_display; UINT8 ac_sleep; UINT8 ac_timer; + UINT8 change_wind_direction; } t_remote_ac_status; // function polymorphism -typedef INT8 (*lp_apply_ac_parameter)(t_remote_ac_status ac_status, UINT8 function_code); +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 diff --git a/android-example/decodesdk/ir_decoder/src/include/ir_decode.h b/android-example/decodesdk/ir_decoder/src/include/ir_decode.h index 6d7ebeb..e237e41 100644 --- a/android-example/decodesdk/ir_decoder/src/include/ir_decode.h +++ b/android-example/decodesdk/ir_decoder/src/include/ir_decode.h @@ -276,11 +276,10 @@ extern INT8 ir_binary_open(const UINT8 category, const UINT8 sub_category, UINT8 * 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); +extern UINT16 ir_decode(UINT8 key_code, UINT16* user_data, t_remote_ac_status* ac_status); /** * function ir_close @@ -362,7 +361,7 @@ extern void ir_lib_free_inner_buffer(); UINT16 ir_decode_combo(const UINT8 category, const UINT8 sub_category, UINT8* binary, UINT16 bin_length, UINT8 key_code, UINT16* user_data, - t_remote_ac_status* ac_status, BOOL change_wind_direction); + t_remote_ac_status* ac_status); #ifdef __cplusplus } diff --git a/android-example/decodesdk/ir_decoder/src/include/ir_decode_jni.h b/android-example/decodesdk/ir_decoder/src/include/ir_decode_jni.h new file mode 100644 index 0000000..2175e99 --- /dev/null +++ b/android-example/decodesdk/ir_decoder/src/include/ir_decode_jni.h @@ -0,0 +1,155 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#if defined BOARD_ANDROID +#include +#elif (defined BOARD_PC) && (defined BOARD_PC_JNI) +#include "include/jni.h" +#endif +/* Header for class net_irext_decode_sdk_IRDecode */ + +#ifndef _Included_net_irext_decode_sdk_IRDecode +#define _Included_net_irext_decode_sdk_IRDecode +#ifdef __cplusplus +extern "C" { +#endif +#undef net_irext_decode_sdk_IRDecode_BIND_ABOVE_CLIENT +#define net_irext_decode_sdk_IRDecode_BIND_ABOVE_CLIENT 8L +#undef net_irext_decode_sdk_IRDecode_BIND_ADJUST_WITH_ACTIVITY +#define net_irext_decode_sdk_IRDecode_BIND_ADJUST_WITH_ACTIVITY 128L +#undef net_irext_decode_sdk_IRDecode_BIND_ALLOW_OOM_MANAGEMENT +#define net_irext_decode_sdk_IRDecode_BIND_ALLOW_OOM_MANAGEMENT 16L +#undef net_irext_decode_sdk_IRDecode_BIND_AUTO_CREATE +#define net_irext_decode_sdk_IRDecode_BIND_AUTO_CREATE 1L +#undef net_irext_decode_sdk_IRDecode_BIND_DEBUG_UNBIND +#define net_irext_decode_sdk_IRDecode_BIND_DEBUG_UNBIND 2L +#undef net_irext_decode_sdk_IRDecode_BIND_IMPORTANT +#define net_irext_decode_sdk_IRDecode_BIND_IMPORTANT 64L +#undef net_irext_decode_sdk_IRDecode_BIND_NOT_FOREGROUND +#define net_irext_decode_sdk_IRDecode_BIND_NOT_FOREGROUND 4L +#undef net_irext_decode_sdk_IRDecode_BIND_WAIVE_PRIORITY +#define net_irext_decode_sdk_IRDecode_BIND_WAIVE_PRIORITY 32L +#undef net_irext_decode_sdk_IRDecode_CONTEXT_IGNORE_SECURITY +#define net_irext_decode_sdk_IRDecode_CONTEXT_IGNORE_SECURITY 2L +#undef net_irext_decode_sdk_IRDecode_CONTEXT_INCLUDE_CODE +#define net_irext_decode_sdk_IRDecode_CONTEXT_INCLUDE_CODE 1L +#undef net_irext_decode_sdk_IRDecode_CONTEXT_RESTRICTED +#define net_irext_decode_sdk_IRDecode_CONTEXT_RESTRICTED 4L +#undef net_irext_decode_sdk_IRDecode_MODE_APPEND +#define net_irext_decode_sdk_IRDecode_MODE_APPEND 32768L +#undef net_irext_decode_sdk_IRDecode_MODE_ENABLE_WRITE_AHEAD_LOGGING +#define net_irext_decode_sdk_IRDecode_MODE_ENABLE_WRITE_AHEAD_LOGGING 8L +#undef net_irext_decode_sdk_IRDecode_MODE_MULTI_PROCESS +#define net_irext_decode_sdk_IRDecode_MODE_MULTI_PROCESS 4L +#undef net_irext_decode_sdk_IRDecode_MODE_PRIVATE +#define net_irext_decode_sdk_IRDecode_MODE_PRIVATE 0L +#undef net_irext_decode_sdk_IRDecode_MODE_WORLD_READABLE +#define net_irext_decode_sdk_IRDecode_MODE_WORLD_READABLE 1L +#undef net_irext_decode_sdk_IRDecode_MODE_WORLD_WRITEABLE +#define net_irext_decode_sdk_IRDecode_MODE_WORLD_WRITEABLE 2L +#undef net_irext_decode_sdk_IRDecode_START_CONTINUATION_MASK +#define net_irext_decode_sdk_IRDecode_START_CONTINUATION_MASK 15L +#undef net_irext_decode_sdk_IRDecode_START_FLAG_REDELIVERY +#define net_irext_decode_sdk_IRDecode_START_FLAG_REDELIVERY 1L +#undef net_irext_decode_sdk_IRDecode_START_FLAG_RETRY +#define net_irext_decode_sdk_IRDecode_START_FLAG_RETRY 2L +#undef net_irext_decode_sdk_IRDecode_START_NOT_STICKY +#define net_irext_decode_sdk_IRDecode_START_NOT_STICKY 2L +#undef net_irext_decode_sdk_IRDecode_START_REDELIVER_INTENT +#define net_irext_decode_sdk_IRDecode_START_REDELIVER_INTENT 3L +#undef net_irext_decode_sdk_IRDecode_START_STICKY +#define net_irext_decode_sdk_IRDecode_START_STICKY 1L +#undef net_irext_decode_sdk_IRDecode_START_STICKY_COMPATIBILITY +#define net_irext_decode_sdk_IRDecode_START_STICKY_COMPATIBILITY 0L + +/* + * Class: net_irext_decode_sdk_IRDecode + * Method: irOpen + * Signature: II(Ljava/lang/String;) + */ +JNIEXPORT jint JNICALL Java_net_irext_decode_sdk_IRDecode_irOpen + (JNIEnv *, jobject, jint, jint, jstring); + +/* + * Class: net_irext_decode_sdk_IRDecode + * Method: irOpenBinary + * Signature: II(Ljava/lang/String;) + */ +JNIEXPORT jint JNICALL Java_net_irext_decode_sdk_IRDecode_irOpenBinary + (JNIEnv *, jobject, jint, jint, jbyteArray, jint); + +/* + * Class: net_irext_decode_sdk_IRDecode + * Method: irDecode + * Signature: I(Lnet/irext/decodesdk/bean/ACStatus;I)[I + */ +JNIEXPORT jintArray JNICALL Java_net_irext_decode_sdk_IRDecode_irDecode + (JNIEnv *, jobject, jint, jobject); + +/* + * Class: net_irext_decode_sdk_IRDecode + * Method: irClose + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_net_irext_decode_sdk_IRDecode_irClose + (JNIEnv *, jobject); + +/* + * Class: net_irext_decode_sdk_IRDecode + * Method: irACGetTemperatureRange + * Signature: (I)Lcom/irext/remote/bean/jnibean/TemperatureRange; + */ +JNIEXPORT jobject JNICALL Java_net_irext_decode_sdk_IRDecode_irACGetTemperatureRange + (JNIEnv *, jobject, jint); + +/* + * Class: net_irext_decode_sdk_IRDecode + * Method: irACGetSupportedMode + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_net_irext_decode_sdk_IRDecode_irACGetSupportedMode + (JNIEnv *, jobject); + +/* + * Class: net_irext_decode_sdk_IRDecode + * Method: irACGetSupportedWindSpeed + * Signature: (I)I + */ +JNIEXPORT jint JNICALL Java_net_irext_decode_sdk_IRDecode_irACGetSupportedWindSpeed + (JNIEnv *, jobject, jint); + +/* + * Class: net_irext_decode_sdk_IRDecode + * Method: irACGetSupportedSwing + * Signature: (I)I + */ +JNIEXPORT jint JNICALL Java_net_irext_decode_sdk_IRDecode_irACGetSupportedSwing + (JNIEnv *, jobject, jint); + +/* + * Class: net_irext_decode_sdk_IRDecode + * Method: irACGetSupportedWindDirection + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_net_irext_decode_sdk_IRDecode_irACGetSupportedWindDirection + (JNIEnv *, jobject); + + +JNIEXPORT jintArray JNICALL Java_net_irext_decode_sdk_IRDecode_irDecodeCombo + (JNIEnv *env, jobject this_obj, jint category_id, jint sub_cate, + jbyteArray binaries, jint bin_length, + jint key_code, jobject jni_ac_status); + +#ifdef __cplusplus +} +#endif +#endif +/* Header for class net_irext_decode_sdk_IRDecode_LocalBinder */ + +#ifndef _Included_net_irext_decode_sdk_IRDecode_LocalBinder +#define _Included_net_irext_decode_sdk_IRDecode_LocalBinder +#ifdef __cplusplus +extern "C" { +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/android-example/decodesdk/ir_decoder/src/include/ir_defs.h b/android-example/decodesdk/ir_decoder/src/include/ir_defs.h index 9a9d8f6..5d09593 100644 --- a/android-example/decodesdk/ir_decoder/src/include/ir_defs.h +++ b/android-example/decodesdk/ir_decoder/src/include/ir_defs.h @@ -12,7 +12,9 @@ Revision log: #ifndef _IR_DEFS_H #define _IR_DEFS_H -#define IR_DECODE_LIB_VER "1.5.0" +#define IR_DECODE_LIB_VER "1.5.2" + +#define DEBUG (1) #if defined (BOARD_PC) #pragma ide diagnostic ignored "OCUnusedGlobalDeclarationInspection" @@ -29,10 +31,6 @@ extern "C" #define LOG_TAG "ir_decode" #endif -#if defined BOARD_CC26XX -#include "OSAL.h" -#endif - #define TRUE 1 #define FALSE 0 @@ -55,13 +53,8 @@ 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) @@ -71,7 +64,7 @@ void noprint(const char *fmt, ...); #else #define ir_printf noprint #endif -#define USER_DATA_SIZE 1636 +#define USER_DATA_SIZE 2048 // #define USER_DATA_SIZE 4096 #ifdef __cplusplus diff --git a/android-example/decodesdk/ir_decoder/src/include/ir_tv_control.h b/android-example/decodesdk/ir_decoder/src/include/ir_tv_control.h index 94f04ae..83f5bd4 100644 --- a/android-example/decodesdk/ir_decoder/src/include/ir_tv_control.h +++ b/android-example/decodesdk/ir_decoder/src/include/ir_tv_control.h @@ -78,7 +78,7 @@ typedef struct ir_data UINT8 index; } t_ir_data; -#if !defined BOARD_51 && !defined BOARD_STM8 +#if !defined BOARD_SOC #pragma pack(1) #endif typedef struct ir_cycles @@ -88,7 +88,7 @@ typedef struct ir_cycles UINT16 space; } t_ir_cycles; -#if !defined BOARD_51 && !defined BOARD_STM8 +#if !defined BOARD_SOC #pragma pack() #endif diff --git a/android-example/decodesdk/ir_decoder/src/ir_ac_apply.c b/android-example/decodesdk/ir_decoder/src/ir_ac_apply.c index 1dc8881..08c2e21 100644 --- a/android-example/decodesdk/ir_decoder/src/ir_ac_apply.c +++ b/android-example/decodesdk/ir_decoder/src/ir_ac_apply.c @@ -13,8 +13,8 @@ Revision log: #pragma ide diagnostic ignored "hicpp-signed-bitwise" #endif -#include "include/ir_utils.h" -#include "include/ir_ac_apply.h" +#include "ir_utils.h" +#include "ir_ac_apply.h" static INT8 apply_ac_power(struct ac_protocol *protocol, UINT8 power_status); @@ -616,17 +616,17 @@ INT8 apply_checksum(struct ac_protocol *protocol) return IR_DECODE_SUCCEEDED; } -INT8 apply_power(t_remote_ac_status ac_status, UINT8 function_code) +INT8 apply_power(t_remote_ac_status *ac_status, UINT8 function_code) { (void) function_code; - apply_ac_power(context, ac_status.ac_power); + apply_ac_power(context, ac_status->ac_power); return IR_DECODE_SUCCEEDED; } -INT8 apply_mode(t_remote_ac_status ac_status, UINT8 function_code) +INT8 apply_mode(t_remote_ac_status *ac_status, UINT8 function_code) { (void) function_code; - if (IR_DECODE_FAILED == apply_ac_mode(context, ac_status.ac_mode)) + if (IR_DECODE_FAILED == apply_ac_mode(context, ac_status->ac_mode)) { // do not implement this mechanism since mode, temperature, wind // speed would have unspecified function @@ -639,16 +639,16 @@ INT8 apply_mode(t_remote_ac_status ac_status, UINT8 function_code) return IR_DECODE_SUCCEEDED; } -INT8 apply_wind_speed(t_remote_ac_status ac_status, UINT8 function_code) +INT8 apply_wind_speed(t_remote_ac_status *ac_status, UINT8 function_code) { - if (FALSE == context->n_mode[ac_status.ac_mode].all_speed) + if (FALSE == context->n_mode[ac_status->ac_mode].all_speed) { // if this level is not in black list - if (!is_in(context->n_mode[ac_status.ac_mode].speed, - ac_status.ac_wind_speed, - context->n_mode[ac_status.ac_mode].speed_cnt)) + if (!is_in(context->n_mode[ac_status->ac_mode].speed, + ac_status->ac_wind_speed, + context->n_mode[ac_status->ac_mode].speed_cnt)) { - if (IR_DECODE_FAILED == apply_ac_wind_speed(context, ac_status.ac_wind_speed) && + if (IR_DECODE_FAILED == apply_ac_wind_speed(context, ac_status->ac_wind_speed) && function_code == AC_FUNCTION_WIND_SPEED) { // do not implement this mechanism since mode, temperature, wind @@ -689,7 +689,7 @@ INT8 apply_wind_speed(t_remote_ac_status ac_status, UINT8 function_code) return IR_DECODE_SUCCEEDED; } -INT8 apply_swing(t_remote_ac_status ac_status, UINT8 function_code) +INT8 apply_swing(t_remote_ac_status *ac_status, UINT8 function_code) { (void) ac_status; if (function_code == AC_FUNCTION_WIND_FIX) @@ -697,7 +697,7 @@ INT8 apply_swing(t_remote_ac_status ac_status, UINT8 function_code) // adjust fixed wind direction according to current status if (context->si.type == SWING_TYPE_NORMAL && context->si.mode_count > 1) { - if (TRUE == context->change_wind_direction) + if (1 == context->change_wind_direction) { context->si.dir_index++; } @@ -735,15 +735,15 @@ INT8 apply_swing(t_remote_ac_status ac_status, UINT8 function_code) return IR_DECODE_SUCCEEDED; } -INT8 apply_temperature(t_remote_ac_status ac_status, UINT8 function_code) +INT8 apply_temperature(t_remote_ac_status *ac_status, UINT8 function_code) { - if (FALSE == context->n_mode[ac_status.ac_mode].all_temp) + if (FALSE == context->n_mode[ac_status->ac_mode].all_temp) { - if (!is_in(context->n_mode[ac_status.ac_mode].temp, - ac_status.ac_temp, - context->n_mode[ac_status.ac_mode].temp_cnt)) + if (!is_in(context->n_mode[ac_status->ac_mode].temp, + ac_status->ac_temp, + context->n_mode[ac_status->ac_mode].temp_cnt)) { - if (IR_DECODE_FAILED == apply_ac_temperature(context, ac_status.ac_temp)) + if (IR_DECODE_FAILED == apply_ac_temperature(context, ac_status->ac_temp)) { if (function_code == AC_FUNCTION_TEMPERATURE_UP /*&& FALSE == has_function(context, AC_FUNCTION_TEMPERATURE_UP)*/) diff --git a/android-example/decodesdk/ir_decoder/src/ir_ac_binary_parse.c b/android-example/decodesdk/ir_decoder/src/ir_ac_binary_parse.c index de1f016..4b8ee1e 100644 --- a/android-example/decodesdk/ir_decoder/src/ir_ac_binary_parse.c +++ b/android-example/decodesdk/ir_decoder/src/ir_ac_binary_parse.c @@ -9,8 +9,8 @@ Revision log: * 2017-01-03: created by strawmanbobi **************************************************************************************/ -#include "include/ir_ac_binary_parse.h" -#include "include/ir_decode.h" +#include "ir_ac_binary_parse.h" +#include "ir_decode.h" UINT16 tag_head_offset = 0; diff --git a/android-example/decodesdk/ir_decoder/src/ir_ac_build_frame.c b/android-example/decodesdk/ir_decoder/src/ir_ac_build_frame.c index 366e08c..38c4d18 100644 --- a/android-example/decodesdk/ir_decoder/src/ir_ac_build_frame.c +++ b/android-example/decodesdk/ir_decoder/src/ir_ac_build_frame.c @@ -14,8 +14,8 @@ Revision log: #pragma ide diagnostic ignored "readability-redundant-declaration" #endif -#include "include/ir_ac_build_frame.h" -#include "include/ir_decode.h" +#include "ir_ac_build_frame.h" +#include "ir_decode.h" extern t_ac_protocol* context; diff --git a/android-example/decodesdk/ir_decoder/src/ir_ac_control.c b/android-example/decodesdk/ir_decoder/src/ir_ac_control.c index e6ee7b7..b012968 100644 --- a/android-example/decodesdk/ir_decoder/src/ir_ac_control.c +++ b/android-example/decodesdk/ir_decoder/src/ir_ac_control.c @@ -13,13 +13,13 @@ Revision log: #include #include -#include "include/ir_ac_control.h" -#include "include/ir_ac_binary_parse.h" -#include "include/ir_decode.h" -#include "include/ir_ac_parse_parameter.h" -#include "include/ir_ac_parse_forbidden_info.h" -#include "include/ir_ac_parse_frame_info.h" -#include "include/ir_utils.h" +#include "ir_ac_control.h" +#include "ir_ac_binary_parse.h" +#include "ir_decode.h" +#include "ir_ac_parse_parameter.h" +#include "ir_ac_parse_forbidden_info.h" +#include "ir_ac_parse_frame_info.h" +#include "ir_utils.h" #if defined USE_DYNAMIC_TAG diff --git a/android-example/decodesdk/ir_decoder/src/ir_ac_parse_forbidden_info.c b/android-example/decodesdk/ir_decoder/src/ir_ac_parse_forbidden_info.c index 5121932..64e5991 100644 --- a/android-example/decodesdk/ir_decoder/src/ir_ac_parse_forbidden_info.c +++ b/android-example/decodesdk/ir_decoder/src/ir_ac_parse_forbidden_info.c @@ -17,8 +17,8 @@ Revision log: #include #include -#include "include/ir_decode.h" -#include "include/ir_ac_parse_forbidden_info.h" +#include "ir_decode.h" +#include "ir_ac_parse_forbidden_info.h" extern t_ac_protocol *context; diff --git a/android-example/decodesdk/ir_decoder/src/ir_ac_parse_frame_info.c b/android-example/decodesdk/ir_decoder/src/ir_ac_parse_frame_info.c index d103815..b416ce8 100644 --- a/android-example/decodesdk/ir_decoder/src/ir_ac_parse_frame_info.c +++ b/android-example/decodesdk/ir_decoder/src/ir_ac_parse_frame_info.c @@ -10,11 +10,10 @@ Revision log: **************************************************************************************/ #include -#include #include -#include "include/ir_utils.h" -#include "include/ir_ac_parse_frame_info.h" +#include "ir_utils.h" +#include "ir_ac_parse_frame_info.h" INT8 parse_boot_code(struct tag_head *tag) @@ -341,5 +340,13 @@ INT8 parse_bit_num(struct tag_head *tag) if (context->bit_num[i].pos == -1) context->bit_num[i].pos = (UINT16) (context->default_code.len - 1); //convert -1 to last data pos } + + // Ensure bit_num_cnt does not exceed MAX_BITNUM to prevent buffer overflow + if (context->bit_num_cnt > MAX_BITNUM) + { + ir_printf("Warning: bit_num_cnt (%d) exceeds MAX_BITNUM (%d), limiting to MAX_BITNUM\n", + context->bit_num_cnt, MAX_BITNUM); + context->bit_num_cnt = MAX_BITNUM; + } return IR_DECODE_SUCCEEDED; } diff --git a/android-example/decodesdk/ir_decoder/src/ir_ac_parse_parameter.c b/android-example/decodesdk/ir_decoder/src/ir_ac_parse_parameter.c index d8d2a03..97aeba6 100644 --- a/android-example/decodesdk/ir_decoder/src/ir_ac_parse_parameter.c +++ b/android-example/decodesdk/ir_decoder/src/ir_ac_parse_parameter.c @@ -13,8 +13,8 @@ Revision log: #include #include -#include "include/ir_utils.h" -#include "include/ir_ac_parse_parameter.h" +#include "ir_utils.h" +#include "ir_ac_parse_parameter.h" static INT8 parse_checksum_byte_typed(const UINT8 *csdata, t_tag_checksum_data *checksum, UINT16 len); @@ -236,6 +236,13 @@ INT8 parse_temp_1(struct tag_head *tag, t_temp_1 *temp1) temp1->len = (UINT8) hex_len; UINT8 seg_len = hex_data[0]; + // Initialize all segments to NULL to ensure proper cleanup in case of error + for (seg_index = AC_TEMP_16; seg_index < (UINT16) AC_TEMP_MAX; seg_index++) + { + temp1->comp_data[seg_index].seg_len = 0; + temp1->comp_data[seg_index].segment = NULL; + } + for (seg_index = AC_TEMP_16; seg_index < (UINT16) AC_TEMP_MAX; seg_index++) { // 020210 indicates set the 02nd byte to [default] +10, +11, +12, +... @@ -243,6 +250,17 @@ INT8 parse_temp_1(struct tag_head *tag, t_temp_1 *temp1) temp1->comp_data[seg_index].segment = (UINT8 *) ir_malloc(seg_len); if (NULL == temp1->comp_data[seg_index].segment) { + // Clean up previously allocated memory + UINT16 cleanup_idx; + for (cleanup_idx = AC_TEMP_16; cleanup_idx < seg_index; cleanup_idx++) + { + if (temp1->comp_data[cleanup_idx].segment != NULL) + { + ir_free(temp1->comp_data[cleanup_idx].segment); + temp1->comp_data[cleanup_idx].segment = NULL; + temp1->comp_data[cleanup_idx].seg_len = 0; + } + } ir_free(hex_data); return IR_DECODE_FAILED; } @@ -400,10 +418,30 @@ INT8 parse_swing_1(struct tag_head *tag, t_swing_1 *swing1, UINT16 swing_count) return IR_DECODE_FAILED; } + // Initialize the comp_data to ensure proper cleanup in case of error + for (seg_index = 0; seg_index < swing_count; seg_index++) + { + swing1->comp_data[seg_index].seg_len = 0; + swing1->comp_data[seg_index].segment = NULL; + } + for (seg_index = 0; seg_index < swing_count; seg_index++) { if (IR_DECODE_FAILED == parse_comp_data_type_1(hex_data, &trav_offset, &swing1->comp_data[seg_index])) { + // Clean up any allocated memory in previous iterations + UINT16 i; + for (i = 0; i < seg_index; i++) + { + if (swing1->comp_data[i].segment != NULL) + { + ir_free(swing1->comp_data[i].segment); + swing1->comp_data[i].segment = NULL; + swing1->comp_data[i].seg_len = 0; + } + } + ir_free(swing1->comp_data); + swing1->comp_data = NULL; ir_free(hex_data); return IR_DECODE_FAILED; } @@ -518,6 +556,16 @@ INT8 parse_checksum(struct tag_head *tag, t_checksum *checksum) checksum->checksum_data + num, (UINT8) (i - preindex) >> (UINT8) 1)) { + // Clean up allocated memory on error + UINT16 j; + for (j = 0; j < num; j++) { + if (checksum->checksum_data[j].spec_pos != NULL) { + ir_free(checksum->checksum_data[j].spec_pos); + checksum->checksum_data[j].spec_pos = NULL; + } + } + ir_free(checksum->checksum_data); + checksum->checksum_data = NULL; return IR_DECODE_FAILED; } preindex = (UINT16) (i + 1); @@ -529,6 +577,16 @@ INT8 parse_checksum(struct tag_head *tag, t_checksum *checksum) checksum->checksum_data + num, (UINT8) (i - preindex) >> (UINT8) 1)) { + // Clean up allocated memory on error + UINT16 j; + for (j = 0; j <= num; j++) { + if (checksum->checksum_data[j].spec_pos != NULL) { + ir_free(checksum->checksum_data[j].spec_pos); + checksum->checksum_data[j].spec_pos = NULL; + } + } + ir_free(checksum->checksum_data); + checksum->checksum_data = NULL; return IR_DECODE_FAILED; } @@ -635,18 +693,12 @@ INT8 parse_function_1_tag29(struct tag_head *tag, t_function_1 *function1) // seg_index in TAG only refers to functional count for (seg_index = AC_FUNCTION_POWER; seg_index < (UINT16) AC_FUNCTION_MAX; seg_index++) { - /** WARNING: for strict mode only **/ - /** - INT8 fid = parse_function_1(hex_data, &trav_offset, &function1->comp_data[0]); - if (fid > AC_FUNCTION_MAX - 1) + INT8 result = parse_function_1(hex_data, &trav_offset, &function1->comp_data[0]); + if (result == IR_DECODE_FAILED) { - irda_free(hex_data); - hex_data = NULL; + ir_free(hex_data); return IR_DECODE_FAILED; } - **/ - - parse_function_1(hex_data, &trav_offset, &function1->comp_data[0]); if (trav_offset >= hex_len) { break; @@ -694,6 +746,13 @@ INT8 parse_temp_2(struct tag_head *tag, t_temp_2 *temp2) temp2->len = (UINT8) hex_len; UINT8 seg_len = hex_data[0]; + // Initialize all segments to NULL to ensure proper cleanup in case of error + for (seg_index = AC_TEMP_16; seg_index < (UINT16) AC_TEMP_MAX; seg_index++) + { + temp2->comp_data[seg_index].seg_len = 0; + temp2->comp_data[seg_index].segment = NULL; + } + for (seg_index = AC_TEMP_16; seg_index < (UINT16) AC_TEMP_MAX; seg_index++) { // 020210 indicates set the 02nd byte to [default] +10, +11, +12, +... @@ -701,6 +760,17 @@ INT8 parse_temp_2(struct tag_head *tag, t_temp_2 *temp2) temp2->comp_data[seg_index].segment = (UINT8 *) ir_malloc(seg_len); if (NULL == temp2->comp_data[seg_index].segment) { + // Clean up previously allocated memory + UINT16 cleanup_idx; + for (cleanup_idx = AC_TEMP_16; cleanup_idx < seg_index; cleanup_idx++) + { + if (temp2->comp_data[cleanup_idx].segment != NULL) + { + ir_free(temp2->comp_data[cleanup_idx].segment); + temp2->comp_data[cleanup_idx].segment = NULL; + temp2->comp_data[cleanup_idx].seg_len = 0; + } + } ir_free(hex_data); return IR_DECODE_FAILED; } @@ -873,10 +943,30 @@ INT8 parse_swing_2(struct tag_head *tag, t_swing_2 *swing2, UINT16 swing_count) return IR_DECODE_FAILED; } + // Initialize the comp_data to ensure proper cleanup in case of error + for (seg_index = 0; seg_index < swing_count; seg_index++) + { + swing2->comp_data[seg_index].seg_len = 0; + swing2->comp_data[seg_index].segment = NULL; + } + for (seg_index = 0; seg_index < swing_count; seg_index++) { if (IR_DECODE_FAILED == parse_comp_data_type_2(hex_data, &trav_offset, &swing2->comp_data[seg_index])) { + // Clean up any allocated memory in previous iterations + UINT16 i; + for (i = 0; i < seg_index; i++) + { + if (swing2->comp_data[i].segment != NULL) + { + ir_free(swing2->comp_data[i].segment); + swing2->comp_data[i].segment = NULL; + swing2->comp_data[i].seg_len = 0; + } + } + ir_free(swing2->comp_data); + swing2->comp_data = NULL; ir_free(hex_data); return IR_DECODE_FAILED; } @@ -993,18 +1083,12 @@ INT8 parse_function_2_tag34(struct tag_head *tag, t_function_2 *function2) // seg_index in TAG only refers to functional count for (seg_index = AC_FUNCTION_POWER; seg_index < (UINT16) AC_FUNCTION_MAX; seg_index++) { - /** WARNING: for strict mode only **/ - /** - INT8 fid = parse_function_2(hex_data, &trav_offset, &function2->comp_data[0]); - if (fid > AC_FUNCTION_MAX - 1) + INT8 result = parse_function_2(hex_data, &trav_offset, &function2->comp_data[0]); + if (result == IR_DECODE_FAILED) { - irda_free(hex_data); - hex_data = NULL; + ir_free(hex_data); return IR_DECODE_FAILED; } - **/ - - parse_function_2(hex_data, &trav_offset, &function2->comp_data[0]); if (trav_offset >= hex_len) { break; diff --git a/android-example/decodesdk/ir_decoder/src/ir_decode.c b/android-example/decodesdk/ir_decoder/src/ir_decode.c index 659cf8b..eb314fb 100644 --- a/android-example/decodesdk/ir_decoder/src/ir_decode.c +++ b/android-example/decodesdk/ir_decoder/src/ir_decode.c @@ -14,10 +14,10 @@ Revision log: #include -#include "include/ir_decode.h" -#include "include/ir_utils.h" -#include "include/ir_ac_build_frame.h" -#include "include/ir_ac_apply.h" +#include "ir_decode.h" +#include "ir_utils.h" +#include "ir_ac_build_frame.h" +#include "ir_ac_apply.h" struct ir_bin_buffer binary_file; struct ir_bin_buffer *p_ir_buffer = &binary_file; @@ -79,18 +79,23 @@ static INT8 ir_ac_file_open(const char *file_name); #endif static INT8 ir_ac_binary_open(UINT8 *binary, UINT16 bin_length); -static UINT16 ir_ac_control(t_remote_ac_status ac_status, UINT16* user_data, UINT8 key_code, - BOOL change_wind_direction); + +static UINT16 ir_ac_control(t_remote_ac_status *ac_status, UINT16* user_data, UINT8 key_code); + static INT8 ir_ac_binary_close(); -static BOOL validate_ac_status(t_remote_ac_status* ac_status, BOOL change_wind_dir); + +static BOOL validate_ac_status(t_remote_ac_status* ac_status); #if !defined NO_FS static INT8 ir_tv_file_open(const char *file_name); #endif static INT8 ir_tv_binary_open(UINT8 *binary, UINT16 bin_length); + static INT8 ir_tv_binary_parse(UINT8 ir_hex_encode); + static UINT16 ir_tv_control(UINT8 key, UINT16 *l_user_data); + static INT8 ir_tv_binary_close(); @@ -105,7 +110,7 @@ const char* get_lib_version() return version; } -#if (!defined BOARD_51 && !defined BOARD_CC26XX) +#if (!defined BOARD_SOC) INT8 ir_file_open(const UINT8 category, const UINT8 sub_category, const char* file_name) { INT8 ret = 0; @@ -244,8 +249,7 @@ INT8 ir_binary_open(const UINT8 category, const UINT8 sub_category, UINT8* binar } /** the main entry of decode algorithm **/ -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) { ir_printf("remote_category = %d, KEY_CODE_MAX = %d\n", remote_category, KEY_CODE_MAX[remote_category]); @@ -266,21 +270,21 @@ UINT16 ir_decode(UINT8 key_code, UINT16* user_data, return 0; } ir_printf("ac status is not null in decode core : power = %d, mode = %d, " - "temp = %d, wind_dir = %d, wind_speed = %d, " - "key_code = %d, change_wind_direction = %d\n", + "temp = %d, wind_dir = %d, wind_speed = %d, change_wind_direction = %d, " + "key_code = %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); + ac_status->change_wind_direction, + key_code); // ac status validation - if (FALSE == validate_ac_status(ac_status, change_wind_direction)) { + if (FALSE == validate_ac_status(ac_status)) { return 0; } - return ir_ac_control(*ac_status, user_data, key_code, change_wind_direction); + return ir_ac_control(ac_status, user_data, key_code); } } - INT8 ir_close() { if (IR_TYPE_COMMANDS == ir_binary_type) @@ -359,8 +363,7 @@ static INT8 ir_ac_binary_open(UINT8 *binary, UINT16 bin_length) return IR_DECODE_SUCCEEDED; } -static UINT16 ir_ac_control(t_remote_ac_status ac_status, UINT16* user_data, UINT8 key_code, - BOOL change_wind_direction) +static UINT16 ir_ac_control(t_remote_ac_status *ac_status, UINT16* user_data, UINT8 key_code) { UINT16 time_length = 0; UINT8 function_code = 0; @@ -402,7 +405,7 @@ static UINT16 ir_ac_control(t_remote_ac_status ac_status, UINT16* user_data, UIN } // pre-set change wind direction flag here - context->change_wind_direction = change_wind_direction; + context->change_wind_direction = ac_status->change_wind_direction; context->time = user_data; @@ -410,15 +413,16 @@ static UINT16 ir_ac_control(t_remote_ac_status ac_status, UINT16* user_data, UIN ir_memcpy(ir_hex_code, context->default_code.data, context->default_code.len); #if defined USE_APPLY_TABLE - if(ac_status.ac_power != AC_POWER_OFF) + if(ac_status->ac_power != AC_POWER_OFF) { + UINT8 i; for (i = AC_APPLY_POWER; i < AC_APPLY_MAX; i++) { - apply_table[i](context, parameter_array[i]); + apply_table[i](ac_status, function_code); } } #else - if (ac_status.ac_power == AC_POWER_OFF) + if (ac_status->ac_power == AC_POWER_OFF) { // otherwise, power should always be applied apply_power(ac_status, function_code); @@ -426,7 +430,7 @@ static UINT16 ir_ac_control(t_remote_ac_status ac_status, UINT16* user_data, UIN else { // check the mode as the first priority, despite any other status - if (TRUE == context->n_mode[ac_status.ac_mode].enable) + if (TRUE == context->n_mode[ac_status->ac_mode].enable) { if (is_solo_function(function_code)) { @@ -506,7 +510,7 @@ static INT8 ir_ac_binary_close() return IR_DECODE_SUCCEEDED; } -static BOOL validate_ac_status(t_remote_ac_status* ac_status, BOOL change_wind_dir) +static BOOL validate_ac_status(t_remote_ac_status* ac_status) { if (AC_POWER_OFF != ac_status->ac_power && AC_POWER_ON != ac_status->ac_power) { @@ -528,7 +532,7 @@ static BOOL validate_ac_status(t_remote_ac_status* ac_status, BOOL change_wind_d { return FALSE; } - if (0 != change_wind_dir && 1 != change_wind_dir) + if (0 != ac_status->change_wind_direction && 1 != ac_status->change_wind_direction) { return FALSE; } @@ -776,7 +780,7 @@ static INT8 ir_tv_binary_close() UINT16 ir_decode_combo(const UINT8 category, const UINT8 sub_category, UINT8* binary, UINT16 bin_length, UINT8 key_code, UINT16* user_data, - t_remote_ac_status* ac_status, BOOL change_wind_direction) + t_remote_ac_status* ac_status) { UINT16 decoded_length = 0; @@ -787,6 +791,13 @@ UINT16 ir_decode_combo(const UINT8 category, const UINT8 sub_category, return IR_DECODE_FAILED; } + if (sub_category < SUB_CATEGORY_QUATERNARY || + sub_category >= SUB_CATEGORY_NEXT) + { + ir_printf("wrong remote sub category : %d\n", sub_category); + return IR_DECODE_FAILED; + } + remote_category = (t_remote_category) category; if (key_code < 0 || key_code >= KEY_CODE_MAX[remote_category]) @@ -798,7 +809,7 @@ UINT16 ir_decode_combo(const UINT8 category, const UINT8 sub_category, if (IR_DECODE_SUCCEEDED == ir_binary_open(category, sub_category, binary, bin_length)) { - decoded_length = ir_decode(key_code, user_data, ac_status, change_wind_direction); + decoded_length = ir_decode(key_code, user_data, ac_status); ir_close(); return decoded_length; } diff --git a/android-example/decodesdk/ir_decoder/src/ir_decode_jni.c b/android-example/decodesdk/ir_decoder/src/ir_decode_jni.c new file mode 100644 index 0000000..b35b6cd --- /dev/null +++ b/android-example/decodesdk/ir_decoder/src/ir_decode_jni.c @@ -0,0 +1,251 @@ +/************************************************************************************************** +Filename: ir_decode_jni.c +Revised: Date: 2016-03-21 +Revision: Revision: 1.0 + +Description: This file links to java layer for Android application + +Revision log: +* 2016-03-21: created by strawmanbobi +**************************************************************************************************/ +#include +#include + +#include "ir_decode_jni.h" +#include "ir_defs.h" +#include "ir_decode.h" + +// global variable definition +extern size_t binary_length; +extern UINT8 *binary_content; + +JNIEXPORT const jstring JNICALL Java_net_irext_decode_sdk_IRDecode_irGetVersion + (JNIEnv *env, jobject this_obj) +{ + char *version = (char*) get_lib_version(); + return (*env)->NewStringUTF(env, version); +} + +JNIEXPORT jint JNICALL Java_net_irext_decode_sdk_IRDecode_irOpen + (JNIEnv *env, jobject this_obj, jint category_id, jint sub_cate, jstring file_name) +{ + const char *n_file_name = (*env)->GetStringUTFChars(env, file_name, 0); + if (IR_DECODE_FAILED == ir_file_open(category_id, sub_cate, n_file_name)) + { + ir_close(); + (*env)->ReleaseStringUTFChars(env, file_name, n_file_name); + return IR_DECODE_FAILED; + } + + (*env)->ReleaseStringUTFChars(env, file_name, n_file_name); + return IR_DECODE_SUCCEEDED; +} + +JNIEXPORT jint JNICALL Java_net_irext_decode_sdk_IRDecode_irOpenBinary + (JNIEnv *env, jobject this_obj, jint category_id, jint sub_cate, + jbyteArray binaries, jint bin_length) +{ + jbyte* j_buffer = (*env)->GetByteArrayElements(env, binaries, 0); + unsigned char* buffer = (unsigned char*)j_buffer; + + if (IR_DECODE_FAILED == ir_binary_open(category_id, sub_cate, buffer, bin_length)) + { + ir_close(); + (*env)->ReleaseByteArrayElements(env, binaries, j_buffer, JNI_ABORT); + return IR_DECODE_FAILED; + } + (*env)->ReleaseByteArrayElements(env, binaries, j_buffer, JNI_ABORT); + return IR_DECODE_SUCCEEDED; +} + +JNIEXPORT jintArray JNICALL Java_net_irext_decode_sdk_IRDecode_irDecode + (JNIEnv *env, jobject this_obj, jint key_code, jobject jni_ac_status) +{ + UINT16 user_data[USER_DATA_SIZE] = { 0 }; + int i = 0; + jint copy_array[USER_DATA_SIZE] = { 0 }; + t_remote_ac_status ac_status; + + jclass n_ac_status = (*env)->GetObjectClass(env, jni_ac_status); + + if (NULL != n_ac_status) + { + jfieldID ac_power_fid = (*env)->GetFieldID(env, n_ac_status, "acPower", "I"); + jint i_ac_power = (*env)->GetIntField(env, jni_ac_status, ac_power_fid); + + jfieldID ac_mode_fid = (*env)->GetFieldID(env, n_ac_status, "acMode", "I"); + jint i_ac_mode = (*env)->GetIntField(env, jni_ac_status, ac_mode_fid); + + jfieldID ac_temp_fid = (*env)->GetFieldID(env, n_ac_status, "acTemp", "I"); + jint i_ac_temp = (*env)->GetIntField(env, jni_ac_status, ac_temp_fid); + + jfieldID ac_wind_dir_fid = (*env)->GetFieldID(env, n_ac_status, "acWindDir", "I"); + jint i_ac_wind_dir = (*env)->GetIntField(env, jni_ac_status, ac_wind_dir_fid); + + jfieldID ac_wind_speed_fid = (*env)->GetFieldID(env, n_ac_status, "acWindSpeed", "I"); + jint i_ac_wind_speed = (*env)->GetIntField(env, jni_ac_status, ac_wind_speed_fid); + + ac_status.ac_display = 0; + ac_status.ac_sleep = 0; + ac_status.ac_timer = 0; + ac_status.ac_power = i_ac_power; + ac_status.ac_mode = i_ac_mode; + ac_status.ac_temp = i_ac_temp; + ac_status.ac_wind_dir = i_ac_wind_dir; + ac_status.ac_wind_speed = i_ac_wind_speed; + + ir_printf("ac status is not null : power = %d, mode = %d, " + "temp = %d, wind_dir = %d, wind_speed = %d\n", + ac_status.ac_power, ac_status.ac_mode, + ac_status.ac_temp, ac_status.ac_wind_dir, + ac_status.ac_wind_speed); + } + else + { + ir_printf("ac status is null, error!\n"); + } + + int wave_code_length = ir_decode(key_code, user_data, &ac_status); + + jintArray result = (*env)->NewIntArray(env, wave_code_length); + if (result == NULL) + { + return NULL; /* out of memory error thrown */ + } + for (i = 0; i < wave_code_length; i++) + { + copy_array[i] = (int)user_data[i]; + } + (*env)->SetIntArrayRegion(env, result, 0, wave_code_length, copy_array); + (*env)->DeleteLocalRef(env, n_ac_status); + + return result; +} + +JNIEXPORT void JNICALL Java_net_irext_decode_sdk_IRDecode_irClose + (JNIEnv *env, jobject this_obj) +{ + ir_close(); +} + +JNIEXPORT jintArray JNICALL Java_net_irext_decode_sdk_IRDecode_irDecodeCombo + (JNIEnv *env, jobject this_obj, jint category_id, jint sub_cate, + jbyteArray binaries, jint bin_length, + jint key_code, jobject jni_ac_status) { + UINT16 user_data[USER_DATA_SIZE] = { 0 }; + int i = 0; + jint copy_array[USER_DATA_SIZE] = { 0 }; + t_remote_ac_status ac_status; + + jbyte* j_buffer = (*env)->GetByteArrayElements(env, binaries, 0); + unsigned char* buffer = (unsigned char*)j_buffer; + + jclass n_ac_status = (*env)->GetObjectClass(env, jni_ac_status); + + if (NULL != n_ac_status) { + jfieldID ac_power_fid = (*env)->GetFieldID(env, n_ac_status, "acPower", "I"); + jint + i_ac_power = (*env)->GetIntField(env, jni_ac_status, ac_power_fid); + + jfieldID ac_mode_fid = (*env)->GetFieldID(env, n_ac_status, "acMode", "I"); + jint + i_ac_mode = (*env)->GetIntField(env, jni_ac_status, ac_mode_fid); + + jfieldID ac_temp_fid = (*env)->GetFieldID(env, n_ac_status, "acTemp", "I"); + jint + i_ac_temp = (*env)->GetIntField(env, jni_ac_status, ac_temp_fid); + + jfieldID ac_wind_dir_fid = (*env)->GetFieldID(env, n_ac_status, "acWindDir", "I"); + jint + i_ac_wind_dir = (*env)->GetIntField(env, jni_ac_status, ac_wind_dir_fid); + + jfieldID ac_wind_speed_fid = + (*env)->GetFieldID(env, n_ac_status, "acWindSpeed", "I"); + jint + i_ac_wind_speed = (*env)->GetIntField(env, jni_ac_status, ac_wind_speed_fid); + + ac_status.ac_display = 0; + ac_status.ac_sleep = 0; + ac_status.ac_timer = 0; + ac_status.ac_power = i_ac_power; + ac_status.ac_mode = i_ac_mode; + ac_status.ac_temp = i_ac_temp; + ac_status.ac_wind_dir = i_ac_wind_dir; + ac_status.ac_wind_speed = i_ac_wind_speed; + } + + int wave_code_length = ir_decode_combo(category_id, sub_cate, + buffer, bin_length, + key_code, user_data, + &ac_status); + + jintArray result = (*env)->NewIntArray(env, wave_code_length); + if (result == NULL) { + return NULL; /* out of memory error thrown */ + } + for (i = 0; i < wave_code_length; i++) { + copy_array[i] = (int) user_data[i]; + } + (*env)->SetIntArrayRegion(env, result, 0, wave_code_length, copy_array); + (*env)->DeleteLocalRef(env, n_ac_status); + + return result; +} + +JNIEXPORT jobject JNICALL Java_net_irext_decode_sdk_IRDecode_irACGetTemperatureRange + (JNIEnv *env, jobject this_obj, jint ac_mode) +{ + int tempMin = 0; + int tempMax = 0; + + jobject temperature_range = NULL; + jclass temperature_range_class = + (*env)->FindClass(env, "net/irext/decode/sdk/bean/TemperatureRange"); + + jmethodID temperature_range_mid = + (*env)->GetMethodID(env, temperature_range_class, "", "()V"); + + jfieldID min_temp_fid = (*env)->GetFieldID(env, temperature_range_class, "tempMin", "I"); + jfieldID max_temp_fid = (*env)->GetFieldID(env, temperature_range_class, "tempMax", "I"); + + temperature_range = (*env)->NewObject(env, temperature_range_class, temperature_range_mid); + + get_temperature_range((UINT8)ac_mode, (INT8*)&tempMin, (INT8*)&tempMax); + + (*env)->SetIntField(env, temperature_range, min_temp_fid, tempMin); + (*env)->SetIntField(env, temperature_range, max_temp_fid, tempMax); + + return temperature_range; +} + +JNIEXPORT jint JNICALL Java_net_irext_decode_sdk_IRDecode_irACGetSupportedMode + (JNIEnv *env, jobject this_obj) +{ + int supported_mode = 0; + get_supported_mode((UINT8*)&supported_mode); + return supported_mode; +} + +JNIEXPORT jint JNICALL Java_net_irext_decode_sdk_IRDecode_irACGetSupportedWindSpeed + (JNIEnv *env, jobject this_obj, jint ac_mode) +{ + int supported_wind_speed = 0; + get_supported_wind_speed((UINT8)ac_mode, (UINT8*)&supported_wind_speed); + return supported_wind_speed; +} + +JNIEXPORT jint JNICALL Java_net_irext_decode_sdk_IRDecode_irACGetSupportedSwing + (JNIEnv *env, jobject this_obj, jint ac_mode) +{ + int supported_swing = 0; + get_supported_swing((UINT8)ac_mode, (UINT8*)&supported_swing); + return supported_swing; +} + +JNIEXPORT jint JNICALL Java_net_irext_decode_sdk_IRDecode_irACGetSupportedWindDirection + (JNIEnv *env, jobject this_obj) +{ + int supported_wind_direction = 0; + get_supported_wind_direction((UINT8*)&supported_wind_direction); + return supported_wind_direction; +} \ No newline at end of file diff --git a/android-example/decodesdk/ir_decoder/src/ir_decode_test.c b/android-example/decodesdk/ir_decoder/src/ir_decode_test.c index bd6f469..83bd855 100644 --- a/android-example/decodesdk/ir_decoder/src/ir_decode_test.c +++ b/android-example/decodesdk/ir_decoder/src/ir_decode_test.c @@ -16,13 +16,13 @@ Revision log: #include #include -#include "include/ir_defs.h" -#include "include/ir_decode.h" +#include "ir_defs.h" +#include "ir_decode.h" #define INPUT_MAX 3 // global variable definition -t_remote_ac_status ac_status; +t_remote_ac_status *ac_status = NULL; UINT16 user_data[USER_DATA_SIZE]; void input_number(int *val) @@ -44,7 +44,7 @@ void input_number(int *val) { break; } - i=0; + i = 0; } else { @@ -69,6 +69,7 @@ static INT8 decode_as_ac(char *file_name) int first_time = 1; int length = 0; int index = 0; + INT8 ret_val = IR_DECODE_SUCCEEDED; // get status UINT8 supported_mode = 0x00; @@ -80,20 +81,29 @@ static INT8 decode_as_ac(char *file_name) BOOL need_control = TRUE; + if (ac_status == NULL) { + ac_status = (t_remote_ac_status *)malloc(sizeof(t_remote_ac_status)); + if (ac_status == NULL) { + printf("failed to allocate memory for ac_status\n"); + return IR_DECODE_FAILED; + } + } + // init air conditioner status - ac_status.ac_display = 0; - ac_status.ac_sleep = 0; - ac_status.ac_timer = 0; - ac_status.ac_power = AC_POWER_ON; - 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; + ac_status->ac_display = 0; + ac_status->ac_sleep = 0; + ac_status->ac_timer = 0; + ac_status->ac_power = AC_POWER_ON; + 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; + ac_status->change_wind_direction = 0; if (IR_DECODE_FAILED == ir_file_open(REMOTE_CATEGORY_AC, 0, file_name)) { - ir_close(); - return IR_DECODE_FAILED; + ret_val = IR_DECODE_FAILED; + goto _exit; } do @@ -112,7 +122,7 @@ static INT8 decode_as_ac(char *file_name) op_match = TRUE; need_control = FALSE; - change_wind_dir = FALSE; + ac_status->change_wind_direction = 0; if (99 == key_code) { @@ -132,9 +142,9 @@ static INT8 decode_as_ac(char *file_name) } else if (15 == key_code) { - if (IR_DECODE_SUCCEEDED == get_supported_wind_speed(ac_status.ac_mode, &supported_speed)) + if (IR_DECODE_SUCCEEDED == get_supported_wind_speed(ac_status->ac_mode, &supported_speed)) { - printf("supported wind speed in %d = %02X\n", ac_status.ac_mode, supported_speed); + printf("supported wind speed in %d = %02X\n", ac_status->ac_mode, supported_speed); } else { @@ -143,10 +153,10 @@ static INT8 decode_as_ac(char *file_name) } else if (16 == key_code) { - if (IR_DECODE_SUCCEEDED == get_temperature_range(ac_status.ac_mode, &min_temperature, &max_temperature)) + if (IR_DECODE_SUCCEEDED == get_temperature_range(ac_status->ac_mode, &min_temperature, &max_temperature)) { printf("supported temperature range in mode %d = %d, %d\n", - ac_status.ac_mode, min_temperature, max_temperature); + ac_status->ac_mode, min_temperature, max_temperature); } else { @@ -170,42 +180,42 @@ static INT8 decode_as_ac(char *file_name) { // notice: only if ac_power is turned on will user_data change when input a different key_code case 0: - ac_status.ac_power = ((ac_status.ac_power == AC_POWER_ON) ? AC_POWER_OFF : AC_POWER_ON); + ac_status->ac_power = ((ac_status->ac_power == AC_POWER_ON) ? AC_POWER_OFF : AC_POWER_ON); need_control = TRUE; break; case 1: - ++ac_status.ac_mode; - ac_status.ac_mode = ac_status.ac_mode % AC_MODE_MAX; + ++ac_status->ac_mode; + ac_status->ac_mode = ac_status->ac_mode % AC_MODE_MAX; need_control = TRUE; break; case 2: case 7: - ac_status.ac_temp = ((ac_status.ac_temp == AC_TEMP_30) ? AC_TEMP_30 : (ac_status.ac_temp + 1)); + ac_status->ac_temp = ((ac_status->ac_temp == AC_TEMP_30) ? AC_TEMP_30 : (ac_status->ac_temp + 1)); need_control = TRUE; break; case 3: case 8: - ac_status.ac_temp = ((ac_status.ac_temp == AC_TEMP_16) ? AC_TEMP_16 : (ac_status.ac_temp - 1)); + ac_status->ac_temp = ((ac_status->ac_temp == AC_TEMP_16) ? AC_TEMP_16 : (ac_status->ac_temp - 1)); need_control = TRUE; break; case 9: - ++ac_status.ac_wind_speed; - ac_status.ac_wind_speed = ac_status.ac_wind_speed % AC_WS_MAX; + ++ac_status->ac_wind_speed; + ac_status->ac_wind_speed = ac_status->ac_wind_speed % AC_WS_MAX; need_control = TRUE; break; case 10: - ac_status.ac_wind_dir = ((ac_status.ac_wind_dir == AC_SWING_ON) ? AC_SWING_OFF : AC_SWING_ON); + ac_status->ac_wind_dir = ((ac_status->ac_wind_dir == AC_SWING_ON) ? AC_SWING_OFF : AC_SWING_ON); need_control = TRUE; break; case 11: - if (ac_status.ac_wind_dir == AC_SWING_OFF) { - change_wind_dir = TRUE; + if (ac_status->ac_wind_dir == AC_SWING_OFF) { + ac_status->change_wind_direction = 1; } need_control = TRUE; break; @@ -217,14 +227,16 @@ static INT8 decode_as_ac(char *file_name) if (TRUE == op_match && TRUE == need_control) { - printf("switch AC to power = %d, mode = %d, temp = %d, speed = %d, swing = %d with key_code = %d\n", - ac_status.ac_power, - ac_status.ac_mode, - ac_status.ac_temp, - ac_status.ac_wind_speed, - ac_status.ac_wind_dir, + printf("switch AC to power = %d, mode = %d, temp = %d, speed = %d, swing = %d, change_wind_dir = %d," + " with key_code = %d\n", + ac_status->ac_power, + ac_status->ac_mode, + ac_status->ac_temp, + ac_status->ac_wind_speed, + ac_status->ac_wind_dir, + ac_status->change_wind_direction, key_code); - length = ir_decode(key_code, user_data, &ac_status, change_wind_dir); + length = ir_decode(key_code, user_data, ac_status); printf("\n === binary decoded : %d\n", length); for (index = 0; index < length; index++) { @@ -235,9 +247,14 @@ static INT8 decode_as_ac(char *file_name) } } while (TRUE); +_exit: ir_close(); - return IR_DECODE_SUCCEEDED; + if (NULL != ac_status) { + free(ac_status); + } + + return ret_val; } static INT8 decode_as_tv(char *file_name, UINT8 ir_hex_encode) @@ -273,7 +290,7 @@ static INT8 decode_as_tv(char *file_name, UINT8 ir_hex_encode) { break; } - length = ir_decode(key_code, user_data, NULL, 0); + length = ir_decode(key_code, user_data, NULL); printf("\n === binary decoded : %d\n", length); for (index = 0; index < length; index++) { @@ -287,6 +304,13 @@ static INT8 decode_as_tv(char *file_name, UINT8 ir_hex_encode) return IR_DECODE_SUCCEEDED; } +void cleanup() { + if (ac_status != NULL) { + free(ac_status); + ac_status = NULL; + } +} + static void print_usage(const char *progn) { printf("usage: %s [function] [file] [subcate]\n" "[function] : 0 - decode for AC; 1 - decode for others\n" @@ -324,4 +348,7 @@ int main(int argc, char *argv[]) printf("decode functionality not supported : %c\n", function); break; } + + cleanup(); + return 0; } \ No newline at end of file diff --git a/android-example/decodesdk/ir_decoder/src/ir_tv_control.c b/android-example/decodesdk/ir_decoder/src/ir_tv_control.c index 53a3e80..e922dc3 100644 --- a/android-example/decodesdk/ir_decoder/src/ir_tv_control.c +++ b/android-example/decodesdk/ir_decoder/src/ir_tv_control.c @@ -15,9 +15,9 @@ Revision log: #include -#include "include/ir_defs.h" -#include "include/ir_decode.h" -#include "include/ir_tv_control.h" +#include "ir_defs.h" +#include "ir_decode.h" +#include "ir_tv_control.h" struct buffer @@ -249,8 +249,16 @@ static void print_ir_time(t_ir_data *data, UINT8 key_index, UINT16 *ir_time) } else if (ir_level == IRDA_LEVEL_LOW) { + if (time_index + 1 > USER_DATA_SIZE) { + ir_printf("time index exceeded\n"); + return; + } ir_time[time_index++] = pcycles->mask; } + if (time_index + 1 > USER_DATA_SIZE) { + ir_printf("time index exceeded\n"); + return; + } ir_time[time_index++] = pcycles->space; ir_level = IRDA_LEVEL_LOW; } @@ -263,8 +271,16 @@ static void print_ir_time(t_ir_data *data, UINT8 key_index, UINT16 *ir_time) } else if (ir_level == IRDA_LEVEL_HIGH) { + if (time_index + 1 > USER_DATA_SIZE) { + ir_printf("time index exceeded\n"); + return; + } ir_time[time_index++] = pcycles->space; } + if (time_index + 1 > USER_DATA_SIZE) { + ir_printf("time index exceeded\n"); + return; + } ir_time[time_index++] = pcycles->mask; ir_level = IRDA_LEVEL_HIGH; } @@ -278,6 +294,10 @@ static void print_ir_time(t_ir_data *data, UINT8 key_index, UINT16 *ir_time) } else if (ir_level == IRDA_LEVEL_HIGH) { + if (time_index + 1 > USER_DATA_SIZE) { + ir_printf("time index exceeded\n"); + return; + } ir_time[time_index++] = pcycles->space; } ir_level = IRDA_LEVEL_LOW; @@ -291,6 +311,10 @@ static void print_ir_time(t_ir_data *data, UINT8 key_index, UINT16 *ir_time) } else if (ir_level == IRDA_LEVEL_LOW) { + if (time_index + 1 > USER_DATA_SIZE) { + ir_printf("time index exceeded\n"); + return; + } ir_time[time_index++] = pcycles->mask; } ir_level = IRDA_LEVEL_HIGH; diff --git a/android-example/decodesdk/ir_decoder/src/ir_utils.c b/android-example/decodesdk/ir_decoder/src/ir_utils.c index 9045a52..7d90ea5 100644 --- a/android-example/decodesdk/ir_decoder/src/ir_utils.c +++ b/android-example/decodesdk/ir_decoder/src/ir_utils.c @@ -9,7 +9,7 @@ Revision log: * 2016-10-01: created by strawmanbobi **************************************************************************************/ -#include "include/ir_utils.h" +#include "ir_utils.h" UINT8 char_to_hex(char chr) { diff --git a/arduino-example/src/configure.h b/arduino-example/src/configure.h index 58f97a1..396e47e 100644 --- a/arduino-example/src/configure.h +++ b/arduino-example/src/configure.h @@ -27,10 +27,8 @@ #include // Wi-Fi Configs -#define SECRET_SSID "Maomao的小房子" -#define SECRET_PASS "Maomao121207" -// #define SECRET_SSID "maomao" -// #define SECRET_PASS "20121207" +#define SECRET_SSID "maomao" +#define SECRET_PASS "20121207" // #define TEST_BIN_RECEIVE (1)