← Documentation
ADS-IDAC Engine 5.0.0
MRAlarmUnit.cpp
Go to the documentation of this file.
1// MRAlarmUnit.cpp: implementation of the MRAlarmUnit class.
2//
4
5#include <string>
6#include <sstream>
7#include <iostream>
8#include <fstream>
9
10#include "MRAlarmUnit.h"
11#include "SentenceUnit.h"
12#include "../Crew/OperatorDM.h"
13#include "../Crew/OperatorAT.h"
14#include "ReasonMachine.h"
15#include "Statement.h"
16#include "../Global/SimulationContext.h"
17
18using namespace std;
19
21// Construction/Destruction
23
25{
26 this->m_ID_Type = 203;
27 this->m_recent_state_statement = NULL;
28 this->m_recent_action_statement = NULL;
29 this->m_Concept_pt = NULL;
30
31 this->m_Concept_ID = "";
34 //201--MRParameterUnit
35 //202--MRComponentStateUnit
36 //203--MRAlarmUnit
37}
38
40{
41 this->m_history_state_list.clear();
42}
43
44void MRAlarmUnit::AddNewAlarmState(int _state, int _operator, bool _expecting)
45{
46 Statement * statement_pt;
47 SentenceUnit * sent_pt;
48 SentenceUnit * found_sent_pt;
49 ReasonMachine * RM_pt;
50 string prompt, str;
51
52 bool New_Statement_bl = false;
53
54 if (_operator == sim::Operator::ODM)
55 {RM_pt = g_sim.Decision_Maker.m_RM.get();}
56 else if (_operator == sim::Operator::OAT)
57 {RM_pt = g_sim.Action_Taker.m_RM.get();}
58 else
59 {}//add error message
60
61 bool state_bl;
62 if (_state == sim::State::On || _state==sim::State::Open)
63 {
64 state_bl = true;
65 str = "ON";
66 }
67 else if(_state == sim::State::Off || _state == sim::State::Close)
68 {
69 state_bl = false;
70 str = "OFF";
71 }
72 else {}//error message
73
74
75 prompt = "Received new reading of ";
76 prompt += this->m_alarm_indicator_name;
77 prompt += ": ";
78 prompt += str;
79 this->PrintMessage(prompt);
80
81 RM_pt->AddDeltaToCognitiveLoad(0.024);
82 if(this->m_recent_state != NULL)
83 {
84 if (state_bl != this->m_recent_state->m_perceived_state)
85 {
86 // there is a change
87 New_Statement_bl = true;
88 if(state_bl == true)
89 {
90 //add one statement to say "xxxAlamr turn_on")
91 SentenceUnit sent;
92 sent.m_sentence_type = 1;
93 sent.m_subject_pt = this->m_Concept_pt;
94 sent.m_process_pt = RM_pt->m_Concept_Base->getTurnOnPt();
95 found_sent_pt = RM_pt->CheckExistInSemanticPoolBySentence(&sent);
96 }
97 else
98 {
99 //add one statement to say "xxxAlarm turn_off"
100 SentenceUnit sent;
101 sent.m_sentence_type = 1;
102 sent.m_subject_pt = this->m_Concept_pt;
103 sent.m_process_pt = RM_pt->m_Concept_Base->getTurnOffPt();
104 found_sent_pt = RM_pt->CheckExistInSemanticPoolBySentence(&sent);
105 }
106 if(found_sent_pt != 0)
107 {
108 auto stmt = make_unique<Statement>();
109 stmt->m_confidence = 1;
110 stmt->m_factual_type = 1;
111 stmt->m_sent_pt = found_sent_pt;
112 stmt->m_state = true;
113 stmt->m_time_generated = r5pars_.timesno;
114 if(_expecting == 0)
115 {
116 stmt->m_time_range.m_end_time = r5pars_.timesno;
117 stmt->m_time_range.m_start_time = r5pars_.timesno;
118 }
119 else
120 {
121 stmt->m_time_range.m_time_after = this->m_recent_state->m_time_perceived;
122 stmt->m_time_range.m_time_before = r5pars_.timesno;
123 }
124 statement_pt = stmt.get();
125 RM_pt->AddANewStatement(stmt.release());
126 RM_pt->AddDeltaToSystemDynamics(0.12);
127 this->m_recent_action_statement = statement_pt;
128
129 if(_expecting == true)
130 {
132 if(check_sent_pt->m_sentence_type == statement_pt->m_sent_pt->m_sentence_type)
133 {
134 RM_pt->m_working_on_invest_pt->m_Statement_pt = statement_pt;
135 RM_pt->AddDeltaToCognitiveLoad(0.024);
136 statement_pt->m_investigator_ID_pt = (IDElement*)(RM_pt->m_working_on_invest_pt);
137 }
138 }
139
140 //RM_pt->MakeOneStepInferenceFromAStatement(statement_pt);
141 /*
142 //Add an investigator for this statement
143 if(statement_pt->m_investigator_ID_pt == NULL)
144 {
145 invest_pt = new Investigator();
146 invest_pt->m_motivation = 1;
147 invest_pt->m_Statement_pt = statement_pt;
148 invest_pt->m_Happen = 3;
149 invest_pt->m_operator = this->m_operator;
150 RM_pt->AddNewInvestigator(invest_pt);
151 //link the statement to the statement pointer
152 statement_pt->m_investigator_ID_pt = (IDElement*)invest_pt;
153 }
154 */
155 }
156 else
157 {}//warning message
158 }
159 else
160 {
161 // it is the same state as received last time
162 New_Statement_bl = false;
165 }
166 }
167 else
168 {
169 New_Statement_bl = true;
170 }
171 if(New_Statement_bl == true)
172 {
173 if(state_bl == true)
174 {
175 //add on statement to say "xxxAlarm is on"
176 SentenceUnit sent;
177 sent.m_sentence_type = 2;
178 sent.m_subject_pt = this->m_Concept_pt;
179 sent.m_state_pt = RM_pt->m_Concept_Base->getONpt();
180 found_sent_pt = RM_pt->CheckExistInSemanticPoolBySentence(&sent);
181 }
182 else
183 {
184 //add on statement to say "xxxAlarm is off"
185 SentenceUnit sent;
186 sent.m_sentence_type = 2;
187 sent.m_subject_pt = this->m_Concept_pt;
188 sent.m_state_pt = RM_pt->m_Concept_Base->getOFFpt();
189 found_sent_pt = RM_pt->CheckExistInSemanticPoolBySentence(&sent);
190 }
191 if(found_sent_pt != 0)
192 {
193 auto stmt = make_unique<Statement>();
194 stmt->m_confidence = 1;
195 stmt->m_factual_type = 1;
196 stmt->m_sent_pt = found_sent_pt;
197 stmt->m_state = true;
198 stmt->m_time_generated = r5pars_.timesno;
199 stmt->m_time_range.m_start_time = r5pars_.timesno;
200 stmt->m_time_range.m_end_time = r5pars_.timesno;
201 statement_pt = stmt.get();
202 RM_pt->AddANewStatement(stmt.release());
203 this->m_recent_state_statement = statement_pt;
204 statement_pt->m_tbi_bl = false;
205
206 //RM_pt->MakeOneStepInferenceFromAStatement(statement_pt);
207 }
208 else
209 {}//warning
210 }
211 if(this->m_recent_state)
212 {this->m_history_state_list.push_back(std::move(this->m_recent_state));}
213 this->m_recent_state = make_unique<MRStateSchema>();
214 this->m_recent_state->m_perceived_state = state_bl;
215 this->m_recent_state->m_time_perceived = r5pars_.timesno;
216}
217
219{
220 float timer = 0.5;
221 Operator * operator_pt;
222 switch (this->m_operator)
223 {
225 operator_pt = &g_sim.Action_Taker;
226 break;
228 operator_pt = &g_sim.Decision_Maker;
229 break;
230 default:
231 break;
232 //error message
233 }
234 //be careful, verify an uninitiated string varible is ""
235 operator_pt->ActiveFetchAlarmStateInfo(this->m_alarm_indicator_name, _timer);
236}
237
239{
240 Statement * statement_pt;
241 SentenceUnit * sent_pt;
242 SentenceUnit * found_sent_pt;
243 ReasonMachine * RM_pt;
244 string prompt, str;
245
246 bool New_Statement_bl = false;
247
248 if (_operator == sim::Operator::ODM)
249 {RM_pt = g_sim.Decision_Maker.m_RM.get();}
250 else if (_operator == sim::Operator::OAT)
251 {RM_pt = g_sim.Action_Taker.m_RM.get();}
252 else
253 {}//add error message
254
255 bool state_bl;
256 if (_state == sim::State::On || _state==sim::State::Open)
257 {
258 state_bl = true;
259 str = "ON";
260 }
261 else if(_state == sim::State::Off || _state == sim::State::Close)
262 {
263 state_bl = false;
264 str = "OFF";
265 }
266 else {}//error message
267
268 prompt = "Received new reading of ";
269 prompt += this->m_alarm_indicator_name;
270 prompt += ": ";
271 prompt += str;
272 this->PrintMessage(prompt);
273
274 if(this->m_recent_state != NULL)
275 {
276 if (state_bl != this->m_recent_state->m_perceived_state)
277 {
278 // there is a change
279 New_Statement_bl = true;
280 if(state_bl == true)
281 {
282 //add one statement to say "xxxAlamr turn_on")
283 SentenceUnit sent;
284 sent.m_sentence_type = 1;
285 sent.m_subject_pt = this->m_Concept_pt;
286 sent.m_process_pt = RM_pt->m_Concept_Base->getTurnOnPt();
287 found_sent_pt = RM_pt->CheckExistInSemanticPoolBySentence(&sent);
288 }
289 else
290 {
291 //add one statement to say "xxxAlarm turn_off"
292 SentenceUnit sent;
293 sent.m_sentence_type = 1;
294 sent.m_subject_pt = this->m_Concept_pt;
295 sent.m_process_pt = RM_pt->m_Concept_Base->getTurnOffPt();
296 found_sent_pt = RM_pt->CheckExistInSemanticPoolBySentence(&sent);
297 }
298 if(found_sent_pt != 0)
299 {
300 auto stmt = make_unique<Statement>();
301 stmt->m_confidence = 1;
302 stmt->m_factual_type = 1;
303 stmt->m_sent_pt = found_sent_pt;
304 stmt->m_state = true;
305 stmt->m_time_generated = r5pars_.timesno;
306 stmt->m_time_range.m_time_after = this->m_recent_state->m_time_perceived;
307 stmt->m_time_range.m_time_before = r5pars_.timesno;
308 statement_pt = stmt.get();
309 RM_pt->AddANewStatement(stmt.release());
310 this->m_recent_action_statement = statement_pt;
311 }
312 else
313 {}//warning message
314 }
315 else
316 {
317 // it is the same state as received last time
318 New_Statement_bl = false;
321 }
322 }
323 else
324 {
325 New_Statement_bl = true;
326 }
327 if(New_Statement_bl == true)
328 {
329 if(state_bl == true)
330 {
331 //add on statement to say "xxxAlarm is on"
332 SentenceUnit sent;
333 sent.m_sentence_type = 2;
334 sent.m_subject_pt = this->m_Concept_pt;
335 sent.m_state_pt = RM_pt->m_Concept_Base->getONpt();
336 found_sent_pt = RM_pt->CheckExistInSemanticPoolBySentence(&sent);
337 }
338 else
339 {
340 //add on statement to say "xxxAlarm is off"
341 SentenceUnit sent;
342 sent.m_sentence_type = 2;
343 sent.m_subject_pt = this->m_Concept_pt;
344 sent.m_state_pt = RM_pt->m_Concept_Base->getOFFpt();
345 found_sent_pt = RM_pt->CheckExistInSemanticPoolBySentence(&sent);
346 }
347 if(found_sent_pt != 0)
348 {
349 auto stmt = make_unique<Statement>();
350 stmt->m_confidence = 1;
351 stmt->m_factual_type = 1;
352 stmt->m_sent_pt = found_sent_pt;
353 stmt->m_state = true;
354 stmt->m_time_generated = r5pars_.timesno;
355 stmt->m_time_range.m_start_time = r5pars_.timesno;
356 stmt->m_time_range.m_end_time = r5pars_.timesno;
357 statement_pt = stmt.get();
358 RM_pt->AddANewStatement(stmt.release());
359 this->m_recent_state_statement = statement_pt;
360 statement_pt->m_tbi_bl = false;
361 }
362 else
363 {}//warning
364 }
365 if(this->m_recent_state)
366 {this->m_history_state_list.push_back(std::move(this->m_recent_state));}
367 this->m_recent_state = make_unique<MRStateSchema>();
368 this->m_recent_state->m_perceived_state = state_bl;
369 this->m_recent_state->m_time_perceived = r5pars_.timesno;
370}
371
373{
374 cout << "Time: " << r5pars_.timesno << ": " << str << '\n';
375
376 //test
377 ofstream fout("RMI.txt", ios::app);
378 fout << "Time: " << r5pars_.timesno << ": " << str << '\n';
379 fout.close();
380}
381
383{
384 MRStateSchema * found_state_schema_pt = NULL;
385 if(this->m_recent_state->m_time_perceived >= _start && this->m_recent_state->m_time_perceived <= _end)
386 {
387 found_state_schema_pt = this->m_recent_state.get();
388 return found_state_schema_pt;
389 }
390 else if(this->m_recent_state->m_time_perceived > _end)
391 {
392 for(auto &e : this->m_history_state_list)
393 {
394 if(e->m_time_perceived >= _start && e->m_time_perceived <= _end)
395 {
396 found_state_schema_pt = e.get();
397 }
398 }
399 }
400 return found_state_schema_pt;
401
402}
403
405{
406 MRStateSchema * found_state_schema_pt = NULL;
407
408 if(this->m_recent_state == NULL)
409 {return NULL;}
410
411 if(this->m_recent_state->m_time_perceived < _start)
412 {
413 found_state_schema_pt = this->m_recent_state.get();
414 return found_state_schema_pt;
415 }
416 else
417 {
418 for(auto ritr = this->m_history_state_list.rbegin(); ritr != this->m_history_state_list.rend(); ++ritr)
419 {
420 if((*ritr)->m_time_perceived < _start)
421 {
422 found_state_schema_pt = ritr->get();
423 return found_state_schema_pt;
424 }
425 }
426 }
427 return found_state_schema_pt;
428}
429
431{
432 MRStateSchema * found_state_schema_pt = NULL;
433
434 for(auto &e : this->m_history_state_list)
435 {
436 if(e->m_time_perceived > _end)
437 {
438 found_state_schema_pt = e.get();
439 return found_state_schema_pt;
440 }
441 }
442
443 if(this->m_recent_state != NULL)
444 {
445 if(this->m_recent_state->m_time_perceived > _end)
446 {
447 found_state_schema_pt = this->m_recent_state.get();
448 }
449 }
450 return found_state_schema_pt;
451}
452
454{
455 if(this->m_Concept_ID.compare("") != 0)
456 {
457 if(this->m_Concept_pt != NULL)
458 {
459 this->m_Concept_ID = this->m_Concept_pt->m_ID;
460 }
461 }
462}
463
465{
467 this->m_operator = _a_pt->m_operator;
469
470 //
471 if(_a_pt->m_Concept_pt != NULL)
472 {this->m_Concept_ID = _a_pt->m_Concept_pt->m_ID;}
473 else
474 {this->m_Concept_ID = _a_pt->m_Concept_ID;}
475
476 //
477 if(_a_pt->m_recent_action_statement != NULL)
479 else
481
482 if(_a_pt->m_recent_state_statement != NULL)
484 else
486
487 //recent state
488 if(_a_pt->m_recent_state)
489 {
490 this->m_recent_state = make_unique<MRStateSchema>();
491 this->m_recent_state->CopyStateSchemaFromAnother(_a_pt->m_recent_state.get());
492 }
493 //history
494 if(this->m_history_state_list.size() != 0)
495 {
496 this->ErrorMessage("this->m_history_state_list.size()");
497 return;
498 }
499 for(auto &e : _a_pt->m_history_state_list)
500 {
501 auto state_pt = make_unique<MRStateSchema>();
502 state_pt->CopyStateSchemaFromAnother(e.get());
503 this->m_history_state_list.push_back(std::move(state_pt));
504 }
505
506}
507
509{
510 cout << r5pars_.timesno << " " << str << " in MRAlarmUnit.cpp" << '\n';
511 ofstream fout("err messages.txt", ios::app);
512 fout << r5pars_.timesno << " " << str << '\n';
513 fout.close();
514 //r5pars_.terminateall = true;
515}
516
518{
519 ReasonMachine * RM_pt;
520 RM_pt = (ReasonMachine *)_pt;
521/*
522 MRStateSchema * m_recent_state;
523 vector<MRStateSchema *> m_history_state_list;
524 Statement * m_recent_state_statement;
525 Statement * m_recent_action_statement;
526 IDElement * m_Concept_pt;
527
528 string m_Concept_ID;
529 string m_ID_recent_state_statement;
530 string m_ID_recent_action_statement;
531*/
532 if(this->m_Concept_ID.compare("") != 0)
533 {
534 this->m_Concept_pt = RM_pt->m_Concept_Base->FindConceptByID(this->m_Concept_ID);
535 if(this->m_Concept_pt == NULL)
536 {this->ErrorMessage("can not find the concept for this MRA " + this->m_Concept_ID); return;}
537 }
538
539 if(this->m_ID_recent_action_statement.compare("") != 0)
540 {
542 if(this->m_recent_action_statement == NULL)
543 {this->ErrorMessage("could not find the statement " + this->m_ID_recent_action_statement); return;}
544 }
546
547 if(this->m_ID_recent_state_statement.compare("") != 0)
548 {
550 if(this->m_recent_state_statement == NULL)
551 {this->ErrorMessage("could not find the statement " + this->m_ID_recent_state_statement ); return;}
552 }
554}
555
556//DEL void MRAlarmUnit::BuildConnectionsForThisMRAlarm(void *)
557//DEL {
558//DEL
559//DEL }
Diagnostic reasoning engine — knowledge representation, mental model, and inference.
SimulationContext g_sim
Global simulation context: the single instance, defined in SimulationContext.cpp.
document e
void CopyIDElementToRestartInfo(IDElement *)
Definition: IDElement.cpp:23
int m_ID_Type
Definition: IDElement.h:15
std::string m_ID
Definition: IDElement.h:16
SentenceUnit * GetSemanticSentenceOfThisInvestigator()
Statement * m_Statement_pt
Definition: Investigator.h:130
MRStateSchema * CheckFirstAlarmStateAfterATime(float _end)
MRStateSchema * CheckLastAlarmStateBeforeATime(float _start)
int m_operator
Definition: MRAlarmUnit.h:32
void BuildConnectionsForThisMRAlarmUnit(void *)
void ReadAlarmIndication(double)
void PrintMessage(std::string)
IDElement * m_Concept_pt
Definition: MRAlarmUnit.h:39
std::string m_ID_recent_action_statement
Definition: MRAlarmUnit.h:43
void ErrorMessage(std::string)
void CopyMRAlarmUnitInfoFromAnother(MRAlarmUnit *)
std::vector< std::unique_ptr< MRStateSchema > > m_history_state_list
Definition: MRAlarmUnit.h:35
Statement * m_recent_state_statement
Definition: MRAlarmUnit.h:37
void AddNewAlarmState(int, int, bool)
Definition: MRAlarmUnit.cpp:44
MRStateSchema * CheckAlarmStateWithinTimeRange(float _start, float _end)
std::string m_alarm_indicator_name
Definition: MRAlarmUnit.h:31
Statement * m_recent_action_statement
Definition: MRAlarmUnit.h:38
void ConvertStaticInfoToString()
std::unique_ptr< MRStateSchema > m_recent_state
Definition: MRAlarmUnit.h:34
std::string m_Concept_ID
Definition: MRAlarmUnit.h:41
void AddNewAlarmStateForFirstRoundCheck(int, int)
std::string m_ID_recent_state_statement
Definition: MRAlarmUnit.h:42
virtual ~MRAlarmUnit()
Definition: MRAlarmUnit.cpp:39
std::unique_ptr< ReasonMachine > m_RM
Definition: Operator.h:55
void ActiveFetchAlarmStateInfo(std::string, int)
Definition: Operator.cpp:1494
std::unique_ptr< KBConcept > m_Concept_Base
void ActivationUpdateByRefreshAStatement(Statement *)
Investigator * m_working_on_invest_pt
void AddDeltaToCognitiveLoad(float)
void AddANewStatement(Statement *)
Statement * FindStatementByID(std::string)
SentenceUnit * CheckExistInSemanticPoolBySentence(SentenceUnit *)
void AddDeltaToSystemDynamics(float)
IDElement * m_process_pt
Definition: SentenceUnit.h:38
int m_sentence_type
Definition: SentenceUnit.h:34
IDElement * m_state_pt
Definition: SentenceUnit.h:36
IDElement * m_subject_pt
Definition: SentenceUnit.h:40
bool m_tbi_bl
Definition: Statement.h:39
SentenceUnit * m_sent_pt
Definition: Statement.h:43
void RefreshStatementEndTimeToCurrentTime(int)
Definition: Statement.cpp:73
IDElement * m_investigator_ID_pt
Definition: Statement.h:42
struct @0 r5pars_
constexpr int ODM
Definition: SimConstants.h:145
constexpr int OAT
Definition: SimConstants.h:144
constexpr int On
Definition: SimConstants.h:105
constexpr int Off
Definition: SimConstants.h:106
constexpr int Open
Definition: SimConstants.h:116
constexpr int Close
Definition: SimConstants.h:117
OperatorAT Action_Taker
Crew action execution model.
OperatorDM Decision_Maker
Crew decision-making model.