Commit 57778fb5 authored by Pavel Vainerman's avatar Pavel Vainerman

(2.0): небольшие правки описаний

parent e417b9c7
/* This file is part of the UniSet project
* Copyright (c) 2002 Free Software Foundation, Inc.
* Copyright (c) 2002 Pavel Vainerman
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
// --------------------------------------------------------------------------
/*! \file
* \brief "Пустая" реализация интерфейса работы с сообщениями
* \author Pavel Vainerman
*/
// --------------------------------------------------------------------------
#ifndef DefaultMessageInterface_H_
#define DefaultMessageInterface_H_
// --------------------------------------------------------------------------
#include "MessageInterface.h"
// --------------------------------------------------------------------------
class DefaultMessageInterface:
public MessageInterface
{
public:
DefaultMessageInterface(){}
virtual ~DefaultMessageInterface(){}
virtual std::string getMessage( UniSetTypes::MessageCode code ){ return ""; }
virtual bool isExist(UniSetTypes::MessageCode code){ return false; }
virtual UniSetTypes::MessageCode getCode( const std::string& msg ){ return UniSetTypes::DefaultMessageCode; }
virtual UniSetTypes::MessageCode getCodeByIdName( const std::string& name ){ return UniSetTypes::DefaultMessageCode; }
virtual std::ostream& printMessagesMap(std::ostream& os){ return os; }
};
// --------------------------------------------------------------------------
#endif
...@@ -20,22 +20,51 @@ ...@@ -20,22 +20,51 @@
// idea: lav@etersoft.ru // idea: lav@etersoft.ru
// realisation: pv@etersoft.ru, lav@etersoft.ru // realisation: pv@etersoft.ru, lav@etersoft.ru
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#ifndef SandClock_H_ #ifndef HourGlass_H_
#define SandClock_H_ #define HourGlass_H_
// --------------------------------------------------------------------------
/*! WARNING! This class is DEPRECATED! Use HourGlass.. */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#include "PassiveTimer.h" #include "PassiveTimer.h"
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! WARNING! This class is DEPRECATED! Use HourGlass.. */ /*! Песочные часы. Класс реализующий логику песочных часов.
class SandClock Удобен для создания задержек на срабатывание и на отпускание
(как фильтр от кратковременных изменений) с "накоплением времени".
Аналогия с песочными часами:
\par
Выставляете время 'run(msec)'.. устанавливаются в какое-то положение часы 'rotate(true)'...
песок сыплется... если весь пересыпался - срабатывает условие 'check()==true'.
Если во время работы условие изменилось (часы перевернули в обратную сторону), то
уже успевший пересыпаться песок, начинает пересыпаться в обратную сторону. Если опять
повернули часы... продолжает сыпаться опять (добвляясь к тому песку, что "не успел" высыпаться обратно).
Т.е. до момента срабатывания уже меньше времени чем "полное время" и т.д.
Класс является "пассивным", т.е. требует периодического вызова функции rotate и check,
для проверки наступления условия срабатывания.
\par Пример использования.
Допустим у вас есть сигнал "перегрев"(in_overheating) и вам необходимо выставить какой-то
флаг о перегреве (isOverheating), если этот сигнал устойчиво держится в течение 10 секунд,
и при этом если сигнал снялся, то вам необходимо как минимум те же 10 секунд,
подождать прежде чем "снять" флаг. Для этого удобно использовать данный класс.
\code
HourGlass hg;
hg.run(10000); // настраиваем часы на 10 сек..
while( ....)
{
hg.rotate(in_overheating); // управляем состоянием песочных часов (прямой или обратный ход часов).
isOverheating = hg.check();
}
\endcode
*/
class HourGlass
{ {
public: public:
SandClock(): _state(false),_sand(0),_size(0){} HourGlass(): _state(false),_sand(0),_size(0){}
~SandClock(){} ~HourGlass(){}
// запустить часы (заново) // запустить часы (заново)
inline void run( int msec ) inline void run( timeout_t msec )
{ {
t.setTiming(msec); t.setTiming(msec);
_state = true; _state = true;
...@@ -43,7 +72,7 @@ class SandClock ...@@ -43,7 +72,7 @@ class SandClock
_size = msec; _size = msec;
} }
inline void reset () inline void reset()
{ {
run(_size); run(_size);
} }
...@@ -93,14 +122,14 @@ class SandClock ...@@ -93,14 +122,14 @@ class SandClock
// получить прошедшее время // получить прошедшее время
// для положения st // для положения st
inline int current( bool st ) inline timeout_t current( bool st )
{ {
return t.getCurrent(); return t.getCurrent();
} }
// получить заданное время // получить заданное время
// для положения st // для положения st
inline int interval( bool st ) inline timeout_t interval( bool st )
{ {
return t.getInterval(); return t.getInterval();
} }
...@@ -122,7 +151,7 @@ class SandClock ...@@ -122,7 +151,7 @@ class SandClock
PassiveTimer t; PassiveTimer t;
bool _state; bool _state;
int _sand; int _sand;
int _size; timeout_t _size;
}; };
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#endif #endif
......
...@@ -5,6 +5,13 @@ ...@@ -5,6 +5,13 @@
#include <iostream> #include <iostream>
#include "PassiveTimer.h" #include "PassiveTimer.h"
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
/*! Класс реализующий формирование импульсов заданной длительности(t1) и заданных пауз между ними(t0).
Класс пассивный, для работы требует постоянного вызова функции step().
Для получения текущего состояния "выхода" использовать out().
Формирование импульсов включается функцией run() либо функцией set(true).
Вызов reset() тоже включает формирование импульсов.
Выключается формирование вызовом set(false).
*/
class Pulse class Pulse
{ {
public: public:
...@@ -58,6 +65,7 @@ class Pulse ...@@ -58,6 +65,7 @@ class Pulse
} }
inline bool out(){ return ostate; } inline bool out(){ return ostate; }
inline void set( bool state ) inline void set( bool state )
{ {
isOn = state; isOn = state;
......
...@@ -27,19 +27,26 @@ ...@@ -27,19 +27,26 @@
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
#include <string> #include <string>
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
/*! Защита от поторного запуска программы(процесса).
При вызове lock(lockFile) в файл lockFile записывается pid текущего процесса.
При вызове isLocked() проверяется состояние процесса по его pid (записанному в файл).
unlock() - удаляет файл.
\warning Код не переносимый, т.к. рассчитан на наличие каталога /proc,
по которому проверяется статус процесса (по pid).
*/
class RunLock class RunLock
{ {
public: public:
RunLock(); RunLock();
~RunLock(); ~RunLock();
static bool isLocked(const std::string& lockName); //, char* **argv ); static bool isLocked(const std::string& lockFile); //, char* **argv );
static bool lock(const std::string& lockName); static bool lock(const std::string& lockFile);
static bool unlock(const std::string& lockName); static bool unlock(const std::string& lockFile);
protected: protected:
}; };
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
#endif #endif
...@@ -49,11 +49,7 @@ namespace UniversalIO ...@@ -49,11 +49,7 @@ namespace UniversalIO
} }
// ----------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------
//#define REPEAT_TIMEOUT 100 // [мс] пауза между попытками вызвать удаленную функцию объекта
//#define REPEAT_COUNT 5 // количество попыток, после которого вырабатывается TimeOut
#define IO_THROW_EXCEPTIONS UniSetTypes::TimeOut,UniSetTypes::IOBadParam,UniSetTypes::ORepFailed #define IO_THROW_EXCEPTIONS UniSetTypes::TimeOut,UniSetTypes::IOBadParam,UniSetTypes::ORepFailed
// ----------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------
/*! /*!
* \class UniversalInterface * \class UniversalInterface
...@@ -96,7 +92,7 @@ class UniversalInterface ...@@ -96,7 +92,7 @@ class UniversalInterface
//! Выставление состояния датчика //! Выставление состояния датчика
void setValue ( UniSetTypes::ObjectId id, long value, UniSetTypes::ObjectId node ) throw(IO_THROW_EXCEPTIONS); void setValue ( UniSetTypes::ObjectId id, long value, UniSetTypes::ObjectId node ) throw(IO_THROW_EXCEPTIONS);
void setValue ( UniSetTypes::ObjectId id, long value); void setValue ( UniSetTypes::ObjectId id, long value );
void setValue ( IOController_i::SensorInfo& si, long value, UniSetTypes::ObjectId supplier ); void setValue ( IOController_i::SensorInfo& si, long value, UniSetTypes::ObjectId supplier );
void fastSetValue( IOController_i::SensorInfo& si, long value, UniSetTypes::ObjectId supplier ); void fastSetValue( IOController_i::SensorInfo& si, long value, UniSetTypes::ObjectId supplier );
...@@ -116,7 +112,7 @@ class UniversalInterface ...@@ -116,7 +112,7 @@ class UniversalInterface
//! Заказ информации об изменении дискретного датчика //! Заказ информации об изменении дискретного датчика
void askThreshold ( UniSetTypes::ObjectId sensorId, UniSetTypes::ThresholdId tid, void askThreshold( UniSetTypes::ObjectId sensorId, UniSetTypes::ThresholdId tid,
UniversalIO::UIOCommand cmd, UniversalIO::UIOCommand cmd,
CORBA::Long lowLimit=0, CORBA::Long hiLimit=0, CORBA::Long sensibility=0, CORBA::Long lowLimit=0, CORBA::Long hiLimit=0, CORBA::Long sensibility=0,
UniSetTypes::ObjectId backid = UniSetTypes::DefaultObjectId ); UniSetTypes::ObjectId backid = UniSetTypes::DefaultObjectId );
...@@ -220,16 +216,14 @@ class UniversalInterface ...@@ -220,16 +216,14 @@ class UniversalInterface
UniSetTypes::ObjectId node = UniSetTypes::conf->getLocalNode() ); // used exist UniSetTypes::ObjectId node = UniSetTypes::conf->getLocalNode() ); // used exist
bool waitWorking( UniSetTypes::ObjectId id, int msec, int pause=3000, bool waitWorking( UniSetTypes::ObjectId id, int msec, int pause=3000,
UniSetTypes::ObjectId node = UniSetTypes::conf->getLocalNode() ); // used getState UniSetTypes::ObjectId node = UniSetTypes::conf->getLocalNode() ); // used getValue
inline void setCacheMaxSize( unsigned int newsize) inline void setCacheMaxSize( unsigned int newsize)
{ {
rcache.setMaxSize(newsize); rcache.setMaxSize(newsize);
} }
/*! /*! Кэш ссылок на объекты */
\todo Убедится в уникальности возвращаемого результата hash(...)
*/
class CacheOfResolve class CacheOfResolve
{ {
public: public:
...@@ -241,7 +235,7 @@ class UniversalInterface ...@@ -241,7 +235,7 @@ class UniversalInterface
void cache(UniSetTypes::ObjectId id, UniSetTypes::ObjectId node, UniSetTypes::ObjectVar ptr); void cache(UniSetTypes::ObjectId id, UniSetTypes::ObjectId node, UniSetTypes::ObjectVar ptr);
void erase(UniSetTypes::ObjectId id, UniSetTypes::ObjectId node); void erase(UniSetTypes::ObjectId id, UniSetTypes::ObjectId node);
inline void setMaxSize( unsigned int ms) inline void setMaxSize( unsigned int ms )
{ {
MaxSize = ms; MaxSize = ms;
}; };
...@@ -250,6 +244,7 @@ class UniversalInterface ...@@ -250,6 +244,7 @@ class UniversalInterface
protected: protected:
CacheOfResolve(){}; CacheOfResolve(){};
private: private:
bool clean(); /*!< функция очистки кэш-а от старых ссылок */ bool clean(); /*!< функция очистки кэш-а от старых ссылок */
...@@ -264,7 +259,7 @@ class UniversalInterface ...@@ -264,7 +259,7 @@ class UniversalInterface
*/ */
struct Info struct Info
{ {
Info( UniSetTypes::ObjectVar ptr, time_t tm=0): Info( UniSetTypes::ObjectVar ptr, time_t tm=0 ):
ptr(ptr) ptr(ptr)
{ {
if(!tm) if(!tm)
...@@ -310,6 +305,7 @@ class UniversalInterface ...@@ -310,6 +305,7 @@ class UniversalInterface
void initBackId( UniSetTypes::ObjectId backid ); void initBackId( UniSetTypes::ObjectId backid );
protected: protected:
std::string set_err(const std::string& pre, UniSetTypes::ObjectId id, UniSetTypes::ObjectId node); std::string set_err(const std::string& pre, UniSetTypes::ObjectId id, UniSetTypes::ObjectId node);
private: private:
void init(); void init();
......
...@@ -24,7 +24,6 @@ ...@@ -24,7 +24,6 @@
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#include <dirent.h> #include <dirent.h>
#include "RunLock.h" #include "RunLock.h"
#include "Exceptions.h"
#include "Configuration.h" #include "Configuration.h"
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
using namespace UniSetTypes; using namespace UniSetTypes;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment