00001 00002 00003 00004 00005 00006 00007 00008 #ifndef CONDUITFRIENDS_H 00009 #define CONDUITFRIENDS_H 00010 00011 #include <cstdio> 00012 #include <conduit.h> 00013 #include <statusCodes.h> 00014 00018 struct change_alarmStatus 00019 { 00020 change_alarmStatus (const dbr_short_t & new_alarmStatus): new_alarmStatus(new_alarmStatus){} 00021 00022 void operator() (Conduit& c) { 00024 c.alarmStatus = new_alarmStatus; 00026 } 00027 00028 private: 00029 dbr_short_t new_alarmStatus; 00030 }; 00031 struct change_alarmSeverity 00032 { 00033 change_alarmSeverity (const dbr_short_t & new_alarmSeverity): new_alarmSeverity(new_alarmSeverity){} 00034 00035 void operator() (Conduit& c) { 00037 c.alarmSeverity = new_alarmSeverity; 00039 } 00040 00041 private: 00042 dbr_short_t new_alarmSeverity; 00043 }; 00044 struct change_epicsTimeStamp 00045 { 00046 change_epicsTimeStamp (const epicsTimeStamp & new_epicsTimeStamp): new_epicsTimeStamp(new_epicsTimeStamp){} 00047 00048 void operator() (Conduit& c) { 00050 c.ts = new_epicsTimeStamp; 00051 //Do this to prevent overflow error in epicsTime time(ts) routines! 00052 //This bad number can occur in timeouts 00053 if(c.ts.nsec>1000000000) {c.ts.nsec=0;} 00055 } 00056 00057 private: 00058 epicsTimeStamp new_epicsTimeStamp; 00059 }; 00060 00061 00065 struct change_accessRead 00066 { 00067 change_accessRead (const unsigned int & new_accessRead): new_accessRead(new_accessRead){} 00068 00069 void operator() (Conduit& c) { 00071 c.channelRegalia.accessRead = new_accessRead; 00073 } 00074 00075 private: 00076 unsigned int new_accessRead; 00077 }; 00078 00079 00083 struct change_accessWrite 00084 { 00085 change_accessWrite (const unsigned int & new_accessWrite): new_accessWrite(new_accessWrite){} 00086 00087 void operator() (Conduit& c) { 00089 c.channelRegalia.accessWrite = new_accessWrite; 00091 } 00092 00093 private: 00094 unsigned int new_accessWrite; 00095 }; 00096 00097 00102 struct change_accessRightsHandlerArgs 00103 { 00104 change_accessRightsHandlerArgs (const struct access_rights_handler_args & new_accessRightsHandlerArgs): 00105 new_accessRightsHandlerArgs(new_accessRightsHandlerArgs){} 00106 00107 void operator() (Conduit& c) { 00108 00110 c.channelRegalia.accessRead = new_accessRightsHandlerArgs.ar.read_access; 00111 c.channelRegalia.accessWrite= new_accessRightsHandlerArgs.ar.write_access; 00113 } 00114 00115 private: 00116 access_rights_handler_args new_accessRightsHandlerArgs; 00117 }; 00118 00119 00123 struct change_beamEventNo 00124 { 00125 change_beamEventNo (const unsigned long long & new_beamEventNo): new_beamEventNo(new_beamEventNo){} 00126 00127 void operator() (Conduit& c) {c.beamEventNo = new_beamEventNo;} 00128 00129 private: 00130 unsigned long long new_beamEventNo; 00131 }; 00132 00136 struct change_channelDeviceAttribute 00137 { 00138 change_channelDeviceAttribute (const ChannelDeviceAttribute & new_channelDeviceAttribute): 00139 new_channelDeviceAttribute(new_channelDeviceAttribute){} 00140 00141 void operator() (Conduit& c) {c.channelDeviceAttribute = new_channelDeviceAttribute;} 00142 00143 private: 00144 ChannelDeviceAttribute new_channelDeviceAttribute; 00145 }; 00146 00147 00148 00152 struct change_channelID 00153 { 00154 change_channelID (const chid & new_channelID): new_channelID(new_channelID){} 00155 00156 void operator() (Conduit& c) { 00157 c.channelRegalia.channelID=new_channelID; 00158 c.channelID=new_channelID; 00159 } 00160 00161 private: 00162 chid new_channelID; 00163 }; 00164 00165 00166 00170 struct change_channelGetActionWhenMonitorPolicy 00171 { 00172 change_channelGetActionWhenMonitorPolicy ( 00173 const ChannelGetActionWhenMonitorPolicy & new_channelGetActionWhenMonitorPolicy): 00174 new_channelGetActionWhenMonitorPolicy(new_channelGetActionWhenMonitorPolicy){} 00175 00176 void operator() (Conduit& c) { 00177 // 00178 c.channelGetActionWhenMonitorPolicy = new_channelGetActionWhenMonitorPolicy; 00179 } 00180 private: 00181 ChannelGetActionWhenMonitorPolicy new_channelGetActionWhenMonitorPolicy; 00182 }; 00183 00184 00188 struct change_channelGetCacheWaitPolicy 00189 { 00190 change_channelGetCacheWaitPolicy ( 00191 const ChannelGetCacheWaitPolicy & new_channelGetCacheWaitPolicy): 00192 new_channelGetCacheWaitPolicy(new_channelGetCacheWaitPolicy){} 00193 00194 void operator() (Conduit& c) { 00195 // 00196 c.channelGetCacheWaitPolicy = new_channelGetCacheWaitPolicy; 00197 } 00198 private: 00199 ChannelGetCacheWaitPolicy new_channelGetCacheWaitPolicy; 00200 }; 00201 00202 00203 00204 00205 00209 struct change_hasNewData 00210 { 00211 change_hasNewData (const bool & new_hasNewData): new_hasNewData(new_hasNewData){} 00212 00213 void operator() (Conduit& c) {c.hasNewData = new_hasNewData;} 00214 00215 private: 00216 bool new_hasNewData; 00217 }; 00218 00219 00220 00224 struct change_channelRegalia 00225 { 00226 change_channelRegalia (const ChannelRegalia & new_channelRegalia): new_channelRegalia(new_channelRegalia){} 00227 00228 void operator() (Conduit& c) {c.channelRegalia = new_channelRegalia;} 00229 00230 private: 00231 ChannelRegalia new_channelRegalia; 00232 }; 00233 00234 00238 struct change_channelRequestDataTypePolicy 00239 { 00240 change_channelRequestDataTypePolicy ( 00241 const ChannelRequestDataTypePolicy & new_channelRequestDataTypePolicy): 00242 new_channelRequestDataTypePolicy(new_channelRequestDataTypePolicy){} 00243 00244 void operator() (Conduit& c) { 00245 // 00246 c.channelRequestDataTypePolicy = new_channelRequestDataTypePolicy; 00247 } 00248 private: 00249 ChannelRequestDataTypePolicy new_channelRequestDataTypePolicy; 00250 }; 00251 00252 00253 00257 struct change_channelRequestMetaCtrl 00258 { 00259 change_channelRequestMetaCtrl (const ChannelRequestMetaData & new_channelData): 00260 new_channelData(new_channelData){} 00261 00262 void operator() (Conduit& c) { 00263 // 00264 c.channelRequestMetaCtrl = new_channelData; 00265 } 00266 private: 00267 ChannelRequestMetaData new_channelData; 00268 }; 00269 00270 00271 00275 struct change_channelRequestMetaCtrlClient 00276 { 00277 change_channelRequestMetaCtrlClient (const ChannelRequestMetaDataClient & new_channelData): 00278 new_channelData(new_channelData){} 00279 00280 void operator() (Conduit& c) { 00281 // 00282 c.channelRequestMetaCtrlClient = new_channelData; 00283 00284 } 00285 private: 00286 ChannelRequestMetaDataClient new_channelData; 00287 }; 00288 00289 00290 00291 00292 00296 struct change_channelRequestMetaData 00297 { 00298 change_channelRequestMetaData (const ChannelRequestMetaData & new_channelData): 00299 new_channelData(new_channelData){} 00300 00301 void operator() (Conduit& c) { 00302 // 00303 00304 c.channelRequestMetaData = new_channelData; 00305 00306 } 00307 00308 private: 00309 ChannelRequestMetaData new_channelData; 00310 }; 00311 00312 00313 00317 struct change_channelRequestMetaDataClient 00318 { 00319 change_channelRequestMetaDataClient (const ChannelRequestMetaDataClient & new_channelData): 00320 new_channelData(new_channelData){} 00321 00322 void operator() (Conduit& c) { 00323 // 00324 00325 c.channelRequestMetaDataClient = new_channelData; 00326 } 00327 private: 00328 ChannelRequestMetaDataClient new_channelData; 00329 }; 00330 00331 00332 00336 struct change_channelRequestMetaPrimitive 00337 { 00338 change_channelRequestMetaPrimitive (const ChannelRequestMetaData & new_channelData): 00339 new_channelData(new_channelData){} 00340 00341 void operator() (Conduit& c) { 00342 // 00343 c.channelRequestMetaPrimitive = new_channelData; 00344 } 00345 private: 00346 ChannelRequestMetaData new_channelData; 00347 }; 00348 00349 00353 struct change_channelRequestPolicyGet 00354 { 00355 change_channelRequestPolicyGet (const ChannelRequestPolicy & new_ChannelRequestPolicy): 00356 new_ChannelRequestPolicy(new_ChannelRequestPolicy){} 00357 00358 void operator() (Conduit& c) { 00359 //This does a deep copy! 00360 c.channelRequestPolicyGet = new_ChannelRequestPolicy; 00361 } 00362 private: 00363 ChannelRequestPolicy new_ChannelRequestPolicy; 00364 }; 00365 00366 00370 struct change_channelRequestPolicyGetCtrl 00371 { 00372 change_channelRequestPolicyGetCtrl (const ChannelRequestPolicy & new_ChannelRequestPolicy): 00373 new_ChannelRequestPolicy(new_ChannelRequestPolicy){} 00374 00375 void operator() (Conduit& c) { 00376 //This does a deep copy! 00377 c.channelRequestPolicyGetCtrl = new_ChannelRequestPolicy; 00378 } 00379 private: 00380 ChannelRequestPolicy new_ChannelRequestPolicy; 00381 }; 00382 00383 00384 00388 struct change_channelRequestPolicyPut 00389 { 00390 change_channelRequestPolicyPut (const ChannelRequestPolicy & new_ChannelRequestPolicy): 00391 new_ChannelRequestPolicy(new_ChannelRequestPolicy){} 00392 00393 void operator() (Conduit& c) { 00394 //This does a deep copy! 00395 c.channelRequestPolicyPut = new_ChannelRequestPolicy; 00396 } 00397 private: 00398 ChannelRequestPolicy new_ChannelRequestPolicy; 00399 }; 00400 00401 00402 00403 00407 struct change_channelRequestStatusGet 00408 { 00409 change_channelRequestStatusGet (const ChannelRequestStatus & new_ChannelRequestStatus): 00410 new_ChannelRequestStatus(new_ChannelRequestStatus){} 00411 00412 void operator() (Conduit& c) { 00413 //This does a deep copy! 00414 00415 c.channelRequestStatusGet = new_ChannelRequestStatus; 00416 } 00417 00418 private: 00419 ChannelRequestStatus new_ChannelRequestStatus; 00420 }; 00421 00422 00423 00427 struct change_channelRequestStatusGetCtrl 00428 { 00429 change_channelRequestStatusGetCtrl (const ChannelRequestStatus & new_ChannelRequestStatus): 00430 new_ChannelRequestStatus(new_ChannelRequestStatus){} 00431 00432 void operator() (Conduit& c) { 00433 //This does a deep copy! 00434 c.channelRequestStatusGetCtrl = new_ChannelRequestStatus; 00435 } 00436 private: 00437 ChannelRequestStatus new_ChannelRequestStatus; 00438 }; 00439 00440 00444 struct change_channelRequestStatusGetSTSACK 00445 { 00446 change_channelRequestStatusGetSTSACK (const ChannelRequestStatus & new_ChannelRequestStatus): 00447 new_ChannelRequestStatus(new_ChannelRequestStatus){} 00448 00449 void operator() (Conduit& c) { 00450 //This does a deep copy! 00451 c.channelRequestStatusGetSTSACK = new_ChannelRequestStatus; 00452 } 00453 private: 00454 ChannelRequestStatus new_ChannelRequestStatus; 00455 }; 00456 00457 00458 00462 struct change_channelRequestStatusGetClassName 00463 { 00464 change_channelRequestStatusGetClassName (const ChannelRequestStatus & new_ChannelRequestStatus): 00465 new_ChannelRequestStatus(new_ChannelRequestStatus){} 00466 00467 void operator() (Conduit& c) { 00468 //This does a deep copy! 00469 c.channelRequestStatusGetClassName = new_ChannelRequestStatus; 00470 } 00471 private: 00472 ChannelRequestStatus new_ChannelRequestStatus; 00473 }; 00474 00475 00479 struct change_channelRequestStatusPut 00480 { 00481 change_channelRequestStatusPut (const ChannelRequestStatus & new_ChannelRequestStatus): 00482 new_ChannelRequestStatus(new_ChannelRequestStatus){} 00483 00484 void operator() (Conduit& c) { 00485 //This does a deep copy! 00486 c.channelRequestStatusPut = new_ChannelRequestStatus; 00487 } 00488 private: 00489 ChannelRequestStatus new_ChannelRequestStatus; 00490 }; 00491 00492 00493 00494 00498 struct change_channelTimeoutPolicyGet 00499 { 00500 change_channelTimeoutPolicyGet (const ChannelTimeoutPolicy & new_channelTimeoutPolicy): 00501 new_channelTimeoutPolicy(new_channelTimeoutPolicy){} 00502 00503 void operator() (Conduit& c) { 00504 //This does a deep copy! 00505 c.channelTimeoutPolicyGet = new_channelTimeoutPolicy; 00506 } 00507 private: 00508 ChannelTimeoutPolicy new_channelTimeoutPolicy; 00509 }; 00510 00511 00515 struct change_channelTimeoutPolicyPut 00516 { 00517 change_channelTimeoutPolicyPut (const ChannelTimeoutPolicy & new_channelTimeoutPolicy): 00518 new_channelTimeoutPolicy(new_channelTimeoutPolicy){} 00519 00520 void operator() (Conduit& c) { 00521 //This does a deep copy! 00522 c.channelTimeoutPolicyPut = new_channelTimeoutPolicy; 00523 } 00524 private: 00525 ChannelTimeoutPolicy new_channelTimeoutPolicy; 00526 }; 00527 00528 00529 00533 struct change_dequePulseID 00534 { 00535 change_dequePulseID (const PVDataHolder & new_pvd): new_pvd(new_pvd){} 00536 00537 void operator() (Conduit& c) { 00538 00539 00540 00541 try{ 00542 c.dequePulseID.push_back(new_pvd); 00543 00544 if (c.dequePulseID.size() > c.mapPulseIDBufferSize) { 00545 c.dequePulseID.pop_front(); 00546 } 00547 00548 } catch (std::bad_alloc &e) { 00549 00550 std::cout << "change_dequeuPulseID" << " //" << e.what() << std:: endl; 00551 exit(1); 00552 00553 } 00554 00555 00556 00557 } 00558 00559 private: 00560 PVDataHolder new_pvd; 00561 }; 00562 00563 00564 00568 struct change_mapPulseID 00569 { 00570 change_mapPulseID (const PVDataHolder & new_pvd): new_pvd(new_pvd){} 00571 00572 void operator() (Conduit& c) { 00573 00574 try{ 00575 00576 //std::pair<unsigned long long, PVDataHolder> p = std::make_pair(new_pvd.getPulseID(), new_pvd); 00577 00578 //Check if make_pair is a success 00579 00580 c.mapPulseID.insert(std::make_pair(new_pvd.getPulseID(), new_pvd)); 00581 00582 00583 if (c.mapPulseID.size() > c.mapPulseIDBufferSize) { 00584 00585 std::map<unsigned long long, PVDataHolder>::iterator pos=c.mapPulseID.begin(); 00586 if (pos != c.mapPulseID.end()) { 00587 c.mapPulseID.erase(pos); 00588 } 00589 else { 00590 std::cout << "ITERATOR NOT FOUND in change_mapPulseID" << std::endl; 00591 } 00592 } 00593 00594 } catch (std::bad_alloc &e) { 00595 00596 std::cout << "change_mapPulseID" << " //" << e.what() << std:: endl; 00597 exit(1); 00598 00599 } 00600 00601 } 00602 00603 private: 00604 PVDataHolder new_pvd; 00605 }; 00606 00607 00608 00609 00614 struct change_mapPulseIDBufferSize 00615 { 00616 change_mapPulseIDBufferSize (const unsigned short & new_mapPulseIDBufferSize): new_mapPulseIDBufferSize(new_mapPulseIDBufferSize){} 00617 00618 void operator() (Conduit& c) { 00619 ipos=0; 00620 if (c.mapPulseIDBufferSize > new_mapPulseIDBufferSize) { 00621 std::map<unsigned long long, PVDataHolder>::iterator pos; 00622 for (pos=c.mapPulseID.begin(); pos != c.mapPulseID.end();) { 00623 ++ipos; 00624 if (ipos > new_mapPulseIDBufferSize) { 00625 c.mapPulseID.erase(pos++); 00626 } 00627 else { 00628 ++pos; 00629 } 00630 } 00631 } 00632 c.mapPulseIDBufferSize=new_mapPulseIDBufferSize; 00633 } 00634 00635 private: 00636 unsigned short new_mapPulseIDBufferSize; 00637 unsigned short ipos; 00638 }; 00639 00640 00645 struct change_monitorAction 00646 { 00647 change_monitorAction (std::string &new_monitorAction): new_monitorAction(new_monitorAction){} 00648 00649 void operator() (Conduit& c) { 00650 c.monitorAction.push_back(new_monitorAction); 00651 } 00652 private: 00653 std::string new_monitorAction; 00654 }; 00655 00656 00657 00662 struct change_monitorActionClear 00663 { 00664 change_monitorActionClear (){} 00665 00666 void operator() (Conduit& c) { 00667 c.monitorAction.clear(); 00668 } 00669 00670 }; 00671 00672 00673 00678 struct change_monitorActionErase 00679 { 00680 change_monitorActionErase (std::string &new_monitorAction): new_monitorAction(new_monitorAction){} 00681 00682 void operator() (Conduit& c) { 00683 bool maFound=false; 00684 std::vector<std::string>::iterator it; 00685 00686 00687 for (it = c.monitorAction.begin(); it != c.monitorAction.end(); ) { 00688 if( (*it)==new_monitorAction) { 00689 it = c.monitorAction.erase(it); 00690 maFound=true; 00691 } 00692 else { 00693 ++it; 00694 } 00695 } 00696 00697 if (!maFound) { 00698 std::cout << "monitorAction " << new_monitorAction << " NOT FOUND! " << std::endl; 00699 std::cout << "Could not delete entry!" << std::endl; 00700 } 00701 00702 } 00703 private: 00704 std::string new_monitorAction; 00705 }; 00706 00707 00712 struct change_monitorPolicyErase 00713 { 00714 change_monitorPolicyErase (unsigned int & new_evid): new_evid(new_evid){} 00715 00716 void operator() (Conduit& c) { 00717 00718 bool evidFound=false; 00719 std::vector<MonitorPolicy>::iterator it; 00720 //Iterate 00721 for (it = c.mpV.begin(); it != c.mpV.end();) { 00722 //std::cout << "ID " << (*it).getID() << " " << std::endl; 00723 00724 if ( (*it).getID()==new_evid) { 00725 evidFound=true; 00726 it=(c.mpV).erase(it); 00727 break; 00728 } 00729 else { 00730 ++it; 00731 } 00732 } 00733 00734 if (!evidFound) { 00735 std::cout << "evid " << new_evid << " NOT FOUND! " << std::endl; 00736 std::cout << "Could not delete entry!" << std::endl; 00737 } 00738 } 00739 00740 private: 00741 unsigned int new_evid; 00742 }; 00743 00744 00745 00746 00751 struct change_monitorPolicyInsert 00752 { 00753 change_monitorPolicyInsert (class MonitorPolicy & new_monitorPolicy): new_monitorPolicy(new_monitorPolicy){} 00754 00755 void operator() (Conduit& c) { 00756 00757 00758 //insert into mpV 00759 (c.mpV).push_back(new_monitorPolicy); 00760 00761 if (c.mpV.size()>(MAX_NO_MONITORS_PER_CHANNEL/2)) { 00762 std::cout << "HEY DUDE - YOU NOW HAVE " << c.mpV.size() << " MONITORS " << std::endl; 00763 std::cout << "for channel " << c.pv << " with handle " << c.handle << std::endl; 00764 } 00765 00766 00767 } 00768 00769 private: 00770 class MonitorPolicy new_monitorPolicy; 00771 }; 00772 00773 00774 00779 struct change_monitorPolicyInWaitingErase 00780 { 00781 change_monitorPolicyInWaitingErase (unsigned int & new_evid): new_evid(new_evid){} 00782 00783 void operator() (Conduit& c) { 00784 00785 bool evidFound=false; 00786 std::vector<MonitorPolicy>::iterator it; 00787 //Iterate 00788 for (it = c.mpInWaitingV.begin(); it != c.mpInWaitingV.end(); ++it) { 00789 00790 if ( (*it).getID()==new_evid) { 00791 evidFound=true; 00792 (c.mpInWaitingV).erase(it); 00793 break; 00794 } 00795 } 00796 00797 if (!evidFound) { 00798 std::cout << "evid " << new_evid << " NOT FOUND! " << std::endl; 00799 std::cout << "Could not delete entry!" << std::endl; 00800 } 00801 } 00802 00803 private: 00804 unsigned int new_evid; 00805 }; 00806 00807 00808 00813 struct change_monitorPolicyInWaitingInsert 00814 { 00815 change_monitorPolicyInWaitingInsert (class MonitorPolicy & new_monitorPolicy): new_monitorPolicy(new_monitorPolicy){} 00816 00817 void operator() (Conduit& c) { 00818 00819 //insert into mpnWaitingV 00820 (c.mpInWaitingV).push_back(new_monitorPolicy); 00821 00822 if (c.mpInWaitingV.size()>6) { 00823 std::cout << "HEY DUDE - YOU NOW HAVE " << c.mpInWaitingV.size() 00824 << " MONITORS IN WAITING" << std::endl; 00825 std::cout << "for channel " << c.pv << " with handle " << c.handle << std::endl; 00826 } 00827 } 00828 00829 private: 00830 class MonitorPolicy new_monitorPolicy; 00831 }; 00832 00833 00834 00835 00836 00837 00838 00839 00843 struct change_pvAlias 00844 { 00845 change_pvAlias (const char * & new_pvAlias): new_pvAlias(new_pvAlias){} 00846 00847 void operator() (Conduit& c) { 00848 c.pvAlias = new_pvAlias; 00849 //No longer supporting c,pvd 00851 //strcpy(c.pvc.pvAlias, new_pvAlias); 00852 } 00853 00854 private: 00855 const char * new_pvAlias; 00856 }; 00857 00858 00859 00860 00879 struct change_status 00880 { 00881 change_status (const int & new_status): new_status(new_status){} 00882 void operator() (Conduit& c) {c.status = new_status;} 00883 00884 private: 00885 int new_status; 00886 }; 00887 00888 00889 00893 struct change_usrArgs 00894 { 00895 change_usrArgs (const unsigned int & new_usrArgs): new_usrArgs(new_usrArgs){} 00896 void operator() (Conduit& c) {c.usrArgs = (void *) (unsigned long) new_usrArgs;} // APRIL2018 - added to remove C++11 compiler warning 00897 00898 00899 private: 00900 unsigned int new_usrArgs; 00901 }; 00902 00903 00907 struct change_groupHandle 00908 { 00909 change_groupHandle (const unsigned int & new_groupHandle): new_groupHandle(new_groupHandle){} 00910 00911 void operator() (Conduit& c) {c.groupHandle = new_groupHandle;} 00912 00913 private: 00914 unsigned int new_groupHandle; 00915 }; 00916 00917 00918 00919 #endif // CONDUITFRIENDS_H