From 00e12b77493d9e886eb84105c4fe46e6f01599fe Mon Sep 17 00:00:00 2001 From: Zimri Leisher Date: Wed, 2 Oct 2024 18:50:47 -0500 Subject: [PATCH 01/14] Add compiler file --- src/fprime_gds/common/sequence/__init__.py | 0 src/fprime_gds/common/sequence/compiler.py | 29 ++++++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 src/fprime_gds/common/sequence/__init__.py create mode 100644 src/fprime_gds/common/sequence/compiler.py diff --git a/src/fprime_gds/common/sequence/__init__.py b/src/fprime_gds/common/sequence/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/fprime_gds/common/sequence/compiler.py b/src/fprime_gds/common/sequence/compiler.py new file mode 100644 index 00000000..e975aad7 --- /dev/null +++ b/src/fprime_gds/common/sequence/compiler.py @@ -0,0 +1,29 @@ +import ast +from pathlib import Path +from argparse import ArgumentParser + +commands = { + "fswExec": ["SET_MODE"] +} + + + +def visit(node: ast.Node): + + +def main(): + arg_parser = ArgumentParser(description="A compiler for the FPrime advanced sequencing language") + + arg_parser.add_argument("input", type=Path, help="The path of the input sequence to compile") + + args = arg_parser.parse_args() + + input_text = args.input.read_text() + + node = ast.parse(input_text) + + + print(ast.dump(node, indent=4)) + +if __name__ == "__main__": + main() \ No newline at end of file From bd11f4a1e749216f744a36faad595e78038ac859 Mon Sep 17 00:00:00 2001 From: Zimri Leisher Date: Fri, 25 Oct 2024 10:10:01 -0500 Subject: [PATCH 02/14] Little more work on seq compiler --- src/fprime_gds/common/sequence/compiler.py | 30 +++++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/src/fprime_gds/common/sequence/compiler.py b/src/fprime_gds/common/sequence/compiler.py index e975aad7..ed622f00 100644 --- a/src/fprime_gds/common/sequence/compiler.py +++ b/src/fprime_gds/common/sequence/compiler.py @@ -1,14 +1,26 @@ import ast +from dataclasses import dataclass from pathlib import Path from argparse import ArgumentParser +from fprime_gds.common.loaders.cmd_json_loader import CmdJsonLoader + commands = { "fswExec": ["SET_MODE"] } +@dataclass +class CommandCall: + comp_instance: str + comp_cmd: str + comp_args: list[ast.Expression] - -def visit(node: ast.Node): +class Visitor(ast.NodeTransformer): + def generic_visit(self, node): + return ast.NodeTransformer.generic_visit(self, node) + + def visit_Call(self, node): + def main(): @@ -16,14 +28,24 @@ def main(): arg_parser.add_argument("input", type=Path, help="The path of the input sequence to compile") + arg_parser.add_argument("-d", "--dictionary", type=Path, help="The path to the JSON topology dictionary") + args = arg_parser.parse_args() input_text = args.input.read_text() - node = ast.parse(input_text) + tree = ast.parse(input_text) + + visitor = Visitor() + + print(ast.dump(visitor.visit(tree), indent=4)) + # Check the user environment: + cmd_json_dict = CmdJsonLoader(args.dictionary) - print(ast.dump(node, indent=4)) + (cmd_id_dict, cmd_name_dict, versions) = cmd_json_dict.construct_dicts( + args.dictionary + ) if __name__ == "__main__": main() \ No newline at end of file From b8316369fbe570ce04c9f05dbd1e57275d8d0812 Mon Sep 17 00:00:00 2001 From: Zimri Leisher Date: Fri, 25 Oct 2024 10:15:33 -0500 Subject: [PATCH 03/14] Some more work on example/test code --- src/fprime_gds/common/sequence/builtin_ac.py | 8 ++ src/fprime_gds/common/sequence/compiler.py | 101 +++++++++++++----- .../common/sequence/dictionary_ac.py | 42 ++++++++ src/fprime_gds/common/sequence/test_seq.py | 11 ++ 4 files changed, 134 insertions(+), 28 deletions(-) create mode 100644 src/fprime_gds/common/sequence/builtin_ac.py create mode 100644 src/fprime_gds/common/sequence/dictionary_ac.py create mode 100644 src/fprime_gds/common/sequence/test_seq.py diff --git a/src/fprime_gds/common/sequence/builtin_ac.py b/src/fprime_gds/common/sequence/builtin_ac.py new file mode 100644 index 00000000..fb58a52e --- /dev/null +++ b/src/fprime_gds/common/sequence/builtin_ac.py @@ -0,0 +1,8 @@ +class SequenceDirective: + def sleep(seconds: int, millis: int): + pass + + def sleep_until(time: str): + pass + +seq = SequenceDirective() \ No newline at end of file diff --git a/src/fprime_gds/common/sequence/compiler.py b/src/fprime_gds/common/sequence/compiler.py index ed622f00..b8b48d01 100644 --- a/src/fprime_gds/common/sequence/compiler.py +++ b/src/fprime_gds/common/sequence/compiler.py @@ -1,51 +1,96 @@ +import inspect import ast -from dataclasses import dataclass from pathlib import Path from argparse import ArgumentParser +from dictionary_ac import * +from builtin_ac import * -from fprime_gds.common.loaders.cmd_json_loader import CmdJsonLoader +def validate_func_call(obj_name, fn_name, args): -commands = { - "fswExec": ["SET_MODE"] -} + valid = False -@dataclass -class CommandCall: - comp_instance: str - comp_cmd: str - comp_args: list[ast.Expression] + if obj_name is None: + # it is a builtin + valid = validate_builtin(fn_name, args) + else: + # it is a command to a component + valid = validate_command(obj_name, fn_name, args) + + if not valid: + print("Invalid function call", obj_name, fn_name, args) + return False + + print("Valid function call", obj_name, fn_name, args) + return True + +def validate_builtin(fn_name, args): + for builtin in builtins: + if builtin.__name__ == fn_name: + # there is a builtin with this name + return validate_builtin_args(builtin, args) + # there is no builtin with this name + return False + +def validate_builtin_args(builtin, args): + signature = inspect.signature(builtin) + + if len(args) != len(signature.parameters): + print(f"{builtin.__name__} expects {len(signature.parameters)} args but {len(args)} args were given") + return False + + return True + +def validate_command(component_name, cmd_name, args): + for instance in instances: + if instance.name == component_name: + instance_cmds = inspect.getmembers(instance) + for instance_cmd in instance_cmds: + if instance_cmd[0] == cmd_name: + return validate_command_args(instance_cmd[1], args) + return False + +def validate_command_args(cmd_fn, args): + signature = inspect.signature(cmd_fn) + + if len(args) != len(signature.parameters): + print(f"Command {cmd_fn.__name__} expects {len(signature.parameters)} args but {len(args)} args were given") + return False -class Visitor(ast.NodeTransformer): + return True + + +class NodeVisitor(ast.NodeVisitor): def generic_visit(self, node): - return ast.NodeTransformer.generic_visit(self, node) - - def visit_Call(self, node): - + super().generic_visit(node) + + def visit_Call(self, node: ast.Call): + obj_name = None + fn_name = None + args = node.args + + if isinstance(node.func, ast.Attribute): + # call to an attr of an obj + if isinstance(node.func.value, ast.Name): + obj_name = node.func.value.id + fn_name = node.func.attr + elif isinstance(node.func, ast.Name): + # direct call, not on obj + fn_name = node.func.id + validate_func_call(obj_name, fn_name, args) def main(): arg_parser = ArgumentParser(description="A compiler for the FPrime advanced sequencing language") arg_parser.add_argument("input", type=Path, help="The path of the input sequence to compile") - arg_parser.add_argument("-d", "--dictionary", type=Path, help="The path to the JSON topology dictionary") - args = arg_parser.parse_args() input_text = args.input.read_text() - tree = ast.parse(input_text) - - visitor = Visitor() - - print(ast.dump(visitor.visit(tree), indent=4)) - - # Check the user environment: - cmd_json_dict = CmdJsonLoader(args.dictionary) + node = ast.parse(input_text) - (cmd_id_dict, cmd_name_dict, versions) = cmd_json_dict.construct_dicts( - args.dictionary - ) + NodeVisitor().generic_visit(node) if __name__ == "__main__": main() \ No newline at end of file diff --git a/src/fprime_gds/common/sequence/dictionary_ac.py b/src/fprime_gds/common/sequence/dictionary_ac.py new file mode 100644 index 00000000..c550182f --- /dev/null +++ b/src/fprime_gds/common/sequence/dictionary_ac.py @@ -0,0 +1,42 @@ +from builtin_ac import * + +def id(id): + def add_id(fn): + fn.id = id + return fn + return add_id + +class Component: + def __init__(self, name, id) -> None: + self.id = id + self.name = name + +class FSWExecutive(Component): + + def __init__(self, name, id) -> None: + self.id = id + self.name = name + + @property + def current_mode(self): + pass + + @id(1) + def SET_MODE(self, mode: int): + pass + +class RCSController(Component): + + def __init__(self, name, id) -> None: + self.id = id + self.name = name + + @id(0) + def FIRE_THRUSTERS(self): + pass + +fswExec = FSWExecutive("fswExec", 1) + +rcsController = RCSController("rcsController", 2) + +instances: list[Component] = [fswExec, rcsController] \ No newline at end of file diff --git a/src/fprime_gds/common/sequence/test_seq.py b/src/fprime_gds/common/sequence/test_seq.py new file mode 100644 index 00000000..287be56d --- /dev/null +++ b/src/fprime_gds/common/sequence/test_seq.py @@ -0,0 +1,11 @@ +from dictionary_ac import * + +# make sure that it's obvious that the sleep function is not a top level function +seq.sleep(1, 100) + +fswExec.SET_MODE(2) +fswExec.SET_MODE(3) + +seq.sleep_until("10:10:10.5000") + +rcsController.FIRE_THRUSTERS() \ No newline at end of file From c833af085e26f7d8f1dc727c6cbc0f327a78b449 Mon Sep 17 00:00:00 2001 From: Zimri Leisher Date: Mon, 28 Oct 2024 19:05:23 -0500 Subject: [PATCH 04/14] Much more work on adv compiler --- pyproject.toml | 1 + src/fprime_gds/common/sequence/compiler.py | 354 +- src/fprime_gds/common/sequence/test_seq.py | 11 - .../sequence/RefTopologyDictionary.json | 10112 ++++++++++++++++ .../common/sequence/test_basic_seq.py | 9 + 5 files changed, 10411 insertions(+), 76 deletions(-) delete mode 100644 src/fprime_gds/common/sequence/test_seq.py create mode 100644 test/fprime_gds/common/sequence/RefTopologyDictionary.json create mode 100644 test/fprime_gds/common/sequence/test_basic_seq.py diff --git a/pyproject.toml b/pyproject.toml index be454e93..8ca47035 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -61,6 +61,7 @@ fprime-cli = "fprime_gds.executables.fprime_cli:main" fprime-seqgen = "fprime_gds.common.tools.seqgen:main" fprime-dp-write = "fprime_gds.executables.data_product_writer:main" fprime-gds = "fprime_gds.executables.run_deployment:main" +fprime-seq = "fprime_gds.common.sequence.compiler:main" # For Pytest fixtures [project.entry-points."pytest11"] diff --git a/src/fprime_gds/common/sequence/compiler.py b/src/fprime_gds/common/sequence/compiler.py index b8b48d01..98187811 100644 --- a/src/fprime_gds/common/sequence/compiler.py +++ b/src/fprime_gds/common/sequence/compiler.py @@ -1,88 +1,298 @@ +import numbers +from dataclasses import dataclass import inspect import ast from pathlib import Path from argparse import ArgumentParser -from dictionary_ac import * -from builtin_ac import * - -def validate_func_call(obj_name, fn_name, args): - - valid = False - - if obj_name is None: - # it is a builtin - valid = validate_builtin(fn_name, args) - else: - # it is a command to a component - valid = validate_command(obj_name, fn_name, args) - - if not valid: - print("Invalid function call", obj_name, fn_name, args) - return False +import sys +import logging - print("Valid function call", obj_name, fn_name, args) - return True +logging.basicConfig() +logger = logging.getLogger(__file__) +from fprime_gds.common.data_types.cmd_data import CmdData +from fprime_gds.common.loaders.cmd_json_loader import CmdJsonLoader +from fprime_gds.common.templates.cmd_template import CmdTemplate +from fprime.common.models.serialize.serializable_type import SerializableType +from fprime.common.models.serialize.array_type import ArrayType +from fprime.common.models.serialize.numerical_types import ( + I16Type, + I32Type, + I64Type, + I8Type, + F32Type, + F64Type, + U16Type, + U32Type, + U64Type, + U8Type, +) +from fprime.common.models.serialize.bool_type import BoolType +from fprime.common.models.serialize.string_type import StringType +from fprime.common.models.serialize.enum_type import EnumType +from fprime.common.models.serialize.type_base import BaseType, ValueType -def validate_builtin(fn_name, args): - for builtin in builtins: - if builtin.__name__ == fn_name: - # there is a builtin with this name - return validate_builtin_args(builtin, args) - # there is no builtin with this name - return False -def validate_builtin_args(builtin, args): - signature = inspect.signature(builtin) +@dataclass +class CmdCall: + node: ast.Call + cmd_name: str + cmd_template: CmdTemplate + args: list - if len(args) != len(signature.parameters): - print(f"{builtin.__name__} expects {len(signature.parameters)} args but {len(args)} args were given") - return False - return True +@dataclass +class TypeInstantiate: + node: ast.Call + type_name: str + type_template: BaseType + args: list -def validate_command(component_name, cmd_name, args): - for instance in instances: - if instance.name == component_name: - instance_cmds = inspect.getmembers(instance) - for instance_cmd in instance_cmds: - if instance_cmd[0] == cmd_name: - return validate_command_args(instance_cmd[1], args) - return False -def validate_command_args(cmd_fn, args): - signature = inspect.signature(cmd_fn) +class TransformToFPrime(ast.NodeTransformer): - if len(args) != len(signature.parameters): - print(f"Command {cmd_fn.__name__} expects {len(signature.parameters)} args but {len(args)} args were given") - return False + def __init__(self, cmd_name_dict: dict[str, CmdTemplate], type_name_dict: dict[str, type[ValueType]]) -> None: + super().__init__() + self.cmd_name_dict = cmd_name_dict + + def visit_Module(self, node: ast.Module): + for statement in node.body: + statement: ast.stmt + if not isinstance(statement, ast.Expr) or not isinstance( + statement.value, ast.Call + ): + statement.error = "Invalid syntax: Sequences can only contain commands" + return self.generic_visit(node) + + def visit_Attribute(self, node: ast.Attribute): + """resolve the attribute into either a CmdTemplate instance or a BaseType type""" + + namespace_node = node.value + # concatenate namespaces + namespace = [] + while isinstance(namespace_node, ast.Attribute): + namespace.insert(0, namespace_node.attr) + namespace_node = namespace_node.value - return True + if isinstance(namespace_node, ast.Name): + namespace.insert(0, namespace_node.id) + namespace_str = ".".join(namespace) -class NodeVisitor(ast.NodeVisitor): - def generic_visit(self, node): - super().generic_visit(node) def visit_Call(self, node: ast.Call): - obj_name = None - fn_name = None - args = node.args - if isinstance(node.func, ast.Attribute): - # call to an attr of an obj - if isinstance(node.func.value, ast.Name): - obj_name = node.func.value.id - fn_name = node.func.attr - elif isinstance(node.func, ast.Name): - # direct call, not on obj - fn_name = node.func.id + cmd_name = self.get_name(node.func) + if cmd_name not in self.cmd_name_dict: + node.error = "Unknown command name " + str(cmd_name) + return node + + cmd_template: CmdTemplate = self.cmd_name_dict[cmd_name] + cmd_args_map = self.map_cmd_args(cmd_template, node) + for fprime_arg, fpy_expr in cmd_args_map: + fprime_name, fprime_desc, fprime_type = fprime_arg + self.fpy_node_to_fprime_type(cmd_template, fprime_name, fprime_type, fpy_expr) + + def map_cmd_args( + self, template: CmdTemplate, node: ast.Call + ) -> dict[tuple[str, str, ValueType], ast.Expression]: + """ + Maps arguments from a command template to an fpy expression by position and name. Does not perform type checking. + """ + + mapping = dict() + + for idx, arg_template in enumerate(template.arguments): + arg_name, arg_desc, arg_type = arg_template + + arg_node = None + + if idx < len(node.args): + # if we're still in positional args + arg_node = node.args[idx] + else: + # if we're in kwargs + # find a matching node from keywords + arg_node = [n for n in node.keywords if n.arg == arg_name] + if len(arg_node) != 1: + if len(arg_node) == 0: + # unable to find a matching kwarg for this arg template + node.error = "Missing argument " + str(arg_name) + continue + else: + for arg_n in arg_node: + arg_n.error = "Multiple values for " + str(arg_name) + continue + + arg_node = arg_node[0] + + mapping[arg_template] = arg_node + + return mapping + + def fpy_node_to_fprime_type( + self, + cmd_template: CmdTemplate, + arg_name: str, + fprime_type_name: str, + fprime_type: type, + fpy_node: ast.Expression, + ) -> ValueType: + """ + Ensure the fpy node can be turned into the desired FPrime type + """ + + def error(node, msg): + node.error = "In command " + str(cmd_template.get_comp_name()) + "." + str(cmd_template.get_name()) + " for argument " + str(arg_name) + ": " + str(msg) + + + fprime_type_instance = fprime_type() + if issubclass(fprime_type, BoolType): + if not isinstance(fpy_node, ast.Constant) or not isinstance( + fpy_node.value, bool + ): + error(fpy_node, "Expected a boolean literal, found " + str(type(fpy_node.value))) + return fprime_type_instance + fprime_type_instance._val = fpy_node.value + elif issubclass(fprime_type, (F64Type, F32Type)): + if not isinstance(fpy_node, ast.Constant) or not isinstance( + fpy_node.value, float + ): + error(fpy_node, "Expected a floating point literal, found " + str(type(fpy_node.value))) + return fprime_type_instance + fprime_type_instance._val = fpy_node.value + elif issubclass( + fprime_type, + (I64Type, U64Type, I32Type, U32Type, I16Type, U16Type, I8Type, U8Type), + ): + if not isinstance(fpy_node, ast.Constant) or not isinstance( + fpy_node.value, int + ): + error(fpy_node, "Expected an integer literal, found " + str(type(fpy_node.value))) + return fprime_type_instance + fprime_type_instance._val = fpy_node.value + elif issubclass(fprime_type, StringType): + if not isinstance(fpy_node, ast.Constant) or not isinstance( + fpy_node.value, str + ): + error(fpy_node, "Expected a string literal, found " + str(type(fpy_node.value))) + return fprime_type_instance + fprime_type_instance._val = fpy_node.value + elif issubclass(fprime_type, EnumType): + + # all enums follow the form Fprime.Qualified.Type.ENUM_CONST_NAME + if not isinstance(fpy_node, ast.Attribute): + # not an enum literal + error(fpy_node, "Expected an enum literal") + return fprime_type_instance + + fpy_enum_name = self.get_name(fpy_node.value) # fpy_node.value is the fqn of the enum + if fpy_enum_name is None: + # unable to get the name from this ast + error(fpy_node, "Invalid syntax") + return fprime_type_instance + + resolved_enum_type = self.resolve_type_name(fpy_enum_name) + if resolved_enum_type is None: + # couldn't find this enum in the type dict + error(fpy_node, "Unknown type " + str(fpy_enum_name)) + return fprime_type_instance + + if resolved_enum_type != fprime_type: + # wrong type + error(fpy_node, "Expected a value from enum " + str(fprime_type.__name__) + " but got one from " + str(resolved_enum_type.__name__)) + return fprime_type_instance + + fprime_type_instance._val = fpy_node.attr # fpy_node.attr is ENUM_CONST_NAME + + elif issubclass(fprime_type, (ArrayType, SerializableType)): + + + + # all arrays and structs follow the form Fprime.Qualified.Type() + fpy_type_name = self.get_name(fpy_node.value) # fpy_node.value is the fqn of the enum + if fpy_enum_name is None: + # unable to get the name from this ast + fpy_node.error = "Invalid syntax" + return fprime_type_instance + + resolved_enum_type = self.resolve_type_name(fpy_enum_name) + if resolved_enum_type is None: + # couldn't find this enum in the type dict + fpy_node.error = "Unknown type " + str(fpy_enum_name) + return fprime_type_instance + + if resolved_enum_type != fprime_type: + # wrong enum + fpy_node.error = "Expected a value from enum " + str(fprime_type.__name__) + " but got one from " + str(resolved_enum_type.__name__) + return fprime_type_instance + + fprime_type_instance._val = fpy_node.attr + + def node_to_fprime_type(self, node: ast.Expression, into_type: ValueType) -> bool: + """ + Turn the node into an instance of the desired FPrime type + """ + return False + + def get_name(self, name: ast.Expression) -> str|None: + + def resolve_cmd_name(self, cmd_name: str) -> CmdTemplate|None: + return self.cmd_name_dict.get(cmd_name, None) + + def resolve_type_name(self, enum_name: str) -> type[ValueType]|None: + return self.type_name_dict.get(enum_name, str) + + def process_args(self, input_values): + """Process input arguments""" + errors = [] + args = [] + for val, arg_tuple in zip(input_values, self.template.arguments): + try: + _, _, arg_type = arg_tuple + arg_value = arg_type() + self.convert_arg_value(val, arg_value) + args.append(arg_value) + errors.append("") + except Exception as exc: + errors.append(str(exc)) + return args, errors + + +def check_for_errors(node: ast.Module): + def visit(n): + if hasattr(n, "error"): + error_str = "error" + if hasattr(n, "lineno"): + error_str += " on line " + str(n.lineno) + error_str += ": " + n.error + print(error_str) + return False + for field, value in ast.iter_fields(n): + if isinstance(value, list): + for item in value: + if isinstance(item, ast.AST): + return visit(item) + elif isinstance(value, ast.AST): + return visit(value) + return True + + return visit(node) - validate_func_call(obj_name, fn_name, args) def main(): - arg_parser = ArgumentParser(description="A compiler for the FPrime advanced sequencing language") + arg_parser = ArgumentParser( + description="A compiler for the FPrime advanced sequencing language" + ) - arg_parser.add_argument("input", type=Path, help="The path of the input sequence to compile") + arg_parser.add_argument( + "input", type=Path, help="The path of the input sequence to compile" + ) + arg_parser.add_argument( + "-d", + "--dictionary", + type=Path, + help="The JSON topology dictionary to compile against", + ) args = arg_parser.parse_args() @@ -90,7 +300,21 @@ def main(): node = ast.parse(input_text) - NodeVisitor().generic_visit(node) + compile(node, args.dictionary) + + +def compile(node: ast.Module, dictionary: Path): + print(ast.dump(node, indent=4)) + cmd_json_dict = CmdJsonLoader(dictionary) + (cmd_id_dict, cmd_name_dict, versions) = cmd_json_dict.construct_dicts(dictionary) + type_name_dict = cmd_json_dict.parsed_types + py_to_fprime_transformer = TransformToFPrime(cmd_name_dict, type_name_dict) + node = py_to_fprime_transformer.visit(node) + if not check_for_errors(node): + return 1 + + return 0 + if __name__ == "__main__": - main() \ No newline at end of file + sys.exit(main()) diff --git a/src/fprime_gds/common/sequence/test_seq.py b/src/fprime_gds/common/sequence/test_seq.py deleted file mode 100644 index 287be56d..00000000 --- a/src/fprime_gds/common/sequence/test_seq.py +++ /dev/null @@ -1,11 +0,0 @@ -from dictionary_ac import * - -# make sure that it's obvious that the sleep function is not a top level function -seq.sleep(1, 100) - -fswExec.SET_MODE(2) -fswExec.SET_MODE(3) - -seq.sleep_until("10:10:10.5000") - -rcsController.FIRE_THRUSTERS() \ No newline at end of file diff --git a/test/fprime_gds/common/sequence/RefTopologyDictionary.json b/test/fprime_gds/common/sequence/RefTopologyDictionary.json new file mode 100644 index 00000000..5ab79f88 --- /dev/null +++ b/test/fprime_gds/common/sequence/RefTopologyDictionary.json @@ -0,0 +1,10112 @@ +{ + "metadata" : { + "deploymentName" : "Ref", + "projectVersion" : "d034786bc", + "frameworkVersion" : "d034786bc", + "libraryVersions" : [ + ], + "dictionarySpecVersion" : "1.0.0" + }, + "typeDefinitions" : [ + { + "kind" : "struct", + "qualifiedName" : "Ref.PacketStat", + "members" : { + "BuffRecv" : { + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "index" : 0, + "annotation" : "Number of buffers received" + }, + "BuffErr" : { + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "index" : 1, + "annotation" : "Number of buffers received with errors" + }, + "PacketStatus" : { + "type" : { + "name" : "Ref.PacketRecvStatus", + "kind" : "qualifiedIdentifier" + }, + "index" : 2, + "annotation" : "Packet Status" + } + }, + "default" : { + "BuffRecv" : 0, + "BuffErr" : 0, + "PacketStatus" : "Ref.PacketRecvStatus.PACKET_STATE_NO_PACKETS" + }, + "annotation" : "Some Packet Statistics" + }, + { + "kind" : "enum", + "qualifiedName" : "Fw.Wait", + "representationType" : { + "name" : "I32", + "kind" : "integer", + "size" : 32, + "signed" : true + }, + "enumeratedConstants" : [ + { + "name" : "WAIT", + "value" : 0 + }, + { + "name" : "NO_WAIT", + "value" : 1 + } + ], + "default" : "Fw.Wait.WAIT", + "annotation" : "Wait or don't wait for something" + }, + { + "kind" : "enum", + "qualifiedName" : "Svc.CmdSequencer.FileReadStage", + "representationType" : { + "name" : "I32", + "kind" : "integer", + "size" : 32, + "signed" : true + }, + "enumeratedConstants" : [ + { + "name" : "READ_HEADER", + "value" : 0 + }, + { + "name" : "READ_HEADER_SIZE", + "value" : 1 + }, + { + "name" : "DESER_SIZE", + "value" : 2 + }, + { + "name" : "DESER_NUM_RECORDS", + "value" : 3 + }, + { + "name" : "DESER_TIME_BASE", + "value" : 4 + }, + { + "name" : "DESER_TIME_CONTEXT", + "value" : 5 + }, + { + "name" : "READ_SEQ_CRC", + "value" : 6 + }, + { + "name" : "READ_SEQ_DATA", + "value" : 7 + }, + { + "name" : "READ_SEQ_DATA_SIZE", + "value" : 8 + } + ], + "default" : "Svc.CmdSequencer.FileReadStage.READ_HEADER", + "annotation" : "The stage of the file read operation" + }, + { + "kind" : "enum", + "qualifiedName" : "Fw.ParamValid", + "representationType" : { + "name" : "I32", + "kind" : "integer", + "size" : 32, + "signed" : true + }, + "enumeratedConstants" : [ + { + "name" : "UNINIT", + "value" : 0 + }, + { + "name" : "VALID", + "value" : 1 + }, + { + "name" : "INVALID", + "value" : 2 + }, + { + "name" : "DEFAULT", + "value" : 3 + } + ], + "default" : "Fw.ParamValid.UNINIT", + "annotation" : "Enum representing parameter validity" + }, + { + "kind" : "enum", + "qualifiedName" : "Svc.VersionEnabled", + "representationType" : { + "name" : "I32", + "kind" : "integer", + "size" : 32, + "signed" : true + }, + "enumeratedConstants" : [ + { + "name" : "DISABLED", + "value" : 0, + "annotation" : "verbosity disabled" + }, + { + "name" : "ENABLED", + "value" : 1, + "annotation" : "verbosity enabled" + } + ], + "default" : "Svc.VersionEnabled.DISABLED", + "annotation" : "Tracks versions for project, framework and user defined versions etc" + }, + { + "kind" : "enum", + "qualifiedName" : "Svc.ActiveLogger.Enabled", + "representationType" : { + "name" : "I32", + "kind" : "integer", + "size" : 32, + "signed" : true + }, + "enumeratedConstants" : [ + { + "name" : "ENABLED", + "value" : 0, + "annotation" : "Enabled state" + }, + { + "name" : "DISABLED", + "value" : 1, + "annotation" : "Disabled state" + } + ], + "default" : "Svc.ActiveLogger.Enabled.ENABLED", + "annotation" : "Enabled and disabled state" + }, + { + "kind" : "struct", + "qualifiedName" : "Ref.SignalPair", + "members" : { + "time" : { + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "index" : 0, + "format" : "{f}" + }, + "value" : { + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "index" : 1, + "format" : "{f}" + } + }, + "default" : { + "time" : 0.0, + "value" : 0.0 + } + }, + { + "kind" : "enum", + "qualifiedName" : "Svc.PrmDb.PrmReadError", + "representationType" : { + "name" : "I32", + "kind" : "integer", + "size" : 32, + "signed" : true + }, + "enumeratedConstants" : [ + { + "name" : "OPEN", + "value" : 0 + }, + { + "name" : "DELIMITER", + "value" : 1 + }, + { + "name" : "DELIMITER_SIZE", + "value" : 2 + }, + { + "name" : "DELIMITER_VALUE", + "value" : 3 + }, + { + "name" : "RECORD_SIZE", + "value" : 4 + }, + { + "name" : "RECORD_SIZE_SIZE", + "value" : 5 + }, + { + "name" : "RECORD_SIZE_VALUE", + "value" : 6 + }, + { + "name" : "PARAMETER_ID", + "value" : 7 + }, + { + "name" : "PARAMETER_ID_SIZE", + "value" : 8 + }, + { + "name" : "PARAMETER_VALUE", + "value" : 9 + }, + { + "name" : "PARAMETER_VALUE_SIZE", + "value" : 10 + } + ], + "default" : "Svc.PrmDb.PrmReadError.OPEN", + "annotation" : "Parameter read error" + }, + { + "kind" : "array", + "qualifiedName" : "Ref.ManyChoices", + "size" : 2, + "elementType" : { + "name" : "Ref.Choice", + "kind" : "qualifiedIdentifier" + }, + "default" : [ + "Ref.Choice.ONE", + "Ref.Choice.ONE" + ], + "annotation" : "Enumeration array" + }, + { + "kind" : "enum", + "qualifiedName" : "Svc.CmdSequencer.SeqMode", + "representationType" : { + "name" : "I32", + "kind" : "integer", + "size" : 32, + "signed" : true + }, + "enumeratedConstants" : [ + { + "name" : "STEP", + "value" : 0 + }, + { + "name" : "AUTO", + "value" : 1 + } + ], + "default" : "Svc.CmdSequencer.SeqMode.STEP", + "annotation" : "The sequencer mode" + }, + { + "kind" : "enum", + "qualifiedName" : "Fw.DeserialStatus", + "representationType" : { + "name" : "I32", + "kind" : "integer", + "size" : 32, + "signed" : true + }, + "enumeratedConstants" : [ + { + "name" : "OK", + "value" : 0 + }, + { + "name" : "BUFFER_EMPTY", + "value" : 3, + "annotation" : "Deserialization buffer was empty when trying to read data" + }, + { + "name" : "FORMAT_ERROR", + "value" : 4, + "annotation" : "Deserialization data had incorrect values (unexpected data types)" + }, + { + "name" : "SIZE_MISMATCH", + "value" : 5, + "annotation" : "Data was left in in the buffer, but not enough to deserialize" + }, + { + "name" : "TYPE_MISMATCH", + "value" : 6, + "annotation" : "Deserialized type ID didn't match" + } + ], + "default" : "Fw.DeserialStatus.OK", + "annotation" : "Deserialization status" + }, + { + "kind" : "enum", + "qualifiedName" : "Ref.PacketRecvStatus", + "representationType" : { + "name" : "I32", + "kind" : "integer", + "size" : 32, + "signed" : true + }, + "enumeratedConstants" : [ + { + "name" : "PACKET_STATE_NO_PACKETS", + "value" : 0 + }, + { + "name" : "PACKET_STATE_OK", + "value" : 1 + }, + { + "name" : "PACKET_STATE_ERRORS", + "value" : 3, + "annotation" : "Receiver has seen errors" + } + ], + "default" : "Ref.PacketRecvStatus.PACKET_STATE_NO_PACKETS", + "annotation" : "Packet receive status" + }, + { + "kind" : "struct", + "qualifiedName" : "Ref.ChoicePair", + "members" : { + "firstChoice" : { + "type" : { + "name" : "Ref.Choice", + "kind" : "qualifiedIdentifier" + }, + "index" : 0, + "annotation" : "The first choice to make" + }, + "secondChoice" : { + "type" : { + "name" : "Ref.Choice", + "kind" : "qualifiedIdentifier" + }, + "index" : 1, + "annotation" : "The second choice to make" + } + }, + "default" : { + "firstChoice" : "Ref.Choice.ONE", + "secondChoice" : "Ref.Choice.ONE" + }, + "annotation" : "Structure of enums" + }, + { + "kind" : "enum", + "qualifiedName" : "Svc.PrmDb.PrmWriteError", + "representationType" : { + "name" : "I32", + "kind" : "integer", + "size" : 32, + "signed" : true + }, + "enumeratedConstants" : [ + { + "name" : "OPEN", + "value" : 0 + }, + { + "name" : "DELIMITER", + "value" : 1 + }, + { + "name" : "DELIMITER_SIZE", + "value" : 2 + }, + { + "name" : "RECORD_SIZE", + "value" : 3 + }, + { + "name" : "RECORD_SIZE_SIZE", + "value" : 4 + }, + { + "name" : "PARAMETER_ID", + "value" : 5 + }, + { + "name" : "PARAMETER_ID_SIZE", + "value" : 6 + }, + { + "name" : "PARAMETER_VALUE", + "value" : 7 + }, + { + "name" : "PARAMETER_VALUE_SIZE", + "value" : 8 + } + ], + "default" : "Svc.PrmDb.PrmWriteError.OPEN", + "annotation" : "Parameter write error" + }, + { + "kind" : "array", + "qualifiedName" : "Ref.TooManyChoices", + "size" : 2, + "elementType" : { + "name" : "Ref.ManyChoices", + "kind" : "qualifiedIdentifier" + }, + "default" : [ + [ + "Ref.Choice.ONE", + "Ref.Choice.ONE" + ], + [ + "Ref.Choice.ONE", + "Ref.Choice.ONE" + ] + ], + "annotation" : "Array of array" + }, + { + "kind" : "struct", + "qualifiedName" : "Ref.SignalInfo", + "members" : { + "type" : { + "type" : { + "name" : "Ref.SignalType", + "kind" : "qualifiedIdentifier" + }, + "index" : 0 + }, + "history" : { + "type" : { + "name" : "Ref.SignalSet", + "kind" : "qualifiedIdentifier" + }, + "index" : 1 + }, + "pairHistory" : { + "type" : { + "name" : "Ref.SignalPairSet", + "kind" : "qualifiedIdentifier" + }, + "index" : 2 + } + }, + "default" : { + "type" : "Ref.SignalType.TRIANGLE", + "history" : [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + "pairHistory" : [ + { + "time" : 0.0, + "value" : 0.0 + }, + { + "time" : 0.0, + "value" : 0.0 + }, + { + "time" : 0.0, + "value" : 0.0 + }, + { + "time" : 0.0, + "value" : 0.0 + } + ] + } + }, + { + "kind" : "struct", + "qualifiedName" : "Ref.ScalarStruct", + "members" : { + "u32" : { + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "index" : 0 + }, + "f64" : { + "type" : { + "name" : "F64", + "kind" : "float", + "size" : 64 + }, + "index" : 1 + }, + "f32" : { + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "index" : 2 + }, + "i8" : { + "type" : { + "name" : "I8", + "kind" : "integer", + "size" : 8, + "signed" : true + }, + "index" : 3 + }, + "i16" : { + "type" : { + "name" : "I16", + "kind" : "integer", + "size" : 16, + "signed" : true + }, + "index" : 4 + }, + "u8" : { + "type" : { + "name" : "U8", + "kind" : "integer", + "size" : 8, + "signed" : false + }, + "index" : 5 + }, + "u64" : { + "type" : { + "name" : "U64", + "kind" : "integer", + "size" : 64, + "signed" : false + }, + "index" : 6 + }, + "i64" : { + "type" : { + "name" : "I64", + "kind" : "integer", + "size" : 64, + "signed" : true + }, + "index" : 7 + }, + "i32" : { + "type" : { + "name" : "I32", + "kind" : "integer", + "size" : 32, + "signed" : true + }, + "index" : 8 + }, + "u16" : { + "type" : { + "name" : "U16", + "kind" : "integer", + "size" : 16, + "signed" : false + }, + "index" : 9 + } + }, + "default" : { + "u32" : 0, + "f64" : 0.0, + "f32" : 0.0, + "i8" : 0, + "i16" : 0, + "u8" : 0, + "u64" : 0, + "i64" : 0, + "i32" : 0, + "u16" : 0 + }, + "annotation" : "All scalar inputs" + }, + { + "kind" : "enum", + "qualifiedName" : "Svc.VersionType", + "representationType" : { + "name" : "I32", + "kind" : "integer", + "size" : 32, + "signed" : true + }, + "enumeratedConstants" : [ + { + "name" : "PROJECT", + "value" : 0, + "annotation" : "project version" + }, + { + "name" : "FRAMEWORK", + "value" : 1, + "annotation" : "framework version" + }, + { + "name" : "LIBRARY", + "value" : 2, + "annotation" : "library version" + }, + { + "name" : "CUSTOM", + "value" : 3, + "annotation" : "custom version" + }, + { + "name" : "ALL", + "value" : 4, + "annotation" : "all above versions" + } + ], + "default" : "Svc.VersionType.PROJECT", + "annotation" : "An enumeration for Version Type" + }, + { + "kind" : "enum", + "qualifiedName" : "Fw.Enabled", + "representationType" : { + "name" : "I32", + "kind" : "integer", + "size" : 32, + "signed" : true + }, + "enumeratedConstants" : [ + { + "name" : "DISABLED", + "value" : 0, + "annotation" : "Disabled state" + }, + { + "name" : "ENABLED", + "value" : 1, + "annotation" : "Enabled state" + } + ], + "default" : "Fw.Enabled.DISABLED", + "annotation" : "Enabled and disabled states" + }, + { + "kind" : "enum", + "qualifiedName" : "Fw.CmdResponse", + "representationType" : { + "name" : "I32", + "kind" : "integer", + "size" : 32, + "signed" : true + }, + "enumeratedConstants" : [ + { + "name" : "OK", + "value" : 0, + "annotation" : "Command successfully executed" + }, + { + "name" : "INVALID_OPCODE", + "value" : 1, + "annotation" : "Invalid opcode dispatched" + }, + { + "name" : "VALIDATION_ERROR", + "value" : 2, + "annotation" : "Command failed validation" + }, + { + "name" : "FORMAT_ERROR", + "value" : 3, + "annotation" : "Command failed to deserialize" + }, + { + "name" : "EXECUTION_ERROR", + "value" : 4, + "annotation" : "Command had execution error" + }, + { + "name" : "BUSY", + "value" : 5, + "annotation" : "Component busy" + } + ], + "default" : "Fw.CmdResponse.OK", + "annotation" : "Enum representing a command response" + }, + { + "kind" : "enum", + "qualifiedName" : "Svc.CmdSequencer.BlockState", + "representationType" : { + "name" : "I32", + "kind" : "integer", + "size" : 32, + "signed" : true + }, + "enumeratedConstants" : [ + { + "name" : "BLOCK", + "value" : 0 + }, + { + "name" : "NO_BLOCK", + "value" : 1 + } + ], + "default" : "Svc.CmdSequencer.BlockState.BLOCK", + "annotation" : "Sequencer blocking state" + }, + { + "kind" : "enum", + "qualifiedName" : "Fw.DpState", + "representationType" : { + "name" : "U8", + "kind" : "integer", + "size" : 8, + "signed" : false + }, + "enumeratedConstants" : [ + { + "name" : "UNTRANSMITTED", + "value" : 0, + "annotation" : "The untransmitted state" + }, + { + "name" : "PARTIAL", + "value" : 1, + "annotation" : "The partially transmitted state\nA data product is in this state from the start of transmission\nuntil transmission is complete." + }, + { + "name" : "TRANSMITTED", + "value" : 2, + "annotation" : "The transmitted state" + } + ], + "default" : "Fw.DpState.UNTRANSMITTED" + }, + { + "kind" : "enum", + "qualifiedName" : "Ref.SignalType", + "representationType" : { + "name" : "I32", + "kind" : "integer", + "size" : 32, + "signed" : true + }, + "enumeratedConstants" : [ + { + "name" : "TRIANGLE", + "value" : 0 + }, + { + "name" : "SQUARE", + "value" : 1 + }, + { + "name" : "SINE", + "value" : 2 + }, + { + "name" : "NOISE", + "value" : 3 + } + ], + "default" : "Ref.SignalType.TRIANGLE" + }, + { + "kind" : "array", + "qualifiedName" : "Ref.SignalPairSet", + "size" : 4, + "elementType" : { + "name" : "Ref.SignalPair", + "kind" : "qualifiedIdentifier" + }, + "default" : [ + { + "time" : 0.0, + "value" : 0.0 + }, + { + "time" : 0.0, + "value" : 0.0 + }, + { + "time" : 0.0, + "value" : 0.0 + }, + { + "time" : 0.0, + "value" : 0.0 + } + ] + }, + { + "kind" : "enum", + "qualifiedName" : "Svc.VersionStatus", + "representationType" : { + "name" : "I32", + "kind" : "integer", + "size" : 32, + "signed" : true + }, + "enumeratedConstants" : [ + { + "name" : "OK", + "value" : 0, + "annotation" : "Version was good" + }, + { + "name" : "FAILURE", + "value" : 1, + "annotation" : "Failure to get version" + } + ], + "default" : "Svc.VersionStatus.OK", + "annotation" : "An enumeration for version status" + }, + { + "kind" : "enum", + "qualifiedName" : "Ref.Choice", + "representationType" : { + "name" : "I32", + "kind" : "integer", + "size" : 32, + "signed" : true + }, + "enumeratedConstants" : [ + { + "name" : "ONE", + "value" : 0 + }, + { + "name" : "TWO", + "value" : 1 + }, + { + "name" : "RED", + "value" : 2 + }, + { + "name" : "BLUE", + "value" : 3 + } + ], + "default" : "Ref.Choice.ONE", + "annotation" : "Enumeration type for use later" + }, + { + "kind" : "enum", + "qualifiedName" : "Svc.VersionCfg.VersionEnum", + "representationType" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "enumeratedConstants" : [ + { + "name" : "PROJECT_VERSION_00", + "value" : 0, + "annotation" : "Entry 0" + }, + { + "name" : "PROJECT_VERSION_01", + "value" : 1, + "annotation" : "Entry 1" + }, + { + "name" : "PROJECT_VERSION_02", + "value" : 2, + "annotation" : "Entry 2" + }, + { + "name" : "PROJECT_VERSION_03", + "value" : 3, + "annotation" : "Entry 3" + }, + { + "name" : "PROJECT_VERSION_04", + "value" : 4, + "annotation" : "Entry 4" + }, + { + "name" : "PROJECT_VERSION_05", + "value" : 5, + "annotation" : "Entry 5" + }, + { + "name" : "PROJECT_VERSION_06", + "value" : 6, + "annotation" : "Entry 6" + }, + { + "name" : "PROJECT_VERSION_07", + "value" : 7, + "annotation" : "Entry 7" + }, + { + "name" : "PROJECT_VERSION_08", + "value" : 8, + "annotation" : "Entry 8" + }, + { + "name" : "PROJECT_VERSION_09", + "value" : 9, + "annotation" : "Entry 9" + } + ], + "default" : "Svc.VersionCfg.VersionEnum.PROJECT_VERSION_00", + "annotation" : "Define a set of Version entries on a project-specific\nbasis." + }, + { + "kind" : "struct", + "qualifiedName" : "Ref.ChoiceSlurry", + "members" : { + "tooManyChoices" : { + "type" : { + "name" : "Ref.TooManyChoices", + "kind" : "qualifiedIdentifier" + }, + "index" : 0, + "annotation" : "A large set of disorganized choices" + }, + "separateChoice" : { + "type" : { + "name" : "Ref.Choice", + "kind" : "qualifiedIdentifier" + }, + "index" : 1, + "annotation" : "A singular choice" + }, + "choicePair" : { + "type" : { + "name" : "Ref.ChoicePair", + "kind" : "qualifiedIdentifier" + }, + "index" : 2, + "annotation" : "A pair of choices" + }, + "choiceAsMemberArray" : { + "type" : { + "name" : "U8", + "kind" : "integer", + "size" : 8, + "signed" : false + }, + "index" : 3, + "size" : 2, + "annotation" : "An array of choices defined as member array" + } + }, + "default" : { + "tooManyChoices" : [ + [ + "Ref.Choice.ONE", + "Ref.Choice.ONE" + ], + [ + "Ref.Choice.ONE", + "Ref.Choice.ONE" + ] + ], + "separateChoice" : "Ref.Choice.ONE", + "choicePair" : { + "firstChoice" : "Ref.Choice.ONE", + "secondChoice" : "Ref.Choice.ONE" + }, + "choiceAsMemberArray" : 0 + }, + "annotation" : "Structure of enums (with an multi-dimensional array and structure)" + }, + { + "kind" : "enum", + "qualifiedName" : "Svc.DpHdrField", + "representationType" : { + "name" : "I32", + "kind" : "integer", + "size" : 32, + "signed" : true + }, + "enumeratedConstants" : [ + { + "name" : "DESCRIPTOR", + "value" : 0 + }, + { + "name" : "ID", + "value" : 1 + }, + { + "name" : "PRIORITY", + "value" : 2 + }, + { + "name" : "CRC", + "value" : 3 + } + ], + "default" : "Svc.DpHdrField.DESCRIPTOR", + "annotation" : "Header validation error" + }, + { + "kind" : "array", + "qualifiedName" : "Ref.FloatSet", + "size" : 3, + "elementType" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "default" : [ + 0.0, + 0.0, + 0.0 + ], + "annotation" : "Set of floating points to emit" + }, + { + "kind" : "enum", + "qualifiedName" : "Ref.SendBuff.ActiveState", + "representationType" : { + "name" : "I32", + "kind" : "integer", + "size" : 32, + "signed" : true + }, + "enumeratedConstants" : [ + { + "name" : "SEND_IDLE", + "value" : 0 + }, + { + "name" : "SEND_ACTIVE", + "value" : 1 + } + ], + "default" : "Ref.SendBuff.ActiveState.SEND_IDLE", + "annotation" : "Active state" + }, + { + "kind" : "enum", + "qualifiedName" : "Svc.ActiveLogger.FilterSeverity", + "representationType" : { + "name" : "I32", + "kind" : "integer", + "size" : 32, + "signed" : true + }, + "enumeratedConstants" : [ + { + "name" : "WARNING_HI", + "value" : 0, + "annotation" : "Filter WARNING_HI events" + }, + { + "name" : "WARNING_LO", + "value" : 1, + "annotation" : "Filter WARNING_LO events" + }, + { + "name" : "COMMAND", + "value" : 2, + "annotation" : "Filter COMMAND events" + }, + { + "name" : "ACTIVITY_HI", + "value" : 3, + "annotation" : "Filter ACTIVITY_HI events" + }, + { + "name" : "ACTIVITY_LO", + "value" : 4, + "annotation" : "Filter ACTIVITY_LO events" + }, + { + "name" : "DIAGNOSTIC", + "value" : 5, + "annotation" : "Filter DIAGNOSTIC events" + } + ], + "default" : "Svc.ActiveLogger.FilterSeverity.WARNING_HI", + "annotation" : "Severity level for event filtering\nSimilar to Fw::LogSeverity, but no FATAL event" + }, + { + "kind" : "enum", + "qualifiedName" : "Svc.SystemResourceEnabled", + "representationType" : { + "name" : "I32", + "kind" : "integer", + "size" : 32, + "signed" : true + }, + "enumeratedConstants" : [ + { + "name" : "DISABLED", + "value" : 0 + }, + { + "name" : "ENABLED", + "value" : 1 + } + ], + "default" : "Svc.SystemResourceEnabled.DISABLED" + }, + { + "kind" : "struct", + "qualifiedName" : "Svc.CustomVersionDb", + "members" : { + "version_enum" : { + "type" : { + "name" : "Svc.VersionCfg.VersionEnum", + "kind" : "qualifiedIdentifier" + }, + "index" : 0, + "annotation" : "enumeration/name of the custom version" + }, + "version_value" : { + "type" : { + "name" : "string", + "kind" : "string", + "size" : 80 + }, + "index" : 1, + "annotation" : "string containing custom version" + }, + "version_status" : { + "type" : { + "name" : "Svc.VersionStatus", + "kind" : "qualifiedIdentifier" + }, + "index" : 2, + "annotation" : "status of the custom version" + } + }, + "default" : { + "version_enum" : "Svc.VersionCfg.VersionEnum.PROJECT_VERSION_00", + "version_value" : "", + "version_status" : "Svc.VersionStatus.OK" + }, + "annotation" : "Data Structure for custom version Tlm" + }, + { + "kind" : "array", + "qualifiedName" : "Ref.SignalSet", + "size" : 4, + "elementType" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "default" : [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + "format" : "{f}" + }, + { + "kind" : "struct", + "qualifiedName" : "Svc.DpRecord", + "members" : { + "priority" : { + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "index" : 0 + }, + "size" : { + "type" : { + "name" : "U64", + "kind" : "integer", + "size" : 64, + "signed" : false + }, + "index" : 1 + }, + "state" : { + "type" : { + "name" : "Fw.DpState", + "kind" : "qualifiedIdentifier" + }, + "index" : 2 + }, + "tSec" : { + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "index" : 3 + }, + "id" : { + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "index" : 4 + }, + "tSub" : { + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "index" : 5 + } + }, + "default" : { + "priority" : 0, + "size" : 0, + "state" : "Fw.DpState.UNTRANSMITTED", + "tSec" : 0, + "id" : 0, + "tSub" : 0 + }, + "annotation" : "Data structure representing a data product." + } + ], + "commands" : [ + { + "name" : "Ref.cmdDisp.CMD_CLEAR_TRACKING", + "commandKind" : "async", + "opcode" : 1283, + "formalParams" : [ + ], + "queueFullBehavior" : "assert", + "annotation" : "Clear command tracking info to recover from components not returning status" + }, + { + "name" : "Ref.pingRcvr.PR_StopPings", + "commandKind" : "async", + "opcode" : 2560, + "formalParams" : [ + ], + "queueFullBehavior" : "assert", + "annotation" : "Command to disable ping response" + }, + { + "name" : "Ref.fileManager.CreateDirectory", + "commandKind" : "async", + "opcode" : 2048, + "formalParams" : [ + { + "name" : "dirName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 256 + }, + "ref" : false, + "annotation" : "The directory to create" + } + ], + "queueFullBehavior" : "assert", + "annotation" : "Create a directory" + }, + { + "name" : "Ref.health.HLTH_ENABLE", + "commandKind" : "async", + "opcode" : 8192, + "formalParams" : [ + { + "name" : "enable", + "type" : { + "name" : "Fw.Enabled", + "kind" : "qualifiedIdentifier" + }, + "ref" : false, + "annotation" : "whether or not health checks are enabled" + } + ], + "queueFullBehavior" : "assert", + "annotation" : "A command to enable or disable health checks" + }, + { + "name" : "Ref.SG3.SignalGen_Toggle", + "commandKind" : "async", + "opcode" : 8961, + "formalParams" : [ + ], + "queueFullBehavior" : "assert", + "annotation" : "Toggle Signal Generator On/Off." + }, + { + "name" : "Ref.SG3.SignalGen_Settings", + "commandKind" : "async", + "opcode" : 8960, + "formalParams" : [ + { + "name" : "Frequency", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false + }, + { + "name" : "Amplitude", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "ref" : false + }, + { + "name" : "Phase", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "ref" : false + }, + { + "name" : "SigType", + "type" : { + "name" : "Ref.SignalType", + "kind" : "qualifiedIdentifier" + }, + "ref" : false + } + ], + "queueFullBehavior" : "assert", + "annotation" : "Signal Generator Settings" + }, + { + "name" : "Ref.sendBuffComp.SB_GEN_ASSERT", + "commandKind" : "async", + "opcode" : 9731, + "formalParams" : [ + { + "name" : "arg1", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "First ASSERT Argument" + }, + { + "name" : "arg2", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Second ASSERT Argument" + }, + { + "name" : "arg3", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Third ASSERT Argument" + }, + { + "name" : "arg4", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Fourth ASSERT Argument" + }, + { + "name" : "arg5", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Fifth ASSERT Argument" + }, + { + "name" : "arg6", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Sixth ASSERT Argument" + } + ], + "queueFullBehavior" : "assert", + "annotation" : "Generate an ASSERT" + }, + { + "name" : "Ref.version.VERSION", + "commandKind" : "guarded", + "opcode" : 19713, + "formalParams" : [ + { + "name" : "version_type", + "type" : { + "name" : "Svc.VersionType", + "kind" : "qualifiedIdentifier" + }, + "ref" : false, + "annotation" : "which version type Event is requested" + } + ], + "annotation" : "Report version as Event" + }, + { + "name" : "Ref.SG1.SignalGen_Skip", + "commandKind" : "async", + "opcode" : 8450, + "formalParams" : [ + ], + "queueFullBehavior" : "assert", + "annotation" : "Skip next sample" + }, + { + "name" : "Ref.fileDownlink.Cancel", + "commandKind" : "async", + "opcode" : 1793, + "formalParams" : [ + ], + "queueFullBehavior" : "assert", + "annotation" : "Cancel the downlink in progress, if any" + }, + { + "name" : "Ref.recvBuffComp.PARAMETER2_PARAM_SET", + "commandKind" : "set", + "opcode" : 18178, + "formalParams" : [ + { + "name" : "val", + "type" : { + "name" : "I16", + "kind" : "integer", + "size" : 16, + "signed" : true + }, + "ref" : false + } + ], + "annotation" : "A test parameter" + }, + { + "name" : "Ref.SG3.SignalGen_Dp", + "commandKind" : "async", + "opcode" : 8963, + "formalParams" : [ + { + "name" : "records", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false + } + ], + "queueFullBehavior" : "assert", + "annotation" : "Signal Generator Settings" + }, + { + "name" : "Ref.SG4.SignalGen_Skip", + "commandKind" : "async", + "opcode" : 9218, + "formalParams" : [ + ], + "queueFullBehavior" : "assert", + "annotation" : "Skip next sample" + }, + { + "name" : "Ref.typeDemo.DUMP_TYPED_PARAMETERS", + "commandKind" : "sync", + "opcode" : 4371, + "formalParams" : [ + ], + "annotation" : "Dump the typed parameters" + }, + { + "name" : "Ref.SG2.SignalGen_Toggle", + "commandKind" : "async", + "opcode" : 8705, + "formalParams" : [ + ], + "queueFullBehavior" : "assert", + "annotation" : "Toggle Signal Generator On/Off." + }, + { + "name" : "Ref.eventLogger.DUMP_FILTER_STATE", + "commandKind" : "async", + "opcode" : 2819, + "formalParams" : [ + ], + "queueFullBehavior" : "assert", + "annotation" : "Dump the filter states via events" + }, + { + "name" : "Ref.fileDownlink.SendFile", + "commandKind" : "async", + "opcode" : 1792, + "formalParams" : [ + { + "name" : "sourceFileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 100 + }, + "ref" : false, + "annotation" : "The name of the on-board file to send" + }, + { + "name" : "destFileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 100 + }, + "ref" : false, + "annotation" : "The name of the destination file on the ground" + } + ], + "queueFullBehavior" : "assert", + "annotation" : "Read a named file off the disk. Divide it into packets and send the packets for transmission to the ground." + }, + { + "name" : "Ref.SG4.SignalGen_Settings", + "commandKind" : "async", + "opcode" : 9216, + "formalParams" : [ + { + "name" : "Frequency", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false + }, + { + "name" : "Amplitude", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "ref" : false + }, + { + "name" : "Phase", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "ref" : false + }, + { + "name" : "SigType", + "type" : { + "name" : "Ref.SignalType", + "kind" : "qualifiedIdentifier" + }, + "ref" : false + } + ], + "queueFullBehavior" : "assert", + "annotation" : "Signal Generator Settings" + }, + { + "name" : "Ref.dpMgr.CLEAR_EVENT_THROTTLE", + "commandKind" : "async", + "opcode" : 3840, + "formalParams" : [ + ], + "queueFullBehavior" : "assert", + "annotation" : "Clear event throttling" + }, + { + "name" : "Ref.typeDemo.CHOICE_PRM_PARAM_SET", + "commandKind" : "set", + "opcode" : 4353, + "formalParams" : [ + { + "name" : "val", + "type" : { + "name" : "Ref.Choice", + "kind" : "qualifiedIdentifier" + }, + "ref" : false + } + ], + "annotation" : "Single enumeration parameter" + }, + { + "name" : "Ref.typeDemo.GLUTTON_OF_CHOICE_WITH_FRIENDS", + "commandKind" : "sync", + "opcode" : 4368, + "formalParams" : [ + { + "name" : "repeat", + "type" : { + "name" : "U8", + "kind" : "integer", + "size" : 8, + "signed" : false + }, + "ref" : false, + "annotation" : "Number of times to repeat the choices" + }, + { + "name" : "choices", + "type" : { + "name" : "Ref.ChoiceSlurry", + "kind" : "qualifiedIdentifier" + }, + "ref" : false, + "annotation" : "A phenomenal amount of choice" + }, + { + "name" : "repeat_max", + "type" : { + "name" : "U8", + "kind" : "integer", + "size" : 8, + "signed" : false + }, + "ref" : false, + "annotation" : "Limit to the number of repetitions" + } + ], + "annotation" : "Multiple choices command via Complex Structure with a preceding and following argument" + }, + { + "name" : "Ref.SG5.SignalGen_Dp", + "commandKind" : "async", + "opcode" : 9475, + "formalParams" : [ + { + "name" : "records", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false + } + ], + "queueFullBehavior" : "assert", + "annotation" : "Signal Generator Settings" + }, + { + "name" : "Ref.typeDemo.CHOICES_PRM_PARAM_SAVE", + "commandKind" : "save", + "opcode" : 4358, + "formalParams" : [ + ], + "annotation" : "Multiple enumeration parameter via Array" + }, + { + "name" : "Ref.fileManager.MoveFile", + "commandKind" : "async", + "opcode" : 2049, + "formalParams" : [ + { + "name" : "sourceFileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 256 + }, + "ref" : false, + "annotation" : "The source file name" + }, + { + "name" : "destFileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 256 + }, + "ref" : false, + "annotation" : "The destination file name" + } + ], + "queueFullBehavior" : "assert", + "annotation" : "Move a file" + }, + { + "name" : "Ref.typeDemo.CHOICE_PAIR_WITH_FRIENDS", + "commandKind" : "sync", + "opcode" : 4364, + "formalParams" : [ + { + "name" : "repeat", + "type" : { + "name" : "U8", + "kind" : "integer", + "size" : 8, + "signed" : false + }, + "ref" : false, + "annotation" : "Number of times to repeat the choices" + }, + { + "name" : "choices", + "type" : { + "name" : "Ref.ChoicePair", + "kind" : "qualifiedIdentifier" + }, + "ref" : false, + "annotation" : "A pair of choices" + }, + { + "name" : "repeat_max", + "type" : { + "name" : "U8", + "kind" : "integer", + "size" : 8, + "signed" : false + }, + "ref" : false, + "annotation" : "Limit to the number of repetitions" + } + ], + "annotation" : "Multiple choices command via Structure with a preceding and following argument" + }, + { + "name" : "Ref.sendBuffComp.PARAMETER3_PARAM_SET", + "commandKind" : "set", + "opcode" : 9738, + "formalParams" : [ + { + "name" : "val", + "type" : { + "name" : "U8", + "kind" : "integer", + "size" : 8, + "signed" : false + }, + "ref" : false + } + ], + "annotation" : "A test parameter" + }, + { + "name" : "Ref.SG5.SignalGen_Settings", + "commandKind" : "async", + "opcode" : 9472, + "formalParams" : [ + { + "name" : "Frequency", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false + }, + { + "name" : "Amplitude", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "ref" : false + }, + { + "name" : "Phase", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "ref" : false + }, + { + "name" : "SigType", + "type" : { + "name" : "Ref.SignalType", + "kind" : "qualifiedIdentifier" + }, + "ref" : false + } + ], + "queueFullBehavior" : "assert", + "annotation" : "Signal Generator Settings" + }, + { + "name" : "Ref.recvBuffComp.PARAMETER1_PARAM_SAVE", + "commandKind" : "save", + "opcode" : 18177, + "formalParams" : [ + ], + "annotation" : "A test parameter" + }, + { + "name" : "Ref.typeDemo.GLUTTON_OF_CHOICE_PRM_PARAM_SAVE", + "commandKind" : "save", + "opcode" : 4370, + "formalParams" : [ + ], + "annotation" : "Multiple enumeration parameter via Complex Structure" + }, + { + "name" : "Ref.SG4.SignalGen_Toggle", + "commandKind" : "async", + "opcode" : 9217, + "formalParams" : [ + ], + "queueFullBehavior" : "assert", + "annotation" : "Toggle Signal Generator On/Off." + }, + { + "name" : "Ref.cmdDisp.CMD_NO_OP_STRING", + "commandKind" : "async", + "opcode" : 1281, + "formalParams" : [ + { + "name" : "arg1", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 40 + }, + "ref" : false, + "annotation" : "The String command argument" + } + ], + "queueFullBehavior" : "assert", + "annotation" : "No-op string command" + }, + { + "name" : "Ref.cmdSeq.CS_AUTO", + "commandKind" : "async", + "opcode" : 1541, + "formalParams" : [ + ], + "queueFullBehavior" : "assert", + "annotation" : "Set the run mode to AUTO." + }, + { + "name" : "Ref.sendBuffComp.SB_GEN_FATAL", + "commandKind" : "async", + "opcode" : 9730, + "formalParams" : [ + { + "name" : "arg1", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "First FATAL Argument" + }, + { + "name" : "arg2", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Second FATAL Argument" + }, + { + "name" : "arg3", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Third FATAL Argument" + } + ], + "queueFullBehavior" : "assert", + "annotation" : "Generate a FATAL EVR" + }, + { + "name" : "Ref.fileDownlink.SendPartial", + "commandKind" : "async", + "opcode" : 1794, + "formalParams" : [ + { + "name" : "sourceFileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 100 + }, + "ref" : false, + "annotation" : "The name of the on-board file to send" + }, + { + "name" : "destFileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 100 + }, + "ref" : false, + "annotation" : "The name of the destination file on the ground" + }, + { + "name" : "startOffset", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Starting offset of the source file" + }, + { + "name" : "length", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Number of bytes to send from starting offset. Length of 0 implies until the end of the file" + } + ], + "queueFullBehavior" : "assert", + "annotation" : "Read a named file off the disk from a starting position. Divide it into packets and send the packets for transmission to the ground." + }, + { + "name" : "Ref.SG1.SignalGen_Dp", + "commandKind" : "async", + "opcode" : 8451, + "formalParams" : [ + { + "name" : "records", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false + } + ], + "queueFullBehavior" : "assert", + "annotation" : "Signal Generator Settings" + }, + { + "name" : "Ref.cmdSeq.CS_STEP", + "commandKind" : "async", + "opcode" : 1540, + "formalParams" : [ + ], + "queueFullBehavior" : "assert", + "annotation" : "Perform one step in a command sequence. Valid only if CmdSequencer is in MANUAL run mode." + }, + { + "name" : "Ref.SG2.SignalGen_Settings", + "commandKind" : "async", + "opcode" : 8704, + "formalParams" : [ + { + "name" : "Frequency", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false + }, + { + "name" : "Amplitude", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "ref" : false + }, + { + "name" : "Phase", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "ref" : false + }, + { + "name" : "SigType", + "type" : { + "name" : "Ref.SignalType", + "kind" : "qualifiedIdentifier" + }, + "ref" : false + } + ], + "queueFullBehavior" : "assert", + "annotation" : "Signal Generator Settings" + }, + { + "name" : "Ref.fileManager.AppendFile", + "commandKind" : "async", + "opcode" : 2053, + "formalParams" : [ + { + "name" : "source", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 256 + }, + "ref" : false, + "annotation" : "The name of the file to take content from" + }, + { + "name" : "target", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 256 + }, + "ref" : false, + "annotation" : "The name of the file to append to" + } + ], + "queueFullBehavior" : "assert", + "annotation" : "Append 1 file's contents to the end of another." + }, + { + "name" : "Ref.cmdSeq.CS_START", + "commandKind" : "async", + "opcode" : 1539, + "formalParams" : [ + ], + "queueFullBehavior" : "assert", + "annotation" : "Start running a command sequence" + }, + { + "name" : "Ref.fileManager.ShellCommand", + "commandKind" : "async", + "opcode" : 2052, + "formalParams" : [ + { + "name" : "command", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 256 + }, + "ref" : false, + "annotation" : "The shell command string" + }, + { + "name" : "logFileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 256 + }, + "ref" : false, + "annotation" : "The name of the log file" + } + ], + "queueFullBehavior" : "assert", + "annotation" : "Perform a Linux shell command and write the output to a log file." + }, + { + "name" : "Ref.typeDemo.EXTRA_CHOICES_PRM_PARAM_SET", + "commandKind" : "set", + "opcode" : 4361, + "formalParams" : [ + { + "name" : "val", + "type" : { + "name" : "Ref.ManyChoices", + "kind" : "qualifiedIdentifier" + }, + "ref" : false + } + ], + "annotation" : "Too many enumeration parameter via Array" + }, + { + "name" : "Ref.sendBuffComp.PARAMETER3_PARAM_SAVE", + "commandKind" : "save", + "opcode" : 9739, + "formalParams" : [ + ], + "annotation" : "A test parameter" + }, + { + "name" : "Ref.recvBuffComp.PARAMETER1_PARAM_SET", + "commandKind" : "set", + "opcode" : 18176, + "formalParams" : [ + { + "name" : "val", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false + } + ], + "annotation" : "A test parameter" + }, + { + "name" : "Ref.typeDemo.CHOICE", + "commandKind" : "sync", + "opcode" : 4352, + "formalParams" : [ + { + "name" : "choice", + "type" : { + "name" : "Ref.Choice", + "kind" : "qualifiedIdentifier" + }, + "ref" : false, + "annotation" : "A single choice" + } + ], + "annotation" : "Single choice command" + }, + { + "name" : "Ref.dpCat.CLEAR_CATALOG", + "commandKind" : "async", + "opcode" : 3587, + "formalParams" : [ + ], + "queueFullBehavior" : "assert", + "annotation" : "clear existing catalog" + }, + { + "name" : "Ref.typeDemo.CHOICE_PRM_PARAM_SAVE", + "commandKind" : "save", + "opcode" : 4354, + "formalParams" : [ + ], + "annotation" : "Single enumeration parameter" + }, + { + "name" : "Ref.typeDemo.EXTRA_CHOICES", + "commandKind" : "sync", + "opcode" : 4359, + "formalParams" : [ + { + "name" : "choices", + "type" : { + "name" : "Ref.TooManyChoices", + "kind" : "qualifiedIdentifier" + }, + "ref" : false, + "annotation" : "Way to many choices to make" + } + ], + "annotation" : "Too many choice command via Array" + }, + { + "name" : "Ref.typeDemo.CHOICE_PAIR_PRM_PARAM_SET", + "commandKind" : "set", + "opcode" : 4365, + "formalParams" : [ + { + "name" : "val", + "type" : { + "name" : "Ref.ChoicePair", + "kind" : "qualifiedIdentifier" + }, + "ref" : false + } + ], + "annotation" : "Multiple enumeration parameter via Structure" + }, + { + "name" : "Ref.dpWriter.CLEAR_EVENT_THROTTLE", + "commandKind" : "async", + "opcode" : 4096, + "formalParams" : [ + ], + "queueFullBehavior" : "assert", + "annotation" : "Clear event throttling" + }, + { + "name" : "Ref.sendBuffComp.SB_INJECT_PKT_ERROR", + "commandKind" : "async", + "opcode" : 9729, + "formalParams" : [ + ], + "queueFullBehavior" : "assert", + "annotation" : "Send a bad packet" + }, + { + "name" : "Ref.cmdSeq.CS_MANUAL", + "commandKind" : "async", + "opcode" : 1542, + "formalParams" : [ + ], + "queueFullBehavior" : "assert", + "annotation" : "Set the run mode to MANUAL." + }, + { + "name" : "Ref.dpCat.STOP_XMIT_CATALOG", + "commandKind" : "async", + "opcode" : 3586, + "formalParams" : [ + ], + "queueFullBehavior" : "assert", + "annotation" : "Stop transmitting catalog" + }, + { + "name" : "Ref.cmdDisp.CMD_TEST_CMD_1", + "commandKind" : "async", + "opcode" : 1282, + "formalParams" : [ + { + "name" : "arg1", + "type" : { + "name" : "I32", + "kind" : "integer", + "size" : 32, + "signed" : true + }, + "ref" : false, + "annotation" : "The I32 command argument" + }, + { + "name" : "arg2", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "ref" : false, + "annotation" : "The F32 command argument" + }, + { + "name" : "arg3", + "type" : { + "name" : "U8", + "kind" : "integer", + "size" : 8, + "signed" : false + }, + "ref" : false, + "annotation" : "The U8 command argument" + } + ], + "queueFullBehavior" : "assert", + "annotation" : "No-op command" + }, + { + "name" : "Ref.typeDemo.GLUTTON_OF_CHOICE_PRM_PARAM_SET", + "commandKind" : "set", + "opcode" : 4369, + "formalParams" : [ + { + "name" : "val", + "type" : { + "name" : "Ref.ChoiceSlurry", + "kind" : "qualifiedIdentifier" + }, + "ref" : false + } + ], + "annotation" : "Multiple enumeration parameter via Complex Structure" + }, + { + "name" : "Ref.fileManager.RemoveFile", + "commandKind" : "async", + "opcode" : 2051, + "formalParams" : [ + { + "name" : "fileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 256 + }, + "ref" : false, + "annotation" : "The file to remove" + }, + { + "name" : "ignoreErrors", + "type" : { + "name" : "bool", + "kind" : "bool", + "size" : 8 + }, + "ref" : false, + "annotation" : "Ignore nonexistent files" + } + ], + "queueFullBehavior" : "assert", + "annotation" : "Remove a file" + }, + { + "name" : "Ref.sendBuffComp.PARAMETER4_PARAM_SAVE", + "commandKind" : "save", + "opcode" : 9741, + "formalParams" : [ + ], + "annotation" : "A test parameter" + }, + { + "name" : "Ref.typeDemo.SEND_SCALARS", + "commandKind" : "sync", + "opcode" : 4373, + "formalParams" : [ + { + "name" : "scalar_input", + "type" : { + "name" : "Ref.ScalarStruct", + "kind" : "qualifiedIdentifier" + }, + "ref" : false + } + ], + "annotation" : "Send scalars" + }, + { + "name" : "Ref.typeDemo.EXTRA_CHOICES_PRM_PARAM_SAVE", + "commandKind" : "save", + "opcode" : 4362, + "formalParams" : [ + ], + "annotation" : "Too many enumeration parameter via Array" + }, + { + "name" : "Ref.sendBuffComp.PARAMETER4_PARAM_SET", + "commandKind" : "set", + "opcode" : 9740, + "formalParams" : [ + { + "name" : "val", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "ref" : false + } + ], + "annotation" : "A test parameter" + }, + { + "name" : "Ref.fileManager.FileSize", + "commandKind" : "async", + "opcode" : 2054, + "formalParams" : [ + { + "name" : "fileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 256 + }, + "ref" : false, + "annotation" : "The file to get the size of" + } + ], + "queueFullBehavior" : "assert" + }, + { + "name" : "Ref.eventLogger.SET_EVENT_FILTER", + "commandKind" : "sync", + "opcode" : 2816, + "formalParams" : [ + { + "name" : "filterLevel", + "type" : { + "name" : "Svc.ActiveLogger.FilterSeverity", + "kind" : "qualifiedIdentifier" + }, + "ref" : false, + "annotation" : "Filter level" + }, + { + "name" : "filterEnabled", + "type" : { + "name" : "Svc.ActiveLogger.Enabled", + "kind" : "qualifiedIdentifier" + }, + "ref" : false, + "annotation" : "Filter state" + } + ], + "annotation" : "Set filter for reporting events. Events are not stored in component." + }, + { + "name" : "Ref.typeDemo.CHOICES", + "commandKind" : "sync", + "opcode" : 4355, + "formalParams" : [ + { + "name" : "choices", + "type" : { + "name" : "Ref.ManyChoices", + "kind" : "qualifiedIdentifier" + }, + "ref" : false, + "annotation" : "A set of choices" + } + ], + "annotation" : "Multiple choice command via Array" + }, + { + "name" : "Ref.health.HLTH_CHNG_PING", + "commandKind" : "async", + "opcode" : 8194, + "formalParams" : [ + { + "name" : "entry", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 40 + }, + "ref" : false, + "annotation" : "The entry to modify" + }, + { + "name" : "warningValue", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Ping warning threshold" + }, + { + "name" : "fatalValue", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Ping fatal threshold" + } + ], + "queueFullBehavior" : "assert", + "annotation" : "Change ping value" + }, + { + "name" : "Ref.typeDemo.EXTRA_CHOICES_WITH_FRIENDS", + "commandKind" : "sync", + "opcode" : 4360, + "formalParams" : [ + { + "name" : "repeat", + "type" : { + "name" : "U8", + "kind" : "integer", + "size" : 8, + "signed" : false + }, + "ref" : false, + "annotation" : "Number of times to repeat the choices" + }, + { + "name" : "choices", + "type" : { + "name" : "Ref.TooManyChoices", + "kind" : "qualifiedIdentifier" + }, + "ref" : false, + "annotation" : "Way to many choices to make" + }, + { + "name" : "repeat_max", + "type" : { + "name" : "U8", + "kind" : "integer", + "size" : 8, + "signed" : false + }, + "ref" : false, + "annotation" : "Limit to the number of repetitions" + } + ], + "annotation" : "Too many choices command via Array with a preceding and following argument" + }, + { + "name" : "Ref.SG2.SignalGen_Dp", + "commandKind" : "async", + "opcode" : 8707, + "formalParams" : [ + { + "name" : "records", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false + } + ], + "queueFullBehavior" : "assert", + "annotation" : "Signal Generator Settings" + }, + { + "name" : "Ref.typeDemo.CHOICE_PAIR_PRM_PARAM_SAVE", + "commandKind" : "save", + "opcode" : 4366, + "formalParams" : [ + ], + "annotation" : "Multiple enumeration parameter via Structure" + }, + { + "name" : "Ref.SG5.SignalGen_Toggle", + "commandKind" : "async", + "opcode" : 9473, + "formalParams" : [ + ], + "queueFullBehavior" : "assert", + "annotation" : "Toggle Signal Generator On/Off." + }, + { + "name" : "Ref.cmdSeq.CS_CANCEL", + "commandKind" : "async", + "opcode" : 1538, + "formalParams" : [ + ], + "queueFullBehavior" : "assert", + "annotation" : "Cancel a command sequence" + }, + { + "name" : "Ref.version.ENABLE", + "commandKind" : "guarded", + "opcode" : 19712, + "formalParams" : [ + { + "name" : "enable", + "type" : { + "name" : "Svc.VersionEnabled", + "kind" : "qualifiedIdentifier" + }, + "ref" : false, + "annotation" : "whether or not Version telemetry is enabled" + } + ], + "annotation" : "A command to enable or disable Event verbosity and Telemetry" + }, + { + "name" : "Ref.cmdSeq.CS_JOIN_WAIT", + "commandKind" : "async", + "opcode" : 1543, + "formalParams" : [ + ], + "queueFullBehavior" : "assert", + "annotation" : "Wait for sequences that are running to finish. Allow user to run multiple seq files in SEQ_NO_BLOCK mode then wait for them to finish before allowing more seq run request." + }, + { + "name" : "Ref.SG1.SignalGen_Settings", + "commandKind" : "async", + "opcode" : 8448, + "formalParams" : [ + { + "name" : "Frequency", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false + }, + { + "name" : "Amplitude", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "ref" : false + }, + { + "name" : "Phase", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "ref" : false + }, + { + "name" : "SigType", + "type" : { + "name" : "Ref.SignalType", + "kind" : "qualifiedIdentifier" + }, + "ref" : false + } + ], + "queueFullBehavior" : "assert", + "annotation" : "Signal Generator Settings" + }, + { + "name" : "Ref.cmdSeq.CS_RUN", + "commandKind" : "async", + "opcode" : 1536, + "formalParams" : [ + { + "name" : "fileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 240 + }, + "ref" : false, + "annotation" : "The name of the sequence file" + }, + { + "name" : "block", + "type" : { + "name" : "Svc.CmdSequencer.BlockState", + "kind" : "qualifiedIdentifier" + }, + "ref" : false, + "annotation" : "Return command status when complete or not" + } + ], + "queueFullBehavior" : "assert", + "annotation" : "Run a command sequence file" + }, + { + "name" : "Ref.SG1.SignalGen_Toggle", + "commandKind" : "async", + "opcode" : 8449, + "formalParams" : [ + ], + "queueFullBehavior" : "assert", + "annotation" : "Toggle Signal Generator On/Off." + }, + { + "name" : "Ref.dpCat.BUILD_CATALOG", + "commandKind" : "async", + "opcode" : 3584, + "formalParams" : [ + ], + "queueFullBehavior" : "assert", + "annotation" : "Build catalog from data product directory" + }, + { + "name" : "Ref.eventLogger.SET_ID_FILTER", + "commandKind" : "async", + "opcode" : 2818, + "formalParams" : [ + { + "name" : "ID", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false + }, + { + "name" : "idFilterEnabled", + "type" : { + "name" : "Svc.ActiveLogger.Enabled", + "kind" : "qualifiedIdentifier" + }, + "ref" : false, + "annotation" : "ID filter state" + } + ], + "queueFullBehavior" : "assert", + "annotation" : "Filter a particular ID" + }, + { + "name" : "Ref.SG4.SignalGen_Dp", + "commandKind" : "async", + "opcode" : 9219, + "formalParams" : [ + { + "name" : "records", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false + } + ], + "queueFullBehavior" : "assert", + "annotation" : "Signal Generator Settings" + }, + { + "name" : "Ref.recvBuffComp.PARAMETER2_PARAM_SAVE", + "commandKind" : "save", + "opcode" : 18179, + "formalParams" : [ + ], + "annotation" : "A test parameter" + }, + { + "name" : "Ref.SG3.SignalGen_Skip", + "commandKind" : "async", + "opcode" : 8962, + "formalParams" : [ + ], + "queueFullBehavior" : "assert", + "annotation" : "Skip next sample" + }, + { + "name" : "Ref.dpCat.START_XMIT_CATALOG", + "commandKind" : "async", + "opcode" : 3585, + "formalParams" : [ + { + "name" : "wait", + "type" : { + "name" : "Fw.Wait", + "kind" : "qualifiedIdentifier" + }, + "ref" : false, + "annotation" : "have START_XMIT command wait for catalog to complete transmitting" + } + ], + "queueFullBehavior" : "assert", + "annotation" : "Start transmitting catalog" + }, + { + "name" : "Ref.typeDemo.DUMP_FLOATS", + "commandKind" : "sync", + "opcode" : 4372, + "formalParams" : [ + ], + "annotation" : "Dump the float values" + }, + { + "name" : "Ref.cmdDisp.CMD_NO_OP", + "commandKind" : "async", + "opcode" : 1280, + "formalParams" : [ + ], + "queueFullBehavior" : "assert", + "annotation" : "No-op command" + }, + { + "name" : "Ref.fileManager.RemoveDirectory", + "commandKind" : "async", + "opcode" : 2050, + "formalParams" : [ + { + "name" : "dirName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 256 + }, + "ref" : false, + "annotation" : "The directory to remove" + } + ], + "queueFullBehavior" : "assert", + "annotation" : "Remove a directory, which must be empty" + }, + { + "name" : "Ref.typeDemo.CHOICES_PRM_PARAM_SET", + "commandKind" : "set", + "opcode" : 4357, + "formalParams" : [ + { + "name" : "val", + "type" : { + "name" : "Ref.ManyChoices", + "kind" : "qualifiedIdentifier" + }, + "ref" : false + } + ], + "annotation" : "Multiple enumeration parameter via Array" + }, + { + "name" : "Ref.sendBuffComp.SB_START_PKTS", + "commandKind" : "async", + "opcode" : 9728, + "formalParams" : [ + ], + "queueFullBehavior" : "assert", + "annotation" : "Command to start sending packets" + }, + { + "name" : "Ref.typeDemo.GLUTTON_OF_CHOICE", + "commandKind" : "sync", + "opcode" : 4367, + "formalParams" : [ + { + "name" : "choices", + "type" : { + "name" : "Ref.ChoiceSlurry", + "kind" : "qualifiedIdentifier" + }, + "ref" : false, + "annotation" : "A phenomenal amount of choice" + } + ], + "annotation" : "Multiple choice command via Complex Structure" + }, + { + "name" : "Ref.typeDemo.CHOICES_WITH_FRIENDS", + "commandKind" : "sync", + "opcode" : 4356, + "formalParams" : [ + { + "name" : "repeat", + "type" : { + "name" : "U8", + "kind" : "integer", + "size" : 8, + "signed" : false + }, + "ref" : false, + "annotation" : "Number of times to repeat the choices" + }, + { + "name" : "choices", + "type" : { + "name" : "Ref.ManyChoices", + "kind" : "qualifiedIdentifier" + }, + "ref" : false, + "annotation" : "A set of choices" + }, + { + "name" : "repeat_max", + "type" : { + "name" : "U8", + "kind" : "integer", + "size" : 8, + "signed" : false + }, + "ref" : false, + "annotation" : "Limit to the number of repetitions" + } + ], + "annotation" : "Multiple choice command via Array with a preceding and following argument" + }, + { + "name" : "Ref.health.HLTH_PING_ENABLE", + "commandKind" : "async", + "opcode" : 8193, + "formalParams" : [ + { + "name" : "entry", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 40 + }, + "ref" : false, + "annotation" : "The entry to enable/disable" + }, + { + "name" : "enable", + "type" : { + "name" : "Fw.Enabled", + "kind" : "qualifiedIdentifier" + }, + "ref" : false, + "annotation" : "whether or not a port is pinged" + } + ], + "queueFullBehavior" : "assert", + "annotation" : "Ignore a particular ping entry" + }, + { + "name" : "Ref.prmDb.PRM_SAVE_FILE", + "commandKind" : "async", + "opcode" : 3328, + "formalParams" : [ + ], + "queueFullBehavior" : "assert", + "annotation" : "Command to save parameter image to file. Uses file name passed to constructor" + }, + { + "name" : "Ref.systemResources.ENABLE", + "commandKind" : "guarded", + "opcode" : 19200, + "formalParams" : [ + { + "name" : "enable", + "type" : { + "name" : "Svc.SystemResourceEnabled", + "kind" : "qualifiedIdentifier" + }, + "ref" : false, + "annotation" : "whether or not system resource telemetry is enabled" + } + ], + "annotation" : "A command to enable or disable system resource telemetry" + }, + { + "name" : "Ref.SG2.SignalGen_Skip", + "commandKind" : "async", + "opcode" : 8706, + "formalParams" : [ + ], + "queueFullBehavior" : "assert", + "annotation" : "Skip next sample" + }, + { + "name" : "Ref.cmdSeq.CS_VALIDATE", + "commandKind" : "async", + "opcode" : 1537, + "formalParams" : [ + { + "name" : "fileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 240 + }, + "ref" : false, + "annotation" : "The name of the sequence file" + } + ], + "queueFullBehavior" : "assert", + "annotation" : "Validate a command sequence file" + }, + { + "name" : "Ref.SG5.SignalGen_Skip", + "commandKind" : "async", + "opcode" : 9474, + "formalParams" : [ + ], + "queueFullBehavior" : "assert", + "annotation" : "Skip next sample" + }, + { + "name" : "Ref.typeDemo.CHOICE_PAIR", + "commandKind" : "sync", + "opcode" : 4363, + "formalParams" : [ + { + "name" : "choices", + "type" : { + "name" : "Ref.ChoicePair", + "kind" : "qualifiedIdentifier" + }, + "ref" : false, + "annotation" : "A pair of choices" + } + ], + "annotation" : "Multiple choice command via Structure" + } + ], + "parameters" : [ + { + "name" : "Ref.typeDemo.CHOICES_PRM", + "type" : { + "name" : "Ref.ManyChoices", + "kind" : "qualifiedIdentifier" + }, + "id" : 4353, + "annotation" : "Multiple enumeration parameter via Array" + }, + { + "name" : "Ref.recvBuffComp.parameter2", + "type" : { + "name" : "I16", + "kind" : "integer", + "size" : 16, + "signed" : true + }, + "id" : 18177, + "default" : 11, + "annotation" : "A test parameter" + }, + { + "name" : "Ref.recvBuffComp.parameter1", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 18176, + "default" : 10, + "annotation" : "A test parameter" + }, + { + "name" : "Ref.typeDemo.CHOICE_PRM", + "type" : { + "name" : "Ref.Choice", + "kind" : "qualifiedIdentifier" + }, + "id" : 4352, + "annotation" : "Single enumeration parameter" + }, + { + "name" : "Ref.typeDemo.EXTRA_CHOICES_PRM", + "type" : { + "name" : "Ref.ManyChoices", + "kind" : "qualifiedIdentifier" + }, + "id" : 4354, + "annotation" : "Too many enumeration parameter via Array" + }, + { + "name" : "Ref.sendBuffComp.parameter4", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "id" : 9729, + "default" : 13.14, + "annotation" : "A test parameter" + }, + { + "name" : "Ref.typeDemo.CHOICE_PAIR_PRM", + "type" : { + "name" : "Ref.ChoicePair", + "kind" : "qualifiedIdentifier" + }, + "id" : 4355, + "annotation" : "Multiple enumeration parameter via Structure" + }, + { + "name" : "Ref.typeDemo.GLUTTON_OF_CHOICE_PRM", + "type" : { + "name" : "Ref.ChoiceSlurry", + "kind" : "qualifiedIdentifier" + }, + "id" : 4356, + "annotation" : "Multiple enumeration parameter via Complex Structure" + }, + { + "name" : "Ref.sendBuffComp.parameter3", + "type" : { + "name" : "U8", + "kind" : "integer", + "size" : 8, + "signed" : false + }, + "id" : 9728, + "default" : 12, + "annotation" : "A test parameter" + } + ], + "events" : [ + { + "name" : "Ref.SG3.SignalGen_SettingsChanged", + "severity" : "ACTIVITY_LO", + "formalParams" : [ + { + "name" : "Frequency", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false + }, + { + "name" : "Amplitude", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "ref" : false + }, + { + "name" : "Phase", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "ref" : false + }, + { + "name" : "SignalType", + "type" : { + "name" : "Ref.SignalType", + "kind" : "qualifiedIdentifier" + }, + "ref" : false + } + ], + "id" : 8960, + "format" : "Set Frequency(Hz) {}, Amplitude {f}, Phase {f}, Signal Type {}", + "annotation" : "Signal Generator Settings Changed" + }, + { + "name" : "Ref.rateGroup3Comp.RateGroupStarted", + "severity" : "DIAGNOSTIC", + "formalParams" : [ + ], + "id" : 1024, + "format" : "Rate group started.", + "annotation" : "Informational event that rate group has started" + }, + { + "name" : "Ref.cmdSeq.CS_JoinWaiting", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "filename", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 60 + }, + "ref" : false, + "annotation" : "The sequence file" + }, + { + "name" : "recordNumber", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The record number" + }, + { + "name" : "opCode", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The opcode" + } + ], + "id" : 1559, + "format" : "Start waiting for sequence file {}: Command {} (opcode {}) to complete", + "annotation" : "Wait for the current running sequence file complete" + }, + { + "name" : "Ref.sendBuffComp.SendBuffFatal", + "severity" : "FATAL", + "formalParams" : [ + { + "name" : "arg1", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "First FATAL argument" + }, + { + "name" : "arg2", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Second FATAL argument" + }, + { + "name" : "arg3", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Second FATAL argument" + } + ], + "id" : 9731, + "format" : "Test Fatal: {} {} {}", + "annotation" : "A test FATAL" + }, + { + "name" : "Ref.cmdSeq.CS_TimeBaseMismatch", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "fileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 60 + }, + "ref" : false, + "annotation" : "The name of the sequence file" + }, + { + "name" : "time_base", + "type" : { + "name" : "U16", + "kind" : "integer", + "size" : 16, + "signed" : false + }, + "ref" : false, + "annotation" : "The current time" + }, + { + "name" : "seq_time_base", + "type" : { + "name" : "U16", + "kind" : "integer", + "size" : 16, + "signed" : false + }, + "ref" : false, + "annotation" : "The sequence time base" + } + ], + "id" : 1549, + "format" : "Sequence file {}: Current time base doesn't match sequence time: base: {} seq: {}", + "annotation" : "The running time base doesn't match the time base in the sequence files" + }, + { + "name" : "Ref.cmdSeq.CS_NoSequenceActive", + "severity" : "WARNING_LO", + "formalParams" : [ + ], + "id" : 1554, + "format" : "No sequence active.", + "annotation" : "A sequence related command came with no active sequence" + }, + { + "name" : "Ref.fileUplink.FileReceived", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "fileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 40 + }, + "ref" : false, + "annotation" : "The name of the file" + } + ], + "id" : 2306, + "format" : "Received file {}", + "annotation" : "The File Uplink component successfully received a file" + }, + { + "name" : "Ref.dpWriter.FileOpenError", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "status", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The status code returned from the open operation" + }, + { + "name" : "file", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 200 + }, + "ref" : false, + "annotation" : "The file" + } + ], + "id" : 4101, + "format" : "Error {} opening file {}", + "annotation" : "An error occurred when opening a file", + "throttle" : 10 + }, + { + "name" : "Ref.fatalAdapter.AF_ASSERT_2", + "severity" : "FATAL", + "formalParams" : [ + { + "name" : "file", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 200 + }, + "ref" : false, + "annotation" : "The source file of the assert" + }, + { + "name" : "line", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Line number of the assert" + }, + { + "name" : "arg1", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "First assert argument" + }, + { + "name" : "arg2", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Second assert argument" + } + ], + "id" : 16898, + "format" : "Assert in file {}, line {}: {} {}", + "annotation" : "An assert happened" + }, + { + "name" : "Ref.SG1.SignalGen_DpComplete", + "severity" : "ACTIVITY_LO", + "formalParams" : [ + { + "name" : "records", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false + }, + { + "name" : "bytes", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false + } + ], + "id" : 8450, + "format" : "Writing {} DP records {} bytes total" + }, + { + "name" : "Ref.cmdDisp.OpCodeReregistered", + "severity" : "DIAGNOSTIC", + "formalParams" : [ + { + "name" : "Opcode", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The opcode reregistered" + }, + { + "name" : "port", + "type" : { + "name" : "I32", + "kind" : "integer", + "size" : 32, + "signed" : true + }, + "ref" : false, + "annotation" : "The reregistration port" + } + ], + "id" : 1290, + "format" : "Opcode 0x{x} is already registered to port {}", + "annotation" : "Op code reregistered event" + }, + { + "name" : "Ref.fileManager.CreateDirectoryStarted", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "dirName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 256 + }, + "ref" : false, + "annotation" : "The name of the directory" + } + ], + "id" : 2062, + "format" : "Creating directory {}...", + "annotation" : "The File System component began creating a new directory" + }, + { + "name" : "Ref.cmdSeq.CS_CommandComplete", + "severity" : "ACTIVITY_LO", + "formalParams" : [ + { + "name" : "fileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 60 + }, + "ref" : false, + "annotation" : "The name of the sequence file" + }, + { + "name" : "recordNumber", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The record number of the command" + }, + { + "name" : "opCode", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The command opcode" + } + ], + "id" : 1544, + "format" : "Sequence file {}: Command {} (opcode {}) complete", + "annotation" : "The Command Sequencer issued a command and received a success status in return." + }, + { + "name" : "Ref.fileDownlink.FileReadError", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "fileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 100 + }, + "ref" : false, + "annotation" : "The name of the file" + }, + { + "name" : "status", + "type" : { + "name" : "I32", + "kind" : "integer", + "size" : 32, + "signed" : true + }, + "ref" : false, + "annotation" : "The file status of read" + } + ], + "id" : 1793, + "format" : "Could not read file {} with status {}", + "annotation" : "An error occurred reading a file" + }, + { + "name" : "Ref.fileUplink.PacketOutOfBounds", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "packetIndex", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The sequence index of the packet" + }, + { + "name" : "fileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 40 + }, + "ref" : false, + "annotation" : "The name of the file" + } + ], + "id" : 2309, + "format" : "Packet {} out of bounds for file {}", + "annotation" : "During receipt of a file, the File Uplink component encountered a packet with offset and size out of bounds for the current file", + "throttle" : 5 + }, + { + "name" : "Ref.version.ProjectVersion", + "severity" : "ACTIVITY_LO", + "formalParams" : [ + { + "name" : "version", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 40 + }, + "ref" : false, + "annotation" : "version string" + } + ], + "id" : 19713, + "format" : "Project Version: [{}]", + "annotation" : "Version of the git repository." + }, + { + "name" : "Ref.recvBuffComp.BuffRecvParameterUpdated", + "severity" : "ACTIVITY_LO", + "formalParams" : [ + { + "name" : "id", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The ID argument" + } + ], + "id" : 18178, + "format" : "BuffRecv Parameter {} was updated", + "annotation" : "Report parameter update" + }, + { + "name" : "Ref.SG3.SignalGen_DpRecordFull", + "severity" : "WARNING_LO", + "formalParams" : [ + { + "name" : "records", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false + }, + { + "name" : "bytes", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false + } + ], + "id" : 8963, + "format" : "DP container full with {} records and {} bytes. Closing DP." + }, + { + "name" : "Ref.prmDb.PrmFileWriteError", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "stage", + "type" : { + "name" : "Svc.PrmDb.PrmWriteError", + "kind" : "qualifiedIdentifier" + }, + "ref" : false, + "annotation" : "The write stage" + }, + { + "name" : "record", + "type" : { + "name" : "I32", + "kind" : "integer", + "size" : 32, + "signed" : true + }, + "ref" : false, + "annotation" : "The record that had the failure" + }, + { + "name" : "error", + "type" : { + "name" : "I32", + "kind" : "integer", + "size" : 32, + "signed" : true + }, + "ref" : false, + "annotation" : "The error code" + } + ], + "id" : 3332, + "format" : "Parameter write failed in stage {} with record {} and error {}", + "annotation" : "Failed to write parameter file" + }, + { + "name" : "Ref.dpWriter.BufferTooSmallForPacket", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "bufferSize", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The incoming buffer size" + }, + { + "name" : "minSize", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The minimum required size" + } + ], + "id" : 4097, + "format" : "Received buffer has size {}; minimum required size is {}", + "annotation" : "Received buffer is too small to hold a data product packet", + "throttle" : 10 + }, + { + "name" : "Ref.SG4.SignalGen_DpComplete", + "severity" : "ACTIVITY_LO", + "formalParams" : [ + { + "name" : "records", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false + }, + { + "name" : "bytes", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false + } + ], + "id" : 9218, + "format" : "Writing {} DP records {} bytes total" + }, + { + "name" : "Ref.prmDb.PrmFileLoadComplete", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "records", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The number of records loaded" + } + ], + "id" : 3335, + "format" : "Parameter file load completed. Read {} records.", + "annotation" : "Load of parameter file completed" + }, + { + "name" : "Ref.SG5.SignalGen_DpsNotConnected", + "severity" : "WARNING_HI", + "formalParams" : [ + ], + "id" : 9476, + "format" : "DP Ports not connected!" + }, + { + "name" : "Ref.SG2.SignalGen_DpStarted", + "severity" : "ACTIVITY_LO", + "formalParams" : [ + { + "name" : "records", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false + } + ], + "id" : 8705, + "format" : "Writing {} DP records" + }, + { + "name" : "Ref.fileManager.FileSizeError", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "fileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 256 + }, + "ref" : false, + "annotation" : "The name of the file" + }, + { + "name" : "status", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The error status" + } + ], + "id" : 2067, + "format" : "Failed to get the size of file {}, returned status {}", + "annotation" : "Failed to get file size" + }, + { + "name" : "Ref.eventLogger.ID_FILTER_REMOVED", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "ID", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The ID removed" + } + ], + "id" : 2819, + "format" : "ID filter ID {} removed.", + "annotation" : "Removed an ID from the filter" + }, + { + "name" : "Ref.dpCat.SendingProduct", + "severity" : "ACTIVITY_LO", + "formalParams" : [ + { + "name" : "file", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 80 + }, + "ref" : false, + "annotation" : "The file" + }, + { + "name" : "bytes", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "file size" + }, + { + "name" : "prio", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "DP priority" + } + ], + "id" : 3597, + "format" : "Sending product {} of size {} priority {}", + "annotation" : "Sending product" + }, + { + "name" : "Ref.cmdDisp.NoOpReceived", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + ], + "id" : 1287, + "format" : "Received a NO-OP command", + "annotation" : "The command dispatcher has successfully received a NO-OP command" + }, + { + "name" : "Ref.fileDownlink.FileOpenError", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "fileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 100 + }, + "ref" : false, + "annotation" : "The name of the file" + } + ], + "id" : 1792, + "format" : "Could not open file {}", + "annotation" : "An error occurred opening a file" + }, + { + "name" : "Ref.SG4.SignalGen_SettingsChanged", + "severity" : "ACTIVITY_LO", + "formalParams" : [ + { + "name" : "Frequency", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false + }, + { + "name" : "Amplitude", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "ref" : false + }, + { + "name" : "Phase", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "ref" : false + }, + { + "name" : "SignalType", + "type" : { + "name" : "Ref.SignalType", + "kind" : "qualifiedIdentifier" + }, + "ref" : false + } + ], + "id" : 9216, + "format" : "Set Frequency(Hz) {}, Amplitude {f}, Phase {f}, Signal Type {}", + "annotation" : "Signal Generator Settings Changed" + }, + { + "name" : "Ref.dpCat.DpDuplicate", + "severity" : "DIAGNOSTIC", + "formalParams" : [ + { + "name" : "dp", + "type" : { + "name" : "Svc.DpRecord", + "kind" : "qualifiedIdentifier" + }, + "ref" : false, + "annotation" : "The DP" + } + ], + "id" : 3612, + "format" : "DP {} already in catalog", + "annotation" : "Error inserting entry into list", + "throttle" : 10 + }, + { + "name" : "Ref.cmdSeq.CS_SequenceComplete", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "fileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 60 + }, + "ref" : false, + "annotation" : "The name of the sequence file" + } + ], + "id" : 1545, + "format" : "Sequence file {} complete", + "annotation" : "A command sequence successfully completed." + }, + { + "name" : "Ref.fileDownlink.SendStarted", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "fileSize", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The source file size" + }, + { + "name" : "sourceFileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 100 + }, + "ref" : false, + "annotation" : "The source filename" + }, + { + "name" : "destFileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 100 + }, + "ref" : false, + "annotation" : "The destination filename" + } + ], + "id" : 1800, + "format" : "Downlink of {} bytes started from {} to {}", + "annotation" : "The File Downlink component started a file download." + }, + { + "name" : "Ref.dpMgr.BufferAllocationFailed", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "id", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The container ID" + } + ], + "id" : 3840, + "format" : "Buffer allocation failed for container id {}", + "annotation" : "Buffer allocation failed", + "throttle" : 10 + }, + { + "name" : "Ref.typeDemo.ChoicesEv", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "choices", + "type" : { + "name" : "Ref.ManyChoices", + "kind" : "qualifiedIdentifier" + }, + "ref" : false + } + ], + "id" : 4353, + "format" : "Choices: {}", + "annotation" : "Multiple choice event via Array" + }, + { + "name" : "Ref.SG5.SignalGen_DpRecordFull", + "severity" : "WARNING_LO", + "formalParams" : [ + { + "name" : "records", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false + }, + { + "name" : "bytes", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false + } + ], + "id" : 9475, + "format" : "DP container full with {} records and {} bytes. Closing DP." + }, + { + "name" : "Ref.typeDemo.ChoicesPrmEv", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "choices", + "type" : { + "name" : "Ref.ManyChoices", + "kind" : "qualifiedIdentifier" + }, + "ref" : false + }, + { + "name" : "validity", + "type" : { + "name" : "Fw.ParamValid", + "kind" : "qualifiedIdentifier" + }, + "ref" : false + } + ], + "id" : 4358, + "format" : "CHOICES_PRM: {} with validity: {}", + "annotation" : "Multiple choice parameter event via Array" + }, + { + "name" : "Ref.fileManager.DirectoryRemoveError", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "dirName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 256 + }, + "ref" : false, + "annotation" : "The name of the directory" + }, + { + "name" : "status", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The error status" + } + ], + "id" : 2049, + "format" : "Could not remove directory {}, returned status {}", + "annotation" : "An error occurred while attempting to remove a directory" + }, + { + "name" : "Ref.fatalAdapter.AF_ASSERT_1", + "severity" : "FATAL", + "formalParams" : [ + { + "name" : "file", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 200 + }, + "ref" : false, + "annotation" : "The source file of the assert" + }, + { + "name" : "line", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Line number of the assert" + }, + { + "name" : "arg1", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "First assert argument" + } + ], + "id" : 16897, + "format" : "Assert in file {}, line {}: {}", + "annotation" : "An assert happened" + }, + { + "name" : "Ref.health.HLTH_CHECK_PING", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "enabled", + "type" : { + "name" : "Fw.Enabled", + "kind" : "qualifiedIdentifier" + }, + "ref" : false, + "annotation" : "If health pinging is enabled for a particular entry" + }, + { + "name" : "entry", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 40 + }, + "ref" : false, + "annotation" : "The entry passing the warning level" + } + ], + "id" : 8196, + "format" : "Health checking set to {} for {}", + "annotation" : "Report a particular entry on or off" + }, + { + "name" : "Ref.cmdDisp.OpCodeError", + "severity" : "COMMAND", + "formalParams" : [ + { + "name" : "Opcode", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The opcode with the error" + }, + { + "name" : "error", + "type" : { + "name" : "Fw.CmdResponse", + "kind" : "qualifiedIdentifier" + }, + "ref" : false, + "annotation" : "The error value" + } + ], + "id" : 1283, + "format" : "Opcode 0x{x} completed with error {}", + "annotation" : "Op code completed with error event" + }, + { + "name" : "Ref.fileManager.MoveFileSucceeded", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "sourceFileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 256 + }, + "ref" : false, + "annotation" : "The name of the source file" + }, + { + "name" : "destFileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 256 + }, + "ref" : false, + "annotation" : "The name of the destination file" + } + ], + "id" : 2058, + "format" : "Moved file {} to file {} successfully", + "annotation" : "The File System component moved a file to a new location without error" + }, + { + "name" : "Ref.fatalAdapter.AF_ASSERT_6", + "severity" : "FATAL", + "formalParams" : [ + { + "name" : "file", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 200 + }, + "ref" : false, + "annotation" : "The source file of the assert" + }, + { + "name" : "line", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Line number of the assert" + }, + { + "name" : "arg1", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "First assert argument" + }, + { + "name" : "arg2", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Second assert argument" + }, + { + "name" : "arg3", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Third assert argument" + }, + { + "name" : "arg4", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Fourth assert argument" + }, + { + "name" : "arg5", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Fifth assert argument" + }, + { + "name" : "arg6", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Sixth assert argument" + } + ], + "id" : 16902, + "format" : "Assert in file {}, line {}: {} {} {} {} {} {}", + "annotation" : "An assert happened" + }, + { + "name" : "Ref.fileDownlink.DownlinkTimeout", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "sourceFileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 100 + }, + "ref" : false, + "annotation" : "The source filename" + }, + { + "name" : "destFileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 100 + }, + "ref" : false, + "annotation" : "The destination file name" + } + ], + "id" : 1796, + "format" : "Timeout occurred during downlink of file {} to file {}. Downlink has been canceled.", + "annotation" : "The File Downlink component has detected a timeout. Downlink has been canceled." + }, + { + "name" : "Ref.version.LibraryVersions", + "severity" : "ACTIVITY_LO", + "formalParams" : [ + { + "name" : "version", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 40 + }, + "ref" : false, + "annotation" : "version string" + } + ], + "id" : 19714, + "format" : "Library Versions: [{}]", + "annotation" : "Version of the git repository." + }, + { + "name" : "Ref.dpCat.CatalogBuildComplete", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + ], + "id" : 3588, + "format" : "Catalog build complete", + "annotation" : "Catalog processing complete" + }, + { + "name" : "Ref.dpCat.CatalogFull", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "dir", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 80 + }, + "ref" : false, + "annotation" : "last directory read" + } + ], + "id" : 3606, + "format" : "DpCatalog full during directory {}", + "annotation" : "Catalog is full", + "throttle" : 10 + }, + { + "name" : "Ref.SG5.SignalGen_SettingsChanged", + "severity" : "ACTIVITY_LO", + "formalParams" : [ + { + "name" : "Frequency", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false + }, + { + "name" : "Amplitude", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "ref" : false + }, + { + "name" : "Phase", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "ref" : false + }, + { + "name" : "SignalType", + "type" : { + "name" : "Ref.SignalType", + "kind" : "qualifiedIdentifier" + }, + "ref" : false + } + ], + "id" : 9472, + "format" : "Set Frequency(Hz) {}, Amplitude {f}, Phase {f}, Signal Type {}", + "annotation" : "Signal Generator Settings Changed" + }, + { + "name" : "Ref.rateGroup1Comp.RateGroupStarted", + "severity" : "DIAGNOSTIC", + "formalParams" : [ + ], + "id" : 512, + "format" : "Rate group started.", + "annotation" : "Informational event that rate group has started" + }, + { + "name" : "Ref.recvBuffComp.PacketChecksumError", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "id", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The ID argument" + } + ], + "id" : 18177, + "format" : "Packet ID {} had checksum error", + "annotation" : "Packet checksum error" + }, + { + "name" : "Ref.fileUplink.FileWriteError", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "fileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 40 + }, + "ref" : false, + "annotation" : "The name of the file" + } + ], + "id" : 2307, + "format" : "Could not write to file {}", + "annotation" : "An error occurred writing to a file", + "throttle" : 5 + }, + { + "name" : "Ref.dpWriter.BufferTooSmallForData", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "bufferSize", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The incoming buffer size" + }, + { + "name" : "minSize", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The minimum required size" + } + ], + "id" : 4100, + "format" : "Received buffer has size {}; minimum required size is {}", + "annotation" : "Received buffer is too small to hold the data specified in the header", + "throttle" : 10 + }, + { + "name" : "Ref.fileManager.ShellCommandStarted", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "command", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 256 + }, + "ref" : false, + "annotation" : "The command string" + } + ], + "id" : 2061, + "format" : "Running shell command {}...", + "annotation" : "The File System component began executing a shell command" + }, + { + "name" : "Ref.pingRcvr.PR_PingsDisabled", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + ], + "id" : 2560, + "format" : "PingReceiver ping responses disabled", + "annotation" : "Disabled ping responses" + }, + { + "name" : "Ref.health.HLTH_PING_INVALID_VALUES", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "entry", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 40 + }, + "ref" : false, + "annotation" : "The entry changed" + }, + { + "name" : "warn", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The new warning value" + }, + { + "name" : "fatal", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The new FATAL value" + } + ], + "id" : 8199, + "format" : "Health ping for {} invalid values: WARN {} FATAL {}", + "annotation" : "Report changed ping" + }, + { + "name" : "Ref.dpCat.FileHdrDesError", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "file", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 80 + }, + "ref" : false, + "annotation" : "The file" + }, + { + "name" : "stat", + "type" : { + "name" : "I32", + "kind" : "integer", + "size" : 32, + "signed" : true + }, + "ref" : false + } + ], + "id" : 3610, + "format" : "Error deserializing DP {} header stat: {}", + "annotation" : "Error deserializing header data", + "throttle" : 10 + }, + { + "name" : "Ref.cmdSeq.CS_JoinWaitingNotComplete", + "severity" : "WARNING_HI", + "formalParams" : [ + ], + "id" : 1560, + "format" : "Still waiting for sequence file to complete", + "annotation" : "Cannot run new sequence when current sequence file is still running." + }, + { + "name" : "Ref.SG4.SignalGen_DpStarted", + "severity" : "ACTIVITY_LO", + "formalParams" : [ + { + "name" : "records", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false + } + ], + "id" : 9217, + "format" : "Writing {} DP records" + }, + { + "name" : "Ref.fileManager.FileSizeStarted", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "fileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 256 + }, + "ref" : false, + "annotation" : "The name of the file" + } + ], + "id" : 2068, + "format" : "Checking size of file {}...", + "annotation" : "Checking file size" + }, + { + "name" : "Ref.SG3.SignalGen_DpsNotConnected", + "severity" : "WARNING_HI", + "formalParams" : [ + ], + "id" : 8964, + "format" : "DP Ports not connected!" + }, + { + "name" : "Ref.cmdDisp.OpCodeDispatched", + "severity" : "COMMAND", + "formalParams" : [ + { + "name" : "Opcode", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The opcode dispatched" + }, + { + "name" : "port", + "type" : { + "name" : "I32", + "kind" : "integer", + "size" : 32, + "signed" : true + }, + "ref" : false, + "annotation" : "The port dispatched to" + } + ], + "id" : 1281, + "format" : "Opcode 0x{x} dispatched to port {}", + "annotation" : "Op code dispatched event" + }, + { + "name" : "Ref.dpCat.CatalogXmitStopped", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "bytes", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "data transmitted" + } + ], + "id" : 3595, + "format" : "Catalog transmission stopped. {} bytes transmitted.", + "annotation" : "Catalog transmission stopped" + }, + { + "name" : "Ref.fatalAdapter.AF_ASSERT_3", + "severity" : "FATAL", + "formalParams" : [ + { + "name" : "file", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 200 + }, + "ref" : false, + "annotation" : "The source file of the assert" + }, + { + "name" : "line", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Line number of the assert" + }, + { + "name" : "arg1", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "First assert argument" + }, + { + "name" : "arg2", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Second assert argument" + }, + { + "name" : "arg3", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Third assert argument" + } + ], + "id" : 16899, + "format" : "Assert in file {}, line {}: {} {} {}", + "annotation" : "An assert happened" + }, + { + "name" : "Ref.cmdSeq.CS_SequenceValid", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "filename", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 60 + }, + "ref" : false, + "annotation" : "The sequence file" + } + ], + "id" : 1555, + "format" : "Sequence {} is valid.", + "annotation" : "A sequence passed validation" + }, + { + "name" : "Ref.eventLogger.ID_FILTER_NOT_FOUND", + "severity" : "WARNING_LO", + "formalParams" : [ + { + "name" : "ID", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The ID removed" + } + ], + "id" : 2820, + "format" : "ID filter ID {} not found.", + "annotation" : "ID not in filter" + }, + { + "name" : "Ref.sendBuffComp.BuffSendParameterUpdated", + "severity" : "ACTIVITY_LO", + "formalParams" : [ + { + "name" : "id", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The ID argument" + } + ], + "id" : 9730, + "format" : "BuffSend Parameter {} was updated", + "annotation" : "Report parameter update" + }, + { + "name" : "Ref.fileDownlink.FileSent", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "sourceFileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 100 + }, + "ref" : false, + "annotation" : "The source file name" + }, + { + "name" : "destFileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 100 + }, + "ref" : false, + "annotation" : "The destination file name" + } + ], + "id" : 1794, + "format" : "Sent file {} to file {}", + "annotation" : "The File Downlink component successfully sent a file" + }, + { + "name" : "Ref.dpCat.FileSizeError", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "file", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 80 + }, + "ref" : false, + "annotation" : "The file" + }, + { + "name" : "stat", + "type" : { + "name" : "I32", + "kind" : "integer", + "size" : 32, + "signed" : true + }, + "ref" : false + } + ], + "id" : 3615, + "format" : "Error getting file {} size. stat: {}", + "annotation" : "Error getting file size", + "throttle" : 10 + }, + { + "name" : "Ref.cmdSeq.CS_FileSizeError", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "fileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 60 + }, + "ref" : false, + "annotation" : "The name of the sequence file" + }, + { + "name" : "size", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Invalid size" + } + ], + "id" : 1541, + "format" : "Sequence file {} too large. Size: {}", + "annotation" : "The sequence file was too large." + }, + { + "name" : "Ref.SG1.SignalGen_DpRecordFull", + "severity" : "WARNING_LO", + "formalParams" : [ + { + "name" : "records", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false + }, + { + "name" : "bytes", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false + } + ], + "id" : 8451, + "format" : "DP container full with {} records and {} bytes. Closing DP." + }, + { + "name" : "Ref.cmdSeq.CS_RecordInvalid", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "fileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 60 + }, + "ref" : false, + "annotation" : "The name of the sequence file" + }, + { + "name" : "recordNumber", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The record number" + }, + { + "name" : "error", + "type" : { + "name" : "I32", + "kind" : "integer", + "size" : 32, + "signed" : true + }, + "ref" : false, + "annotation" : "The error code" + } + ], + "id" : 1540, + "format" : "Sequence file {}: Record {} invalid. Err: {}", + "annotation" : "The format of a command record was invalid." + }, + { + "name" : "Ref.SG2.SignalGen_SettingsChanged", + "severity" : "ACTIVITY_LO", + "formalParams" : [ + { + "name" : "Frequency", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false + }, + { + "name" : "Amplitude", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "ref" : false + }, + { + "name" : "Phase", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "ref" : false + }, + { + "name" : "SignalType", + "type" : { + "name" : "Ref.SignalType", + "kind" : "qualifiedIdentifier" + }, + "ref" : false + } + ], + "id" : 8704, + "format" : "Set Frequency(Hz) {}, Amplitude {f}, Phase {f}, Signal Type {}", + "annotation" : "Signal Generator Settings Changed" + }, + { + "name" : "Ref.pingRcvr.PR_PingReceived", + "severity" : "DIAGNOSTIC", + "formalParams" : [ + { + "name" : "code", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Ping code" + } + ], + "id" : 2561, + "format" : "PingReceiver pinged with code {}", + "annotation" : "Got ping" + }, + { + "name" : "Ref.dpCat.CatalogXmitCompleted", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "bytes", + "type" : { + "name" : "U64", + "kind" : "integer", + "size" : 64, + "signed" : false + }, + "ref" : false, + "annotation" : "data transmitted" + } + ], + "id" : 3596, + "format" : "Catalog transmission completed. {} bytes transmitted.", + "annotation" : "Catalog transmission completed" + }, + { + "name" : "Ref.fileUplink.DecodeError", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "status", + "type" : { + "name" : "I32", + "kind" : "integer", + "size" : 32, + "signed" : true + }, + "ref" : false, + "annotation" : "The sequence index of the out-of-order packet" + } + ], + "id" : 2312, + "format" : "Unable to decode file packet. Status: {}", + "annotation" : "Error decoding file packet" + }, + { + "name" : "Ref.fatalAdapter.AF_UNEXPECTED_ASSERT", + "severity" : "FATAL", + "formalParams" : [ + { + "name" : "file", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 200 + }, + "ref" : false, + "annotation" : "The source file of the assert" + }, + { + "name" : "line", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Line number of the assert" + }, + { + "name" : "numArgs", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Number of unexpected arguments" + } + ], + "id" : 16903, + "format" : "Unexpected assert in file {}, line {}, args {}", + "annotation" : "An unexpected assert happened" + }, + { + "name" : "Ref.fileManager.AppendFileFailed", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "source", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 256 + }, + "ref" : false, + "annotation" : "The name of the file being read from" + }, + { + "name" : "target", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 256 + }, + "ref" : false, + "annotation" : "The name of the file to append to" + }, + { + "name" : "status", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The error status" + } + ], + "id" : 2053, + "format" : "Appending {} onto {} failed with status {}", + "annotation" : "The File System component returned status non-zero when trying to append 2 files together" + }, + { + "name" : "Ref.dpCat.DpInsertError", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "dp", + "type" : { + "name" : "Svc.DpRecord", + "kind" : "qualifiedIdentifier" + }, + "ref" : false, + "annotation" : "The DP" + } + ], + "id" : 3611, + "format" : "Error deserializing DP {}", + "annotation" : "Error inserting entry into list", + "throttle" : 10 + }, + { + "name" : "Ref.fileUplink.BadChecksum", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "fileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 40 + }, + "ref" : false, + "annotation" : "The file name" + }, + { + "name" : "computed", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The computed value" + }, + { + "name" : "read", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The value read" + } + ], + "id" : 2304, + "format" : "Bad checksum value during receipt of file {}: computed 0x{x}, read 0x{x}", + "annotation" : "During receipt of a file, the computed checksum value did not match the stored value" + }, + { + "name" : "Ref.cmdSeq.CS_FileInvalid", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "fileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 60 + }, + "ref" : false, + "annotation" : "The name of the sequence file" + }, + { + "name" : "stage", + "type" : { + "name" : "Svc.CmdSequencer.FileReadStage", + "kind" : "qualifiedIdentifier" + }, + "ref" : false, + "annotation" : "The read stage" + }, + { + "name" : "error", + "type" : { + "name" : "I32", + "kind" : "integer", + "size" : 32, + "signed" : true + }, + "ref" : false, + "annotation" : "The error code" + } + ], + "id" : 1539, + "format" : "Sequence file {} invalid. Stage: {} Error: {}", + "annotation" : "The sequence file format was invalid." + }, + { + "name" : "Ref.cmdSeq.CS_UnexpectedCompletion", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "opcode", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The reported opcode" + } + ], + "id" : 1552, + "format" : "Command complete status received while no sequences active. Opcode: {}", + "annotation" : "A command status came back when no sequence was running" + }, + { + "name" : "Ref.recvBuffComp.FirstPacketReceived", + "severity" : "ACTIVITY_LO", + "formalParams" : [ + { + "name" : "id", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The ID argument" + } + ], + "id" : 18176, + "format" : "First packet ID {} received", + "annotation" : "First packet received" + }, + { + "name" : "Ref.fileDownlink.SendDataFail", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "sourceFileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 100 + }, + "ref" : false, + "annotation" : "The source filename" + }, + { + "name" : "byteOffset", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Byte offset" + } + ], + "id" : 1799, + "format" : "Failed to send data packet from file {} at byte offset {}.", + "annotation" : "The File Downlink component generated an error when trying to send a data packet." + }, + { + "name" : "Ref.fileManager.ShellCommandFailed", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "command", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 256 + }, + "ref" : false, + "annotation" : "The command string" + }, + { + "name" : "status", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The status code" + } + ], + "id" : 2052, + "format" : "Shell command {} failed with status {}", + "annotation" : "The File System component executed a shell command that returned status non-zero" + }, + { + "name" : "Ref.prmDb.PrmFileSaveComplete", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "records", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The number of records saved" + } + ], + "id" : 3333, + "format" : "Parameter file save completed. Wrote {} records.", + "annotation" : "Save of parameter file completed" + }, + { + "name" : "Ref.typeDemo.ChoiceSlurryPrmEv", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "choices", + "type" : { + "name" : "Ref.ChoiceSlurry", + "kind" : "qualifiedIdentifier" + }, + "ref" : false + }, + { + "name" : "validity", + "type" : { + "name" : "Fw.ParamValid", + "kind" : "qualifiedIdentifier" + }, + "ref" : false + } + ], + "id" : 4361, + "format" : "GLUTTON_OF_CHOICE_PRM: {} with validity: {}", + "annotation" : "Multiple choice parameter event via Complex Structure" + }, + { + "name" : "Ref.typeDemo.ChoiceEv", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "choice", + "type" : { + "name" : "Ref.Choice", + "kind" : "qualifiedIdentifier" + }, + "ref" : false + } + ], + "id" : 4352, + "format" : "Choice: {}", + "annotation" : "Single choice event" + }, + { + "name" : "Ref.dpCat.ProcessingDirectoryComplete", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "loc", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 80 + }, + "ref" : false, + "annotation" : "The directory" + }, + { + "name" : "total", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "total data products" + }, + { + "name" : "pending", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "pending data products" + }, + { + "name" : "pending_bytes", + "type" : { + "name" : "U64", + "kind" : "integer", + "size" : 64, + "signed" : false + }, + "ref" : false, + "annotation" : "pending data product volume" + } + ], + "id" : 3587, + "format" : "Completed processing directory {}. Total products: {} Pending products: {} Pending bytes: {}", + "annotation" : "Directory Processing complete" + }, + { + "name" : "Ref.fileManager.RemoveDirectorySucceeded", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "dirName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 256 + }, + "ref" : false, + "annotation" : "The name of the directory" + } + ], + "id" : 2057, + "format" : "Removed directory {} successfully", + "annotation" : "The File System component deleted and existing directory without error" + }, + { + "name" : "Ref.cmdDisp.TooManyCommands", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "Opcode", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The opcode that overflowed the list" + } + ], + "id" : 1286, + "format" : "Too many outstanding commands. opcode=0x{x}", + "annotation" : "Exceeded the number of commands that can be simultaneously executed" + }, + { + "name" : "Ref.SG2.SignalGen_DpsNotConnected", + "severity" : "WARNING_HI", + "formalParams" : [ + ], + "id" : 8708, + "format" : "DP Ports not connected!" + }, + { + "name" : "Ref.rateGroup1Comp.RateGroupCycleSlip", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "cycle", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The cycle where the cycle occurred" + } + ], + "id" : 513, + "format" : "Rate group cycle slipped on cycle {}", + "annotation" : "Warning event that rate group has had a cycle slip" + }, + { + "name" : "Ref.typeDemo.ExtraChoicesEv", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "choices", + "type" : { + "name" : "Ref.TooManyChoices", + "kind" : "qualifiedIdentifier" + }, + "ref" : false + } + ], + "id" : 4354, + "format" : "Choices: {}", + "annotation" : "Too many choice event via Array" + }, + { + "name" : "Ref.cmdSeq.CS_RecordMismatch", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "fileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 60 + }, + "ref" : false, + "annotation" : "The name of the sequence file" + }, + { + "name" : "header_records", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The number of records in the header" + }, + { + "name" : "extra_bytes", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The number of bytes beyond last record" + } + ], + "id" : 1548, + "format" : "Sequence file {} header records mismatch: {} in header, found {} extra bytes.", + "annotation" : "Number of records in header doesn't match number in file" + }, + { + "name" : "Ref.typeDemo.ExtraChoicesPrmEv", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "choices", + "type" : { + "name" : "Ref.TooManyChoices", + "kind" : "qualifiedIdentifier" + }, + "ref" : false + }, + { + "name" : "validity", + "type" : { + "name" : "Fw.ParamValid", + "kind" : "qualifiedIdentifier" + }, + "ref" : false + } + ], + "id" : 4359, + "format" : "EXTRA_CHOICES_PRM: {} with validity: {}", + "annotation" : "Too many choice parameter event via Array" + }, + { + "name" : "Ref.health.HLTH_CHECK_ENABLE", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "enabled", + "type" : { + "name" : "Fw.Enabled", + "kind" : "qualifiedIdentifier" + }, + "ref" : false, + "annotation" : "If health checking is enabled" + } + ], + "id" : 8195, + "format" : "Health checking set to {}", + "annotation" : "Report checking turned on or off" + }, + { + "name" : "Ref.dpCat.FileOpenError", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "loc", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 80 + }, + "ref" : false, + "annotation" : "The directory" + }, + { + "name" : "stat", + "type" : { + "name" : "I32", + "kind" : "integer", + "size" : 32, + "signed" : true + }, + "ref" : false, + "annotation" : "status" + } + ], + "id" : 3607, + "format" : "Unable to open DP file {} status {}", + "annotation" : "Error opening file", + "throttle" : 10 + }, + { + "name" : "Ref.fileManager.DirectoryCreateError", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "dirName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 256 + }, + "ref" : false, + "annotation" : "The name of the directory" + }, + { + "name" : "status", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The error status" + } + ], + "id" : 2048, + "format" : "Could not create directory {}, returned status {}", + "annotation" : "An error occurred while attempting to create a directory" + }, + { + "name" : "Ref.dpCat.FileHdrError", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "file", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 80 + }, + "ref" : false, + "annotation" : "The file" + }, + { + "name" : "field", + "type" : { + "name" : "Svc.DpHdrField", + "kind" : "qualifiedIdentifier" + }, + "ref" : false, + "annotation" : "incorrect value" + }, + { + "name" : "exp", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "expected value" + }, + { + "name" : "act", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "expected value" + } + ], + "id" : 3609, + "format" : "Error reading DP {} header {} field. Expected: {} Actual: {}", + "annotation" : "Error reading header data from DP file", + "throttle" : 10 + }, + { + "name" : "Ref.fileDownlink.DownlinkCanceled", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "sourceFileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 100 + }, + "ref" : false, + "annotation" : "The source file name" + }, + { + "name" : "destFileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 100 + }, + "ref" : false, + "annotation" : "The destination file name" + } + ], + "id" : 1795, + "format" : "Canceled downlink of file {} to file {}", + "annotation" : "The File Downlink component canceled downlink of a file" + }, + { + "name" : "Ref.dpCat.ComponentNotInitialized", + "severity" : "WARNING_HI", + "formalParams" : [ + ], + "id" : 3604, + "format" : "DpCatalog not initialized!", + "annotation" : "Component not initialized error", + "throttle" : 10 + }, + { + "name" : "Ref.eventLogger.ID_FILTER_ENABLED", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "ID", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The ID filtered" + } + ], + "id" : 2817, + "format" : "ID {} is filtered.", + "annotation" : "Indicate ID is filtered" + }, + { + "name" : "Ref.dpWriter.InvalidBuffer", + "severity" : "WARNING_HI", + "formalParams" : [ + ], + "id" : 4096, + "format" : "Received buffer is invalid", + "annotation" : "Received buffer is invalid", + "throttle" : 10 + }, + { + "name" : "Ref.fileUplink.InvalidReceiveMode", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "packetType", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The type of the packet received" + }, + { + "name" : "mode", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The receive mode" + } + ], + "id" : 2308, + "format" : "Packet type {} received in mode {}", + "annotation" : "The File Uplink component received a packet with a type that was invalid for the current receive mode", + "throttle" : 5 + }, + { + "name" : "Ref.dpCat.CatalogXmitStarted", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + ], + "id" : 3594, + "format" : "Catalog transmission started", + "annotation" : "Catalog transmission started" + }, + { + "name" : "Ref.fatalAdapter.AF_ASSERT_0", + "severity" : "FATAL", + "formalParams" : [ + { + "name" : "file", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 200 + }, + "ref" : false, + "annotation" : "The source file of the assert" + }, + { + "name" : "line", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Line number of the assert" + } + ], + "id" : 16896, + "format" : "Assert in file {}, line {}", + "annotation" : "An assert happened" + }, + { + "name" : "Ref.fileManager.ShellCommandSucceeded", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "command", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 256 + }, + "ref" : false, + "annotation" : "The command string" + } + ], + "id" : 2055, + "format" : "Shell command {} succeeded", + "annotation" : "The File System component executed a shell command that returned status zero" + }, + { + "name" : "Ref.sendBuffComp.PacketErrorInserted", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "id", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The ID argument" + } + ], + "id" : 9729, + "format" : "Inserted error in packet ID {}", + "annotation" : "Packet checksum error" + }, + { + "name" : "Ref.dpWriter.InvalidHeader", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "bufferSize", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The incoming buffer size" + }, + { + "name" : "errorCode", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The error code" + } + ], + "id" : 4099, + "format" : "Received buffer of size {}; deserialization of packet header failed with error code {}", + "annotation" : "Error occurred when deserializing the packet header", + "throttle" : 10 + }, + { + "name" : "Ref.prmDb.PrmDbFull", + "severity" : "FATAL", + "formalParams" : [ + { + "name" : "Id", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The parameter ID" + } + ], + "id" : 3330, + "format" : "Parameter DB full when adding ID 0x{x} ", + "annotation" : "Parameter database is full" + }, + { + "name" : "Ref.version.CustomVersions", + "severity" : "ACTIVITY_LO", + "formalParams" : [ + { + "name" : "version_enum", + "type" : { + "name" : "Svc.VersionCfg.VersionEnum", + "kind" : "qualifiedIdentifier" + }, + "ref" : false, + "annotation" : "The enum to access" + }, + { + "name" : "version_value", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 40 + }, + "ref" : false, + "annotation" : "version" + } + ], + "id" : 19715, + "format" : "Custom Versions: [{}] [{}]", + "annotation" : "Version of the git repository." + }, + { + "name" : "Ref.fatalAdapter.AF_ASSERT_4", + "severity" : "FATAL", + "formalParams" : [ + { + "name" : "file", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 200 + }, + "ref" : false, + "annotation" : "The source file of the assert" + }, + { + "name" : "line", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Line number of the assert" + }, + { + "name" : "arg1", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "First assert argument" + }, + { + "name" : "arg2", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Second assert argument" + }, + { + "name" : "arg3", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Third assert argument" + }, + { + "name" : "arg4", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Fourth assert argument" + } + ], + "id" : 16900, + "format" : "Assert in file {}, line {}: {} {} {} {}", + "annotation" : "An assert happened" + }, + { + "name" : "Ref.fileUplink.UplinkCanceled", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + ], + "id" : 2311, + "format" : "Received CANCEL packet", + "annotation" : "The File Uplink component received a CANCEL packet" + }, + { + "name" : "Ref.SG1.SignalGen_DpsNotConnected", + "severity" : "WARNING_HI", + "formalParams" : [ + ], + "id" : 8452, + "format" : "DP Ports not connected!" + }, + { + "name" : "Ref.cmdDisp.OpCodeCompleted", + "severity" : "COMMAND", + "formalParams" : [ + { + "name" : "Opcode", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The I32 command argument" + } + ], + "id" : 1282, + "format" : "Opcode 0x{x} completed", + "annotation" : "Op code completed event" + }, + { + "name" : "Ref.cmdSeq.CS_FileNotFound", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "fileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 60 + }, + "ref" : false, + "annotation" : "The sequence file" + } + ], + "id" : 1542, + "format" : "Sequence file {} not found.", + "annotation" : "The sequence file was not found" + }, + { + "name" : "Ref.dpCat.ProcessingFile", + "severity" : "ACTIVITY_LO", + "formalParams" : [ + { + "name" : "file", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 80 + }, + "ref" : false, + "annotation" : "The file" + } + ], + "id" : 3586, + "format" : "Processing file {}", + "annotation" : "Processing directory" + }, + { + "name" : "Ref.fileManager.RemoveFileStarted", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "fileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 256 + }, + "ref" : false, + "annotation" : "The name of the file" + } + ], + "id" : 2065, + "format" : "Removing file {}...", + "annotation" : "The File System component began deleting an existing file" + }, + { + "name" : "Ref.health.HLTH_PING_WARN", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "entry", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 40 + }, + "ref" : false, + "annotation" : "The entry passing the warning level" + } + ], + "id" : 8192, + "format" : "Ping entry {} late warning", + "annotation" : "Warn that a ping target is longer than the warning value" + }, + { + "name" : "Ref.dpCat.DpXmitInProgress", + "severity" : "WARNING_LO", + "formalParams" : [ + ], + "id" : 3614, + "format" : "Cannot build new catalog while DPs are being transmitted", + "annotation" : "Tried to build catalog while downlink process active", + "throttle" : 10 + }, + { + "name" : "Ref.health.HLTH_PING_UPDATED", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "entry", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 40 + }, + "ref" : false, + "annotation" : "The entry changed" + }, + { + "name" : "warn", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The new warning value" + }, + { + "name" : "fatal", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The new FATAL value" + } + ], + "id" : 8198, + "format" : "Health ping for {} changed to WARN {} FATAL {}", + "annotation" : "Report changed ping" + }, + { + "name" : "Ref.dpWriter.FileWritten", + "severity" : "ACTIVITY_LO", + "formalParams" : [ + { + "name" : "bytes", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The number of bytes written" + }, + { + "name" : "file", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 200 + }, + "ref" : false, + "annotation" : "The file name" + } + ], + "id" : 4103, + "format" : "Wrote {} bytes to file {}", + "annotation" : "File written" + }, + { + "name" : "Ref.cmdSeq.CS_CmdStepped", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "filename", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 60 + }, + "ref" : false, + "annotation" : "The sequence file" + }, + { + "name" : "command", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The command that was stepped" + } + ], + "id" : 1557, + "format" : "Sequence {} command {} stepped", + "annotation" : "A command in a sequence was stepped through" + }, + { + "name" : "Ref.cmdSeq.CS_SequenceTimeout", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "filename", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 60 + }, + "ref" : false, + "annotation" : "The sequence file" + }, + { + "name" : "command", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The command that timed out" + } + ], + "id" : 1556, + "format" : "Sequence {} timed out on command {}", + "annotation" : "A sequence passed validation" + }, + { + "name" : "Ref.rateGroup2Comp.RateGroupCycleSlip", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "cycle", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The cycle where the cycle occurred" + } + ], + "id" : 769, + "format" : "Rate group cycle slipped on cycle {}", + "annotation" : "Warning event that rate group has had a cycle slip" + }, + { + "name" : "Ref.rateGroup2Comp.RateGroupStarted", + "severity" : "DIAGNOSTIC", + "formalParams" : [ + ], + "id" : 768, + "format" : "Rate group started.", + "annotation" : "Informational event that rate group has started" + }, + { + "name" : "Ref.fileManager.FileRemoveError", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "fileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 256 + }, + "ref" : false, + "annotation" : "The name of the file" + }, + { + "name" : "status", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The error status" + } + ], + "id" : 2051, + "format" : "Could not remove file {}, returned status {}", + "annotation" : "An error occurred while attempting to remove a file" + }, + { + "name" : "Ref.fileManager.MoveFileStarted", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "sourceFileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 256 + }, + "ref" : false, + "annotation" : "The name of the source file" + }, + { + "name" : "destFileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 256 + }, + "ref" : false, + "annotation" : "The name of the destination file" + } + ], + "id" : 2064, + "format" : "Moving file {} to file {}...", + "annotation" : "The File System component began moving a file to a new location" + }, + { + "name" : "Ref.typeDemo.FloatEv", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "float1", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "ref" : false + }, + { + "name" : "float2", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "ref" : false + }, + { + "name" : "float3", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "ref" : false + }, + { + "name" : "floats", + "type" : { + "name" : "Ref.FloatSet", + "kind" : "qualifiedIdentifier" + }, + "ref" : false + } + ], + "id" : 4362, + "format" : "Floats: {} {} {} as a set: {}", + "annotation" : "A set of floats in an event" + }, + { + "name" : "Ref.fileManager.AppendFileSucceeded", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "source", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 256 + }, + "ref" : false, + "annotation" : "The name of the file being read from" + }, + { + "name" : "target", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 256 + }, + "ref" : false, + "annotation" : "The name of the file to append to" + } + ], + "id" : 2054, + "format" : "Appended {} to the end of {}", + "annotation" : "The File System component appended 2 files without error" + }, + { + "name" : "Ref.eventLogger.SEVERITY_FILTER_STATE", + "severity" : "ACTIVITY_LO", + "formalParams" : [ + { + "name" : "severity", + "type" : { + "name" : "Svc.ActiveLogger.FilterSeverity", + "kind" : "qualifiedIdentifier" + }, + "ref" : false, + "annotation" : "The severity level" + }, + { + "name" : "enabled", + "type" : { + "name" : "bool", + "kind" : "bool", + "size" : 8 + }, + "ref" : false + } + ], + "id" : 2816, + "format" : "{} filter state. {}", + "annotation" : "Dump severity filter state" + }, + { + "name" : "Ref.typeDemo.ChoicePairEv", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "choices", + "type" : { + "name" : "Ref.ChoicePair", + "kind" : "qualifiedIdentifier" + }, + "ref" : false + } + ], + "id" : 4355, + "format" : "Choices: {}", + "annotation" : "Multiple choice event via Structure" + }, + { + "name" : "Ref.health.HLTH_PING_WRONG_KEY", + "severity" : "FATAL", + "formalParams" : [ + { + "name" : "entry", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 40 + }, + "ref" : false, + "annotation" : "The entry passing the warning level" + }, + { + "name" : "badKey", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The incorrect key value" + } + ], + "id" : 8194, + "format" : "Ping entry {} responded with wrong key 0x{x}", + "annotation" : "Declare FATAL since task is no longer responding" + }, + { + "name" : "Ref.cmdSeq.CS_PortSequenceStarted", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "filename", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 60 + }, + "ref" : false, + "annotation" : "The sequence file" + } + ], + "id" : 1551, + "format" : "Local request for sequence {} started.", + "annotation" : "A local port request to run a sequence was started" + }, + { + "name" : "Ref.cmdSeq.CS_InvalidMode", + "severity" : "WARNING_HI", + "formalParams" : [ + ], + "id" : 1547, + "format" : "Invalid mode", + "annotation" : "The Command Sequencer received a command that was invalid for its current mode." + }, + { + "name" : "Ref.fileDownlink.DownlinkPartialFail", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "sourceFileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 100 + }, + "ref" : false, + "annotation" : "The source filename" + }, + { + "name" : "destFileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 100 + }, + "ref" : false, + "annotation" : "The destination file name" + }, + { + "name" : "startOffset", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Starting file offset in bytes" + }, + { + "name" : "filesize", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Size of source file" + } + ], + "id" : 1798, + "format" : "Error occurred during partial downlink of file {} to file {}. Offset {} greater than or equal to source filesize {}.", + "annotation" : "The File Downlink component has detected a timeout. Downlink has been canceled." + }, + { + "name" : "Ref.SG2.SignalGen_DpRecordFull", + "severity" : "WARNING_LO", + "formalParams" : [ + { + "name" : "records", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false + }, + { + "name" : "bytes", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false + } + ], + "id" : 8707, + "format" : "DP container full with {} records and {} bytes. Closing DP." + }, + { + "name" : "Ref.fileManager.AppendFileStarted", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "source", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 256 + }, + "ref" : false, + "annotation" : "The name of the file being read from" + }, + { + "name" : "target", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 256 + }, + "ref" : false, + "annotation" : "The name of the file to append to" + } + ], + "id" : 2060, + "format" : "Appending file {} to the end of {}...", + "annotation" : "The File System component appended 2 files without error" + }, + { + "name" : "Ref.dpCat.FileReadError", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "file", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 80 + }, + "ref" : false, + "annotation" : "The file" + }, + { + "name" : "stat", + "type" : { + "name" : "I32", + "kind" : "integer", + "size" : 32, + "signed" : true + }, + "ref" : false, + "annotation" : "status" + } + ], + "id" : 3608, + "format" : "Error reading DP file {} status {}", + "annotation" : "Error opening file", + "throttle" : 10 + }, + { + "name" : "Ref.SG5.SignalGen_DpStarted", + "severity" : "ACTIVITY_LO", + "formalParams" : [ + { + "name" : "records", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false + } + ], + "id" : 9473, + "format" : "Writing {} DP records" + }, + { + "name" : "Ref.typeDemo.ChoicePairPrmEv", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "choices", + "type" : { + "name" : "Ref.ChoicePair", + "kind" : "qualifiedIdentifier" + }, + "ref" : false + }, + { + "name" : "validity", + "type" : { + "name" : "Fw.ParamValid", + "kind" : "qualifiedIdentifier" + }, + "ref" : false + } + ], + "id" : 4360, + "format" : "CHOICE_PAIR_PRM: {} with validity: {}", + "annotation" : "Multiple choice parameter event via Structure" + }, + { + "name" : "Ref.rateGroup3Comp.RateGroupCycleSlip", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "cycle", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The cycle where the cycle occurred" + } + ], + "id" : 1025, + "format" : "Rate group cycle slipped on cycle {}", + "annotation" : "Warning event that rate group has had a cycle slip" + }, + { + "name" : "Ref.prmDb.PrmFileReadError", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "stage", + "type" : { + "name" : "Svc.PrmDb.PrmReadError", + "kind" : "qualifiedIdentifier" + }, + "ref" : false, + "annotation" : "The read stage" + }, + { + "name" : "record", + "type" : { + "name" : "I32", + "kind" : "integer", + "size" : 32, + "signed" : true + }, + "ref" : false, + "annotation" : "The record that had the failure" + }, + { + "name" : "error", + "type" : { + "name" : "I32", + "kind" : "integer", + "size" : 32, + "signed" : true + }, + "ref" : false, + "annotation" : "The error code" + } + ], + "id" : 3334, + "format" : "Parameter file read failed in stage {} with record {} and error {}", + "annotation" : "Failed to read parameter file" + }, + { + "name" : "Ref.cmdSeq.CS_FileReadError", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "fileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 60 + }, + "ref" : false, + "annotation" : "The name of the sequence file" + } + ], + "id" : 1538, + "format" : "Error reading sequence file {}", + "annotation" : "The Sequence File Loader could not read the sequence file." + }, + { + "name" : "Ref.prmDb.PrmIdUpdated", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "Id", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The parameter ID" + } + ], + "id" : 3329, + "format" : "Parameter ID 0x{x} updated", + "annotation" : "Parameter ID updated in database" + }, + { + "name" : "Ref.version.FrameworkVersion", + "severity" : "ACTIVITY_LO", + "formalParams" : [ + { + "name" : "version", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 40 + }, + "ref" : false, + "annotation" : "version string" + } + ], + "id" : 19712, + "format" : "Framework Version: [{}]", + "annotation" : "Version of the git repository." + }, + { + "name" : "Ref.cmdDisp.InvalidCommand", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "Opcode", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Invalid opcode" + } + ], + "id" : 1285, + "format" : "Invalid opcode 0x{x} received", + "annotation" : "Received an invalid opcode" + }, + { + "name" : "Ref.SG4.SignalGen_DpsNotConnected", + "severity" : "WARNING_HI", + "formalParams" : [ + ], + "id" : 9220, + "format" : "DP Ports not connected!" + }, + { + "name" : "Ref.fileManager.CreateDirectorySucceeded", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "dirName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 256 + }, + "ref" : false, + "annotation" : "The name of the directory" + } + ], + "id" : 2056, + "format" : "Created directory {} successfully", + "annotation" : "The File System component created a new directory without error" + }, + { + "name" : "Ref.cmdSeq.CS_FileCrcFailure", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "fileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 60 + }, + "ref" : false, + "annotation" : "The sequence file" + }, + { + "name" : "storedCRC", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The CRC stored in the file" + }, + { + "name" : "computedCRC", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The CRC computed over the file" + } + ], + "id" : 1543, + "format" : "Sequence file {} had invalid CRC. Stored 0x{x}, Computed 0x{x}.", + "annotation" : "The sequence file validation failed" + }, + { + "name" : "Ref.SG1.SignalGen_SettingsChanged", + "severity" : "ACTIVITY_LO", + "formalParams" : [ + { + "name" : "Frequency", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false + }, + { + "name" : "Amplitude", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "ref" : false + }, + { + "name" : "Phase", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "ref" : false + }, + { + "name" : "SignalType", + "type" : { + "name" : "Ref.SignalType", + "kind" : "qualifiedIdentifier" + }, + "ref" : false + } + ], + "id" : 8448, + "format" : "Set Frequency(Hz) {}, Amplitude {f}, Phase {f}, Signal Type {}", + "annotation" : "Signal Generator Settings Changed" + }, + { + "name" : "Ref.cmdSeq.CS_SequenceLoaded", + "severity" : "ACTIVITY_LO", + "formalParams" : [ + { + "name" : "fileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 60 + }, + "ref" : false, + "annotation" : "The name of the sequence file" + } + ], + "id" : 1536, + "format" : "Loaded sequence {}", + "annotation" : "Sequence file was successfully loaded." + }, + { + "name" : "Ref.cmdDisp.MalformedCommand", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "Status", + "type" : { + "name" : "Fw.DeserialStatus", + "kind" : "qualifiedIdentifier" + }, + "ref" : false, + "annotation" : "The deserialization error" + } + ], + "id" : 1284, + "format" : "Received malformed command packet. Status: {}", + "annotation" : "Received a malformed command packet" + }, + { + "name" : "Ref.SG1.SignalGen_DpStarted", + "severity" : "ACTIVITY_LO", + "formalParams" : [ + { + "name" : "records", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false + } + ], + "id" : 8449, + "format" : "Writing {} DP records" + }, + { + "name" : "Ref.fileDownlink.DownlinkPartialWarning", + "severity" : "WARNING_LO", + "formalParams" : [ + { + "name" : "startOffset", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Starting file offset in bytes" + }, + { + "name" : "length", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Number of bytes to downlink" + }, + { + "name" : "filesize", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Size of source file" + }, + { + "name" : "sourceFileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 100 + }, + "ref" : false, + "annotation" : "The source filename" + }, + { + "name" : "destFileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 100 + }, + "ref" : false, + "annotation" : "The destination file name" + } + ], + "id" : 1797, + "format" : "Offset {} plus length {} is greater than source size {} for partial downlink of file {} to file {}. ", + "annotation" : "The File Downlink component has detected a timeout. Downlink has been canceled." + }, + { + "name" : "Ref.dpCat.DirectoryOpenError", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "loc", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 80 + }, + "ref" : false, + "annotation" : "The directory" + }, + { + "name" : "stat", + "type" : { + "name" : "I32", + "kind" : "integer", + "size" : 32, + "signed" : true + }, + "ref" : false, + "annotation" : "status" + } + ], + "id" : 3584, + "format" : "Unable to process directory {} status {}", + "annotation" : "Error opening directory" + }, + { + "name" : "Ref.eventLogger.ID_FILTER_LIST_FULL", + "severity" : "WARNING_LO", + "formalParams" : [ + { + "name" : "ID", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The ID filtered" + } + ], + "id" : 2818, + "format" : "ID filter list is full. Cannot filter {} .", + "annotation" : "Attempted to add ID to full ID filter ID" + }, + { + "name" : "Ref.SG4.SignalGen_DpRecordFull", + "severity" : "WARNING_LO", + "formalParams" : [ + { + "name" : "records", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false + }, + { + "name" : "bytes", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false + } + ], + "id" : 9219, + "format" : "DP container full with {} records and {} bytes. Closing DP." + }, + { + "name" : "Ref.cmdSeq.CS_ModeSwitched", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "mode", + "type" : { + "name" : "Svc.CmdSequencer.SeqMode", + "kind" : "qualifiedIdentifier" + }, + "ref" : false, + "annotation" : "The new mode" + } + ], + "id" : 1553, + "format" : "Sequencer switched to {} step mode", + "annotation" : "Switched step mode" + }, + { + "name" : "Ref.dpBufferManager.NoBuffsAvailable", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "size", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The requested size" + } + ], + "id" : 19456, + "format" : "No available buffers of size {}", + "annotation" : "The BufferManager was unable to allocate a requested buffer", + "throttle" : 10 + }, + { + "name" : "Ref.fileUplinkBufferManager.NoBuffsAvailable", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "size", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The requested size" + } + ], + "id" : 17408, + "format" : "No available buffers of size {}", + "annotation" : "The BufferManager was unable to allocate a requested buffer", + "throttle" : 10 + }, + { + "name" : "Ref.fileUplink.PacketOutOfOrder", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "packetIndex", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The sequence index of the out-of-order packet" + }, + { + "name" : "lastPacketIndex", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The sequence index of the last packet received before the out-of-order packet" + } + ], + "id" : 2310, + "format" : "Received packet {} after packet {}", + "annotation" : "The File Uplink component encountered an out-of-order packet during file receipt", + "throttle" : 20 + }, + { + "name" : "Ref.SG3.SignalGen_DpComplete", + "severity" : "ACTIVITY_LO", + "formalParams" : [ + { + "name" : "records", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false + }, + { + "name" : "bytes", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false + } + ], + "id" : 8962, + "format" : "Writing {} DP records {} bytes total" + }, + { + "name" : "Ref.dpWriter.FileWriteError", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "status", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The status code returned from the write operation" + }, + { + "name" : "bytesWritten", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The number of bytes successfully written" + }, + { + "name" : "bytesToWrite", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The number of bytes attempted" + }, + { + "name" : "file", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 200 + }, + "ref" : false, + "annotation" : "The file" + } + ], + "id" : 4102, + "format" : "Error {} while writing {} of {} bytes to {}", + "annotation" : "An error occurred when writing to a file", + "throttle" : 10 + }, + { + "name" : "Ref.fileUplink.FileOpenError", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "fileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 40 + }, + "ref" : false, + "annotation" : "The name of the file" + } + ], + "id" : 2305, + "format" : "Could not open file {}", + "annotation" : "An error occurred opening a file" + }, + { + "name" : "Ref.cmdDisp.TestCmd1Args", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "arg1", + "type" : { + "name" : "I32", + "kind" : "integer", + "size" : 32, + "signed" : true + }, + "ref" : false, + "annotation" : "Arg1" + }, + { + "name" : "arg2", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "ref" : false, + "annotation" : "Arg2" + }, + { + "name" : "arg3", + "type" : { + "name" : "U8", + "kind" : "integer", + "size" : 8, + "signed" : false + }, + "ref" : false, + "annotation" : "Arg3" + } + ], + "id" : 1289, + "format" : "TEST_CMD_1 args: I32: {}, F32: {f}, U8: {}", + "annotation" : "This log event message returns the TEST_CMD_1 arguments." + }, + { + "name" : "Ref.dpCat.DpCatalogFull", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "dp", + "type" : { + "name" : "Svc.DpRecord", + "kind" : "qualifiedIdentifier" + }, + "ref" : false, + "annotation" : "The DP" + } + ], + "id" : 3613, + "format" : "Catalog full trying to insert DP {}", + "annotation" : "Error inserting entry into list", + "throttle" : 10 + }, + { + "name" : "Ref.health.HLTH_CHECK_LOOKUP_ERROR", + "severity" : "WARNING_LO", + "formalParams" : [ + { + "name" : "entry", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 40 + }, + "ref" : false, + "annotation" : "The entry passing the warning level" + } + ], + "id" : 8197, + "format" : "Couldn't find entry {}", + "annotation" : "Entry was not found" + }, + { + "name" : "Ref.prmDb.PrmIdAdded", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "Id", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The parameter ID" + } + ], + "id" : 3331, + "format" : "Parameter ID 0x{x} added", + "annotation" : "Parameter ID added to database" + }, + { + "name" : "Ref.cmdSeq.CS_CmdStarted", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "filename", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 60 + }, + "ref" : false, + "annotation" : "The sequence file" + } + ], + "id" : 1558, + "format" : "Sequence {} started", + "annotation" : "A manual sequence was started" + }, + { + "name" : "Ref.dpCat.ProcessingDirectory", + "severity" : "ACTIVITY_LO", + "formalParams" : [ + { + "name" : "directory", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 80 + }, + "ref" : false, + "annotation" : "The directory" + } + ], + "id" : 3585, + "format" : "Processing directory {}", + "annotation" : "Processing directory" + }, + { + "name" : "Ref.dpCat.ProductComplete", + "severity" : "ACTIVITY_LO", + "formalParams" : [ + { + "name" : "file", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 80 + }, + "ref" : false, + "annotation" : "The file" + } + ], + "id" : 3598, + "format" : "Product {} complete", + "annotation" : "Product send complete" + }, + { + "name" : "Ref.fileManager.FileSizeSucceeded", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "fileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 256 + }, + "ref" : false, + "annotation" : "The name of the file" + }, + { + "name" : "size", + "type" : { + "name" : "U64", + "kind" : "integer", + "size" : 64, + "signed" : false + }, + "ref" : false, + "annotation" : "The size of the file in bytes" + } + ], + "id" : 2066, + "format" : "The size of file {} is {} B", + "annotation" : "File size response" + }, + { + "name" : "Ref.dpWriter.InvalidHeaderHash", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "bufferSize", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The incoming buffer size" + }, + { + "name" : "storedHash", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The stored hash value" + }, + { + "name" : "computedHash", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The computed hash value" + } + ], + "id" : 4098, + "format" : "Received a buffer of size {} with an invalid header hash (stored {x}, computed {x})", + "annotation" : "The received buffer has an invalid header hash", + "throttle" : 10 + }, + { + "name" : "Ref.cmdDisp.OpCodeRegistered", + "severity" : "DIAGNOSTIC", + "formalParams" : [ + { + "name" : "Opcode", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The opcode to register" + }, + { + "name" : "port", + "type" : { + "name" : "I32", + "kind" : "integer", + "size" : 32, + "signed" : true + }, + "ref" : false, + "annotation" : "The registration port" + }, + { + "name" : "slot", + "type" : { + "name" : "I32", + "kind" : "integer", + "size" : 32, + "signed" : true + }, + "ref" : false, + "annotation" : "The dispatch slot it was placed in" + } + ], + "id" : 1280, + "format" : "Opcode 0x{x} registered to port {} slot {}" + }, + { + "name" : "Ref.cmdSeq.CS_CommandError", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "fileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 60 + }, + "ref" : false, + "annotation" : "The name of the sequence file" + }, + { + "name" : "recordNumber", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The record number" + }, + { + "name" : "opCode", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The opcode" + }, + { + "name" : "errorStatus", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The error status" + } + ], + "id" : 1546, + "format" : "Sequence file {}: Command {} (opcode {}) completed with error {}", + "annotation" : "The Command Sequencer issued a command and received an error status in return." + }, + { + "name" : "Ref.fileManager.FileMoveError", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "sourceFileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 256 + }, + "ref" : false, + "annotation" : "The name of the source file" + }, + { + "name" : "destFileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 256 + }, + "ref" : false, + "annotation" : "The name of the destination file" + }, + { + "name" : "status", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The error status" + } + ], + "id" : 2050, + "format" : "Could not move file {} to file {}, returned status {}", + "annotation" : "An error occurred while attempting to move a file" + }, + { + "name" : "Ref.typeDemo.ChoicePrmEv", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "choice", + "type" : { + "name" : "Ref.Choice", + "kind" : "qualifiedIdentifier" + }, + "ref" : false + }, + { + "name" : "validity", + "type" : { + "name" : "Fw.ParamValid", + "kind" : "qualifiedIdentifier" + }, + "ref" : false + } + ], + "id" : 4357, + "format" : "CHOICE_PRM: {} with validity: {}", + "annotation" : "Single choice parameter event" + }, + { + "name" : "Ref.sendBuffComp.FirstPacketSent", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "id", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The ID argument" + } + ], + "id" : 9728, + "format" : "First packet ID {} received", + "annotation" : "First packet send" + }, + { + "name" : "Ref.typeDemo.ChoiceSlurryEv", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "choices", + "type" : { + "name" : "Ref.ChoiceSlurry", + "kind" : "qualifiedIdentifier" + }, + "ref" : false + } + ], + "id" : 4356, + "format" : "Choices: {}", + "annotation" : "Multiple choice event via Complex Structure" + }, + { + "name" : "Ref.health.HLTH_PING_LATE", + "severity" : "FATAL", + "formalParams" : [ + { + "name" : "entry", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 40 + }, + "ref" : false, + "annotation" : "The entry passing the warning level" + } + ], + "id" : 8193, + "format" : "Ping entry {} did not respond", + "annotation" : "Declare FATAL since task is no longer responding" + }, + { + "name" : "Ref.dpBufferManager.ZeroSizeBuffer", + "severity" : "WARNING_HI", + "formalParams" : [ + ], + "id" : 19457, + "format" : "Received zero size buffer", + "annotation" : "The buffer manager received a zero-sized buffer as a return. Probably undetected empty buffer allocation", + "throttle" : 10 + }, + { + "name" : "Ref.prmDb.PrmIdNotFound", + "severity" : "WARNING_LO", + "formalParams" : [ + { + "name" : "Id", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "The parameter ID" + } + ], + "id" : 3328, + "format" : "Parameter ID 0x{x} not found", + "annotation" : "Parameter ID not found in database.", + "throttle" : 5 + }, + { + "name" : "Ref.fatalAdapter.AF_ASSERT_5", + "severity" : "FATAL", + "formalParams" : [ + { + "name" : "file", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 200 + }, + "ref" : false, + "annotation" : "The source file of the assert" + }, + { + "name" : "line", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Line number of the assert" + }, + { + "name" : "arg1", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "First assert argument" + }, + { + "name" : "arg2", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Second assert argument" + }, + { + "name" : "arg3", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Third assert argument" + }, + { + "name" : "arg4", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Fourth assert argument" + }, + { + "name" : "arg5", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false, + "annotation" : "Fifth assert argument" + } + ], + "id" : 16901, + "format" : "Assert in file {}, line {}: {} {} {} {} {}", + "annotation" : "An assert happened" + }, + { + "name" : "Ref.cmdDisp.NoOpStringReceived", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "message", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 40 + }, + "ref" : false, + "annotation" : "The NO-OP string that is generated" + } + ], + "id" : 1288, + "format" : "Received a NO-OP string={}", + "annotation" : "The command dispatcher has successfully received a NO-OP command from GUI with a string" + }, + { + "name" : "Ref.SG2.SignalGen_DpComplete", + "severity" : "ACTIVITY_LO", + "formalParams" : [ + { + "name" : "records", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false + }, + { + "name" : "bytes", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false + } + ], + "id" : 8706, + "format" : "Writing {} DP records {} bytes total" + }, + { + "name" : "Ref.fileManager.RemoveDirectoryStarted", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "dirName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 256 + }, + "ref" : false, + "annotation" : "The name of the directory" + } + ], + "id" : 2063, + "format" : "Removing directory {}...", + "annotation" : "The File System component began deleting a directory" + }, + { + "name" : "Ref.fileUplinkBufferManager.ZeroSizeBuffer", + "severity" : "WARNING_HI", + "formalParams" : [ + ], + "id" : 17409, + "format" : "Received zero size buffer", + "annotation" : "The buffer manager received a zero-sized buffer as a return. Probably undetected empty buffer allocation", + "throttle" : 10 + }, + { + "name" : "Ref.SG5.SignalGen_DpComplete", + "severity" : "ACTIVITY_LO", + "formalParams" : [ + { + "name" : "records", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false + }, + { + "name" : "bytes", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false + } + ], + "id" : 9474, + "format" : "Writing {} DP records {} bytes total" + }, + { + "name" : "Ref.cmdSeq.CS_TimeContextMismatch", + "severity" : "WARNING_HI", + "formalParams" : [ + { + "name" : "fileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 60 + }, + "ref" : false, + "annotation" : "The name of the sequence file" + }, + { + "name" : "currTimeBase", + "type" : { + "name" : "U8", + "kind" : "integer", + "size" : 8, + "signed" : false + }, + "ref" : false, + "annotation" : "The current time base" + }, + { + "name" : "seqTimeBase", + "type" : { + "name" : "U8", + "kind" : "integer", + "size" : 8, + "signed" : false + }, + "ref" : false, + "annotation" : "The sequence time base" + } + ], + "id" : 1550, + "format" : "Sequence file {}: Current time context doesn't match sequence context: base: {} seq: {}", + "annotation" : "The running time base doesn't match the time base in the sequence files" + }, + { + "name" : "Ref.typeDemo.ScalarStructEv", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "scalar_argument", + "type" : { + "name" : "Ref.ScalarStruct", + "kind" : "qualifiedIdentifier" + }, + "ref" : false + } + ], + "id" : 4363, + "format" : "ScalarStruct: {}", + "annotation" : "Event for scalar struct" + }, + { + "name" : "Ref.dpCat.ComponentNoMemory", + "severity" : "WARNING_HI", + "formalParams" : [ + ], + "id" : 3605, + "format" : "DpCatalog couldn't get memory", + "annotation" : "Component didn't get memory error", + "throttle" : 10 + }, + { + "name" : "Ref.cmdSeq.CS_SequenceCanceled", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "fileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 60 + }, + "ref" : false, + "annotation" : "The name of the sequence file" + } + ], + "id" : 1537, + "format" : "Sequence file {} canceled", + "annotation" : "A command sequence was successfully canceled." + }, + { + "name" : "Ref.fileManager.RemoveFileSucceeded", + "severity" : "ACTIVITY_HI", + "formalParams" : [ + { + "name" : "fileName", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 256 + }, + "ref" : false, + "annotation" : "The name of the file" + } + ], + "id" : 2059, + "format" : "Removed file {} successfully", + "annotation" : "The File System component deleted an existing file without error" + }, + { + "name" : "Ref.SG3.SignalGen_DpStarted", + "severity" : "ACTIVITY_LO", + "formalParams" : [ + { + "name" : "records", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "ref" : false + } + ], + "id" : 8961, + "format" : "Writing {} DP records" + } + ], + "telemetryChannels" : [ + { + "name" : "Ref.pingRcvr.PR_NumPings", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 2560, + "telemetryUpdate" : "always", + "annotation" : "Number of pings received" + }, + { + "name" : "Ref.recvBuffComp.Parameter2", + "type" : { + "name" : "I16", + "kind" : "integer", + "size" : 16, + "signed" : true + }, + "id" : 18180, + "telemetryUpdate" : "on change", + "annotation" : "Readback of Parameter2", + "limits" : { + "high" : { + "red" : 3, + "orange" : 2, + "yellow" : 1 + }, + "low" : { + "red" : -3, + "orange" : -2, + "yellow" : -1 + } + } + }, + { + "name" : "Ref.systemResources.CPU", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "id" : 19204, + "telemetryUpdate" : "always", + "format" : "{.2f} percent", + "annotation" : "System's CPU Percentage" + }, + { + "name" : "Ref.SG3.Type", + "type" : { + "name" : "Ref.SignalType", + "kind" : "qualifiedIdentifier" + }, + "id" : 8960, + "telemetryUpdate" : "always", + "annotation" : "Type of the output signal: SINE, TRIANGLE, etc." + }, + { + "name" : "Ref.rateGroup3Comp.RgMaxTime", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 1024, + "telemetryUpdate" : "on change", + "format" : "{} us", + "annotation" : "Max execution time rate group" + }, + { + "name" : "Ref.fileUplink.Warnings", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 2306, + "telemetryUpdate" : "always", + "annotation" : "The total number of warnings issued" + }, + { + "name" : "Ref.version.LibraryVersion03", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 40 + }, + "id" : 19726, + "telemetryUpdate" : "always" + }, + { + "name" : "Ref.sendBuffComp.Parameter4", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "id" : 9731, + "telemetryUpdate" : "on change", + "annotation" : "Readback of Parameter4" + }, + { + "name" : "Ref.SG4.DpBytes", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 9222, + "telemetryUpdate" : "always", + "annotation" : "DP bytes written" + }, + { + "name" : "Ref.version.ProjectVersion", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 40 + }, + "id" : 19713, + "telemetryUpdate" : "always", + "annotation" : "Software project version" + }, + { + "name" : "Ref.SG1.PairOutput", + "type" : { + "name" : "Ref.SignalPair", + "kind" : "qualifiedIdentifier" + }, + "id" : 8450, + "telemetryUpdate" : "always", + "annotation" : "Single (time, value) pair of the signal" + }, + { + "name" : "Ref.SG2.Info", + "type" : { + "name" : "Ref.SignalInfo", + "kind" : "qualifiedIdentifier" + }, + "id" : 8709, + "telemetryUpdate" : "always", + "annotation" : "Composite field of signal information, containing histories, pairs etc" + }, + { + "name" : "Ref.fileDownlink.PacketsSent", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 1793, + "telemetryUpdate" : "always", + "annotation" : "The total number of packets sent" + }, + { + "name" : "Ref.systemResources.CPU_08", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "id" : 19213, + "telemetryUpdate" : "always", + "format" : "{.2f} percent", + "annotation" : "System's CPU Percentage" + }, + { + "name" : "Ref.fileUplinkBufferManager.NoBuffs", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 17411, + "telemetryUpdate" : "on change", + "annotation" : "The number of requests that couldn't return a buffer", + "limits" : { + "high" : { + "red" : 1 + } + } + }, + { + "name" : "Ref.recvBuffComp.Sensor2", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "id" : 18178, + "telemetryUpdate" : "always", + "annotation" : "Value of Sensor3" + }, + { + "name" : "Ref.SG3.History", + "type" : { + "name" : "Ref.SignalSet", + "kind" : "qualifiedIdentifier" + }, + "id" : 8963, + "telemetryUpdate" : "always", + "annotation" : "Last 10 Y values of the signal" + }, + { + "name" : "Ref.version.CustomVersion09", + "type" : { + "name" : "Svc.CustomVersionDb", + "kind" : "qualifiedIdentifier" + }, + "id" : 19722, + "telemetryUpdate" : "always" + }, + { + "name" : "Ref.dpWriter.NumBytesWritten", + "type" : { + "name" : "U64", + "kind" : "integer", + "size" : 64, + "signed" : false + }, + "id" : 4097, + "telemetryUpdate" : "on change", + "annotation" : "The number of bytes written" + }, + { + "name" : "Ref.SG4.PairOutput", + "type" : { + "name" : "Ref.SignalPair", + "kind" : "qualifiedIdentifier" + }, + "id" : 9218, + "telemetryUpdate" : "always", + "annotation" : "Single (time, value) pair of the signal" + }, + { + "name" : "Ref.SG5.PairHistory", + "type" : { + "name" : "Ref.SignalPairSet", + "kind" : "qualifiedIdentifier" + }, + "id" : 9476, + "telemetryUpdate" : "always", + "annotation" : "Last 10 (time, value) pairs of the signal" + }, + { + "name" : "Ref.systemResources.CPU_14", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "id" : 19219, + "telemetryUpdate" : "always", + "format" : "{.2f} percent", + "annotation" : "System's CPU Percentage" + }, + { + "name" : "Ref.version.LibraryVersion09", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 40 + }, + "id" : 19732, + "telemetryUpdate" : "always" + }, + { + "name" : "Ref.dpBufferManager.HiBuffs", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 19458, + "telemetryUpdate" : "on change", + "annotation" : "The high water mark of allocated buffers" + }, + { + "name" : "Ref.SG2.Output", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "id" : 8705, + "telemetryUpdate" : "always", + "format" : "{.4f}", + "annotation" : "Single Y value of the output" + }, + { + "name" : "Ref.systemResources.CPU_04", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "id" : 19209, + "telemetryUpdate" : "always", + "format" : "{.2f} percent", + "annotation" : "System's CPU Percentage" + }, + { + "name" : "Ref.fileDownlink.FilesSent", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 1792, + "telemetryUpdate" : "always", + "annotation" : "The total number of files sent" + }, + { + "name" : "Ref.SG3.DpRecords", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 8967, + "telemetryUpdate" : "always", + "annotation" : "DP records written" + }, + { + "name" : "Ref.SG4.Type", + "type" : { + "name" : "Ref.SignalType", + "kind" : "qualifiedIdentifier" + }, + "id" : 9216, + "telemetryUpdate" : "always", + "annotation" : "Type of the output signal: SINE, TRIANGLE, etc." + }, + { + "name" : "Ref.version.CustomVersion06", + "type" : { + "name" : "Svc.CustomVersionDb", + "kind" : "qualifiedIdentifier" + }, + "id" : 19719, + "telemetryUpdate" : "always" + }, + { + "name" : "Ref.dpMgr.NumSuccessfulAllocations", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 3840, + "telemetryUpdate" : "on change", + "annotation" : "The number of successful buffer allocations" + }, + { + "name" : "Ref.typeDemo.ChoicesCh", + "type" : { + "name" : "Ref.ManyChoices", + "kind" : "qualifiedIdentifier" + }, + "id" : 4353, + "telemetryUpdate" : "always", + "annotation" : "Multiple choice channel via Array" + }, + { + "name" : "Ref.SG5.History", + "type" : { + "name" : "Ref.SignalSet", + "kind" : "qualifiedIdentifier" + }, + "id" : 9475, + "telemetryUpdate" : "always", + "annotation" : "Last 10 Y values of the signal" + }, + { + "name" : "Ref.typeDemo.Float2Ch", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "id" : 4358, + "telemetryUpdate" : "always", + "annotation" : "Float output channel 2" + }, + { + "name" : "Ref.fileManager.Errors", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 2049, + "telemetryUpdate" : "always", + "annotation" : "The total number of errors" + }, + { + "name" : "Ref.systemResources.CPU_01", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "id" : 19206, + "telemetryUpdate" : "always", + "format" : "{.2f} percent", + "annotation" : "System's CPU Percentage" + }, + { + "name" : "Ref.fileUplinkBufferManager.HiBuffs", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 17410, + "telemetryUpdate" : "on change", + "annotation" : "The high water mark of allocated buffers" + }, + { + "name" : "Ref.systemResources.MEMORY_USED", + "type" : { + "name" : "U64", + "kind" : "integer", + "size" : 64, + "signed" : false + }, + "id" : 19201, + "telemetryUpdate" : "always", + "format" : "{} KB", + "annotation" : "System memory used in KB" + }, + { + "name" : "Ref.version.CustomVersion04", + "type" : { + "name" : "Svc.CustomVersionDb", + "kind" : "qualifiedIdentifier" + }, + "id" : 19717, + "telemetryUpdate" : "always" + }, + { + "name" : "Ref.systemResources.CPU_11", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "id" : 19216, + "telemetryUpdate" : "always", + "format" : "{.2f} percent", + "annotation" : "System's CPU Percentage" + }, + { + "name" : "Ref.SG1.DpBytes", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 8454, + "telemetryUpdate" : "always", + "annotation" : "DP bytes written" + }, + { + "name" : "Ref.version.CustomVersion01", + "type" : { + "name" : "Svc.CustomVersionDb", + "kind" : "qualifiedIdentifier" + }, + "id" : 19714, + "telemetryUpdate" : "always", + "annotation" : "Custom Versions" + }, + { + "name" : "Ref.version.LibraryVersion06", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 40 + }, + "id" : 19729, + "telemetryUpdate" : "always" + }, + { + "name" : "Ref.SG5.Type", + "type" : { + "name" : "Ref.SignalType", + "kind" : "qualifiedIdentifier" + }, + "id" : 9472, + "telemetryUpdate" : "always", + "annotation" : "Type of the output signal: SINE, TRIANGLE, etc." + }, + { + "name" : "Ref.rateGroup1Comp.RgMaxTime", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 512, + "telemetryUpdate" : "on change", + "format" : "{} us", + "annotation" : "Max execution time rate group" + }, + { + "name" : "Ref.SG4.Info", + "type" : { + "name" : "Ref.SignalInfo", + "kind" : "qualifiedIdentifier" + }, + "id" : 9221, + "telemetryUpdate" : "always", + "annotation" : "Composite field of signal information, containing histories, pairs etc" + }, + { + "name" : "Ref.recvBuffComp.Sensor1", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "id" : 18177, + "telemetryUpdate" : "always", + "format" : "{.2f}V", + "annotation" : "Value of Sensor1" + }, + { + "name" : "Ref.version.LibraryVersion04", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 40 + }, + "id" : 19727, + "telemetryUpdate" : "always" + }, + { + "name" : "Ref.dpWriter.NumErrors", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 4100, + "telemetryUpdate" : "on change", + "annotation" : "The number of errors" + }, + { + "name" : "Ref.systemResources.CPU_13", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "id" : 19218, + "telemetryUpdate" : "always", + "format" : "{.2f} percent", + "annotation" : "System's CPU Percentage" + }, + { + "name" : "Ref.SG4.Output", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "id" : 9217, + "telemetryUpdate" : "always", + "format" : "{.4f}", + "annotation" : "Single Y value of the output" + }, + { + "name" : "Ref.systemResources.CPU_09", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "id" : 19214, + "telemetryUpdate" : "always", + "format" : "{.2f} percent", + "annotation" : "System's CPU Percentage" + }, + { + "name" : "Ref.version.CustomVersion03", + "type" : { + "name" : "Svc.CustomVersionDb", + "kind" : "qualifiedIdentifier" + }, + "id" : 19716, + "telemetryUpdate" : "always" + }, + { + "name" : "Ref.SG3.PairHistory", + "type" : { + "name" : "Ref.SignalPairSet", + "kind" : "qualifiedIdentifier" + }, + "id" : 8964, + "telemetryUpdate" : "always", + "annotation" : "Last 10 (time, value) pairs of the signal" + }, + { + "name" : "Ref.cmdDisp.CommandErrors", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 1281, + "telemetryUpdate" : "on change", + "annotation" : "Number of command errors" + }, + { + "name" : "Ref.version.LibraryVersion08", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 40 + }, + "id" : 19731, + "telemetryUpdate" : "always" + }, + { + "name" : "Ref.sendBuffComp.Parameter3", + "type" : { + "name" : "U8", + "kind" : "integer", + "size" : 8, + "signed" : false + }, + "id" : 9730, + "telemetryUpdate" : "on change", + "annotation" : "Readback of Parameter3" + }, + { + "name" : "Ref.fileDownlink.Warnings", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 1794, + "telemetryUpdate" : "always", + "annotation" : "The total number of warnings" + }, + { + "name" : "Ref.fileUplinkBufferManager.EmptyBuffs", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 17412, + "telemetryUpdate" : "on change", + "annotation" : "The number of empty buffers returned", + "limits" : { + "high" : { + "red" : 1 + } + } + }, + { + "name" : "Ref.systemResources.NON_VOLATILE_FREE", + "type" : { + "name" : "U64", + "kind" : "integer", + "size" : 64, + "signed" : false + }, + "id" : 19203, + "telemetryUpdate" : "always", + "format" : "{} KB", + "annotation" : "System non-volatile available in KB" + }, + { + "name" : "Ref.SG1.History", + "type" : { + "name" : "Ref.SignalSet", + "kind" : "qualifiedIdentifier" + }, + "id" : 8451, + "telemetryUpdate" : "always", + "annotation" : "Last 10 Y values of the signal" + }, + { + "name" : "Ref.cmdSeq.CS_SequencesCompleted", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 1540, + "telemetryUpdate" : "always", + "annotation" : "The number of sequences completed." + }, + { + "name" : "Ref.blockDrv.BD_Cycles", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 256, + "telemetryUpdate" : "always", + "annotation" : "Driver cycle count" + }, + { + "name" : "Ref.SG2.Type", + "type" : { + "name" : "Ref.SignalType", + "kind" : "qualifiedIdentifier" + }, + "id" : 8704, + "telemetryUpdate" : "always", + "annotation" : "Type of the output signal: SINE, TRIANGLE, etc." + }, + { + "name" : "Ref.systemResources.CPU_05", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "id" : 19210, + "telemetryUpdate" : "always", + "format" : "{.2f} percent", + "annotation" : "System's CPU Percentage" + }, + { + "name" : "Ref.SG5.Info", + "type" : { + "name" : "Ref.SignalInfo", + "kind" : "qualifiedIdentifier" + }, + "id" : 9477, + "telemetryUpdate" : "always", + "annotation" : "Composite field of signal information, containing histories, pairs etc" + }, + { + "name" : "Ref.fileUplink.FilesReceived", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 2304, + "telemetryUpdate" : "always", + "annotation" : "The total number of complete files received" + }, + { + "name" : "Ref.cmdSeq.CS_CommandsExecuted", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 1539, + "telemetryUpdate" : "always", + "annotation" : "The number of commands executed across all sequences." + }, + { + "name" : "Ref.recvBuffComp.PktState", + "type" : { + "name" : "Ref.PacketStat", + "kind" : "qualifiedIdentifier" + }, + "id" : 18176, + "telemetryUpdate" : "always", + "annotation" : "Packet Statistics" + }, + { + "name" : "Ref.SG1.DpRecords", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 8455, + "telemetryUpdate" : "always", + "annotation" : "DP records written" + }, + { + "name" : "Ref.dpBufferManager.NoBuffs", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 19459, + "telemetryUpdate" : "on change", + "annotation" : "The number of requests that couldn't return a buffer", + "limits" : { + "high" : { + "red" : 1 + } + } + }, + { + "name" : "Ref.typeDemo.ChoiceCh", + "type" : { + "name" : "Ref.Choice", + "kind" : "qualifiedIdentifier" + }, + "id" : 4352, + "telemetryUpdate" : "always", + "annotation" : "Single choice channel" + }, + { + "name" : "Ref.version.CustomVersion10", + "type" : { + "name" : "Svc.CustomVersionDb", + "kind" : "qualifiedIdentifier" + }, + "id" : 19723, + "telemetryUpdate" : "always" + }, + { + "name" : "Ref.dpMgr.NumFailedAllocations", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 3841, + "telemetryUpdate" : "on change", + "annotation" : "The number of failed buffer allocations" + }, + { + "name" : "Ref.SG2.PairHistory", + "type" : { + "name" : "Ref.SignalPairSet", + "kind" : "qualifiedIdentifier" + }, + "id" : 8708, + "telemetryUpdate" : "always", + "annotation" : "Last 10 (time, value) pairs of the signal" + }, + { + "name" : "Ref.rateGroup1Comp.RgCycleSlips", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 513, + "telemetryUpdate" : "on change", + "annotation" : "Cycle slips for rate group" + }, + { + "name" : "Ref.typeDemo.ExtraChoicesCh", + "type" : { + "name" : "Ref.TooManyChoices", + "kind" : "qualifiedIdentifier" + }, + "id" : 4354, + "telemetryUpdate" : "always", + "annotation" : "Too many choice channel via Array" + }, + { + "name" : "Ref.typeDemo.Float3Ch", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "id" : 4359, + "telemetryUpdate" : "always", + "annotation" : "Float output channel 3" + }, + { + "name" : "Ref.fileManager.CommandsExecuted", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 2048, + "telemetryUpdate" : "always", + "annotation" : "The total number of commands successfully executed" + }, + { + "name" : "Ref.systemResources.CPU_10", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "id" : 19215, + "telemetryUpdate" : "always", + "format" : "{.2f} percent", + "annotation" : "System's CPU Percentage" + }, + { + "name" : "Ref.systemResources.CPU_12", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "id" : 19217, + "telemetryUpdate" : "always", + "format" : "{.2f} percent", + "annotation" : "System's CPU Percentage" + }, + { + "name" : "Ref.SG2.DpRecords", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 8711, + "telemetryUpdate" : "always", + "annotation" : "DP records written" + }, + { + "name" : "Ref.systemResources.NON_VOLATILE_TOTAL", + "type" : { + "name" : "U64", + "kind" : "integer", + "size" : 64, + "signed" : false + }, + "id" : 19202, + "telemetryUpdate" : "always", + "format" : "{} KB", + "annotation" : "System non-volatile available in KB" + }, + { + "name" : "Ref.dpWriter.NumBuffersReceived", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 4096, + "telemetryUpdate" : "on change", + "annotation" : "The number of buffers received" + }, + { + "name" : "Ref.dpWriter.NumFailedWrites", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 4099, + "telemetryUpdate" : "on change", + "annotation" : "The number of failed writes" + }, + { + "name" : "Ref.version.LibraryVersion05", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 40 + }, + "id" : 19728, + "telemetryUpdate" : "always" + }, + { + "name" : "Ref.sendBuffComp.NumErrorsInjected", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 9729, + "telemetryUpdate" : "on change", + "annotation" : "Number of errors injected" + }, + { + "name" : "Ref.version.CustomVersion02", + "type" : { + "name" : "Svc.CustomVersionDb", + "kind" : "qualifiedIdentifier" + }, + "id" : 19715, + "telemetryUpdate" : "always" + }, + { + "name" : "Ref.SG1.PairHistory", + "type" : { + "name" : "Ref.SignalPairSet", + "kind" : "qualifiedIdentifier" + }, + "id" : 8452, + "telemetryUpdate" : "always", + "annotation" : "Last 10 (time, value) pairs of the signal" + }, + { + "name" : "Ref.systemResources.CPU_03", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "id" : 19208, + "telemetryUpdate" : "always", + "format" : "{.2f} percent", + "annotation" : "System's CPU Percentage" + }, + { + "name" : "Ref.health.PingLateWarnings", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 8192, + "telemetryUpdate" : "always", + "annotation" : "Number of overrun warnings" + }, + { + "name" : "Ref.rateGroup2Comp.RgCycleSlips", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 769, + "telemetryUpdate" : "on change", + "annotation" : "Cycle slips for rate group" + }, + { + "name" : "Ref.SG5.DpBytes", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 9478, + "telemetryUpdate" : "always", + "annotation" : "DP bytes written" + }, + { + "name" : "Ref.rateGroup2Comp.RgMaxTime", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 768, + "telemetryUpdate" : "on change", + "format" : "{} us", + "annotation" : "Max execution time rate group" + }, + { + "name" : "Ref.SG3.Info", + "type" : { + "name" : "Ref.SignalInfo", + "kind" : "qualifiedIdentifier" + }, + "id" : 8965, + "telemetryUpdate" : "always", + "annotation" : "Composite field of signal information, containing histories, pairs etc" + }, + { + "name" : "Ref.typeDemo.ChoicePairCh", + "type" : { + "name" : "Ref.ChoicePair", + "kind" : "qualifiedIdentifier" + }, + "id" : 4355, + "telemetryUpdate" : "always", + "annotation" : "Multiple choice channel via Structure" + }, + { + "name" : "Ref.dpMgr.NumDataProducts", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 3842, + "telemetryUpdate" : "on change", + "annotation" : "Number of data products handled" + }, + { + "name" : "Ref.SG2.History", + "type" : { + "name" : "Ref.SignalSet", + "kind" : "qualifiedIdentifier" + }, + "id" : 8707, + "telemetryUpdate" : "always", + "annotation" : "Last 10 Y values of the signal" + }, + { + "name" : "Ref.dpBufferManager.EmptyBuffs", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 19460, + "telemetryUpdate" : "on change", + "annotation" : "The number of empty buffers returned", + "limits" : { + "high" : { + "red" : 1 + } + } + }, + { + "name" : "Ref.systemResources.CPU_06", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "id" : 19211, + "telemetryUpdate" : "always", + "format" : "{.2f} percent", + "annotation" : "System's CPU Percentage" + }, + { + "name" : "Ref.SG5.Output", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "id" : 9473, + "telemetryUpdate" : "always", + "format" : "{.4f}", + "annotation" : "Single Y value of the output" + }, + { + "name" : "Ref.typeDemo.FloatSet", + "type" : { + "name" : "Ref.FloatSet", + "kind" : "qualifiedIdentifier" + }, + "id" : 4360, + "telemetryUpdate" : "always", + "annotation" : "Float set output channel" + }, + { + "name" : "Ref.rateGroup3Comp.RgCycleSlips", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 1025, + "telemetryUpdate" : "on change", + "annotation" : "Cycle slips for rate group" + }, + { + "name" : "Ref.version.LibraryVersion01", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 40 + }, + "id" : 19724, + "telemetryUpdate" : "always", + "annotation" : "Library Versions" + }, + { + "name" : "Ref.cmdSeq.CS_Errors", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 1538, + "telemetryUpdate" : "always", + "annotation" : "The number of errors that have occurred" + }, + { + "name" : "Ref.SG4.PairHistory", + "type" : { + "name" : "Ref.SignalPairSet", + "kind" : "qualifiedIdentifier" + }, + "id" : 9220, + "telemetryUpdate" : "always", + "annotation" : "Last 10 (time, value) pairs of the signal" + }, + { + "name" : "Ref.version.FrameworkVersion", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 40 + }, + "id" : 19712, + "telemetryUpdate" : "always", + "annotation" : "Software framework version" + }, + { + "name" : "Ref.SG1.Type", + "type" : { + "name" : "Ref.SignalType", + "kind" : "qualifiedIdentifier" + }, + "id" : 8448, + "telemetryUpdate" : "always", + "annotation" : "Type of the output signal: SINE, TRIANGLE, etc." + }, + { + "name" : "Ref.cmdSeq.CS_LoadCommands", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 1536, + "telemetryUpdate" : "always", + "annotation" : "The number of Load commands executed" + }, + { + "name" : "Ref.SG1.Output", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "id" : 8449, + "telemetryUpdate" : "always", + "format" : "{.4f}", + "annotation" : "Single Y value of the output" + }, + { + "name" : "Ref.sendBuffComp.SendState", + "type" : { + "name" : "Ref.SendBuff.ActiveState", + "kind" : "qualifiedIdentifier" + }, + "id" : 9732, + "telemetryUpdate" : "always", + "annotation" : "Readback of Parameter4" + }, + { + "name" : "Ref.dpCat.CatalogDps", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 3584, + "telemetryUpdate" : "always", + "annotation" : "Number of data products in catalog" + }, + { + "name" : "Ref.SG4.History", + "type" : { + "name" : "Ref.SignalSet", + "kind" : "qualifiedIdentifier" + }, + "id" : 9219, + "telemetryUpdate" : "always", + "annotation" : "Last 10 Y values of the signal" + }, + { + "name" : "Ref.dpBufferManager.TotalBuffs", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 19456, + "telemetryUpdate" : "on change", + "annotation" : "The total buffers allocated" + }, + { + "name" : "Ref.SG3.PairOutput", + "type" : { + "name" : "Ref.SignalPair", + "kind" : "qualifiedIdentifier" + }, + "id" : 8962, + "telemetryUpdate" : "always", + "annotation" : "Single (time, value) pair of the signal" + }, + { + "name" : "Ref.fileUplink.PacketsReceived", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 2305, + "telemetryUpdate" : "always", + "annotation" : "The total number of packets received" + }, + { + "name" : "Ref.version.LibraryVersion02", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 40 + }, + "id" : 19725, + "telemetryUpdate" : "always" + }, + { + "name" : "Ref.systemResources.CPU_15", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "id" : 19220, + "telemetryUpdate" : "always", + "format" : "{.2f} percent", + "annotation" : "System's CPU Percentage" + }, + { + "name" : "Ref.recvBuffComp.Parameter1", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 18179, + "telemetryUpdate" : "on change", + "annotation" : "Readback of Parameter1" + }, + { + "name" : "Ref.fileUplinkBufferManager.TotalBuffs", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 17408, + "telemetryUpdate" : "on change", + "annotation" : "The total buffers allocated" + }, + { + "name" : "Ref.dpCat.DpsSent", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 3585, + "telemetryUpdate" : "always", + "annotation" : "Number of data products sent" + }, + { + "name" : "Ref.SG4.DpRecords", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 9223, + "telemetryUpdate" : "always", + "annotation" : "DP records written" + }, + { + "name" : "Ref.version.CustomVersion08", + "type" : { + "name" : "Svc.CustomVersionDb", + "kind" : "qualifiedIdentifier" + }, + "id" : 19721, + "telemetryUpdate" : "always" + }, + { + "name" : "Ref.dpWriter.NumSuccessfulWrites", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 4098, + "telemetryUpdate" : "on change", + "annotation" : "The number of successful writes" + }, + { + "name" : "Ref.SG2.DpBytes", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 8710, + "telemetryUpdate" : "always", + "annotation" : "DP bytes written" + }, + { + "name" : "Ref.cmdDisp.CommandsDispatched", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 1280, + "telemetryUpdate" : "on change", + "annotation" : "Number of commands dispatched" + }, + { + "name" : "Ref.typeDemo.ChoiceSlurryCh", + "type" : { + "name" : "Ref.ChoiceSlurry", + "kind" : "qualifiedIdentifier" + }, + "id" : 4356, + "telemetryUpdate" : "always", + "annotation" : "Multiple choice channel via Complex Structure" + }, + { + "name" : "Ref.systemResources.CPU_00", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "id" : 19205, + "telemetryUpdate" : "always", + "format" : "{.2f} percent", + "annotation" : "System's CPU Percentage" + }, + { + "name" : "Ref.systemResources.CPU_02", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "id" : 19207, + "telemetryUpdate" : "always", + "format" : "{.2f} percent", + "annotation" : "System's CPU Percentage" + }, + { + "name" : "Ref.typeDemo.Float1Ch", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "id" : 4357, + "telemetryUpdate" : "always", + "annotation" : "Float output channel 1" + }, + { + "name" : "Ref.sendBuffComp.PacketsSent", + "type" : { + "name" : "U64", + "kind" : "integer", + "size" : 64, + "signed" : false + }, + "id" : 9728, + "telemetryUpdate" : "always", + "annotation" : "Number of packets sent" + }, + { + "name" : "Ref.dpBufferManager.CurrBuffs", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 19457, + "telemetryUpdate" : "on change", + "annotation" : "The current number of allocated buffers" + }, + { + "name" : "Ref.systemResources.CPU_07", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "id" : 19212, + "telemetryUpdate" : "always", + "format" : "{.2f} percent", + "annotation" : "System's CPU Percentage" + }, + { + "name" : "Ref.systemResources.MEMORY_TOTAL", + "type" : { + "name" : "U64", + "kind" : "integer", + "size" : 64, + "signed" : false + }, + "id" : 19200, + "telemetryUpdate" : "always", + "format" : "{} KB", + "annotation" : "Total system memory in KB" + }, + { + "name" : "Ref.version.CustomVersion05", + "type" : { + "name" : "Svc.CustomVersionDb", + "kind" : "qualifiedIdentifier" + }, + "id" : 19718, + "telemetryUpdate" : "always" + }, + { + "name" : "Ref.version.CustomVersion07", + "type" : { + "name" : "Svc.CustomVersionDb", + "kind" : "qualifiedIdentifier" + }, + "id" : 19720, + "telemetryUpdate" : "always" + }, + { + "name" : "Ref.version.LibraryVersion10", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 40 + }, + "id" : 19733, + "telemetryUpdate" : "always" + }, + { + "name" : "Ref.SG2.PairOutput", + "type" : { + "name" : "Ref.SignalPair", + "kind" : "qualifiedIdentifier" + }, + "id" : 8706, + "telemetryUpdate" : "always", + "annotation" : "Single (time, value) pair of the signal" + }, + { + "name" : "Ref.dpMgr.NumBytes", + "type" : { + "name" : "U64", + "kind" : "integer", + "size" : 64, + "signed" : false + }, + "id" : 3843, + "telemetryUpdate" : "on change", + "annotation" : "Number of bytes handled" + }, + { + "name" : "Ref.fileUplinkBufferManager.CurrBuffs", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 17409, + "telemetryUpdate" : "on change", + "annotation" : "The current number of allocated buffers" + }, + { + "name" : "Ref.cmdSeq.CS_CancelCommands", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 1537, + "telemetryUpdate" : "always", + "annotation" : "The number of Cancel commands executed" + }, + { + "name" : "Ref.SG5.PairOutput", + "type" : { + "name" : "Ref.SignalPair", + "kind" : "qualifiedIdentifier" + }, + "id" : 9474, + "telemetryUpdate" : "always", + "annotation" : "Single (time, value) pair of the signal" + }, + { + "name" : "Ref.version.LibraryVersion07", + "type" : { + "name" : "string", + "kind" : "string", + "size" : 40 + }, + "id" : 19730, + "telemetryUpdate" : "always" + }, + { + "name" : "Ref.SG1.Info", + "type" : { + "name" : "Ref.SignalInfo", + "kind" : "qualifiedIdentifier" + }, + "id" : 8453, + "telemetryUpdate" : "always", + "annotation" : "Composite field of signal information, containing histories, pairs etc" + }, + { + "name" : "Ref.SG3.Output", + "type" : { + "name" : "F32", + "kind" : "float", + "size" : 32 + }, + "id" : 8961, + "telemetryUpdate" : "always", + "format" : "{.4f}", + "annotation" : "Single Y value of the output" + }, + { + "name" : "Ref.SG5.DpRecords", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 9479, + "telemetryUpdate" : "always", + "annotation" : "DP records written" + }, + { + "name" : "Ref.SG3.DpBytes", + "type" : { + "name" : "U32", + "kind" : "integer", + "size" : 32, + "signed" : false + }, + "id" : 8966, + "telemetryUpdate" : "always", + "annotation" : "DP bytes written" + } + ], + "records" : [ + { + "name" : "Ref.SG3.DataRecord", + "type" : { + "name" : "Ref.SignalInfo", + "kind" : "qualifiedIdentifier" + }, + "array" : false, + "id" : 8960, + "annotation" : "Signal generation data product record" + }, + { + "name" : "Ref.SG4.DataRecord", + "type" : { + "name" : "Ref.SignalInfo", + "kind" : "qualifiedIdentifier" + }, + "array" : false, + "id" : 9216, + "annotation" : "Signal generation data product record" + }, + { + "name" : "Ref.SG5.DataRecord", + "type" : { + "name" : "Ref.SignalInfo", + "kind" : "qualifiedIdentifier" + }, + "array" : false, + "id" : 9472, + "annotation" : "Signal generation data product record" + }, + { + "name" : "Ref.SG2.DataRecord", + "type" : { + "name" : "Ref.SignalInfo", + "kind" : "qualifiedIdentifier" + }, + "array" : false, + "id" : 8704, + "annotation" : "Signal generation data product record" + }, + { + "name" : "Ref.SG1.DataRecord", + "type" : { + "name" : "Ref.SignalInfo", + "kind" : "qualifiedIdentifier" + }, + "array" : false, + "id" : 8448, + "annotation" : "Signal generation data product record" + } + ], + "containers" : [ + { + "name" : "Ref.SG3.DataContainer", + "id" : 8960, + "defaultPriority" : 10, + "annotation" : "Data product container" + }, + { + "name" : "Ref.SG4.DataContainer", + "id" : 9216, + "defaultPriority" : 10, + "annotation" : "Data product container" + }, + { + "name" : "Ref.SG5.DataContainer", + "id" : 9472, + "defaultPriority" : 10, + "annotation" : "Data product container" + }, + { + "name" : "Ref.SG2.DataContainer", + "id" : 8704, + "defaultPriority" : 10, + "annotation" : "Data product container" + }, + { + "name" : "Ref.SG1.DataContainer", + "id" : 8448, + "defaultPriority" : 10, + "annotation" : "Data product container" + } + ] +} diff --git a/test/fprime_gds/common/sequence/test_basic_seq.py b/test/fprime_gds/common/sequence/test_basic_seq.py new file mode 100644 index 00000000..a4a9bba9 --- /dev/null +++ b/test/fprime_gds/common/sequence/test_basic_seq.py @@ -0,0 +1,9 @@ +import ast +from pathlib import Path +from fprime_gds.common.sequence.compiler import compile +def test_basic_seq(): + seq = \ +""" +Ref.fileManager.RemoveFile(Ref.MyEnum.TEST, arg=Ref.MyType(asdf)) +""" + assert compile(ast.parse(seq), Path(__file__).parent / "RefTopologyDictionary.json") == 0 From f13303fc9e2a696a6ad8f2fa480a0bf762e001dd Mon Sep 17 00:00:00 2001 From: Zimri Leisher Date: Tue, 29 Oct 2024 17:16:35 -0500 Subject: [PATCH 05/14] much more work on parsing cmd args and type ctor args --- src/fprime_gds/common/sequence/compiler.py | 322 ++++++++++++------ .../common/sequence/test_basic_seq.py | 16 +- 2 files changed, 227 insertions(+), 111 deletions(-) diff --git a/src/fprime_gds/common/sequence/compiler.py b/src/fprime_gds/common/sequence/compiler.py index 98187811..601f88af 100644 --- a/src/fprime_gds/common/sequence/compiler.py +++ b/src/fprime_gds/common/sequence/compiler.py @@ -7,10 +7,13 @@ import sys import logging +from fprime_gds.common.templates.ch_template import ChTemplate +from fprime_gds.executables.data_product_writer import IntegerType + logging.basicConfig() logger = logging.getLogger(__file__) -from fprime_gds.common.data_types.cmd_data import CmdData from fprime_gds.common.loaders.cmd_json_loader import CmdJsonLoader +from fprime_gds.common.loaders.ch_json_loader import ChJsonLoader from fprime_gds.common.templates.cmd_template import CmdTemplate from fprime.common.models.serialize.serializable_type import SerializableType from fprime.common.models.serialize.array_type import ArrayType @@ -28,31 +31,74 @@ ) from fprime.common.models.serialize.bool_type import BoolType from fprime.common.models.serialize.string_type import StringType -from fprime.common.models.serialize.enum_type import EnumType -from fprime.common.models.serialize.type_base import BaseType, ValueType +from fprime.common.models.serialize.enum_type import EnumType, REPRESENTATION_TYPE_MAP +from fprime.common.models.serialize.type_base import BaseType, ValueType, DictionaryType + +# name, desc, type +FpyArgTemplate = tuple[str, str, type[ValueType]] + + +# just for pretty-printing +def value_type_repr(self: ValueType): + return str(self.val) + + +ValueType.__repr__ = value_type_repr + + +@dataclass +class FpyType(ast.AST): + namespace: str + name: str + fprime_type: type[ValueType] + + +# this just helps the ast find what fields to pretty-print +FpyType._fields = ["namespace", "name", "fprime_type"] @dataclass -class CmdCall: - node: ast.Call - cmd_name: str +class FpyEnumConstant(ast.AST): + enum_type: type[EnumType] + repr_type: type[ValueType] + value: int + + +FpyEnumConstant._fields = ["enum_type", "repr_type", "value"] + + +@dataclass +class FpyCmd(ast.AST): + namespace: str + name: str cmd_template: CmdTemplate - args: list + + +FpyCmd._fields = ["namespace", "name", "fprime_cmd"] @dataclass -class TypeInstantiate: - node: ast.Call - type_name: str - type_template: BaseType - args: list +class FpyCh(ast.AST): + namespace: str + name: str + ch_template: ChTemplate -class TransformToFPrime(ast.NodeTransformer): +FpyCh._fields = ["namespace", "name", "fprime_ch"] - def __init__(self, cmd_name_dict: dict[str, CmdTemplate], type_name_dict: dict[str, type[ValueType]]) -> None: + +class ResolveNames(ast.NodeTransformer): + + def __init__( + self, + cmd_name_dict: dict[str, CmdTemplate], + type_name_dict: dict[str, type[ValueType]], + ch_name_dict: dict[str, ChTemplate], + ) -> None: super().__init__() self.cmd_name_dict = cmd_name_dict + self.type_name_dict = type_name_dict + self.ch_name_dict = ch_name_dict def visit_Module(self, node: ast.Module): for statement in node.body: @@ -66,6 +112,13 @@ def visit_Module(self, node: ast.Module): def visit_Attribute(self, node: ast.Attribute): """resolve the attribute into either a CmdTemplate instance or a BaseType type""" + # an attribute node looks like x.y + # attr.value = x + # attr.attr = y + # however, x in this case could be another attribute (e.g. z.w) + # we want to take this whole attr chain (z.w.y) and get everything except + # the last .y, so that we can know the namespace of this attribute + namespace_node = node.value # concatenate namespaces namespace = [] @@ -78,25 +131,83 @@ def visit_Attribute(self, node: ast.Attribute): namespace_str = ".".join(namespace) + fq_name = node.attr + if namespace_str != "": + fq_name = namespace_str + "." + fq_name + + # now look up this namespace string. resolve enum consts, then types, then telemetry, then commands + resolved_fprime_enum_type = self.type_name_dict.get(namespace_str, None) + if resolved_fprime_enum_type is not None: + if not issubclass(resolved_fprime_enum_type, EnumType): + node.error = "Invalid syntax" + return node + + # this is a python integer + enum_value_py = resolved_fprime_enum_type.ENUM_DICT[node.attr] + # this is a string + enum_repr_type_name = resolved_fprime_enum_type.REP_TYPE + # this is a subclass of ValueType + enum_repr_type = REPRESENTATION_TYPE_MAP.get(enum_repr_type_name, None) + assert enum_repr_type is not None + + return FpyEnumConstant( + resolved_fprime_enum_type, enum_repr_type, enum_value_py + ) + + resolved_fprime_type = self.type_name_dict.get(fq_name, None) + if resolved_fprime_type is not None: + return FpyType(namespace_str, node.attr, resolved_fprime_type) + + resolved_fprime_ch = self.ch_name_dict.get(fq_name, None) + if resolved_fprime_ch is not None: + return FpyCh(namespace_str, node.attr, resolved_fprime_ch) + + resolved_fprime_cmd = self.cmd_name_dict.get(fq_name, None) + if resolved_fprime_cmd is not None: + return FpyCmd(namespace_str, node.attr, resolved_fprime_cmd) + + node.error = "Unknown identifier " + str(fq_name) + return node + + +class ParseCalls(ast.NodeTransformer): + + def __init__(self, type_name_dict: dict[str, type[ValueType]]): + self.type_name_dict = type_name_dict def visit_Call(self, node: ast.Call): - cmd_name = self.get_name(node.func) - if cmd_name not in self.cmd_name_dict: - node.error = "Unknown command name " + str(cmd_name) + # only valid calls right now are commands and dict type instantiations + if not isinstance(node.func, (FpyCmd, FpyType)): + node.error = "Invalid syntax" return node - cmd_template: CmdTemplate = self.cmd_name_dict[cmd_name] - cmd_args_map = self.map_cmd_args(cmd_template, node) - for fprime_arg, fpy_expr in cmd_args_map: - fprime_name, fprime_desc, fprime_type = fprime_arg - self.fpy_node_to_fprime_type(cmd_template, fprime_name, fprime_type, fpy_expr) + # okay, now map the args to the nodes + + if isinstance(node.func, FpyType) and not issubclass(node.func.fprime_type, DictionaryType): + # unknown how to construct this type + + if isinstance(node.func, FpyCmd): + + mapped_args = self.map_cmd_args(node.func.cmd_template, node) + + for cmd_template_arg, ast_node in mapped_args.items(): + # get the type name of the arg from the fprime type + fprime_type_name = [ + k for k, v in self.type_name_dict if v == cmd_template_arg[2] + ] + # the type should be in the dict and there should only be one of it + assert len(fprime_type_name) == 1 + fprime_type_name = fprime_type_name[0] + fprime_value = self.cmd_template_arg_and_node_to_fprime_value( + node.func.cmd_template, cmd_template_arg, fprime_type_name, ast_node + ) def map_cmd_args( self, template: CmdTemplate, node: ast.Call - ) -> dict[tuple[str, str, ValueType], ast.Expression]: + ) -> dict[FpyArgTemplate, ast.AST]: """ - Maps arguments from a command template to an fpy expression by position and name. Does not perform type checking. + Maps arguments from a command template to an ast node by position and name. Does not perform type checking. """ mapping = dict() @@ -129,104 +240,94 @@ def map_cmd_args( return mapping - def fpy_node_to_fprime_type( + def cmd_template_arg_and_node_to_fprime_value( self, cmd_template: CmdTemplate, - arg_name: str, - fprime_type_name: str, - fprime_type: type, - fpy_node: ast.Expression, + cmd_arg_template: FpyArgTemplate, + cmd_template_arg_type_name: str, + ast_node: ast.AST, ) -> ValueType: """ Ensure the fpy node can be turned into the desired FPrime type """ - def error(node, msg): - node.error = "In command " + str(cmd_template.get_comp_name()) + "." + str(cmd_template.get_name()) + " for argument " + str(arg_name) + ": " + str(msg) + arg_name = cmd_arg_template[0] + fprime_type = cmd_arg_template[2] + fprime_type_instance = fprime_type() + def error(node, msg): + node.error = ( + "In command " + + str(cmd_template.get_comp_name()) + + "." + + str(cmd_template.get_name()) + + ", argument " + + str(arg_name) + + ": " + + msg + ) - fprime_type_instance = fprime_type() if issubclass(fprime_type, BoolType): - if not isinstance(fpy_node, ast.Constant) or not isinstance( - fpy_node.value, bool - ): - error(fpy_node, "Expected a boolean literal, found " + str(type(fpy_node.value))) + if not isinstance(ast_node, ast.Constant): + error(ast_node, "Invalid syntax") return fprime_type_instance - fprime_type_instance._val = fpy_node.value + if not isinstance(ast_node.value, bool): + error( + ast_node, + "Expected a boolean literal, found " + + str(type(ast_node.value)), + ) + return fprime_type_instance + fprime_type_instance._val = ast_node.value elif issubclass(fprime_type, (F64Type, F32Type)): - if not isinstance(fpy_node, ast.Constant) or not isinstance( - fpy_node.value, float - ): - error(fpy_node, "Expected a floating point literal, found " + str(type(fpy_node.value))) + if not isinstance(ast_node, ast.Constant): + error(ast_node, "Invalid syntax") return fprime_type_instance - fprime_type_instance._val = fpy_node.value + if not isinstance(ast_node.value, float): + error( + ast_node, + "Expected a floating point literal, found " + + str(type(ast_node.value)), + ) + return fprime_type_instance + fprime_type_instance._val = ast_node.value elif issubclass( fprime_type, (I64Type, U64Type, I32Type, U32Type, I16Type, U16Type, I8Type, U8Type), ): - if not isinstance(fpy_node, ast.Constant) or not isinstance( - fpy_node.value, int - ): - error(fpy_node, "Expected an integer literal, found " + str(type(fpy_node.value))) + if not isinstance(ast_node, ast.Constant): + error(ast_node, "Invalid syntax") return fprime_type_instance - fprime_type_instance._val = fpy_node.value - elif issubclass(fprime_type, StringType): - if not isinstance(fpy_node, ast.Constant) or not isinstance( - fpy_node.value, str - ): - error(fpy_node, "Expected a string literal, found " + str(type(fpy_node.value))) - return fprime_type_instance - fprime_type_instance._val = fpy_node.value - elif issubclass(fprime_type, EnumType): - - # all enums follow the form Fprime.Qualified.Type.ENUM_CONST_NAME - if not isinstance(fpy_node, ast.Attribute): - # not an enum literal - error(fpy_node, "Expected an enum literal") + if not isinstance(ast_node.value, float): + error( + ast_node, + "Expected an integer literal, found " + + str(type(ast_node.value)), + ) return fprime_type_instance - - fpy_enum_name = self.get_name(fpy_node.value) # fpy_node.value is the fqn of the enum - if fpy_enum_name is None: - # unable to get the name from this ast - error(fpy_node, "Invalid syntax") + fprime_type_instance._val = ast_node.value + elif issubclass(fprime_type, StringType): + if not isinstance(ast_node, ast.Constant): + error(ast_node, "Invalid syntax") return fprime_type_instance - - resolved_enum_type = self.resolve_type_name(fpy_enum_name) - if resolved_enum_type is None: - # couldn't find this enum in the type dict - error(fpy_node, "Unknown type " + str(fpy_enum_name)) + if not isinstance(ast_node.value, float): + error( + ast_node, + "Expected an integer literal, found " + + str(type(ast_node.value)), + ) return fprime_type_instance - - if resolved_enum_type != fprime_type: - # wrong type - error(fpy_node, "Expected a value from enum " + str(fprime_type.__name__) + " but got one from " + str(resolved_enum_type.__name__)) + fprime_type_instance._val = ast_node.value + elif issubclass(fprime_type, EnumType): + if not isinstance(ast_node, FpyEnumConstant): + error(ast_node, "Invalid syntax") return fprime_type_instance - - fprime_type_instance._val = fpy_node.attr # fpy_node.attr is ENUM_CONST_NAME - + assert fprime_type == ast_node.enum_type + fprime_type_instance._val = ast_node.value elif issubclass(fprime_type, (ArrayType, SerializableType)): + if not isinstance(ast_node, FpyType): - - # all arrays and structs follow the form Fprime.Qualified.Type() - fpy_type_name = self.get_name(fpy_node.value) # fpy_node.value is the fqn of the enum - if fpy_enum_name is None: - # unable to get the name from this ast - fpy_node.error = "Invalid syntax" - return fprime_type_instance - - resolved_enum_type = self.resolve_type_name(fpy_enum_name) - if resolved_enum_type is None: - # couldn't find this enum in the type dict - fpy_node.error = "Unknown type " + str(fpy_enum_name) - return fprime_type_instance - - if resolved_enum_type != fprime_type: - # wrong enum - fpy_node.error = "Expected a value from enum " + str(fprime_type.__name__) + " but got one from " + str(resolved_enum_type.__name__) - return fprime_type_instance - - fprime_type_instance._val = fpy_node.attr def node_to_fprime_type(self, node: ast.Expression, into_type: ValueType) -> bool: """ @@ -234,14 +335,6 @@ def node_to_fprime_type(self, node: ast.Expression, into_type: ValueType) -> boo """ return False - def get_name(self, name: ast.Expression) -> str|None: - - def resolve_cmd_name(self, cmd_name: str) -> CmdTemplate|None: - return self.cmd_name_dict.get(cmd_name, None) - - def resolve_type_name(self, enum_name: str) -> type[ValueType]|None: - return self.type_name_dict.get(enum_name, str) - def process_args(self, input_values): """Process input arguments""" errors = [] @@ -305,11 +398,20 @@ def main(): def compile(node: ast.Module, dictionary: Path): print(ast.dump(node, indent=4)) - cmd_json_dict = CmdJsonLoader(dictionary) - (cmd_id_dict, cmd_name_dict, versions) = cmd_json_dict.construct_dicts(dictionary) - type_name_dict = cmd_json_dict.parsed_types - py_to_fprime_transformer = TransformToFPrime(cmd_name_dict, type_name_dict) - node = py_to_fprime_transformer.visit(node) + + cmd_json_dict_loader = CmdJsonLoader(dictionary) + (cmd_id_dict, cmd_name_dict, versions) = cmd_json_dict_loader.construct_dicts( + dictionary + ) + type_name_dict = cmd_json_dict_loader.parsed_types + ch_json_dict_loader = ChJsonLoader(dictionary) + (ch_id_dict, ch_name_dict, versions) = ch_json_dict_loader.construct_dicts( + dictionary + ) + name_resolver = ResolveNames(cmd_name_dict, type_name_dict, ch_name_dict) + node = name_resolver.visit(node) + + print(ast.dump(node, indent=4)) if not check_for_errors(node): return 1 diff --git a/test/fprime_gds/common/sequence/test_basic_seq.py b/test/fprime_gds/common/sequence/test_basic_seq.py index a4a9bba9..e0700c47 100644 --- a/test/fprime_gds/common/sequence/test_basic_seq.py +++ b/test/fprime_gds/common/sequence/test_basic_seq.py @@ -4,6 +4,20 @@ def test_basic_seq(): seq = \ """ -Ref.fileManager.RemoveFile(Ref.MyEnum.TEST, arg=Ref.MyType(asdf)) +Ref.fileManager.RemoveFile("test", False) """ assert compile(ast.parse(seq), Path(__file__).parent / "RefTopologyDictionary.json") == 0 + +def test_enum_arg(): + seq = \ +""" +Ref.typeDemo.CHOICE(Ref.Choice.ONE) +""" + assert compile(ast.parse(seq), Path(__file__).parent / "RefTopologyDictionary.json") == 0 + +def test_struct_arg(): + seq = \ +""" +Ref.typeDemo.CHOICE_PAIR(Ref.ChoicePair(Ref.Choice.ONE, Ref.Choice.TWO)) +""" + assert compile(ast.parse(seq), Path(__file__).parent / "RefTopologyDictionary.json") == 0 \ No newline at end of file From 4f00fa2cf2309760af32bcf7613b15e578be157a Mon Sep 17 00:00:00 2001 From: Zimri Leisher Date: Thu, 31 Oct 2024 10:21:35 -0500 Subject: [PATCH 06/14] Basic syntax and type checking working --- src/fprime_gds/common/sequence/compiler.py | 245 ++++++++++-------- .../common/sequence/test_basic_seq.py | 57 ++++ 2 files changed, 188 insertions(+), 114 deletions(-) diff --git a/src/fprime_gds/common/sequence/compiler.py b/src/fprime_gds/common/sequence/compiler.py index 601f88af..1fab7599 100644 --- a/src/fprime_gds/common/sequence/compiler.py +++ b/src/fprime_gds/common/sequence/compiler.py @@ -74,7 +74,7 @@ class FpyCmd(ast.AST): cmd_template: CmdTemplate -FpyCmd._fields = ["namespace", "name", "fprime_cmd"] +FpyCmd._fields = ["namespace", "name", "cmd_template"] @dataclass @@ -84,7 +84,7 @@ class FpyCh(ast.AST): ch_template: ChTemplate -FpyCh._fields = ["namespace", "name", "fprime_ch"] +FpyCh._fields = ["namespace", "name", "ch_template"] class ResolveNames(ast.NodeTransformer): @@ -142,8 +142,13 @@ def visit_Attribute(self, node: ast.Attribute): node.error = "Invalid syntax" return node + enum_const_name = node.attr + if enum_const_name not in resolved_fprime_enum_type.ENUM_DICT: + node.error = "Unknown enum constant '" + str(enum_const_name) + "'" + return node + # this is a python integer - enum_value_py = resolved_fprime_enum_type.ENUM_DICT[node.attr] + enum_value_py = resolved_fprime_enum_type.ENUM_DICT[enum_const_name] # this is a string enum_repr_type_name = resolved_fprime_enum_type.REP_TYPE # this is a subclass of ValueType @@ -170,7 +175,7 @@ def visit_Attribute(self, node: ast.Attribute): return node -class ParseCalls(ast.NodeTransformer): +class CheckCalls(ast.NodeTransformer): def __init__(self, type_name_dict: dict[str, type[ValueType]]): self.type_name_dict = type_name_dict @@ -182,37 +187,64 @@ def visit_Call(self, node: ast.Call): node.error = "Invalid syntax" return node + # get the list of args + args: list[FpyArgTemplate] = [] + if isinstance(node.func, FpyCmd): + args = node.func.cmd_template.arguments + else: + # it's an FpyType + if not self.check_has_ctor(node.func.fprime_type): + node.error = ( + "Type " + + str(node.func.fprime_type.__name__) + + " cannot be directly constructed" + ) + return node + args = self.get_args_list_from_fprime_type_ctor(node.func.fprime_type) + # okay, now map the args to the nodes - - if isinstance(node.func, FpyType) and not issubclass(node.func.fprime_type, DictionaryType): - # unknown how to construct this type + mapped_args = self.map_args(args, node) - if isinstance(node.func, FpyCmd): + # okay, now type check the args + for arg_template, arg_node in mapped_args.items(): + # this func will add an error if it finds one + if not self.check_node_converts_to_fprime_type(arg_node, arg_template[2]): + # don't traverse the tree if we fail + return node - mapped_args = self.map_cmd_args(node.func.cmd_template, node) - - for cmd_template_arg, ast_node in mapped_args.items(): - # get the type name of the arg from the fprime type - fprime_type_name = [ - k for k, v in self.type_name_dict if v == cmd_template_arg[2] - ] - # the type should be in the dict and there should only be one of it - assert len(fprime_type_name) == 1 - fprime_type_name = fprime_type_name[0] - fprime_value = self.cmd_template_arg_and_node_to_fprime_value( - node.func.cmd_template, cmd_template_arg, fprime_type_name, ast_node - ) + return super().generic_visit(node) + + def check_has_ctor(self, type: type[ValueType]) -> bool: + # only serializables (i.e. structs) and arrays can be directly constructed in fpy syntax + return issubclass(type, (SerializableType, ArrayType)) - def map_cmd_args( - self, template: CmdTemplate, node: ast.Call + def get_args_list_from_fprime_type_ctor( + self, type: type[ValueType] + ) -> list[FpyArgTemplate]: + args = [] + if issubclass(type, SerializableType): + for member in type.MEMBER_LIST: + (member_name, member_type, member_format_str, member_desc) = member + args.append(FpyArgTemplate((member_name, member_desc, member_type))) + elif issubclass(type, ArrayType): + for i in range(type.LENGTH): + args.append(FpyArgTemplate(("e" + str(i), "", type.MEMBER_TYPE))) + else: + raise RuntimeError( + "FPrime type " + str(type.__name__) + " has no constructor" + ) + return args + + def map_args( + self, args: list[FpyArgTemplate], node: ast.Call ) -> dict[FpyArgTemplate, ast.AST]: """ - Maps arguments from a command template to an ast node by position and name. Does not perform type checking. + Maps arguments from a list of arg templates to an ast node by position and name. Does not perform type checking. """ mapping = dict() - for idx, arg_template in enumerate(template.arguments): + for idx, arg_template in enumerate(args): arg_name, arg_desc, arg_type = arg_template arg_node = None @@ -223,7 +255,7 @@ def map_cmd_args( else: # if we're in kwargs # find a matching node from keywords - arg_node = [n for n in node.keywords if n.arg == arg_name] + arg_node = [n.value for n in node.keywords if n.arg == arg_name] if len(arg_node) != 1: if len(arg_node) == 0: # unable to find a matching kwarg for this arg template @@ -240,115 +272,87 @@ def map_cmd_args( return mapping - def cmd_template_arg_and_node_to_fprime_value( - self, - cmd_template: CmdTemplate, - cmd_arg_template: FpyArgTemplate, - cmd_template_arg_type_name: str, - ast_node: ast.AST, - ) -> ValueType: + def check_node_converts_to_fprime_type( + self, node: ast.AST, fprime_type: type[ValueType] + ) -> bool: """ - Ensure the fpy node can be turned into the desired FPrime type + Ensure the ast node can be turned into the desired FPrime type """ - arg_name = cmd_arg_template[0] - fprime_type = cmd_arg_template[2] - fprime_type_instance = fprime_type() - def error(node, msg): - node.error = ( - "In command " - + str(cmd_template.get_comp_name()) - + "." - + str(cmd_template.get_name()) - + ", argument " - + str(arg_name) - + ": " - + msg - ) + node.error = msg if issubclass(fprime_type, BoolType): - if not isinstance(ast_node, ast.Constant): - error(ast_node, "Invalid syntax") - return fprime_type_instance - if not isinstance(ast_node.value, bool): + if not isinstance(node, ast.Constant): + error(node, "Invalid syntax") + return False + if not isinstance(node.value, bool): error( - ast_node, - "Expected a boolean literal, found " - + str(type(ast_node.value)), + node, + "Expected a boolean literal, found " + str(type(node.value)), ) - return fprime_type_instance - fprime_type_instance._val = ast_node.value + return False elif issubclass(fprime_type, (F64Type, F32Type)): - if not isinstance(ast_node, ast.Constant): - error(ast_node, "Invalid syntax") - return fprime_type_instance - if not isinstance(ast_node.value, float): + if not isinstance(node, ast.Constant): + error(node, "Invalid syntax") + return False + if not isinstance(node.value, float): error( - ast_node, - "Expected a floating point literal, found " - + str(type(ast_node.value)), + node, + "Expected a floating point literal, found " + str(type(node.value)), ) - return fprime_type_instance - fprime_type_instance._val = ast_node.value + return False elif issubclass( fprime_type, (I64Type, U64Type, I32Type, U32Type, I16Type, U16Type, I8Type, U8Type), ): - if not isinstance(ast_node, ast.Constant): - error(ast_node, "Invalid syntax") - return fprime_type_instance - if not isinstance(ast_node.value, float): + if not isinstance(node, ast.Constant): + error(node, "Invalid syntax") + return False + if not isinstance(node.value, float): error( - ast_node, - "Expected an integer literal, found " - + str(type(ast_node.value)), + node, + "Expected an integer literal, found " + str(type(node.value)), ) - return fprime_type_instance - fprime_type_instance._val = ast_node.value + return False elif issubclass(fprime_type, StringType): - if not isinstance(ast_node, ast.Constant): - error(ast_node, "Invalid syntax") - return fprime_type_instance - if not isinstance(ast_node.value, float): + if not isinstance(node, ast.Constant): + error(node, "Invalid syntax") + return False + if not isinstance(node.value, str): error( - ast_node, - "Expected an integer literal, found " - + str(type(ast_node.value)), + node, + "Expected a string literal, found " + str(type(node.value)), ) - return fprime_type_instance - fprime_type_instance._val = ast_node.value + return False elif issubclass(fprime_type, EnumType): - if not isinstance(ast_node, FpyEnumConstant): - error(ast_node, "Invalid syntax") - return fprime_type_instance - assert fprime_type == ast_node.enum_type - fprime_type_instance._val = ast_node.value + if not isinstance(node, FpyEnumConstant): + if isinstance(node, ast.Constant): + error(node, "Expecting an enum constant, found '" + str(type(node.value).__name__) + "'") + else: + error(node, "Invalid syntax") + return False + assert fprime_type == node.enum_type elif issubclass(fprime_type, (ArrayType, SerializableType)): + if not isinstance(node, ast.Call): + # must be a ctor call + error(node, "Invalid syntax") + return False + if not isinstance(node.func, FpyType): + # must be a ctor call + error(node, "Invalid syntax") + return False + if fprime_type != node.func.fprime_type: + error( + node, + "Expected " + + str(fprime_type.__name__) + + " but found " + + str(node.func.fprime_type.__name__), + ) + return False - if not isinstance(ast_node, FpyType): - - - def node_to_fprime_type(self, node: ast.Expression, into_type: ValueType) -> bool: - """ - Turn the node into an instance of the desired FPrime type - """ - return False - - def process_args(self, input_values): - """Process input arguments""" - errors = [] - args = [] - for val, arg_tuple in zip(input_values, self.template.arguments): - try: - _, _, arg_type = arg_tuple - arg_value = arg_type() - self.convert_arg_value(val, arg_value) - args.append(arg_value) - errors.append("") - except Exception as exc: - errors.append(str(exc)) - return args, errors + return True def check_for_errors(node: ast.Module): @@ -364,9 +368,13 @@ def visit(n): if isinstance(value, list): for item in value: if isinstance(item, ast.AST): - return visit(item) + ret = visit(item) + if not ret: + return False elif isinstance(value, ast.AST): - return visit(value) + ret = visit(value) + if not ret: + return False return True return visit(node) @@ -408,9 +416,18 @@ def compile(node: ast.Module, dictionary: Path): (ch_id_dict, ch_name_dict, versions) = ch_json_dict_loader.construct_dicts( dictionary ) + print("RESOLVING NAMES") name_resolver = ResolveNames(cmd_name_dict, type_name_dict, ch_name_dict) node = name_resolver.visit(node) + print(ast.dump(node, indent=4)) + if not check_for_errors(node): + return 1 + + print("CHECKING CALLS") + call_checker = CheckCalls(type_name_dict) + node = call_checker.visit(node) + print(ast.dump(node, indent=4)) if not check_for_errors(node): return 1 diff --git a/test/fprime_gds/common/sequence/test_basic_seq.py b/test/fprime_gds/common/sequence/test_basic_seq.py index e0700c47..676d0fab 100644 --- a/test/fprime_gds/common/sequence/test_basic_seq.py +++ b/test/fprime_gds/common/sequence/test_basic_seq.py @@ -4,10 +4,32 @@ def test_basic_seq(): seq = \ """ +Ref.fileManager.RemoveFile("test", True) Ref.fileManager.RemoveFile("test", False) """ assert compile(ast.parse(seq), Path(__file__).parent / "RefTopologyDictionary.json") == 0 +def test_basic_seq_kwargs(): + seq = \ +""" +Ref.fileManager.RemoveFile("test", ignoreErrors=True) +""" + assert compile(ast.parse(seq), Path(__file__).parent / "RefTopologyDictionary.json") == 0 + +def test_basic_seq_missing_arg(): + seq = \ +""" +Ref.fileManager.RemoveFile("test") +""" + assert compile(ast.parse(seq), Path(__file__).parent / "RefTopologyDictionary.json") == 1 + +def test_invalid_seq(): + seq = \ +""" +"test" +""" + assert compile(ast.parse(seq), Path(__file__).parent / "RefTopologyDictionary.json") == 1 + def test_enum_arg(): seq = \ """ @@ -19,5 +41,40 @@ def test_struct_arg(): seq = \ """ Ref.typeDemo.CHOICE_PAIR(Ref.ChoicePair(Ref.Choice.ONE, Ref.Choice.TWO)) +""" + assert compile(ast.parse(seq), Path(__file__).parent / "RefTopologyDictionary.json") == 0 + +def test_struct_arg_wrong_type(): + seq = \ +""" +Ref.typeDemo.CHOICE_PAIR(Ref.ChoicePair(1, Ref.Choice.TWO)) +""" + assert compile(ast.parse(seq), Path(__file__).parent / "RefTopologyDictionary.json") == 1 + +def test_unknown_enum_const(): + seq = \ +""" +Ref.typeDemo.CHOICE_PAIR(Ref.ChoicePair(Ref.Choice.FAIL, Ref.Choice.TWO)) +""" + assert compile(ast.parse(seq), Path(__file__).parent / "RefTopologyDictionary.json") == 1 + +def test_array_arg(): + seq = \ +""" +Ref.typeDemo.CHOICES(Ref.ManyChoices(Ref.Choice.TWO, Ref.Choice.RED)) +""" + assert compile(ast.parse(seq), Path(__file__).parent / "RefTopologyDictionary.json") == 0 + +def test_array_kwarg(): + seq = \ +""" +Ref.typeDemo.CHOICES(Ref.ManyChoices(e0=Ref.Choice.TWO, e1=Ref.Choice.RED)) +""" + assert compile(ast.parse(seq), Path(__file__).parent / "RefTopologyDictionary.json") == 0 + +def test_fail_call_cmd(): + seq = \ +""" +Ref.typeDemo.CHOICES(Ref.typeDemo.CHOICES(Ref.ManyChoices(Ref.Choice.TWO, Ref.Choice.RED))) """ assert compile(ast.parse(seq), Path(__file__).parent / "RefTopologyDictionary.json") == 0 \ No newline at end of file From 7ea91449f40dffadccd65580b4175f99026a44f3 Mon Sep 17 00:00:00 2001 From: Zimri Leisher Date: Thu, 31 Oct 2024 12:22:52 -0500 Subject: [PATCH 07/14] Sequence directives for sleep rel and abs --- src/fprime_gds/common/sequence/builtin_ac.py | 8 - src/fprime_gds/common/sequence/compiler.py | 210 +++++++++++------- src/fprime_gds/common/sequence/directive.py | 41 ++++ src/fprime_gds/common/sequence/fpy_type.py | 68 ++++++ .../common/sequence/test_basic_seq.py | 101 ++++++--- 5 files changed, 305 insertions(+), 123 deletions(-) delete mode 100644 src/fprime_gds/common/sequence/builtin_ac.py create mode 100644 src/fprime_gds/common/sequence/directive.py create mode 100644 src/fprime_gds/common/sequence/fpy_type.py diff --git a/src/fprime_gds/common/sequence/builtin_ac.py b/src/fprime_gds/common/sequence/builtin_ac.py deleted file mode 100644 index fb58a52e..00000000 --- a/src/fprime_gds/common/sequence/builtin_ac.py +++ /dev/null @@ -1,8 +0,0 @@ -class SequenceDirective: - def sleep(seconds: int, millis: int): - pass - - def sleep_until(time: str): - pass - -seq = SequenceDirective() \ No newline at end of file diff --git a/src/fprime_gds/common/sequence/compiler.py b/src/fprime_gds/common/sequence/compiler.py index 1fab7599..7230e9cc 100644 --- a/src/fprime_gds/common/sequence/compiler.py +++ b/src/fprime_gds/common/sequence/compiler.py @@ -6,6 +6,7 @@ from argparse import ArgumentParser import sys import logging +import datetime from fprime_gds.common.templates.ch_template import ChTemplate from fprime_gds.executables.data_product_writer import IntegerType @@ -32,59 +33,20 @@ from fprime.common.models.serialize.bool_type import BoolType from fprime.common.models.serialize.string_type import StringType from fprime.common.models.serialize.enum_type import EnumType, REPRESENTATION_TYPE_MAP -from fprime.common.models.serialize.type_base import BaseType, ValueType, DictionaryType - -# name, desc, type -FpyArgTemplate = tuple[str, str, type[ValueType]] - - -# just for pretty-printing -def value_type_repr(self: ValueType): - return str(self.val) - - -ValueType.__repr__ = value_type_repr - - -@dataclass -class FpyType(ast.AST): - namespace: str - name: str - fprime_type: type[ValueType] - - -# this just helps the ast find what fields to pretty-print -FpyType._fields = ["namespace", "name", "fprime_type"] - - -@dataclass -class FpyEnumConstant(ast.AST): - enum_type: type[EnumType] - repr_type: type[ValueType] - value: int - - -FpyEnumConstant._fields = ["enum_type", "repr_type", "value"] - - -@dataclass -class FpyCmd(ast.AST): - namespace: str - name: str - cmd_template: CmdTemplate - - -FpyCmd._fields = ["namespace", "name", "cmd_template"] - - -@dataclass -class FpyCh(ast.AST): - namespace: str - name: str - ch_template: ChTemplate - - -FpyCh._fields = ["namespace", "name", "ch_template"] +from fprime.common.models.serialize.type_base import BaseType, BaseType, DictionaryType +from fprime.common.models.serialize.time_type import TimeType +from fprime_gds.common.sequence.fpy_type import ( + FpySeqDirective, + FpyArgTemplate, + FpyCh, + FpyCmd, + FpyEnumConstant, + FpyType, +) +from fprime_gds.common.sequence.directive import ( + SeqDirectiveTemplate, + seq_directive_name_dict, +) class ResolveNames(ast.NodeTransformer): @@ -92,13 +54,15 @@ class ResolveNames(ast.NodeTransformer): def __init__( self, cmd_name_dict: dict[str, CmdTemplate], - type_name_dict: dict[str, type[ValueType]], + type_name_dict: dict[str, type[BaseType]], ch_name_dict: dict[str, ChTemplate], + seq_directive_name_dict: dict[str, SeqDirectiveTemplate], ) -> None: super().__init__() self.cmd_name_dict = cmd_name_dict self.type_name_dict = type_name_dict self.ch_name_dict = ch_name_dict + self.seq_directive_name_dict = seq_directive_name_dict def visit_Module(self, node: ast.Module): for statement in node.body: @@ -130,19 +94,24 @@ def visit_Attribute(self, node: ast.Attribute): namespace.insert(0, namespace_node.id) namespace_str = ".".join(namespace) + return self.resolve_name(node, namespace_str, node.attr) + + def visit_Name(self, node: ast.Name): + return self.resolve_name(node, "", node.id) - fq_name = node.attr - if namespace_str != "": - fq_name = namespace_str + "." + fq_name + def resolve_name(self, node, namespace: str, name: str) -> ast.AST: + fq_name = name + if namespace != "": + fq_name = namespace + "." + fq_name - # now look up this namespace string. resolve enum consts, then types, then telemetry, then commands - resolved_fprime_enum_type = self.type_name_dict.get(namespace_str, None) + # now look up this namespace string. resolve enum consts, then types, then telemetry, then seq directives, then commands + resolved_fprime_enum_type = self.type_name_dict.get(namespace, None) if resolved_fprime_enum_type is not None: if not issubclass(resolved_fprime_enum_type, EnumType): node.error = "Invalid syntax" return node - enum_const_name = node.attr + enum_const_name = name if enum_const_name not in resolved_fprime_enum_type.ENUM_DICT: node.error = "Unknown enum constant '" + str(enum_const_name) + "'" return node @@ -151,7 +120,7 @@ def visit_Attribute(self, node: ast.Attribute): enum_value_py = resolved_fprime_enum_type.ENUM_DICT[enum_const_name] # this is a string enum_repr_type_name = resolved_fprime_enum_type.REP_TYPE - # this is a subclass of ValueType + # this is a subclass of BaseType enum_repr_type = REPRESENTATION_TYPE_MAP.get(enum_repr_type_name, None) assert enum_repr_type is not None @@ -161,15 +130,19 @@ def visit_Attribute(self, node: ast.Attribute): resolved_fprime_type = self.type_name_dict.get(fq_name, None) if resolved_fprime_type is not None: - return FpyType(namespace_str, node.attr, resolved_fprime_type) + return FpyType(namespace, name, resolved_fprime_type) resolved_fprime_ch = self.ch_name_dict.get(fq_name, None) if resolved_fprime_ch is not None: - return FpyCh(namespace_str, node.attr, resolved_fprime_ch) + return FpyCh(namespace, name, resolved_fprime_ch) + + resolved_seq_directive = self.seq_directive_name_dict.get(fq_name, None) + if resolved_seq_directive is not None: + return FpySeqDirective(namespace, name, resolved_seq_directive) resolved_fprime_cmd = self.cmd_name_dict.get(fq_name, None) if resolved_fprime_cmd is not None: - return FpyCmd(namespace_str, node.attr, resolved_fprime_cmd) + return FpyCmd(namespace, name, resolved_fprime_cmd) node.error = "Unknown identifier " + str(fq_name) return node @@ -177,13 +150,13 @@ def visit_Attribute(self, node: ast.Attribute): class CheckCalls(ast.NodeTransformer): - def __init__(self, type_name_dict: dict[str, type[ValueType]]): + def __init__(self, type_name_dict: dict[str, type[BaseType]]): self.type_name_dict = type_name_dict def visit_Call(self, node: ast.Call): - # only valid calls right now are commands and dict type instantiations - if not isinstance(node.func, (FpyCmd, FpyType)): + # only valid calls right now are commands, seq directives and type instantiations + if not isinstance(node.func, (FpyCmd, FpySeqDirective, FpyType)): node.error = "Invalid syntax" return node @@ -191,7 +164,9 @@ def visit_Call(self, node: ast.Call): args: list[FpyArgTemplate] = [] if isinstance(node.func, FpyCmd): args = node.func.cmd_template.arguments - else: + elif isinstance(node.func, FpySeqDirective): + args = node.func.seq_directive_template.args + elif isinstance(node.func, FpyType): # it's an FpyType if not self.check_has_ctor(node.func.fprime_type): node.error = ( @@ -201,6 +176,8 @@ def visit_Call(self, node: ast.Call): ) return node args = self.get_args_list_from_fprime_type_ctor(node.func.fprime_type) + else: + assert False, node.func # okay, now map the args to the nodes mapped_args = self.map_args(args, node) @@ -214,12 +191,12 @@ def visit_Call(self, node: ast.Call): return super().generic_visit(node) - def check_has_ctor(self, type: type[ValueType]) -> bool: + def check_has_ctor(self, type: type[BaseType]) -> bool: # only serializables (i.e. structs) and arrays can be directly constructed in fpy syntax - return issubclass(type, (SerializableType, ArrayType)) + return issubclass(type, (SerializableType, ArrayType, TimeType)) def get_args_list_from_fprime_type_ctor( - self, type: type[ValueType] + self, type: type[BaseType] ) -> list[FpyArgTemplate]: args = [] if issubclass(type, SerializableType): @@ -229,6 +206,25 @@ def get_args_list_from_fprime_type_ctor( elif issubclass(type, ArrayType): for i in range(type.LENGTH): args.append(FpyArgTemplate(("e" + str(i), "", type.MEMBER_TYPE))) + elif issubclass(type, TimeType): + args.append( + ( + "time_base", + "Time base index for the time tag. Must be a valid integer for a TimeBase Enum value.", + I32Type, + ) + ) + args.append(("time_context", "Time context for the time tag", I32Type)) + args.append( + ("seconds", "Seconds elapsed since specified time base", I32Type) + ) + args.append( + ( + "useconds", + "Microseconds since start of current second. Must be in range [0, 999999] inclusive", + I32Type, + ) + ) else: raise RuntimeError( "FPrime type " + str(type.__name__) + " has no constructor" @@ -273,7 +269,7 @@ def map_args( return mapping def check_node_converts_to_fprime_type( - self, node: ast.AST, fprime_type: type[ValueType] + self, node: ast.AST, fprime_type: type[BaseType] ) -> bool: """ Ensure the ast node can be turned into the desired FPrime type @@ -289,7 +285,7 @@ def error(node, msg): if not isinstance(node.value, bool): error( node, - "Expected a boolean literal, found " + str(type(node.value)), + "Expected a boolean literal, found '" + str(type(node.value)) + "'", ) return False elif issubclass(fprime_type, (F64Type, F32Type)): @@ -299,7 +295,9 @@ def error(node, msg): if not isinstance(node.value, float): error( node, - "Expected a floating point literal, found " + str(type(node.value)), + "Expected a floating point literal, found '" + + str(type(node.value)) + + "'", ) return False elif issubclass( @@ -309,10 +307,12 @@ def error(node, msg): if not isinstance(node, ast.Constant): error(node, "Invalid syntax") return False - if not isinstance(node.value, float): + if not isinstance(node.value, int): error( node, - "Expected an integer literal, found " + str(type(node.value)), + "Expected an integer literal, found '" + + str(type(node.value)) + + "'", ) return False elif issubclass(fprime_type, StringType): @@ -322,21 +322,41 @@ def error(node, msg): if not isinstance(node.value, str): error( node, - "Expected a string literal, found " + str(type(node.value)), + "Expected a string literal, found '" + str(type(node.value)) + "'", ) return False elif issubclass(fprime_type, EnumType): if not isinstance(node, FpyEnumConstant): if isinstance(node, ast.Constant): - error(node, "Expecting an enum constant, found '" + str(type(node.value).__name__) + "'") + error( + node, + "Expecting a value from " + + str(fprime_type.__name__) + + ", found '" + + str(type(node.value).__name__) + + "'", + ) else: - error(node, "Invalid syntax") + error(node, "Expecting an enum constant") return False assert fprime_type == node.enum_type - elif issubclass(fprime_type, (ArrayType, SerializableType)): + elif issubclass(fprime_type, (ArrayType, SerializableType, TimeType)): if not isinstance(node, ast.Call): # must be a ctor call - error(node, "Invalid syntax") + if isinstance(node, ast.Constant): + error( + node, + "Expecting a value of type " + + str(fprime_type.__name__) + + ", found '" + + str(type(node.value).__name__) + + "'", + ) + else: + error( + node, "Expecting a value of type " + str(fprime_type.__name__) + ) + return False if not isinstance(node.func, FpyType): # must be a ctor call @@ -351,10 +371,31 @@ def error(node, msg): + str(node.func.fprime_type.__name__), ) return False + else: + if isinstance(node, ast.Constant): + error( + node, + "Can't convert '" + + str(type(node.value).__name__) + + "' to " + + str(fprime_type), + ) + else: + error(node, "Can't convert argument to " + str(fprime_type)) + return False return True +class AddTimestamps(ast.NodeTransformer): + def __init__(self): + self.next_wait_absolute_time: datetime.datetime | None = None + self.next_wait_relative_time: datetime.timedelta | None = None + + def visit_Call(self, node: ast.Call) -> bytes: + pass + + def check_for_errors(node: ast.Module): def visit(n): if hasattr(n, "error"): @@ -412,12 +453,17 @@ def compile(node: ast.Module, dictionary: Path): dictionary ) type_name_dict = cmd_json_dict_loader.parsed_types + # insert the implicit TimeType into the dict + type_name_dict["Time"] = TimeType + ch_json_dict_loader = ChJsonLoader(dictionary) (ch_id_dict, ch_name_dict, versions) = ch_json_dict_loader.construct_dicts( dictionary ) print("RESOLVING NAMES") - name_resolver = ResolveNames(cmd_name_dict, type_name_dict, ch_name_dict) + name_resolver = ResolveNames( + cmd_name_dict, type_name_dict, ch_name_dict, seq_directive_name_dict + ) node = name_resolver.visit(node) print(ast.dump(node, indent=4)) diff --git a/src/fprime_gds/common/sequence/directive.py b/src/fprime_gds/common/sequence/directive.py new file mode 100644 index 00000000..fc0e3a78 --- /dev/null +++ b/src/fprime_gds/common/sequence/directive.py @@ -0,0 +1,41 @@ +from dataclasses import dataclass +from fprime.common.models.serialize.string_type import StringType +from fprime.common.models.serialize.type_base import BaseType +from fprime.common.models.serialize.time_type import TimeType +from enum import Enum + + +class SeqDirectiveId(Enum): + SLEEP_ABS = 0 + SLEEP_REL = 1 + + +@dataclass +class SeqDirectiveTemplate: + id: SeqDirectiveId + namespace: str + name: str + # name, desc, arg type + args: list[tuple[str, str, type[BaseType]]] + + +seq_directive_templates = [ + SeqDirectiveTemplate( + SeqDirectiveId.SLEEP_ABS, + "seq", + "sleep_until", + [("time", "The absolute time to sleep until", TimeType)], + ), + SeqDirectiveTemplate( + SeqDirectiveId.SLEEP_REL, + "seq", + "sleep", + [("timeDelta", "The time to sleep for", TimeType)], + ), +] + +# convert it to a fqn: directive dict +seq_directive_name_dict = { + seq_dir.namespace + "." + seq_dir.name: seq_dir + for seq_dir in seq_directive_templates +} diff --git a/src/fprime_gds/common/sequence/fpy_type.py b/src/fprime_gds/common/sequence/fpy_type.py new file mode 100644 index 00000000..6570cae4 --- /dev/null +++ b/src/fprime_gds/common/sequence/fpy_type.py @@ -0,0 +1,68 @@ +import ast +from dataclasses import dataclass +from fprime.common.models.serialize.enum_type import EnumType +from fprime.common.models.serialize.type_base import BaseType, BaseType, DictionaryType + +from fprime_gds.common.templates.ch_template import ChTemplate +from fprime_gds.common.templates.cmd_template import CmdTemplate +from fprime_gds.common.sequence.directive import SeqDirectiveTemplate + +# name, desc, type +FpyArgTemplate = tuple[str, str, type[BaseType]] + + +# just for pretty-printing +def value_type_repr(self: BaseType): + return str(self.val) + + +BaseType.__repr__ = value_type_repr + + +@dataclass +class FpyType(ast.AST): + namespace: str + name: str + fprime_type: type[BaseType] + + +# this just helps the ast find what fields to pretty-print +FpyType._fields = ["namespace", "name", "fprime_type"] + + +@dataclass +class FpyEnumConstant(ast.AST): + enum_type: type[EnumType] + repr_type: type[BaseType] + value: int + + +FpyEnumConstant._fields = ["enum_type", "repr_type", "value"] + + +@dataclass +class FpyCmd(ast.AST): + namespace: str + name: str + cmd_template: CmdTemplate + + +FpyCmd._fields = ["namespace", "name", "cmd_template"] + + +@dataclass +class FpyCh(ast.AST): + namespace: str + name: str + ch_template: ChTemplate + + +FpyCh._fields = ["namespace", "name", "ch_template"] + +@dataclass +class FpySeqDirective(ast.AST): + namespace: str + name: str + seq_directive_template: SeqDirectiveTemplate + + diff --git a/test/fprime_gds/common/sequence/test_basic_seq.py b/test/fprime_gds/common/sequence/test_basic_seq.py index 676d0fab..6ea610e5 100644 --- a/test/fprime_gds/common/sequence/test_basic_seq.py +++ b/test/fprime_gds/common/sequence/test_basic_seq.py @@ -1,80 +1,115 @@ import ast from pathlib import Path from fprime_gds.common.sequence.compiler import compile + + +def run_seq(seq: str, should_succeed: bool): + assert compile( + ast.parse(seq), Path(__file__).parent / "RefTopologyDictionary.json" + ) == (0 if should_succeed else 1) + + def test_basic_seq(): - seq = \ -""" + seq = """ Ref.fileManager.RemoveFile("test", True) Ref.fileManager.RemoveFile("test", False) """ - assert compile(ast.parse(seq), Path(__file__).parent / "RefTopologyDictionary.json") == 0 + run_seq(seq, True) + def test_basic_seq_kwargs(): - seq = \ -""" + seq = """ Ref.fileManager.RemoveFile("test", ignoreErrors=True) """ - assert compile(ast.parse(seq), Path(__file__).parent / "RefTopologyDictionary.json") == 0 + run_seq(seq, True) + def test_basic_seq_missing_arg(): - seq = \ -""" + seq = """ Ref.fileManager.RemoveFile("test") """ - assert compile(ast.parse(seq), Path(__file__).parent / "RefTopologyDictionary.json") == 1 + run_seq(seq, False) + def test_invalid_seq(): - seq = \ -""" + seq = """ "test" """ - assert compile(ast.parse(seq), Path(__file__).parent / "RefTopologyDictionary.json") == 1 + run_seq(seq, False) + def test_enum_arg(): - seq = \ -""" + seq = """ Ref.typeDemo.CHOICE(Ref.Choice.ONE) """ - assert compile(ast.parse(seq), Path(__file__).parent / "RefTopologyDictionary.json") == 0 + run_seq(seq, True) + def test_struct_arg(): - seq = \ -""" + seq = """ Ref.typeDemo.CHOICE_PAIR(Ref.ChoicePair(Ref.Choice.ONE, Ref.Choice.TWO)) """ - assert compile(ast.parse(seq), Path(__file__).parent / "RefTopologyDictionary.json") == 0 + run_seq(seq, True) + def test_struct_arg_wrong_type(): - seq = \ -""" + seq = """ Ref.typeDemo.CHOICE_PAIR(Ref.ChoicePair(1, Ref.Choice.TWO)) """ - assert compile(ast.parse(seq), Path(__file__).parent / "RefTopologyDictionary.json") == 1 + run_seq(seq, False) + def test_unknown_enum_const(): - seq = \ -""" + seq = """ Ref.typeDemo.CHOICE_PAIR(Ref.ChoicePair(Ref.Choice.FAIL, Ref.Choice.TWO)) """ - assert compile(ast.parse(seq), Path(__file__).parent / "RefTopologyDictionary.json") == 1 + run_seq(seq, False) + def test_array_arg(): - seq = \ -""" + seq = """ Ref.typeDemo.CHOICES(Ref.ManyChoices(Ref.Choice.TWO, Ref.Choice.RED)) """ - assert compile(ast.parse(seq), Path(__file__).parent / "RefTopologyDictionary.json") == 0 + run_seq(seq, True) + def test_array_kwarg(): - seq = \ -""" + seq = """ Ref.typeDemo.CHOICES(Ref.ManyChoices(e0=Ref.Choice.TWO, e1=Ref.Choice.RED)) """ - assert compile(ast.parse(seq), Path(__file__).parent / "RefTopologyDictionary.json") == 0 + run_seq(seq, True) + def test_fail_call_cmd(): - seq = \ -""" + seq = """ Ref.typeDemo.CHOICES(Ref.typeDemo.CHOICES(Ref.ManyChoices(Ref.Choice.TWO, Ref.Choice.RED))) """ - assert compile(ast.parse(seq), Path(__file__).parent / "RefTopologyDictionary.json") == 0 \ No newline at end of file + run_seq(seq, False) + + +def test_rel_sleep(): + seq = """ +seq.sleep(Time(55,55,55,55)) +""" + run_seq(seq, True) + + +def test_abs_sleep(): + seq = """ +seq.sleep_until(Time(0,1,2,3)) +""" + run_seq(seq, True) + + +def test_seq_dir_bad_args(): + seq = """ +seq.sleep_until(1) +""" + run_seq(seq, False) + + +def test_bad_seq_directive(): + seq = """ +seq.fail() +""" + run_seq(seq, False) From 2d2172b2118cade18e671cffc3539df08ded8d20 Mon Sep 17 00:00:00 2001 From: Zimri Leisher Date: Thu, 31 Oct 2024 12:49:12 -0500 Subject: [PATCH 08/14] remove debug prints --- src/fprime_gds/common/sequence/compiler.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/fprime_gds/common/sequence/compiler.py b/src/fprime_gds/common/sequence/compiler.py index 7230e9cc..b8036317 100644 --- a/src/fprime_gds/common/sequence/compiler.py +++ b/src/fprime_gds/common/sequence/compiler.py @@ -446,7 +446,6 @@ def main(): def compile(node: ast.Module, dictionary: Path): - print(ast.dump(node, indent=4)) cmd_json_dict_loader = CmdJsonLoader(dictionary) (cmd_id_dict, cmd_name_dict, versions) = cmd_json_dict_loader.construct_dicts( @@ -460,21 +459,17 @@ def compile(node: ast.Module, dictionary: Path): (ch_id_dict, ch_name_dict, versions) = ch_json_dict_loader.construct_dicts( dictionary ) - print("RESOLVING NAMES") name_resolver = ResolveNames( cmd_name_dict, type_name_dict, ch_name_dict, seq_directive_name_dict ) node = name_resolver.visit(node) - print(ast.dump(node, indent=4)) if not check_for_errors(node): return 1 - print("CHECKING CALLS") call_checker = CheckCalls(type_name_dict) node = call_checker.visit(node) - print(ast.dump(node, indent=4)) if not check_for_errors(node): return 1 From 4d93f91d16311bb48d466f94137b9004cc2a6e39 Mon Sep 17 00:00:00 2001 From: Zimri Leisher Date: Wed, 6 Nov 2024 19:44:03 -0600 Subject: [PATCH 09/14] Get sequence compiler even closer! Now we're adding time info to all commands, and parsing all types into their BaseType values --- src/fprime_gds/common/sequence/compiler.py | 250 ++++++++++++++++-- .../common/sequence/dictionary_ac.py | 42 --- src/fprime_gds/common/sequence/directive.py | 9 +- src/fprime_gds/common/sequence/fpy_type.py | 55 +++- .../common/sequence/header_generator.py | 162 ++++++++++++ .../common/sequence/test_basic_seq.py | 66 ++++- 6 files changed, 495 insertions(+), 89 deletions(-) delete mode 100644 src/fprime_gds/common/sequence/dictionary_ac.py create mode 100644 src/fprime_gds/common/sequence/header_generator.py diff --git a/src/fprime_gds/common/sequence/compiler.py b/src/fprime_gds/common/sequence/compiler.py index b8036317..092be517 100644 --- a/src/fprime_gds/common/sequence/compiler.py +++ b/src/fprime_gds/common/sequence/compiler.py @@ -33,17 +33,20 @@ from fprime.common.models.serialize.bool_type import BoolType from fprime.common.models.serialize.string_type import StringType from fprime.common.models.serialize.enum_type import EnumType, REPRESENTATION_TYPE_MAP -from fprime.common.models.serialize.type_base import BaseType, BaseType, DictionaryType +from fprime.common.models.serialize.type_base import BaseType, BaseType, ValueType from fprime.common.models.serialize.time_type import TimeType from fprime_gds.common.sequence.fpy_type import ( + FpyArg, FpySeqDirective, FpyArgTemplate, FpyCh, FpyCmd, FpyEnumConstant, FpyType, + FpyCall, ) from fprime_gds.common.sequence.directive import ( + SeqDirectiveId, SeqDirectiveTemplate, seq_directive_name_dict, ) @@ -65,12 +68,15 @@ def __init__( self.seq_directive_name_dict = seq_directive_name_dict def visit_Module(self, node: ast.Module): + if len(node.body) == 0: + # no statements in sequence file + node.error = "Sequence files cannot be empty" for statement in node.body: statement: ast.stmt if not isinstance(statement, ast.Expr) or not isinstance( statement.value, ast.Call ): - statement.error = "Invalid syntax: Sequences can only contain commands" + statement.error = "Sequences can only contain commands" return self.generic_visit(node) def visit_Attribute(self, node: ast.Attribute): @@ -125,7 +131,10 @@ def resolve_name(self, node, namespace: str, name: str) -> ast.AST: assert enum_repr_type is not None return FpyEnumConstant( - resolved_fprime_enum_type, enum_repr_type, enum_value_py + resolved_fprime_enum_type, + enum_repr_type, + enum_const_name, + enum_value_py, ) resolved_fprime_type = self.type_name_dict.get(fq_name, None) @@ -182,17 +191,23 @@ def visit_Call(self, node: ast.Call): # okay, now map the args to the nodes mapped_args = self.map_args(args, node) + if hasattr(node, "error"): + # if something went wrong, don't traverse the tree + return node + # okay, now type check the args - for arg_template, arg_node in mapped_args.items(): + for arg in mapped_args: # this func will add an error if it finds one - if not self.check_node_converts_to_fprime_type(arg_node, arg_template[2]): + if not self.check_node_converts_to_fprime_type(arg.node, arg.type): # don't traverse the tree if we fail return node - return super().generic_visit(node) + fpy_call = FpyCall(node.func, mapped_args) + + return super().generic_visit(fpy_call) def check_has_ctor(self, type: type[BaseType]) -> bool: - # only serializables (i.e. structs) and arrays can be directly constructed in fpy syntax + # only serializables (i.e. structs), time objects and arrays can be directly constructed in fpy syntax. enums and literals cannot return issubclass(type, (SerializableType, ArrayType, TimeType)) def get_args_list_from_fprime_type_ctor( @@ -231,14 +246,12 @@ def get_args_list_from_fprime_type_ctor( ) return args - def map_args( - self, args: list[FpyArgTemplate], node: ast.Call - ) -> dict[FpyArgTemplate, ast.AST]: + def map_args(self, args: list[FpyArgTemplate], node: ast.Call) -> list[FpyArg]: """ Maps arguments from a list of arg templates to an ast node by position and name. Does not perform type checking. """ - mapping = dict() + mapping = [] for idx, arg_template in enumerate(args): arg_name, arg_desc, arg_type = arg_template @@ -258,13 +271,12 @@ def map_args( node.error = "Missing argument " + str(arg_name) continue else: - for arg_n in arg_node: - arg_n.error = "Multiple values for " + str(arg_name) + node.error = "Multiple values for " + str(arg_name) continue arg_node = arg_node[0] - mapping[arg_template] = arg_node + mapping.append(FpyArg(arg_name, arg_type, arg_node)) return mapping @@ -337,9 +349,17 @@ def error(node, msg): + "'", ) else: - error(node, "Expecting an enum constant") + error(node, "Expecting a value from " + str(fprime_type.__name__)) + return False + if fprime_type != node.enum_type: + error( + node, + "Expecting a value from " + + str(fprime_type.__name__) + + ", found a value from " + + str(node.enum_type.__name__), + ) return False - assert fprime_type == node.enum_type elif issubclass(fprime_type, (ArrayType, SerializableType, TimeType)): if not isinstance(node, ast.Call): # must be a ctor call @@ -387,13 +407,167 @@ def error(node, msg): return True -class AddTimestamps(ast.NodeTransformer): +class ConstructFpyTypes(ast.NodeVisitor): + """ + Turn all FpyTypes/FpyEnumConstants/constants argument of each command into an instance of a subclass of BaseType + """ + + def visit_FpyCall(self, node: FpyCall): + super().generic_visit(node) + # okay, all args to args should be collapsed into a BaseType + + # now do that for the args + for arg in node.args: + instantiated_type = self.construct_arg_type(arg) + arg.type_instance = instantiated_type + + def construct_arg_type(self, arg: FpyArg) -> BaseType: + # type checking has already happened in a previous step. we'll do a minimum of checking ourselves + fprime_type = arg.type + node = arg.node + + type_instance = None + if issubclass(fprime_type, ValueType): + type_instance = fprime_type() + + # if it should be a constant + if issubclass( + fprime_type, + ( + BoolType, + F32Type, + F64Type, + U16Type, + U32Type, + U64Type, + U8Type, + I16Type, + I32Type, + I64Type, + I8Type, + StringType, + ), + ): + + # make sure the value is a constant + assert isinstance(node, ast.Constant) + + # make sure the constant's type matches + if issubclass(fprime_type, BoolType): + assert isinstance(node.value, bool) + elif issubclass(fprime_type, (F64Type, F32Type)): + assert isinstance(node.value, float) + elif issubclass( + fprime_type, + (I64Type, U64Type, I32Type, U32Type, I16Type, U16Type, I8Type, U8Type), + ): + assert isinstance(node.value, int) + elif issubclass(fprime_type, StringType): + assert isinstance(node.value, str) + + try: + type_instance._val = node.value + except BaseException as e: + arg.node.error = "Error while constructing argument " + str(arg.name) + ": " + str(e) + + elif issubclass(fprime_type, EnumType): + assert isinstance(node, FpyEnumConstant) + try: + type_instance.val = node.const_name + except BaseException as e: + arg.node.error = "Error while constructing argument " + str(arg.name) + ": " + str(e) + elif issubclass(fprime_type, (ArrayType, SerializableType, TimeType)): + # should be a ctor call + assert ( + isinstance(node, FpyCall) + and isinstance(node.func, FpyType) + and node.func.fprime_type == fprime_type + ) + if issubclass(fprime_type, SerializableType): + try: + type_instance.val = {a.name: a.type_instance.val for a in node.args} + except BaseException as e: + arg.node.error = "Error while constructing argument " + str(arg.name) + ": " + str(e) + elif issubclass(fprime_type, ArrayType): + val = [] + for a in node.args: + val.append(a.type_instance.val) + try: + type_instance.val = val + except BaseException as e: + arg.node.error = "Error while constructing argument " + str(arg.name) + ": " + str(e) + elif issubclass(fprime_type, TimeType): + assert len(node.args) == 4 + try: + type_instance = TimeType(*[a.type_instance.val for a in node.args]) + except BaseException as e: + arg.node.error = "Error while constructing argument " + str(arg.name) + ": " + str(e) + else: + assert False, fprime_type + return type_instance + + +class AddTimestamps(ast.NodeVisitor): def __init__(self): - self.next_wait_absolute_time: datetime.datetime | None = None - self.next_wait_relative_time: datetime.timedelta | None = None - def visit_Call(self, node: ast.Call) -> bytes: - pass + self.next_command_has_time = False + """Whether or not the next command coming up will have a specific runtime""" + self.next_wait_absolute_time: TimeType | None = None + """The absolute time to wait for before the next command""" + self.next_wait_relative_time: TimeType | None = None + """The relative time to wait before the next command""" + + def visit_Module(self, node: ast.Module): + for statement in node.body: + # just make sure our checks above worked + assert ( + isinstance(statement, ast.Expr) + and isinstance(statement.value, FpyCall) + and isinstance(statement.value.func, (FpyCmd, FpySeqDirective)) + ) + func = statement.value.func + # okay, is this a sleep seq dir? + if isinstance(func, FpySeqDirective) and func.seq_directive_template.id in [ + SeqDirectiveId.SLEEP_ABS, + SeqDirectiveId.SLEEP_REL, + ]: + if self.next_command_has_time: + # the next command already has a time. can't specify two sleeps or more next to each other + # this is just a temporary limitation due to not using a new bytecode + statement.error = ( + "Can only have one sleep directive before running a command" + ) + return + + # get the first arg of the directive + time = statement.value.get_arg(func.seq_directive_template.args[0][0]) + + if func.seq_directive_template == SeqDirectiveId.SLEEP_ABS: + self.next_wait_absolute_time = time + else: + self.next_wait_relative_time = time + + self.next_command_has_time = True + elif isinstance(func, FpyCmd): + # do we have a time waiting to be applied to this cmd? + if not self.next_command_has_time: + # no, give it a relative time of 0 + func.is_time_relative = True + # TB_DONT_CARE + func.time = TimeType(0xFFFF, 0, 0, 0) + else: + # has a time + if self.next_wait_absolute_time is not None: + func.time = self.next_wait_absolute_time + func.is_time_relative = False + elif self.next_wait_relative_time is not None: + func.time = self.next_wait_relative_time + func.is_time_relative = True + + # reset internal state + self.next_wait_absolute_time = None + self.next_wait_relative_time = None + self.next_command_has_time = False def check_for_errors(node: ast.Module): @@ -421,6 +595,19 @@ def visit(n): return visit(node) +def module_to_bytes(node: ast.Module): + output_bytes = bytes() + for statement in node.body: + # sorry another sanity check + assert ( + isinstance(statement, ast.Expr) + and isinstance(statement.value, FpyCall) + and isinstance(statement.value.func, (FpySeqDirective, FpyCmd)) + ) + + return output_bytes + + def main(): arg_parser = ArgumentParser( description="A compiler for the FPrime advanced sequencing language" @@ -442,10 +629,10 @@ def main(): node = ast.parse(input_text) - compile(node, args.dictionary) + return compile(node, args.dictionary) -def compile(node: ast.Module, dictionary: Path): +def compile(node: ast.Module, dictionary: Path) -> bytes: cmd_json_dict_loader = CmdJsonLoader(dictionary) (cmd_id_dict, cmd_name_dict, versions) = cmd_json_dict_loader.construct_dicts( @@ -465,15 +652,26 @@ def compile(node: ast.Module, dictionary: Path): node = name_resolver.visit(node) if not check_for_errors(node): - return 1 + return None call_checker = CheckCalls(type_name_dict) node = call_checker.visit(node) + if not check_for_errors(node): + return None + type_constructor = ConstructFpyTypes() + type_constructor.visit(node) if not check_for_errors(node): - return 1 + return None + + timestamp_adder = AddTimestamps() + timestamp_adder.visit(node) + if not check_for_errors(node): + return None + + output_bytes = module_to_bytes(node) - return 0 + return output_bytes if __name__ == "__main__": diff --git a/src/fprime_gds/common/sequence/dictionary_ac.py b/src/fprime_gds/common/sequence/dictionary_ac.py deleted file mode 100644 index c550182f..00000000 --- a/src/fprime_gds/common/sequence/dictionary_ac.py +++ /dev/null @@ -1,42 +0,0 @@ -from builtin_ac import * - -def id(id): - def add_id(fn): - fn.id = id - return fn - return add_id - -class Component: - def __init__(self, name, id) -> None: - self.id = id - self.name = name - -class FSWExecutive(Component): - - def __init__(self, name, id) -> None: - self.id = id - self.name = name - - @property - def current_mode(self): - pass - - @id(1) - def SET_MODE(self, mode: int): - pass - -class RCSController(Component): - - def __init__(self, name, id) -> None: - self.id = id - self.name = name - - @id(0) - def FIRE_THRUSTERS(self): - pass - -fswExec = FSWExecutive("fswExec", 1) - -rcsController = RCSController("rcsController", 2) - -instances: list[Component] = [fswExec, rcsController] \ No newline at end of file diff --git a/src/fprime_gds/common/sequence/directive.py b/src/fprime_gds/common/sequence/directive.py index fc0e3a78..5f505850 100644 --- a/src/fprime_gds/common/sequence/directive.py +++ b/src/fprime_gds/common/sequence/directive.py @@ -13,7 +13,6 @@ class SeqDirectiveId(Enum): @dataclass class SeqDirectiveTemplate: id: SeqDirectiveId - namespace: str name: str # name, desc, arg type args: list[tuple[str, str, type[BaseType]]] @@ -22,20 +21,18 @@ class SeqDirectiveTemplate: seq_directive_templates = [ SeqDirectiveTemplate( SeqDirectiveId.SLEEP_ABS, - "seq", - "sleep_until", + "sleep_abs", [("time", "The absolute time to sleep until", TimeType)], ), SeqDirectiveTemplate( SeqDirectiveId.SLEEP_REL, - "seq", - "sleep", + "sleep_rel", [("timeDelta", "The time to sleep for", TimeType)], ), ] # convert it to a fqn: directive dict seq_directive_name_dict = { - seq_dir.namespace + "." + seq_dir.name: seq_dir + seq_dir.name: seq_dir for seq_dir in seq_directive_templates } diff --git a/src/fprime_gds/common/sequence/fpy_type.py b/src/fprime_gds/common/sequence/fpy_type.py index 6570cae4..a5fb2bbd 100644 --- a/src/fprime_gds/common/sequence/fpy_type.py +++ b/src/fprime_gds/common/sequence/fpy_type.py @@ -1,7 +1,13 @@ import ast from dataclasses import dataclass from fprime.common.models.serialize.enum_type import EnumType -from fprime.common.models.serialize.type_base import BaseType, BaseType, DictionaryType +from fprime.common.models.serialize.time_type import TimeType +from fprime.common.models.serialize.type_base import ( + BaseType, + BaseType, + DictionaryType, + ValueType, +) from fprime_gds.common.templates.ch_template import ChTemplate from fprime_gds.common.templates.cmd_template import CmdTemplate @@ -12,11 +18,13 @@ # just for pretty-printing -def value_type_repr(self: BaseType): - return str(self.val) +def base_type_repr(self: BaseType): + if isinstance(self, ValueType): + return str(self.val) + return self.__class__.__name__ -BaseType.__repr__ = value_type_repr +BaseType.__repr__ = base_type_repr @dataclass @@ -34,10 +42,11 @@ class FpyType(ast.AST): class FpyEnumConstant(ast.AST): enum_type: type[EnumType] repr_type: type[BaseType] - value: int + const_name: str + const_val: int -FpyEnumConstant._fields = ["enum_type", "repr_type", "value"] +FpyEnumConstant._fields = ["enum_type", "repr_type", "const_name"] @dataclass @@ -46,8 +55,12 @@ class FpyCmd(ast.AST): name: str cmd_template: CmdTemplate + # added in AddTimestamps step + time: TimeType = None + is_time_relative: bool = None -FpyCmd._fields = ["namespace", "name", "cmd_template"] + +FpyCmd._fields = ["namespace", "name", "cmd_template", "time"] @dataclass @@ -59,10 +72,36 @@ class FpyCh(ast.AST): FpyCh._fields = ["namespace", "name", "ch_template"] + @dataclass class FpySeqDirective(ast.AST): namespace: str name: str seq_directive_template: SeqDirectiveTemplate - + +@dataclass +class FpyArg(ast.AST): + name: str + type: type[BaseType] + node: ast.AST + + # added in ConstructFpyTypes step + type_instance: BaseType = None + + +FpyArg._fields = ["name", "type", "node", "type_instance"] + + +@dataclass +class FpyCall(ast.expr): + func: FpyType | FpyCmd | FpySeqDirective + args: list[FpyArg] + + def get_arg(self, name: str): + matching = [a for a in self.args if a.name == name] + if len(matching) != 1: + raise RuntimeError("Error finding arg " + str(name) + ": found " + str(len(matching)) + " matching args") + return matching[0] + +FpyCall._fields = ["func", "args"] diff --git a/src/fprime_gds/common/sequence/header_generator.py b/src/fprime_gds/common/sequence/header_generator.py new file mode 100644 index 00000000..792eca10 --- /dev/null +++ b/src/fprime_gds/common/sequence/header_generator.py @@ -0,0 +1,162 @@ +from argparse import ArgumentParser +import os +from pathlib import Path +import sys +import shutil + +from fprime_gds.common.loaders.ch_json_loader import ChJsonLoader +from fprime_gds.common.loaders.cmd_json_loader import CmdJsonLoader +from fprime.common.models.serialize.type_base import BaseType + +prompted_removal = False + + +def prompt_removal(path: Path): + global prompted_removal + if not prompted_removal: + while True: + allow_removal = input( + str(path.resolve()) + + " already exists. Allow overwriting existing dirs and files? [Y/n] " + ) + if allow_removal.lower() in ["n", "no"]: + # can't remove a dir we need to remove + exit(1) + if allow_removal.lower() in ["", "Y", "yes"]: + break + else: + print("Unknown option") + continue + prompted_removal = True + # only way out of the above loop is accepting it + + if path.is_dir(): + shutil.rmtree(str(path.resolve())) + else: + path.unlink() + + +# this function is a hack because we don't get explicit module hierarchy info in the json dict +def get_module_hierarchy( + cmd_names: list[str], type_names: list[str], ch_names: list[str] +) -> dict: + + component_names = [] + # get list of components that have cmds and tlm chans + for name in list(cmd_names) + list(ch_names): + parent_component = name.split(".")[:-1] + if parent_component not in component_names: + component_names.append(parent_component) + + modules = {} + + def add_namespace_to_dict(name): + + d = modules + + for mod in name: + if mod not in d: + d[mod] = {} + d = d[mod] + + for name in list(cmd_names) + list(ch_names): + # add the namespace of the component that contains these chs and cmds + add_namespace_to_dict(name.split(".")[:-2]) + + for type_name in type_names: + enclosing_name = type_name.split(".")[:-1] + # type_name could either be a module, or a component + if enclosing_name in component_names: + print("type " + type_name + " is in a component") + # if it's a component, add the next higher level to the module names + add_namespace_to_dict(enclosing_name[:-1]) + else: + # we think it might be a module (still could be a component with no cmds or tlm that has a type declared inside of it) + print("type " + type_name + " is NOT in a component") + add_namespace_to_dict(enclosing_name) + + + # get unique names + return modules + + +def generate_stubs(dictionary: Path, output_dir: Path) -> str: + cmd_json_dict_loader = CmdJsonLoader(dictionary) + (cmd_id_dict, cmd_name_dict, versions) = cmd_json_dict_loader.construct_dicts( + dictionary + ) + type_name_dict = cmd_json_dict_loader.parsed_types + + ch_json_dict_loader = ChJsonLoader(dictionary) + (ch_id_dict, ch_name_dict, versions) = ch_json_dict_loader.construct_dicts( + dictionary + ) + + modules = get_module_hierarchy( + cmd_name_dict.keys(), type_name_dict.keys(), ch_name_dict.keys() + ) + + def generate_module_folders(module, submodules): + # if not the root module + if module is not None: + module_folder: Path = output_dir / module + if module_folder.exists(): + prompt_removal(module_folder) + module_folder.mkdir(parents=True) + (module_folder / "__init__.py").touch() + + for submodule in submodules: + generate_module_folders(submodule, submodules[submodule]) + + generate_module_folders(None, modules) + + generate_types(type_name_dict) + + # okay, now generate folders for each module + # first generate all types + # then generate all components + # then generate all component instances + + +def generate_types(type_name_dict: dict[str, type[BaseType]]) -> str: + ac_type_str = "" + # for type_name, type_class in type_name_dict.items(): + # ac_type_str += generate_type(type_name, type_class) + + +def main(): + arg_parser = ArgumentParser( + description="A tool to generate Python stubs for IDE autocompletion for the FPrime advanced sequencing language" + ) + + arg_parser.add_argument( + "dictionary", + type=Path, + help="The JSON topology dictionary to generate Python stubs for", + ) + arg_parser.add_argument( + "-o", + "--output", + type=Path, + help="The output directory for the stubs", + default=Path(os.getcwd()), + ) + arg_parser.add_argument( + "-f", + "--force", + action="store_true", + help="If present, don't prompt to overwrite existing stubs", + ) + + args = arg_parser.parse_args() + + if args.force: + global prompted_removal + prompted_removal = True + + generate_stubs(args.dictionary, args.output) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/test/fprime_gds/common/sequence/test_basic_seq.py b/test/fprime_gds/common/sequence/test_basic_seq.py index 6ea610e5..ff55f097 100644 --- a/test/fprime_gds/common/sequence/test_basic_seq.py +++ b/test/fprime_gds/common/sequence/test_basic_seq.py @@ -4,9 +4,13 @@ def run_seq(seq: str, should_succeed: bool): - assert compile( + result = compile( ast.parse(seq), Path(__file__).parent / "RefTopologyDictionary.json" - ) == (0 if should_succeed else 1) + ) + if should_succeed: + assert result is not None + else: + assert result is None def test_basic_seq(): @@ -45,6 +49,13 @@ def test_enum_arg(): run_seq(seq, True) +def test_wrong_enum_arg(): + seq = """ +Ref.typeDemo.CHOICE(Fw.Wait.WAIT) +""" + run_seq(seq, False) + + def test_struct_arg(): seq = """ Ref.typeDemo.CHOICE_PAIR(Ref.ChoicePair(Ref.Choice.ONE, Ref.Choice.TWO)) @@ -52,7 +63,14 @@ def test_struct_arg(): run_seq(seq, True) -def test_struct_arg_wrong_type(): +def test_wrong_struct_arg(): + seq = """ +Ref.typeDemo.CHOICE_PAIR(Ref.SignalPair(0.0, 0.0)) +""" + run_seq(seq, False) + + +def test_struct_ctor_arg_wrong_type(): seq = """ Ref.typeDemo.CHOICE_PAIR(Ref.ChoicePair(1, Ref.Choice.TWO)) """ @@ -89,27 +107,61 @@ def test_fail_call_cmd(): def test_rel_sleep(): seq = """ -seq.sleep(Time(55,55,55,55)) +sleep_rel(Time(0, 55,55,55)) """ run_seq(seq, True) def test_abs_sleep(): seq = """ -seq.sleep_until(Time(0,1,2,3)) +sleep_abs(Time(0,1,2,3)) """ run_seq(seq, True) +def test_timebase_fail(): + seq = """ +sleep_abs(Time(1231,1,2,3)) +""" + run_seq(seq, False) + + +def test_int_out_of_bounds(): + seq = """ +sleep_abs(Time(0,1,2,123123123123123123)) +""" + run_seq(seq, False) + + def test_seq_dir_bad_args(): seq = """ -seq.sleep_until(1) +sleep_abs(1) """ run_seq(seq, False) def test_bad_seq_directive(): seq = """ -seq.fail() +fail() +""" + run_seq(seq, False) + + +def test_empty_seq(): + run_seq("", False) + + +def test_two_sleeps_fail_1(): + seq = """ +sleep_abs(Time(0,1,2,3)) +sleep_abs(Time(0,1,2,3)) +""" + run_seq(seq, False) + + +def test_two_sleeps_fail_2(): + seq = """ +sleep_abs(Time(0,1,2,3)) +sleep_rel(Time(0,1,2,3)) """ run_seq(seq, False) From 49c7d059ed747bb1f5dbd8fa77db79581eab0c6d Mon Sep 17 00:00:00 2001 From: Zimri Leisher Date: Thu, 7 Nov 2024 14:38:58 -0600 Subject: [PATCH 10/14] First attempt at producing bytes output --- src/fprime_gds/common/sequence/compiler.py | 102 +++++++++++++++++++-- 1 file changed, 96 insertions(+), 6 deletions(-) diff --git a/src/fprime_gds/common/sequence/compiler.py b/src/fprime_gds/common/sequence/compiler.py index 092be517..f2a0d531 100644 --- a/src/fprime_gds/common/sequence/compiler.py +++ b/src/fprime_gds/common/sequence/compiler.py @@ -7,9 +7,12 @@ import sys import logging import datetime +import zlib from fprime_gds.common.templates.ch_template import ChTemplate from fprime_gds.executables.data_product_writer import IntegerType +from fprime_gds.common.models.common.command import Descriptor +from fprime_gds.common.utils.data_desc_type import DataDescType logging.basicConfig() logger = logging.getLogger(__file__) @@ -468,14 +471,18 @@ def construct_arg_type(self, arg: FpyArg) -> BaseType: try: type_instance._val = node.value except BaseException as e: - arg.node.error = "Error while constructing argument " + str(arg.name) + ": " + str(e) + arg.node.error = ( + "Error while constructing argument " + str(arg.name) + ": " + str(e) + ) elif issubclass(fprime_type, EnumType): assert isinstance(node, FpyEnumConstant) try: type_instance.val = node.const_name except BaseException as e: - arg.node.error = "Error while constructing argument " + str(arg.name) + ": " + str(e) + arg.node.error = ( + "Error while constructing argument " + str(arg.name) + ": " + str(e) + ) elif issubclass(fprime_type, (ArrayType, SerializableType, TimeType)): # should be a ctor call assert ( @@ -487,7 +494,12 @@ def construct_arg_type(self, arg: FpyArg) -> BaseType: try: type_instance.val = {a.name: a.type_instance.val for a in node.args} except BaseException as e: - arg.node.error = "Error while constructing argument " + str(arg.name) + ": " + str(e) + arg.node.error = ( + "Error while constructing argument " + + str(arg.name) + + ": " + + str(e) + ) elif issubclass(fprime_type, ArrayType): val = [] for a in node.args: @@ -495,13 +507,23 @@ def construct_arg_type(self, arg: FpyArg) -> BaseType: try: type_instance.val = val except BaseException as e: - arg.node.error = "Error while constructing argument " + str(arg.name) + ": " + str(e) + arg.node.error = ( + "Error while constructing argument " + + str(arg.name) + + ": " + + str(e) + ) elif issubclass(fprime_type, TimeType): assert len(node.args) == 4 try: type_instance = TimeType(*[a.type_instance.val for a in node.args]) except BaseException as e: - arg.node.error = "Error while constructing argument " + str(arg.name) + ": " + str(e) + arg.node.error = ( + "Error while constructing argument " + + str(arg.name) + + ": " + + str(e) + ) else: assert False, fprime_type return type_instance @@ -595,8 +617,35 @@ def visit(n): return visit(node) +def cmd_to_bytes(cmd: FpyCmd, args: list[FpyArg]) -> bytes: + + # command format is descriptor + time + command length + command packet descriptor + command opcode + command args + + # the "descriptor" is just whether this is abs or rel + descriptor = Descriptor.RELATIVE if cmd.is_time_relative else Descriptor.ABSOLUTE + # subtract one because this enum starts at 1 + descriptor = U8Type(descriptor.value - 1).serialize() + time = ( + U32Type(cmd.time.seconds).serialize() + U32Type(cmd.time.useconds).serialize() + ) + header = descriptor + time + + command = bytes() + packet_descriptor_val = DataDescType["FW_PACKET_COMMAND"].value + opcode_val = cmd.cmd_template.get_id() + command += U32Type(packet_descriptor_val).serialize() + command += U32Type(opcode_val).serialize() + for arg in args: + command += arg.type_instance.serialize() + + length = U32Type(len(command)).serialize() + + return header + length + command + + def module_to_bytes(node: ast.Module): output_bytes = bytes() + num_cmds = 0 for statement in node.body: # sorry another sanity check assert ( @@ -604,10 +653,45 @@ def module_to_bytes(node: ast.Module): and isinstance(statement.value, FpyCall) and isinstance(statement.value.func, (FpySeqDirective, FpyCmd)) ) + if isinstance(statement.value.func, FpySeqDirective): + assert statement.value.func.seq_directive_template.id in [ + SeqDirectiveId.SLEEP_ABS, + SeqDirectiveId.SLEEP_REL, + ] + # have already dealt with these by adding timestamps to cmds + continue + # okay, serialize the command + output_bytes += cmd_to_bytes(statement.value.func, statement.value.args) + num_cmds += 1 + + size = len(output_bytes) + tb_txt = "ANY" + + print(f"Sequence is {size} bytes with timebase {tb_txt}") + + header = b"" + header += U32Type( + size + 4 + ).serialize() # Write out size of the sequence file in bytes here + header += U32Type(num_cmds).serialize() # Write number of records + header += U16Type(0xFFFF).serialize() # Write time base + header += U8Type(0xFF).serialize() # write time context + output_bytes = header + output_bytes # Write the list of command records here + # compute CRC. Ported from Utils/Hash/libcrc/libcrc.h (update_crc_32) + crc = compute_crc(output_bytes) + + print("CRC: %d (0x%04X)" % (crc, crc)) + output_bytes += U32Type(crc).serialize() return output_bytes +def compute_crc(buff): + # See http://stackoverflow.com/questions/30092226/how-to-calculate-crc32-with-python-to-match-online-results + # RE: signed to unsigned CRC + return zlib.crc32(buff) % (1 << 32) + + def main(): arg_parser = ArgumentParser( description="A compiler for the FPrime advanced sequencing language" @@ -622,6 +706,7 @@ def main(): type=Path, help="The JSON topology dictionary to compile against", ) + arg_parser.add_argument("-o", "--output", type=Path, help="The output .bin file path. Defaults to the input file path", default=None) args = arg_parser.parse_args() @@ -629,7 +714,12 @@ def main(): node = ast.parse(input_text) - return compile(node, args.dictionary) + output_bytes = compile(node, args.dictionary) + output_path: Path = args.output + if output_path is None: + output_path = args.input.with_suffix(".bin") + + output_path.write_bytes(output_bytes) def compile(node: ast.Module, dictionary: Path) -> bytes: From 43db402c55eb6b29b7d94f9d5f83c57e6a47815c Mon Sep 17 00:00:00 2001 From: Zimri Leisher Date: Thu, 7 Nov 2024 15:58:38 -0600 Subject: [PATCH 11/14] Add a basic readme --- src/fprime_gds/common/sequence/README.md | 86 ++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 src/fprime_gds/common/sequence/README.md diff --git a/src/fprime_gds/common/sequence/README.md b/src/fprime_gds/common/sequence/README.md new file mode 100644 index 00000000..969e7ad3 --- /dev/null +++ b/src/fprime_gds/common/sequence/README.md @@ -0,0 +1,86 @@ +# FPy Advanced Sequencing Language Version 0.1 +The FPy advanced sequencing language is a combination of a high-level scripting language and a low-level bytecode language for running complex command sequences on spacecraft flight software. +## FPy Syntax +### Modules, components, channels, commands and types +You can imagine the FPy syntax as Python with the following mappings: +1. FPrime modules become Python namespaces +2. FPrime components become Python classes +3. FPrime types (structs, arrays and enums) become Python classes +4. FPrime component instances become Python object instances +5. FPrime commands become member functions of Python object instances +6. FPrime telemetry channels become member properties of Python object instances + +FPrime declaration: +``` +module Ref { + passive component ExampleComponent { + telemetry testChannel: U8 + sync command TEST_COMMAND(arg: string size 40) + } + + instance exampleInstance: ExampleComponent base id 0x01 +} +``` +FPy usage: +```py +# reference a telemetry channel +Ref.exampleInstance.testChannel +# call a command +Ref.exampleInstance.TEST_COMMAND("arg value") +``` + + +FPrime declaration: +``` +struct ExampleStruct { + member: F32 +} + +enum TestEnum { + ONE + TWO + THREE +} + +array TestArray = [3] U8 +``` + +FPy usage: +```py +# construct a struct +ExampleStruct(0.0) +# reference an enum const +TestEnum.THREE +# construct an array +TestArray(1, 2, 3) +``` + +### Sequence directives +FPy also has sequence directives, which are like commands that control the running sequence itself. + +The most common sequence directives are absolute and relative sleep: +```py +sleep_abs(Time(time_base, time_context, seconds, useconds)) +sleep_rel(Time(time_base, time_context, seconds, useconds)) +``` + +Due to the nature of the FPrime `CmdSequencer`, you can only have zero or one `sleep` directives before each command. + +## FPy Usage +``` +fprime-seq -d [-o ] + +A compiler for the FPrime advanced sequencing language + +positional arguments: + input The path of the input sequence to compile + +options: + -h, --help show this help message and exit + -d DICTIONARY, --dictionary DICTIONARY + The JSON topology dictionary to compile against + -o OUTPUT, --output OUTPUT + The output .bin file path. Defaults to the input file path +``` + +The result is a sequence binary file that works with the FPrime `CmdSequencer`. \ No newline at end of file From f34d676100572d52de68bc81b4c9bebd20fd730a Mon Sep 17 00:00:00 2001 From: Zimri Leisher Date: Thu, 7 Nov 2024 16:16:14 -0600 Subject: [PATCH 12/14] Fix codeql checks --- .github/actions/spelling/expect.txt | 6 +++ src/fprime_gds/common/sequence/compiler.py | 43 ++++++++++++++++------ 2 files changed, 37 insertions(+), 12 deletions(-) diff --git a/.github/actions/spelling/expect.txt b/.github/actions/spelling/expect.txt index b48310b4..efca2535 100644 --- a/.github/actions/spelling/expect.txt +++ b/.github/actions/spelling/expect.txt @@ -103,6 +103,7 @@ config configparser configs Consolas +consts cpp CPython creatingdocsetswithdoxygen @@ -110,6 +111,7 @@ css csum csv ctime +ctor CTORS curateable curated @@ -218,6 +220,7 @@ evt exe executables expanduser +Expr extlinks extns exts @@ -249,6 +252,8 @@ FONTSIZE fpp fprime fptable +fpy +Fpy frac framerate fromtimestamp @@ -623,6 +628,7 @@ staticmethod stderr Stdio stdout +stmt strftime stringified stringify diff --git a/src/fprime_gds/common/sequence/compiler.py b/src/fprime_gds/common/sequence/compiler.py index f2a0d531..418b147f 100644 --- a/src/fprime_gds/common/sequence/compiler.py +++ b/src/fprime_gds/common/sequence/compiler.py @@ -1,18 +1,22 @@ -import numbers -from dataclasses import dataclass -import inspect import ast from pathlib import Path from argparse import ArgumentParser import sys import logging -import datetime import zlib from fprime_gds.common.templates.ch_template import ChTemplate -from fprime_gds.executables.data_product_writer import IntegerType from fprime_gds.common.models.common.command import Descriptor from fprime_gds.common.utils.data_desc_type import DataDescType +from fprime.common.models.serialize.type_exceptions import ( + StringSizeException, + TypeMismatchException, + EnumMismatchException, + TypeRangeException, + ArrayLengthException, + IncorrectMembersException, + MissingMemberException, +) logging.basicConfig() logger = logging.getLogger(__file__) @@ -470,7 +474,7 @@ def construct_arg_type(self, arg: FpyArg) -> BaseType: try: type_instance._val = node.value - except BaseException as e: + except (StringSizeException, TypeMismatchException, TypeMismatchException) as e: arg.node.error = ( "Error while constructing argument " + str(arg.name) + ": " + str(e) ) @@ -479,7 +483,7 @@ def construct_arg_type(self, arg: FpyArg) -> BaseType: assert isinstance(node, FpyEnumConstant) try: type_instance.val = node.const_name - except BaseException as e: + except (TypeMismatchException, EnumMismatchException) as e: arg.node.error = ( "Error while constructing argument " + str(arg.name) + ": " + str(e) ) @@ -493,7 +497,11 @@ def construct_arg_type(self, arg: FpyArg) -> BaseType: if issubclass(fprime_type, SerializableType): try: type_instance.val = {a.name: a.type_instance.val for a in node.args} - except BaseException as e: + except ( + IncorrectMembersException, + MissingMemberException, + TypeMismatchException, + ) as e: arg.node.error = ( "Error while constructing argument " + str(arg.name) @@ -506,7 +514,7 @@ def construct_arg_type(self, arg: FpyArg) -> BaseType: val.append(a.type_instance.val) try: type_instance.val = val - except BaseException as e: + except (TypeMismatchException, ArrayLengthException) as e: arg.node.error = ( "Error while constructing argument " + str(arg.name) @@ -517,7 +525,7 @@ def construct_arg_type(self, arg: FpyArg) -> BaseType: assert len(node.args) == 4 try: type_instance = TimeType(*[a.type_instance.val for a in node.args]) - except BaseException as e: + except TypeRangeException as e: arg.node.error = ( "Error while constructing argument " + str(arg.name) @@ -706,7 +714,13 @@ def main(): type=Path, help="The JSON topology dictionary to compile against", ) - arg_parser.add_argument("-o", "--output", type=Path, help="The output .bin file path. Defaults to the input file path", default=None) + arg_parser.add_argument( + "-o", + "--output", + type=Path, + help="The output .bin file path. Defaults to the input file path", + default=None, + ) args = arg_parser.parse_args() @@ -715,12 +729,17 @@ def main(): node = ast.parse(input_text) output_bytes = compile(node, args.dictionary) + if output_bytes is None: + return 1 + output_path: Path = args.output if output_path is None: output_path = args.input.with_suffix(".bin") - + output_path.write_bytes(output_bytes) + return 0 + def compile(node: ast.Module, dictionary: Path) -> bytes: From 5a5eff918be7cea404f72ec25493402d1409f8e8 Mon Sep 17 00:00:00 2001 From: Zimri Leisher Date: Thu, 7 Nov 2024 16:20:37 -0600 Subject: [PATCH 13/14] Fix some more codeql things --- .github/actions/spelling/expect.txt | 8 ++++++++ src/fprime_gds/common/sequence/directive.py | 1 - src/fprime_gds/common/sequence/fpy_type.py | 1 - 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/actions/spelling/expect.txt b/.github/actions/spelling/expect.txt index efca2535..4824831d 100644 --- a/.github/actions/spelling/expect.txt +++ b/.github/actions/spelling/expect.txt @@ -35,6 +35,7 @@ autoapi AUTOBRIEF autocoded autocomplete +autocompletion Autodetected autodoc autogen @@ -77,6 +78,7 @@ CFDP CFPD cgi Chainable +chans chartjs checkbox CHNG @@ -120,6 +122,8 @@ customise cwd cxx daringfireball +dataclass +dataclasses dataobjects datastore datastructures @@ -221,6 +225,7 @@ exe executables expanduser Expr +expr extlinks extns exts @@ -254,6 +259,7 @@ fprime fptable fpy Fpy +fqn frac framerate fromtimestamp @@ -317,6 +323,7 @@ hyperlink hyperlinks idct idl +idx ieeetr ifconfig ified @@ -374,6 +381,7 @@ keepalive keyframes keyify kinda +kwarg kwargs len lestarch diff --git a/src/fprime_gds/common/sequence/directive.py b/src/fprime_gds/common/sequence/directive.py index 5f505850..823d9b9b 100644 --- a/src/fprime_gds/common/sequence/directive.py +++ b/src/fprime_gds/common/sequence/directive.py @@ -1,5 +1,4 @@ from dataclasses import dataclass -from fprime.common.models.serialize.string_type import StringType from fprime.common.models.serialize.type_base import BaseType from fprime.common.models.serialize.time_type import TimeType from enum import Enum diff --git a/src/fprime_gds/common/sequence/fpy_type.py b/src/fprime_gds/common/sequence/fpy_type.py index a5fb2bbd..b4582c6e 100644 --- a/src/fprime_gds/common/sequence/fpy_type.py +++ b/src/fprime_gds/common/sequence/fpy_type.py @@ -5,7 +5,6 @@ from fprime.common.models.serialize.type_base import ( BaseType, BaseType, - DictionaryType, ValueType, ) From d13580a030bc0afc5a618aec2aae3c92cf7e2b1f Mon Sep 17 00:00:00 2001 From: Zimri Leisher Date: Thu, 7 Nov 2024 16:27:50 -0600 Subject: [PATCH 14/14] Remove header generator for now --- .../common/sequence/header_generator.py | 162 ------------------ 1 file changed, 162 deletions(-) delete mode 100644 src/fprime_gds/common/sequence/header_generator.py diff --git a/src/fprime_gds/common/sequence/header_generator.py b/src/fprime_gds/common/sequence/header_generator.py deleted file mode 100644 index 792eca10..00000000 --- a/src/fprime_gds/common/sequence/header_generator.py +++ /dev/null @@ -1,162 +0,0 @@ -from argparse import ArgumentParser -import os -from pathlib import Path -import sys -import shutil - -from fprime_gds.common.loaders.ch_json_loader import ChJsonLoader -from fprime_gds.common.loaders.cmd_json_loader import CmdJsonLoader -from fprime.common.models.serialize.type_base import BaseType - -prompted_removal = False - - -def prompt_removal(path: Path): - global prompted_removal - if not prompted_removal: - while True: - allow_removal = input( - str(path.resolve()) - + " already exists. Allow overwriting existing dirs and files? [Y/n] " - ) - if allow_removal.lower() in ["n", "no"]: - # can't remove a dir we need to remove - exit(1) - if allow_removal.lower() in ["", "Y", "yes"]: - break - else: - print("Unknown option") - continue - prompted_removal = True - # only way out of the above loop is accepting it - - if path.is_dir(): - shutil.rmtree(str(path.resolve())) - else: - path.unlink() - - -# this function is a hack because we don't get explicit module hierarchy info in the json dict -def get_module_hierarchy( - cmd_names: list[str], type_names: list[str], ch_names: list[str] -) -> dict: - - component_names = [] - # get list of components that have cmds and tlm chans - for name in list(cmd_names) + list(ch_names): - parent_component = name.split(".")[:-1] - if parent_component not in component_names: - component_names.append(parent_component) - - modules = {} - - def add_namespace_to_dict(name): - - d = modules - - for mod in name: - if mod not in d: - d[mod] = {} - d = d[mod] - - for name in list(cmd_names) + list(ch_names): - # add the namespace of the component that contains these chs and cmds - add_namespace_to_dict(name.split(".")[:-2]) - - for type_name in type_names: - enclosing_name = type_name.split(".")[:-1] - # type_name could either be a module, or a component - if enclosing_name in component_names: - print("type " + type_name + " is in a component") - # if it's a component, add the next higher level to the module names - add_namespace_to_dict(enclosing_name[:-1]) - else: - # we think it might be a module (still could be a component with no cmds or tlm that has a type declared inside of it) - print("type " + type_name + " is NOT in a component") - add_namespace_to_dict(enclosing_name) - - - # get unique names - return modules - - -def generate_stubs(dictionary: Path, output_dir: Path) -> str: - cmd_json_dict_loader = CmdJsonLoader(dictionary) - (cmd_id_dict, cmd_name_dict, versions) = cmd_json_dict_loader.construct_dicts( - dictionary - ) - type_name_dict = cmd_json_dict_loader.parsed_types - - ch_json_dict_loader = ChJsonLoader(dictionary) - (ch_id_dict, ch_name_dict, versions) = ch_json_dict_loader.construct_dicts( - dictionary - ) - - modules = get_module_hierarchy( - cmd_name_dict.keys(), type_name_dict.keys(), ch_name_dict.keys() - ) - - def generate_module_folders(module, submodules): - # if not the root module - if module is not None: - module_folder: Path = output_dir / module - if module_folder.exists(): - prompt_removal(module_folder) - module_folder.mkdir(parents=True) - (module_folder / "__init__.py").touch() - - for submodule in submodules: - generate_module_folders(submodule, submodules[submodule]) - - generate_module_folders(None, modules) - - generate_types(type_name_dict) - - # okay, now generate folders for each module - # first generate all types - # then generate all components - # then generate all component instances - - -def generate_types(type_name_dict: dict[str, type[BaseType]]) -> str: - ac_type_str = "" - # for type_name, type_class in type_name_dict.items(): - # ac_type_str += generate_type(type_name, type_class) - - -def main(): - arg_parser = ArgumentParser( - description="A tool to generate Python stubs for IDE autocompletion for the FPrime advanced sequencing language" - ) - - arg_parser.add_argument( - "dictionary", - type=Path, - help="The JSON topology dictionary to generate Python stubs for", - ) - arg_parser.add_argument( - "-o", - "--output", - type=Path, - help="The output directory for the stubs", - default=Path(os.getcwd()), - ) - arg_parser.add_argument( - "-f", - "--force", - action="store_true", - help="If present, don't prompt to overwrite existing stubs", - ) - - args = arg_parser.parse_args() - - if args.force: - global prompted_removal - prompted_removal = True - - generate_stubs(args.dictionary, args.output) - return 0 - - -if __name__ == "__main__": - sys.exit(main())