uniset-algorithms  0.2
Классы | Открытые члены | Открытые статические члены | Статические открытые данные | Защищенные типы | Защищенные члены | Защищенные данные
Класс APSControl

Полный список членов класса

Классы

struct  APSGroupInfo
struct  APSSensorInfo

Открытые члены

 APSControl (UniSetTypes::ObjectId id, const std::string name="APSControl")

Открытые статические члены

static void init_dlog (DebugStream &dlog)

Статические открытые данные

static DebugStream dlog

Защищенные типы

enum  Timers { ptHeartBeat }
typedef std::map
< UniSetTypes::ObjectId,
APSGroupInfo
APSGroupList

Защищенные члены

void processingMessage (UniSetTypes::VoidMessage *msg)
void askSensors (UniversalIO::UIOCommand cmd)
void sysCommand (UniSetTypes::SystemMessage *sm)
void sensorInfo (UniSetTypes::SensorMessage *sm)
void timerInfo (UniSetTypes::TimerMessage *tm)
void makeAPS (UniSetTypes::ObjectId id, bool state)
void makeAPSLamp (bool newAPS, bool isAnyAPS)
void makeNewAPSSensor (bool newAPS)
bool initAPS (xmlNode *cnode)
virtual void sigterm (int signo)
void offOutputs (bool all)
bool checkTestMode ()

Защищенные данные

std::map
< UniSetTypes::ObjectId,
APSSensorInfo
sensorToAPS
std::map
< UniSetTypes::ObjectId,
UniSetTypes::ObjectId > 
blockedSensors
APSGroupList apsGroupsInfo
SMInterface * smi
UniSetTypes::ObjectId testSensor
UniSetTypes::ObjectId nodeTestSensor
bool in_testSensor
bool in_nodeTestSensor
UniSetTypes::ObjectId sidHeartBeat
int maxHeartBeat
timeout_t heartbeatTime
UniSetTypes::ObjectId newaps_s
UniSetTypes::ObjectId confirm_s
bool confirmMode
UniSetTypes::ObjectId apsLamp_c
timeout_t smReadyTimeout
bool TermOffAps
std::string f_field
std::string f_value
timeout_t apsMakePause

Методы

void APSControl::askSensors ( UniversalIO::UIOCommand  cmd) [protected]

работа с датчиками

Аргументы:
cmd- команда (заказ, отказ)
{
    if( !smi->waitSMready(smReadyTimeout) )
    {
        dlog << endl;
        dlog[Debug::CRIT] << myname << ": SM not ready (waiting=" << smReadyTimeout << " msec)!!! SIGTERM.\n\n";
        raise(SIGTERM); // exit(-1);
    }

        try
        {
            cerr << myname << " ask group sensors..." << endl;
            for( APSGroupList::iterator It = apsGroupsInfo.begin(); It != apsGroupsInfo.end(); It++ )
            {   
                dlog[Debug::INFO] << "(askSensors): ApsGroupId " << It->first  << endl;
                list<ObjectId>::iterator sIt;
                for( sIt = It->second.sensIdList.begin() ; sIt != It->second.sensIdList.end() ; sIt++ )
                {
                    try
                    {
                        smi->askSensor(*sIt,command,getId());
                    }
                    catch(Exception& ex)
                    {
                        dlog(Debug::INFO) << endl;
                        dlog[Debug::CRIT] << myname << "(askSensors): id=" << (*sIt) << " : " << ex << endl;
                    }
                    catch(...)
                    {
                        dlog[Debug::CRIT] << myname << "(askSensors): неудалось заказать датчик " << *sIt << endl; 
                    }
                }  
            }   
            
            cerr << myname << " ask blockers..." << endl;
            map<ObjectId,ObjectId>::iterator bIt;
            for( bIt = blockedSensors.begin(); bIt != blockedSensors.end(); bIt++ )
            {
                smi->askSensor(bIt->second,command,getId());
            }
            
            cerr << myname << " ask spec sensors..." << endl;
    
            if( confirm_s!=DefaultObjectId )
                smi->askSensor(confirm_s, command,getId());
            
            if( testSensor!=DefaultObjectId )
                smi->askSensor(testSensor, command,getId());

            if( nodeTestSensor!=DefaultObjectId )
                smi->askSensor(nodeTestSensor, command,getId());
        }
        catch(Exception& ex)
        {
            dlog[Debug::CRIT] << myname << "(askSensors): " << ex << endl;
        }
}
void APSControl::makeAPS ( UniSetTypes::ObjectId  id,
bool  state 
) [protected]

