Skip to content

Commit 39c6e6d

Browse files
authored
Merge pull request #821 from nasa/event-throttle-time-codegen
Event Throttle Time Codegen
2 parents 8ba62ae + 4ab8dc4 commit 39c6e6d

File tree

70 files changed

+1812
-82
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

70 files changed

+1812
-82
lines changed

compiler/lib/src/main/scala/analysis/Semantics/Event.scala

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,17 +70,17 @@ object Event {
7070
for {
7171
seconds <- getMember("seconds", UInt.MaxValue)
7272
useconds <- getMember("useconds", 999_999)
73-
_ <- {
74-
if (seconds + useconds) > 0 then Right(())
75-
else Left(SemanticError.InvalidEvent(
76-
loc, "time interval may not be zero"
77-
))
78-
}
7973
} yield TimeInterval(seconds, useconds.toInt)
8074
}
8175
def checkEventThrottle(throttle: AstNode[Ast.EventThrottle]) = {
8276
for {
8377
count <- a.getNonnegativeIntValue(throttle.data.count.id)
78+
_ <- {
79+
if count > 0 then Right(())
80+
else Left(SemanticError.InvalidEvent(
81+
loc, s"event throttle count must be greater than zero"
82+
))
83+
}
8484
every <- Result.mapOpt(throttle.data.every, getEveryIntervalValue)
8585
} yield Throttle(count, every)
8686
}

