1 #ifndef _ots_ConsoleSupervisor_h_
2 #define _ots_ConsoleSupervisor_h_
5 #include "otsdaq-core/CoreSupervisors/CoreSupervisorBase.h"
31 virtual void defaultPage (xgi::Input* in, xgi::Output* out)
override;
32 virtual void request (
const std::string& requestType, cgicc::Cgicc& cgiIn, HttpXmlDocument& xmlOut,
const WebUsers::RequestUserInfo& userInfo)
override;
34 virtual void forceSupervisorPropertyValues (
void)
override;
40 void insertMessageRefresh (HttpXmlDocument *xmldoc,
const clock_t lastUpdateClock,
const unsigned int lastUpdateIndex);
46 struct ConsoleMessageStruct
48 ConsoleMessageStruct()
50 buffer.resize(BUFFER_SZ);
52 countStamp = (time_t)-1;
56 fields[SEQID].set(
"SequenceID", 2, -1);
57 fields[LEVEL].set(
"Level", 5, -1);
58 fields[LABEL].set(
"Label", 6, -1);
59 fields[SOURCEID].set(
"SourceID", 7, -1);
60 fields[SOURCE].set(
"Source", 9, -1);
61 fields[MSG].set(
"Msg", 10, -1);
69 void set(
const std::string &msg,
const time_t count)
71 buffer = (std::string)(msg.substr(0, BUFFER_SZ));
81 if (fields[i].markerCount == 0)
82 fields[i++].posInString = 0;
85 while ((p = buffer.find(
'|', p)) != std::string::npos)
89 if (i < (
int)fields.size() &&
90 m == fields[i].markerCount)
91 fields[i++].posInString = p + 1;
97 if(i == LABEL && p + 1 + strlen(&buffer[p+1]) != msg.length())
101 fields[i++].posInString = p + 2 + strlen(&buffer[p+1]);
114 const char * getMsg() {
return (
char *)&buffer[fields[MSG].posInString]; }
115 const char * getLabel() {
return (
char *)&buffer[fields[LABEL].posInString]; }
116 const char * getLevel() {
return (
char *)&buffer[fields[LEVEL].posInString]; }
117 const char * getSourceID() {
return (
char *)&buffer[fields[SOURCEID].posInString]; }
118 const long long getSourceIDAsNumber()
122 sscanf((
char *)&buffer[fields[SOURCEID].posInString],
"%lld", &srcid);
125 const char * getSource() {
return (
char *)&buffer[fields[SOURCE].posInString]; }
126 const char * getSequenceID() {
return (
char *)&buffer[fields[SEQID].posInString]; }
127 const unsigned int getSequenceIDAsNumber()
129 unsigned long long longSeqid;
130 sscanf((
char *)&buffer[fields[SEQID].posInString],
"%llu", &longSeqid);
133 return (
unsigned int)longSeqid;
136 const char * getField(
int i) {
return (
char *)&buffer[fields[i].posInString]; }
137 const time_t getTime() {
return timeStamp; }
138 const time_t getCount() {
return countStamp; }
145 void set(
const std::string &fn,
const int mc,
const int ps)
147 fieldName = fn; markerCount = mc; posInString = ps;
150 std::string fieldName;
166 const int BUFFER_SZ = 5000;
167 std::array<FieldStruct, 6> fields;
174 std::array<ConsoleMessageStruct, 100> messages_;
175 std::mutex messageMutex_;
176 volatile unsigned int writePointer_;
177 time_t messageCount_;
180 unsigned int refreshReadPointer_;
181 char refreshTempStr_[50];
182 unsigned int refreshIndex_;
183 xercesc::DOMElement* refreshParent_;
184 time_t refreshCurrentLastCount_;