формирует обобщенный датчик АПС и специальный программный датчик по приходу новой АПС

Аргументы:
id- идентификатор пришедшего датчика
state- состояние пришедшего датчика
{
    dlog[Debug::INFO] << "(makeAPS): id = " << id << "   state = " << state << endl;

    bool newAPS = false;
    bool APSState = false;
    bool isAnyAPS = false;
    
    map<UniSetTypes::ObjectId,APSSensorInfo>::iterator itSTA = sensorToAPS.find(id);
    if( itSTA == sensorToAPS.end() && id != confirm_s  )
    {
        dlog[Debug::INFO] << "Проверка на существование сенсора "<<id<<" в массиве (сенсор;АПС) не прошла"<< endl;
        return;
    }

    if( confirm_s!=DefaultObjectId && id == confirm_s )
    {
        if( !state )
            return;

        confirmMode = true;
        
        map<ObjectId,APSGroupInfo>::iterator aIt = apsGroupsInfo.begin();
        for( ; aIt != apsGroupsInfo.end(); aIt++)
        {
            if(aIt->second.apsState)
            {
                isAnyAPS = true;
                break;
            }
        }       
        
        makeNewAPSSensor(false);
        makeAPSLamp( false, isAnyAPS );
        return;
    }   
    else
    {
        if( state && !itSTA->second.state )
            newAPS = true;
        
        itSTA->second.state = state;
    }
    
    ObjectId apsId = itSTA->second.apsId;

    APSGroupList::iterator it = apsGroupsInfo.find(apsId);
    if( it == apsGroupsInfo.end() )
    {
        dlog[Debug::INFO] << "Проверка на существование APS "<<apsId<<" в массиве групп АПС не прошла"<< endl;
        return;
    }
    
    list<ObjectId>::iterator sIt = it->second.sensIdList.begin();

    //проверяем датчики входящие в группу АПС пришедшего датчика
    for( ; sIt != it->second.sensIdList.end(); sIt++)
    {
        if( sensorToAPS[*sIt].state )//если хоть один датчик выставлен, то проверяем была ли выставлена АПС до этого
        {
            if( !it->second.apsState )//если не была, то:
            {
//              newAPS = true;
                if( confirmMode && state )//
                {
                    confirmMode = false;
                }
            }
            APSState=true;
            isAnyAPS=true;
            break;
        }
    }
    
    if( APSState )
    {
        it->second.apsState = true;
        try
        {
            if( newAPS )
            {
                smi->saveLocalState(apsId,false);
                msleep(apsMakePause);
            }
            smi->saveLocalState(apsId,true);
        }
        catch(...)
        {
            dlog[Debug::WARN] << myname << "[makeAPS]: ... \n";
        }
    }
    else
    {
        it->second.apsState = false;
        try
        {
            smi->saveLocalState(apsId,false);
        }
        catch(...)
        {
            dlog[Debug::WARN] << myname << "[makeAPS]: ... \n";
        }   
    }
    
    //проверяем состояние всех АПС и выставляем isAnyAPS в true если хоть одна АПС выставлена
    for(it=apsGroupsInfo.begin();it!=apsGroupsInfo.end();it++)
    {   
        if(it->second.apsState==true)
        {
            isAnyAPS=true;
            break;
        }
    }

    makeNewAPSSensor(newAPS);
    if( !itSTA->second.no_apslamp )
        makeAPSLamp( newAPS, isAnyAPS );
    else if( !newAPS )
        makeAPSLamp( false, isAnyAPS );
}
void APSControl::makeAPSLamp ( bool  newAPS,
bool  isAnyAPS 
) [protected]

