Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F19840667
statehandlerutils.h
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Size
12 KB
Referenced Files
None
Subscribers
None
statehandlerutils.h
View Options
#ifndef STATEHANDLERUTILS_H
#define STATEHANDLERUTILS_H
#include
"rosa/agent/Abstraction.hpp"
#include
"rosa/agent/Confidence.hpp"
#include
"rosa/agent/FunctionAbstractions.hpp"
#include
<functional>
#include
<iostream>
#include
<tuple>
#include
<vector>
#include
"rosa/config/version.h"
#include
"rosa/agent/SignalStateDetector.hpp"
#include
"rosa/agent/SystemStateDetector.hpp"
#include
"rosa/deluxe/DeluxeContext.hpp"
#include
"rosa/support/csv/CSVReader.hpp"
#include
"rosa/support/csv/CSVWriter.hpp"
#include
<fstream>
#include
<limits>
#include
<memory>
#include
<streambuf>
using
namespace
rosa
;
using
namespace
rosa
::
agent
;
using
namespace
rosa
::
deluxe
;
using
namespace
rosa
::
terminal
;
// Signal State
using
SignalStateTuple
=
DeluxeTuple
<
float
,
uint32_t
,
uint8_t
,
float
,
float
,
float
,
float
,
float
,
float
,
uint8_t
,
uint32_t
,
uint8_t
>
;
AgentHandle
createSignalStateDetectorAgent
(
std
::
unique_ptr
<
DeluxeContext
>
&
C
,
const
std
::
string
&
Name
,
std
::
shared_ptr
<
SignalStateDetector
<
float
,
float
,
float
,
HistoryPolicy
::
FIFO
>>
SigSD
)
{
using
Input
=
std
::
pair
<
DeluxeTuple
<
float
>
,
bool
>
;
using
Result
=
Optional
<
SignalStateTuple
>
;
using
Handler
=
std
::
function
<
Result
(
Input
)
>
;
//@Benedikt/@David (New - 04/2020): in the folliwing, we do
//"std::get<0>(I.first)" quite often. Would it not be faster if we save this
// once in a variable and use this variable.
return
C
->
createAgent
(
Name
,
Handler
([
&
,
Name
,
SigSD
](
Input
I
)
->
Result
{
LOG_INFO_STREAM
<<
"
\n
******
\n
"
<<
Name
<<
" "
<<
(
I
.
second
?
"<New>"
:
"<Old>"
)
<<
" value: "
<<
std
::
get
<
0
>
(
static_cast
<
std
::
tuple
<
float
>
&>
(
I
.
first
))
<<
"
\n
******
\n
"
;
// ONLYFORTEST
bool
printFlag
=
Name
==
"Voltage"
;
if
(
printFlag
)
{
std
::
cout
<<
Name
<<
" - Input "
<<
std
::
get
<
0
>
(
static_cast
<
std
::
tuple
<
float
>
&>
(
I
.
first
))
<<
std
::
endl
;
}
// TSETROFYLNO
// ONLYFORTEST - added second parameter (printFlag)
auto
StateInfo
=
SigSD
->
detectSignalState
(
std
::
get
<
0
>
(
static_cast
<
std
::
tuple
<
float
>
&>
(
I
.
first
)),
printFlag
);
// TSETROFYLNO - added second parameter (printFlag)
// ONLYFORTEST
if
(
printFlag
)
{
std
::
cout
<<
"StateInfo:"
<<
std
::
endl
;
std
::
cout
<<
" > StateID: "
<<
StateInfo
.
StateID
<<
std
::
endl
;
/*
std::cout << "In/Output: " << StateInfo.SignalProperty << std::endl;
std::cout << "StateCondition: " << StateInfo.StateCondition
<< std::endl;
std::cout << "StateIsValid: " << StateInfo.StateIsValid << std::endl;
std::cout << "StateJustGotValid: " << StateInfo.StateJustGotValid
<< std::endl;
std::cout << "StateIsValidAfterReentrance: "
<< StateInfo.StateIsValidAfterReentrance << std::endl;
std::cout << "ConfidenceStateIsValid: "
<< StateInfo.ConfidenceStateIsValid << std::endl;
std::cout << "ConfidenceStateIsInvalid: "
<< StateInfo.ConfidenceStateIsInvalid << std::endl;
std::cout << "ConfidenceStateIsStable: "
<< StateInfo.ConfidenceStateIsStable << std::endl;
std::cout << "ConfidenceStateIsDrifting: "
<< StateInfo.ConfidenceStateIsDrifting << std::endl;
*/
std
::
cout
<<
std
::
endl
<<
"-------------------------------------------------------"
"-------------------------"
<<
std
::
endl
<<
std
::
endl
;
// getchar();
}
// TSETROFYLNO
if
(
I
.
second
)
{
SignalStateTuple
Res
=
{
std
::
get
<
0
>
(
static_cast
<
std
::
tuple
<
float
>
&>
(
I
.
first
)),
StateInfo
.
StateID
,
StateInfo
.
SignalProperty
,
StateInfo
.
ConfidenceOfMatchingState
,
StateInfo
.
ConfidenceOfMismatchingState
,
StateInfo
.
ConfidenceStateIsValid
,
StateInfo
.
ConfidenceStateIsInvalid
,
StateInfo
.
ConfidenceStateIsStable
,
StateInfo
.
ConfidenceStateIsDrifting
,
StateInfo
.
StateCondition
,
StateInfo
.
NumberOfInsertedSamplesAfterEntrance
,
(
uint8_t
)((
StateInfo
.
StateIsValid
?
4
:
0
)
+
(
StateInfo
.
StateJustGotValid
?
2
:
0
)
+
(
StateInfo
.
StateIsValidAfterReentrance
?
1
:
0
))};
return
Result
(
Res
);
}
return
Result
();
}));
}
// System State
using
SystemStateTuple
=
DeluxeTuple
<
std
::
string
>
;
template
<
std
::
size_t
size
,
typename
ret
,
typename
functype
,
typename
...
A
>
struct
Handler_helper
;
template
<
typename
B
,
typename
func
,
typename
A
,
typename
...
As
>
struct
function_helper
{
static_assert
(
std
::
conjunction_v
<
std
::
is_same
<
A
,
As
>
...
>
,
"All types need to be identical"
);
static
B
function
(
A
valA
,
As
...
valAs
)
{
std
::
vector
<
A
>
ar
({
valA
,
valAs
...});
return
func
()(
ar
);
}
};
template
<
typename
ret
,
typename
typeA
,
typename
functype
,
typename
...
B
>
struct
Handler_helper
<
0
,
ret
,
functype
,
typeA
,
B
...
>
{
using
handler
=
function_helper
<
ret
,
functype
,
B
...
>
;
};
template
<
std
::
size_t
size
,
typename
ret
,
typename
typeA
,
typename
functype
,
typename
...
B
>
struct
Handler_helper
<
size
,
ret
,
functype
,
typeA
,
B
...
>
{
using
handler
=
typename
Handler_helper
<
size
-
1
,
ret
,
functype
,
typeA
,
std
::
pair
<
typeA
,
bool
>
,
B
...
>::
handler
;
};
template
<
std
::
size_t
size
,
typename
ret
,
typename
functype
,
typename
typeA
>
using
Handler
=
typename
Handler_helper
<
size
,
ret
,
functype
,
typeA
>::
handler
;
// TODO: This is UGLY!
std
::
shared_ptr
<
SystemStateDetector
<
uint32_t
,
float
,
float
,
HistoryPolicy
::
FIFO
>>
SysSD
;
// todo: state-detector durchschleifen
template
<
typename
ret
,
typename
A
>
struct
function
{
ret
operator
()(
A
a
)
{
std
::
vector
<
SignalStateInformation
<
float
>>
SignalStateInfos
;
std
::
stringstream
OutString
;
for
(
auto
_SignalStateTuple
:
a
)
{
// convert tuple to info struct out.push_back({});
OutString
<<
std
::
get
<
0
>
(
_SignalStateTuple
.
first
)
<<
","
;
SignalStateInformation
<
float
>
Info
;
Info
.
StateID
=
std
::
get
<
1
>
(
_SignalStateTuple
.
first
);
Info
.
SignalProperty
=
static_cast
<
SignalProperties
>
(
std
::
get
<
2
>
(
_SignalStateTuple
.
first
));
Info
.
ConfidenceOfMatchingState
=
std
::
get
<
3
>
(
_SignalStateTuple
.
first
);
Info
.
ConfidenceOfMismatchingState
=
std
::
get
<
4
>
(
_SignalStateTuple
.
first
);
Info
.
ConfidenceStateIsValid
=
std
::
get
<
5
>
(
_SignalStateTuple
.
first
);
Info
.
ConfidenceStateIsInvalid
=
std
::
get
<
6
>
(
_SignalStateTuple
.
first
);
Info
.
ConfidenceStateIsStable
=
std
::
get
<
7
>
(
_SignalStateTuple
.
first
);
Info
.
ConfidenceStateIsDrifting
=
std
::
get
<
8
>
(
_SignalStateTuple
.
first
);
Info
.
StateCondition
=
static_cast
<
StateConditions
>
(
std
::
get
<
9
>
(
_SignalStateTuple
.
first
));
Info
.
NumberOfInsertedSamplesAfterEntrance
=
std
::
get
<
10
>
(
_SignalStateTuple
.
first
);
Info
.
StateIsValid
=
(
std
::
get
<
11
>
(
_SignalStateTuple
.
first
)
&
4
)
>
0
;
Info
.
StateJustGotValid
=
(
std
::
get
<
11
>
(
_SignalStateTuple
.
first
)
&
2
)
>
0
;
Info
.
StateIsValidAfterReentrance
=
(
std
::
get
<
11
>
(
_SignalStateTuple
.
first
)
&
1
)
>
0
;
SignalStateInfos
.
push_back
(
Info
);
}
SystemStateInformation
<
float
>
SystemStateInfo
=
SysSD
->
detectSystemState
(
SignalStateInfos
);
OutString
<<
SystemStateInfo
.
StateID
<<
","
;
OutString
<<
SystemStateInfo
.
ConfidenceStateIsValid
<<
","
;
OutString
<<
SystemStateInfo
.
ConfidenceStateIsInvalid
<<
","
;
OutString
<<
SystemStateInfo
.
ConfidenceOfInputsMatchingState
<<
","
;
OutString
<<
SystemStateInfo
.
ConfidenceOfInputsMismatchingState
<<
","
;
OutString
<<
SystemStateInfo
.
ConfidenceOfOutputsMatchingState
<<
","
;
OutString
<<
SystemStateInfo
.
ConfidenceOfOutputsMismatchingState
<<
","
;
OutString
<<
SystemStateInfo
.
StateCondition
<<
","
;
OutString
<<
SystemStateInfo
.
ConfidenceSystemIsFunctioning
<<
","
;
OutString
<<
SystemStateInfo
.
ConfidenceSystemIsMalfunctioning
<<
","
;
OutString
<<
SystemStateInfo
.
ConfidenceOfAllDecisions
<<
","
;
return
ret
(
std
::
make_tuple
<
std
::
string
>
(
OutString
.
str
()));
}
};
using
arr
=
std
::
vector
<
std
::
pair
<
SignalStateTuple
,
bool
>>
;
template
<
size_t
NumOfSlaves
>
AgentHandle
createSystemStateDetectorAgent
(
std
::
unique_ptr
<
DeluxeContext
>
&
C
,
const
std
::
string
&
Name
,
std
::
shared_ptr
<
PartialFunction
<
uint32_t
,
float
>>
BrokenDelayFunction
,
std
::
shared_ptr
<
PartialFunction
<
uint32_t
,
float
>>
OkDelayFunction
)
{
LOG_TRACE
(
"Creating fixed SystemStateDetectorAgent"
);
using
Input
=
SignalStateTuple
;
using
Result
=
Optional
<
SystemStateTuple
>
;
std
::
shared_ptr
<
SystemStateDetector
<
uint32_t
,
float
,
float
,
HistoryPolicy
::
FIFO
>>
_SysSD
(
new
SystemStateDetector
<
uint32_t
,
float
,
float
,
HistoryPolicy
::
FIFO
>
(
std
::
numeric_limits
<
uint32_t
>::
max
(),
NumOfSlaves
,
BrokenDelayFunction
,
OkDelayFunction
));
SysSD
=
_SysSD
;
auto
HandlerFunction
=
Handler
<
NumOfSlaves
,
Result
,
function
<
Optional
<
SystemStateTuple
>
,
arr
>
,
Input
>::
function
;
return
C
->
createAgent
(
Name
,
std
::
function
(
HandlerFunction
));
}
AgentHandle
createSystemStateDetectorAgent
(
std
::
unique_ptr
<
DeluxeContext
>
&
C
,
const
std
::
string
&
Name
,
size_t
NumOfSlaves
,
std
::
shared_ptr
<
PartialFunction
<
uint32_t
,
float
>>
BrokenDelayFunction
,
std
::
shared_ptr
<
PartialFunction
<
uint32_t
,
float
>>
OkDelayFunction
)
{
LOG_TRACE
(
"Creating dynamic SystemStateDetectorAgent"
);
switch
(
NumOfSlaves
)
{
// clang-format off
case
2
:
return
createSystemStateDetectorAgent
<
2
>
(
C
,
Name
,
BrokenDelayFunction
,
OkDelayFunction
);
case
3
:
return
createSystemStateDetectorAgent
<
3
>
(
C
,
Name
,
BrokenDelayFunction
,
OkDelayFunction
);
case
4
:
return
createSystemStateDetectorAgent
<
4
>
(
C
,
Name
,
BrokenDelayFunction
,
OkDelayFunction
);
case
5
:
return
createSystemStateDetectorAgent
<
5
>
(
C
,
Name
,
BrokenDelayFunction
,
OkDelayFunction
);
case
6
:
return
createSystemStateDetectorAgent
<
6
>
(
C
,
Name
,
BrokenDelayFunction
,
OkDelayFunction
);
case
7
:
return
createSystemStateDetectorAgent
<
7
>
(
C
,
Name
,
BrokenDelayFunction
,
OkDelayFunction
);
case
8
:
return
createSystemStateDetectorAgent
<
8
>
(
C
,
Name
,
BrokenDelayFunction
,
OkDelayFunction
);
case
9
:
return
createSystemStateDetectorAgent
<
9
>
(
C
,
Name
,
BrokenDelayFunction
,
OkDelayFunction
);
case
10
:
return
createSystemStateDetectorAgent
<
10
>
(
C
,
Name
,
BrokenDelayFunction
,
OkDelayFunction
);
case
11
:
return
createSystemStateDetectorAgent
<
11
>
(
C
,
Name
,
BrokenDelayFunction
,
OkDelayFunction
);
case
12
:
return
createSystemStateDetectorAgent
<
12
>
(
C
,
Name
,
BrokenDelayFunction
,
OkDelayFunction
);
case
13
:
return
createSystemStateDetectorAgent
<
13
>
(
C
,
Name
,
BrokenDelayFunction
,
OkDelayFunction
);
case
14
:
return
createSystemStateDetectorAgent
<
14
>
(
C
,
Name
,
BrokenDelayFunction
,
OkDelayFunction
);
case
15
:
return
createSystemStateDetectorAgent
<
15
>
(
C
,
Name
,
BrokenDelayFunction
,
OkDelayFunction
);
case
16
:
return
createSystemStateDetectorAgent
<
16
>
(
C
,
Name
,
BrokenDelayFunction
,
OkDelayFunction
);
case
17
:
return
createSystemStateDetectorAgent
<
17
>
(
C
,
Name
,
BrokenDelayFunction
,
OkDelayFunction
);
case
18
:
return
createSystemStateDetectorAgent
<
18
>
(
C
,
Name
,
BrokenDelayFunction
,
OkDelayFunction
);
case
19
:
return
createSystemStateDetectorAgent
<
19
>
(
C
,
Name
,
BrokenDelayFunction
,
OkDelayFunction
);
case
20
:
return
createSystemStateDetectorAgent
<
20
>
(
C
,
Name
,
BrokenDelayFunction
,
OkDelayFunction
);
case
21
:
return
createSystemStateDetectorAgent
<
21
>
(
C
,
Name
,
BrokenDelayFunction
,
OkDelayFunction
);
case
22
:
return
createSystemStateDetectorAgent
<
22
>
(
C
,
Name
,
BrokenDelayFunction
,
OkDelayFunction
);
case
23
:
return
createSystemStateDetectorAgent
<
23
>
(
C
,
Name
,
BrokenDelayFunction
,
OkDelayFunction
);
case
24
:
return
createSystemStateDetectorAgent
<
24
>
(
C
,
Name
,
BrokenDelayFunction
,
OkDelayFunction
);
case
25
:
return
createSystemStateDetectorAgent
<
25
>
(
C
,
Name
,
BrokenDelayFunction
,
OkDelayFunction
);
case
1
:
default
:
return
createSystemStateDetectorAgent
<
1
>
(
C
,
Name
,
BrokenDelayFunction
,
OkDelayFunction
);
// clang-format on
}
}
#endif
// STATEHANDLERUTILS_H
File Metadata
Details
Attached
Mime Type
text/x-c++
Expires
Sun, Jul 12, 7:03 PM (1 d, 7 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
345089
Default Alt Text
statehandlerutils.h (12 KB)
Attached To
Mode
R20 SoC_Rosa_repo
Attached
Detach File
Event Timeline
Log In to Comment