From d5656b028eb3e629f0213d458c104baadc79cdab Mon Sep 17 00:00:00 2001 From: BBIT-Kai <2911862937@qq.com> Date: Fri, 3 Jul 2026 09:05:50 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84485=E9=99=A4=E6=B9=BF?= =?UTF-8?q?=E6=9C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 + app/build.gradle | 4 +- .../SerialPortUtil.java | 30 +++ .../adapter/AutoControllerAdapter.java | 7 +- .../adapter/ManualControllerAdapter.java | 7 +- .../model/controller/Dehumidifier485.java | 69 ++++++- .../model/controller/relay/Dehumidifier.java | 1 + .../relay/Dehumidifier485Relay.java | 12 ++ .../model/controller/relay/Relay.java | 4 + .../ui/activity/DebugActivity.java | 12 +- .../ui/dialog/Dehumidifier485Dialog.java | 175 ++++++++++++++---- .../control/humidity/HumidityController.java | 4 +- .../utils/global/RoomController.java | 67 ++++++- .../utils/global/Variable.java | 5 + app/src/main/res/layout/activity_debug.xml | 12 +- .../res/layout/dialog_dehumidifier_485.xml | 147 +++++++++------ 16 files changed, 431 insertions(+), 127 deletions(-) create mode 100644 app/src/main/java/com/example/iot_controlhost/model/controller/relay/Dehumidifier485Relay.java diff --git a/.gitignore b/.gitignore index 66191e6..d6e0696 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ app/build/ .svn/ build/ +.kotlin/ +*.pdf diff --git a/app/build.gradle b/app/build.gradle index 7096e07..e69b6a0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,8 +10,8 @@ android { applicationId "com.example.iot_controlhost" minSdkVersion 25 targetSdkVersion 30 - versionCode 158 - versionName "3.5.0.158" + versionCode 159 + versionName "3.5.0.159" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" ndk { moduleName "mcu" diff --git a/app/src/main/java/android_serialport_api/SerialPortUtil.java b/app/src/main/java/android_serialport_api/SerialPortUtil.java index e60292f..0a7574f 100644 --- a/app/src/main/java/android_serialport_api/SerialPortUtil.java +++ b/app/src/main/java/android_serialport_api/SerialPortUtil.java @@ -8,6 +8,7 @@ import com.example.iot_controlhost.utils.global.HardwareSetting; import com.example.iot_controlhost.utils.log.MyLog; import java.io.File; +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -279,6 +280,35 @@ public class SerialPortUtil { return false; } + public String clearInputBuffer(long waitMs) { + if (!isStart || inputStream == null) { + return ""; + } + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + long endTime = System.currentTimeMillis() + Math.max(waitMs, 0); + try { + do { + int available = inputStream.available(); + if (available > 0) { + byte[] readData = new byte[available]; + int size = inputStream.read(readData); + if (size > 0) { + buffer.write(readData, 0, size); + } + } else if (waitMs > 0) { + Thread.sleep(20); + } + } while (System.currentTimeMillis() < endTime); + } catch (IOException | InterruptedException e) { + if (e instanceof InterruptedException) { + Thread.currentThread().interrupt(); + } + e.printStackTrace(); + } + byte[] readData = buffer.toByteArray(); + return readData.length == 0 ? "" : DataUtils.ByteArrToHex(readData); + } + public boolean isStart() { return isStart; } diff --git a/app/src/main/java/com/example/iot_controlhost/adapter/AutoControllerAdapter.java b/app/src/main/java/com/example/iot_controlhost/adapter/AutoControllerAdapter.java index d610d8e..7ebc352 100644 --- a/app/src/main/java/com/example/iot_controlhost/adapter/AutoControllerAdapter.java +++ b/app/src/main/java/com/example/iot_controlhost/adapter/AutoControllerAdapter.java @@ -130,13 +130,12 @@ public class AutoControllerAdapter extends BaseRecyclerAdapter 99) { return false; @@ -244,7 +275,7 @@ public class Dehumidifier485 extends Controller implements SetAddress { public String getWorkStatusText() { if (workStatus == 0) { - return "待机"; + return "运行中"; } StringBuilder builder = new StringBuilder(); appendStatus(builder, 0, "除湿"); @@ -256,7 +287,7 @@ public class Dehumidifier485 extends Controller implements SetAddress { @Override public boolean isAvailable() { - return isEnable() && !StringUtils.isEmpty(getAddress()); + return isEnable() && !StringUtils.isEmpty(getAddress()) && RoomController.dehumidifier485Relay.isAvailable(); } @Override @@ -336,10 +367,7 @@ public class Dehumidifier485 extends Controller implements SetAddress { } int power = getRegister(result, 0); powerSupply = power == 1; - setTargetHumidityCache(getRegister(result, 1)); - setTargetTemperatureCache(getRegister(result, 2)); - setFanSpeedCache(getRegister(result, 3)); - setWorkModeCache(getRegister(result, 4)); + // 设定项由写入成功后更新缓存,状态帧只刷新运行反馈,避免旧帧覆盖手动选择。 workStatus = getRegister(result, 5); int humidity = getRegister(result, 6); environmentHumidity = humidity == 0x00FF ? null : humidity; @@ -357,8 +385,15 @@ public class Dehumidifier485 extends Controller implements SetAddress { } private int getRegister(String result, int index) { + return getRegister(result, index, 0); + } + + private int getRegister(String result, int index, int defaultValue) { int start = 6 + index * 4; - return parseHex(result.substring(start, start + 4), 0); + if (result.length() < start + 4) { + return defaultValue; + } + return parseHex(result.substring(start, start + 4), defaultValue); } private boolean writeRegister(String address, int register, int value, boolean checkAvailable) { @@ -376,6 +411,20 @@ public class Dehumidifier485 extends Controller implements SetAddress { return serialPortUtil.sendSerialDataNoResponse(this, instruction); } + private boolean writePowerState(boolean state) { + if ("00".equals(getAddress())) { + return sendBroadcastPower(getAddress(), state, true); + } + return writeRegister(getAddress(), REG_POWER, state ? 1 : 0, true); + } + + private void clearPowerOnSerialBuffer() { + String droppedData = serialPortUtil.clearInputBuffer(POWER_ON_SERIAL_BUFFER_CLEAR_MS); + if (!StringUtils.isEmpty(droppedData)) { + MyLog.controller("485除湿机:清理上电串口残留 " + droppedData); + } + } + private boolean sendBroadcastPower(String address, boolean state, boolean checkAvailable) { if (checkAvailable && !isAvailable()) { return false; diff --git a/app/src/main/java/com/example/iot_controlhost/model/controller/relay/Dehumidifier.java b/app/src/main/java/com/example/iot_controlhost/model/controller/relay/Dehumidifier.java index a52da47..5352f64 100644 --- a/app/src/main/java/com/example/iot_controlhost/model/controller/relay/Dehumidifier.java +++ b/app/src/main/java/com/example/iot_controlhost/model/controller/relay/Dehumidifier.java @@ -26,6 +26,7 @@ public class Dehumidifier extends Relay { // 设置物理开关的方法 return super.setPowerSupply(state); } + @Override public boolean setPowerSupply(boolean state) { // 设置红外与物理开的方法 diff --git a/app/src/main/java/com/example/iot_controlhost/model/controller/relay/Dehumidifier485Relay.java b/app/src/main/java/com/example/iot_controlhost/model/controller/relay/Dehumidifier485Relay.java new file mode 100644 index 0000000..9a5a551 --- /dev/null +++ b/app/src/main/java/com/example/iot_controlhost/model/controller/relay/Dehumidifier485Relay.java @@ -0,0 +1,12 @@ +package com.example.iot_controlhost.model.controller.relay; + +import com.example.iot_controlhost.R; + +/** + * 485除湿机物理电源继电器。 + */ +public class Dehumidifier485Relay extends Relay { + public Dehumidifier485Relay(String name) { + super(name, R.mipmap.ven_open, R.mipmap.ven_close); + } +} diff --git a/app/src/main/java/com/example/iot_controlhost/model/controller/relay/Relay.java b/app/src/main/java/com/example/iot_controlhost/model/controller/relay/Relay.java index 86d8cb9..3ac14b7 100644 --- a/app/src/main/java/com/example/iot_controlhost/model/controller/relay/Relay.java +++ b/app/src/main/java/com/example/iot_controlhost/model/controller/relay/Relay.java @@ -320,6 +320,10 @@ public class Relay extends Controller implements SetAddress { return power; } + public String getPowerText() { + return new DecimalFormat("0.##").format(power); + } + public void setPower(double power) { this.power = power; } diff --git a/app/src/main/java/com/example/iot_controlhost/ui/activity/DebugActivity.java b/app/src/main/java/com/example/iot_controlhost/ui/activity/DebugActivity.java index e231d4c..4e85930 100644 --- a/app/src/main/java/com/example/iot_controlhost/ui/activity/DebugActivity.java +++ b/app/src/main/java/com/example/iot_controlhost/ui/activity/DebugActivity.java @@ -191,7 +191,7 @@ public class DebugActivity extends BaseActivity { + private static final long STATE_REFRESH_INTERVAL = 5 * 1000; + private static final String OPERATE_FAIL_MESSAGE = "操作485除湿机失败"; + private final Dehumidifier485 dehumidifier; + private final Handler stateRefreshHandler = new Handler(Looper.getMainLooper()); + private final Runnable stateRefreshRunnable = new Runnable() { + @Override + public void run() { + refreshStateSilently(); + } + }; public Dehumidifier485Dialog(@NonNull Context mContext, Dehumidifier485 dehumidifier) { super(mContext); @@ -46,14 +58,29 @@ public class Dehumidifier485Dialog extends BaseDialog changeDehumidifier(7)); } + @Override + public void show() { + super.show(); + scheduleStateRefresh(0); + } + private void refreshDehumidifier() { - TransitionManager.beginDelayedTransition(binding.ll, new Fade()); - binding.tvTargetHumidity.setText(dehumidifier.isPowerSupply() ? String.valueOf(dehumidifier.getTargetHumidity()) : "-"); - binding.tvEnvironmentHumidity.setText("环境湿度:" + dehumidifier.getEnvironmentHumidityText()); - binding.tvEnvironmentTemperature.setText("环境温度:" + dehumidifier.getEnvironmentTemperatureText()); - binding.tvWorkStatus.setText("状态:" + dehumidifier.getWorkStatusText()); - binding.tvFault.setText("故障:" + dehumidifier.getFaultText()); - binding.btnPower.setImageDrawable(mContext.getDrawable(dehumidifier.isPowerSupply() ? R.mipmap.open : R.mipmap.close)); + refreshDehumidifier(true); + } + + private void refreshDehumidifier(boolean animate) { + if (animate) { + TransitionManager.beginDelayedTransition(binding.ll, new Fade()); + } + boolean powerSupply = dehumidifier.isPowerSupply(); + binding.tvTargetHumidity.setText(powerSupply ? String.valueOf(dehumidifier.getTargetHumidity()) : "-"); + binding.tvEnvironmentTemperature.setText("环境温度:" + (powerSupply ? dehumidifier.getEnvironmentTemperatureText() : "-")); + binding.tvEnvironmentHumidity.setText("环境湿度:" + (powerSupply ? dehumidifier.getEnvironmentHumidityText() : "-")); + binding.tvWorkStatus.setText("目前状态:" + (powerSupply ? dehumidifier.getWorkStatusText() : "-")); + binding.tvFault.setText("故障情况:" + (powerSupply ? dehumidifier.getFaultText() : "-")); + binding.btnPower.setImageDrawable(mContext.getDrawable(powerSupply ? R.mipmap.open : R.mipmap.close)); + binding.modeDehumidify.setImageDrawable(mContext.getDrawable(RoomSetting.isDarkTheme() ? R.mipmap.cold_dark : R.mipmap.cold)); + binding.modeVentilation.setImageDrawable(mContext.getDrawable(RoomSetting.isDarkTheme() ? R.mipmap.auto_dark : R.mipmap.auto)); binding.ivSelDehumidify.setVisibility(dehumidifier.getWorkMode() == Dehumidifier485.MODE_DEHUMIDIFY ? View.VISIBLE : View.INVISIBLE); binding.ivSelVentilation.setVisibility(dehumidifier.getWorkMode() == Dehumidifier485.MODE_VENTILATION ? View.VISIBLE : View.INVISIBLE); binding.ivSelFanLow.setVisibility(dehumidifier.getFanSpeed() == Dehumidifier485.FAN_LOW ? View.VISIBLE : View.INVISIBLE); @@ -63,51 +90,44 @@ public class Dehumidifier485Dialog extends BaseDialog() { + MyQueue.start(MyQueue.TYPE_CONTROLLER, new QueueIOUITask() { @Override - public Boolean doInQueueThread() { + public OperateResult doInQueueThread() { switch (type) { case 0: if (dehumidifier.isPowerSupply()) { - return dehumidifier.setPowerSupply(false); + return OperateResult.from(dehumidifier.setPowerSupply(false), OPERATE_FAIL_MESSAGE); } - boolean powerResult = dehumidifier.setPowerSupply(true); - if (powerResult) { - dehumidifier.setWorkMode(dehumidifier.getWorkMode()); - dehumidifier.setFanSpeed(dehumidifier.getFanSpeed()); - dehumidifier.setTargetHumidity(dehumidifier.getTargetHumidity()); - dehumidifier.setTargetTemperature(dehumidifier.getTargetTemperature()); - } - return powerResult; + return openWithLastSetting(); case 1: - return dehumidifier.setTargetHumidity(dehumidifier.getTargetHumidity() - 1); + return operateAfterPowerOn(() -> dehumidifier.setTargetHumidity(dehumidifier.getTargetHumidity() - 1)); case 2: - return dehumidifier.setTargetHumidity(dehumidifier.getTargetHumidity() + 1); + return operateAfterPowerOn(() -> dehumidifier.setTargetHumidity(dehumidifier.getTargetHumidity() + 1)); case 3: - return dehumidifier.setWorkMode(Dehumidifier485.MODE_DEHUMIDIFY); + return operateAfterPowerOn(() -> dehumidifier.setWorkMode(Dehumidifier485.MODE_DEHUMIDIFY)); case 4: - return dehumidifier.setWorkMode(Dehumidifier485.MODE_VENTILATION); + return operateAfterPowerOn(() -> dehumidifier.setWorkMode(Dehumidifier485.MODE_VENTILATION)); case 5: - return dehumidifier.setFanSpeed(Dehumidifier485.FAN_LOW); + return operateAfterPowerOn(() -> dehumidifier.setFanSpeed(Dehumidifier485.FAN_LOW)); case 6: - return dehumidifier.setFanSpeed(Dehumidifier485.FAN_MIDDLE); + return operateAfterPowerOn(() -> dehumidifier.setFanSpeed(Dehumidifier485.FAN_MIDDLE)); case 7: - return dehumidifier.setFanSpeed(Dehumidifier485.FAN_HIGH); + return operateAfterPowerOn(() -> dehumidifier.setFanSpeed(Dehumidifier485.FAN_HIGH)); case 8: - return dehumidifier.readState(); + return OperateResult.from(dehumidifier.readState(), "读取485除湿机状态失败"); default: - return false; + return OperateResult.fail(OPERATE_FAIL_MESSAGE); } } @Override - public void doInUIThread(Boolean result) { - if (result) { + public void doInUIThread(OperateResult result) { + if (result.success) { successTips(dehumidifier.getState()); UserLog.operate("手动:操作485除湿机 " + dehumidifier.getState()); } else { - errorTips("操作485除湿机失败"); - UserLog.operateError("手动:操作485除湿机失败"); + errorTips(result.message); + UserLog.operateError("手动:操作485除湿机失败:" + result.message); } refreshDehumidifier(); DialogUtil.hideLoadingDialog(); @@ -115,8 +135,101 @@ public class Dehumidifier485Dialog extends BaseDialog() { + @Override + public Boolean doInQueueThread() { + return dehumidifier.isPowerSupply() && dehumidifier.readState(); + } + + @Override + public void doInUIThread(Boolean result) { + if (!isShowing()) { + return; + } + refreshDehumidifier(false); + scheduleStateRefresh(STATE_REFRESH_INTERVAL); + } + }); + } + + private void scheduleStateRefresh(long delay) { + stateRefreshHandler.removeCallbacks(stateRefreshRunnable); + stateRefreshHandler.postDelayed(stateRefreshRunnable, delay); + } + + private OperateResult openWithLastSetting() { + OperateResult powerResult = ensurePowerOn(); + if (!powerResult.success) { + return powerResult; + } + boolean modeResult = dehumidifier.setWorkMode(dehumidifier.getWorkMode()); + boolean fanResult = dehumidifier.setFanSpeed(dehumidifier.getFanSpeed()); + boolean humidityResult = dehumidifier.setTargetHumidity(dehumidifier.getTargetHumidity()); + boolean temperatureResult = dehumidifier.setTargetTemperature(dehumidifier.getTargetTemperature()); + if (modeResult && fanResult && humidityResult && temperatureResult) { + dehumidifier.readState(); + return OperateResult.success(); + } + return OperateResult.fail("开机成功,参数同步失败"); + } + + private OperateResult operateAfterPowerOn(DehumidifierOperation operation) { + OperateResult powerResult = ensurePowerOn(); + if (!powerResult.success) { + return powerResult; + } + return OperateResult.from(operation.run(), OPERATE_FAIL_MESSAGE); + } + + private OperateResult ensurePowerOn() { + if (dehumidifier.isPowerSupply()) { + return OperateResult.success(); + } + if (!dehumidifier.setPowerSupply(true)) { + return OperateResult.fail(OPERATE_FAIL_MESSAGE); + } + try { + Thread.sleep(500); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + return OperateResult.fail("开机成功,等待设备启动被中断"); + } + return OperateResult.success(); + } + + private interface DehumidifierOperation { + boolean run(); + } + + private static class OperateResult { + boolean success; + String message; + + private OperateResult(boolean success, String message) { + this.success = success; + this.message = message; + } + + static OperateResult success() { + return new OperateResult(true, null); + } + + static OperateResult fail(String message) { + return new OperateResult(false, message); + } + + static OperateResult from(boolean success, String failMessage) { + return success ? success() : fail(failMessage); + } + } + @Override public void dismiss() { + stateRefreshHandler.removeCallbacks(stateRefreshRunnable); super.dismiss(); if (RoomSetting.getMode() == 0) { RxBusUtils.get().post(RxTag.UPDATE_MANUAL, 0); diff --git a/app/src/main/java/com/example/iot_controlhost/utils/control/humidity/HumidityController.java b/app/src/main/java/com/example/iot_controlhost/utils/control/humidity/HumidityController.java index 873eb04..b0e3272 100644 --- a/app/src/main/java/com/example/iot_controlhost/utils/control/humidity/HumidityController.java +++ b/app/src/main/java/com/example/iot_controlhost/utils/control/humidity/HumidityController.java @@ -121,12 +121,12 @@ public class HumidityController extends Control { if (autoDehumidifier != null) { MyQueue.getInstance(MyQueue.TYPE_CONTROLLER).addTask(new QueueIOTask(() -> { MyLog.auto("自动:" + (dehumidifierState ? "开启" : "关闭") + "除湿机--"); - if (autoDehumidifier instanceof Dehumidifier485 && dehumidifierState) { + boolean operateResult = MyUtil.autoControlOperateThird(autoDehumidifier, dehumidifierState); + if (operateResult && autoDehumidifier instanceof Dehumidifier485 && dehumidifierState) { Dehumidifier485 dehumidifier485 = (Dehumidifier485) autoDehumidifier; dehumidifier485.setWorkMode(Dehumidifier485.MODE_DEHUMIDIFY); dehumidifier485.setTargetHumidity(dehumidifierTargetHumidity); } - MyUtil.autoControlOperateThird(autoDehumidifier, dehumidifierState); })); } } diff --git a/app/src/main/java/com/example/iot_controlhost/utils/global/RoomController.java b/app/src/main/java/com/example/iot_controlhost/utils/global/RoomController.java index 93ae5a8..ceb52d9 100644 --- a/app/src/main/java/com/example/iot_controlhost/utils/global/RoomController.java +++ b/app/src/main/java/com/example/iot_controlhost/utils/global/RoomController.java @@ -9,6 +9,7 @@ import com.example.iot_controlhost.model.controller.DehumidifierInfrared; import com.example.iot_controlhost.model.controller.Floor; import com.example.iot_controlhost.model.controller.relay.AirCondition; import com.example.iot_controlhost.model.controller.relay.Dehumidifier; +import com.example.iot_controlhost.model.controller.relay.Dehumidifier485Relay; import com.example.iot_controlhost.model.controller.relay.Fan; import com.example.iot_controlhost.model.controller.relay.FloorRelay; import com.example.iot_controlhost.model.controller.relay.Relay; @@ -37,7 +38,7 @@ public class RoomController { "空调", "加湿器", "进气扇", "排气扇", "红光灯",//1-5 "白光灯", "匀风扇", "消毒灯", "空调红外控制器", "继电器",//6-10 "继电器-地暖", "换气扇", "新风", "空调红外控制器2", "除湿机红外控制器",//11-15 - "除湿机"// 16 + "除湿机", "485除湿电源"// 16-17 }; //——————————————————————————————————————————————以下为控制器—————————————————————————————————————————————————— @@ -75,6 +76,10 @@ public class RoomController { * 继电器-除湿机 */ public static Dehumidifier dehumidifier = new Dehumidifier(DEVICE_NAME[16]); + /** + * 485除湿机物理电源 + */ + public static Dehumidifier485Relay dehumidifier485Relay = new Dehumidifier485Relay(DEVICE_NAME[17]); /** * 加湿器 */ @@ -124,7 +129,8 @@ public class RoomController { */ public static List getAllRelayDevice() { List devices = new ArrayList<>(); - Collections.addAll(devices, relayFloor, airCondition, dehumidifier, humidifier, intakeFan, evenFan, exhaustFan, uvLight, whiteLight, redLight, airExchange); + Collections.addAll(devices, relayFloor, airCondition, dehumidifier, dehumidifier485Relay, + humidifier, intakeFan, evenFan, exhaustFan, uvLight, whiteLight, redLight, airExchange); return devices; } @@ -172,6 +178,7 @@ public class RoomController { devices.remove(RoomController.exhaustFan); devices.remove(RoomController.relayFloor); devices.remove(RoomController.airCondition); + devices.remove(RoomController.dehumidifier485Relay); return devices; } @@ -234,6 +241,8 @@ public class RoomController { return airExchange; case 16: return dehumidifier; + case 17: + return dehumidifier485Relay; default: //尝试获得名字错误的->继电器 return null; @@ -257,13 +266,19 @@ public class RoomController { //关闭单独设备 MyInfraredUtils.getInstances().setPowerSupply(false); RoomController.floor.setPowerSupply(false); - RoomController.dehumidifier485.setPowerSupply(false); + if (RoomController.dehumidifier485.isAvailable()) { + RoomController.dehumidifier485.setPowerSupply(false); + } //关闭继电器下的所有设备 List devices = getAllAvailableRelays(); //除了空调物理电源 devices.remove(RoomController.airCondition); //除了除湿机物理电源 devices.remove(RoomController.dehumidifier); + if (RoomController.dehumidifier485.isAvailable()) { + //除了485除湿机物理电源 + devices.remove(RoomController.dehumidifier485Relay); + } for (Relay r : devices) { r.setPowerSupply(false); } @@ -282,14 +297,25 @@ public class RoomController { }); // 检查除湿机功率是否与除湿机物理电源状态匹配,时刻监测当前除湿机功率状态,使之与软件开关匹配 // 防止出现软件界面中开启除湿器但实际上除湿器未开启(功率不足100W)的情况 - if (RoomController.dehumidifier.isAvailable()) { + if (RoomController.dehumidifier.isAvailable() || RoomController.dehumidifier485Relay.isAvailable()) { PollingTask.getInstance().startPollingTaskOnIOThread(RxTag.TAG_DEHUMIDIFIER_STATUS, 60, () -> { - if (RoomController.dehumidifier.isPowerSupply() && RoomController.dehumidifier.getPower() < 100) { + if (RoomController.dehumidifier.isAvailable() && RoomController.dehumidifier.isPowerSupply() && RoomController.dehumidifier.getPower() < 100) { MyLog.controllerError("除湿机电源已开启但功率不足100W,现尝试再次开启除湿机物理电源"); - MyQueue.getInstance(MyQueue.TYPE_CONTROLLER).addTask(new QueueIOTask(() -> RoomController.dehumidifier.setPowerSupply(true))); - } else if (!RoomController.dehumidifier.isPowerSupply() && RoomController.dehumidifier.getPower() > 100) { + MyQueue.getInstance(MyQueue.TYPE_CONTROLLER).addTask(new QueueIOTask(() -> RoomController.dehumidifier.setPowerSupplyForOld(true))); + } else if (RoomController.dehumidifier.isAvailable() && !RoomController.dehumidifier.isPowerSupply() && RoomController.dehumidifier.getPower() > 100) { MyLog.controllerError("除湿机电源已关闭但功率大于100W,现尝试再次关闭除湿机物理电源"); - MyQueue.getInstance(MyQueue.TYPE_CONTROLLER).addTask(new QueueIOTask(() -> RoomController.dehumidifier.setPowerSupply(false))); + MyQueue.getInstance(MyQueue.TYPE_CONTROLLER).addTask(new QueueIOTask(() -> RoomController.dehumidifier.setPowerSupplyForOld(false))); + } + if (RoomController.dehumidifier485Relay.isAvailable() + && RoomController.dehumidifier485.isPowerSupply() + && RoomController.dehumidifier485Relay.getPower() < 100) { + MyLog.controllerError("485除湿机电源已开启但功率不足100W,现尝试再次开启485除湿机物理电源"); + MyQueue.getInstance(MyQueue.TYPE_CONTROLLER).addTask(new QueueIOTask(() -> RoomController.dehumidifier485Relay.setPowerSupply(true))); + } else if (RoomController.dehumidifier485Relay.isAvailable() + && !RoomController.dehumidifier485.isPowerSupply() + && RoomController.dehumidifier485Relay.getPower() > 100) { + MyLog.controllerError("485除湿机电源已关闭但功率大于100W,现尝试再次关闭485除湿机物理电源"); + MyQueue.getInstance(MyQueue.TYPE_CONTROLLER).addTask(new QueueIOTask(() -> RoomController.dehumidifier485Relay.setPowerSupply(false))); } }); } @@ -305,11 +331,22 @@ public class RoomController { // MyLog.test("空调后台线程:不采取操作"); } - if (dehumidifier.isAvailable() && !dehumidifierInfrared.isPowerSupply() && doNotNeedDelayCloseDehumidifier) { + if (dehumidifier.isAvailable() + && !dehumidifierInfrared.isPowerSupply() + && doNotNeedDelayCloseDehumidifier) { MyQueue.getInstance(MyQueue.TYPE_CONTROLLER).addTask(new QueueIOTask(() -> RoomController.dehumidifier.setPowerSupplyForOld(false))); } else { doNotNeedDelayCloseDehumidifier = true; } + + if (dehumidifier485Relay.isAvailable() + && dehumidifier485Relay.isPowerSupply() + && !dehumidifier485.isPowerSupply() + && doNotNeedDelayCloseDehumidifier485) { + MyQueue.getInstance(MyQueue.TYPE_CONTROLLER).addTask(new QueueIOTask(() -> RoomController.dehumidifier485Relay.setPowerSupply(false))); + } else { + doNotNeedDelayCloseDehumidifier485 = true; + } }); //其他设备,使保持运行状态 PollingTask.getInstance().startPollingTaskOnIOThread(RxTag.TAG_CONTROLLER_STATE_CHECK_OTHER, Variable.CHECK_CLOSE_INFRARED, () -> { @@ -324,6 +361,10 @@ public class RoomController { RoomController.dehumidifier.setPowerSupplyForOld(RoomController.dehumidifier.isPowerSupply()); continue; } + if (relay.getName().equals(RoomController.dehumidifier485Relay.getName())) { + RoomController.dehumidifier485Relay.setPowerSupply(RoomController.dehumidifier485Relay.isPowerSupply()); + continue; + } MyUtil.autoControlOperateThird(relay, relay.isPowerSupply()); } } @@ -337,15 +378,21 @@ public class RoomController { */ public static boolean doNotNeedDelayCloseAirCondition = true; public static boolean doNotNeedDelayCloseDehumidifier = true; + public static boolean doNotNeedDelayCloseDehumidifier485 = true; public static void closeAllControllers() { List relays = RoomController.getAllAvailableRelays(); MyInfraredUtils.getInstances().setPowerSupply(false); RoomController.dehumidifier.setPowerSupply(false); - RoomController.dehumidifier485.setPowerSupply(false); + if (RoomController.dehumidifier485.isAvailable()) { + RoomController.dehumidifier485.setPowerSupply(false); + } RoomController.floor.setPowerSupply(false); relays.remove(RoomController.airCondition); relays.remove(RoomController.dehumidifier); + if (RoomController.dehumidifier485.isAvailable()) { + relays.remove(RoomController.dehumidifier485Relay); + } for (Relay r : relays) { r.setPowerSupply(false); } diff --git a/app/src/main/java/com/example/iot_controlhost/utils/global/Variable.java b/app/src/main/java/com/example/iot_controlhost/utils/global/Variable.java index 788e77e..a683908 100644 --- a/app/src/main/java/com/example/iot_controlhost/utils/global/Variable.java +++ b/app/src/main/java/com/example/iot_controlhost/utils/global/Variable.java @@ -41,6 +41,11 @@ public class Variable { * 单位:毫秒 */ public static final long WAIT_START_INFRARED = 2 * 1000; + /** + * 开启物理开关后开启空调遥控的等待时间 + * 单位:毫秒 + */ + public static final long WAIT_START_485_DE = 5 * 1000; /** * 开启物理开关后开启空调遥控的等待时间 * 单位:毫秒 diff --git a/app/src/main/res/layout/activity_debug.xml b/app/src/main/res/layout/activity_debug.xml index 25e0a79..2e41945 100644 --- a/app/src/main/res/layout/activity_debug.xml +++ b/app/src/main/res/layout/activity_debug.xml @@ -149,7 +149,9 @@ android:id="@+id/tv_send" android:layout_width="0dp" android:layout_height="match_parent" - android:layout_weight="4" /> + android:layout_weight="4" + android:ellipsize="end" + android:singleLine="true" /> @@ -175,7 +177,9 @@ android:id="@+id/tv_receive" android:layout_width="0dp" android:layout_height="match_parent" - android:layout_weight="4" /> + android:layout_weight="4" + android:ellipsize="end" + android:singleLine="true" /> @@ -201,7 +205,9 @@ android:id="@+id/tv_parse" android:layout_width="0dp" android:layout_height="match_parent" - android:layout_weight="4" /> + android:layout_weight="4" + android:ellipsize="end" + android:singleLine="true" /> diff --git a/app/src/main/res/layout/dialog_dehumidifier_485.xml b/app/src/main/res/layout/dialog_dehumidifier_485.xml index 34435c3..0128ff9 100644 --- a/app/src/main/res/layout/dialog_dehumidifier_485.xml +++ b/app/src/main/res/layout/dialog_dehumidifier_485.xml @@ -13,7 +13,7 @@ + + + + + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="@+id/guideline_status_info" /> + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="@+id/guideline_status_info" /> + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="@+id/guideline_status_info" /> + app:layout_constraintStart_toStartOf="@+id/guideline_status_info" /> @@ -157,8 +182,8 @@ @@ -208,16 +235,16 @@ android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" - android:padding="18dp" - android:src="@mipmap/hum_open" /> + android:padding="15dp" + android:src="@mipmap/cold" /> + android:padding="15dp" + android:src="@mipmap/auto" /> @@ -253,7 +280,7 @@ - - - - - - - - - - + + + + + + + + + +