формирование лампы на колонке

Аргументы:
newAPS- состояние специального програмного датчика
isAnyAPS- наличие АПС в системе
{
    if( newAPS )
    {
        dlog[Debug::INFO] << "(apsLamp_c): blink --##--##--##--##--##--##--" << endl;
        if( apsLamp_c != DefaultObjectId )
        {
            try
            {
                smi->setValue(apsLamp_c, lmpBLINK);
            }
            catch(...)
            {
                dlog[Debug::WARN] << myname << "[apsLamp_c]: catch... \n";
            }
        }
                
    }
    else if( confirmMode )
    {
        if( isAnyAPS )
        {               
            dlog[Debug::INFO] << "(apsLamp_c): on #############################" << endl;
            if( apsLamp_c != DefaultObjectId )
            {
                try
                {
                    smi->setValue(apsLamp_c,lmpON);
                }
                catch(...)
                {
                    dlog[Debug::WARN] << myname << "[apsLamp_c]: catch... \n";
                }
            }
        }
        else
        {
            dlog[Debug::INFO] << "(apsLamp_c): off --------------------------" << endl;
            if( apsLamp_c != DefaultObjectId )
            {
                try
                {
                    smi->setValue(apsLamp_c, lmpOFF);
                }
                catch(...)
                {
                    dlog[Debug::WARN] << myname << "[apsLamp_c]: catch... \n";
                }   
                    
            }
            
            confirmMode = false;
        }
    }
}
void APSControl::makeNewAPSSensor ( bool  newAPS) [protected]

формирование датчика "новая АПС"

{
    if( newaps_s != DefaultObjectId )
    {
        dlog[Debug::INFO] << "(makeAPS): newaps_s=1" << endl;
        try
        {
            if( newAPS )
                smi->saveLocalState( newaps_s, true );
            else if( confirmMode )
                smi->saveLocalState( newaps_s, false );
        }
        catch(...)
        {
            dlog[Debug::WARN] << myname << "[new_aps]: catch... \n";
        }   
    }   
}
void APSControl::processingMessage ( UniSetTypes::VoidMessage *  msg) [protected]

обработка новых сообщений

Аргументы:
msg- обрабатываемое сообщение
{
    try
    {
        switch(msg->type)
        {
        case Message::SensorInfo:
            {
                SensorMessage sm(msg);
                sensorInfo(&sm);
                break;
            }
        case Message::SysCommand:
            {
                SystemMessage sm(msg);
                sysCommand(&sm);
                break;
            }
        case Message::Timer:
            {
                TimerMessage tm(msg);
                timerInfo(&tm);
                break;
            }
        default:
            dlog[Debug::INFO] << myname << "(processingMessage): неизвестное сообщение " << msg->type << endl;
            break;
        }
    }
    catch( Exception& ex )
    {
        dlog[Debug::CRIT] << myname << "(processingMessage): " << ex << endl;
    }
}
void APSControl::sensorInfo ( UniSetTypes::SensorMessage *  sm) [protected]

обработка сообщений об изменении состояния датчиков

