00001
00005
00006 #ifndef SEESGroup_H_
00007 #define SEESGroup_H_
00008
00009 #include <list>
00010 #include <vector>
00011 #include <map>
00012 #include <UniSetTypes.h>
00013 #include <UniversalInterface.h>
00014 #include <PassiveTimer.h>
00015 #include <Trigger.h>
00016 #include <DebugStream.h>
00017 #include <SandClock.h>
00018
00019 class SEES;
00020 typedef std::list<SEES*> SESList;
00021
00023 class SEESGroup
00024 {
00025 public:
00026
00027 SEESGroup( int num, const std::string& name="" );
00028 ~SEESGroup();
00029
00030 friend std::ostream& operator<<(std::ostream& os, SEESGroup& g );
00031 friend std::ostream& operator<<(std::ostream& os, SEESGroup* g );
00032 friend std::ostream& print_chain(std::ostream& os, SEESGroup* g );
00033
00034 inline int getNumber(){ return gnum; }
00035 inline std::string getName(){ return myname; }
00036
00037 long getP();
00038 long getU();
00039 long getF();
00040 bool isUdev();
00041 bool isFdev();
00042 long getReservPower();
00044 void step();
00045 void update();
00046
00048 void updatePowerInfo();
00049
00050 void requiredReserv( bool set );
00051 bool isNoReserv();
00052 bool isReadyForLoading();
00053 void addGroup( SEESGroup* gr );
00054 bool add( SEES* ses );
00055 bool del( SEES* ses );
00056 void clear();
00057
00059 bool isProtection();
00060
00065 int acceptQG( int num )throw(UniSetTypes::NameNotFound);
00066
00068 void releaseQG( int num )throw(UniSetTypes::NameNotFound);
00069
00074 bool canRun( int num )throw(UniSetTypes::NameNotFound);
00075
00076 SEES* get( int num );
00077 inline SESList getSESList(){ return lst; }
00078
00080 struct ReservInfo
00081 {
00082 ReservInfo():
00083 ses(0),
00084 waitRunning(false),
00085 waitStopping(false)
00086 {
00087 ptPause.setTiming(0);
00088 trChangeState.hi(true);
00089 }
00090
00091 ReservInfo(SEES* s):
00092 ses(s),
00093 waitRunning(false),
00094 waitStopping(false)
00095 {
00096 ptPause.setTiming(0);
00097 trChangeState.hi(true);
00098 }
00099
00100 SEES* ses;
00101 PassiveTimer ptPause;
00102 Trigger trChangeState;
00103 bool waitRunning;
00104 bool waitStopping;
00105 };
00106
00107 typedef std::list<ReservInfo> RList;
00108
00109 static DebugStream dlog;
00110 static void init_dlog( DebugStream& dlog );
00111
00112 inline void setReservStatePause(int s){ reservStatePause = s; }
00113 inline void setCommandTimeout( int s ){ reservCommandTimeout = s; }
00114 inline void setReservTime( int s ){ checkReservTime = s; }
00115 inline void setMaxWorkingDG( int s ){ maxWorkingDG = s; }
00116 int getWorkingDG();
00117
00118 inline void setFdev( int f_min_, int f_max_, int f_msec )
00119 {
00120 f_min = f_min_; f_max=f_max_;
00121 if( f_msec > 0 )
00122 sc_Fdev.run(f_msec);
00123 }
00124
00125 inline void setUdev( int u_min_, int u_max_, int U_msec )
00126 {
00127 U_min = u_min_; U_max=u_max_;
00128 if( U_msec > 0 )
00129 sc_Udev.run(U_msec);
00130 }
00131
00132 protected:
00133 SEESGroup();
00134
00135 UniSetTypes::uniset_mutex lstMutex;
00136 int gnum;
00137 std::string myname;
00138
00139 int qf_locked;
00140
00141 SESList lst;
00142
00143
00144 SEES* leader;
00145 RList rlst;
00146
00147 int maxWorkingDG;
00148 int countWorkingDG;
00149 UniSetTypes::uniset_mutex maxrunMutex;
00150
00153 static void update( RList& rlist, ReservInfo& ri );
00154
00156 void reserv( bool set );
00157
00159 void checkReserv();
00160
00162 bool resetReserv();
00163
00165 void makeReservList();
00166
00170 void checkAloneWorking();
00171
00173 void updateCounters();
00174
00175 int reservStatePause;
00176 int reservCommandTimeout;
00177 int checkReservTime;
00178 PassiveTimer ptCheckReserv;
00179
00180
00181 int f_min;
00182 int f_max;
00183 int U_min;
00184 int U_max;
00185 SandClock sc_Fdev;
00186 SandClock sc_Udev;
00187 bool U_dev;
00188 bool f_dev;
00190 private:
00191 };
00192
00193 #endif // SEESGroup_H_
00194