From b8d3dc72861d425221eb068e5e7ac273cbab0a30 Mon Sep 17 00:00:00 2001 From: strawmanbobi Date: Thu, 17 Jan 2019 21:30:55 +0800 Subject: [PATCH] added jni example (undone) --- jni-example/decodesdk/IRDecode.java | 121 ++++++++++++ jni-example/decodesdk/bean/ACStatus.java | 115 ++++++++++++ .../decodesdk/bean/TemperatureRange.java | 43 +++++ jni-example/decodesdk/libs/libirda_decoder.so | Bin 0 -> 59910 bytes jni-example/decodesdk/utils/Constants.java | 175 ++++++++++++++++++ 5 files changed, 454 insertions(+) create mode 100644 jni-example/decodesdk/IRDecode.java create mode 100644 jni-example/decodesdk/bean/ACStatus.java create mode 100644 jni-example/decodesdk/bean/TemperatureRange.java create mode 100644 jni-example/decodesdk/libs/libirda_decoder.so create mode 100644 jni-example/decodesdk/utils/Constants.java diff --git a/jni-example/decodesdk/IRDecode.java b/jni-example/decodesdk/IRDecode.java new file mode 100644 index 0000000..8f532e4 --- /dev/null +++ b/jni-example/decodesdk/IRDecode.java @@ -0,0 +1,121 @@ +package net.irext.decodesdk; + +import net.irext.decodesdk.bean.ACStatus; +import net.irext.decodesdk.bean.TemperatureRange; +import net.irext.decodesdk.utils.Constants; +import org.springframework.beans.factory.annotation.Autowired; + +import javax.servlet.ServletContext; + +/** + * Filename: IRDecode.java + * Revised: Date: 2017-04-22 + * Revision: Revision: 1.0 + *

+ * Description: Wrapper-sdk of IR decode + *

+ * Revision log: + * 2017-04-23: created by strawmanbobi + */ +public class IRDecode { + + private static final String TAG = IRDecode.class.getSimpleName(); + + @Autowired + private static ServletContext context; + + private static Object mSync = new Object(); + + private native int irOpen(int category, int subCate, String fileName); + + private native int irOpenBinary(int category, int subCate, byte[] binaries, int binLength); + + private native int[] irDecode(int keyCode, ACStatus acStatus, int changeWindDirection); + + private native void irClose(); + + private native TemperatureRange irACGetTemperatureRange(int acMode); + + private native int irACGetSupportedMode(); + + private native int irACGetSupportedWindSpeed(int acMode); + + private native int irACGetSupportedSwing(int acMode); + + private static IRDecode mInstance; + + public static IRDecode getInstance() { + if (null == mInstance) { + mInstance = new IRDecode(); + } + return mInstance; + } + + private IRDecode() { + String libPath = "/data/irext/libirda_decoder.so"; + System.out.println("loading decode library " + libPath); + System.load(libPath); + } + + public int openFile(int category, int subCate, String fileName) { + return irOpen(category, subCate, fileName); + } + + public int openBinary(int category, int subCate, byte[] binaries, int binLength) { + return irOpenBinary(category, subCate, binaries, binLength); + } + + public int[] decodeBinary(int keyCode, ACStatus acStatus, int changeWindDir) { + int []decoded; + synchronized (mSync) { + if (null == acStatus) { + acStatus = new ACStatus(); + } + decoded = irDecode(keyCode, acStatus, changeWindDir); + } + return decoded; + } + + public void closeBinary() { + irClose(); + } + + public TemperatureRange getTemperatureRange(int acMode) { + return irACGetTemperatureRange(acMode); + } + + public int[] getACSupportedMode() { + // cool, heat, auto, fan, de-humidification + int []retSupportedMode = {0, 0, 0, 0, 0}; + int supportedMode = irACGetSupportedMode(); + for (int i = Constants.ACMode.MODE_COOL.getValue(); i <= + Constants.ACMode.MODE_DEHUMIDITY.getValue(); i++) { + retSupportedMode[i] = (supportedMode >>> 1) & 1; + } + return retSupportedMode; + } + + public int[] getACSupportedWindSpeed(int acMode) { + // auto, low, medium, high + int []retSupportedWindSpeed = {0, 0, 0, 0}; + int supportedWindSpeed = irACGetSupportedWindSpeed(acMode); + for (int i = Constants.ACWindSpeed.SPEED_AUTO.getValue(); + i <= Constants.ACWindSpeed.SPEED_HIGH.getValue(); + i++) { + retSupportedWindSpeed[i] = (supportedWindSpeed >>> 1) & 1; + } + return retSupportedWindSpeed; + } + + public int[] getACSupportedSwing(int acMode) { + // swing-on, swing-off + int []retSupportedSwing= {0, 0}; + int supportedSwing = irACGetSupportedSwing(acMode); + for (int i = Constants.ACSwing.SWING_ON.getValue(); + i <= Constants.ACSwing.SWING_OFF.getValue(); + i++) { + retSupportedSwing[i] = (supportedSwing >>> 1) & 1; + } + return retSupportedSwing; + } +} diff --git a/jni-example/decodesdk/bean/ACStatus.java b/jni-example/decodesdk/bean/ACStatus.java new file mode 100644 index 0000000..076fe5d --- /dev/null +++ b/jni-example/decodesdk/bean/ACStatus.java @@ -0,0 +1,115 @@ +package net.irext.decodesdk.bean; + +import net.irext.decodesdk.utils.Constants; + +/** + * Filename: ACStatus.java + * Revised: Date: 2017-03-28 + * Revision: Revision: 1.0 + *

+ * Description: Status descriptor for air-conditioner + *

+ * Revision log: + * 2017-03-28: created by strawmanbobi + */ +public class ACStatus { + + private static final String TAG = ACStatus.class.getSimpleName(); + + private int acPower; + private int acTemp; + private int acMode; + private int acWindDir; + private int acWindSpeed; + private int acDisplay; + private int acSleep; + private int acTimer; + + public ACStatus() { + this.acPower = Constants.ACPower.POWER_OFF.getValue(); + this.acMode = Constants.ACMode.MODE_AUTO.getValue(); + this.acTemp = Constants.ACTemperature.TEMP_24.getValue(); + this.acWindSpeed = Constants.ACWindSpeed.SPEED_AUTO.getValue(); + this.acWindDir = Constants.ACSwing.SWING_ON.getValue(); + this.acTimer = 0; + this.acDisplay = 0; + this.acSleep = 0; + } + + public ACStatus(int acPower, int acMode, int acTemp, int acWindSpeed, int acWindDir, + int acDisplay, int acSleep, int acTimer) { + this.acPower = acPower; + this.acTemp = acTemp; + this.acMode = acMode; + this.acWindDir = acWindDir; + this.acWindSpeed = acWindSpeed; + this.acDisplay = acDisplay; + this.acSleep = acSleep; + this.acTimer = acTimer; + } + + public int getAcPower() { + return acPower; + } + + public void setAcPower(int acPower) { + this.acPower = acPower; + } + + public int getAcTemp() { + return acTemp; + } + + public void setAcTemp(int acTemp) { + this.acTemp = acTemp; + } + + public int getAcMode() { + return acMode; + } + + public void setAcMode(int acMode) { + this.acMode = acMode; + } + + public int getAcWindDir() { + return acWindDir; + } + + public void setAcWindDir(int acWindDir) { + this.acWindDir = acWindDir; + } + + public int getAcWindSpeed() { + return acWindSpeed; + } + + public void setAcWindSpeed(int acWindSpeed) { + this.acWindSpeed = acWindSpeed; + } + + public int getAcDisplay() { + return acDisplay; + } + + public void setAcDisplay(int acDisplay) { + this.acDisplay = acDisplay; + } + + public int getAcSleep() { + return acSleep; + } + + public void setAcSleep(int acSleep) { + this.acSleep = acSleep; + } + + public int getAcTimer() { + return acTimer; + } + + public void setAcTimer(int acTimer) { + this.acTimer = acTimer; + } + +} diff --git a/jni-example/decodesdk/bean/TemperatureRange.java b/jni-example/decodesdk/bean/TemperatureRange.java new file mode 100644 index 0000000..00dd70a --- /dev/null +++ b/jni-example/decodesdk/bean/TemperatureRange.java @@ -0,0 +1,43 @@ +package net.irext.decodesdk.bean; + +/** + * Filename: TemperatureRange.java + * Revised: Date: 2017-03-28 + * Revision: Revision: 1.0 + *

+ * Description: Temperature range for air-conditioner + *

+ * Revision log: + * 2017-03-28: created by strawmanbobi + */ +public class TemperatureRange { + + private static final String TAG = TemperatureRange.class.getSimpleName(); + + private int tempMin; + private int tempMax; + + public TemperatureRange() { + } + + public TemperatureRange(int tempMin, int tempMax) { + this.tempMin = tempMin; + this.tempMax = tempMax; + } + + public int getTempMin() { + return tempMin; + } + + public void setTempMin(int tempMin) { + this.tempMin = tempMin; + } + + public int getTempMax() { + return tempMax; + } + + public void setTempMax(int tempMax) { + this.tempMax = tempMax; + } +} diff --git a/jni-example/decodesdk/libs/libirda_decoder.so b/jni-example/decodesdk/libs/libirda_decoder.so new file mode 100644 index 0000000000000000000000000000000000000000..5215a197c23705c8675d06565a6b89c1340464ed GIT binary patch literal 59910 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 literal 0 HcmV?d00001 diff --git a/jni-example/decodesdk/utils/Constants.java b/jni-example/decodesdk/utils/Constants.java new file mode 100644 index 0000000..41d79a6 --- /dev/null +++ b/jni-example/decodesdk/utils/Constants.java @@ -0,0 +1,175 @@ +package net.irext.decodesdk.utils; + +/** + * Filename: Constants.java + * Revised: Date: 2017-04-03 + * Revision: Revision: 1.0 + *

+ * Description: SDK Constants + *

+ * Revision log: + * 2017-04-03: created by strawmanbobi + */ +public class Constants { + + public static final int ERROR_CODE_SUCCESS = 0; + public static final int ERROR_CODE_NETWORK_ERROR = -1; + public static final int ERROR_CODE_AUTH_FAILURE = 1; + public static final int ERROR_CODE_INVALID_CATEGORY = 2; + public static final int ERROR_CODE_INVALID_BRAND = 3; + public static final int ERROR_CODE_INVALID_PARAMETER = 4; + + public enum CategoryID { + AIR_CONDITIONER(1), + TV(2), + STB(3), + NET_BOX(4), + IPTV(5), + DVD(6), + FAN(7), + PROJECTOR(8), + STEREO(9), + LIGHT(10), + BSTB(11), + CLEANING_ROBOT(12), + AIR_CLEANER(13); + + private final int id; + + CategoryID(int id) { + this.id = id; + } + + public int getValue() { + return id; + } + } + + public enum BinaryType { + TYPE_BINARY(0), + TYPE_HEXDECIMAL(1); + + private final int type; + + BinaryType(int type) { + this.type = type; + } + + public int getValue() { + return type; + } + } + + public enum ACPower { + POWER_ON(0), + POWER_OFF(1); + + private final int power; + + ACPower(int power) { + this.power = power; + } + + public int getValue() { + return power; + } + } + + public enum ACMode { + MODE_COOL(0), + MODE_HEAT(1), + MODE_AUTO(2), + MODE_FAN(3), + MODE_DEHUMIDITY(4); + + private final int mode; + + ACMode(int mode) { + this.mode = mode; + } + + public int getValue() { + return mode; + } + } + + public enum ACTemperature { + TEMP_16(0), + TEMP_17(1), + TEMP_18(2), + TEMP_19(3), + TEMP_20(4), + TEMP_21(5), + TEMP_22(6), + TEMP_23(7), + TEMP_24(8), + TEMP_25(9), + TEMP_26(10), + TEMP_27(11), + TEMP_28(12), + TEMP_29(13), + TEMP_30(14); + + private final int temp; + + ACTemperature(int temp) { + this.temp = temp; + } + + public int getValue() { + return temp; + } + } + + public enum ACWindSpeed { + SPEED_AUTO(0), + SPEED_LOW(1), + SPEED_MEDIUM(2), + SPEED_HIGH(3); + + private final int speed; + + ACWindSpeed(int speed) { + this.speed = speed; + } + + public int getValue() { + return speed; + } + } + + public enum ACSwing { + SWING_ON(0), + SWING_OFF(1); + + private final int swing; + + ACSwing(int swing) { + this.swing = swing; + } + + public int getValue() { + return swing; + } + } + + public enum ACFunction { + FUNCTION_SWITCH_POWER(1), + FUNCTION_CHANGE_MODE(2), + FUNCTION_TEMPERATURE_UP(3), + FUNCTION_TEMPERATURE_DOWN(4), + FUNCTION_SWITCH_WIND_SPEED(5), + FUNCTION_SWITCH_WIND_DIR(6), + FUNCTION_SWITCH_SWING(7); + + private final int function; + + ACFunction(int function) { + this.function = function; + } + + public int getValue() { + return function; + } + } +}