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] )
29 for(
size_t s=0; s<src_cap; ++s )
30 for(
size_t t=0; t<tgt_cap; ++t )
36 , std::string
const & src
37 , std::string
const & tgt
38 , boost::smatch
const & what )
43 unsigned int result = 0x00;
46 if (!cond->per_source())
50 src_idx[global_s] = 0;
51 result |= SOURCE_CHANGE;
58 idx_t::const_iterator it = src_idx.find(src);
59 if (it == src_idx.end())
61 s_idx = src_idx.size();
62 src_idx.insert(std::make_pair(src, s_idx));
63 result |= SOURCE_CHANGE;
72 if (!cond->per_target())
76 tgt_idx[global_t] = 0;
77 result |= TARGET_CHANGE;
84 idx_t::const_iterator it = tgt_idx.find(tgt);
85 if (it == tgt_idx.end())
87 t_idx = tgt_idx.size();
88 tgt_idx.insert(std::make_pair(tgt, t_idx));
89 result |= TARGET_CHANGE;
100 if (s_idx >= src_cap)
102 src_cap += cap_increment;
106 if (t_idx >= tgt_cap)
108 tgt_cap += cap_increment;
114 hitmap.resize(boost::extents[src_cap][tgt_cap]);
118 return hitmap[s_idx][t_idx].hit(msg, what, *cond, s_idx, t_idx)
119 ? (result | STATUS_CHANGE) : (result) ;
123 ma_hitmap::event(
size_t src,
size_t tgt, time_t t)
125 return hitmap[src][tgt].event(t, *cond);
129 ma_hitmap::find_source(std::string
const & src)
131 idx_t::const_iterator it = src_idx.find(src);
132 if (it==src_idx.end())
return D_NIL;
133 else return it->second;
137 ma_hitmap::find_target(std::string
const & tgt)
139 idx_t::const_iterator it = tgt_idx.find(tgt);
140 if (it==tgt_idx.end())
return D_NIL;
141 else return it->second;
146 ma_hitmap::get_source( ma_cond_domain v )
const
149 assert( !src_idx.empty() );
151 if( idx==D_NIL )
throw std::runtime_error(
"get_source: nil idx");
152 if( idx==D_ANY )
return src_idx.begin()->first;
154 assert( (
unsigned)idx<src_idx.size() );
156 for(idx_t::const_iterator it = src_idx.begin(); it!=src_idx.end(); ++it)
157 if( (
unsigned)idx==it->second )
return it->first;
159 throw std::runtime_error(
"get_source: idx not found");
163 ma_hitmap::get_target( ma_cond_domain v )
const
166 assert( !tgt_idx.empty() );
168 if( idx==D_NIL )
throw std::runtime_error(
"get_target: nil idx");
169 if( idx==D_ANY )
return tgt_idx.begin()->first;
171 assert( (
unsigned)idx<tgt_idx.size() );
173 for(idx_t::const_iterator it = tgt_idx.begin(); it!=tgt_idx.end(); ++it)
174 if( (
unsigned)idx==it->second )
return it->first;
176 throw std::runtime_error(
"get_source: idx not found");
180 ma_hitmap::get_message( ma_cond_domain v )
const
182 assert( !src_idx.empty() );
183 assert( !tgt_idx.empty() );
185 if( v.first==D_NIL || v.second==D_NIL )
186 throw std::runtime_error(
"get_message: nil idx");
188 v.first = (v.first==D_ANY) ? 0 : v.first;
189 v.second = (v.second==D_ANY) ? 0 : v.second;
191 return hitmap[v.first][v.second].get_latest_message();
195 ma_hitmap::get_message_group( ma_cond_domain v,
size_t g )
const
197 assert( !src_idx.empty() );
198 assert( !tgt_idx.empty() );
200 if( v.first==D_NIL || v.second==D_NIL )
201 throw std::runtime_error(
"get_message: nil idx");
203 v.first = (v.first==D_ANY) ? 0 : v.first;
204 v.second = (v.second==D_ANY) ? 0 : v.second;
206 return hitmap[v.first][v.second].get_message_group(g);
212 ma_hitmap::get_status( ma_cond_domain v )
const
214 bool r = hitmap[v.first][v.second].is_on();
216 TLOG(TLVL_DEBUG) <<
"hitmap::get_status @ "
217 << v.first <<
", " << v.second <<
" = " << r;
222 ma_hitmap::get_alarm_count( ma_cond_domain v, arg_t arg )
const
224 ma_cond_range src, tgt;
225 get_cond_range( v, src, tgt );
230 for(
int s=src.first; s<=src.second; ++s)
231 for(
int t=tgt.first; t<=tgt.second; ++t)
232 count += hitmap[s][t].get_message_count();
234 else if( arg == SOURCE )
236 for(
int s=src.first; s<=src.second; ++s)
237 for(
int t=tgt.first; t<=tgt.second; ++t)
238 if( hitmap[s][t].is_on() ) { ++count;
break; }
242 for(
int t=tgt.first; t<=tgt.second; ++t)
243 for(
int s=src.first; s<=src.second; ++s)
244 if( hitmap[s][t].is_on() ) { ++count;
break; }
252 ma_hitmap::get_cond_range( ma_cond_domain d
253 , ma_cond_range & src
254 , 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) src.first = 0, src.second = src_idx.size()-1;
260 else src.first = d.first, src.second = d.first;
262 if (d.second==D_ANY) tgt.first = 0, tgt.second = tgt_idx.size()-1;
263 else tgt.first = d.second, tgt.second = d.second;
269 ma_hitmap::get_domain_view( ma_cond_domain
const & d )
271 if (domain_is_null(d))
272 throw std::runtime_error(
"get_domain_view: null domain");
274 return hitmap[ boost::indices [d.first ==D_ANY ? range() : range(d.first) ]
275 [d.second==D_ANY ? range() : range(d.second)] ];
Qt wrapper around MessageFacility message