1 #include "otsdaq/FECore/FESlowControlsChannel.h"
2 #include "otsdaq/Macros/BinaryStringMacros.h"
3 #include "otsdaq/Macros/CoutMacros.h"
12 #define __MF_SUBJECT__ (interfaceUID_ + "-" + channelName_)
30 FESlowControlsChannel::FESlowControlsChannel(
const std::string& interfaceUID,
31 const std::string& channelName,
32 const std::string& dataType,
33 unsigned int universalDataSize,
34 unsigned int universalAddressSize,
35 const std::string& universalAddress,
36 unsigned int universalDataBitOffset,
39 bool monitoringEnabled,
40 bool recordChangesOnly,
41 time_t delayBetweenSamples,
43 const std::string& savePath,
44 const std::string& saveFileRadix,
45 bool saveBinaryFormat,
48 const std::string& lolo,
49 const std::string& lo,
50 const std::string& hi,
51 const std::string& hihi)
52 : interfaceUID_(interfaceUID)
53 , channelName_(channelName)
54 , fullChannelName_(interfaceUID_ +
"/" + channelName_)
56 , universalDataBitOffset_(universalDataBitOffset)
57 , txPacketSequenceNumber_(0)
58 , readAccess_(readAccess)
59 , writeAccess_(writeAccess)
60 , monitoringEnabled_(monitoringEnabled)
61 , recordChangesOnly_(recordChangesOnly)
62 , delayBetweenSamples_(delayBetweenSamples < 1
64 : delayBetweenSamples)
65 , saveEnabled_(saveEnabled)
67 , saveFileRadix_(saveFileRadix)
68 , saveBinaryFormat_(saveBinaryFormat)
69 , alarmsEnabled_(alarmsEnabled)
70 , latchAlarms_(latchAlarms)
76 , saveFullFileName_(savePath_ +
"/" + saveFileRadix_ +
"-" +
77 underscoreString(fullChannelName_) +
"-" +
78 std::to_string(time(0)) + (saveBinaryFormat_ ?
".dat" :
".txt"))
81 __COUT__ <<
"universalAddressSize = " << universalAddressSize << __E__;
82 __COUT__ <<
"universalAddress = " << universalAddress << __E__;
94 if(dataType_[dataType_.size() - 1] ==
'b')
95 sscanf(&dataType_[0],
"%u", &sizeOfDataTypeBits_);
96 else if(dataType_ ==
"char" || dataType_ ==
"unsigned char")
97 sizeOfDataTypeBits_ =
sizeof(char) * 8;
98 else if(dataType_ ==
"short" || dataType_ ==
"unsigned short")
99 sizeOfDataTypeBits_ =
sizeof(short) * 8;
100 else if(dataType_ ==
"int" || dataType_ ==
"unsigned int")
101 sizeOfDataTypeBits_ =
sizeof(int) * 8;
102 else if(dataType_ ==
"long long" || dataType_ ==
"unsigned long long")
103 sizeOfDataTypeBits_ =
sizeof(
long long) * 8;
104 else if(dataType_ ==
"float")
105 sizeOfDataTypeBits_ =
sizeof(float) * 8;
106 else if(dataType_ ==
"double")
107 sizeOfDataTypeBits_ =
sizeof(double) * 8;
110 __SS__ <<
"ChannelDataType '" << dataType_ <<
"' is invalid. "
111 <<
"Valid data types (w/size in bytes) are as follows: "
113 <<
", char (" <<
sizeof(char) <<
"B), unsigned char ("
114 <<
sizeof(
unsigned char) <<
"B), short (" <<
sizeof(short)
115 <<
"B), unsigned short (" <<
sizeof(
unsigned short) <<
"B), int ("
116 <<
sizeof(int) <<
"B), unsigned int (" <<
sizeof(
unsigned int)
117 <<
"B), long long (" <<
sizeof(
long long) <<
"B), unsigned long long ("
118 <<
sizeof(
unsigned long long) <<
"B), float (" <<
sizeof(float)
119 <<
"B), double (" <<
sizeof(
double) <<
"B)." << __E__;
120 __COUT_ERR__ <<
"\n" << ss.str();
124 if(sizeOfDataTypeBits_ > 64)
126 __SS__ <<
"Invalid Data Type '" << dataType_ <<
"' (" << sizeOfDataTypeBits_
128 ". Size in bits must be less than or equal to 64-bits."
130 __COUT_ERR__ <<
"\n" << ss.str();
134 if(universalDataSize * 8 < sizeOfDataTypeBits_)
137 <<
"Invalid Data Type '" << dataType_ <<
"' (" << sizeOfDataTypeBits_
138 <<
"-bits) or Universal Data Size of " << universalDataSize * 8
139 <<
"-bits. Data Type size must be less than or equal to Universal Data Size."
141 __COUT_ERR__ <<
"\n" << ss.str();
145 universalAddress_.resize(universalAddressSize);
148 convertStringToBuffer(universalAddress, universalAddress_);
150 catch(
const std::runtime_error& e)
152 __SS__ <<
"Failed to extract universalAddress '" << universalAddress <<
"'..."
158 sizeOfDataTypeBytes_ =
159 (sizeOfDataTypeBits_ / 8 + ((universalDataBitOffset_ % 8) ? 1 : 0));
161 lolo_.resize(sizeOfDataTypeBytes_);
162 lo_.resize(sizeOfDataTypeBytes_);
163 hi_.resize(sizeOfDataTypeBytes_);
164 hihi_.resize(sizeOfDataTypeBytes_);
170 convertStringToBuffer(lolo, lolo_,
true);
172 catch(
const std::runtime_error& e)
174 __SS__ <<
"Failed to extract lolo '" << lolo <<
"'..." << __E__;
180 convertStringToBuffer(lo, lo_,
true);
182 catch(
const std::runtime_error& e)
184 __SS__ <<
"Failed to extract lo '" << lo <<
"'..." << __E__;
190 convertStringToBuffer(hi, hi_,
true);
192 catch(
const std::runtime_error& e)
194 __SS__ <<
"Failed to extract hi '" << hi <<
"'..." << __E__;
200 convertStringToBuffer(hihi, hihi_,
true);
202 catch(
const std::runtime_error& e)
204 __SS__ <<
"Failed to extract hihi '" << hihi <<
"'..." << __E__;
211 sample_.resize(sizeOfDataTypeBytes_);
212 lastSample_.resize(sizeOfDataTypeBytes_);
216 __COUT__ <<
"Constructed." << __E__;
220 FESlowControlsChannel::~FESlowControlsChannel(
void) {}
223 void FESlowControlsChannel::print(std::ostream& out)
const
225 out <<
"Slow Controls Channel for Interface '" << interfaceUID_
226 <<
"': " << channelName_ << __E__;
229 <<
"dataType_: " << dataType_ << __E__;
231 <<
"sizeOfDataTypeBits_: " << sizeOfDataTypeBits_ << __E__;
233 <<
"universalAddress_: "
234 << BinaryStringMacros::binaryNumberToHexString(universalAddress_,
"0x",
" ")
237 <<
"universalDataBitOffset_: " << universalDataBitOffset_ << __E__;
239 <<
"readAccess_: " << readAccess_ << __E__;
241 <<
"writeAccess_: " << writeAccess_ << __E__;
243 <<
"monitoringEnabled_: " << monitoringEnabled_ << __E__;
245 <<
"recordChangesOnly_: " << recordChangesOnly_ << __E__;
247 <<
"delayBetweenSamples_: " << delayBetweenSamples_ << __E__;
249 <<
"saveEnabled_: " << saveEnabled_ << __E__;
251 <<
"savePath_: " << savePath_ << __E__;
253 <<
"saveFileRadix_: " << saveFileRadix_ << __E__;
255 <<
"saveBinaryFormat_: " << saveBinaryFormat_ << __E__;
257 <<
"alarmsEnabled_: " << alarmsEnabled_ << __E__;
259 <<
"latchAlarms_: " << latchAlarms_ << __E__;
261 <<
"savePath_: " << savePath_ << __E__;
263 <<
"saveFullFileName_: " << saveFullFileName_ << __E__;
270 std::string FESlowControlsChannel::underscoreString(
const std::string& str)
273 retStr.reserve(str.size());
274 for(
unsigned int i = 0; i < str.size(); ++i)
275 if((str[i] >=
'a' && str[i] <=
'z') || (str[i] >=
'A' && str[i] <=
'Z') ||
276 (str[i] >=
'0' && str[i] <=
'9'))
277 retStr.push_back(str[i]);
279 retStr.push_back(
'_');
288 void FESlowControlsChannel::convertStringToBuffer(
const std::string& inString,
292 __COUT__ <<
"Input Str Sz= \t" << inString.size() << __E__;
293 __COUT__ <<
"Input Str Val= \t'" << inString <<
"'" << __E__;
294 __COUT__ <<
"Output buffer Sz= \t" << buffer.size() << __E__;
296 if(useDataType && (dataType_ ==
"float" || dataType_ ==
"double"))
298 __COUT__ <<
"Floating point spec'd" << __E__;
299 if(dataType_ ==
"float" && buffer.size() ==
sizeof(float))
301 sscanf(&inString[0],
"%f", (
float*)&buffer[0]);
302 __COUT__ <<
"float: " << *((
float*)&buffer[0]) << __E__;
304 else if(dataType_ ==
"double" && buffer.size() ==
sizeof(double))
306 sscanf(&inString[0],
"%lf", (
double*)&buffer[0]);
307 __COUT__ <<
"double: " << *((
double*)&buffer[0]) << __E__;
311 __SS__ <<
"Invalid floating point spec! "
312 <<
"dataType_=" << dataType_ <<
" buffer.size()=" << buffer.size()
314 __COUT_ERR__ <<
"\n" << ss.str();
320 for(
int i = (
int)buffer.size() - 1; i >= 0; --i)
321 ss << std::hex << (
int)((buffer[i] >> 4) & 0xF)
322 << (int)((buffer[i]) & 0xF) <<
" " << std::dec;
324 __COUT__ <<
"\n" << ss.str();
330 unsigned long long val;
331 if(!StringMacros::getNumber(inString, val))
333 __SS__ <<
"Invalid unsigned number format in string " << inString << __E__;
340 for(; i <
sizeof(
long long) && i < buffer.size(); ++i)
341 buffer[i] = ((
char*)&val)[i];
344 for(; i < buffer.size(); ++i)
347 __COUT__ <<
"Resulting Number Buffer: "
348 << BinaryStringMacros::binaryNumberToHexString(buffer,
"0x",
" ") << __E__;
352 for(
unsigned int i = 0; i < buffer.size(); ++i)
366 if(inString.size() > 2 && inString[0] ==
'0' && inString[1] ==
'x')
370 __COUT__ <<
"Hex." << __E__;
374 for(
unsigned int i = 0; i < inString.size(); ++i)
376 j = (inString.size() - 1 - i);
377 if(inString[i] >=
'0' && inString[i] <=
'9')
378 val = inString[i] - 48;
379 else if(inString[i] >=
'A' && inString[i] <=
'F')
380 val = inString[i] - 55;
381 else if(inString[i] >=
'a' && inString[i] <=
'f')
382 val = inString[i] - 87;
386 buffer[j / 2] |= val << ((j % 2) * 4);
393 __COUT__ <<
"Decimal." << __E__;
394 unsigned long long val;
396 if(!useDataType || dataType_[0] ==
'u')
398 sscanf(&inString[0],
"%llu", &val);
402 sscanf(&inString[0],
"%lld", (
long long*)&val);
405 for(
unsigned int i = 0; i <
sizeof(
long long) && i < buffer.size(); ++i)
406 buffer[i] = ((
char*)&val)[i];
413 for(
int i = (
int)buffer.size() - 1; i >= 0; --i)
414 ss << std::hex << (
int)((buffer[i] >> 4) & 0xF) << (int)((buffer[i]) & 0xF)
417 __COUT__ <<
"\n" << ss.str();
424 void FESlowControlsChannel::handleSample(
const std::string& universalReadValue,
425 std::string& txBuffer,
427 bool aggregateIsBinaryFormat)
429 __COUT__ <<
"txBuffer size=" << txBuffer.size() << __E__;
433 extractSample(universalReadValue);
450 if(recordChangesOnly_)
452 if(lastSampleTime_ && lastSample_ == sample_)
454 __COUT__ <<
"no change." << __E__;
459 __COUT__ <<
"new value!" << __E__;
462 lastSampleTime_ = time(0);
463 lastSample_ = sample_;
470 if(monitoringEnabled_)
482 __COUT__ <<
"before txBuffer sz=" << txBuffer.size() << __E__;
483 txBuffer.push_back(0);
484 txBuffer.push_back(txPacketSequenceNumber_++);
486 txBuffer.resize(txBuffer.size() +
sizeof(lastSampleTime_));
487 memcpy(&txBuffer[txBuffer.size() -
sizeof(lastSampleTime_)] ,
489 sizeof(lastSampleTime_));
491 unsigned int tmpSz = fullChannelName_.size();
493 txBuffer.resize(txBuffer.size() +
sizeof(tmpSz));
494 memcpy(&txBuffer[txBuffer.size() -
sizeof(tmpSz)] ,
498 txBuffer += fullChannelName_;
500 txBuffer.push_back((
unsigned char)sample_.size());
501 txBuffer.push_back((
unsigned char)sizeOfDataTypeBits_);
504 __COUT__ <<
"after txBuffer sz=" << txBuffer.size() << __E__;
507 __SS__ <<
"txBuffer: \n";
508 for(
unsigned int i = 0; i < txBuffer.size(); ++i)
510 ss << std::hex << (int)((txBuffer[i] >> 4) & 0xF)
511 << (int)((txBuffer[i]) & 0xF) <<
" " << std::dec;
516 __COUT__ <<
"\n" << ss.str();
522 alarmMask = checkAlarms(txBuffer);
525 std::string* alarmValueArray[] = {&lolo_, &lo_, &hi_, &hihi_};
533 if(aggregateIsBinaryFormat)
543 __COUT__ <<
"Aggregate Binary File Format: " <<
sizeof(lastSampleTime_) <<
" "
544 << sample_.size() << __E__;
547 fwrite(&lastSampleTime_,
548 sizeof(lastSampleTime_),
552 unsigned int tmpSz = fullChannelName_.size();
553 fwrite(&tmpSz,
sizeof(tmpSz), 1, fpAggregate);
554 fwrite(&fullChannelName_[0],
555 fullChannelName_.size(),
559 unsigned char tmpChar = (
unsigned char)sample_.size();
560 fwrite(&tmpChar, 1, 1, fpAggregate);
562 tmpChar = (
unsigned char)sizeOfDataTypeBits_;
563 fwrite(&tmpChar, 1, 1, fpAggregate);
564 fwrite(&sample_[0], sample_.size(), 1, fpAggregate);
569 for(time_t i = 1; i < 5; ++i, alarmMask >>= 1)
574 sizeof(lastSampleTime_),
579 unsigned int tmpSz = fullChannelName_.size();
581 &tmpSz,
sizeof(tmpSz), 1, fpAggregate);
582 fwrite(&fullChannelName_[0],
583 fullChannelName_.size(),
587 unsigned char tmpChar = (
unsigned char)sample_.size();
588 fwrite(&tmpChar, 1, 1, fpAggregate);
590 tmpChar = (
unsigned char)sizeOfDataTypeBits_;
591 fwrite(&tmpChar, 1, 1, fpAggregate);
592 fwrite(&(*alarmValueArray[i - 1])[0],
593 (*alarmValueArray[i - 1]).size(),
606 __COUT__ <<
"Aggregate Text File Format: " << dataType_ << __E__;
608 fprintf(fpAggregate,
"%lu\n", lastSampleTime_);
609 fprintf(fpAggregate,
"%s\n", fullChannelName_.c_str());
611 if(dataType_[dataType_.size() - 1] ==
614 std::stringstream ss;
616 for(
unsigned int i = 0; i < sample_.size(); ++i)
617 ss << std::hex << (
int)((sample_[i] >> 4) & 0xF)
618 << (int)((sample_[i]) & 0xF) << std::dec;
619 fprintf(fpAggregate,
"%s\n", ss.str().c_str());
621 else if(dataType_ ==
"char")
622 fprintf(fpAggregate,
"%d\n", *((
char*)(&sample_[0])));
623 else if(dataType_ ==
"unsigned char")
624 fprintf(fpAggregate,
"%u\n", *((
unsigned char*)(&sample_[0])));
625 else if(dataType_ ==
"short")
626 fprintf(fpAggregate,
"%d\n", *((
short*)(&sample_[0])));
627 else if(dataType_ ==
"unsigned short")
628 fprintf(fpAggregate,
"%u\n", *((
unsigned short*)(&sample_[0])));
629 else if(dataType_ ==
"int")
630 fprintf(fpAggregate,
"%d\n", *((
int*)(&sample_[0])));
631 else if(dataType_ ==
"unsigned int")
632 fprintf(fpAggregate,
"%u\n", *((
unsigned int*)(&sample_[0])));
633 else if(dataType_ ==
"long long")
634 fprintf(fpAggregate,
"%lld\n", *((
long long*)(&sample_[0])));
635 else if(dataType_ ==
"unsigned long long")
636 fprintf(fpAggregate,
"%llu\n", *((
unsigned long long*)(&sample_[0])));
637 else if(dataType_ ==
"float")
638 fprintf(fpAggregate,
"%f\n", *((
float*)(&sample_[0])));
639 else if(dataType_ ==
"double")
640 fprintf(fpAggregate,
"%f\n", *((
double*)(&sample_[0])));
646 for(time_t i = 1; i < 5; ++i, checkMask <<= 1)
647 if(alarmMask & checkMask)
649 fprintf(fpAggregate,
"%lu\n", i);
650 fprintf(fpAggregate,
"%s\n", fullChannelName_.c_str());
652 if(dataType_[dataType_.size() - 1] ==
655 std::stringstream ss;
657 for(
unsigned int j = 0; j < (*alarmValueArray[i - 1]).size();
660 << (
int)(((*alarmValueArray[i - 1])[j] >> 4) & 0xF)
661 << (
int)(((*alarmValueArray[i - 1])[j]) & 0xF)
663 fprintf(fpAggregate,
"%s\n", ss.str().c_str());
665 else if(dataType_ ==
"char")
668 *((
char*)(&(*alarmValueArray[i - 1])[0])));
669 else if(dataType_ ==
"unsigned char")
672 *((
unsigned char*)(&(*alarmValueArray[i - 1])[0])));
673 else if(dataType_ ==
"short")
676 *((
short*)(&(*alarmValueArray[i - 1])[0])));
677 else if(dataType_ ==
"unsigned short")
680 *((
unsigned short*)(&(*alarmValueArray[i - 1])[0])));
681 else if(dataType_ ==
"int")
684 *((
int*)(&(*alarmValueArray[i - 1])[0])));
685 else if(dataType_ ==
"unsigned int")
688 *((
unsigned int*)(&(*alarmValueArray[i - 1])[0])));
689 else if(dataType_ ==
"long long")
692 *((
long long*)(&(*alarmValueArray[i - 1])[0])));
693 else if(dataType_ ==
"unsigned long long")
697 *((
unsigned long long*)(&(*alarmValueArray[i - 1])[0])));
698 else if(dataType_ ==
"float")
701 *((
float*)(&(*alarmValueArray[i - 1])[0])));
702 else if(dataType_ ==
"double")
705 *((
double*)(&(*alarmValueArray[i - 1])[0])));
716 FILE* fp = fopen(saveFullFileName_.c_str(), saveBinaryFormat_ ?
"ab" :
"a");
719 __COUT_ERR__ <<
"Failed to open slow controls channel file: "
720 << saveFullFileName_ << __E__;
725 if(saveBinaryFormat_)
727 __COUT__ <<
"Binary File Format: " <<
sizeof(lastSampleTime_) <<
" "
728 << sample_.size() << __E__;
729 fwrite(&lastSampleTime_,
sizeof(lastSampleTime_), 1, fp);
730 fwrite(&sample_[0], sample_.size(), 1, fp);
734 for(time_t i = 1; i < 5; ++i, alarmMask >>= 1)
737 fwrite(&i,
sizeof(lastSampleTime_), 1, fp);
738 fwrite(&(*alarmValueArray[i - 1])[0],
739 (*alarmValueArray[i - 1]).size(),
746 __COUT__ <<
"Text File Format: " << dataType_ << __E__;
748 fprintf(fp,
"%lu\n", lastSampleTime_);
750 if(dataType_[dataType_.size() - 1] ==
753 std::stringstream ss;
755 for(
unsigned int i = 0; i < sample_.size(); ++i)
756 ss << std::hex << (
int)((sample_[i] >> 4) & 0xF)
757 << (int)((sample_[i]) & 0xF) << std::dec;
758 fprintf(fp,
"%s\n", ss.str().c_str());
760 else if(dataType_ ==
"char")
761 fprintf(fp,
"%d\n", *((
char*)(&sample_[0])));
762 else if(dataType_ ==
"unsigned char")
763 fprintf(fp,
"%u\n", *((
unsigned char*)(&sample_[0])));
764 else if(dataType_ ==
"short")
765 fprintf(fp,
"%d\n", *((
short*)(&sample_[0])));
766 else if(dataType_ ==
"unsigned short")
767 fprintf(fp,
"%u\n", *((
unsigned short*)(&sample_[0])));
768 else if(dataType_ ==
"int")
769 fprintf(fp,
"%d\n", *((
int*)(&sample_[0])));
770 else if(dataType_ ==
"unsigned int")
771 fprintf(fp,
"%u\n", *((
unsigned int*)(&sample_[0])));
772 else if(dataType_ ==
"long long")
773 fprintf(fp,
"%lld\n", *((
long long*)(&sample_[0])));
774 else if(dataType_ ==
"unsigned long long")
775 fprintf(fp,
"%llu\n", *((
unsigned long long*)(&sample_[0])));
776 else if(dataType_ ==
"float")
777 fprintf(fp,
"%f\n", *((
float*)(&sample_[0])));
778 else if(dataType_ ==
"double")
779 fprintf(fp,
"%f\n", *((
double*)(&sample_[0])));
785 for(time_t i = 1; i < 5; ++i, checkMask <<= 1)
786 if(alarmMask & checkMask)
788 fprintf(fp,
"%lu\n", i);
790 if(dataType_[dataType_.size() - 1] ==
793 std::stringstream ss;
795 for(
unsigned int j = 0; j < (*alarmValueArray[i - 1]).size();
798 << (
int)(((*alarmValueArray[i - 1])[j] >> 4) & 0xF)
799 << (
int)(((*alarmValueArray[i - 1])[j]) & 0xF)
801 fprintf(fp,
"%s\n", ss.str().c_str());
803 else if(dataType_ ==
"char")
805 fp,
"%d\n", *((
char*)(&(*alarmValueArray[i - 1])[0])));
806 else if(dataType_ ==
"unsigned char")
809 *((
unsigned char*)(&(*alarmValueArray[i - 1])[0])));
810 else if(dataType_ ==
"short")
812 fp,
"%d\n", *((
short*)(&(*alarmValueArray[i - 1])[0])));
813 else if(dataType_ ==
"unsigned short")
816 *((
unsigned short*)(&(*alarmValueArray[i - 1])[0])));
817 else if(dataType_ ==
"int")
818 fprintf(fp,
"%d\n", *((
int*)(&(*alarmValueArray[i - 1])[0])));
819 else if(dataType_ ==
"unsigned int")
822 *((
unsigned int*)(&(*alarmValueArray[i - 1])[0])));
823 else if(dataType_ ==
"long long")
826 *((
long long*)(&(*alarmValueArray[i - 1])[0])));
827 else if(dataType_ ==
"unsigned long long")
831 *((
unsigned long long*)(&(*alarmValueArray[i - 1])[0])));
832 else if(dataType_ ==
"float")
834 fp,
"%f\n", *((
float*)(&(*alarmValueArray[i - 1])[0])));
835 else if(dataType_ ==
"double")
837 fp,
"%f\n", *((
double*)(&(*alarmValueArray[i - 1])[0])));
850 void FESlowControlsChannel::extractSample(
const std::string& universalReadValue)
855 __SS__ <<
"Universal Read: ";
856 for(
unsigned int i = 0; i < universalReadValue.size(); ++i)
857 ss << std::hex << (
int)((universalReadValue[i] >> 4) & 0xF)
858 << (int)((universalReadValue[i]) & 0xF) <<
" " << std::dec;
860 __COUT__ <<
"\n" << ss.str();
861 __COUT__ <<
"Universal Read: "
862 << BinaryStringMacros::binaryNumberToHexString(
863 universalReadValue,
"0x",
" ")
868 BinaryStringMacros::extractValueFromBinaryString(
869 universalReadValue, sample_, sizeOfDataTypeBits_);
871 __COUT__ <<
"Sample size in bytes: " << sample_.size()
872 <<
"\t in bits: " << sizeOfDataTypeBits_ << __E__;
874 __COUT__ <<
"sample: "
875 << BinaryStringMacros::binaryNumberToHexString(sample_,
"0x",
" ") << __E__;
883 void FESlowControlsChannel::clearAlarms(
int targetAlarm)
885 if(targetAlarm == -1 || targetAlarm == 0)
886 loloAlarmed_ =
false;
887 if(targetAlarm == -1 || targetAlarm == 1)
889 if(targetAlarm == -1 || targetAlarm == 2)
891 if(targetAlarm == -1 || targetAlarm == 3)
892 hihiAlarmed_ =
false;
900 char FESlowControlsChannel::checkAlarms(std::string& txBuffer)
914 char createPacketMask = 0;
916 if(dataType_[dataType_.size() - 1] ==
'b')
918 else if(dataType_ ==
"char")
920 else if(dataType_ ==
"unsigned char")
922 else if(dataType_ ==
"short")
924 else if(dataType_ ==
"unsigned short")
926 else if(dataType_ ==
"int")
928 else if(dataType_ ==
"unsigned int")
930 else if(dataType_ ==
"long long")
932 else if(dataType_ ==
"unsigned long long")
934 else if(dataType_ ==
"float")
936 else if(dataType_ ==
"double")
941 __COUT__ <<
"Using unsigned long long for alarms." << __E__;
943 if((!loloAlarmed_ || !latchAlarms_) &&
944 *((
unsigned long long*)&sample_[0]) <= *((
unsigned long long*)&lolo_[0]))
947 createPacketMask |= 1 << 0;
950 if((!loAlarmed_ || !latchAlarms_) &&
951 *((
unsigned long long*)&sample_[0]) <= *((
unsigned long long*)&lo_[0]))
954 createPacketMask |= 1 << 1;
957 if((!hiAlarmed_ || !latchAlarms_) &&
958 *((
unsigned long long*)&sample_[0]) >= *((
unsigned long long*)&hi_[0]))
961 createPacketMask |= 1 << 2;
964 if((!hihiAlarmed_ || !latchAlarms_) &&
965 *((
unsigned long long*)&sample_[0]) >= *((
unsigned long long*)&hihi_[0]))
968 createPacketMask |= 1 << 3;
971 else if(useType == 1)
973 __COUT__ <<
"Using long long for alarms." << __E__;
975 if((!loloAlarmed_ || !latchAlarms_) &&
976 *((
long long*)&sample_[0]) <= *((
long long*)&lolo_[0]))
979 createPacketMask |= 1 << 0;
982 if((!loAlarmed_ || !latchAlarms_) &&
983 *((
long long*)&sample_[0]) <= *((
long long*)&lo_[0]))
986 createPacketMask |= 1 << 1;
989 if((!hiAlarmed_ || !latchAlarms_) &&
990 *((
long long*)&sample_[0]) >= *((
long long*)&hi_[0]))
993 createPacketMask |= 1 << 2;
996 if((!hihiAlarmed_ || !latchAlarms_) &&
997 *((
long long*)&sample_[0]) >= *((
long long*)&hihi_[0]))
1000 createPacketMask |= 1 << 3;
1003 else if(useType == 2)
1005 __COUT__ <<
"Using float for alarms." << __E__;
1007 if((!loloAlarmed_ || !latchAlarms_) &&
1008 *((
float*)&sample_[0]) <= *((
float*)&lolo_[0]))
1010 loloAlarmed_ =
true;
1011 createPacketMask |= 1 << 0;
1014 if((!loAlarmed_ || !latchAlarms_) && *((
float*)&sample_[0]) <= *((
float*)&lo_[0]))
1017 createPacketMask |= 1 << 1;
1020 if((!hiAlarmed_ || !latchAlarms_) && *((
float*)&sample_[0]) >= *((
float*)&hi_[0]))
1023 createPacketMask |= 1 << 2;
1026 if((!hihiAlarmed_ || !latchAlarms_) &&
1027 *((
float*)&sample_[0]) >= *((
float*)&hihi_[0]))
1029 hihiAlarmed_ =
true;
1030 createPacketMask |= 1 << 3;
1033 else if(useType == 3)
1035 __COUT__ <<
"Using double for alarms." << __E__;
1037 if((!loloAlarmed_ || !latchAlarms_) &&
1038 *((
double*)&sample_[0]) <= *((
double*)&lolo_[0]))
1040 loloAlarmed_ =
true;
1041 createPacketMask |= 1 << 0;
1044 if((!loAlarmed_ || !latchAlarms_) &&
1045 *((
double*)&sample_[0]) <= *((
double*)&lo_[0]))
1048 createPacketMask |= 1 << 1;
1051 if((!hiAlarmed_ || !latchAlarms_) &&
1052 *((
double*)&sample_[0]) >= *((
double*)&hi_[0]))
1055 createPacketMask |= 1 << 2;
1058 if((!hihiAlarmed_ || !latchAlarms_) &&
1059 *((
double*)&sample_[0]) >= *((
double*)&hihi_[0]))
1061 hihiAlarmed_ =
true;
1062 createPacketMask |= 1 << 3;
1067 std::string* alarmValueArray[] = {&lolo_, &lo_, &hi_, &hihi_};
1069 if(monitoringEnabled_)
1073 for(
int i = 0; i < 4; ++i, checkMask <<= 1)
1074 if(createPacketMask & checkMask)
1087 __COUT__ <<
"Create packet type " << i + 1
1088 <<
" alarm value = " << *alarmValueArray[i] << __E__;
1090 __COUT__ <<
"before txBuffer sz=" << txBuffer.size() << __E__;
1091 txBuffer.push_back(i + 1);
1093 txPacketSequenceNumber_++);
1095 txBuffer.resize(txBuffer.size() +
sizeof(lastSampleTime_));
1096 memcpy(&txBuffer[txBuffer.size() -
sizeof(lastSampleTime_)] ,
1098 sizeof(lastSampleTime_));
1100 unsigned int tmpSz = fullChannelName_.size();
1102 txBuffer.resize(txBuffer.size() +
sizeof(tmpSz));
1103 memcpy(&txBuffer[txBuffer.size() -
sizeof(tmpSz)] ,
1107 txBuffer += fullChannelName_;
1110 (
unsigned char)(*alarmValueArray[i]).size());
1111 txBuffer.push_back((
unsigned char)sizeOfDataTypeBits_);
1113 txBuffer += (*alarmValueArray[i]);
1114 __COUT__ <<
"after txBuffer sz=" << txBuffer.size() << __E__;
1117 __SS__ <<
"txBuffer: \n";
1118 for(
unsigned int i = 0; i < txBuffer.size(); ++i)
1120 ss << std::hex << (int)((txBuffer[i] >> 4) & 0xF)
1121 << (int)((txBuffer[i]) & 0xF) <<
" " << std::dec;
1126 __COUT__ <<
"\n" << ss.str();
1131 return createPacketMask;