1 #include "otsdaq-core/FECore/FESlowControlsChannel.h"
2 #include "otsdaq-core/Macros/CoutMacros.h"
29 FESlowControlsChannel::FESlowControlsChannel(
30 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,
40 bool monitoringEnabled,
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
54 : interfaceUID_ (interfaceUID),
55 channelName_ (channelName),
56 fullChannelName_ (interfaceUID_ +
"/" + channelName_),
58 universalDataBitOffset_ (universalDataBitOffset),
59 txPacketSequenceNumber_ (0),
61 readAccess_ (readAccess),
62 writeAccess_ (writeAccess),
63 monitoringEnabled_ (monitoringEnabled),
64 recordChangesOnly_ (recordChangesOnly),
65 delayBetweenSamples_ (delayBetweenSamples),
66 saveEnabled_ (saveEnabled),
68 saveFileRadix_ (saveFileRadix),
69 saveBinaryFormat_ (saveBinaryFormat),
70 alarmsEnabled_ (alarmsEnabled),
71 latchAlarms_ (latchAlarms),
78 saveFullFileName_ (savePath_ +
"/" + saveFileRadix_ +
"-" + underscoreString(fullChannelName_) +
"-" + std::to_string(time(0)) + (saveBinaryFormat_?
".dat":
".txt"))
80 __COUT__ <<
"dataType_ = " << dataType_ << std::endl;
81 __COUT__ <<
"universalAddressSize = " << universalAddressSize << std::endl;
82 __COUT__ <<
"universalAddress = " << universalAddress << std::endl;
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__ <<
"Data type '" << dataType_ <<
"' is invalid. " <<
111 "Valid data types (w/size in bytes) are as follows: " <<
113 ", char (" <<
sizeof(char) <<
114 "B), unsigned char (" <<
sizeof(
unsigned char) <<
115 "B), short (" <<
sizeof(short) <<
116 "B), unsigned short (" <<
sizeof(
unsigned short) <<
117 "B), int (" <<
sizeof(int) <<
118 "B), unsigned int (" <<
sizeof(
unsigned int) <<
119 "B), long long (" <<
sizeof(
long long) <<
120 "B), unsigned long long (" <<
sizeof(
unsigned long long) <<
121 "B), float (" <<
sizeof(float) <<
122 "B), double (" <<
sizeof(
double) <<
124 __COUT_ERR__ <<
"\n" << ss.str();
125 throw std::runtime_error(ss.str());
128 if(sizeOfDataTypeBits_ > 64)
130 __SS__ <<
"Invalid Data Type '" << dataType_ <<
131 "' (" << sizeOfDataTypeBits_ <<
"-bits)"
132 ". Size in bits must be less than or equal to 64-bits." <<
134 __COUT_ERR__ <<
"\n" << ss.str();
135 throw std::runtime_error(ss.str());
138 if(universalDataSize*8 < sizeOfDataTypeBits_)
140 __SS__ <<
"Invalid Data Type '" << dataType_ <<
141 "' (" << sizeOfDataTypeBits_ <<
"-bits) or Universal Data Size of " <<
142 universalDataSize*8 <<
143 "-bits. Data Type size must be less than or equal to Universal Data Size." <<
145 __COUT_ERR__ <<
"\n" << ss.str();
146 throw std::runtime_error(ss.str());
150 universalAddress_.resize(universalAddressSize);
151 convertStringToBuffer(universalAddress,universalAddress_);
153 sizeOfDataTypeBytes_ = (sizeOfDataTypeBits_/8 +
154 ((universalDataBitOffset_%8)?1:0));
156 lolo_.resize(sizeOfDataTypeBytes_);
157 convertStringToBuffer(lolo,lolo_,
true);
158 lo_.resize(sizeOfDataTypeBytes_);
159 convertStringToBuffer(lo,lo_,
true);
160 hi_.resize(sizeOfDataTypeBytes_);
161 convertStringToBuffer(hi,hi_,
true);
162 hihi_.resize(sizeOfDataTypeBytes_);
163 convertStringToBuffer(hihi,hihi_,
true);
166 sample_.resize(sizeOfDataTypeBytes_);
167 lastSample_.resize(sizeOfDataTypeBytes_);
171 FESlowControlsChannel::~FESlowControlsChannel(
void)
177 std::string FESlowControlsChannel::underscoreString(
const std::string& str)
180 retStr.reserve(str.size());
181 for(
unsigned int i=0;i<str.size();++i)
183 (str[i] >=
'a' && str[i] <=
'z') ||
184 (str[i] >=
'A' && str[i] <=
'Z') ||
185 (str[i] >=
'0' && str[i] <=
'9'))
186 retStr.push_back(str[i]);
188 retStr.push_back(
'_');
198 void FESlowControlsChannel::convertStringToBuffer(
const std::string& inString, std::string& buffer,
bool useDataType)
200 __COUT__ <<
"Input Str Sz= \t" << inString.size() << std::endl;
201 __COUT__ <<
"Input Str Val= \t'" << inString <<
"'" << std::endl;
202 __COUT__ <<
"Output buffer Sz= \t" << buffer.size() << std::endl;
205 (dataType_ ==
"float" || dataType_ ==
"double"))
207 __COUT__ <<
"Floating point spec'd" << std::endl;
208 if(dataType_ ==
"float" && buffer.size() ==
sizeof(float))
210 sscanf(&inString[0],
"%f",(
float *)&buffer[0]);
211 __COUT__ <<
"float: " << *((
float *)&buffer[0]) << std::endl;
213 else if(dataType_ ==
"double" && buffer.size() ==
sizeof(double))
215 sscanf(&inString[0],
"%lf",(
double *)&buffer[0]);
216 __COUT__ <<
"double: " << *((
double *)&buffer[0]) << std::endl;
220 __SS__ <<
"Invalid floating point spec! " <<
221 "dataType_=" << dataType_ <<
222 " buffer.size()=" << buffer.size() << std::endl;
223 __COUT_ERR__ <<
"\n" << ss.str();
224 throw std::runtime_error(ss.str());
229 for(
int i=(
int)buffer.size()-1;i>=0;--i)
230 ss << std::hex << (
int)((buffer[i]>>4)&0xF) <<
231 (int)((buffer[i])&0xF) <<
" " << std::dec;
233 __COUT__ <<
"\n" << ss.str();
240 for(
unsigned int i=0;i<buffer.size();++i)
255 if(inString.size() > 2 && inString[0] ==
'0' && inString[1] ==
'x')
259 __COUT__ <<
"Hex." << std::endl;
263 for(
unsigned int i=0;i<inString.size();++i)
265 j = (inString.size()-1-i);
266 if(inString[i] >=
'0' &&
268 val = inString[i] - 48;
269 else if(inString[i] >=
'A' &&
271 val = inString[i] - 55;
272 else if(inString[i] >=
'a' &&
274 val = inString[i] - 87;
278 buffer[j/2] |= val<<((j%2)*4);
285 __COUT__ <<
"Decimal." << std::endl;
286 unsigned long long val;
288 if(!useDataType || dataType_[0] ==
'u')
290 sscanf(&inString[0],
"%llu",&val);
294 sscanf(&inString[0],
"%lld",(
long long *)&val);
297 for(
unsigned int i=0;i<
sizeof(
long long) && i<buffer.size();++i)
298 buffer[i] = ((
char *)&val)[i];
306 for(
int i=(
int)buffer.size()-1;i>=0;--i)
307 ss << std::hex << (
int)((buffer[i]>>4)&0xF) <<
308 (int)((buffer[i])&0xF) <<
" " << std::dec;
310 __COUT__ <<
"\n" << ss.str();
318 void FESlowControlsChannel::handleSample(
const std::string& universalReadValue, std::string& txBuffer,
319 FILE *fpAggregate,
bool aggregateIsBinaryFormat)
321 __COUT__ <<
"txBuffer size=" << txBuffer.size() << std::endl;
326 extractSample(universalReadValue);
343 if(recordChangesOnly_)
345 if(lastSampleTime_ &&
346 lastSample_ == sample_)
348 __COUT__ <<
"no change." << std::endl;
353 __COUT__ <<
"new value!" << std::endl;
356 lastSampleTime_ = time(0);
357 lastSample_ = sample_;
364 if(monitoringEnabled_)
376 __COUT__ <<
"before txBuffer sz=" << txBuffer.size() << std::endl;
377 txBuffer.push_back(0);
378 txBuffer.push_back(txPacketSequenceNumber_++);
380 txBuffer.resize(txBuffer.size() +
sizeof(lastSampleTime_));
381 memcpy(&txBuffer[txBuffer.size() -
sizeof(lastSampleTime_)],&lastSampleTime_,
sizeof(lastSampleTime_));
383 unsigned int tmpSz = fullChannelName_.size();
385 txBuffer.resize(txBuffer.size() +
sizeof(tmpSz));
386 memcpy(&txBuffer[txBuffer.size() -
sizeof(tmpSz)],&tmpSz,
sizeof(tmpSz));
388 txBuffer += fullChannelName_;
390 txBuffer.push_back((
unsigned char)sample_.size());
391 txBuffer.push_back((
unsigned char)sizeOfDataTypeBits_);
394 __COUT__ <<
"after txBuffer sz=" << txBuffer.size() << std::endl;
397 __SS__ <<
"txBuffer: \n";
398 for(
unsigned int i=0; i<txBuffer.size(); ++i)
400 ss << std::hex << (int)((txBuffer[i]>>4)&0xF) <<
401 (int)((txBuffer[i])&0xF) <<
" " << std::dec;
402 if(i%8 == 7) ss << std::endl;
405 __COUT__ <<
"\n" << ss.str();
411 alarmMask = checkAlarms(txBuffer);
414 std::string *alarmValueArray[] = {
415 &lolo_, &lo_, &hi_, &hihi_
424 if(aggregateIsBinaryFormat)
434 __COUT__ <<
"Aggregate Binary File Format: " <<
435 sizeof(lastSampleTime_) <<
" " << sample_.size() << std::endl;
438 fwrite(&lastSampleTime_,
sizeof(lastSampleTime_),1,fpAggregate);
440 unsigned int tmpSz = fullChannelName_.size();
441 fwrite(&tmpSz,
sizeof(tmpSz),1,fpAggregate);
442 fwrite(&fullChannelName_[0],fullChannelName_.size(),1,fpAggregate);
444 unsigned char tmpChar = (
unsigned char)sample_.size();
445 fwrite(&tmpChar,1,1,fpAggregate);
447 tmpChar = (
unsigned char)sizeOfDataTypeBits_;
448 fwrite(&tmpChar,1,1,fpAggregate);
449 fwrite(&sample_[0],sample_.size(),1,fpAggregate);
454 for(time_t i=1;i<5;++i, alarmMask >>= 1)
458 fwrite(&i,
sizeof(lastSampleTime_),1,fpAggregate);
460 unsigned int tmpSz = fullChannelName_.size();
461 fwrite(&tmpSz,
sizeof(tmpSz),1,fpAggregate);
462 fwrite(&fullChannelName_[0],fullChannelName_.size(),1,fpAggregate);
464 unsigned char tmpChar = (
unsigned char)sample_.size();
465 fwrite(&tmpChar,1,1,fpAggregate);
467 tmpChar = (
unsigned char)sizeOfDataTypeBits_;
468 fwrite(&tmpChar,1,1,fpAggregate);
469 fwrite(&(*alarmValueArray[i-1])[0],(*alarmValueArray[i-1]).size(),1,fpAggregate);
480 __COUT__ <<
"Aggregate Text File Format: " << dataType_ << std::endl;
482 fprintf(fpAggregate,
"%lu\n",lastSampleTime_);
483 fprintf(fpAggregate,
"%s\n",fullChannelName_.c_str());
485 if(dataType_[dataType_.size()-1] ==
'b')
487 std::stringstream ss;
489 for(
unsigned int i=0; i<sample_.size(); ++i)
490 ss << std::hex << (
int)((sample_[i]>>4)&0xF) <<
491 (int)((sample_[i])&0xF) << std::dec;
492 fprintf(fpAggregate,
"%s\n",ss.str().c_str());
494 else if(dataType_ ==
"char")
495 fprintf(fpAggregate,
"%d\n",*((
char *)(&sample_[0])));
496 else if(dataType_ ==
"unsigned char")
497 fprintf(fpAggregate,
"%u\n",*((
unsigned char *)(&sample_[0])));
498 else if(dataType_ ==
"short")
499 fprintf(fpAggregate,
"%d\n",*((
short *)(&sample_[0])));
500 else if(dataType_ ==
"unsigned short")
501 fprintf(fpAggregate,
"%u\n",*((
unsigned short *)(&sample_[0])));
502 else if(dataType_ ==
"int")
503 fprintf(fpAggregate,
"%d\n",*((
int *)(&sample_[0])));
504 else if(dataType_ ==
"unsigned int")
505 fprintf(fpAggregate,
"%u\n",*((
unsigned int *)(&sample_[0])));
506 else if(dataType_ ==
"long long")
507 fprintf(fpAggregate,
"%lld\n",*((
long long *)(&sample_[0])));
508 else if(dataType_ ==
"unsigned long long")
509 fprintf(fpAggregate,
"%llu\n",*((
unsigned long long *)(&sample_[0])));
510 else if(dataType_ ==
"float")
511 fprintf(fpAggregate,
"%f\n",*((
float *)(&sample_[0])));
512 else if(dataType_ ==
"double")
513 fprintf(fpAggregate,
"%f\n",*((
double *)(&sample_[0])));
520 for(time_t i=1;i<5;++i, checkMask <<= 1)
521 if(alarmMask & checkMask)
523 fprintf(fpAggregate,
"%lu\n",i);
524 fprintf(fpAggregate,
"%s\n",fullChannelName_.c_str());
526 if(dataType_[dataType_.size()-1] ==
'b')
528 std::stringstream ss;
530 for(
unsigned int j=0; j<(*alarmValueArray[i-1]).size(); ++i)
531 ss << std::hex << (
int)(((*alarmValueArray[i-1])[j]>>4)&0xF) <<
532 (
int)(((*alarmValueArray[i-1])[j])&0xF) << std::dec;
533 fprintf(fpAggregate,
"%s\n",ss.str().c_str());
535 else if(dataType_ ==
"char")
536 fprintf(fpAggregate,
"%d\n",*((
char *)(&(*alarmValueArray[i-1])[0])));
537 else if(dataType_ ==
"unsigned char")
538 fprintf(fpAggregate,
"%u\n",*((
unsigned char *)(&(*alarmValueArray[i-1])[0])));
539 else if(dataType_ ==
"short")
540 fprintf(fpAggregate,
"%d\n",*((
short *)(&(*alarmValueArray[i-1])[0])));
541 else if(dataType_ ==
"unsigned short")
542 fprintf(fpAggregate,
"%u\n",*((
unsigned short *)(&(*alarmValueArray[i-1])[0])));
543 else if(dataType_ ==
"int")
544 fprintf(fpAggregate,
"%d\n",*((
int *)(&(*alarmValueArray[i-1])[0])));
545 else if(dataType_ ==
"unsigned int")
546 fprintf(fpAggregate,
"%u\n",*((
unsigned int *)(&(*alarmValueArray[i-1])[0])));
547 else if(dataType_ ==
"long long")
548 fprintf(fpAggregate,
"%lld\n",*((
long long *)(&(*alarmValueArray[i-1])[0])));
549 else if(dataType_ ==
"unsigned long long")
550 fprintf(fpAggregate,
"%llu\n",*((
unsigned long long *)(&(*alarmValueArray[i-1])[0])));
551 else if(dataType_ ==
"float")
552 fprintf(fpAggregate,
"%f\n",*((
float *)(&(*alarmValueArray[i-1])[0])));
553 else if(dataType_ ==
"double")
554 fprintf(fpAggregate,
"%f\n",*((
double *)(&(*alarmValueArray[i-1])[0])));
565 FILE *fp = fopen(saveFullFileName_.c_str(),saveBinaryFormat_?
"ab":
"a");
568 __COUT_ERR__ <<
"Failed to open slow controls channel file: " <<
569 saveFullFileName_ << std::endl;
574 if(saveBinaryFormat_)
576 __COUT__ <<
"Binary File Format: " <<
sizeof(lastSampleTime_) <<
" " << sample_.size() << std::endl;
577 fwrite(&lastSampleTime_,
sizeof(lastSampleTime_),1,fp);
578 fwrite(&sample_[0],sample_.size(),1,fp);
582 for(time_t i=1;i<5;++i, alarmMask >>= 1)
585 fwrite(&i,
sizeof(lastSampleTime_),1,fp);
586 fwrite(&(*alarmValueArray[i-1])[0],(*alarmValueArray[i-1]).size(),1,fp);
591 __COUT__ <<
"Text File Format: " << dataType_ << std::endl;
593 fprintf(fp,
"%lu\n",lastSampleTime_);
595 if(dataType_[dataType_.size()-1] ==
'b')
597 std::stringstream ss;
599 for(
unsigned int i=0; i<sample_.size(); ++i)
600 ss << std::hex << (
int)((sample_[i]>>4)&0xF) <<
601 (int)((sample_[i])&0xF) << std::dec;
602 fprintf(fp,
"%s\n",ss.str().c_str());
604 else if(dataType_ ==
"char")
605 fprintf(fp,
"%d\n",*((
char *)(&sample_[0])));
606 else if(dataType_ ==
"unsigned char")
607 fprintf(fp,
"%u\n",*((
unsigned char *)(&sample_[0])));
608 else if(dataType_ ==
"short")
609 fprintf(fp,
"%d\n",*((
short *)(&sample_[0])));
610 else if(dataType_ ==
"unsigned short")
611 fprintf(fp,
"%u\n",*((
unsigned short *)(&sample_[0])));
612 else if(dataType_ ==
"int")
613 fprintf(fp,
"%d\n",*((
int *)(&sample_[0])));
614 else if(dataType_ ==
"unsigned int")
615 fprintf(fp,
"%u\n",*((
unsigned int *)(&sample_[0])));
616 else if(dataType_ ==
"long long")
617 fprintf(fp,
"%lld\n",*((
long long *)(&sample_[0])));
618 else if(dataType_ ==
"unsigned long long")
619 fprintf(fp,
"%llu\n",*((
unsigned long long *)(&sample_[0])));
620 else if(dataType_ ==
"float")
621 fprintf(fp,
"%f\n",*((
float *)(&sample_[0])));
622 else if(dataType_ ==
"double")
623 fprintf(fp,
"%f\n",*((
double *)(&sample_[0])));
630 for(time_t i=1;i<5;++i, checkMask <<= 1)
631 if(alarmMask & checkMask)
633 fprintf(fp,
"%lu\n",i);
635 if(dataType_[dataType_.size()-1] ==
'b')
637 std::stringstream ss;
639 for(
unsigned int j=0; j<(*alarmValueArray[i-1]).size(); ++i)
640 ss << std::hex << (
int)(((*alarmValueArray[i-1])[j]>>4)&0xF) <<
641 (
int)(((*alarmValueArray[i-1])[j])&0xF) << std::dec;
642 fprintf(fp,
"%s\n",ss.str().c_str());
644 else if(dataType_ ==
"char")
645 fprintf(fp,
"%d\n",*((
char *)(&(*alarmValueArray[i-1])[0])));
646 else if(dataType_ ==
"unsigned char")
647 fprintf(fp,
"%u\n",*((
unsigned char *)(&(*alarmValueArray[i-1])[0])));
648 else if(dataType_ ==
"short")
649 fprintf(fp,
"%d\n",*((
short *)(&(*alarmValueArray[i-1])[0])));
650 else if(dataType_ ==
"unsigned short")
651 fprintf(fp,
"%u\n",*((
unsigned short *)(&(*alarmValueArray[i-1])[0])));
652 else if(dataType_ ==
"int")
653 fprintf(fp,
"%d\n",*((
int *)(&(*alarmValueArray[i-1])[0])));
654 else if(dataType_ ==
"unsigned int")
655 fprintf(fp,
"%u\n",*((
unsigned int *)(&(*alarmValueArray[i-1])[0])));
656 else if(dataType_ ==
"long long")
657 fprintf(fp,
"%lld\n",*((
long long *)(&(*alarmValueArray[i-1])[0])));
658 else if(dataType_ ==
"unsigned long long")
659 fprintf(fp,
"%llu\n",*((
unsigned long long *)(&(*alarmValueArray[i-1])[0])));
660 else if(dataType_ ==
"float")
661 fprintf(fp,
"%f\n",*((
float *)(&(*alarmValueArray[i-1])[0])));
662 else if(dataType_ ==
"double")
663 fprintf(fp,
"%f\n",*((
double *)(&(*alarmValueArray[i-1])[0])));
676 void FESlowControlsChannel::extractSample(
const std::string& universalReadValue)
681 __SS__ <<
"Univ Read: ";
682 for(
unsigned int i=0; i<universalReadValue.size(); ++i)
683 ss << std::hex << (
int)((universalReadValue[i]>>4)&0xF) <<
684 (int)((universalReadValue[i])&0xF) <<
" " << std::dec;
686 __COUT__ <<
"\n" << ss.str();
689 unsigned int byteOffset = universalDataBitOffset_/8;
690 unsigned int bitOffset = universalDataBitOffset_%8;
691 unsigned int bitsLeft = sizeOfDataTypeBits_;
694 unsigned long long tmp = 0;
703 tmp = ((
unsigned long long)(universalReadValue[byteOffset++])) >> bitOffset;
704 bitsLeft = 8 - bitOffset;
723 tmp |= ((
unsigned long long)(universalReadValue[byteOffset++])) <<
724 (sizeOfDataTypeBits_ - bitsLeft);
744 tmp |= (((
unsigned long long)(universalReadValue[byteOffset])) &
745 (0xFF >> (8-bitsLeft))) <<
746 (sizeOfDataTypeBits_ - bitsLeft);
758 __COUT__ <<
"Temp Long Long Sample: " << tmp << std::endl;
761 for(
unsigned int i=0; i<(sizeOfDataTypeBits_/8 +
762 ((universalDataBitOffset_%8)?1:0)); ++i)
763 sample_.push_back(((
char *)&tmp)[i]);
765 __COUT__ <<
"sample_.size()= " << sample_.size() << std::endl;
768 __SS__ <<
"Sample: ";
769 for(
unsigned int i=0; i<sample_.size(); ++i)
770 ss << std::hex << (
int)((sample_[i]>>4)&0xF) <<
771 (int)((sample_[i])&0xF) <<
" " << std::dec;
773 __COUT__ <<
"\n" << ss.str();
783 void FESlowControlsChannel::clearAlarms(
int targetAlarm)
785 if(targetAlarm == -1 || targetAlarm == 0)
786 loloAlarmed_ =
false;
787 if(targetAlarm == -1 || targetAlarm == 1)
789 if(targetAlarm == -1 || targetAlarm == 2)
791 if(targetAlarm == -1 || targetAlarm == 3)
792 hihiAlarmed_ =
false;
800 char FESlowControlsChannel::checkAlarms(std::string& txBuffer)
815 char createPacketMask = 0;
818 if(dataType_[dataType_.size()-1] ==
'b')
820 else if(dataType_ ==
"char")
822 else if(dataType_ ==
"unsigned char")
824 else if(dataType_ ==
"short")
826 else if(dataType_ ==
"unsigned short")
828 else if(dataType_ ==
"int")
830 else if(dataType_ ==
"unsigned int")
832 else if(dataType_ ==
"long long")
834 else if(dataType_ ==
"unsigned long long")
836 else if(dataType_ ==
"float")
838 else if(dataType_ ==
"double")
844 __COUT__ <<
"Using unsigned long long for alarms." << std::endl;
846 if((!loloAlarmed_ || !latchAlarms_) &&
847 *((
unsigned long long *)&sample_[0]) <=
848 *((
unsigned long long *)&lolo_[0]) )
851 createPacketMask |= 1 << 0;
854 if((!loAlarmed_ || !latchAlarms_) &&
855 *((
unsigned long long *)&sample_[0]) <=
856 *((
unsigned long long *)&lo_[0]) )
859 createPacketMask |= 1 << 1;
862 if((!hiAlarmed_ || !latchAlarms_) &&
863 *((
unsigned long long *)&sample_[0]) >=
864 *((
unsigned long long *)&hi_[0]) )
867 createPacketMask |= 1 << 2;
870 if((!hihiAlarmed_ || !latchAlarms_) &&
871 *((
unsigned long long *)&sample_[0]) >=
872 *((
unsigned long long *)&hihi_[0]) )
875 createPacketMask |= 1 << 3;
878 else if(useType == 1)
880 __COUT__ <<
"Using long long for alarms." << std::endl;
882 if((!loloAlarmed_ || !latchAlarms_) &&
883 *((
long long *)&sample_[0]) <=
884 *((
long long *)&lolo_[0]) )
887 createPacketMask |= 1 << 0;
890 if((!loAlarmed_ || !latchAlarms_) &&
891 *((
long long *)&sample_[0]) <=
892 *((
long long *)&lo_[0]) )
895 createPacketMask |= 1 << 1;
898 if((!hiAlarmed_ || !latchAlarms_) &&
899 *((
long long *)&sample_[0]) >=
900 *((
long long *)&hi_[0]) )
903 createPacketMask |= 1 << 2;
906 if((!hihiAlarmed_ || !latchAlarms_) &&
907 *((
long long *)&sample_[0]) >=
908 *((
long long *)&hihi_[0]) )
911 createPacketMask |= 1 << 3;
914 else if(useType == 2)
916 __COUT__ <<
"Using float for alarms." << std::endl;
918 if((!loloAlarmed_ || !latchAlarms_) &&
919 *((
float *)&sample_[0]) <=
920 *((
float *)&lolo_[0]) )
923 createPacketMask |= 1 << 0;
926 if((!loAlarmed_ || !latchAlarms_) &&
927 *((
float *)&sample_[0]) <=
928 *((
float *)&lo_[0]) )
931 createPacketMask |= 1 << 1;
934 if((!hiAlarmed_ || !latchAlarms_) &&
935 *((
float *)&sample_[0]) >=
936 *((
float *)&hi_[0]) )
939 createPacketMask |= 1 << 2;
942 if((!hihiAlarmed_ || !latchAlarms_) &&
943 *((
float *)&sample_[0]) >=
944 *((
float *)&hihi_[0]) )
947 createPacketMask |= 1 << 3;
950 else if(useType == 3)
952 __COUT__ <<
"Using double for alarms." << std::endl;
954 if((!loloAlarmed_ || !latchAlarms_) &&
955 *((
double *)&sample_[0]) <=
956 *((
double *)&lolo_[0]) )
959 createPacketMask |= 1 << 0;
962 if((!loAlarmed_ || !latchAlarms_) &&
963 *((
double *)&sample_[0]) <=
964 *((
double *)&lo_[0]) )
967 createPacketMask |= 1 << 1;
970 if((!hiAlarmed_ || !latchAlarms_) &&
971 *((
double *)&sample_[0]) >=
972 *((
double *)&hi_[0]) )
975 createPacketMask |= 1 << 2;
978 if((!hihiAlarmed_ || !latchAlarms_) &&
979 *((
double *)&sample_[0]) >=
980 *((
double *)&hihi_[0]) )
983 createPacketMask |= 1 << 3;
989 std::string *alarmValueArray[] = {
990 &lolo_, &lo_, &hi_, &hihi_
993 if(monitoringEnabled_)
997 for(
int i=0;i<4;++i, checkMask <<= 1)
998 if(createPacketMask & checkMask)
1010 __COUT__ <<
"Create packet type " << i+1 <<
1011 " alarm value = " << *alarmValueArray[i] << std::endl;
1013 __COUT__ <<
"before txBuffer sz=" << txBuffer.size() << std::endl;
1014 txBuffer.push_back(i+1);
1015 txBuffer.push_back(txPacketSequenceNumber_++);
1017 txBuffer.resize(txBuffer.size() +
sizeof(lastSampleTime_));
1018 memcpy(&txBuffer[txBuffer.size() -
sizeof(lastSampleTime_)],&lastSampleTime_,
sizeof(lastSampleTime_));
1020 unsigned int tmpSz = fullChannelName_.size();
1022 txBuffer.resize(txBuffer.size() +
sizeof(tmpSz));
1023 memcpy(&txBuffer[txBuffer.size() -
sizeof(tmpSz)],&tmpSz,
sizeof(tmpSz));
1025 txBuffer += fullChannelName_;
1027 txBuffer.push_back((
unsigned char)(*alarmValueArray[i]).size());
1028 txBuffer.push_back((
unsigned char)sizeOfDataTypeBits_);
1030 txBuffer += (*alarmValueArray[i]);
1031 __COUT__ <<
"after txBuffer sz=" << txBuffer.size() << std::endl;
1034 __SS__ <<
"txBuffer: \n";
1035 for(
unsigned int i=0; i<txBuffer.size(); ++i)
1037 ss << std::hex << (int)((txBuffer[i]>>4)&0xF) <<
1038 (int)((txBuffer[i])&0xF) <<
" " << std::dec;
1039 if(i%8 == 7) ss << std::endl;
1042 __COUT__ <<
"\n" << ss.str();
1047 return createPacketMask;