updated win32 example with latest decode lib
This commit is contained in:
@@ -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);
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
155
win32-example/ir_decoder/src/include/ir_decode_jni.h
Normal file
155
win32-example/ir_decoder/src/include/ir_decode_jni.h
Normal file
@@ -0,0 +1,155 @@
|
||||
/* DO NOT EDIT THIS FILE - it is machine generated */
|
||||
#if defined BOARD_ANDROID
|
||||
#include <jni.h>
|
||||
#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
|
||||
@@ -12,7 +12,7 @@ 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"
|
||||
|
||||
#if defined (BOARD_PC)
|
||||
#pragma ide diagnostic ignored "OCUnusedGlobalDeclarationInspection"
|
||||
@@ -29,10 +29,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 +51,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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)*/)
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -13,13 +13,13 @@ Revision log:
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#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
|
||||
|
||||
@@ -17,8 +17,8 @@ Revision log:
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#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;
|
||||
|
||||
@@ -10,11 +10,10 @@ Revision log:
|
||||
**************************************************************************************/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#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;
|
||||
}
|
||||
|
||||
@@ -13,8 +13,8 @@ Revision log:
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#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;
|
||||
|
||||
@@ -14,10 +14,10 @@ Revision log:
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#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;
|
||||
|
||||
@@ -798,7 +802,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;
|
||||
}
|
||||
|
||||
251
win32-example/ir_decoder/src/ir_decode_jni.c
Normal file
251
win32-example/ir_decoder/src/ir_decode_jni.c
Normal file
@@ -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 <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#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, "<init>", "()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;
|
||||
}
|
||||
@@ -16,13 +16,13 @@ Revision log:
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#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)
|
||||
@@ -80,15 +80,24 @@ 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))
|
||||
{
|
||||
@@ -112,7 +121,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 +141,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 +152,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 +179,43 @@ 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;
|
||||
@@ -218,13 +228,13 @@ 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,
|
||||
ac_status->ac_power,
|
||||
ac_status->ac_mode,
|
||||
ac_status->ac_temp,
|
||||
ac_status->ac_wind_speed,
|
||||
ac_status->ac_wind_dir,
|
||||
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++)
|
||||
{
|
||||
@@ -273,7 +283,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 +297,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 +341,7 @@ int main(int argc, char *argv[])
|
||||
printf("decode functionality not supported : %c\n", function);
|
||||
break;
|
||||
}
|
||||
|
||||
cleanup();
|
||||
return 0;
|
||||
}
|
||||
@@ -15,9 +15,9 @@ Revision log:
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#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
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user