关于RK芯片定时开关机周模式的梳理设定
这篇博客也是花费了好几天的工作量,从开始的毫无头绪到各种设定被打乱,直到现在的版本,主要是一种逻辑。
有时候我们程序员遇到问题会去死磕bug 。 这几天就完成了一个逻辑,一个比较复杂的业务逻辑。这个时候如果一步完成的话会比较复杂的话,其实有更多的选择,比如通过两个界面或者3个相同的界面,去处理不同的业务逻辑.
说远了,不扯了,先看一下后台设定的定时开关机效果图.
嗯,效果看上去比较简洁。但是获取的数据对于设备端来说是个噩梦. 系统的形式开关机需要我输入 年月日,时分秒,精确到秒,一眼看过去,全部都是以星期来定义的.,我是这样梳理的,
1: 设备定时开关机是 年月日 时分秒
2 : 服务器的数据的星期
3: 获取当天的日期,星期,以今天为基准,吧数据库所有的数据增加年月日时分秒
4:开机时间,关机时间分别分开存储
5:获取目前的时间戳
6:使用储存的数据比对,比现在大的,最小的一个就是下一个的关机时间
7:比关机时间大的最小的一个就是开机时间.
8:这样就可以获取下一次的开机时间和关机时间
详情请见代码,下面的就是筛选下一次的开关机时间
package com.etv.util.system;
import com.etv.entity.ScheduleRecord;
import com.etv.entity.TimeEntity;
import com.etv.util.MyLog;
import com.etv.util.SimpleDateUtil;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
/***
* 此类是用来获取定时开关机
*的开机时间 和 关机时间
*
*/
public class TSchedule {
/****
* 1:星期小于当天的星期
* 2:算法 7-currentWeek+weekList
*
* 2:如果星期大于当天
* 2:算法 weekList-current
*
* 给所有的定时开关机设定完整的日期,直接对完整的日期进行排序分组
*
*
*/
public static List<ScheduleRecord> initTimerTask(List<ScheduleRecord> listSch, boolean isOnOff) {
Calendar calendar = Calendar.getInstance();
int currentDayWeek = calendar.get(Calendar.DAY_OF_WEEK); //今天的工作星期
Long currentTimeMillis = System.currentTimeMillis();
long simpleTime = SimpleDateUtil.formatBig(currentTimeMillis);
//以今天基准,遍历所有日期,补全所有的时间数据
TimeEntity entity = SimpleDateUtil.getFormatLongTime(simpleTime);
for (int i = 0; i < listSch.size(); i++) {
ScheduleRecord scheduleRecord = listSch.get(i);
int weekList = scheduleRecord.getDayOfWeek();
int distanceDay = 0;
int year = entity.getYear();
int month = entity.getMonth();
int day = entity.getDay();
if (weekList < currentDayWeek) {
distanceDay = 7 - currentDayWeek + weekList;
} else { //星期属大于今天
distanceDay = weekList - currentDayWeek;
}
day = day + distanceDay;
if (month == 12 && day > 31) { //跨年了
year = year + 1;
}
if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
if (day > 31) {
day = day - 31;
month = month + 1;
}
} else if (month == 4 || month == 6 || month == 9 || month == 11) {
if (day > 30) {
day = day - 30;
month = month + 1;
}
} else if (month == 2) {
if (year % 4 == 0 && year % 100 != 0) {//闰年
if (day > 29) {
day = day - 29;
month = month + 1;
}
} else if (year % 400 == 0) { //闰年
if (day > 29) {
day = day - 29;
month = month + 1;
}
} else { //平年
if (day > 28) {
day = day - 28;
month = month + 1;
}
}
}
scheduleRecord.setYear(year);
scheduleRecord.setMonth(month);
scheduleRecord.setDay(day);
}
return matchPowerTime(listSch, isOnOff);
}
private static List<ScheduleRecord> matchPowerTime(List<ScheduleRecord> listSch, boolean isOnOff) {
List<ScheduleRecord> listPowerOn = new ArrayList<ScheduleRecord>();
List<ScheduleRecord> listPowerOff = new ArrayList<ScheduleRecord>();
for (int k = 0; k < listSch.size(); k++) {
ScheduleRecord schduleRecorder = listSch.get(k);
int year = schduleRecorder.getYear();
int month = schduleRecorder.getMonth();
int day = schduleRecorder.getDay();
int powerOnTHour = schduleRecorder.getPowerHour();
int powerOnMin = schduleRecorder.getPowerMinute();
int powerOffTHour = schduleRecorder.getCloseHour();
int powerOffMin = schduleRecorder.getCloseMinute();
String firstHour = "";
String firstMin = "";
if (powerOnTHour < 10) {
firstHour = "0";
}
if (powerOnMin < 10) {
firstMin = "0";
}
String endHour = "";
String endMin = "";
if (powerOffTHour < 10) {
endHour = "0";
}
if (powerOffMin < 10) {
endMin = "0";
}
String onTime = year + "" + month + "" + day + "" + firstHour + powerOnTHour + firstMin + powerOnMin + "00";
String offTime = year + "" + month + "" + day + "" + endHour + powerOffTHour + endMin + powerOffMin + "00";
listPowerOn.add(new ScheduleRecord(year, month, day, schduleRecorder.getDayOfWeek(), schduleRecorder.getPowerHour(), schduleRecorder.getPowerMinute(), 0, 0, ""));
listPowerOff.add(new ScheduleRecord(year, month, day, schduleRecorder.getDayOfWeek(), 0, 0, schduleRecorder.getCloseHour(), schduleRecorder.getCloseMinute(), ""));
MyLog.powerOnOff("===========封装的开机的时间===" + onTime);
MyLog.powerOnOff("===========封装的关机的时间===" + offTime);
}
if (isOnOff) {
return listPowerOn;
} else {
return listPowerOff;
}
}
/***
* 获取最早的开关机时间
* @param lists
*/
public static long getLastPowerOffTime(List<ScheduleRecord> lists) {
long backTime = -1;
List<ScheduleRecord> listPowerOff = initTimerTask(lists, false);
if (listPowerOff.size() < 1) {
return backTime;
}
long[] powerOffArr = new long[listPowerOff.size()];
for (int i = 0; i < listPowerOff.size(); i++) {
ScheduleRecord mScheduleRecord = listPowerOff.get(i);
long timeToLong = formatTimePowerOn(mScheduleRecord, false);
powerOffArr[i] = timeToLong;
}
powerOffArr = Bubblesort(powerOffArr);
long currentTime = SimpleDateUtil.formatBig(System.currentTimeMillis());
for (long number : powerOffArr) {
MyLog.powerOnOff("====遍历纯属的时间==" + number + " / " + currentTime);
if (number > currentTime) {
backTime = number;
MyLog.powerOnOff("====000遍历纯属的时间==" + number + " / " + currentTime);
break;
}
}
MyLog.powerOnOff("====排序后获取的关机==" + backTime);
return backTime;
}
public static long getLastPowerOnTime(List<ScheduleRecord> lists, long powerOffTime) {
long backTime = -1;
List<ScheduleRecord> listPowerOn = initTimerTask(lists, true);
if (listPowerOn.size() < 1) {
return backTime;
}
long[] powerOnArr = new long[listPowerOn.size()];
for (int i = 0; i < listPowerOn.size(); i++) {
ScheduleRecord mScheduleRecord = listPowerOn.get(i);
long timeToLong = formatTimePowerOn(mScheduleRecord, true);
powerOnArr[i] = timeToLong;
}
powerOnArr = Bubblesort(powerOnArr);
for (long number : powerOnArr) {
if (number > powerOffTime) {
backTime = number;
break;
}
}
MyLog.powerOnOff("====排序后获取的开机时间==" + backTime);
return backTime;
}
/***
* 冒泡算法排序
* @param arr
* @return
*/
public static long[] Bubblesort(long[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
long temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
return arr;
}
/***
*
* @param schduleRecorder
* @param on
* true 解析开机列表
* false 解析关机列表
* @return
*/
public static long formatTimePowerOn(ScheduleRecord schduleRecorder, boolean on) {
int year = schduleRecorder.getYear();
int month = schduleRecorder.getMonth();
int day = schduleRecorder.getDay();
String firstHour = "";
String firstMin = "";
String onTime = "";
if (on) { //开机时间
int powerOnTHour = schduleRecorder.getPowerHour();
int powerOnMin = schduleRecorder.getPowerMinute();
if (powerOnTHour < 10) {
firstHour = "0";
}
if (powerOnMin < 10) {
firstMin = "0";
}
onTime = year + "" + month + "" + day + "" + firstHour + powerOnTHour + firstMin + powerOnMin + "00";
} else {
int powerOffTHour = schduleRecorder.getCloseHour();
int powerOffMin = schduleRecorder.getCloseMinute();
String endHour = "";
String endMin = "";
if (powerOffTHour < 10) {
endHour = "0";
}
if (powerOffMin < 10) {
endMin = "0";
}
onTime = year + "" + month + "" + day + "" + endHour + powerOffTHour + endMin + powerOffMin + "00";
}
long timeBack = Long.parseLong(onTime);
return timeBack;
}
}
这个类就是获取定时开关机时间,和设定开关机时间
package com.etv.util.system;
import android.content.Context;
import android.content.Intent;
import com.etv.entity.ScheduleRecord;
import com.etv.entity.TimeEntity;
import com.etv.entity.TimedTaskListEntity;
import com.etv.util.MyLog;
import com.etv.util.SimpleDateUtil;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.TimeZone;
import startest.ys.com.poweronoff.PowerOnOffManager;
/**
* 定时开关机管理类
*/
public class PowerOnOffUtil {
Context context;
private Calendar c;
PowerOnOffManager manager;
public PowerOnOffUtil(Context context) {
this.context = context;
c = Calendar.getInstance();
manager = PowerOnOffManager.getInstance(context);
c.setTimeZone(TimeZone.getTimeZone("GMT+8:00"));
}
/**
* 设置系统定时开关机
* 亿晟定时开关机规律
* 1:分组智能设定一组
* 2:采取获取当前最近的一组,设定,
* 3:下次开机重新获取离下次最近的一组
*
* @param lists
*/
public void setPowerOnOffTime(List<TimedTaskListEntity> lists) {
listPowerOnOff.clear();
if (lists.size() < 1) {
//===清理定时开关机====
clearPowerOnOffTime0();
MyLog.powerOnOff("获取的定时开关机 < 1 ,用户删除定时开关机任务,终止操作");
return;
}
for (int i = 0; i < lists.size(); i++) {
int dayOfWeek = -1;
TimedTaskListEntity entity = lists.get(i);
String powerOnTime = entity.getTtOnTime();
String powerOffTime = entity.getTtOffTime();
int onHour = Integer.parseInt(powerOnTime.substring(0, powerOnTime.indexOf(":")));
int onMin = Integer.parseInt(powerOnTime.substring(powerOnTime.indexOf(":") + 1, powerOnTime.length()));
int offHour = Integer.parseInt(powerOffTime.substring(0, powerOffTime.indexOf(":")));
int offMin = Integer.parseInt(powerOffTime.substring(powerOffTime.indexOf(":") + 1, powerOffTime.length()));
// MyLog.powerOnOff("=====获取的开关机机小时==" + onHour + " / " + onMin + " /关机时间==" + offHour + " / " + offMin);
boolean ttMon = Boolean.parseBoolean(entity.getTtMon());
if (ttMon) {
dayOfWeek = 2;
saveTimerTask(dayOfWeek, onHour, onMin, offHour, offMin);
}
boolean ttTue = Boolean.parseBoolean(entity.getTtTue());
if (ttTue) {
dayOfWeek = 3;
saveTimerTask(dayOfWeek, onHour, onMin, offHour, offMin);
}
boolean ttWed = Boolean.parseBoolean(entity.getTtWed());
if (ttWed) {
dayOfWeek = 4;
saveTimerTask(dayOfWeek, onHour, onMin, offHour, offMin);
}
boolean ttThu = Boolean.parseBoolean(entity.getTtThu());
if (ttThu) {
dayOfWeek = 5;
saveTimerTask(dayOfWeek, onHour, onMin, offHour, offMin);
}
boolean ttFri = Boolean.parseBoolean(entity.getTtFri());
if (ttFri) {
dayOfWeek = 6;
saveTimerTask(dayOfWeek, onHour, onMin, offHour, offMin);
}
boolean ttSat = Boolean.parseBoolean(entity.getTtSat());
if (ttSat) {
dayOfWeek = 7;
saveTimerTask(dayOfWeek, onHour, onMin, offHour, offMin);
}
boolean ttSun = Boolean.parseBoolean(entity.getTtSun());
if (ttSun) {
dayOfWeek = 1;
saveTimerTask(dayOfWeek, onHour, onMin, offHour, offMin);
}
}
long powerOffTime = TSchedule.getLastPowerOffTime(listPowerOnOff);
MyLog.powerOnOff("===获取的关机时间===" + powerOffTime);
long powerOnTime = TSchedule.getLastPowerOnTime(listPowerOnOff, powerOffTime);
MyLog.powerOnOff("===获取的开机时间===" + powerOnTime);
if (powerOffTime < 0 || powerOnTime < 0) { //这里可能获取时间异常了 ,不设置定时开关机
MyLog.powerOnOff("===获取的开关机时间异常了,这里清理定时开关机");
clearPowerOnOffTime0();
return;
}
TimeEntity entityOff = SimpleDateUtil.getFormatLongTime(powerOffTime);
TimeEntity entityOn = SimpleDateUtil.getFormatLongTime(powerOnTime);
MyLog.powerOnOff("===设定的开机时间===" + entityOn.toString());
MyLog.powerOnOff("===设定的关机时间===" + entityOff.toString());
setPowerOnOffTime(entityOn, entityOff);
}
/***
* 设置定时开关机时间方法d
* @param entityOn
* @param entityOff
*/
private void setPowerOnOffTime(TimeEntity entityOn, TimeEntity entityOff) {
int[] timeoffArray = new int[]{entityOff.getYear(), entityOff.getMonth(), entityOff.getDay(), entityOff.getHour(), entityOff.getMinite()};
int[] timeonArray = new int[]{entityOn.getYear(), entityOn.getMonth(), entityOn.getDay(), entityOn.getHour(), entityOn.getMinite()};
PowerOnOffManager powerManager = PowerOnOffManager.getInstance(context);
powerManager.clearPowerOnOffTime();
powerManager.setPowerOnOff(timeonArray, timeoffArray);
}
List<ScheduleRecord> listPowerOnOff = new ArrayList<ScheduleRecord>();
private void saveTimerTask(int dayOfWeek, int onHour, int onMin, int offHour, int offMin) {
ScheduleRecord scheduleRecord = new ScheduleRecord(dayOfWeek, onHour, onMin, offHour, offMin);
// MyLog.powerOnOff("===设定的定时开关机时间列表==" + scheduleRecord.toString());
listPowerOnOff.add(scheduleRecord);
}
/***=========================================================================================================
* 关机
* @param context
*/
public void setShowDownMethion(Context context) {
try {
PowerOnOffManager powerOnOffManager = PowerOnOffManager.getInstance(context);
powerOnOffManager.shutdown();
} catch (Exception e) {
}
}
/***
* 清理定时开关机任务
*/
public void clearPowerOnOffTime0() {
try {
MyLog.powerOnOff("准备清理定时开关机");
manager.clearPowerOnOffTime();
MyLog.powerOnOff("清理定时开关机 success");
} catch (Exception e) {
MyLog.powerOnOff("清理定时开关机error =" + e.toString());
}
}
/***
* 获取定时开机时间
* @return
*/
public static String getPowerOnTime(Context context) {
PowerOnOffManager powerOnOffManager = PowerOnOffManager.getInstance(context);
String time = powerOnOffManager.getPowerOnTime();
return time;
}
/***
* 获取关机的时间
* @param context
* @return
*/
public static String getPowerOffTime(Context context) {
PowerOnOffManager powerOnOffManager = PowerOnOffManager.getInstance(context);
String time = powerOnOffManager.getPowerOffTime();
return time;
}
/***
* 获取定时开关机版本号
* @return
*/
public String getVersion(Context context) {
String version = manager.getVersion();
return version;
}
//==================背光相关操作=================================================================
/***
* 判断背光是否打开
* @return
*/
public static String isOpenLight() {
String str = "";
try {
File file = new File("/sys/devices/fb.11/graphics/fb0/pwr_bl");
FileReader reader = new FileReader(file);
char[] bb = new char[1024];
int n;
while ((n = reader.read(bb)) != -1) {
str += new String(bb, 0, n);
}
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
return str;
}
/***
* 开关背光操作
* @param paramInt
*/
public static void openOrClose(int paramInt) {
try {
writeFile(paramInt);
return;
} catch (Exception localException) {
localException.printStackTrace();
}
}
public static void writeFile(int paramInt) {
try {
File localFile = new File("/sys/devices/fb.11/graphics/fb0/pwr_bl");
localFile.setExecutable(true);
localFile.setReadable(true);
localFile.setWritable(true);
if (paramInt == 0) {
do_exec("busybox echo 0 > /sys/devices/fb.11/graphics/fb0/pwr_bl");
} else if (paramInt == 1) {
do_exec("busybox echo 1 > /sys/devices/fb.11/graphics/fb0/pwr_bl");
}
} catch (Exception localException) {
localException.printStackTrace();
}
}
public static void do_exec(String paramString) {
try {
Process localProcess = Runtime.getRuntime().exec("su");
String str = paramString + "\nexit\n";
localProcess.getOutputStream().write(str.getBytes());
if (localProcess.waitFor() != 0) {
System.out.println("cmd=" + paramString + " error!");
throw new SecurityException();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
封装时间的实体类
package com.etv.entity;
/**
* 用来封装详细的数据的事件
*/
public class TimeEntity {
int year;
int month;
int day;
int hour;
int minite;
public TimeEntity() {
}
public TimeEntity(int year, int month, int day, int hour, int minite) {
this.year = year;
this.month = month;
this.day = day;
this.hour = hour;
this.minite = minite;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
public int getHour() {
return hour;
}
public void setHour(int hour) {
this.hour = hour;
}
public int getMinite() {
return minite;
}
public void setMinite(int minite) {
this.minite = minite;
}
@Override
public String toString() {
return "TimeEntity{" +
"year=" + year +
", month=" + month +
", day=" + day +
", hour=" + hour +
", minite=" + minite +
'}';
}
}