Activity-Lang: complete implementation for Gate (conditional)
Decision how to handle a failed Gate-check - spin forward (re-scheduler) by some time amount - this spin-offset parameter is retrieved from the Execution Context - thus it will be some kind of engine parameter With these determinations and the framework for the Execution Context it is now possible to code up the logic for Gate check, which in turn can then be verified by the watchGate diagnostics
This commit is contained in:
parent
8a85e57235
commit
abc29eaa31
4 changed files with 76 additions and 32 deletions
|
|
@ -169,6 +169,7 @@ namespace gear {
|
|||
ASSERT_MEMBER_FUNCTOR (EXE::work, void(Time, size_t));
|
||||
ASSERT_MEMBER_FUNCTOR (EXE::done, void(Time, size_t));
|
||||
ASSERT_MEMBER_FUNCTOR (EXE::tick, Proc(Time));
|
||||
ASSERT_MEMBER_FUNCTOR (EXE::spin, Time(Time));
|
||||
|
||||
|
||||
#undef ASSERT_MEMBER_FUNCTOR
|
||||
|
|
@ -441,8 +442,13 @@ namespace gear {
|
|||
activity::Proc
|
||||
checkGate (Time now, EXE& executionCtx)
|
||||
{
|
||||
UNIMPLEMENTED ("evaluate GATE condition and branch accordingly");
|
||||
return executionCtx.post (now, *next, executionCtx);
|
||||
REQUIRE (GATE == verb_);
|
||||
if (now > data_.condition.dead) // beyond deadline
|
||||
return activity::SKIP;
|
||||
if (0 < data_.condition.rest) // prerequisite count not(yet) fulfilled -> spin (=re-invoke later)
|
||||
return executionCtx.post (executionCtx.spin(now), *this, executionCtx);
|
||||
else
|
||||
return activity::PASS;
|
||||
}
|
||||
|
||||
template<class EXE>
|
||||
|
|
|
|||
|
|
@ -336,8 +336,15 @@ namespace test {
|
|||
|
||||
|
||||
|
||||
/** @test TODO diagnostic setup to watch Activity::GATE activation
|
||||
* @todo WIP 7/23 🔁 define ⟶ implement
|
||||
/** @test diagnostic setup to watch Activity::GATE activation
|
||||
* - when applied, Tap will be inserted before and after the
|
||||
* instrumented GATE-Activity
|
||||
* - it can thus be traced when the Gate is activated,
|
||||
* but also when the Gate condition is met and the `next`
|
||||
* Activity after the Gate is activated
|
||||
* - for this unit-test, a Gate and a follow-up Activity
|
||||
* is invoked directly, to verify the generated log entries
|
||||
* @todo WIP 7/23 ✔ define ✔ implement
|
||||
*/
|
||||
void
|
||||
watch_gate()
|
||||
|
|
@ -353,8 +360,13 @@ namespace test {
|
|||
|
||||
Time tt{5,5};
|
||||
wiring->activate(tt, detector.executionCtx);
|
||||
++detector;
|
||||
wiring->next->activate(tt, detector.executionCtx);
|
||||
|
||||
cout<<detector.showLog()<<endl;
|
||||
CHECK (detector.verifyInvocation("tap-GATE").seq(0).timeArg(tt)
|
||||
.beforeSeqIncrement(1)
|
||||
.beforeInvocation("afterGATE").seq(1).timeArg(tt)
|
||||
.beforeInvocation("CTX-tick").seq(1).timeArg(tt));
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -106,6 +106,8 @@ namespace test {
|
|||
// using lib::diff::MakeRec;
|
||||
using lib::time::TimeValue;
|
||||
using lib::time::Time;
|
||||
using lib::time::FSecs;
|
||||
using lib::time::Offset;
|
||||
// using lib::HashVal;
|
||||
using lib::meta::RebindVariadic;
|
||||
using util::isnil;
|
||||
|
|
@ -129,6 +131,8 @@ namespace test {
|
|||
const string CTX_WORK{"CTX-work"};
|
||||
const string CTX_DONE{"CTX-done"};
|
||||
const string CTX_TICK{"CTX-tick"};
|
||||
|
||||
Offset SPIN_DELAY{FSecs(1)};
|
||||
}
|
||||
|
||||
class ActivityDetector;
|
||||
|
|
@ -503,18 +507,17 @@ namespace test {
|
|||
}
|
||||
|
||||
Activity&
|
||||
buildGateWatcher (Activity& gate)
|
||||
buildGateWatcher (Activity& gate, string id ="")
|
||||
{
|
||||
Activity& watcher = buildActivationTap (gate);
|
||||
insertActivationTap (gate.next, "after"+gate.showVerb()+util::showAddr(gate));
|
||||
return watcher;
|
||||
insertActivationTap (gate.next, "after" + (isnil(id)? gate.showVerb()+util::showAddr(gate) : id));
|
||||
return buildActivationTap (gate, id);
|
||||
}
|
||||
|
||||
Activity&
|
||||
watchGate (Activity*& wiring)
|
||||
watchGate (Activity*& wiring, string id ="")
|
||||
{
|
||||
wiring = wiring? & buildGateWatcher (*wiring)
|
||||
: & buildActivationProbe ("tail-"+util::showAddr(&wiring));
|
||||
wiring = wiring? & buildGateWatcher (*wiring, id)
|
||||
: & buildActivationProbe (isnil(id)? "tail-"+util::showAddr(&wiring) : id);
|
||||
return *wiring;
|
||||
}
|
||||
|
||||
|
|
@ -539,6 +542,8 @@ namespace test {
|
|||
_DiagnosticFun<SIG_done>::Type done;
|
||||
_DiagnosticFun<SIG_tick>::Type tick;
|
||||
|
||||
static Time spin (Time now) { return now + SPIN_DELAY; }
|
||||
|
||||
FakeExecutionCtx (ActivityDetector& adi)
|
||||
: post{adi.buildDiagnosticFun<SIG_post>(CTX_POST).returning(activity::PASS)}
|
||||
, work{adi.buildDiagnosticFun<SIG_work>(CTX_WORK)}
|
||||
|
|
|
|||
|
|
@ -77840,7 +77840,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1681086215092" ID="ID_688439359" MODIFIED="1692323864648" TEXT="Activity">
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1681086215092" ID="ID_688439359" MODIFIED="1692489346733" TEXT="Activity">
|
||||
<linktarget COLOR="#f4fec9" DESTINATION="ID_688439359" ENDARROW="Default" ENDINCLINATION="-557;-136;" ID="Arrow_ID_1352278228" SOURCE="ID_1926192234" STARTARROW="None" STARTINCLINATION="1598;114;"/>
|
||||
<linktarget COLOR="#daf1b4" DESTINATION="ID_688439359" ENDARROW="Default" ENDINCLINATION="-190;833;" ID="Arrow_ID_345974066" SOURCE="ID_1628186610" STARTARROW="None" STARTINCLINATION="2086;-130;"/>
|
||||
<icon BUILTIN="pencil"/>
|
||||
|
|
@ -78447,6 +78447,9 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1690069554609" ID="ID_467087304" MODIFIED="1690069556663" TEXT="λ-tick">
|
||||
<node CREATED="1690740728730" ID="ID_1262348056" MODIFIED="1690746330626" TEXT="(Time) ⟼ activity::Proc"/>
|
||||
</node>
|
||||
<node CREATED="1692489173543" ID="ID_897346987" MODIFIED="1692489185929" TEXT="λ-spin">
|
||||
<node CREATED="1692489192676" ID="ID_1486708865" MODIFIED="1692489198415" TEXT="(Time) ⟼ Time"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1690490265626" ID="ID_691752926" MODIFIED="1690490274359" TEXT="wird eingebunden als Template-Parameter">
|
||||
<node COLOR="#338800" CREATED="1690490280656" ID="ID_1134844863" MODIFIED="1690490315482" TEXT="direkt in Activity selber">
|
||||
|
|
@ -78649,23 +78652,23 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1690069961163" HGAP="-57" ID="ID_1647246120" MODIFIED="1690070058095" TEXT="brauche Diagnose-Hilfsmittel" VSHIFT="4">
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1690069961163" HGAP="-57" ID="ID_1647246120" MODIFIED="1692491427946" TEXT="brauche Diagnose-Hilfsmittel" VSHIFT="4">
|
||||
<arrowlink COLOR="#794f4b" DESTINATION="ID_284088835" ENDARROW="Default" ENDINCLINATION="-685;-107;" ID="Arrow_ID_1213725911" STARTARROW="None" STARTINCLINATION="518;48;"/>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1690070237908" HGAP="43" ID="ID_875825086" MODIFIED="1690070258681" TEXT="Test-Setup mit λ-Stubs" VSHIFT="-3">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node COLOR="#338800" CREATED="1690070237908" HGAP="43" ID="ID_875825086" MODIFIED="1692491405654" TEXT="Test-Setup mit λ-Stubs" VSHIFT="-3">
|
||||
<arrowlink COLOR="#7ba8d3" DESTINATION="ID_596906210" ENDARROW="Default" ENDINCLINATION="76;284;" ID="Arrow_ID_1248869383" STARTARROW="None" STARTINCLINATION="990;-88;"/>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1690070107384" HGAP="31" ID="ID_396064852" MODIFIED="1690070255409" TEXT="ActivityDetector für Meßunkte" VSHIFT="-13">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1689205105640" ID="ID_1873547897" MODIFIED="1690070157925" TEXT="Funktor-Aufruf erkennen">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#338800" CREATED="1690070107384" HGAP="31" ID="ID_396064852" MODIFIED="1692491421971" TEXT="ActivityDetector für Meßunkte" VSHIFT="-13">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1689205105640" ID="ID_1873547897" MODIFIED="1692491417479" TEXT="Funktor-Aufruf erkennen">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1689205129709" ID="ID_1799160243" MODIFIED="1690070171707" TEXT="stattgefundene Invocation erkennen">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#338800" CREATED="1689205129709" ID="ID_1799160243" MODIFIED="1692491419052" TEXT="stattgefundene Invocation erkennen">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1689205423173" ID="ID_206179585" MODIFIED="1690070228859" TEXT="Gate beobachten">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#338800" CREATED="1689205423173" ID="ID_206179585" MODIFIED="1692491420712" TEXT="Gate beobachten">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -81666,10 +81669,10 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node COLOR="#338800" CREATED="1689204913954" ID="ID_256874849" MODIFIED="1689204922646" TEXT="für ExtentFamily">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1689204967974" ID="ID_284088835" MODIFIED="1690070044262" TEXT="ActivityDetector">
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1689204967974" ID="ID_284088835" MODIFIED="1692491465813" TEXT="ActivityDetector">
|
||||
<linktarget COLOR="#794f4b" DESTINATION="ID_284088835" ENDARROW="Default" ENDINCLINATION="-685;-107;" ID="Arrow_ID_1213725911" SOURCE="ID_1647246120" STARTARROW="None" STARTINCLINATION="518;48;"/>
|
||||
<linktarget COLOR="#5f8998" DESTINATION="ID_284088835" ENDARROW="Default" ENDINCLINATION="347;-1232;" ID="Arrow_ID_1573724609" SOURCE="ID_373470992" STARTARROW="None" STARTINCLINATION="634;35;"/>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1689204985122" ID="ID_1020676746" MODIFIED="1690832427037" TEXT="Rahmen schaffen">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node COLOR="#338800" CREATED="1689205014901" ID="ID_221497246" MODIFIED="1690832378644" TEXT="Instantiierung und Lebenszyklus">
|
||||
|
|
@ -81763,6 +81766,9 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</html></richcontent>
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1692489058101" ID="ID_1423312805" MODIFIED="1692489067676" TEXT="auch für Notifications geeignet berücksichtigen">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1689205029658" ID="ID_1144318045" MODIFIED="1690918967997" TEXT="Verifikationen">
|
||||
<icon BUILTIN="pencil"/>
|
||||
|
|
@ -82059,6 +82065,10 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1690069365933" ID="ID_832098393" MODIFIED="1692286755765" TEXT="λ-work: (Time, quality)"/>
|
||||
<node CREATED="1690069480630" ID="ID_320780008" MODIFIED="1692286762564" TEXT="λ-done: (Time, quality)"/>
|
||||
<node CREATED="1690069554609" ID="ID_761100089" MODIFIED="1692286770500" TEXT="λ-tick: (Time) ⟼ activity::Proc"/>
|
||||
<node CREATED="1692489219616" ID="ID_866525795" MODIFIED="1692489234875" TEXT="λ-spin">
|
||||
<node CREATED="1692489235982" ID="ID_1555747732" MODIFIED="1692489243923" TEXT="hier fest verdrahtet (ohne Logging)"/>
|
||||
<node CREATED="1692489245061" ID="ID_350410985" LINK="#ID_1726593706" MODIFIED="1692489280665" TEXT="liefert re-Check-Zeit"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1692286383148" ID="ID_675137089" MODIFIED="1692323862104" TEXT="diese sind per Log verifizierbar">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
|
|
@ -82284,14 +82294,17 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1689205423173" ID="ID_935068564" MODIFIED="1692487675023" TEXT="watchGate">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1692485210898" ID="ID_1284233307" MODIFIED="1692485224634" TEXT="komplexe Aufgabe">
|
||||
<node COLOR="#435e98" CREATED="1692485210898" ID="ID_1284233307" MODIFIED="1692491324320" TEXT="komplexe Aufgabe">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
<node CREATED="1692485226036" ID="ID_1556332540" MODIFIED="1692485237497" TEXT="das Gate bietet eigentlich keine Erweiterungspunkte"/>
|
||||
<node CREATED="1692485238133" ID="ID_904790600" MODIFIED="1692485265925" TEXT="zudem müssen mehrere Ein/Ausgänge überwacht werden"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1692487689444" ID="ID_1980202996" MODIFIED="1692487705987" TEXT="sinnvolle IDs für die Verifikation erzeugen">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#338800" CREATED="1692487689444" ID="ID_1980202996" MODIFIED="1692491327388" TEXT="sinnvolle IDs für die Verifikation erzeugen">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1692489331442" ID="ID_1512727338" LINK="#ID_1768827754" MODIFIED="1692489388011" TEXT="siehe GATE-impl">
|
||||
<icon BUILTIN="info"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1692485300157" ID="ID_1563739402" MODIFIED="1692487715332" TEXT="ActivityProbe vorschalten">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1692485311859" ID="ID_1216045769" MODIFIED="1692485364424" TEXT="diese kann Aktivierung aufzeichnen">
|
||||
|
|
@ -82303,8 +82316,16 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
<node COLOR="#338800" CREATED="1692485417998" ID="ID_856616436" MODIFIED="1692487971912" TEXT="zudem Probe auf den next-Ptr legen">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1692485434421" ID="ID_1307528934" MODIFIED="1692487980102" TEXT="passende ID hierfür vergeben">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#338800" CREATED="1692485434421" ID="ID_1307528934" MODIFIED="1692491362173">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
passende ID hierfür vergeben: <font face="Monospaced" color="#1f726f">afterGATE</font>
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node CREATED="1692485443450" ID="ID_577582748" MODIFIED="1692485453069" TEXT="damit wird überprüfbar, wenn das Gate "feuert""/>
|
||||
</node>
|
||||
|
|
|
|||
Loading…
Reference in a new issue