compiler/lib/src/main/scala/codegen/CppWriter/ComponentCppWriter/ComponentCppWriter.scala

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -562,6 +562,9 @@ case class ComponentCppWriter (
562562
throttledEvents.map((_, event) => line(
563563
s"this->${eventThrottleCounterName(event.getName)} = 0;"
564564
)),
565+
throttledEventsWithTimeout.map((_, event) => line(
566+
s"this->${eventThrottleTimeName(event.getName)} = Fw::Time();"
567+
)),
565568
sortedParams.flatMap((_, param) => guardedList(!param.isExternal) (
566569
lines(s"this->${paramValidityFlagName(param.getName)} = Fw::ParamValid::UNINIT;")
567570
))
@@ -992,7 +995,7 @@ case class ComponentCppWriter (
992995
}
993996

994997
private def getMutexVariableMembers: List[CppDoc.Class.Member] = {
995-
if !(hasGuardedInputPorts || hasGuardedCommands || hasParameters) then Nil
998+
if !(hasGuardedInputPorts || hasGuardedCommands || hasParameters || hasEventsWithTimeout) then Nil
996999
else List(
9971000
linesClassMember(
9981001
List(
@@ -1013,6 +1016,13 @@ case class ComponentCppWriter (
10131016
|//! Mutex for locking parameters during sets and saves
10141017
|Os::Mutex m_paramLock;
10151018
|"""
1019+
),
1020+
if !hasEventsWithTimeout then Nil
1021+
else lines(
1022+
"""|
1023+
|//! Mutex for locking event throttle timeout and counter
1024+
|Os::Mutex m_eventLock;
1025+
|"""
10161026
)
10171027
).flatten
10181028
)

compiler/lib/src/main/scala/codegen/CppWriter/ComponentCppWriter/ComponentCppWriterUtils.scala

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,22 @@ abstract class ComponentCppWriterUtils(
202202
}
203203
)
204204

205+
/** List of throttled events no timeout */
206+
val throttledEventsNoTimeout: List[(Event.Id, Event)] = sortedEvents.filter((_, event) =>
207+
event.throttle match {
208+
case Some(Event.Throttle(_, None)) => true
209+
case _ => false
210+
}
211+
)
212+
213+
/** List of throttled events with finite timeout intervals */
214+
val throttledEventsWithTimeout: List[(Event.Id, Event)] = sortedEvents.filter((_, event) =>
215+
event.throttle match {
216+
case Some(Event.Throttle(_, Some(_))) => true
217+
case _ => false
218+
}
219+
)
220+
205221
/** List of channels sorted by ID */
206222
val sortedChannels: List[(TlmChannel.Id, TlmChannel)] = component.tlmChannelMap.toList.sortBy(_._1)
207223

@@ -319,6 +335,8 @@ abstract class ComponentCppWriterUtils(
319335

320336
val hasContainers: Boolean = containersByName != Nil
321337

338+
val hasEventsWithTimeout: Boolean = throttledEventsWithTimeout.nonEmpty
339+
322340
val hasExternalStateMachineInstances: Boolean =
323341
component.hasStateMachineInstancesOfKind(StateMachine.Kind.External)
324342

@@ -815,6 +833,10 @@ abstract class ComponentCppWriterUtils(
815833
def eventThrottleCounterName(name: String) =
816834
s"m_${name}Throttle"
817835

836+
/** Get the name for an event throttle timeout interval variable */
837+
def eventThrottleTimeName(name: String) =
838+
s"m_${name}ThrottleTime"
839+
818840
/** Get the name for an event ID constant */
819841
def eventIdConstantName(name: String) =
820842
s"EVENTID_${name.toUpperCase}"

compiler/lib/src/main/scala/codegen/CppWriter/ComponentCppWriter/ComponentEvents.scala

Lines changed: 90 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,26 @@ case class ComponentEvents (
6060
addAccessTagAndComment(
6161
"private",
6262
"Counter values for event throttling",
63-
throttledEvents.map((_, event) =>
64-
linesClassMember(
65-
Line.blank :: lines(
66-
s"""|//! Throttle for ${event.getName}
67-
|std::atomic<FwIndexType> ${eventThrottleCounterName(event.getName)};
68-
|"""
63+
List.concat(
64+
throttledEventsNoTimeout.map((_, event) =>
65+
linesClassMember(
66+
Line.blank :: lines(
67+
s"""|//! Throttle for ${event.getName}
68+
|std::atomic<FwIndexType> ${eventThrottleCounterName(event.getName)};
69+
|"""
70+
)
71+
)
72+
),
73+
throttledEventsWithTimeout.map((_, event) =>
74+
linesClassMember(
75+
Line.blank :: lines(
76+
s"""|//! Throttle for ${event.getName}
77+
|FwIndexType ${eventThrottleCounterName(event.getName)};
78+
|
79+
|//! Throttle time for ${event.getName}
80+
|Fw::Time ${eventThrottleTimeName(event.getName)};
81+
|"""
82+
)
6983
)
7084
)
7185
),
@@ -246,18 +260,20 @@ case class ComponentEvents (
246260
)
247261
def writeBody(id: Event.Id, event: Event) = intersperseBlankLines(
248262
List(
263+
// Hard throttle counter can be checked immediately
264+
// We don't need to get time
249265
event.throttle match {
250-
case None => Nil
251-
case Some(_) => lines(
266+
case Some(Event.Throttle(_, None)) => lines(
252267
s"""|// Check throttle value
253268
|if (this->${eventThrottleCounterName(event.getName)} >= ${eventThrottleConstantName(event.getName)}) {
254269
| return;
255270
|}
256271
|else {
257-
| (void) this->${eventThrottleCounterName(event.getName)}.fetch_add(1);
272+
| this->${eventThrottleCounterName(event.getName)}++;
258273
|}
259274
|"""
260275
)
276+
case _ => Nil
261277
},
262278
lines(
263279
s"""|// Get the time
@@ -271,6 +287,37 @@ case class ComponentEvents (
271287
|_id = this->getIdBase() + ${eventIdConstantName(event.getName)};
272288
|"""
273289
),
290+
// Time based throttle timeout needs above time
291+
event.throttle match {
292+
case Some(Event.Throttle(_, Some(Event.TimeInterval(seconds, useconds)))) => lines(
293+
s"""|// Check throttle value & throttle timeout
294+
|{
295+
| Os::ScopeLock scopedLock(this->m_eventLock);
296+
|
297+
| if (this->${eventThrottleCounterName(event.getName)} >= ${eventThrottleConstantName(event.getName)}) {
298+
| // The counter has overflowed, check if time interval has passed
299+
| if (Fw::TimeInterval(this->${eventThrottleTimeName(event.getName)}, _logTime) >= Fw::TimeInterval($seconds, $useconds)) {
300+
| // Reset the count
301+
| this->${eventThrottleCounterName(event.getName)} = 0;
302+
| } else {
303+
| // Throttle the event
304+
| return;
305+
| }
306+
| }
307+
|
308+
| // Reset the throttle time if needed
309+
| if (this->${eventThrottleCounterName(event.getName)} == 0) {
310+
| // This is the first event, reset the throttle time
311+
| this->${eventThrottleTimeName(event.getName)} = _logTime;
312+
| }
313+
|
314+
| // Increment the count
315+
| this->${eventThrottleCounterName(event.getName)}++;
316+
|}
317+
|"""
318+
)
319+
case _ => Nil
320+
},
274321
writeLogBody(id, event),
275322
writeTextLogBody(event)
276323
)
@@ -309,16 +356,40 @@ case class ComponentEvents (
309356
addAccessTagAndComment(
310357
"protected",
311358
"Event throttle reset functions",
312-
throttledEvents.map((_, event) =>
313-
functionClassMember(
314-
Some(s"Reset throttle value for ${event.getName}"),
315-
eventThrottleResetName(event),
316-
Nil,
317-
CppDoc.Type("void"),
318-
lines(
319-
s"""|// Reset throttle counter
320-
|this->${eventThrottleCounterName(event.getName)} = 0;
321-
|"""
359+
List.concat(
360+
throttledEventsNoTimeout.map((_, event) =>
361+
functionClassMember(
362+
Some(s"Reset throttle value for ${event.getName}"),
363+
eventThrottleResetName(event),
364+
Nil,
365+
CppDoc.Type("void"),
366+
List(
367+
lines(
368+
s"""|// Reset throttle counter
369+
|this->${eventThrottleCounterName(event.getName)} = 0;
370+
|"""
371+
)
372+
).flatten
373+
)
374+
),
375+
throttledEventsWithTimeout.map((_, event) =>
376+
functionClassMember(
377+
Some(s"Reset throttle value for ${event.getName}"),
378+
eventThrottleResetName(event),
379+
Nil,
380+
CppDoc.Type("void"),
381+
lines(
382+
s"""|{
383+
| Os::ScopeLock scopedLock(this->m_eventLock);
384+
|
385+
| // Reset throttle counter
386+
| this->${eventThrottleCounterName(event.getName)} = 0;
387+
|
388+
| // Reset the throttle time
389+
| this->${eventThrottleTimeName(event.getName)} = Fw::Time(0, 0);
390+
|}
391+
|"""
392+
)
322393
)
323394
)
324395
)

compiler/tools/fpp-check/test/event/tests.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,5 @@ not_displayable
2020
ok
2121
ref_params
2222
throttle_too_large
23-
zero_throttle_interval
23+
zero_throttle_count
2424
"

compiler/tools/fpp-check/test/event/zero_throttle_interval.fpp renamed to compiler/tools/fpp-check/test/event/zero_throttle_count.fpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
passive component C {
22

33
event E severity activity low \
4-
format "" throttle 10 \
5-
every {seconds=0}
4+
format "" throttle 0
65

76
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
fpp-check
2+
[ local path prefix ]/compiler/tools/fpp-check/test/event/zero_throttle_count.fpp:3.3
3+
event E severity activity low \
4+
^
5+
error: event throttle count must be greater than zero

compiler/tools/fpp-check/test/event/zero_throttle_interval.ref.txt

Lines changed: 0 additions & 5 deletions
This file was deleted.

0 commit comments

Comments
 (0)