/** * @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; }
/** * @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); }
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); } } }
/** * @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); } }
/** * @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); } }
/** * @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 }