Аргументы:
sm- сообщение об изменении состояния датчика
{
    dlog[Debug::INFO] << "(sensorInfo): id = " << sm->id << "   state = " << sm->state << endl;

    if( sm->id == testSensor )
        in_testSensor = sm->state;
    else if( sm->id == nodeTestSensor )
        in_nodeTestSensor = sm->state;

    if( APSControl::checkTestMode() )
    {   
        dlog[Debug::INFO] << "(sensorInfo): TEST MODE!!!" << endl;
        if( trTestMode.hi(true) )
            offOutputs(true);
        return;
    }

    // сброс тригера
    trTestMode.hi(false);

    map<ObjectId,ObjectId>::iterator It;
    for( It = blockedSensors.begin(); It != blockedSensors.end(); It++)
    {
        if(sm->id == It->second)    //пришел блокирующий датчик
        {
            map<ObjectId,ObjectId>::iterator It2;
            for( It2 = blockedSensors.begin(); It2 != blockedSensors.end(); It2++)
            {
                if(sm->id == It2->second)
                {
                    if(sm->state)   //если заблокировал то переформируем АПС для блокируемых датчиков 
                    {
                        makeAPS(It2->first, false);
                    }   
                    else            //если разблокировал то перезаказываем блокируемые датчики
                    {
                        smi->askSensor(It2->first, UniversalIO::UIONotify, getId());
                    }   
                }   
            }       
            return;
        }
        
        //если пришел датчик у которого есть блокирующий и блокировка выставлена, то игнорируем приход
        if(sm->id == It->first &&  sm->state == true && smi->getState(It->second) == true)
            return;     
    }

    makeAPS(sm->id, sm->state);
}
void APSControl::sysCommand ( UniSetTypes::SystemMessage *  sm) [protected]

обработка системных сообщений

Аргументы:
sm- системное сообщение
{
    switch(sm->command)
    {
        case SystemMessage::WatchDog:
        {
            askSensors(UniversalIO::UIONotifyFirstNotNull);
            if( heartbeatTime != UniSetTimer::WaitUpTime )
                askTimer(ptHeartBeat,heartbeatTime);
            break;
        }
    
        case SystemMessage::StartUp:
        {
            askSensors(UniversalIO::UIONotifyFirstNotNull); // при заказе первоначально придут одни "true" 
            if( heartbeatTime != UniSetTimer::WaitUpTime )
                askTimer(ptHeartBeat,heartbeatTime);
            break;
        }

        case SystemMessage::FoldUp:
        case SystemMessage::Finish:
        {
            askSensors(UniversalIO::UIODontNotify);
            break;
        }
    
        case SystemMessage::LogRotate:
        {   // переоткрываем логи
            dlog << myname << "(sysCommand): logRotate" << endl;
            string fname = dlog.getLogFile();
            if( !fname.empty() )
            {
                dlog.logFile( fname.c_str() );
                dlog << myname <<   "(sysCommand): ***************** UNIDEB LOG ROTATE *****************" << endl;
            }

            dlog << myname << "(sysCommand): logRotate" << endl;
            
            fname = dlog.getLogFile();
            if( !fname.empty() )
            {
                dlog.logFile( fname.c_str() );
                dlog << myname <<   "(sysCommand): ***************** unideb LOG ROTATE *****************" << endl;
            }
            break;
        }
        default:
            dlog[Debug::CRIT]  << myname << ": Неизвестная команда!" << endl;
            break;
    }
}
void APSControl::timerInfo ( UniSetTypes::TimerMessage *  tm) [protected]

обработка сообщений о срабатывания таймера

Аргументы:
tm- сообщение о срабатывании таймера
{
    if( tm->id==ptHeartBeat && sidHeartBeat!=DefaultObjectId )
    {   
        try
        {
            smi->saveLocalValue(sidHeartBeat,maxHeartBeat);
        }
        catch(...)
        {
            dlog[Debug::WARN] << myname << "(timerInfo): save heartbeat failed..." << endl;
        }
        return;
    }

    dlog[Debug::INFO] << myname << "(timerInfo): unknown timer id=" << tm->id << endl;
}

Данные класса

UniSetTypes::ObjectId APSControl::apsLamp_c [protected]

идентификатор лампы срабатывания АПС в ПЭЖ (Световая колонка АПС в МО)

timeout_t APSControl::apsMakePause [protected]

пауза при "мигании" обощённой АПС при срабатывании новой АПС из группы

UniSetTypes::ObjectId APSControl::confirm_s [protected]

идентификатор кнопки квитирования (Кнопка квитирования в ПЭЖ)

UniSetTypes::ObjectId APSControl::newaps_s [protected]

идентификатор обобщенного датчика (Сработала АПС в ПЭЖ)


Объявления и описания членов классов находятся в файлах: