power off alarm app

本文记录了解决高通定时开关机功能中遇到的问题,即关机闹钟启动后导致定时开机失效的情况。文中提到的arrays.xml文件中的power_off_alarm_apps数组用于存储关机闹钟启动时会一并启动的应用包名。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记录:

frameworks\base\core\res\res\values\arrays.xml 中的power_off_alarm_apps里面记录了关机闹钟启动后会同时启动的应用包名。在路径frameworks\base\core\java\android\content\pm\PackageParser.java 里的isPowerOffAlarmPackage()方法引用了这一数组。 

记录这个是因为最近修改高通写的定时开关机功能在关机闹钟启动后并关机,定时开机失效的问题而记录。

#define BLINKER_PRINT Serial #define BLINKER_WIFI #define BLINKER_HEARTBEAT 60 // 增加心跳间隔到60秒 #define BLINKER_RECONNECT_TIMEOUT 10 // 增加重连超时时间 #include <Blinker.h> #include <ESP8266WiFi.h> #include <Ticker.h> // 设备认证信息 const char auth[] = "3b7880821597"; // 点灯APP密钥 // WiFi配置 const char ssid[] = "TP-LINK-3003-2.4G"; // WiFi名称 const char pswd[] = "18947109503123"; // WiFi密码 // 硬件引脚定义 #define HALL_SENSOR_PIN D5 // 霍尔水流传感器(中断引脚) #define WATER_LEAK_PIN D6 // 水浸传感器(无源接点) #define GAS_ALARM_PIN D7 // 燃气报警(无源接点) #define AC_POWER_PIN D8 // 市电检测(光耦输出) #define MODE_SWITCH_PIN D0 // 手动/自动模式选择 #define WATER_VALVE_PIN D1 // 水阀控制(继电器) #define GAS_VALVE_PIN D2 // 燃气阀控制(继电器) #define NETWORK_LED_PIN D4 // 网络指示灯(板载LED) // 点灯APP组件 BlinkerNumber FLOW_RATE("num-tx5"); // 水流量显示 BlinkerText MODE_STATUS("tex-fjr"); // 模式状态 BlinkerText FLOW_ALARM("tex-dcn"); // 水流报警 BlinkerText WATER_LEAK_ALARM("tex-zce"); // 水浸报警 BlinkerText GAS_ALARM("tex-vjr"); // 燃气报警 BlinkerText POWER_ALARM("tex-gw5"); // 停电报警 BlinkerSlider FLOW_THRESHOLD("ran-bma"); // 水流阈值(0-18) BlinkerSlider DELAY_TIME("ran-xi2"); // 延时时间(0-120) BlinkerButton WATER_VALVE_SW("swi-o09"); // 水阀开关 BlinkerButton GAS_VALVE_SW("swi-9fj"); // 燃气阀开关 // 全局变量 volatile unsigned long pulseCount = 0; // 水流脉冲计数 float flowRate = 0.0; // 当前流量(L/min) float lastReportedFlow = -1; // 上次报告的流量值 float flowThreshold = 10.0; // 流量阈值(默认10L/min) unsigned int delayMinutes = 30; // 延时时间(默认30分钟) bool isAutoMode = true; // 运行模式 bool waterValveState = false; // 水阀状态 bool gasValveState = false; // 燃气阀状态 bool flowAlarm = false; // 水流报警标志 bool waterLeakAlarm = false; // 水浸报警标志 bool gasAlarm = false; // 燃气报警标志 bool powerAlarm = false; // 停电报警标志 unsigned long flowExceedStartTime = 0; // 超流量开始时间 Ticker ledTicker; // LED状态切换定时器 unsigned long lastBlinkerRun = 0; // 记录上次Blinker.run()时间 unsigned long lastFlowCalcTime = 0; // 记录上次流量计算时间 unsigned long lastAlarmCheckTime = 0; // 记录上次报警检查时间 bool wifiConnected = false; // WiFi连接状态标志 // ========== 中断服务函数 ========== ICACHE_RAM_ATTR void pulseCounter() { pulseCount++; } // ========== LED控制函数 ========== void updateLed() { static bool ledState = false; // 稳定连接状态判断:同时满足WiFi和MQTT连接 bool stableConnection = wifiConnected && Blinker.connected(); if (stableConnection) { // 稳定连接时保持LED常亮 digitalWrite(NETWORK_LED_PIN, LOW); } else { // 非稳定连接时慢速闪烁 (1秒周期) ledState = !ledState; digitalWrite(NETWORK_LED_PIN, ledState ? HIGH : LOW); } } // ========== 水流计算函数 ========== void calculateFlow() { static unsigned long lastPulseCount = 0; // 禁用中断确保计数准确 noInterrupts(); unsigned long currentPulseCount = pulseCount; interrupts(); // 计算每秒的脉冲数 flowRate = (currentPulseCount - lastPulseCount) * 0.1333f; // 转换为L/min lastPulseCount = currentPulseCount; // 仅当流量变化超过0.5L/min时更新APP显示 if (abs(flowRate - lastReportedFlow) > 0.5 || flowRate == 0) { FLOW_RATE.print(flowRate); lastReportedFlow = flowRate; BLINKER_LOG("更新流量: %.1f L/min", flowRate); } } // ========== 回调函数 ========== // 水流阈值设置回调 void flowThresholdCallback(int32_t value) { flowThreshold = value; BLINKER_LOG("设置水流阈值: %.1f L/min", flowThreshold); flowExceedStartTime = 0; } // 延时时间设置回调 void delayTimeCallback(int32_t value) { delayMinutes = value; BLINKER_LOG("设置延时时间: %d 分钟", delayMinutes); } // 水阀控制回调 void waterValveCallback(const String &state) { bool newState = (state == "on"); if (newState && (waterLeakAlarm || flowAlarm)) { WATER_VALVE_SW.print("off"); return; } waterValveState = newState; digitalWrite(WATER_VALVE_PIN, newState ? HIGH : LOW); WATER_VALVE_SW.print(state); if (!newState && flowAlarm) { flowAlarm = false; FLOW_ALARM.print("水流正常"); flowExceedStartTime = 0; } } // 燃气阀控制回调 void gasValveCallback(const String &state) { bool newState = (state == "on"); if (newState && gasAlarm) { GAS_VALVE_SW.print("off"); return; } gasValveState = newState; digitalWrite(GAS_VALVE_PIN, newState ? HIGH : LOW); GAS_VALVE_SW.print(state); if (!newState && gasAlarm) { gasAlarm = false; GAS_ALARM.print("燃气正常"); } } // ========== 报警检测函数 ========== void checkAlarms() { // 水浸检测 bool currentWaterLeak = (digitalRead(WATER_LEAK_PIN) == LOW); if (currentWaterLeak != waterLeakAlarm) { waterLeakAlarm = currentWaterLeak; WATER_LEAK_ALARM.print(waterLeakAlarm ? "水浸报警" : "水浸正常"); if (waterLeakAlarm && waterValveState) { waterValveState = false; digitalWrite(WATER_VALVE_PIN, LOW); WATER_VALVE_SW.print("off"); } } // 燃气检测 bool currentGasAlarm = (digitalRead(GAS_ALARM_PIN) == LOW); if (currentGasAlarm != gasAlarm) { gasAlarm = currentGasAlarm; GAS_ALARM.print(gasAlarm ? "燃气报警" : "燃气正常"); if (gasAlarm && gasValveState) { gasValveState = false; digitalWrite(GAS_VALVE_PIN, LOW); GAS_VALVE_SW.print("off"); } } // 市电检测 bool currentPowerState = (digitalRead(AC_POWER_PIN) == HIGH); if (!currentPowerState != powerAlarm) { powerAlarm = !currentPowerState; POWER_ALARM.print(powerAlarm ? "停电报警" : "市电正常"); } // 模式检测 bool newMode = (digitalRead(MODE_SWITCH_PIN) == HIGH); if (newMode != isAutoMode) { isAutoMode = newMode; MODE_STATUS.print(isAutoMode ? "自动模式" : "手动模式"); } // 流量报警检测 (仅在自动模式下) if (isAutoMode && waterValveState) { if (flowRate > flowThreshold) { if (!flowAlarm) { flowExceedStartTime = millis(); flowAlarm = true; } // 检查是否超过延迟时间 if (flowAlarm && (millis() - flowExceedStartTime) > (delayMinutes * 60000UL)) { waterValveState = false; digitalWrite(WATER_VALVE_PIN, LOW); WATER_VALVE_SW.print("off"); FLOW_ALARM.print("超流量关闭"); } else if (flowAlarm) { FLOW_ALARM.print("流量超限!"); } } else if (flowAlarm) { flowAlarm = false; flowExceedStartTime = 0; FLOW_ALARM.print("水流正常"); } } else if (flowAlarm) { flowAlarm = false; FLOW_ALARM.print("水流正常"); } } // ========== WiFi连接管理 ========== void checkWiFiConnection() { static unsigned long lastCheck = 0; if (millis() - lastCheck < 10000) return; // 每10秒检查一次 lastCheck = millis(); bool currentWifiStatus = (WiFi.status() == WL_CONNECTED); if (currentWifiStatus != wifiConnected) { wifiConnected = currentWifiStatus; if (wifiConnected) { BLINKER_LOG("WiFi已连接!"); Blinker.begin(auth, ssid, pswd); } else { BLINKER_LOG("WiFi断开!"); } } } // ========== 主初始化函数 ========== void setup() { Serial.begin(115200); BLINKER_DEBUG.stream(Serial); BLINKER_LOG("系统启动中..."); // 初始化GPIO pinMode(WATER_VALVE_PIN, OUTPUT); pinMode(GAS_VALVE_PIN, OUTPUT); pinMode(NETWORK_LED_PIN, OUTPUT); pinMode(HALL_SENSOR_PIN, INPUT_PULLUP); pinMode(WATER_LEAK_PIN, INPUT_PULLUP); pinMode(GAS_ALARM_PIN, INPUT_PULLUP); pinMode(AC_POWER_PIN, INPUT); pinMode(MODE_SWITCH_PIN, INPUT); // 初始状态 digitalWrite(WATER_VALVE_PIN, LOW); digitalWrite(GAS_VALVE_PIN, LOW); digitalWrite(NETWORK_LED_PIN, HIGH); // 初始时LED熄灭 // 设置中断 attachInterrupt(digitalPinToInterrupt(HALL_SENSOR_PIN), pulseCounter, FALLING); // 初始化WiFi和Blinker WiFi.setSleepMode(WIFI_NONE_SLEEP); // 禁用WiFi休眠 WiFi.setAutoReconnect(true); WiFi.begin(ssid, pswd); // 注册回调 WATER_VALVE_SW.attach(waterValveCallback); GAS_VALVE_SW.attach(gasValveCallback); FLOW_THRESHOLD.attach(flowThresholdCallback); DELAY_TIME.attach(delayTimeCallback); // 启动定时器 ledTicker.attach(0.5, updateLed); // 每500ms更新一次LED BLINKER_LOG("初始化完成,等待连接..."); } // ========== 主循环函数 ========== void loop() { // 非阻塞式Blinker运行 if (millis() - lastBlinkerRun >= 100) { Blinker.run(); lastBlinkerRun = millis(); } // 检查WiFi连接 checkWiFiConnection(); // 每500ms计算一次流量 if (millis() - lastFlowCalcTime >= 500) { calculateFlow(); lastFlowCalcTime = millis(); } // 每1秒检查一次报警 if (millis() - lastAlarmCheckTime >= 1000) { checkAlarms(); lastAlarmCheckTime = millis(); } // 喂狗和延时释放 ESP.wdtFeed(); delay(10); // 防止循环过快 } 帮我检测这段代码?有问题吗?会不会因打开app后总重启呢?
最新发布
07-25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值