2 #include "ErrorHandler/MessageAnalyzer/ma_hitmap.h"
3 #include "ErrorHandler/MessageAnalyzer/ma_condition.h"
5 using namespace novadaq::errorhandler;
7 const std::string ma_hitmap::global_s =
"__S_GLOBAL__";
8 const std::string ma_hitmap::global_t =
"__T_GLOBAL__";
10 const size_t ma_hitmap::cap_increment = 20;
12 ma_hitmap::ma_hitmap()
18 , hitmap(boost::extents[src_cap][tgt_cap])
22 void ma_hitmap::reset()
27 for (
size_t s = 0; s < src_cap; ++s)
28 for (
size_t t = 0; t < tgt_cap; ++t)
33 ma_hitmap::capture(
qt_mf_msg const& msg, std::string
const& src, std::string
const& tgt, boost::smatch
const& what)
38 unsigned int result = 0x00;
41 if (!cond->per_source())
45 src_idx[global_s] = 0;
46 result |= SOURCE_CHANGE;
53 idx_t::const_iterator it = src_idx.find(src);
54 if (it == src_idx.end())
56 s_idx = src_idx.size();
57 src_idx.insert(std::make_pair(src, s_idx));
58 result |= SOURCE_CHANGE;
67 if (!cond->per_target())
71 tgt_idx[global_t] = 0;
72 result |= TARGET_CHANGE;
79 idx_t::const_iterator it = tgt_idx.find(tgt);
80 if (it == tgt_idx.end())
82 t_idx = tgt_idx.size();
83 tgt_idx.insert(std::make_pair(tgt, t_idx));
84 result |= TARGET_CHANGE;
97 src_cap += cap_increment;
101 if (t_idx >= tgt_cap)
103 tgt_cap += cap_increment;
109 hitmap.resize(boost::extents[src_cap][tgt_cap]);
113 return hitmap[s_idx][t_idx].hit(msg, what, *cond, s_idx, t_idx)
114 ? (result | STATUS_CHANGE)
118 bool ma_hitmap::event(
size_t src,
size_t tgt, time_t t)
120 return hitmap[src][tgt].event(t, *cond);
123 int ma_hitmap::find_source(std::string
const& src)
125 idx_t::const_iterator it = src_idx.find(src);
126 if (it == src_idx.end())
132 int ma_hitmap::find_target(std::string
const& tgt)
134 idx_t::const_iterator it = tgt_idx.find(tgt);
135 if (it == tgt_idx.end())
143 ma_hitmap::get_source(ma_cond_domain v)
const
146 assert(!src_idx.empty());
148 if (idx == D_NIL)
throw std::runtime_error(
"get_source: nil idx");
149 if (idx == D_ANY)
return src_idx.begin()->first;
151 assert((
unsigned)idx < src_idx.size());
153 for (idx_t::const_iterator it = src_idx.begin(); it != src_idx.end(); ++it)
154 if ((
unsigned)idx == it->second)
return it->first;
156 throw std::runtime_error(
"get_source: idx not found");
160 ma_hitmap::get_target(ma_cond_domain v)
const
163 assert(!tgt_idx.empty());
165 if (idx == D_NIL)
throw std::runtime_error(
"get_target: nil idx");
166 if (idx == D_ANY)
return tgt_idx.begin()->first;
168 assert((
unsigned)idx < tgt_idx.size());
170 for (idx_t::const_iterator it = tgt_idx.begin(); it != tgt_idx.end(); ++it)
171 if ((
unsigned)idx == it->second)
return it->first;
173 throw std::runtime_error(
"get_source: idx not found");
177 ma_hitmap::get_message(ma_cond_domain v)
const
179 assert(!src_idx.empty());
180 assert(!tgt_idx.empty());
182 if (v.first == D_NIL || v.second == D_NIL)
183 throw std::runtime_error(
"get_message: nil idx");
185 v.first = (v.first == D_ANY) ? 0 : v.first;
186 v.second = (v.second == D_ANY) ? 0 : v.second;
188 return hitmap[v.first][v.second].get_latest_message();
192 ma_hitmap::get_message_group(ma_cond_domain v,
size_t g)
const
194 assert(!src_idx.empty());
195 assert(!tgt_idx.empty());
197 if (v.first == D_NIL || v.second == D_NIL)
198 throw std::runtime_error(
"get_message: nil idx");
200 v.first = (v.first == D_ANY) ? 0 : v.first;
201 v.second = (v.second == D_ANY) ? 0 : v.second;
203 return hitmap[v.first][v.second].get_message_group(g);
207 bool ma_hitmap::get_status(ma_cond_domain v)
const
209 bool r = hitmap[v.first][v.second].is_on();
211 TLOG(TLVL_DEBUG) <<
"hitmap::get_status @ "
212 << v.first <<
", " << v.second <<
" = " << r;
216 int ma_hitmap::get_alarm_count(ma_cond_domain v, arg_t arg)
const
218 ma_cond_range src, tgt;
219 get_cond_range(v, src, tgt);
225 for (
int s = src.first; s <= src.second; ++s)
226 for (
int t = tgt.first; t <= tgt.second; ++t)
227 count += hitmap[s][t].get_message_count();
229 else if (arg == SOURCE)
231 for (
int s = src.first; s <= src.second; ++s)
232 for (
int t = tgt.first; t <= tgt.second; ++t)
233 if (hitmap[s][t].is_on())
241 for (
int t = tgt.first; t <= tgt.second; ++t)
242 for (
int s = src.first; s <= src.second; ++s)
243 if (hitmap[s][t].is_on())
254 void ma_hitmap::get_cond_range(ma_cond_domain d, ma_cond_range& src, ma_cond_range& tgt)
const
256 if (domain_is_null(d))
257 throw std::runtime_error(
"get_cond_range: NIL domain");
259 if (d.first == D_ANY)
260 src.first = 0, src.second = src_idx.size() - 1;
262 src.first = d.first, src.second = d.first;
264 if (d.second == D_ANY)
265 tgt.first = 0, tgt.second = tgt_idx.size() - 1;
267 tgt.first = d.second, tgt.second = d.second;
272 ma_hitmap::get_domain_view(ma_cond_domain
const& d)
274 if (domain_is_null(d))
275 throw std::runtime_error(
"get_domain_view: null domain");
277 return hitmap[boost::indices[d.first == D_ANY ? range() : range(d.first)]
278 [d.second == D_ANY ? range() : range(d.second)]];
Qt wrapper around MessageFacility message