diff --git a/autodoc/doc_state.py b/autodoc/doc_state.py
index 38f18d5..53e40a7 100644
--- a/autodoc/doc_state.py
+++ b/autodoc/doc_state.py
@@ -4,16 +4,6 @@ import os
import common as doc
-def doc_app_state(state, tab=" │ "):
- res = ""
- if "+Threads" in state:
- for i, tname in enumerate(state["+Threads"]):
- if tname[0] == "+":
- ch = "├─●" if i < len(state["+Threads"]) - 1 else "╰─●"
- res += f"{tab} {ch} {tname[1:]}\n"
- return res
-
-
def __doc_obj__(label, obj, id):
node = f' {id} [label="{label}\n{obj["Class"]} | '
return node
@@ -177,9 +167,8 @@ def __doc_iogam__(id, obj, edges, thread):
def __doc_constgam__(id, obj, edges, thread):
- node = f' {id} [label="{id[2:]}\n{obj["Class"]} | '
- values = ""
- types = ""
+ node = f" {id} [shape=plaintext, label=<
"
+ node += f"{id[2:]} {obj['Class']} |
"
if "OutputSignals" in obj:
for i, (l, sig) in enumerate(obj["OutputSignals"].items()):
@@ -193,38 +182,99 @@ def __doc_constgam__(id, obj, edges, thread):
thread,
)
)
- if i != 0:
- values += " | "
- types += " | "
- values += f' {sig["Default"]}'
- types += doc.type_to_string(mtype)
- node += "{{ " + types + " } | {" + values + "}}"
- node += '", style=filled, fillcolor="#dff"];'
+ node += f'{doc.type_to_string(mtype)} {l} | '
+ node += f''
+ node += f'{sig["Default"]} |
'
+ node += "
>];\n"
+ return node, edges
+
+
+def __doc_message_gam__(id, obj, edges, thread):
+ label = id[2:]
+ node = f' {id} [label="{label}\n{obj["Class"]} | '
+ sigs, edges = __doc_common_gam__(id, obj, edges, thread)
+ if sigs:
+ node += sigs + '"];'
+ else:
+ node = ""
+
+ if node:
+ add, edges = __doc_events__(id, obj, edges, thread)
+ node += add
return node, edges
def __doc_events__(id, obj, edges, thread):
- return "", edges
+ nodes = ""
+ for event_id, event in obj["+Events"].items():
+ if event_id[0] == "+":
+ event_id = event_id[1:]
+ trigger = event["EventTrigger"]
+ message_ids = [id[1:] for id in event if id[0] == "+"]
+ for msg_id in message_ids:
+ nodes += f" {id}_{event_id}_{msg_id} [shape=plaintext, label=<"
+ nodes += ''
+ nodes += (
+ "| When | "
+ )
+ for i, (sig, val) in enumerate(trigger.items()):
+ if i > 0:
+ nodes += " "
+ nodes += f"{sig} == {val}"
+
+ nodes += " |
| Destination | "
+ msg = event[f"+{msg_id}"]
+ fn = msg["Function"]
+ nodes += f"{msg['Destination']} |
"
+ nodes += "| Function | "
+ if fn == "SetOutput":
+ params = msg["+Parameters"]
+ nodes += f"{params['SignalName']} = {params['SignalValue']}"
+ else:
+ nodes += f"{fn} "
+ nodes += " |
>];\n"
+ nodes += f" {id} -> {id}_{event_id}_{msg_id} [arrowhead=box];\n"
+ return nodes, edges
+
+
+def __sanitize__(expression):
+ if expression[0] == "\n":
+ expression = expression[1:]
+ return expression.replace(">", ">").replace("<", "<").replace("\n", "\n")
+
+
+def __doc_mathgam__(id, obj, edges, thread):
+ label = id[2:]
+ node = f' {id} [label="{label}\n{obj["Class"]} | '
+ node += __sanitize__(obj["Expression"]) + " | "
+ sigs, edges = __doc_common_gam__(id, obj, edges, thread)
+ if sigs:
+ node += sigs + '"];'
+ else:
+ node = ""
+ return node, edges
+
+
+__gams_fns__ = {
+ "IOGAM": __doc_iogam__,
+ "ConstantGAM": __doc_constgam__,
+ "TriggeredIOGAM": __doc_triggered_iogam__,
+ "MathExpressionGAM": __doc_mathgam__,
+ "MessageGAM": __doc_message_gam__,
+}
def __doc_gam__(label, obj, edges, thread):
id = f"fn{label}"
cls = obj["Class"]
+ if cls in __gams_fns__:
+ return __gams_fns__[cls](id, obj, edges, thread)
node = f' {id} [label="{label}\n{obj["Class"]} | '
- if cls == "ConstantGAM":
- return __doc_constgam__(id, obj, edges, thread)
- elif cls == "IOGAM":
- return __doc_iogam__(id, obj, edges, thread)
- elif cls == "TriggeredIOGAM":
- return __doc_triggered_iogam__(id, obj, edges, thread)
- else:
- sigs, edges = __doc_common_gam__(id, obj, edges, thread)
+ sigs, edges = __doc_common_gam__(id, obj, edges, thread)
if sigs:
node += sigs + '"];'
else:
node = ""
- if cls == "MessageGAM":
- extra, edges = __doc_events__(id, obj, edges, thread)
return node, edges
@@ -372,6 +422,8 @@ def doc_state(label, state, app):
graph += "nodesep = 0.5;\n"
graph += "rankdir = LR;\n"
graph += "node [shape=Mrecord];\n"
+ graph += f"label={label[1:]}>;\n"
+ graph += "fontsize=40;\n"
graph += "\n"
arrows = ""
ext = ""
@@ -387,10 +439,10 @@ def doc_state(label, state, app):
obj = app["+Functions"][f"+{fn}"]
node, edges = __doc_gam__(fn, obj, edges, tname[1:])
graph += f"{node}\n"
- graph += f"\n label = < {tname[1:]} >;\n"
+ graph += f"\n label = {tname[1:]} >;\n"
graph += " fontsize = 24.0;\n"
graph += " penwidth = 3;\n"
- graph += ' color = "#0A0";\n'
+ graph += ' color = "#1A1A1A";\n'
graph += "}\n"
if "+Data" in app:
for key, obj in app["+Data"].items():