PVGroup.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008 #ifndef PVGROUP_H
00009 #define PVGROUP_H
00010
00011
00012 #include <PVDataHolder.h>
00013
00014
00019 class MemberMap {
00020 typedef std::map<long, std::string> mapLongString;
00021 private:
00022 mapLongString mapNameIndex;
00023 mapLongString::iterator pos;
00024 Helper helper;
00025
00026 public:
00027 MemberMap(){};
00028 ~MemberMap(){};
00029
00030 void insert(int a, std::string _Name) {
00031 mapNameIndex.insert(std::make_pair(a, _Name));
00032 };
00033
00034 std::string getPV (int i) {
00035
00036 pos = mapNameIndex.find(i);
00037 if (pos != mapNameIndex.end()) return pos->second;
00038 std::cout << "Index " << i << " not found! Size of group vector is " << mapNameIndex.size() << std::endl;
00039 return "";
00040 };
00041
00042 int getIndex (std::string _Name) {
00043 char pvStripped[PVNAME_SIZE];
00044 helper.removeLeadingAndTrailingSpaces(_Name.c_str(), pvStripped);
00045 std::string Name=pvStripped;
00046
00047 for (pos=mapNameIndex.begin(); pos != mapNameIndex.end(); ++pos) {
00048
00049 if (pos->second==Name) {return pos->first;}
00050
00051
00052 }
00053 std::cout << "PV: " << Name << " IS NOT A MEMBER OF THIS LIST " << std::endl;
00054 return -1;
00055 };
00056 };
00057
00058
00064 class PVGroup {
00065 friend class Connect;
00066 friend class CAFE;
00067
00068 friend class restorePVGroupXMLParser;
00069
00070 private:
00071 PVDataHolder * pvdata;
00072 unsigned int npv;
00073 char name [PVGROUP_PSEUDO_SIZE];
00074 int statusGroup;
00075 unsigned int groupHandle;
00076 bool isIndexOutOfRange (unsigned int idx) {
00077 return (idx >= npv) ? true:false;
00078 };
00079 MemberMap memberMap;
00080
00081 public:
00082
00083 PVGroup(){npv=0; pvdata=NULL; statusGroup=ICAFE_NORMAL; groupHandle=0; strcpy(name,"");};
00084 ~PVGroup(){};
00085 MemberMap getMemberMap() const {return memberMap;};
00086 PVDataHolder * getPVData() const {return pvdata;};
00087 PVDataHolder getPVData(unsigned int idx) throw(std::out_of_range){
00088 if(isIndexOutOfRange(idx)) {
00089 std::ostringstream oss;
00090 oss << "Exception! Index " << idx <<
00091 " to PVGroup.pvdata() is out of range. Valid range is from 0 to " << npv-1;
00092 throw std::out_of_range(oss.str());
00093 }
00094 return pvdata[idx];
00095 };
00096 void setHasAlarm(bool h){ for (unsigned int i=0; i<npv; ++i) {pvdata[i].setHasAlarm(h);} }
00097 void setHasTS(bool h){ for (unsigned int i=0; i<npv; ++i) {pvdata[i].setHasTS(h);} }
00098
00099 unsigned int getNPV() const {return npv;};
00100 std::string getNameAsString() const {return name;};
00101 const char * getName() const {return (const char *) name;};
00102 int getStatusGroup() const {return statusGroup;};
00103 int getGroupStatus() const {return statusGroup;};
00104 unsigned int getGroupHandle() const {return groupHandle;};
00105
00106 int PV2Index(std::string _pv) const {return getMemberMap().getIndex(_pv);}
00107 std::string Index2PV(unsigned int _idx) const {return getMemberMap().getPV(_idx);}
00108
00109 void setPVData(PVDataHolder * _pvdata) {
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134 pvdata=_pvdata;
00135 };
00136
00137 void set(unsigned int _npv) {npv=_npv;};
00138 void setName(const char * _name) {strcpy(name, _name);};
00139 void setName(std::string _name) {strcpy(name,_name.c_str());};
00140 void setStatusGroup(int _sg) {statusGroup=_sg;}
00141
00142
00143 void show() {print(npv) ;}
00144 void showMax(unsigned int npvToPrint){print(npvToPrint);}
00145 void showMaxMax(unsigned int npvToPrint, unsigned int maxNelemWF){
00146 print(npvToPrint, maxNelemWF);}
00147
00148 void print() {print(npv) ;}
00149 void print(unsigned int npvToPrint) {
00150 npvToPrint=std::min(npvToPrint,npv);
00151 std::cout << "------------ PVGroup Handle = " << groupHandle << " ------------ "<< std::endl;
00152 std::cout << "PVGROUP: " << name << " HAS " << npv << " MEMBERS " << std::endl;
00153 std::cout << "PRINTING THE REQUESTED " << npvToPrint << " MEMBERS " << std::endl;
00154 std::cout << "OVERALL STATUS OF GROUP REPORTS " << statusGroup << std::endl;
00155 if (statusGroup!=ICAFE_NORMAL) {
00156 CAFEStatus cstat; cstat.report(statusGroup);
00157 }
00158 for (unsigned int i=0; i<npvToPrint; ++i) {
00159 std::cout << "------------------------------------------" << std::endl;
00160 std::cout << "Element [" << i << "] of " << npvToPrint << " in group: " << name << std::endl;
00161 pvdata[i].print();
00162 }
00163 }
00164 void print(unsigned int npvToPrint, unsigned int maxNelemWF) {
00165 npvToPrint=std::min(npvToPrint,npv);
00166 std::cout << "------------ PVGroup Handle = " << groupHandle << " ------------ "<< std::endl;
00167 std::cout << "PVGROUP: " << name << " HAS " << npv << " MEMBERS " << std::endl;
00168 std::cout << "PRINTING THE REQUESTED " << npvToPrint << " MEMBERS " << std::endl;
00169 std::cout << "OVERALL STATUS OF GROUP REPORTS " << statusGroup << std::endl;
00170 if (statusGroup!=ICAFE_NORMAL) {
00171 CAFEStatus cstat; cstat.report(statusGroup);
00172 }
00173 for (unsigned int i=0; i<npvToPrint; ++i) {
00174 std::cout << "------------------------------------------" << std::endl;
00175 std::cout << "Element [" << i << "] of " << npvToPrint << " in group: " << name << std::endl;
00176 pvdata[i].print(std::min(maxNelemWF,pvdata[i].getNelem()));
00177 }
00178 }
00179
00180 void printIfError() {
00181 unsigned int npvToPrint=npv;
00182 bool iErrorFound=false;
00183 for (unsigned int i=0; i<npvToPrint; ++i) {
00184 if (pvdata[i].getStatus() != ICAFE_NORMAL) {
00185 if(!iErrorFound) {
00186 std::cout << "PVGROUP: " << name << " HAS " << npv << " MEMBERS " << std::endl;
00187 std::cout << "PRINTING PV TRANSACTIONS WITH ERRORS " << std::endl;
00188 iErrorFound=true;
00189 }
00190 std::cout << "------------------------------------------------------------" << std::endl;
00191 std::cout << "Element [" << i << "] of " << npv << " in group: " << name << std::endl;
00192 pvdata[i].print();
00193 }
00194 }
00195 }
00196 };
00197
00198
00199
00200 #endif //PVGROUP_H