UniSet
1.4.0
|
00001 /* This file is part of the UniSet project 00002 * Copyright (c) 2002-2005 Free Software Foundation, Inc. 00003 * Copyright (c) 2002 Pavel Vainerman 00004 * 00005 * This program is free software; you can redistribute it and/or modify 00006 * it under the terms of the GNU General Public License as published by 00007 * the Free Software Foundation; either version 2 of the License, or 00008 * (at your option) any later version. 00009 * 00010 * This program is distributed in the hope that it will be useful, 00011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00013 * GNU General Public License for more details. 00014 * 00015 * You should have received a copy of the GNU General Public License 00016 * along with this program; if not, write to the Free Software 00017 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 00018 */ 00019 // -------------------------------------------------------------------------- 00024 // -------------------------------------------------------------------------- 00025 #ifndef UniSetTypes_H_ 00026 #define UniSetTypes_H_ 00027 // -------------------------------------------------------------------------- 00028 #include <cstdlib> 00029 #include <cstdio> 00030 #include <string> 00031 #include <list> 00032 #include <limits> 00033 #include <ostream> 00034 00035 #include <omniORB4/CORBA.h> 00036 #include "UniSetTypes_i.hh" 00037 #include "IOController_i.hh" 00038 #include "Mutex.h" 00039 #include "UniXML.h" 00040 // ----------------------------------------------------------------------------------------- 00042 inline void msleep( unsigned int m ) { usleep(m*1000); } 00043 00045 namespace UniSetTypes 00046 { 00047 class Configuration; 00048 extern Configuration* conf; 00049 00050 typedef std::list<std::string> ListObjectName; 00052 typedef ObjectId SysId; 00053 typedef CORBA::Object_ptr ObjectPtr; 00054 typedef CORBA::Object_var ObjectVar; 00057 inline static UniSetTypes::ObjectType getObjectType(const char * name) { const void *t = name; return (UniSetTypes::ObjectType)t; } 00058 00059 UniversalIO::IOTypes getIOType( const std::string s ); 00060 std::ostream& operator<<( std::ostream& os, const UniversalIO::IOTypes t ); 00061 00062 std::ostream& operator<<( std::ostream& os, const IOController_i::CalibrateInfo c ); 00063 00064 00066 enum LampCommand 00067 { 00068 lmpOFF = 0, 00069 lmpON = 1, 00070 lmpBLINK = 2, 00071 lmpBLINK2 = 3, 00072 lmpBLINK3 = 4 00073 }; 00074 00075 static const long ChannelBreakValue = std::numeric_limits<long>::max(); 00076 00077 class IDList 00078 { 00079 public: 00080 IDList(); 00081 ~IDList(); 00082 00083 void add( ObjectId id ); 00084 void del( ObjectId id ); 00085 00086 inline int size(){ return lst.size(); } 00087 inline bool empty(){ return lst.empty(); } 00088 00089 std::list<ObjectId> getList(); 00090 00091 // за освобождение выделеной памяти 00092 // отвечает вызывающий! 00093 IDSeq* getIDSeq(); 00094 00095 // 00096 ObjectId getFirst(); 00097 ObjectId node; // узел, на котором находятся датчики 00098 00099 private: 00100 std::list<ObjectId> lst; 00101 }; 00102 00103 const ObjectId DefaultObjectId = -1; 00105 // typedef long MessageCode; 00106 const MessageCode DefaultMessageCode = 0; 00108 const ThresholdId DefaultThresholdId = -1; 00109 const ThresholdId DefaultTimerId = -1; 00113 struct MessageInfo 00114 { 00115 UniSetTypes::MessageCode code; 00116 std::string text; 00117 std::string idname; 00119 inline bool operator < ( const MessageInfo& m ) const 00120 { 00121 return (code < m.code); 00122 } 00123 }; 00124 00126 struct ObjectInfo 00127 { 00128 ObjectInfo(): 00129 id(DefaultObjectId), 00130 repName(0),textName(0),data(0){} 00131 00132 ObjectId id; 00133 char* repName; 00134 char* textName; 00135 void* data; 00136 00137 inline bool operator < ( const ObjectInfo& o ) const 00138 { 00139 return (id < o.id); 00140 } 00141 }; 00142 00143 typedef std::list<NodeInfo> ListOfNode; 00144 00146 const char BadSymbols[]={'.','/'}; 00147 00148 class uniset_mutex; 00149 class uniset_mutex_lock; 00150 00152 inline int uni_atoi( const char* str ) 00153 { 00154 int n = 0; // if str is NULL or sscanf failed, we return 0 00155 00156 if ( str != NULL ) 00157 std::sscanf(str, "%i", &n); 00158 return n; 00159 } 00160 inline int uni_atoi( const std::string str ) 00161 { 00162 return uni_atoi(str.c_str()); 00163 } 00164 00165 00166 typedef long KeyType; 00174 inline static KeyType key( UniSetTypes::ObjectId id, UniSetTypes::ObjectId node ) 00175 { 00176 return KeyType((id*node)+(id+2*node)); 00177 } 00178 00183 inline std::string getArgParam( const std::string name, 00184 int _argc, const char* const* _argv, 00185 const std::string defval="" ) 00186 { 00187 for( int i=1; i < (_argc - 1) ; i++ ) 00188 { 00189 if( name == _argv[i] ) 00190 return _argv[i+1]; 00191 } 00192 return defval; 00193 } 00194 00195 inline int getArgInt( const std::string name, 00196 int _argc, const char* const* _argv, 00197 const std::string defval="" ) 00198 { 00199 return uni_atoi(getArgParam(name, _argc, _argv, defval)); 00200 } 00201 00207 inline int findArgParam( const std::string name, int _argc, const char* const* _argv ) 00208 { 00209 for( int i=1; i<_argc; i++ ) 00210 { 00211 if( name == _argv[i] ) 00212 return i; 00213 } 00214 return -1; 00215 } 00216 00218 template<typename InputIterator, 00219 typename OutputIterator, 00220 typename Predicate> 00221 OutputIterator copy_if(InputIterator begin, 00222 InputIterator end, 00223 OutputIterator destBegin, 00224 Predicate p) 00225 { 00226 while( begin!=end) 00227 { 00228 if( p(*begin) ) &destBegin++=*begin; 00229 ++begin; 00230 } 00231 return destBegin; 00232 } 00233 00234 // Функции калибровки значений 00235 // raw - преобразуемое значение 00236 // rawMin - минимальная граница исходного диапазона 00237 // rawMax - максимальная граница исходного диапазона 00238 // calMin - минимальная граница калиброванного диапазона 00239 // calMin - минимальная граница калиброванного диапазона 00240 // limit - обрезать итоговое значение по границам 00241 float fcalibrate(float raw, float rawMin, float rawMax, float calMin, float calMax, bool limit=true ); 00242 long lcalibrate(long raw, long rawMin, long rawMax, long calMin, long calMax, bool limit=true ); 00243 00244 // установка значения в нужный диапазон 00245 long setinregion(long raw, long rawMin, long rawMax); 00246 // установка значения вне диапазона 00247 long setoutregion(long raw, long rawMin, long rawMax); 00248 00249 00250 00251 bool file_exist( const std::string filename ); 00252 00253 IDList explode( const std::string str, char sep=',' ); 00254 std::list<std::string> explode_str( const std::string str, char sep=',' ); 00255 00256 00257 struct ParamSInfo 00258 { 00259 IOController_i::SensorInfo si; 00260 long val; 00261 std::string fname; // fullname id@node or id 00262 }; 00263 00264 // Функция разбора строки вида: id1@node1=val1,id2@node2=val2,... 00265 // Если '=' не указано, возвращается val=0 00266 // Если @node не указано, возвращается node=DefaultObjectId 00267 std::list<ParamSInfo> getSInfoList( std::string s, Configuration* conf=UniSetTypes::conf); 00268 bool is_digit( const std::string s ); 00269 00270 // Проверка xml-узла на соответсвие <...f_prop="f_val">, 00271 // если не задано f_val, то проверяется, что просто f_prop!="" 00272 bool check_filter( UniXML_iterator& it, const std::string f_prop, const std::string f_val="" ); 00273 // ----------------------------------------------------------------------------- 00274 } 00275 00276 #define atoi atoi##_Do_not_use_atoi_function_directly_Use_getIntProp90,_getArgInt_or_uni_atoi 00277 00278 // ----------------------------------------------------------------------------------------- 00279 #endif