docs/assets/js/6b210247.95683d32.js
"use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([[8353],{1276:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>a,contentTitle:()=>d,default:()=>o,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var s=r(4848),n=r(8453);const i={sidebar_position:6,title:"Requirements and Design"},d=void 0,l={id:"getting-started/requirements",title:"Requirements and Design",description:"OpenC3 COSMOS is a command and control system providing commanding, scripting, and data visualization capabilities for embedded systems and systems of systems. COSMOS is intended for use during all phases of testing (board, box, integrated system) and during operations.",source:"@site/docs/getting-started/requirements.md",sourceDirName:"getting-started",slug:"/getting-started/requirements",permalink:"/docs/getting-started/requirements",draft:!1,unlisted:!1,editUrl:"https://github.com/OpenC3/cosmos/tree/main/docs.openc3.com/docs/getting-started/requirements.md",tags:[],version:"current",sidebarPosition:6,frontMatter:{sidebar_position:6,title:"Requirements and Design"},sidebar:"defaultSidebar",previous:{title:"Key Concepts",permalink:"/docs/getting-started/key_concepts"},next:{title:"Podman",permalink:"/docs/getting-started/podman"}},a={},c=[{value:"Terminology",id:"terminology",level:2},{value:"Overall Architecture and Context Diagram",id:"overall-architecture-and-context-diagram",level:2},{value:"Overall Requirements",id:"overall-requirements",level:2},{value:"Api Requirements",id:"api-requirements",level:2},{value:"Command and Telemetry Server",id:"command-and-telemetry-server",level:2},{value:"Limits Monitor",id:"limits-monitor",level:2},{value:"Command Sender",id:"command-sender",level:2},{value:"Script Runner",id:"script-runner",level:2},{value:"Packet Viewer",id:"packet-viewer",level:2},{value:"Telemetry Viewer",id:"telemetry-viewer",level:2},{value:"Telemetry Grapher",id:"telemetry-grapher",level:2},{value:"Data Extractor",id:"data-extractor",level:2},{value:"Data Viewer",id:"data-viewer",level:2},{value:"Calendar",id:"calendar",level:2},{value:"Admin",id:"admin",level:2}];function h(e){const t={h2:"h2",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.p,{children:"OpenC3 COSMOS is a command and control system providing commanding, scripting, and data visualization capabilities for embedded systems and systems of systems. COSMOS is intended for use during all phases of testing (board, box, integrated system) and during operations."}),"\n",(0,s.jsx)(t.p,{children:"COSMOS is currently made up of the following applications:"}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Command and Telemetry Server"})," - Provides status of realtime commanding, telemetry reception, logging, limits monitoring, and packet routing."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Limits Monitor"})," - Monitors telemetry with defined limits and shows items that currently are or have violated limits."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Command Sender"})," - Provides a graphical interface for manually sending individual commands."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Script Runner"})," - Executes scripts and provides highlighting of the currently executing line. Now also includes TestRunner functionality."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Packet Viewer"})," - Provides realtime visualization of every telemetry packet that has been defined."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Telemetry Viewer"})," - Provides custom telemetry screen functionality with advanced layout and visualization widgets."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Telemetry Grapher"})," - Provides realtime and offline graphing of telemetry data."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Data Extractor"})," - Extracts telemetry and command packet log files into CSV data."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Data Viewer"})," - Provides text based telemetry visualization for items."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Bucket Explorer"})," - Browse the COSMOS bucket storage in any cloud environment."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Table Manager"})," - Binary file editor with Script Runner integration for upload / download."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Handbooks"})," - Generate html page of the command and telemetry definitions."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Calendar"})," - Provides scheduling of commands and scripts. Also provides a framework for reserving resources."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Admin"})," - Provides an administrative interface to COSMOS."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"More detailed descriptions, requirements, and design for each tool are found later in this document. Additionally, each of the above applications is built using COSMOS libraries that are available for use as a framework to develop custom program/project applications."}),"\n",(0,s.jsx)(t.h2,{id:"terminology",children:"Terminology"}),"\n",(0,s.jsx)(t.p,{children:"The COSMOS system uses several terms that are important to understand. The following table defines these terms."}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Term"}),(0,s.jsx)(t.th,{children:"Definition"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Target"}),(0,s.jsx)(t.td,{children:"A COSMOS target is an embedded system that the COSMOS Command and Telemetry Server connects to using an interface in order to send commands to and/or receive telemetry from."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Command"}),(0,s.jsx)(t.td,{children:"A packet of information telling a target to perform an action of some sort."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Telemetry Packet"}),(0,s.jsx)(t.td,{children:"A packet of information providing status from a target."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Interface"}),(0,s.jsx)(t.td,{children:"A Ruby class that knows how to send commands to and/or receive telemetry from a target. COSMOS comes with interfaces that support TCP/IP, UDP, and serial connections. Custom interfaces are easy to add to the system."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Ruby"}),(0,s.jsx)(t.td,{children:"The powerful dynamic programming language used to write the COSMOS applications and libraries as well as COSMOS scripts and test procedures."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Configuration Files"}),(0,s.jsx)(t.td,{children:"COSMOS uses simple plain text configuration files to define commands and telemetry packets, and to configure each COSMOS application. These files are easily human readable/editable and machine readable/editable."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Packet Log Files"}),(0,s.jsx)(t.td,{children:"Binary files containing either logged commands or telemetry packets."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Message Log Files"}),(0,s.jsx)(t.td,{children:"Text files containing messages generated by the system."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"Tool"}),(0,s.jsx)(t.td,{children:"Another name for a COSMOS application."})]})]})]}),"\n",(0,s.jsx)(t.h2,{id:"overall-architecture-and-context-diagram",children:"Overall Architecture and Context Diagram"}),"\n",(0,s.jsx)(t.p,{children:"The following diagram shows the COSMOS 5 architecture."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"COSMOS Architecture",src:r(324).A+"",width:"1155",height:"538"})}),"\n",(0,s.jsx)(t.p,{children:"Key aspects of this architecture:"}),"\n",(0,s.jsx)(t.p,{children:"COSMOS 5 is a cloud native, containerized, microservice oriented command and control system. All the COSMOS microservices are docker containers which is why Docker is shown containing the entire COSMOS system. The green boxes on the left represent external embedded systems (Targets) which COSMOS connects to. The Redis data store contains the configuration for all the microservices, the current value table, as well as data streams containing decommutated data. The Minio data store contains plugins, targets, configuration data, text logs as well as binary logs of all the raw, decommutated, and reduced data. Users interact with COSMOS from a web browser which routes through the internal Traefik load balancer."}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"COSMOS can connect to many different kinds of targets. The examples include things like Flight software (FSW), Ground Support Equipment (GSE), Labview, and COTS targets such as an Agilent power supply. Any embedded system that provides a communication interface can be connected to COSMOS."}),"\n",(0,s.jsx)(t.li,{children:"COSMOS ships with interfaces for connecting over TCP/IP, UDP, MQTT, and serial connections. This covers most systems, but custom interfaces can also be written to connect to anything."}),"\n",(0,s.jsx)(t.li,{children:"All realtime communication with targets flows through the COSMOS system. This ensures all commands and telemetry are logged."}),"\n",(0,s.jsx)(t.li,{children:"Every tool is configured with plain text configuration files."}),"\n",(0,s.jsx)(t.li,{children:"Program specific tools can be written using the COSMOS libraries that can interact with the realtime command and telemetry streams and can process logged data."}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"overall-requirements",children:"Overall Requirements"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Reqt. ID"}),(0,s.jsx)(t.th,{children:"Description"}),(0,s.jsx)(t.th,{children:"Test Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"COSMOS-1"}),(0,s.jsx)(t.td,{children:"All COSMOS core functionality shall be containerized."}),(0,s.jsx)(t.td,{children:"Verify COSMOS is running in Docker"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"COSMOS-2"}),(0,s.jsx)(t.td,{children:"The COSMOS user interface shall be accessible from Chromium based web browsers"}),(0,s.jsx)(t.td,{children:"Open COSMOS in Chrome/Edge"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"COSMOS-3"}),(0,s.jsx)(t.td,{children:"The COSMOS user interface shall be accessible from the Firefox web browser"}),(0,s.jsx)(t.td,{children:"Open COSMOS in Firefox"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"COSMOS-4"}),(0,s.jsx)(t.td,{children:"COSMOS shall log all commands sent"}),(0,s.jsx)(t.td,{})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"COSMOS-5"}),(0,s.jsx)(t.td,{children:"COSMOS shall log all telemetry received"}),(0,s.jsx)(t.td,{})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"COSMOS-6"}),(0,s.jsx)(t.td,{children:"COSMOS shall decommutate all telemetry packets received"}),(0,s.jsx)(t.td,{})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"COSMOS-7"}),(0,s.jsx)(t.td,{children:"COSMOS shall support autonomously attempting to connect to targets."}),(0,s.jsx)(t.td,{children:"Verify targets are connected upon starting the CTS."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"COSMOS-8"}),(0,s.jsx)(t.td,{children:"COSMOS shall time stamp telemetry packets upon receipt."}),(0,s.jsx)(t.td,{children:"Verify logged packets are timestamped."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"COSMOS-9"}),(0,s.jsx)(t.td,{children:"COSMOS shall time stamp telemetry packets to a resolution of 1 millisecond or better. Note: This requirement only refers to resolution. COSMOS does not run on real-time operating systems and accuracy cannot be guaranteed."}),(0,s.jsx)(t.td,{children:"View time stamps in log."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"COSMOS-10"}),(0,s.jsx)(t.td,{children:"COSMOS shall time stamp received telemetry with a UTC timestamp."}),(0,s.jsx)(t.td,{children:"Verify logged time stamps are as expected."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"COSMOS-11"}),(0,s.jsx)(t.td,{children:"COSMOS shall maintain a timestamped log of commands received, limits violations, and errors encountered."}),(0,s.jsx)(t.td,{children:"View COSMOS message log."})]})]})]}),"\n",(0,s.jsx)(t.h2,{id:"api-requirements",children:"Api Requirements"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Reqt. ID"}),(0,s.jsx)(t.th,{children:"Description"}),(0,s.jsx)(t.th,{children:"Test Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"API-1"}),(0,s.jsx)(t.td,{children:"The COSMOS API shall allow scripted connection and disconnection of interfaces."}),(0,s.jsx)(t.td,{children:"Disconnect and connect an interface from a script."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"API-2"}),(0,s.jsx)(t.td,{children:"The COSMOS API shall allow scripted connection and disconnection of routers."}),(0,s.jsx)(t.td,{children:"Disconnect and connect a router from a script."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"API-3"}),(0,s.jsx)(t.td,{children:"The COSMOS API shall allow scripted setting of the current limits set."}),(0,s.jsx)(t.td,{children:"Select a different limits set from a script."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"API-4"}),(0,s.jsx)(t.td,{children:"The COSMOS API shall allow commanding of targets"}),(0,s.jsx)(t.td,{children:"Send a command"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"API-5"}),(0,s.jsx)(t.td,{children:"The COSMOS API shall allow reading the current value of any telemetry item"}),(0,s.jsx)(t.td,{children:"Read a telemetry point"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"API-6"}),(0,s.jsx)(t.td,{children:"The COSMOS API shall allow streaming realtime and logged telemetry packets"}),(0,s.jsx)(t.td,{children:"Stream telemetry packets"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"API-7"}),(0,s.jsx)(t.td,{children:"The COSMOS API shall allow streaming realtime and logged command packets"}),(0,s.jsx)(t.td,{children:"Stream command packets"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"API-8"}),(0,s.jsx)(t.td,{children:"The COSMOS API shall allow starting COSMOS scripts"}),(0,s.jsx)(t.td,{children:"Start a script using the API"})]})]})]}),"\n",(0,s.jsx)(t.h2,{id:"command-and-telemetry-server",children:"Command and Telemetry Server"}),"\n",(0,s.jsx)(t.p,{children:"The Command and Telemetry server provides status on the the overall COSMOS installation for a specific scope."}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Reqt. ID"}),(0,s.jsx)(t.th,{children:"Description"}),(0,s.jsx)(t.th,{children:"Test Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"CTS-1"}),(0,s.jsx)(t.td,{children:"The Command and Telemetry Server shall display a list of all interfaces."}),(0,s.jsx)(t.td,{children:"View the Interfaces tab."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"CTS-2"}),(0,s.jsx)(t.td,{children:"The Command and Telemetry Server shall allow manual connection and disconnection of interfaces."}),(0,s.jsx)(t.td,{children:"Press a GUI button to disconnect and connect an interface."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"CTS-3"}),(0,s.jsx)(t.td,{children:"The Command and Telemetry Server shall display a list of all targets."}),(0,s.jsx)(t.td,{children:"View the Targets tab."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"CTS-4"}),(0,s.jsx)(t.td,{children:"The Command and Telemetry Server shall display a list of known commands."}),(0,s.jsx)(t.td,{children:"View the Cmd Packets tab."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"CTS-5"}),(0,s.jsx)(t.td,{children:"The Command and Telemetry Server shall display raw command data for the most recent command received."}),(0,s.jsx)(t.td,{children:"View the Cmd Packets tab and click the View Raw button for a command."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"CTS-6"}),(0,s.jsx)(t.td,{children:"The Command and Telemetry Server shall display a list of known telemetry packets."}),(0,s.jsx)(t.td,{children:"View the Tlm Packets tab."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"CTS-7"}),(0,s.jsx)(t.td,{children:"The Command and Telemetry Server shall display raw telemetry packet data for the most recent telemetry packet received."}),(0,s.jsx)(t.td,{children:"View the Tlm Packets tab and click the View Raw button for a telemetry packet."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"CTS-8"}),(0,s.jsx)(t.td,{children:"The Command and Telemetry Server shall display a list of all routers."}),(0,s.jsx)(t.td,{children:"View the Routers tab."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"CTS-9"}),(0,s.jsx)(t.td,{children:"The Command and Telemetry Server shall allow manual connection and disconnection of routers."}),(0,s.jsx)(t.td,{children:"Press a GUI button to disconnect and connect a router."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"CTS-10"}),(0,s.jsx)(t.td,{children:"The Command and Telemetry Server shall allow manually setting the current limits set."}),(0,s.jsx)(t.td,{children:"Select a different limits set from the combobox."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"CTS-11"}),(0,s.jsx)(t.td,{children:"The Command and Telemetry Server shall support opening telemetry packets in Packet Viewer."}),(0,s.jsx)(t.td,{children:"On the Tlm Packets tab click View in Packet Viewer for a telemetry packet."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"CTS-12"}),(0,s.jsx)(t.td,{children:"The Command and Telemetry Server shall display time stamps in local time."}),(0,s.jsx)(t.td,{children:"View time stamps in log."})]})]})]}),"\n",(0,s.jsx)(t.h2,{id:"limits-monitor",children:"Limits Monitor"}),"\n",(0,s.jsx)(t.p,{children:"Limits Monitor displays all telemetry points that are currently out of limits and also shows any telemetry points that have gone out of limits since Limits Monitor was started."}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Reqt. ID"}),(0,s.jsx)(t.th,{children:"Description"}),(0,s.jsx)(t.th,{children:"Test Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"LM-1"}),(0,s.jsx)(t.td,{children:"Limits Monitor shall display all telemetry points currently out of limits."}),(0,s.jsx)(t.td,{children:"View displayed telemetry points."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"LM-2"}),(0,s.jsx)(t.td,{children:"Limits Monitor shall support ignoring telemetry points."}),(0,s.jsx)(t.td,{children:"Click ignore on a telemetry point."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"LM-3"}),(0,s.jsx)(t.td,{children:"Limits Monitor shall keep a displayed log of limits violations."}),(0,s.jsx)(t.td,{children:"View the log tab."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"LM-4"}),(0,s.jsx)(t.td,{children:"Limits Monitor shall continue displaying a telemetry point that temporarily went out of limits."}),(0,s.jsx)(t.td,{children:"Watch until a telemetry points returns to green."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"LM-5"}),(0,s.jsx)(t.td,{children:"Limits Monitor shall support saving its configuration."}),(0,s.jsx)(t.td,{children:"Save the configuration."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"LM-6"}),(0,s.jsx)(t.td,{children:"Limits Monitor shall support loading its configuration."}),(0,s.jsx)(t.td,{children:"Load the configuration."})]})]})]}),"\n",(0,s.jsx)(t.h2,{id:"command-sender",children:"Command Sender"}),"\n",(0,s.jsx)(t.p,{children:"Command Sender provides an easy method to send single commands to targets. The graphical user interface provides simple dropdowns to quickly select the desired command to send organized by target name and command name. After the user has selected the command, they then fill in the desired command parameters and click send to send the command to the target."}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Reqt. ID"}),(0,s.jsx)(t.th,{children:"Description"}),(0,s.jsx)(t.th,{children:"Test Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"CMD-1"}),(0,s.jsx)(t.td,{children:"Command Sender shall allow selection of a command by target name and packet name."}),(0,s.jsx)(t.td,{children:"Select a specific command by target name and packet name in the drop down menus."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"CMD-2"}),(0,s.jsx)(t.td,{children:"Command Sender shall allow sending the selected command."}),(0,s.jsx)(t.td,{children:"Send the selected command by pressing the Send button."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"CMD-3"}),(0,s.jsx)(t.td,{children:"Command Sender shall display non-ignored parameters for the selected command."}),(0,s.jsx)(t.td,{children:"Select a specific command and verify the expected parameters are shown."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"CMD-4"}),(0,s.jsx)(t.td,{children:"Command Sender shall provide a mechanism to select state values for command parameters with states."}),(0,s.jsx)(t.td,{children:"Select a specific state value for a specific command with states."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"CMD-5"}),(0,s.jsx)(t.td,{children:"Command Sender shall allow sending a manually entered value for a command parameter with states."}),(0,s.jsx)(t.td,{children:"Manually enter a value for a specific command with states."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"CMD-6"}),(0,s.jsx)(t.td,{children:"Command Sender shall refuse to send commands if required parameters are not provided."}),(0,s.jsx)(t.td,{children:"Attempt to send a command with a required parameter not filled out."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"CMD-7"}),(0,s.jsx)(t.td,{children:"Command Sender shall support sending commands while ignoring range checking."}),(0,s.jsx)(t.td,{children:"Enter Ignore Range Checking mode and then send a command with an out of range parameter."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"CMD-8"}),(0,s.jsx)(t.td,{children:"Command Sender shall optionally display state values in hex."}),(0,s.jsx)(t.td,{children:'Enter "Display State Values in Hex" mode and verify state values are displayed as hex.'})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"CMD-9"}),(0,s.jsx)(t.td,{children:"Command Sender shall optionally display ignored command parameters."}),(0,s.jsx)(t.td,{children:'Enter "Show Ignored Parameters" mode and verify ignored parameters are displayed.'})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"CMD-10"}),(0,s.jsx)(t.td,{children:"Command Sender shall respect hazardous commands and notify the user before proceeding."}),(0,s.jsx)(t.td,{children:"Send a hazardous command and verify a dialog box appears before the command is sent. Verify both accepting the dialog and declining to send."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"CMD-11"}),(0,s.jsx)(t.td,{children:"Command Sender shall keep a command history of each command sent."}),(0,s.jsx)(t.td,{children:"Send a command and verify that it shows up in the command history box."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"CMD-12"}),(0,s.jsx)(t.td,{children:"Command Sender shall allow resending of any command in the command history."}),(0,s.jsx)(t.td,{children:"Resend one of the commands in the command history box."})]})]})]}),"\n",(0,s.jsx)(t.h2,{id:"script-runner",children:"Script Runner"}),"\n",(0,s.jsx)(t.p,{children:"Script Runner provides a visual interface for editing and executing scripts/procedures. A full featured text editor provides syntax highlighting and code completion while developing scripts. During script execution, the currently executing line is highlighted and any logged messages are highlighted to the user. If any failure occurs, the script is paused and the user alerted. The user can then decide whether to stop the script, or ignore the failure and continue. The user can also retry the failed lines, or other nearby lines before proceeding."}),"\n",(0,s.jsx)(t.p,{children:"Script Runner now also provides a structured methodology for designing system level scripting that mirrors the very successful pattern used in software unit tests (previously implemented in the Test Runner tool). System level tests/procedures are built up of cases that are organized into groups. For example, you might have one group that verified all of the requirements associated with a particular mechanism. Ideally you would break this down into individual cases for different scenarios. One perhaps for opening a shutter, another for closing it, etc. Cases are ideally small and independent tasks. A number of these groups are then combined into an overall suite which would be run to execute a major test such as EMI, or software FQT."}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Reqt. ID"}),(0,s.jsx)(t.th,{children:"Description"}),(0,s.jsx)(t.th,{children:"Test Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SR-1"}),(0,s.jsx)(t.td,{children:"Script Runner shall provide a text editor for developing test scripts."}),(0,s.jsx)(t.td,{children:"Open Script Runner and create a simple test script. Perform all standard file operations including New, Open, Reload, Close, Save, and Save As. Perform all standard editing operations such as Cut, Copy, Paste, Undo, Redo, Select All, and Comment/Uncomment lines."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SR-2"}),(0,s.jsx)(t.td,{children:"Script Runner shall provide search and replace functionality."}),(0,s.jsx)(t.td,{children:"Perform all standard search and replace functionality, including search, replace, find next, and find previous."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SR-3"}),(0,s.jsx)(t.td,{children:"Script Runner shall provide code completion for cmd(), tlm(), and wait_check() COSMOS API methods. Note: Other methods may also be supported."}),(0,s.jsx)(t.td,{children:"Create a script and exercise code completion on the mentioned keywords."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SR-4"}),(0,s.jsx)(t.td,{children:"Script Runner shall execute Ruby-based COSMOS scripts."}),(0,s.jsx)(t.td,{children:"Press start and execute a script."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SR-5"}),(0,s.jsx)(t.td,{children:"Script Runner shall highlight the currently executing line of the script."}),(0,s.jsx)(t.td,{children:"Verify that lines are highlighted as a test script executes."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SR-6"}),(0,s.jsx)(t.td,{children:"Script Runner shall allow pausing an executing script."}),(0,s.jsx)(t.td,{children:"Press pause button and verify script is paused. Press start to resume."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SR-7"}),(0,s.jsx)(t.td,{children:"Script Runner shall allow stopping an executing script."}),(0,s.jsx)(t.td,{children:"Press stop and verify script stops."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SR-8"}),(0,s.jsx)(t.td,{children:"Script Runner shall pause an executing script upon the occurrence of an error."}),(0,s.jsx)(t.td,{children:"Create a script with a statement that is guaranteed to fail and verify that the script is paused."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SR-9"}),(0,s.jsx)(t.td,{children:"Script Runner shall log commands sent."}),(0,s.jsx)(t.td,{children:"Execute a script that sends a command and verify it is logged."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SR-10"}),(0,s.jsx)(t.td,{children:"Script Runner shall log text written to STDOUT. Note: Typically through the puts method."}),(0,s.jsx)(t.td,{children:"Execute a script that uses puts to write a message and verify it is logged."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SR-11"}),(0,s.jsx)(t.td,{children:"Script Runner shall log wait times."}),(0,s.jsx)(t.td,{children:"Execute a script that includes a wait method and verify wait time is logged."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SR-12"}),(0,s.jsx)(t.td,{children:"Script Runner shall log errors that occur while the script is executing."}),(0,s.jsx)(t.td,{children:"Create a script with a check statement that is guaranteed to fail and verify it is logged."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SR-13"}),(0,s.jsx)(t.td,{children:"Script Runner shall log check statement success and failure."}),(0,s.jsx)(t.td,{children:"Create a script with a check statement that is guaranteed to fail and one that is guaranteed to succeed. Verify both the success and failure are logged."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SR-14"}),(0,s.jsx)(t.td,{children:"Script Runner shall support executing selected lines."}),(0,s.jsx)(t.td,{children:"Select a set of lines and execute them using Script->Execute Selected Lines."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SR-15"}),(0,s.jsx)(t.td,{children:"Script Runner shall support executing selected lines while paused."}),(0,s.jsx)(t.td,{children:"Select a set of lines and execute them from the right-click context menu."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SR-16"}),(0,s.jsx)(t.td,{children:"Script Runner shall support starting a script from any line."}),(0,s.jsx)(t.td,{children:"Place the mouse cursor at the desired first line and then select Script->Execute From Cursor."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SR-17"}),(0,s.jsx)(t.td,{children:"Script Runner shall support a mnemonic checking function."}),(0,s.jsx)(t.td,{children:"Select Script->Mnemonic Check."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SR-18"}),(0,s.jsx)(t.td,{children:"Script Runner shall support a syntax checking function."}),(0,s.jsx)(t.td,{children:"Select Script->Ruby Syntax Check."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SR-19"}),(0,s.jsx)(t.td,{children:"Script Runner shall support viewing the script instrumentation."}),(0,s.jsx)(t.td,{children:"Select Script->View Instrumented Script."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SR-20"}),(0,s.jsx)(t.td,{children:"Script Runner shall support an disconnected mode to allow for executing scripts without a connection to the Command and Telemetry Server."}),(0,s.jsx)(t.td,{children:"Select Script->Toggle Disconnect. Execute a script with commands and check statements and verify that it runs to completion."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SR-21"}),(0,s.jsx)(t.td,{children:"Script Runner shall support a Debug terminal to aid in debugging scripts."}),(0,s.jsx)(t.td,{children:"Select Script->Toggle Debug."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SR-22"}),(0,s.jsx)(t.td,{children:"Script Runner shall support a step mode where the script will stop and wait for use interaction after each line."}),(0,s.jsx)(t.td,{children:"Press Step to progress through the script."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SR-23"}),(0,s.jsx)(t.td,{children:"Script Runner shall support breakpoint functionality."}),(0,s.jsx)(t.td,{children:"Create a breakpoint then execute the script and verify it stops at the specified line."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SR-25"}),(0,s.jsx)(t.td,{children:"Script Runner Suite Mode shall support executing individual test suites."}),(0,s.jsx)(t.td,{children:"Execute an individual test suite."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SR-26"}),(0,s.jsx)(t.td,{children:"Script Runner Suite Mode shall support executing individual test groups."}),(0,s.jsx)(t.td,{children:"Execute an individual test group."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SR-27"}),(0,s.jsx)(t.td,{children:"Script Runner Suite Mode shall support executing individual test cases."}),(0,s.jsx)(t.td,{children:"Execute an individual test case."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SR-28"}),(0,s.jsx)(t.td,{children:"Script Runner Suite Mode shall support executing test group setup and teardown methods individually."}),(0,s.jsx)(t.td,{children:"Execute a test group setup. Execute a test group teardown."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SR-29"}),(0,s.jsx)(t.td,{children:"Script Runner Suite Mode shall support executing test suite setup and teardown methods individually."}),(0,s.jsx)(t.td,{children:"Execute a test suite setup. Execute a test suite teardown."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SR-30"}),(0,s.jsx)(t.td,{children:"Script Runner Suite Mode shall create a report after executing any suite test."}),(0,s.jsx)(t.td,{children:"Verify a report is generated after executing a suite."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SR-31"}),(0,s.jsx)(t.td,{children:"Script Runner Suite Mode shall support pausing when an error occurs."}),(0,s.jsx)(t.td,{children:"Execute a test script with the pause on error box checked and without."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SR-32"}),(0,s.jsx)(t.td,{children:"Script Runner Suite Mode shall support allowing the user to proceed on an error."}),(0,s.jsx)(t.td,{children:"Execute a test script with the Allow go/retry on error box checked and without."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SR-33"}),(0,s.jsx)(t.td,{children:"Script Runner Suite Mode shall support aborting execution on an error."}),(0,s.jsx)(t.td,{children:"Execute a test script with the abort on error box checked and without."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SR-34"}),(0,s.jsx)(t.td,{children:"Script Runner Suite Mode shall support looping a test."}),(0,s.jsx)(t.td,{children:"Execute a test script with the loop testing box checked and without."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SR-35"}),(0,s.jsx)(t.td,{children:"Script Runner Suite Mode shall support breaking the looping of a test on error."}),(0,s.jsx)(t.td,{children:"Execute a test script with the break loop on error box checked and without."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SR-36"}),(0,s.jsx)(t.td,{children:"Script Runner Suite Mode shall support a user readable flag indicating that loop testing is occurring."}),(0,s.jsx)(t.td,{children:"Execute a test script that checks the $loop_testing variable while looping and again while not looping."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"SR-37"}),(0,s.jsx)(t.td,{children:"Script Runner Suite Mode shall support a user readable flag indicating manual operations are desired."}),(0,s.jsx)(t.td,{children:"Execute a test script with the manual box checked and without."})]})]})]}),"\n",(0,s.jsx)(t.h2,{id:"packet-viewer",children:"Packet Viewer"}),"\n",(0,s.jsx)(t.p,{children:"Packet Viewer provides a simple tool to view the realtime contents of any telemetry packet defined in the system in a tabular, key-value format."}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Reqt. ID"}),(0,s.jsx)(t.th,{children:"Description"}),(0,s.jsx)(t.th,{children:"Test Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"PV-1"}),(0,s.jsx)(t.td,{children:"Packet Viewer shall allow selection of a telemetry packet by target name and packet name."}),(0,s.jsx)(t.td,{children:"Select a specific telemetry packet by target name and packet name in the drop down menus."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"PV-2"}),(0,s.jsx)(t.td,{children:"Packet Viewer shall display the contents of the selected telemetry packet."}),(0,s.jsx)(t.td,{children:"Ensure all items of the selected telemetry packet are displayed and updating."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"PV-3"}),(0,s.jsx)(t.td,{children:"Packet Viewer shall provide a mechanism to get detailed information on a telemetry item."}),(0,s.jsx)(t.td,{children:'Right click on a telemetry item and select "Details" from the context menu.'})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"PV-4"}),(0,s.jsx)(t.td,{children:"Packet Viewer shall provide a mechanism to view a graph of any telemetry item."}),(0,s.jsx)(t.td,{children:'Right click on a telemetry item and select "Graph" from the context menu.'})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"PV-5"}),(0,s.jsx)(t.td,{children:"Packet Viewer shall color telemetry values based upon limits state."}),(0,s.jsx)(t.td,{children:"View a packet with items containing limits and verify they are colored."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"PV-6"}),(0,s.jsx)(t.td,{children:"Packet Viewer shall support a configurable polling rate."}),(0,s.jsx)(t.td,{children:"Select File->Options and change the polling rate."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"PV-7"}),(0,s.jsx)(t.td,{children:"Packet Viewer shall support a color-blind mode to allow distinguishing limits states for those who are color blind."}),(0,s.jsx)(t.td,{children:"Select View->Color Blind Mode and verify that items with limits are also displayed with a textual indication of limits state color."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"PV-8"}),(0,s.jsx)(t.td,{children:"Packet Viewer shall support displaying telemetry in each of the four COSMOS value types (raw, converted, formatted, and formatted with units)"}),(0,s.jsx)(t.td,{children:"In the View menu, select each of the four value types and verify values are displayed accordingly."})]})]})]}),"\n",(0,s.jsx)(t.h2,{id:"telemetry-viewer",children:"Telemetry Viewer"}),"\n",(0,s.jsx)(t.p,{children:'Telemetry Viewer provides a way to organize telemetry points into custom "screens" that allow for the creation of unique and organized views of telemetry data. Screens are made up of widgets or small GUI components that display telemetry in unique ways.'}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Reqt. ID"}),(0,s.jsx)(t.th,{children:"Description"}),(0,s.jsx)(t.th,{children:"Test Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"TV-1"}),(0,s.jsx)(t.td,{children:"Telemetry Viewer shall display user-defined telemetry screens."}),(0,s.jsx)(t.td,{children:"Open a telemetry"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"TV-2"}),(0,s.jsx)(t.td,{children:"Telemetry Viewer shall display realtime data."}),(0,s.jsx)(t.td,{children:"Verify telemetry screens show realtime data."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"TV-3"}),(0,s.jsx)(t.td,{children:"Telemetry Viewer shall support saving open telemetry screens and their positions."}),(0,s.jsx)(t.td,{children:"Open three telemetry screens and then select File->Save Configuration."})]})]})]}),"\n",(0,s.jsx)(t.h2,{id:"telemetry-grapher",children:"Telemetry Grapher"}),"\n",(0,s.jsx)(t.p,{children:"Telemetry Grapher performs graphing of telemetry points in both realtime and log file playback."}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Reqt. ID"}),(0,s.jsx)(t.th,{children:"Description"}),(0,s.jsx)(t.th,{children:"Test Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"TG-1"}),(0,s.jsx)(t.td,{children:"Telemetry Grapher shall provide line graphs of telemetry points."}),(0,s.jsx)(t.td,{children:"Add several housekeeping data objects to a plot."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"TG-2"}),(0,s.jsx)(t.td,{children:"Telemetry Grapher shall support realtime graphing of telemetry."}),(0,s.jsx)(t.td,{children:"Press Start to start realtime graphing."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"TG-3"}),(0,s.jsx)(t.td,{children:"Telemetry Grapher shall support graphing data from logged telemetry."}),(0,s.jsx)(t.td,{children:"Select the menu option to graph data from a logged data"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"TG-4"}),(0,s.jsx)(t.td,{children:"Telemetry Grapher shall support multiple plots per browser tab."}),(0,s.jsx)(t.td,{children:"Add multiple plots."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"TG-5"}),(0,s.jsx)(t.td,{children:"Telemetry Grapher shall support multiple telemetry points per plot."}),(0,s.jsx)(t.td,{children:"Add multiple data objects to one plot."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"TG-6"}),(0,s.jsx)(t.td,{children:"Telemetry Grapher shall support saving a variable number of data points."}),(0,s.jsx)(t.td,{children:"Edit Points Saved."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"TG-7"}),(0,s.jsx)(t.td,{children:"Telemetry Grapher shall support graphing a variable duration of time."}),(0,s.jsx)(t.td,{children:"Edit Seconds Plotted."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"TG-8"}),(0,s.jsx)(t.td,{children:"Telemetry Grapher shall support graphing a variable number of data points."}),(0,s.jsx)(t.td,{children:"Edit Points Plotted."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"TG-9"}),(0,s.jsx)(t.td,{children:"Telemetry Grapher shall support saving its configuration."}),(0,s.jsx)(t.td,{children:"Save the current configuration."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"TG-10"}),(0,s.jsx)(t.td,{children:"Telemetry Grapher shall support loading its configuration."}),(0,s.jsx)(t.td,{children:"Load the previously saved configuration."})]})]})]}),"\n",(0,s.jsx)(t.h2,{id:"data-extractor",children:"Data Extractor"}),"\n",(0,s.jsx)(t.p,{children:"Data Extractor processes logged data and extracts data into a CSV format for analysis in Excel or other tools."}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Reqt. ID"}),(0,s.jsx)(t.th,{children:"Description"}),(0,s.jsx)(t.th,{children:"Test Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"DE-1"}),(0,s.jsx)(t.td,{children:"Data Extractor shall support adding individual telemetry points."}),(0,s.jsx)(t.td,{children:"Add an individual telemetry point."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"DE-2"}),(0,s.jsx)(t.td,{children:"Data Extractor shall support adding entire telemetry packets."}),(0,s.jsx)(t.td,{children:"Add an entire packet."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"DE-3"}),(0,s.jsx)(t.td,{children:"Data Extractor shall support adding entire telemetry targets."}),(0,s.jsx)(t.td,{children:"Add all packets for a target."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"DE-4"}),(0,s.jsx)(t.td,{children:"Data Extractor shall support selecting the value type to extract for each telemetry point (RAW, CONVERTED, FORMATTED, WITH_UNITS)"}),(0,s.jsx)(t.td,{children:"Click an item and change the value type."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"DE-5"}),(0,s.jsx)(t.td,{children:"Data Extractor shall support saving configurations."}),(0,s.jsx)(t.td,{children:"Select File->Save Config"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"DE-6"}),(0,s.jsx)(t.td,{children:"Data Extractor shall support loading configurations."}),(0,s.jsx)(t.td,{children:"Select File->Load Config"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"DE-7"}),(0,s.jsx)(t.td,{children:"Data Extractor shall support deleting items"}),(0,s.jsx)(t.td,{children:"Select an Item and press delete"})]})]})]}),"\n",(0,s.jsx)(t.h2,{id:"data-viewer",children:"Data Viewer"}),"\n",(0,s.jsx)(t.p,{children:"Data Viewer provides for textual display of telemetry packets where other display methods are not a good fit. It is especially useful for memory dumps and for log message type data display."}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Reqt. ID"}),(0,s.jsx)(t.th,{children:"Description"}),(0,s.jsx)(t.th,{children:"Test Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"DV-1"}),(0,s.jsx)(t.td,{children:"Data Viewer shall support realtime processing of telemetry packets."}),(0,s.jsx)(t.td,{children:"Press Start to start realtime processing."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"DV-2"}),(0,s.jsx)(t.td,{children:"Data Viewer shall support logged playback of telemetry packets."}),(0,s.jsx)(t.td,{children:"Select a time range to playback."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"DV-3"}),(0,s.jsx)(t.td,{children:"Data Viewer shall support textual display of telemetry packets."}),(0,s.jsx)(t.td,{children:"View the display of data."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"DV-4"}),(0,s.jsx)(t.td,{children:"Data Viewer shall support multiple tabs for data display."}),(0,s.jsx)(t.td,{children:"Switch between several tabs of data."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"DV-5"}),(0,s.jsx)(t.td,{children:"Data Viewer shall support deleting tabs."}),(0,s.jsx)(t.td,{children:"Delete a tab."})]})]})]}),"\n",(0,s.jsx)(t.h2,{id:"calendar",children:"Calendar"}),"\n",(0,s.jsx)(t.p,{children:"The Calendar tool provides a user interface and API for initiating scheduled actions in COSMOS"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Reqt. ID"}),(0,s.jsx)(t.th,{children:"Description"}),(0,s.jsx)(t.th,{children:"Test Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"TL-1"}),(0,s.jsx)(t.td,{children:"Calendar shall allow creating new timelines"}),(0,s.jsx)(t.td,{children:"Click the button and create a new timeline"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"TL-2"}),(0,s.jsx)(t.td,{children:"Calendar shall allow scheduling commands for future execection"}),(0,s.jsx)(t.td,{children:"Add a command to a timeline"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"TL-3"}),(0,s.jsx)(t.td,{children:"Calendar shall allow scheduling scripts for future execution"}),(0,s.jsx)(t.td,{children:"Add a script to a timeline"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"TL-4"}),(0,s.jsx)(t.td,{children:"Calendar shall allow for reserving a resource"}),(0,s.jsx)(t.td,{children:"Add a reservation to a timeline"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"TL-5"}),(0,s.jsx)(t.td,{children:"Calendar shall track success or failure of commands"}),(0,s.jsx)(t.td,{children:"Look at status from a completed command"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"TL-6"}),(0,s.jsx)(t.td,{children:"Calendar shall track success or failure of scripts"}),(0,s.jsx)(t.td,{children:"Look at status from a completed script"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"TL-7"}),(0,s.jsx)(t.td,{children:"Calendar shall allow deleting activities from timelines"}),(0,s.jsx)(t.td,{children:"Delete a preexisting item from a timeline"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"TL-8"}),(0,s.jsx)(t.td,{children:"Calendar shall allow deleting timelines"}),(0,s.jsx)(t.td,{children:"Delete a timeline"})]})]})]}),"\n",(0,s.jsx)(t.h2,{id:"admin",children:"Admin"}),"\n",(0,s.jsx)(t.p,{children:"The Admin tool provides administrative functionality including managing plugins for the COSMOS system"}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Reqt. ID"}),(0,s.jsx)(t.th,{children:"Description"}),(0,s.jsx)(t.th,{children:"Test Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"AD-1"}),(0,s.jsx)(t.td,{children:"The Admin Tool shall allow installing plugins"}),(0,s.jsx)(t.td,{children:"Upload and Install a Plugin"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"AD-2"}),(0,s.jsx)(t.td,{children:"The Admin Tool shall support upgrading plugins"}),(0,s.jsx)(t.td,{children:"Upgrade an installed plugin"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"AD-3"}),(0,s.jsx)(t.td,{children:"The Admin Tool shall support uninstalling plugins"}),(0,s.jsx)(t.td,{children:"Uninstall a plugin"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"AD-4"}),(0,s.jsx)(t.td,{children:"The Admin Tool shall display information on installed plugins"}),(0,s.jsx)(t.td,{children:"View info on Interfaces, Microservices, etc"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"AD-5"}),(0,s.jsx)(t.td,{children:"The Admin Tool shall support editing microservices"}),(0,s.jsx)(t.td,{children:"Edit the settings for a microservice"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"AD-6"}),(0,s.jsx)(t.td,{children:"The Admin Tool shall support discovery of plugins"}),(0,s.jsx)(t.td,{children:"Discover and download a plugin"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"AD-7"}),(0,s.jsx)(t.td,{children:"The Admin Tool shall support adding links to external tools"}),(0,s.jsx)(t.td,{children:"Add a link to Google"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"AD-8"}),(0,s.jsx)(t.td,{children:"The Admin Tool shall support reordering tools"}),(0,s.jsx)(t.td,{children:"Reorder tools on the tools tab"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:"AD-9"}),(0,s.jsx)(t.td,{children:"The Admin Tool shall support configuring a classification bar"}),(0,s.jsx)(t.td,{children:"Add a classification bar on the settings tab"})]})]})]})]})}function o(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},324:(e,t,r)=>{r.d(t,{A:()=>s});const s=r.p+"assets/images/architecture-b78f12eba076a0c07af7abdd9dd4187c59aa6b4f5c51b47ad03f73e9f98a6ed6.png"},8453:(e,t,r)=>{r.d(t,{R:()=>d,x:()=>l});var s=r(6540);const n={},i=s.createContext(n);function d(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:d(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]);