Belle II Software  release-05-01-25
NSMCallback.cc
1 #include "daq/slc/nsm/NSMCallback.h"
2 
3 #include "daq/slc/system/LogFile.h"
4 
5 #include "daq/slc/nsm/NSMCommunicator.h"
6 #include "daq/slc/nsm/NSMHandlerException.h"
7 
8 #include "daq/slc/version/Version.h"
9 
10 #include <cstdlib>
11 #include <iostream>
12 #include <sstream>
13 #include <cstdarg>
14 
15 using namespace Belle2;
16 
17 NSMCallback::NSMCallback(const int timeout)
18  : AbstractNSMCallback(timeout)
19 {
20  reg(NSMCommand::OK);
21  reg(NSMCommand::ERROR);
22  reg(NSMCommand::LOG);
23  reg(NSMCommand::VGET);
24  reg(NSMCommand::VSET);
25  reg(NSMCommand::VREPLY);
26  reg(NSMCommand::VLISTGET);
27  reg(NSMCommand::VLISTSET);
28 
29  addDefaultHandlers();
30 }
31 
32 
33 int NSMCallback::reset()
34 {
35  int revision = Callback::reset();
36 
37  addDefaultHandlers();
38 
39  return revision;
40 }
41 
42 int NSMCallback::addDefaultHandlers()
43 {
44  return add(new NSMVHandlerText("version", true, false, DAQ_SLC_VERSION::DAQ_SLC_VERSION), false, true);
45 }
46 
47 void NSMCallback::addNode(const NSMNode& node)
48 {
49  std::string name = node.getName();
50  if (m_nodes.find(name) == m_nodes.end()) {
51  m_nodes.insert(NSMNodeMap::value_type(name, node));
52  }
53 }
54 
55 void NSMCallback::reply(const NSMMessage& msg)
56 {
57  NSMMessage msg_out = msg;
58  for (NSMNodeMap::iterator it = m_nodes.begin();
59  it != m_nodes.end();) {
60  NSMNode& node(it->second);
61  msg_out.setNodeName(node.getName());
62  if (NSMCommunicator::send(msg_out)) {
63  it++;
64  } else {
65  m_nodes.erase(it++);
66  }
67  }
68 }
69 
70 void NSMCallback::log(LogFile::Priority pri, const char* format, ...)
71 {
72  va_list ap;
73  char ss[1024 * 10];
74  va_start(ap, format);
75  vsnprintf(ss, sizeof(ss), format, ap);
76  va_end(ap);
77  log(pri, std::string(ss));
78 }
79 
80 void NSMCallback::log(LogFile::Priority pri, const std::string& msg)
81 {
82  LogFile::put(pri, msg);
83  try {
84  if (getLogNode().getName().size() > 0) {
85  NSMCommunicator::send(NSMMessage(getLogNode().getName(),
86  DAQLogMessage(getNode().getName(),
87  pri, getCategory(), msg)));
88  }
89  } catch (const NSMHandlerException& e) {
90  LogFile::error(e.what());
91  }
92 }
93 
94 bool NSMCallback::perform(NSMCommunicator& com)
95 {
96  const NSMMessage& msg(com.getMessage());
97  const NSMCommand cmd = msg.getRequestName();
98  if (cmd == NSMCommand::OK || cmd == NSMCommand::ERROR ||
99  cmd == NSMCommand::FATAL) {
100  if (msg.getLength() > 0) {
101  if (cmd == NSMCommand::OK) {
102  ok(msg.getNodeName(), msg.getData());
103  } else if (cmd == NSMCommand::ERROR) {
104  error(msg.getNodeName(), msg.getData());
105  } else if (cmd == NSMCommand::FATAL) {
106  fatal(msg.getNodeName(), msg.getData());
107  }
108  }
109  return true;
110  } else if (cmd == NSMCommand::LOG) {
111  int id = com.getNodeIdByName(msg.getNodeName());
112  DAQLogMessage lmsg;
113  lmsg.setId(id);
114  lmsg.setNodeName(msg.getNodeName());
115  if (msg.getNParams() > 0) {
116  lmsg.setPriority((LogFile::Priority)msg.getParam(0));
117  }
118  if (msg.getNParams() > 1) lmsg.setDate(msg.getParam(1));
119  if (msg.getNParams() > 2) lmsg.setCategory(msg.getParam(2));
120  lmsg.setMessage(msg.getLength() > 0 ? msg.getData() : "");
121  logset(lmsg);
122  return true;
123  } else if (cmd == NSMCommand::VGET) {
124  if (msg.getLength() > 0) {
125  vget(msg.getNodeName(), msg.getData());
126  }
127  return true;
128  } else if (cmd == NSMCommand::VSET) {
129  if (msg.getLength() > 0) {
130  NSMVar var;
131  readVar(msg, var);
132  vset(com, var);
133  }
134  return true;
135  } else if (cmd == NSMCommand::VREPLY) {
136  vreply(com, msg.getData(), msg.getParam(0));
137  return true;
138  } else if (cmd == NSMCommand::VLISTGET) {
139  vlistget(com);
140  return true;
141  } else if (cmd == NSMCommand::VLISTSET) {
142  vlistset(com);
143  return true;
144  }
145  return false;
146 }
147 
148 void NSMCallback::notify(const NSMVar& var)
149 {
150  std::string vname = var.getName();
151  NSMVar var_out = var;
152  if (var_out.getNode().size() == 0) {
153  var_out.setNode(getNode().getName());
154  }
155 
156  if (m_node_v_m.find(vname) != m_node_v_m.end()) {
157  try {
158  NSMNodeMap& node_v(m_node_v_m[vname]);
159  for (NSMNodeMap::iterator inode = node_v.begin();
160  inode != node_v.end();) {
161  NSMNode& node(inode->second);
162  if (NSMCommunicator::send(NSMMessage(node, var_out))) {
163  inode++;
164  } else {
165  node_v.erase(inode++);
166  }
167  }
168  } catch (const IOException& e) {
169  LogFile::error(e.what());
170  }
171  }
172 }
173 
174 void NSMCallback::vget(const std::string& nodename, const std::string& vname)
175 {
176  NSMNode node(nodename);
177  NSMVar var(vname);
178  try {
179  NSMVHandler* handler_p = getHandler_p(nodename, vname);
180  if (handler_p) {
181  NSMVHandler& handler(*handler_p);
182  handler.handleGet(var);
183  var.setNode(getNode().getName());
184  var.setName(vname);
185  //var.setId(i + 1);
186  var.setDate(Date());
187  NSMCommunicator::send(NSMMessage(node, var));
188  if (m_node_v_m.find(vname) == m_node_v_m.end()) {
189  m_node_v_m.insert(NSMNodeMapMap::value_type(vname, NSMNodeMap()));
190  }
191  NSMNodeMap& node_v(m_node_v_m[vname]);
192  if (node_v.find(nodename) == node_v.end()) {
193  node_v.insert(NSMNodeMap::value_type(nodename, NSMNode(nodename)));
194  std::string filename = ("/tmp/nsmvget." + StringUtil::tolower(getNode().getName()));
195  std::ofstream fout(filename.c_str(), std::ios::app);
196  fout << nodename << " " << vname << std::endl;
197  }
198  }
199  } catch (const NSMHandlerException& e) {
200  LogFile::error(e.what());
201  }
202 }
203 
204 void NSMCallback::vset(NSMCommunicator& com, const NSMVar& var)
205 {
206  try {
207  NSMMessage msg(com.getMessage());
208  NSMVHandler* handler_p = getHandler_p(var.getNode(), var.getName());
209  if (handler_p) {
210  NSMVHandler& handler(*handler_p);
211  bool result = false;
212  if (var.getName() == handler.getName() &&
213  (var.getNode() == handler.getNode() ||
214  (var.getNode().size() == 0 && handler.getNode() == getNode().getName()) ||
215  (handler.getNode().size() == 0 && var.getNode() == getNode().getName())) &&
216  handler.useSet()) {
217  NSMNode node(msg.getNodeName());
218  if ((result = handler.handleSet(var)) &&
219  (var.getNode().size() == 0 || var.getNode() == getNode().getName())) {
220  notify(var);
221  }
222  if (var.getNode().size() == 0) {
223  NSMCommunicator::send(NSMMessage(node, NSMCommand::VREPLY,
224  result, var.getName()));
225  }
226  }
227  }
228  } catch (const NSMHandlerException& e) {
229  LogFile::error(e.what());
230  }
231 }
232 
233 void NSMCallback::vlistget(NSMCommunicator& com)
234 {
235  std::stringstream ss;
236  int i = 0;
237  int count = 0;
238  for (NSMVHandlerList::iterator it = m_handler.begin();
239  it != m_handler.end(); it++) {
240  NSMVHandler& handler(*it->second);
241  if (handler.getNode().size() == 0) {
242  ss << handler.getName() << ":"
243  << handler.get().getTypeLabel() << ":"
244  << (int)handler.useGet() << ":"
245  << (int)handler.useSet() << ":"
246  << i << "\n";
247  count++;
248  }
249  i++;
250  }
251  std::string nodename = com.getMessage().getNodeName();
252  NSMNode node(nodename);
253  try {
254  NSMCommunicator::send(NSMMessage(node, NSMCommand::VLISTSET,
255  count, ss.str()));
256  } catch (const NSMHandlerException& e) {
257  LogFile::error(e.what());
258  }
259 }
260 
261 struct vlistentry_t {
262  std::string name;
263  int id;
264  std::string type;
265  bool useGet;
266  bool useSet;
267 };
268 
269 void NSMCallback::vlistset(NSMCommunicator& com)
270 {
271  std::string data = com.getMessage().getData();
272  StringList s = StringUtil::split(data, '\n');
273  std::vector<vlistentry_t> vlist;
274  size_t length = 0;
275  for (size_t i = 0; i < s.size(); i++) {
276  StringList ss = StringUtil::split(s[i], ':');
277  if (ss.size() > 4) {
278  vlistentry_t en = { ss[0], atoi(ss[4].c_str()),
279  ss[1], ss[2] == "1", ss[3] == "1"
280  };
281  vlist.push_back(en);
282  if (length < ss[0].size()) length = ss[0].size();
283  }
284  }
285  for (size_t i = 0; i < vlist.size(); i++) {
286  vlistentry_t& en(vlist[i]);
287  std::cout << StringUtil::form(StringUtil::form("%%-%ds ", length).c_str(), en.name.c_str())
288  << " : " << en.type << " "
289  << (en.useGet ? "get " : "")
290  << (en.useSet ? "set " : "") << std::endl;
291  }
292 }
293 
294 void NSMCallback::alloc_open(NSMCommunicator& com)
295 {
296  try {
297  if (!m_data.isAvailable() && m_data.getName().size() > 0 &&
298  m_data.getFormat().size() > 0 && m_data.getRevision() > 0) {
299  m_data.allocate(com);
300  }
301  } catch (const NSMHandlerException& e) {
302  LogFile::warning(e.what());
303  }
304  for (NSMDataMap::iterator it = m_datas.begin();
305  it != m_datas.end(); it++) {
306  NSMData& data(it->second);
307  try {
308  if (!data.isAvailable() && data.getName().size() > 0 &&
309  data.getFormat().size() > 0) {
310  data.open(com);
311  }
312  } catch (const NSMHandlerException& e) {
313  }
314  }
315 }
316 
Belle2::ObjectInfo::getName
TString getName(const TObject *obj)
human-readable name (e.g.
Definition: ObjectInfo.cc:38
Belle2::NSMVHandler
Definition: NSMVHandler.h:15
prepareAsicCrosstalkSimDB.e
e
aux.
Definition: prepareAsicCrosstalkSimDB.py:53
Belle2::DAQLogMessage
Definition: DAQLogMessage.h:16
Belle2::NSMNode
Definition: NSMNode.h:14
Belle2::IOException
Definition: IOException.h:12
Belle2::NSMData
Definition: NSMData.h:24
Belle2::AbstractNSMCallback
Definition: AbstractNSMCallback.h:22
Belle2::NSMCommunicator
Definition: NSMCommunicator.h:25
Belle2::NSMMessage
Definition: NSMMessage.h:29
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::NSMHandlerException
Definition: NSMHandlerException.h:12
alignment.constraints_generator.filename
filename
File name.
Definition: constraints_generator.py:224
Belle2::Date
Definition: Date.h:12
vlistentry_t
Definition: NSMCallback.cc:261
Belle2::NSMCommand
Definition: NSMCommand.h:12
Belle2::NSMVHandlerText
Definition: NSMVHandler.h:151
Belle2::NSMVar
Definition: NSMVar.h:16