1 #include "otsdaq/FECore/FESlowControlsChannel.h"
2 #include "otsdaq/FECore/FEVInterface.h"
3 #include "otsdaq/Macros/BinaryStringMacros.h"
4 #include "otsdaq/Macros/CoutMacros.h"
13 #define __MF_SUBJECT__ "SlowControls"
14 #define mfSubject_ (interface_->getInterfaceUID() + "-" + channelName)
33 const std::string& channelNameIn,
34 const std::string& dataTypeIn,
35 const std::string& universalAddress,
36 const std::string& transformationIn,
37 unsigned int universalDataBitOffset,
40 bool monitoringEnabledIn,
41 bool recordChangesOnly,
42 time_t delayBetweenSamples,
44 const std::string& savePath,
45 const std::string& saveFileRadix,
46 bool saveBinaryFormat,
49 const std::string& lolo,
50 const std::string& lo,
51 const std::string& hi,
52 const std::string& hihi)
53 : interface_(interface)
54 , channelName(channelNameIn)
55 , fullChannelName(interface->getInterfaceUID() +
":" + channelName)
56 , dataType(dataTypeIn)
57 , transformation(transformationIn)
58 , universalDataBitOffset_(universalDataBitOffset)
59 , txPacketSequenceNumber_(0)
60 , readAccess_(readAccess)
61 , writeAccess_(writeAccess)
62 , monitoringEnabled(monitoringEnabledIn)
63 , recordChangesOnly_(recordChangesOnly)
64 , delayBetweenSamples_(delayBetweenSamples < 1
66 : delayBetweenSamples)
67 , saveEnabled_(saveEnabled)
69 , saveFileRadix_(saveFileRadix)
70 , saveBinaryFormat_(saveBinaryFormat)
71 , alarmsEnabled_(alarmsEnabled)
72 , latchAlarms_(latchAlarms)
78 , saveFullFileName_(savePath_ +
"/" + saveFileRadix_ +
"-" +
79 underscoreString(fullChannelName) +
"-" +
80 std::to_string(time(0)) + (saveBinaryFormat_ ?
".dat" :
".txt"))
82 __GEN_COUTV__(dataType);
83 __GEN_COUTV__(interface->getUniversalAddressSize());
84 __GEN_COUTV__(universalAddress);
85 __GEN_COUTV__(transformation);
87 if(interface->getUniversalAddressSize() == 0 ||
88 interface->getUniversalDataSize() == 0)
90 __GEN_SS__ <<
"The front-end interface must have a non-zero universal address "
91 "and data size. Current address size = "
92 << interface->getUniversalAddressSize()
93 <<
", data size = " << interface->getUniversalDataSize() << __E__;
109 if(dataType.size() > 1 &&
110 dataType[dataType.size() - 1] ==
'b')
115 for(
unsigned int i = 0; i < dataType.size() - 1; ++i)
116 if(dataType[i] ==
'B')
118 sscanf(&dataType[0],
"%uB", &sizeOfReadBytes_);
120 sscanf(&dataType[i],
"%u", &sizeOfDataTypeBits_);
123 else if(i == dataType.size() - 2)
124 sscanf(&dataType[0],
"%u", &sizeOfDataTypeBits_);
126 else if(dataType ==
"char" || dataType ==
"unsigned char")
127 sizeOfDataTypeBits_ =
sizeof(char) * 8;
128 else if(dataType ==
"short" || dataType ==
"unsigned short")
129 sizeOfDataTypeBits_ =
sizeof(short) * 8;
130 else if(dataType ==
"int" || dataType ==
"unsigned int")
131 sizeOfDataTypeBits_ =
sizeof(int) * 8;
132 else if(dataType ==
"long long" || dataType ==
"unsigned long long")
133 sizeOfDataTypeBits_ =
sizeof(
long long) * 8;
134 else if(dataType ==
"float")
135 sizeOfDataTypeBits_ =
sizeof(float) * 8;
136 else if(dataType ==
"double")
137 sizeOfDataTypeBits_ =
sizeof(double) * 8;
140 __GEN_SS__ <<
"ChannelDataType '" << dataType <<
"' is invalid. "
141 <<
"Valid data types (w/size in bytes) are as follows: "
143 <<
", char (" <<
sizeof(char) <<
"B), unsigned char ("
144 <<
sizeof(
unsigned char) <<
"B), short (" <<
sizeof(short)
145 <<
"B), unsigned short (" <<
sizeof(
unsigned short) <<
"B), int ("
146 <<
sizeof(int) <<
"B), unsigned int (" <<
sizeof(
unsigned int)
147 <<
"B), long long (" <<
sizeof(
long long) <<
"B), unsigned long long ("
148 <<
sizeof(
unsigned long long) <<
"B), float (" <<
sizeof(float)
149 <<
"B), double (" <<
sizeof(
double) <<
"B)." << __E__;
150 __GEN_COUT_ERR__ <<
"\n" << ss.str();
155 if(!sizeOfReadBytes_)
157 ((universalDataBitOffset_ + sizeOfDataTypeBits_) / 8 +
158 (((universalDataBitOffset_ + sizeOfDataTypeBits_) % 8) ? 1 : 0));
159 sizeOfDataTypeBytes_ =
160 ((sizeOfDataTypeBits_) / 8 + (((sizeOfDataTypeBits_) % 8) ? 1 : 0));
162 universalAddress_.resize(interface->getUniversalAddressSize());
165 convertStringToBuffer(universalAddress, universalAddress_);
167 BinaryStringMacros::binaryNumberToHexString(universalAddress_,
"0x",
" "));
169 catch(
const std::runtime_error& e)
171 __GEN_SS__ <<
"Failed to extract universalAddress '" << universalAddress <<
"'..."
177 __GEN_COUTV__(sizeOfReadBytes_);
178 __GEN_COUTV__(interface->getUniversalDataSize());
179 if(sizeOfReadBytes_ > interface->getUniversalDataSize() &&
189 std::string readValue;
190 readValue.resize(sizeOfReadBytes_);
191 interface->universalBlockRead(
192 &universalAddress_[0], &readValue[0], sizeOfReadBytes_);
194 catch(
const std::runtime_error& e)
197 if(strcmp(e.what(),
"UNDEFINED BLOCK READ") == 0)
199 __GEN_SS__ <<
"Invalid Data Type '" << dataType
200 <<
"' (offset:" << universalDataBitOffset_ <<
" + "
201 << sizeOfDataTypeBits_ <<
"-bits) = " << sizeOfReadBytes_
202 <<
"-bytes. Data Type size must be less than or equal to "
203 "Universal Data Size = "
204 << interface->getUniversalDataSize()
205 <<
"-bytes. (Or the FEInterface must implement the virtual "
206 "function universalBlockRead() for larger read sizes)"
208 __GEN_COUT_ERR__ <<
"\n" << ss.str();
212 __GEN_COUT_WARN__ <<
"Ignoring test block read error - assuming FE not "
213 "setup yet - here is the caught exception:\n"
214 << e.what() << __E__;
216 __GEN_COUT__ <<
"Block read was found to be implemented!" << __E__;
221 lolo_.resize(sizeOfDataTypeBytes_);
222 lo_.resize(sizeOfDataTypeBytes_);
223 hi_.resize(sizeOfDataTypeBytes_);
224 hihi_.resize(sizeOfDataTypeBytes_);
230 convertStringToBuffer(lolo, lolo_,
true);
232 catch(
const std::runtime_error& e)
234 __GEN_SS__ <<
"Failed to extract lolo '" << lolo <<
"'..." << __E__;
240 convertStringToBuffer(lo, lo_,
true);
242 catch(
const std::runtime_error& e)
244 __GEN_SS__ <<
"Failed to extract lo '" << lo <<
"'..." << __E__;
250 convertStringToBuffer(hi, hi_,
true);
252 catch(
const std::runtime_error& e)
254 __GEN_SS__ <<
"Failed to extract hi '" << hi <<
"'..." << __E__;
260 convertStringToBuffer(hihi, hihi_,
true);
262 catch(
const std::runtime_error& e)
264 __GEN_SS__ <<
"Failed to extract hihi '" << hihi <<
"'..." << __E__;
271 sample_.resize(sizeOfDataTypeBytes_);
272 lastSample_.resize(sizeOfDataTypeBytes_);
276 __GEN_COUT__ <<
"Constructed." << __E__;
280 FESlowControlsChannel::~FESlowControlsChannel(
void) {}
282 const std::string& FESlowControlsChannel::getInterfaceUID(
void)
const
284 return interface_->getInterfaceUID();
286 const std::string& FESlowControlsChannel::getInterfaceType(
void)
const
288 return interface_->getInterfaceType();
292 void FESlowControlsChannel::doRead(std::string& readValue)
294 if(getReadSizeBytes() > interface_->getUniversalDataSize())
297 readValue.resize(getReadSizeBytes());
298 interface_->universalBlockRead(
299 &universalAddress_[0], &readValue[0], getReadSizeBytes());
303 readValue.resize(interface_->getUniversalDataSize());
304 interface_->
universalRead(&universalAddress_[0], &readValue[0]);
309 void FESlowControlsChannel::print(std::ostream& out)
const
311 out <<
"Slow Controls Channel '" << mfSubject_ <<
"'" << __E__;
314 <<
"dataType: " << dataType << __E__;
316 <<
"sizeOfDataTypeBits_: " << sizeOfDataTypeBits_ << __E__;
318 <<
"sizeOfDataTypeBytes_: " << sizeOfDataTypeBytes_ << __E__;
320 <<
"universalDataBitOffset_: " << universalDataBitOffset_ << __E__;
322 <<
"sizeOfReadBytes_: " << sizeOfReadBytes_ << __E__;
324 <<
"universalAddress_: "
325 << BinaryStringMacros::binaryNumberToHexString(universalAddress_,
"0x",
" ")
328 <<
"transformation: " << transformation << __E__;
330 <<
"readAccess_: " << readAccess_ << __E__;
332 <<
"writeAccess_: " << writeAccess_ << __E__;
334 <<
"monitoringEnabled: " << monitoringEnabled << __E__;
336 <<
"recordChangesOnly_: " << recordChangesOnly_ << __E__;
338 <<
"delayBetweenSamples_: " << delayBetweenSamples_ << __E__;
340 <<
"saveEnabled_: " << saveEnabled_ << __E__;
342 <<
"savePath_: " << savePath_ << __E__;
344 <<
"saveFileRadix_: " << saveFileRadix_ << __E__;
346 <<
"saveBinaryFormat_: " << saveBinaryFormat_ << __E__;
348 <<
"alarmsEnabled_: " << alarmsEnabled_ << __E__;
350 <<
"latchAlarms_: " << latchAlarms_ << __E__;
352 <<
"savePath_: " << savePath_ << __E__;
354 <<
"saveFullFileName_: " << saveFullFileName_ << __E__;
364 retStr.reserve(str.size());
365 for(
unsigned int i = 0; i < str.size(); ++i)
366 if((str[i] >=
'a' && str[i] <=
'z') || (str[i] >=
'A' && str[i] <=
'Z') ||
367 (str[i] >=
'0' && str[i] <=
'9'))
368 retStr.push_back(str[i]);
370 retStr.push_back(
'_');
379 void FESlowControlsChannel::convertStringToBuffer(
const std::string& inString,
383 if(useDataType && (dataType ==
"float" || dataType ==
"double"))
385 __GEN_COUT__ <<
"Floating point spec'd" << __E__;
386 if(dataType ==
"float" && buffer.size() ==
sizeof(
float))
388 sscanf(&inString[0],
"%f", (
float*)&buffer[0]);
389 __GEN_COUT__ <<
"float: " << *((
float*)&buffer[0]) << __E__;
391 else if(dataType ==
"double" && buffer.size() ==
sizeof(double))
393 sscanf(&inString[0],
"%lf", (
double*)&buffer[0]);
394 __GEN_COUT__ <<
"double: " << *((
double*)&buffer[0]) << __E__;
398 __GEN_SS__ <<
"Invalid floating point spec! "
399 <<
"dataType=" << dataType <<
" buffer.size()=" << buffer.size()
401 __GEN_COUT_ERR__ <<
"\n" << ss.str();
407 for(
int i = (
int)buffer.size() - 1; i >= 0; --i)
408 ss << std::hex << (
int)((buffer[i] >> 4) & 0xF)
409 << (int)((buffer[i]) & 0xF) <<
" " << std::dec;
411 __GEN_COUT__ <<
"\n" << ss.str();
417 unsigned long long val;
420 __GEN_SS__ <<
"Invalid unsigned number format in string " << inString << __E__;
427 for(; i <
sizeof(
long long) && i < buffer.size(); ++i)
428 buffer[i] = ((
char*)&val)[i];
431 for(; i < buffer.size(); ++i)
434 __COUTT__ <<
"Resulting Number Buffer: "
435 << BinaryStringMacros::binaryNumberToHexString(buffer,
"0x",
" ") << __E__;
442 std::string& txBuffer,
444 bool aggregateIsBinaryFormat,
450 universalReadValue_ = universalReadValue;
469 lastSampleTime_ = time(0);
471 if(recordChangesOnly_)
473 if(lastSampleTime_ && lastSample_ == sample_)
475 __GEN_COUT__ <<
"no change." << __E__;
480 __GEN_COUT__ <<
"new value!" << __E__;
483 lastSample_ = sample_;
490 if(monitoringEnabled && txBufferUsed)
502 __GEN_COUT__ <<
"before txBuffer sz=" << txBuffer.size() << __E__;
503 txBuffer.push_back(0);
504 txBuffer.push_back(txPacketSequenceNumber_++);
506 txBuffer.resize(txBuffer.size() +
sizeof(lastSampleTime_));
507 memcpy(&txBuffer[txBuffer.size() -
sizeof(lastSampleTime_)] ,
509 sizeof(lastSampleTime_));
511 unsigned int tmpSz = fullChannelName.size();
513 txBuffer.resize(txBuffer.size() +
sizeof(tmpSz));
514 memcpy(&txBuffer[txBuffer.size() -
sizeof(tmpSz)] ,
518 txBuffer += fullChannelName;
520 txBuffer.push_back((
unsigned char)sample_.size());
521 txBuffer.push_back((
unsigned char)sizeOfDataTypeBits_);
524 __GEN_COUT__ <<
"after txBuffer sz=" << txBuffer.size() << __E__;
527 __GEN_SS__ <<
"txBuffer: \n";
528 for(
unsigned int i = 0; i < txBuffer.size(); ++i)
530 ss << std::hex << (int)((txBuffer[i] >> 4) & 0xF)
531 << (
int)((txBuffer[i]) & 0xF) <<
" " << std::dec;
536 __GEN_COUT__ <<
"\n" << ss.str();
541 if(alarmsEnabled_ && txBufferUsed)
542 alarmMask = checkAlarms(txBuffer);
545 std::string* alarmValueArray[] = {&lolo_, &lo_, &hi_, &hihi_};
553 if(aggregateIsBinaryFormat)
563 __GEN_COUT__ <<
"Aggregate Binary File Format: " <<
sizeof(lastSampleTime_)
564 <<
" " << sample_.size() << __E__;
567 fwrite(&lastSampleTime_,
568 sizeof(lastSampleTime_),
572 unsigned int tmpSz = fullChannelName.size();
573 fwrite(&tmpSz,
sizeof(tmpSz), 1, fpAggregate);
574 fwrite(&fullChannelName[0],
575 fullChannelName.size(),
579 unsigned char tmpChar = (
unsigned char)sample_.size();
580 fwrite(&tmpChar, 1, 1, fpAggregate);
582 tmpChar = (
unsigned char)sizeOfDataTypeBits_;
583 fwrite(&tmpChar, 1, 1, fpAggregate);
584 fwrite(&sample_[0], sample_.size(), 1, fpAggregate);
589 for(time_t i = 1; i < 5; ++i, alarmMask >>= 1)
594 sizeof(lastSampleTime_),
599 unsigned int tmpSz = fullChannelName.size();
601 &tmpSz,
sizeof(tmpSz), 1, fpAggregate);
602 fwrite(&fullChannelName[0],
603 fullChannelName.size(),
607 unsigned char tmpChar = (
unsigned char)sample_.size();
608 fwrite(&tmpChar, 1, 1, fpAggregate);
610 tmpChar = (
unsigned char)sizeOfDataTypeBits_;
611 fwrite(&tmpChar, 1, 1, fpAggregate);
612 fwrite(&(*alarmValueArray[i - 1])[0],
613 (*alarmValueArray[i - 1]).size(),
626 __GEN_COUT__ <<
"Aggregate Text File Format: " << dataType << __E__;
628 fprintf(fpAggregate,
"%lu\n", lastSampleTime_);
629 fprintf(fpAggregate,
"%s\n", fullChannelName.c_str());
631 if(dataType[dataType.size() - 1] ==
634 std::stringstream ss;
636 for(
unsigned int i = 0; i < sample_.size(); ++i)
637 ss << std::hex << (
int)((sample_[i] >> 4) & 0xF)
638 << (int)((sample_[i]) & 0xF) << std::dec;
639 fprintf(fpAggregate,
"%s\n", ss.str().c_str());
641 else if(dataType ==
"char")
642 fprintf(fpAggregate,
"%d\n", *((
char*)(&sample_[0])));
643 else if(dataType ==
"unsigned char")
644 fprintf(fpAggregate,
"%u\n", *((
unsigned char*)(&sample_[0])));
645 else if(dataType ==
"short")
646 fprintf(fpAggregate,
"%d\n", *((
short*)(&sample_[0])));
647 else if(dataType ==
"unsigned short")
648 fprintf(fpAggregate,
"%u\n", *((
unsigned short*)(&sample_[0])));
649 else if(dataType ==
"int")
650 fprintf(fpAggregate,
"%d\n", *((
int*)(&sample_[0])));
651 else if(dataType ==
"unsigned int")
652 fprintf(fpAggregate,
"%u\n", *((
unsigned int*)(&sample_[0])));
653 else if(dataType ==
"long long")
654 fprintf(fpAggregate,
"%lld\n", *((
long long*)(&sample_[0])));
655 else if(dataType ==
"unsigned long long")
656 fprintf(fpAggregate,
"%llu\n", *((
unsigned long long*)(&sample_[0])));
657 else if(dataType ==
"float")
658 fprintf(fpAggregate,
"%f\n", *((
float*)(&sample_[0])));
659 else if(dataType ==
"double")
660 fprintf(fpAggregate,
"%f\n", *((
double*)(&sample_[0])));
666 for(time_t i = 1; i < 5; ++i, checkMask <<= 1)
667 if(alarmMask & checkMask)
669 fprintf(fpAggregate,
"%lu\n", i);
670 fprintf(fpAggregate,
"%s\n", fullChannelName.c_str());
672 if(dataType[dataType.size() - 1] ==
675 std::stringstream ss;
677 for(
unsigned int j = 0; j < (*alarmValueArray[i - 1]).size();
680 << (
int)(((*alarmValueArray[i - 1])[j] >> 4) & 0xF)
681 << (
int)(((*alarmValueArray[i - 1])[j]) & 0xF)
683 fprintf(fpAggregate,
"%s\n", ss.str().c_str());
685 else if(dataType ==
"char")
688 *((
char*)(&(*alarmValueArray[i - 1])[0])));
689 else if(dataType ==
"unsigned char")
692 *((
unsigned char*)(&(*alarmValueArray[i - 1])[0])));
693 else if(dataType ==
"short")
696 *((
short*)(&(*alarmValueArray[i - 1])[0])));
697 else if(dataType ==
"unsigned short")
700 *((
unsigned short*)(&(*alarmValueArray[i - 1])[0])));
701 else if(dataType ==
"int")
704 *((
int*)(&(*alarmValueArray[i - 1])[0])));
705 else if(dataType ==
"unsigned int")
708 *((
unsigned int*)(&(*alarmValueArray[i - 1])[0])));
709 else if(dataType ==
"long long")
712 *((
long long*)(&(*alarmValueArray[i - 1])[0])));
713 else if(dataType ==
"unsigned long long")
717 *((
unsigned long long*)(&(*alarmValueArray[i - 1])[0])));
718 else if(dataType ==
"float")
721 *((
float*)(&(*alarmValueArray[i - 1])[0])));
722 else if(dataType ==
"double")
725 *((
double*)(&(*alarmValueArray[i - 1])[0])));
736 FILE* fp = fopen(saveFullFileName_.c_str(), saveBinaryFormat_ ?
"ab" :
"a");
739 __GEN_COUT_ERR__ <<
"Failed to open slow controls channel file: "
740 << saveFullFileName_ << __E__;
745 if(saveBinaryFormat_)
747 __GEN_COUT__ <<
"Binary File Format: " <<
sizeof(lastSampleTime_) <<
" "
748 << sample_.size() << __E__;
749 fwrite(&lastSampleTime_,
sizeof(lastSampleTime_), 1, fp);
750 fwrite(&sample_[0], sample_.size(), 1, fp);
754 for(time_t i = 1; i < 5; ++i, alarmMask >>= 1)
757 fwrite(&i,
sizeof(lastSampleTime_), 1, fp);
758 fwrite(&(*alarmValueArray[i - 1])[0],
759 (*alarmValueArray[i - 1]).size(),
766 __GEN_COUT__ <<
"Text File Format: " << dataType << __E__;
768 fprintf(fp,
"%lu\n", lastSampleTime_);
770 if(dataType[dataType.size() - 1] ==
773 std::stringstream ss;
775 for(
unsigned int i = 0; i < sample_.size(); ++i)
776 ss << std::hex << (
int)((sample_[i] >> 4) & 0xF)
777 << (int)((sample_[i]) & 0xF) << std::dec;
778 fprintf(fp,
"%s\n", ss.str().c_str());
780 else if(dataType ==
"char")
781 fprintf(fp,
"%d\n", *((
char*)(&sample_[0])));
782 else if(dataType ==
"unsigned char")
783 fprintf(fp,
"%u\n", *((
unsigned char*)(&sample_[0])));
784 else if(dataType ==
"short")
785 fprintf(fp,
"%d\n", *((
short*)(&sample_[0])));
786 else if(dataType ==
"unsigned short")
787 fprintf(fp,
"%u\n", *((
unsigned short*)(&sample_[0])));
788 else if(dataType ==
"int")
789 fprintf(fp,
"%d\n", *((
int*)(&sample_[0])));
790 else if(dataType ==
"unsigned int")
791 fprintf(fp,
"%u\n", *((
unsigned int*)(&sample_[0])));
792 else if(dataType ==
"long long")
793 fprintf(fp,
"%lld\n", *((
long long*)(&sample_[0])));
794 else if(dataType ==
"unsigned long long")
795 fprintf(fp,
"%llu\n", *((
unsigned long long*)(&sample_[0])));
796 else if(dataType ==
"float")
797 fprintf(fp,
"%f\n", *((
float*)(&sample_[0])));
798 else if(dataType ==
"double")
799 fprintf(fp,
"%f\n", *((
double*)(&sample_[0])));
805 for(time_t i = 1; i < 5; ++i, checkMask <<= 1)
806 if(alarmMask & checkMask)
808 fprintf(fp,
"%lu\n", i);
810 if(dataType[dataType.size() - 1] ==
813 std::stringstream ss;
815 for(
unsigned int j = 0; j < (*alarmValueArray[i - 1]).size();
818 << (
int)(((*alarmValueArray[i - 1])[j] >> 4) & 0xF)
819 << (
int)(((*alarmValueArray[i - 1])[j]) & 0xF)
821 fprintf(fp,
"%s\n", ss.str().c_str());
823 else if(dataType ==
"char")
825 fp,
"%d\n", *((
char*)(&(*alarmValueArray[i - 1])[0])));
826 else if(dataType ==
"unsigned char")
829 *((
unsigned char*)(&(*alarmValueArray[i - 1])[0])));
830 else if(dataType ==
"short")
832 fp,
"%d\n", *((
short*)(&(*alarmValueArray[i - 1])[0])));
833 else if(dataType ==
"unsigned short")
836 *((
unsigned short*)(&(*alarmValueArray[i - 1])[0])));
837 else if(dataType ==
"int")
838 fprintf(fp,
"%d\n", *((
int*)(&(*alarmValueArray[i - 1])[0])));
839 else if(dataType ==
"unsigned int")
842 *((
unsigned int*)(&(*alarmValueArray[i - 1])[0])));
843 else if(dataType ==
"long long")
846 *((
long long*)(&(*alarmValueArray[i - 1])[0])));
847 else if(dataType ==
"unsigned long long")
851 *((
unsigned long long*)(&(*alarmValueArray[i - 1])[0])));
852 else if(dataType ==
"float")
854 fp,
"%f\n", *((
float*)(&(*alarmValueArray[i - 1])[0])));
855 else if(dataType ==
"double")
857 fp,
"%f\n", *((
double*)(&(*alarmValueArray[i - 1])[0])));
870 void FESlowControlsChannel::extractSample()
872 const std::string& universalReadValue = universalReadValue_;
875 __GEN_SS__ <<
"Universal Read: ";
876 for(
unsigned int i = 0; i < universalReadValue.size(); ++i)
877 ss << std::hex << (
int)((universalReadValue[i] >> 4) & 0xF)
878 << (int)((universalReadValue[i]) & 0xF) <<
" " << std::dec;
880 __GEN_COUT__ <<
"\n" << ss.str();
881 __GEN_COUT__ <<
"Universal Read: "
882 << BinaryStringMacros::binaryNumberToHexString(
883 universalReadValue,
"0x",
" ")
884 <<
" at t=" << time(0) << __E__;
889 universalReadValue, sample_, sizeOfDataTypeBits_, universalDataBitOffset_);
891 __GEN_COUT__ <<
"Sample: "
892 << BinaryStringMacros::binaryNumberToHexString(sample_,
"0x",
" ")
893 <<
", from address: "
894 << BinaryStringMacros::binaryNumberToHexString(
895 universalAddress_,
"0x",
" ")
896 <<
", sample size in bytes: " << sample_.size()
897 <<
", in bits: " << sizeOfDataTypeBits_
898 <<
", at bit-offset: " << universalDataBitOffset_ << __E__;
908 if(targetAlarm == -1 || targetAlarm == 0)
909 loloAlarmed_ =
false;
910 if(targetAlarm == -1 || targetAlarm == 1)
912 if(targetAlarm == -1 || targetAlarm == 2)
914 if(targetAlarm == -1 || targetAlarm == 3)
915 hihiAlarmed_ =
false;
923 char FESlowControlsChannel::checkAlarms(std::string& txBuffer)
937 char createPacketMask = 0;
939 if(dataType[dataType.size() - 1] ==
'b')
941 else if(dataType ==
"char")
943 else if(dataType ==
"unsigned char")
945 else if(dataType ==
"short")
947 else if(dataType ==
"unsigned short")
949 else if(dataType ==
"int")
951 else if(dataType ==
"unsigned int")
953 else if(dataType ==
"long long")
955 else if(dataType ==
"unsigned long long")
957 else if(dataType ==
"float")
959 else if(dataType ==
"double")
964 __GEN_COUT__ <<
"Using unsigned long long for alarms." << __E__;
966 if((!loloAlarmed_ || !latchAlarms_) &&
967 *((
unsigned long long*)&sample_[0]) <= *((
unsigned long long*)&lolo_[0]))
970 createPacketMask |= 1 << 0;
973 if((!loAlarmed_ || !latchAlarms_) &&
974 *((
unsigned long long*)&sample_[0]) <= *((
unsigned long long*)&lo_[0]))
977 createPacketMask |= 1 << 1;
980 if((!hiAlarmed_ || !latchAlarms_) &&
981 *((
unsigned long long*)&sample_[0]) >= *((
unsigned long long*)&hi_[0]))
984 createPacketMask |= 1 << 2;
987 if((!hihiAlarmed_ || !latchAlarms_) &&
988 *((
unsigned long long*)&sample_[0]) >= *((
unsigned long long*)&hihi_[0]))
991 createPacketMask |= 1 << 3;
994 else if(useType == 1)
996 __GEN_COUT__ <<
"Using long long for alarms." << __E__;
998 if((!loloAlarmed_ || !latchAlarms_) &&
999 *((
long long*)&sample_[0]) <= *((
long long*)&lolo_[0]))
1001 loloAlarmed_ =
true;
1002 createPacketMask |= 1 << 0;
1005 if((!loAlarmed_ || !latchAlarms_) &&
1006 *((
long long*)&sample_[0]) <= *((
long long*)&lo_[0]))
1009 createPacketMask |= 1 << 1;
1012 if((!hiAlarmed_ || !latchAlarms_) &&
1013 *((
long long*)&sample_[0]) >= *((
long long*)&hi_[0]))
1016 createPacketMask |= 1 << 2;
1019 if((!hihiAlarmed_ || !latchAlarms_) &&
1020 *((
long long*)&sample_[0]) >= *((
long long*)&hihi_[0]))
1022 hihiAlarmed_ =
true;
1023 createPacketMask |= 1 << 3;
1026 else if(useType == 2)
1028 __GEN_COUT__ <<
"Using float for alarms." << __E__;
1030 if((!loloAlarmed_ || !latchAlarms_) &&
1031 *((
float*)&sample_[0]) <= *((
float*)&lolo_[0]))
1033 loloAlarmed_ =
true;
1034 createPacketMask |= 1 << 0;
1037 if((!loAlarmed_ || !latchAlarms_) && *((
float*)&sample_[0]) <= *((
float*)&lo_[0]))
1040 createPacketMask |= 1 << 1;
1043 if((!hiAlarmed_ || !latchAlarms_) && *((
float*)&sample_[0]) >= *((
float*)&hi_[0]))
1046 createPacketMask |= 1 << 2;
1049 if((!hihiAlarmed_ || !latchAlarms_) &&
1050 *((
float*)&sample_[0]) >= *((
float*)&hihi_[0]))
1052 hihiAlarmed_ =
true;
1053 createPacketMask |= 1 << 3;
1056 else if(useType == 3)
1058 __GEN_COUT__ <<
"Using double for alarms." << __E__;
1060 if((!loloAlarmed_ || !latchAlarms_) &&
1061 *((
double*)&sample_[0]) <= *((
double*)&lolo_[0]))
1063 loloAlarmed_ =
true;
1064 createPacketMask |= 1 << 0;
1067 if((!loAlarmed_ || !latchAlarms_) &&
1068 *((
double*)&sample_[0]) <= *((
double*)&lo_[0]))
1071 createPacketMask |= 1 << 1;
1074 if((!hiAlarmed_ || !latchAlarms_) &&
1075 *((
double*)&sample_[0]) >= *((
double*)&hi_[0]))
1078 createPacketMask |= 1 << 2;
1081 if((!hihiAlarmed_ || !latchAlarms_) &&
1082 *((
double*)&sample_[0]) >= *((
double*)&hihi_[0]))
1084 hihiAlarmed_ =
true;
1085 createPacketMask |= 1 << 3;
1090 std::string* alarmValueArray[] = {&lolo_, &lo_, &hi_, &hihi_};
1092 if(monitoringEnabled)
1096 for(
int i = 0; i < 4; ++i, checkMask <<= 1)
1097 if(createPacketMask & checkMask)
1110 __GEN_COUT__ <<
"Create packet type " << i + 1
1111 <<
" alarm value = " << *alarmValueArray[i] << __E__;
1113 __GEN_COUT__ <<
"before txBuffer sz=" << txBuffer.size() << __E__;
1114 txBuffer.push_back(i + 1);
1116 txPacketSequenceNumber_++);
1118 txBuffer.resize(txBuffer.size() +
sizeof(lastSampleTime_));
1119 memcpy(&txBuffer[txBuffer.size() -
sizeof(lastSampleTime_)] ,
1121 sizeof(lastSampleTime_));
1123 unsigned int tmpSz = fullChannelName.size();
1125 txBuffer.resize(txBuffer.size() +
sizeof(tmpSz));
1126 memcpy(&txBuffer[txBuffer.size() -
sizeof(tmpSz)] ,
1130 txBuffer += fullChannelName;
1133 (
unsigned char)(*alarmValueArray[i]).size());
1134 txBuffer.push_back((
unsigned char)sizeOfDataTypeBits_);
1136 txBuffer += (*alarmValueArray[i]);
1137 __GEN_COUT__ <<
"after txBuffer sz=" << txBuffer.size() << __E__;
1140 __GEN_SS__ <<
"txBuffer: \n";
1141 for(
unsigned int i = 0; i < txBuffer.size(); ++i)
1143 ss << std::hex << (int)((txBuffer[i] >> 4) & 0xF)
1144 << (
int)((txBuffer[i]) & 0xF) <<
" " << std::dec;
1149 __GEN_COUT__ <<
"\n" << ss.str();
1154 return createPacketMask;
void handleSample(const std::string &universalReadValue, std::string &txBuffer, FILE *fpAggregate=0, bool aggregateIsBinaryFormat=false, bool txBufferUsed=true)
FESlowControlsChannel(FEVInterface *interface, const std::string &channelName, const std::string &dataType, const std::string &universalAddress, const std::string &transformation, unsigned int universalDataBitOffset, bool readAccess, bool writeAccess, bool monitoringEnabled, bool recordChangesOnly, time_t delayBetweenSamples, bool saveEnabled, const std::string &savePath, const std::string &saveFileRadix, bool saveBinaryFormat, bool alarmsEnabled, bool latchAlarms, const std::string &lolo, const std::string &lo, const std::string &hi, const std::string &hihi)
static std::string underscoreString(const std::string &str)
void clearAlarms(int targetAlarm=-1)
default to all
bool universalBlockReadImplementationConfirmed
is confirmed by slow controls handling (for example) that universalBlockRead is implemented by the FE...
virtual void universalRead(char *address, char *returnValue)=0
throw std::runtime_error exception on error/timeout
static void extractValueFromBinaryString(const std::string &binaryBuffer, T &value, unsigned int bitIndex=0)
static std::string demangleTypeName(const char *name)
static bool getNumber(const std::string &s, T &retValue)