Ejemplo n.º 1
0
/**
* @brief 可充电电池监测
*/
static void BatteryMonitor(void)
{
#define VOL_CHARGE		4800
#define VOL_UNCHARGE	5700
#define VOL_BATLOW		3000
#define VOL_BATBAD		5810
#define BATCAP_CHK		((VOL_UNCHARGE-VOL_CHARGE)/8)

	int batv = ReadBatVol();

	if(batv < VOL_BATLOW) {  // 没插电池
		BatCapacityStatus = 0;
		//GpioSetValue(GPIO_BAT_CHARGE, 0);  //停止充电
		if(0 == RunState.batbad) {
			PrintLog(LOGTYPE_ALARM, "battery disconnected!\n");
			RunStateModify()->batbad = 1;
		}
		/*if(RunState.batcharge) {
			PrintLog(LOGTYPE_ALARM, "battery stop charge\n");
			RunStateModify()->batcharge = 0;
		}*/
		return;
	}
	else if(RunState.batbad) {
		PrintLog(LOGTYPE_ALARM, "battery connected!\n");
		RunStateModify()->batbad = 0;
	}

	

	if(batv < VOL_UNCHARGE) {
		GpioSetValue(GPIO_BAT_CHARGE, 1);  //充电
		if(0 == RunState.batcharge) {
			PrintLog(LOGTYPE_ALARM, "battery start charge\n");
			RunStateModify()->batcharge = 1;
		}
	}
	else {
		GpioSetValue(GPIO_BAT_CHARGE, 0);  //停止充电
		if(RunState.batcharge) {
			PrintLog(LOGTYPE_ALARM, "battery stop charge\n");
			RunStateModify()->batcharge = 0;
		}
	}

	if(batv <= (VOL_CHARGE+BATCAP_CHK)) BatCapacityStatus = 0;
	else if(batv >= (VOL_UNCHARGE-BATCAP_CHK)) BatCapacityStatus = 3;
	else if(batv < ((VOL_UNCHARGE+VOL_CHARGE)/2)) BatCapacityStatus = 1;
	else BatCapacityStatus = 2;
}
Ejemplo n.º 2
0
/**
* @brief 保存事件
* @param idx 事件分类索引(重要事件,一般事件)
* @param pbuf 储存事件缓存区指针
*/
static void SaveAlarm(unsigned char idx, const alarm_t *pbuf)
{
	alarm_t *pbase;
	char filename[32];
	unsigned char idxbase;
	runstate_t *pstat = RunStateModify();

	AssertLogReturnVoid(idx>=2, "invalid idx(%d)\n", idx);

	if(0 == idx) pbase = AlarmBufferImportant;
	else pbase = AlarmBufferNormal;

	LockSysLock(LockIdAlarm);

	if(RunState.alarm.cur[idx] == RunState.alarm.head[idx])  //empty
		pstat->alarm.cur[idx] = pstat->alarm.head[idx] = 0;

	//pbase[RunState.alarm.cur[idx]] = *pbuf;
	memcpy(pbase+RunState.alarm.cur[idx], pbuf, sizeof(alarm_t));

	AlarmFileName(idx, RunState.alarm.cur[idx], filename);

	idxbase = RunState.alarm.cur[idx] & ALARM_BASEMASK;
	SaveBinFile(filename, ALARM_MAGIC, (unsigned char *)&pbase[idxbase], sizeof(alarm_t)*ALMNUM_PERFILE);

	pstat->alarm.cur[idx]++;
	if(RunState.alarm.cur[idx] == RunState.alarm.head[idx]) pstat->alarm.head[idx]++;

	UnlockSysLock(LockIdAlarm);
}
Ejemplo n.º 3
0
static void CommFlowsMonitor(alarm_t *pbuf) 
{
	if(ParaMixSave.mix.upflow_max && !RunState.commflow) {
		if(MdbStic.term_mon.comm_bytes > ParaMixSave.mix.upflow_max) {
			PrintLog(LOGTYPE_ALARM, "Month Communication flows over limit!!\n");

			RunStateModify()->commflow = 1;
			
			memset((unsigned char *)pbuf, 0, sizeof(alarm_t));
			pbuf->erc = 32;
			pbuf->len = 8;
			DEPART_LONG(MdbStic.term_mon.comm_bytes, pbuf->data);
			DEPART_LONG(ParaMixSave.mix.upflow_max, &pbuf->data[4]);
			MakeAlarm(ALMFLAG_ABNOR, pbuf);
		}
	}
}
Ejemplo n.º 4
0
/**
* @brief 时钟电池监测
* @param pbuf 告警缓存区指针
*/
static void ClockBatMonitor(alarm_t *pbuf)
{
	int stat = GpioGetValue(GPIO_BATLOW);

	if(0 == stat && 0 == RunState.battery) { //bat low
		PrintLog(LOGTYPE_ALARM, "clock battery voltage too low!!\n");

		RunStateModify()->battery = 1;

		memset((unsigned char *)pbuf, 0, sizeof(alarm_t));
		pbuf->erc = 13;
		pbuf->len = 3;
		pbuf->data[0] = 0;
		pbuf->data[1] = 0x80;
		pbuf->data[2] = 0x10;
		MakeAlarm(ALMFLAG_ABNOR, pbuf);
	}
}
Ejemplo n.º 5
0
/**
* @brief 遥信状态监测
* @param pbuf 告警缓存区指针
*/
static void SignalMonitor(alarm_t *pbuf)
{
	unsigned char stat = SiginReadState();
	unsigned char mask, i, chg;
	runstate_t *prun = RunStateModify();

	chg = 0;

	for(i=0,mask=1; i<SIGIN_NUM; i++,mask<<=1) {
		if(ParaHardw.isig.flagattr&mask) {  //a型触点		
			if(stat&mask) stat &= ~mask;
			else stat |= mask;
		}
	}

#if 0
	stat |= (data[0]&0x04)<<4;  //端子盖开关
	stat |= (data[0]&0x02)<<4;  //中盖开关
#endif

	for(i=0,mask=1; i<SIGIN_NUM; i++,mask<<=1) {
		if(0 == (ParaHardw.isig.flagin&mask)) continue;

		if((stat&mask) != (RunState.isig_stat&mask)) {
			chg |= mask;
			prun->isig_chg |= mask;
		}
	}

	prun->isig_stat &= ~SIGIN_MASK;
	prun->isig_stat |= (stat&SIGIN_MASK);

	if(chg) {
		memset((unsigned char *)pbuf, 0, sizeof(alarm_t));
		pbuf->erc = 4;
		pbuf->len = 2;
		pbuf->data[0] = chg;
		pbuf->data[1] = RunState.isig_stat;
		MakeAlarm(ALMFLAG_ABNOR, pbuf);
	}
}
Ejemplo n.º 6
0
/**
* @brief 市电状态监测
* @param pbuf 告警缓存区指针
*/
static void PowerMonitor(alarm_t *pbuf)
{
	int stat = GpioGetValue(GPIO_POWER_STATUS);

	#if 1
	if(stat) {  //power off
		if(0 == RunState.pwroff) {
			runstate_t *prun = RunStateModify();
			sysclock_t clock;

			PrintLog(LOGTYPE_ALARM, "power off!!\n");
			Sleep(200);

			prun->pwroff = 1;

			memset((unsigned char *)pbuf, 0, sizeof(alarm_t));
			pbuf->erc = 14;
			pbuf->len = 5;
			//记录停电时间	
			SysClockReadCurrent(&clock);
			prun->timepoweroff[0] = pbuf->min = clock.minute;
			prun->timepoweroff[1] = pbuf->hour = clock.hour;
			prun->timepoweroff[2] = pbuf->day = clock.day;
			prun->timepoweroff[3] = pbuf->mon = clock.month;
			prun->timepoweroff[4] = pbuf->year = clock.year;
			HexToBcd(&pbuf->min, 5);
			MakeAlarm(ALMFLAG_ABNOR, pbuf);
			
			if(TimerIdPowerOff >= 0) {
				SysStopCTimer(TimerIdPowerOff);
				TimerIdPowerOff = -1;
			}
			TimerIdPowerOff = SysAddCTimer(180, CTimerPowerOff, 0);
		}
		else {
			if(TimerIdPowerOff < 0)
				TimerIdPowerOff = SysAddCTimer(180, CTimerPowerOff, 0);
		}
	}
	else {  //power on
		if(RunState.pwroff) {
			sysclock_t clock;

			RunStateModify()->pwroff = 0;
			if(TimerIdPowerOff >= 0) {
				SysStopCTimer(TimerIdPowerOff);
				TimerIdPowerOff = -1;
			}

			memset((unsigned char *)pbuf, 0, sizeof(alarm_t));
			pbuf->erc = 14;
			pbuf->len = 5;
			//记录上次停电时间			
			pbuf->min = RunState.timepoweroff[0];
			pbuf->hour = RunState.timepoweroff[1];
			pbuf->day = RunState.timepoweroff[2];
			pbuf->mon = RunState.timepoweroff[3];
			pbuf->year = RunState.timepoweroff[4];
			HexToBcd(&pbuf->min, 5);

			SysClockReadCurrent(&clock);
			pbuf->data[0] = clock.minute;
			pbuf->data[1] = clock.hour;
			pbuf->data[2] = clock.day;
			pbuf->data[3] = clock.month;
			pbuf->data[4] = clock.year;
			HexToBcd(pbuf->data, 5);
			MakeAlarm(ALMFLAG_NORMAL, pbuf);
		}
	}
	#else
	runstate_t *prun = RunStateModify();

	prun->pwroff = 0;
	#endif
}