1 #include "daq/slc/nsm/NSMCallback.h"
3 #include "daq/slc/system/LogFile.h"
5 #include "daq/slc/nsm/NSMCommunicator.h"
6 #include "daq/slc/nsm/NSMHandlerException.h"
8 #include "daq/slc/version/Version.h"
17 NSMCallback::NSMCallback(
const int timeout)
21 reg(NSMCommand::ERROR);
23 reg(NSMCommand::VGET);
24 reg(NSMCommand::VSET);
25 reg(NSMCommand::VREPLY);
26 reg(NSMCommand::VLISTGET);
27 reg(NSMCommand::VLISTSET);
33 int NSMCallback::reset()
35 int revision = Callback::reset();
42 int NSMCallback::addDefaultHandlers()
44 return add(
new NSMVHandlerText(
"version",
true,
false, DAQ_SLC_VERSION::DAQ_SLC_VERSION),
false,
true);
47 void NSMCallback::addNode(
const NSMNode& node)
49 std::string name = node.getName();
50 if (m_nodes.find(name) == m_nodes.end()) {
51 m_nodes.insert(NSMNodeMap::value_type(name, node));
58 for (NSMNodeMap::iterator it = m_nodes.begin();
59 it != m_nodes.end();) {
61 msg_out.setNodeName(node.getName());
62 if (NSMCommunicator::send(msg_out)) {
70 void NSMCallback::log(LogFile::Priority pri,
const char* format, ...)
75 vsnprintf(ss,
sizeof(ss), format, ap);
77 log(pri, std::string(ss));
80 void NSMCallback::log(LogFile::Priority pri,
const std::string& msg)
82 LogFile::put(pri, msg);
84 if (getLogNode().
getName().size() > 0) {
87 pri, getCategory(), msg)));
90 LogFile::error(
e.what());
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());
110 }
else if (cmd == NSMCommand::LOG) {
111 int id = com.getNodeIdByName(msg.getNodeName());
114 lmsg.setNodeName(msg.getNodeName());
115 if (msg.getNParams() > 0) {
116 lmsg.setPriority((LogFile::Priority)msg.getParam(0));
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() :
"");
123 }
else if (cmd == NSMCommand::VGET) {
124 if (msg.getLength() > 0) {
125 vget(msg.getNodeName(), msg.getData());
128 }
else if (cmd == NSMCommand::VSET) {
129 if (msg.getLength() > 0) {
135 }
else if (cmd == NSMCommand::VREPLY) {
136 vreply(com, msg.getData(), msg.getParam(0));
138 }
else if (cmd == NSMCommand::VLISTGET) {
141 }
else if (cmd == NSMCommand::VLISTSET) {
148 void NSMCallback::notify(
const NSMVar& var)
150 std::string vname = var.getName();
152 if (var_out.getNode().size() == 0) {
153 var_out.setNode(getNode().
getName());
156 if (m_node_v_m.find(vname) != m_node_v_m.end()) {
158 NSMNodeMap& node_v(m_node_v_m[vname]);
159 for (NSMNodeMap::iterator inode = node_v.begin();
160 inode != node_v.end();) {
162 if (NSMCommunicator::send(
NSMMessage(node, var_out))) {
165 node_v.erase(inode++);
169 LogFile::error(
e.what());
174 void NSMCallback::vget(
const std::string& nodename,
const std::string& vname)
179 NSMVHandler* handler_p = getHandler_p(nodename, vname);
182 handler.handleGet(var);
183 var.setNode(getNode().
getName());
188 if (m_node_v_m.find(vname) == m_node_v_m.end()) {
189 m_node_v_m.insert(NSMNodeMapMap::value_type(vname, NSMNodeMap()));
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;
200 LogFile::error(
e.what());
208 NSMVHandler* handler_p = getHandler_p(var.getNode(), var.getName());
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())) &&
217 NSMNode node(msg.getNodeName());
218 if ((result = handler.handleSet(var)) &&
219 (var.getNode().size() == 0 || var.getNode() == getNode().
getName())) {
222 if (var.getNode().size() == 0) {
223 NSMCommunicator::send(
NSMMessage(node, NSMCommand::VREPLY,
224 result, var.getName()));
229 LogFile::error(
e.what());
235 std::stringstream ss;
238 for (NSMVHandlerList::iterator it = m_handler.begin();
239 it != m_handler.end(); it++) {
241 if (handler.getNode().size() == 0) {
242 ss << handler.getName() <<
":"
243 << handler.get().getTypeLabel() <<
":"
244 << (int)handler.useGet() <<
":"
245 << (int)handler.useSet() <<
":"
251 std::string nodename = com.getMessage().getNodeName();
254 NSMCommunicator::send(
NSMMessage(node, NSMCommand::VLISTSET,
257 LogFile::error(
e.what());
271 std::string data = com.getMessage().getData();
272 StringList s = StringUtil::split(data,
'\n');
273 std::vector<vlistentry_t> vlist;
275 for (
size_t i = 0; i < s.size(); i++) {
276 StringList ss = StringUtil::split(s[i],
':');
279 ss[1], ss[2] ==
"1", ss[3] ==
"1"
282 if (length < ss[0].size()) length = ss[0].size();
285 for (
size_t i = 0; i < vlist.size(); 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;
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);
302 LogFile::warning(
e.what());
304 for (NSMDataMap::iterator it = m_datas.begin();
305 it != m_datas.end(); it++) {
308 if (!data.isAvailable() && data.getName().size() > 0 &&
309 data.getFormat().size() > 0) {