package com.alarms;
|
|
import android.database.Cursor;
|
import android.database.SQLException;
|
import android.database.sqlite.SQLiteDatabase;
|
import android.util.Log;
|
import com.concentrator.Concentrator_State;
|
import com.fgkj.dao.DBHelper;
|
import com.socket.BattDataThread;
|
import com.util.Com;
|
import java.util.Date;
|
import java.util.List;
|
|
/**
|
* 电池告警监测线程
|
*/
|
public class BattAlarmCheckThread extends Thread{
|
public final static String TAG = "BattAlarmCheckThread";
|
|
private DBHelper dbHelper;
|
private List<BattDataThread> allBattDatt;
|
public AlarmParam alarmParam; //告警参数
|
|
|
public BattAlarmCheckThread(DBHelper dbHelper, List<BattDataThread> allBattDatt){
|
this.dbHelper = dbHelper;
|
this.allBattDatt = allBattDatt;
|
alarmParam = new AlarmParam();
|
|
SQLiteDatabase db = dbHelper.getWritableDatabase();
|
DBHelper.Create_alarm_param(db); //创建告警参数表
|
DBHelper.Create_battalarm_data(db); //创建告警数据表
|
if(db != null){
|
db.close();
|
}
|
|
}
|
|
@Override
|
public void run() {
|
Log.d(TAG, "run: BattAlarmCheckThread start at"+ Com.getDateTimeFormat(new Date(),Com.DTF_YMDhms));
|
//初始化告警对象
|
try {
|
//线程启动30秒后开始检测电池告警
|
sleep(30*1000);
|
} catch (InterruptedException e) {
|
e.printStackTrace();
|
}
|
initBattAlarmParam(dbHelper,alarmParam); //初始化告警参数(数据库中的告警参数)
|
initBattAlarmData(allBattDatt,dbHelper); //初始化告警对象
|
|
while (true){
|
try {
|
for(int i=0;i<allBattDatt.size();i++){
|
BattDataThread battDataThread = allBattDatt.get(i);
|
if(battDataThread.isInstall){
|
List<BattAlarmData> alarmDatas = battDataThread.state.makeAlarmData(battDataThread,alarmParam);
|
if(alarmDatas.size() > 0){
|
//Log.e(TAG, "run: 更新告警条数"+ alarmDatas.size());
|
|
//更新当前告警记录
|
for(int k = 0;k<alarmDatas.size();k++){
|
//Log.e(TAG, "run: "+alarmDatas.get(k) );
|
insertOrUpdateBattAlarmData(dbHelper,alarmDatas.get(k)); //插入或更新当前的告警记录
|
}
|
}
|
alarmDatas.clear();
|
}else{
|
//清除未安装电池组的告警记录
|
if(battDataThread.isAlarmClear){
|
Concentrator_State state = battDataThread.state;
|
//开始清除当前电池组的告警记录
|
state.groupVol_AlarmData.alm_signal_id = 0;
|
state.battCurr_AlarmData.alm_signal_id = 0;
|
for(int k=0;k<state.monCount;k++){
|
state.monVol_AlarmData[k].alm_signal_id = 0;
|
state.monTmp_AlarmData[k].alm_signal_id = 0;
|
state.monRes_AlarmData[k].alm_signal_id = 0;
|
}
|
delBattAllAlarmDataByBattGroupId(dbHelper,battDataThread.battIndex);
|
battDataThread.isAlarmClear = false;
|
}
|
}
|
}
|
sleep(2000);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
}
|
|
|
|
|
/**
|
* 初始化当前的电池告警参数表
|
*/
|
public void initBattAlarmParam(DBHelper dbHelper,AlarmParam alarmParam){
|
String str_sql = " SELECT num,alm_id,alm_name,alm_high_coe,alm_low_coe,alm_high_en,alm_low_en " +
|
" FROM tb_alarm_param ";
|
boolean flag = false;
|
SQLiteDatabase db = null;
|
try {
|
db = dbHelper.getWritableDatabase();
|
Cursor rs = db.rawQuery(str_sql,null);
|
AlarmParam.AlarmParamCell param = null;
|
while (rs.moveToNext()){
|
int alm_id = rs.getInt(rs.getColumnIndex("alm_id"));
|
switch (alm_id){
|
case AlarmParam.ALM_TYPE_GroupVol_ID:param = alarmParam.alm_GroupVol;break;
|
case AlarmParam.ALM_TYPE_BattCurr_ID:param = alarmParam.alm_BattCurr;break;
|
case AlarmParam.ALM_TYPE_MonVol_ID:param = alarmParam.alm_MonVol;break;
|
case AlarmParam.ALM_TYPE_MonRes_ID:param = alarmParam.alm_MonRes;break;
|
case AlarmParam.ALM_TYPE_MonTmp_ID:param = alarmParam.alm_MonTmp;break;
|
default:param = null;break;
|
}
|
if(param != null){
|
param.alm_id = alm_id;
|
param.alm_name = rs.getString(rs.getColumnIndex("alm_name"));
|
param.alm_low_en = rs.getInt(rs.getColumnIndex("alm_low_en"));
|
param.alm_low_coe = rs.getDouble(rs.getColumnIndex("alm_low_coe"));
|
param.alm_high_en = rs.getInt(rs.getColumnIndex("alm_high_en"));
|
param.alm_high_coe = rs.getDouble(rs.getColumnIndex("alm_high_coe"));
|
}
|
flag = true;
|
}
|
if(flag){
|
//数据库中无数据时
|
str_sql = "INSERT INTO tb_alarm_param "
|
+ "(alm_id,alm_name,alm_high_coe,alm_low_coe,alm_high_en,alm_low_en)"
|
+ " VALUES "
|
+ "("+AlarmParam.ALM_TYPE_GroupVol_ID+",'Batt_Alarm_Type_GroupVol', "+alarmParam.alm_GroupVol.alm_high_coe+", "+alarmParam.alm_GroupVol.alm_low_coe+", "+alarmParam.alm_GroupVol.alm_high_en+", "+alarmParam.alm_GroupVol.alm_low_en+"),"
|
+ "("+AlarmParam.ALM_TYPE_BattCurr_ID+",'Batt_Alarm_Type_BattCurr', "+alarmParam.alm_BattCurr.alm_high_coe+", "+alarmParam.alm_BattCurr.alm_low_coe+", "+alarmParam.alm_BattCurr.alm_high_en+", "+alarmParam.alm_BattCurr.alm_low_en+"),"
|
+ "("+AlarmParam.ALM_TYPE_MonVol_ID+",'Batt_Alarm_Type_MonVol', "+alarmParam.alm_MonVol.alm_high_coe+", "+alarmParam.alm_MonVol.alm_low_coe+", "+alarmParam.alm_MonVol.alm_high_en+", "+alarmParam.alm_MonVol.alm_low_en+", "+"),"
|
+ "("+AlarmParam.ALM_TYPE_MonTmp_ID+",'Batt_Alarm_Type_MonTmp', "+alarmParam.alm_MonTmp.alm_high_coe+", "+alarmParam.alm_MonTmp.alm_low_coe+", "+alarmParam.alm_MonTmp.alm_high_en+", "+alarmParam.alm_MonTmp.alm_low_en+", "+"),"
|
+ "("+AlarmParam.ALM_TYPE_MonRes_ID+",'Batt_Alarm_Type_MonRes', "+alarmParam.alm_MonRes.alm_high_coe+", "+alarmParam.alm_MonRes.alm_low_coe+", "+alarmParam.alm_MonRes.alm_high_en+", "+alarmParam.alm_MonRes.alm_low_en+", "+")";
|
db.execSQL(str_sql);
|
}
|
} catch (Exception e) {
|
e.printStackTrace();
|
} finally {
|
// if(db != null){
|
// db.close();
|
// }
|
}
|
}
|
|
/**
|
* 删除指定电池组的所有实时告警记录
|
* @param dbHelper
|
* @param BattGroupId
|
*/
|
public void delBattAllAlarmDataByBattGroupId(DBHelper dbHelper,int BattGroupId){
|
String sql_str = "DELETE FROM tb_battalarm_data WHERE BattGroupId = "+ BattGroupId + " AND alm_cleared_type = 0;";
|
//Log.e(TAG, "delBattAllAlarmDataByBattGroupId: "+sql_str );
|
SQLiteDatabase db = null;
|
try {
|
db = dbHelper.getWritableDatabase();
|
db.execSQL(sql_str);
|
} catch (SQLException e) {
|
e.printStackTrace();
|
} finally{
|
// if(db != null){
|
// db.close();
|
// }
|
}
|
}
|
|
/**
|
* 插入或者更新当前的告警记录
|
*/
|
public void insertOrUpdateBattAlarmData(DBHelper dbHelper,BattAlarmData battAlarmData){
|
String sql_str = "";
|
if(battAlarmData.alm_cleared_type == BattAlarmData.ALM_CLEARED_TYPE_NULL){
|
//插入新的告警记录
|
sql_str = "INSERT INTO tb_battalarm_data"
|
+ "(BattGroupId, "
|
+ "MonNum, "
|
+ "alm_id, "
|
+ "alm_signal_id, "
|
+ "alm_start_time, "
|
+ "alm_end_time, "
|
+ "alm_value, "
|
+ "alm_is_confirmed, "
|
+ "alm_confirmed_time, "
|
+ "alm_cleared_type) "
|
+ " VALUES "
|
+ "("
|
+ battAlarmData.BattGroupId + ", "
|
+ battAlarmData.MonNum + ", "
|
+ battAlarmData.alm_id + ", "
|
+ battAlarmData.alm_signal_id + ", "
|
+ "'" + Com.getDateTimeFormat(battAlarmData.alm_start_time, Com.DTF_YMDhms) + "', "
|
+ "'" + Com.getDateTimeFormat(battAlarmData.alm_end_time, Com.DTF_YMDhms) + "', "
|
+ battAlarmData.alm_value + ", "
|
+ battAlarmData.alm_is_confirmed + ", "
|
+ "'" + Com.getDateTimeFormat(new Date(), Com.DTF_YMDhms) + "', "
|
+ battAlarmData.alm_cleared_type + " "
|
+ ")";
|
}else{
|
sql_str = "UPDATE tb_battalarm_data SET alm_end_time = '"+Com.getDateTimeFormat(battAlarmData.alm_end_time,Com.DTF_YMDhms)+"',alm_cleared_type="+battAlarmData.alm_cleared_type +
|
" WHERE alm_id="+battAlarmData.alm_id+" AND alm_signal_id= "+battAlarmData.alm_signal_id+" AND MonNum = "+ battAlarmData.MonNum+" AND BattGroupId = "+battAlarmData.BattGroupId;
|
}
|
SQLiteDatabase db = null;
|
try {
|
db = dbHelper.getWritableDatabase();
|
db.execSQL(sql_str);
|
} catch (SQLException e) {
|
e.printStackTrace();
|
} finally{
|
// if(db != null){
|
// db.close();
|
// }
|
}
|
}
|
|
|
/**
|
* 初始化所有电池组的告警对象,并且删除当前电池组的告警记录
|
* @param battDataThreads
|
*/
|
public void initBattAlarmData(List<BattDataThread> battDataThreads,DBHelper dbHelper){
|
for(int i=0;i<battDataThreads.size();i++){
|
Concentrator_State state = battDataThreads.get(i).state;
|
state.groupVol_AlarmData = new BattAlarmData(battDataThreads.get(i).battIndex,AlarmParam.ALM_TYPE_GroupVol_ID,0);
|
state.battCurr_AlarmData = new BattAlarmData(battDataThreads.get(i).battIndex,AlarmParam.ALM_TYPE_BattCurr_ID,0);
|
for(int k=0;k<state.monVol_AlarmData.length;k++){
|
state.monVol_AlarmData[k] = new BattAlarmData(battDataThreads.get(i).battIndex,AlarmParam.ALM_TYPE_MonVol_ID,k+1);
|
state.monTmp_AlarmData[k] = new BattAlarmData(battDataThreads.get(i).battIndex,AlarmParam.ALM_TYPE_MonTmp_ID,k+1);
|
state.monRes_AlarmData[k] = new BattAlarmData(battDataThreads.get(i).battIndex,AlarmParam.ALM_TYPE_MonRes_ID,k+1);
|
}
|
delBattAllAlarmDataByBattGroupId(dbHelper,battDataThreads.get(i).battIndex); //删除当前电池组的实时告警记录
|
}
|
}
|
}
|