openc3-cosmos-tool-docs 6.9.2 → 6.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/tools/staticdocs/404.html +2 -2
- data/tools/staticdocs/assets/css/styles.9a220ac7.css +1 -0
- data/tools/staticdocs/assets/js/{019369f3.4a1653c3.js → 019369f3.d7bbc5e1.js} +1 -1
- data/tools/staticdocs/assets/js/{058ffc22.32f2b3f7.js → 058ffc22.e446ff0d.js} +1 -1
- data/tools/staticdocs/assets/js/0686a885.5b4c4b4d.js +1 -0
- data/tools/staticdocs/assets/js/{078dbab0.64ae8502.js → 078dbab0.656de457.js} +1 -1
- data/tools/staticdocs/assets/js/0f5d161c.7e54cdcf.js +1 -0
- data/tools/staticdocs/assets/js/0ff569c9.9566d390.js +1 -0
- data/tools/staticdocs/assets/js/10209fc9.b137dbd6.js +1 -0
- data/tools/staticdocs/assets/js/{103cc3be.6610d68d.js → 103cc3be.ee6acb84.js} +1 -1
- data/tools/staticdocs/assets/js/1202.d22d6899.js +101 -0
- data/tools/staticdocs/assets/js/13196248.8bbc13cd.js +1 -0
- data/tools/staticdocs/assets/js/13c1b4e4.4c262e75.js +1 -0
- data/tools/staticdocs/assets/js/1596.e0bc0cb8.js +1 -0
- data/tools/staticdocs/assets/js/{1c0a0c05.c66d2cd5.js → 1c0a0c05.ddb465d3.js} +1 -1
- data/tools/staticdocs/assets/js/{1e02e6a3.9bd7e41d.js → 1e02e6a3.73b5cfe6.js} +1 -1
- data/tools/staticdocs/assets/js/2047b354.6cacf929.js +1 -0
- data/tools/staticdocs/assets/js/{22b3ac48.afad8999.js → 22b3ac48.7b94bcf3.js} +1 -1
- data/tools/staticdocs/assets/js/26b8abb2.237c47e9.js +1 -0
- data/tools/staticdocs/assets/js/{2bb7bf90.417c7c24.js → 2bb7bf90.3bde2607.js} +1 -1
- data/tools/staticdocs/assets/js/{2c15ad40.9ac78174.js → 2c15ad40.4b4b971e.js} +1 -1
- data/tools/staticdocs/assets/js/3140.8b312c79.js +1 -0
- data/tools/staticdocs/assets/js/35398c5c.0f3180d9.js +1 -0
- data/tools/staticdocs/assets/js/3dd7ef3b.0221eef2.js +1 -0
- data/tools/staticdocs/assets/js/4015.6d6a3d14.js +1 -0
- data/tools/staticdocs/assets/js/40365d27.41de4945.js +1 -0
- data/tools/staticdocs/assets/js/{411898ad.2ba42394.js → 411898ad.6f36be2d.js} +1 -1
- data/tools/staticdocs/assets/js/42170351.3618f599.js +1 -0
- data/tools/staticdocs/assets/js/{43652efd.658da795.js → 43652efd.e2fc7748.js} +1 -1
- data/tools/staticdocs/assets/js/4581.bbe04eae.js +4 -0
- data/tools/staticdocs/assets/js/{53ca7c5b.dfd52859.js → 53ca7c5b.eccd9100.js} +1 -1
- data/tools/staticdocs/assets/js/54d0d530.cec50ece.js +1 -0
- data/tools/staticdocs/assets/js/{567dad64.2839bb3d.js → 567dad64.50613669.js} +1 -1
- data/tools/staticdocs/assets/js/{5738ba7a.d3cf18a7.js → 5738ba7a.cede7d7a.js} +1 -1
- data/tools/staticdocs/assets/js/{59ed27a4.eb69cbc8.js → 59ed27a4.1b2efe08.js} +1 -1
- data/tools/staticdocs/assets/js/{5b233ba7.c96c3512.js → 5b233ba7.9faed769.js} +1 -1
- data/tools/staticdocs/assets/js/{5bc719f6.1ac7eb68.js → 5bc719f6.789ebf64.js} +1 -1
- data/tools/staticdocs/assets/js/5c6ce5ec.16226a4e.js +1 -0
- data/tools/staticdocs/assets/js/5e3ed378.9ad2dcd2.js +1 -0
- data/tools/staticdocs/assets/js/5fe211ef.bfe87c27.js +1 -0
- data/tools/staticdocs/assets/js/{62df909c.1abd26b3.js → 62df909c.829748fb.js} +1 -1
- data/tools/staticdocs/assets/js/{630e5448.8195b015.js → 630e5448.5c8f1aee.js} +1 -1
- data/tools/staticdocs/assets/js/6831b732.1790429a.js +1 -0
- data/tools/staticdocs/assets/js/696b4199.7520348a.js +1 -0
- data/tools/staticdocs/assets/js/{6b210247.9645038a.js → 6b210247.fc77f080.js} +1 -1
- data/tools/staticdocs/assets/js/6b65133b.f2b11b07.js +1 -0
- data/tools/staticdocs/assets/js/{6f92e431.4af1d84b.js → 6f92e431.26f4227b.js} +1 -1
- data/tools/staticdocs/assets/js/72c6d8a8.0b8c5d2f.js +1 -0
- data/tools/staticdocs/assets/js/7399.857e78fe.js +1 -0
- data/tools/staticdocs/assets/js/75897369.e4626b79.js +1 -0
- data/tools/staticdocs/assets/js/75e64983.8112c73c.js +1 -0
- data/tools/staticdocs/assets/js/7f5b2696.176aadb5.js +1 -0
- data/tools/staticdocs/assets/js/{867640d5.8e389f8a.js → 867640d5.6bc9ed72.js} +1 -1
- data/tools/staticdocs/assets/js/89e76475.6411e788.js +1 -0
- data/tools/staticdocs/assets/js/8b939c74.5e039b7a.js +1 -0
- data/tools/staticdocs/assets/js/{8f7843ee.fffd1922.js → 8f7843ee.fb130406.js} +1 -1
- data/tools/staticdocs/assets/js/9424f0b3.90296433.js +1 -0
- data/tools/staticdocs/assets/js/{4212.6d8bdfa0.js → 9601.e8389133.js} +1 -1
- data/tools/staticdocs/assets/js/{964eb012.ee8b3c36.js → 964eb012.94a1dac1.js} +1 -1
- data/tools/staticdocs/assets/js/{97535711.237fc358.js → 97535711.3e76daa6.js} +1 -1
- data/tools/staticdocs/assets/js/{99581c43.0582936a.js → 99581c43.48391a19.js} +1 -1
- data/tools/staticdocs/assets/js/{9d6e81d0.2e825d3a.js → 9d6e81d0.c9e12517.js} +1 -1
- data/tools/staticdocs/assets/js/{9fb6059a.10a4e6be.js → 9fb6059a.2473a196.js} +1 -1
- data/tools/staticdocs/assets/js/{a677c089.b21f50bd.js → a677c089.4e7df83d.js} +1 -1
- data/tools/staticdocs/assets/js/a9987364.5ca31d27.js +1 -0
- data/tools/staticdocs/assets/js/{a9b2dc27.a75a110f.js → a9b2dc27.1f8d5c81.js} +1 -1
- data/tools/staticdocs/assets/js/aa6b6c1b.750dc927.js +1 -0
- data/tools/staticdocs/assets/js/b062d239.cd8e5784.js +1 -0
- data/tools/staticdocs/assets/js/b38a6d74.b0b07b64.js +1 -0
- data/tools/staticdocs/assets/js/b4596165.8792340f.js +1 -0
- data/tools/staticdocs/assets/js/{b6d70f94.5c2fecd8.js → b6d70f94.43a5cd5a.js} +1 -1
- data/tools/staticdocs/assets/js/b9f60ba6.f2b60175.js +1 -0
- data/tools/staticdocs/assets/js/{bd0034eb.4f47d05b.js → bd0034eb.f33ae892.js} +1 -1
- data/tools/staticdocs/assets/js/{c24eae19.59d90845.js → c24eae19.4d25de93.js} +1 -1
- data/tools/staticdocs/assets/js/c2598f55.0b5b0aff.js +1 -0
- data/tools/staticdocs/assets/js/{c5388ca4.0ddcb653.js → c5388ca4.09e2580f.js} +1 -1
- data/tools/staticdocs/assets/js/{c956ad1e.78603023.js → c956ad1e.38882e03.js} +1 -1
- data/tools/staticdocs/assets/js/{cb8c3f08.2df335b2.js → cb8c3f08.7ca03d18.js} +1 -1
- data/tools/staticdocs/assets/js/{cd879be4.c7304d91.js → cd879be4.f77d4fff.js} +1 -1
- data/tools/staticdocs/assets/js/{ce89ef36.73fcb368.js → ce89ef36.7b0f9079.js} +1 -1
- data/tools/staticdocs/assets/js/cf1c01b8.f5a9a237.js +1 -0
- data/tools/staticdocs/assets/js/d1b923aa.a5b3429d.js +1 -0
- data/tools/staticdocs/assets/js/d1bfc316.7c605bc5.js +1 -0
- data/tools/staticdocs/assets/js/{d24bf9b6.a79f1a36.js → d24bf9b6.f380debf.js} +1 -1
- data/tools/staticdocs/assets/js/{d57a4b5d.1c05ac31.js → d57a4b5d.7ce9d24e.js} +1 -1
- data/tools/staticdocs/assets/js/d59d8a14.41f22286.js +1 -0
- data/tools/staticdocs/assets/js/d5d77c37.ae6fba94.js +1 -0
- data/tools/staticdocs/assets/js/{d66bf9c0.742ff681.js → d66bf9c0.c87e9dc0.js} +1 -1
- data/tools/staticdocs/assets/js/{d8ca4191.1c930b0b.js → d8ca4191.b24de36d.js} +1 -1
- data/tools/staticdocs/assets/js/d9b92eba.b08eeda4.js +1 -0
- data/tools/staticdocs/assets/js/{db8fa1d0.7f3090fa.js → db8fa1d0.a05e2bae.js} +1 -1
- data/tools/staticdocs/assets/js/dbe31111.4f18bf2b.js +1 -0
- data/tools/staticdocs/assets/js/dc5f7beb.d439e98e.js +1 -0
- data/tools/staticdocs/assets/js/{dfbae5fd.011fc630.js → dfbae5fd.24d7316e.js} +1 -1
- data/tools/staticdocs/assets/js/{e501b0d1.c2d8ca29.js → e501b0d1.e7e284e5.js} +1 -1
- data/tools/staticdocs/assets/js/f15615f1.7dcf0c73.js +1 -0
- data/tools/staticdocs/assets/js/{f75a5f33.bc43f96a.js → f75a5f33.a7c7ff1d.js} +1 -1
- data/tools/staticdocs/assets/js/{fd886806.e52d2c97.js → fd886806.4b383c00.js} +1 -1
- data/tools/staticdocs/assets/js/main.81fa15db.js +38 -0
- data/tools/staticdocs/assets/js/runtime~main.e35f5fea.js +1 -0
- data/tools/staticdocs/docs/configuration/accessors.html +46 -46
- data/tools/staticdocs/docs/configuration/command.html +97 -81
- data/tools/staticdocs/docs/configuration/conversions.html +48 -48
- data/tools/staticdocs/docs/configuration/format.html +21 -21
- data/tools/staticdocs/docs/configuration/interfaces.html +55 -55
- data/tools/staticdocs/docs/configuration/limits-response.html +10 -10
- data/tools/staticdocs/docs/configuration/plugins.html +121 -121
- data/tools/staticdocs/docs/configuration/processors.html +15 -15
- data/tools/staticdocs/docs/configuration/protocols.html +66 -66
- data/tools/staticdocs/docs/configuration/ssl-tls.html +15 -15
- data/tools/staticdocs/docs/configuration/table.html +45 -45
- data/tools/staticdocs/docs/configuration/target.html +20 -20
- data/tools/staticdocs/docs/configuration/telemetry-screens.html +253 -253
- data/tools/staticdocs/docs/configuration/telemetry.html +93 -77
- data/tools/staticdocs/docs/configuration.html +2 -2
- data/tools/staticdocs/docs/development/curl.html +14 -14
- data/tools/staticdocs/docs/development/developing.html +17 -17
- data/tools/staticdocs/docs/development/json-api.html +15 -15
- data/tools/staticdocs/docs/development/log-structure.html +13 -15
- data/tools/staticdocs/docs/development/roadmap.html +4 -4
- data/tools/staticdocs/docs/development/streaming-api.html +26 -26
- data/tools/staticdocs/docs/development/testing.html +17 -17
- data/tools/staticdocs/docs/development.html +2 -2
- data/tools/staticdocs/docs/getting-started/cli.html +42 -42
- data/tools/staticdocs/docs/getting-started/generators.html +24 -24
- data/tools/staticdocs/docs/getting-started/gettingstarted.html +19 -19
- data/tools/staticdocs/docs/getting-started/installation.html +20 -20
- data/tools/staticdocs/docs/getting-started/key-concepts.html +20 -20
- data/tools/staticdocs/docs/getting-started/podman.html +23 -23
- data/tools/staticdocs/docs/getting-started/requirements.html +19 -19
- data/tools/staticdocs/docs/getting-started/upgrading.html +69 -42
- data/tools/staticdocs/docs/getting-started/util.html +25 -25
- data/tools/staticdocs/docs/getting-started.html +2 -2
- data/tools/staticdocs/docs/guides/bridges.html +14 -14
- data/tools/staticdocs/docs/guides/cfs.html +32 -32
- data/tools/staticdocs/docs/guides/custom-widgets.html +33 -33
- data/tools/staticdocs/docs/guides/dynamic-packets.html +6 -10
- data/tools/staticdocs/docs/guides/exposing-microservices.html +11 -11
- data/tools/staticdocs/docs/guides/little-endian-bitfields.html +4 -4
- data/tools/staticdocs/docs/guides/local-mode.html +13 -13
- data/tools/staticdocs/docs/guides/logging.html +9 -9
- data/tools/staticdocs/docs/guides/monitoring.html +18 -18
- data/tools/staticdocs/docs/guides/performance.html +10 -10
- data/tools/staticdocs/docs/guides/raspberrypi.html +4 -4
- data/tools/staticdocs/docs/guides/reference-architectures.html +6 -6
- data/tools/staticdocs/docs/guides/roles-permissions.html +29 -29
- data/tools/staticdocs/docs/guides/script-writing.html +68 -104
- data/tools/staticdocs/docs/guides/scripting-api.html +673 -666
- data/tools/staticdocs/docs/guides/troubleshooting.html +7 -7
- data/tools/staticdocs/docs/guides.html +2 -2
- data/tools/staticdocs/docs/meta/contributing.html +12 -12
- data/tools/staticdocs/docs/meta/licenses.html +9 -9
- data/tools/staticdocs/docs/meta/philosophy.html +3 -3
- data/tools/staticdocs/docs/meta/vulnerabilities.html +5 -5
- data/tools/staticdocs/docs/meta/xtce.html +12 -12
- data/tools/staticdocs/docs/meta.html +2 -2
- data/tools/staticdocs/docs/privacy.html +17 -17
- data/tools/staticdocs/docs/tools/admin.html +28 -28
- data/tools/staticdocs/docs/tools/autonomic.html +19 -19
- data/tools/staticdocs/docs/tools/bucket-explorer.html +12 -9
- data/tools/staticdocs/docs/tools/calendar.html +24 -24
- data/tools/staticdocs/docs/tools/cmd-sender.html +13 -13
- data/tools/staticdocs/docs/tools/cmd-tlm-server.html +24 -24
- data/tools/staticdocs/docs/tools/command-history.html +6 -6
- data/tools/staticdocs/docs/tools/command-queue.html +8 -8
- data/tools/staticdocs/docs/tools/data-extractor.html +23 -23
- data/tools/staticdocs/docs/tools/data-viewer.html +10 -10
- data/tools/staticdocs/docs/tools/handbooks.html +4 -4
- data/tools/staticdocs/docs/tools/limits-monitor.html +15 -15
- data/tools/staticdocs/docs/tools/log-explorer.html +9 -9
- data/tools/staticdocs/docs/tools/packet-viewer.html +10 -10
- data/tools/staticdocs/docs/tools/script-runner.html +39 -44
- data/tools/staticdocs/docs/tools/systemhealth.html +21 -21
- data/tools/staticdocs/docs/tools/table-manager.html +10 -10
- data/tools/staticdocs/docs/tools/tlm-grapher.html +20 -20
- data/tools/staticdocs/docs/tools/tlm-viewer.html +15 -15
- data/tools/staticdocs/docs/tools.html +2 -2
- data/tools/staticdocs/docs.html +12 -12
- data/tools/staticdocs/index.html +2 -2
- data/tools/staticdocs/lunr-index-1765340262146.json +1 -0
- data/tools/staticdocs/lunr-index.json +1 -1
- data/tools/staticdocs/markdown-page.html +3 -3
- data/tools/staticdocs/search-doc-1765340262146.json +1 -0
- data/tools/staticdocs/search-doc.json +1 -1
- metadata +102 -102
- data/tools/staticdocs/assets/css/styles.41902cce.css +0 -1
- data/tools/staticdocs/assets/js/0686a885.a7333b95.js +0 -1
- data/tools/staticdocs/assets/js/0f5d161c.7e279344.js +0 -1
- data/tools/staticdocs/assets/js/0ff569c9.2aab45f2.js +0 -1
- data/tools/staticdocs/assets/js/10209fc9.4565c03f.js +0 -1
- data/tools/staticdocs/assets/js/13196248.d66fca61.js +0 -1
- data/tools/staticdocs/assets/js/13c1b4e4.5bb027bf.js +0 -1
- data/tools/staticdocs/assets/js/2047b354.57091c5c.js +0 -1
- data/tools/staticdocs/assets/js/26b8abb2.dcaf4a64.js +0 -1
- data/tools/staticdocs/assets/js/2754.1aabb61a.js +0 -4
- data/tools/staticdocs/assets/js/35398c5c.e106e87e.js +0 -1
- data/tools/staticdocs/assets/js/3dd7ef3b.d7f8b9cd.js +0 -1
- data/tools/staticdocs/assets/js/40365d27.d9f50fa2.js +0 -1
- data/tools/staticdocs/assets/js/42170351.067ef5bf.js +0 -1
- data/tools/staticdocs/assets/js/4684.14bc5dde.js +0 -1
- data/tools/staticdocs/assets/js/5072.9a0a2752.js +0 -1
- data/tools/staticdocs/assets/js/54d0d530.2cb8d081.js +0 -1
- data/tools/staticdocs/assets/js/5c6ce5ec.507ee82d.js +0 -1
- data/tools/staticdocs/assets/js/5e3ed378.4df9c862.js +0 -1
- data/tools/staticdocs/assets/js/5fe211ef.f88f4388.js +0 -1
- data/tools/staticdocs/assets/js/6822.e7d145ca.js +0 -1
- data/tools/staticdocs/assets/js/6831b732.e1f6dba2.js +0 -1
- data/tools/staticdocs/assets/js/696b4199.ca5589ac.js +0 -1
- data/tools/staticdocs/assets/js/6b65133b.e20fd90a.js +0 -1
- data/tools/staticdocs/assets/js/72c6d8a8.33b4ade8.js +0 -1
- data/tools/staticdocs/assets/js/7453.c108c718.js +0 -101
- data/tools/staticdocs/assets/js/75897369.f13aa17b.js +0 -1
- data/tools/staticdocs/assets/js/75e64983.180a00e7.js +0 -1
- data/tools/staticdocs/assets/js/7724.decf13c5.js +0 -1
- data/tools/staticdocs/assets/js/7f5b2696.e1f3d862.js +0 -1
- data/tools/staticdocs/assets/js/89e76475.19eee62b.js +0 -1
- data/tools/staticdocs/assets/js/8b939c74.695b23ba.js +0 -1
- data/tools/staticdocs/assets/js/9424f0b3.b69449bb.js +0 -1
- data/tools/staticdocs/assets/js/a9987364.7fc39b81.js +0 -1
- data/tools/staticdocs/assets/js/aa6b6c1b.fe979b93.js +0 -1
- data/tools/staticdocs/assets/js/b062d239.17662e64.js +0 -1
- data/tools/staticdocs/assets/js/b38a6d74.8868b9d0.js +0 -1
- data/tools/staticdocs/assets/js/b4596165.2ed4461b.js +0 -1
- data/tools/staticdocs/assets/js/b9f60ba6.b670205f.js +0 -1
- data/tools/staticdocs/assets/js/c2598f55.7a2138ca.js +0 -1
- data/tools/staticdocs/assets/js/cf1c01b8.0e7608a1.js +0 -1
- data/tools/staticdocs/assets/js/d1b923aa.9f1cb7ab.js +0 -1
- data/tools/staticdocs/assets/js/d1bfc316.61e55cb2.js +0 -1
- data/tools/staticdocs/assets/js/d59d8a14.849274f0.js +0 -1
- data/tools/staticdocs/assets/js/d5d77c37.efea20c9.js +0 -1
- data/tools/staticdocs/assets/js/d9b92eba.df6e59c2.js +0 -1
- data/tools/staticdocs/assets/js/dbe31111.2d5f3225.js +0 -1
- data/tools/staticdocs/assets/js/dc5f7beb.53bef49e.js +0 -1
- data/tools/staticdocs/assets/js/f15615f1.7cc36bfe.js +0 -1
- data/tools/staticdocs/assets/js/main.1ae7ceb9.js +0 -38
- data/tools/staticdocs/assets/js/runtime~main.44a60fd4.js +0 -1
- data/tools/staticdocs/lunr-index-1762372934557.json +0 -1
- data/tools/staticdocs/search-doc-1762372934557.json +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([["8920"],{5072:function(e,i,r){r.r(i),r.d(i,{frontMatter:()=>s,toc:()=>l,default:()=>h,metadata:()=>n,assets:()=>a,contentTitle:()=>c});var n=JSON.parse('{"id":"guides/exposing-microservices","title":"Exposing Microservices","description":"Provide external accessibility to microservices","source":"@site/docs/guides/exposing-microservices.md","sourceDirName":"guides","slug":"/guides/exposing-microservices","permalink":"/tools/staticdocs/docs/guides/exposing-microservices","draft":false,"unlisted":false,"editUrl":"https://github.com/OpenC3/cosmos/tree/main/docs.openc3.com/docs/guides/exposing-microservices.md","tags":[],"version":"current","frontMatter":{"title":"Exposing Microservices","description":"Provide external accessibility to microservices","sidebar_custom_props":{"myEmoji":"\u{1F6AA}"}},"sidebar":"defaultSidebar","previous":{"title":"Dynamic Packets","permalink":"/tools/staticdocs/docs/guides/dynamic-packets"},"next":{"title":"Little Endian Bitfields","permalink":"/tools/staticdocs/docs/guides/little-endian-bitfields"}}'),t=r(7259),o=r(5511);let s={title:"Exposing Microservices",description:"Provide external accessibility to microservices",sidebar_custom_props:{myEmoji:"\u{1F6AA}"}},c,a={},l=[{value:"Expose microservices using the PORT and ROUTE_PREFIX keywords",id:"expose-microservices-using-the-port-and-route_prefix-keywords",level:2},{value:"Connecting to microservices from a different INTERFACE in plugin.txt",id:"connecting-to-microservices-from-a-different-interface-in-plugintxt",level:2}];function d(e){let i={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.p,{children:"COSMOS provides a simple method to add new APIs and make custom microservices and interfaces accessible to the network."}),"\n",(0,t.jsx)(i.admonition,{title:"Make sure anything you expose is secure",type:"warning",children:(0,t.jsx)(i.p,{children:"Make sure that any new apis you expose check for user credentials and authorize actions appropriately."})}),"\n",(0,t.jsx)(i.h2,{id:"expose-microservices-using-the-port-and-route_prefix-keywords",children:"Expose microservices using the PORT and ROUTE_PREFIX keywords"}),"\n",(0,t.jsxs)(i.p,{children:["In your plugin.txt file, both ",(0,t.jsx)(i.a,{href:"../configuration/plugins#interface-1",children:"INTERFACE"})," and ",(0,t.jsx)(i.a,{href:"../configuration/plugins#microservice-1",children:"MICROSERVICE"})," support the keywords ",(0,t.jsx)(i.a,{href:"../configuration/plugins#port-1",children:"PORT"})," and ",(0,t.jsx)(i.a,{href:"../configuration/plugins#route_prefix-1",children:"ROUTE_PREFIX"}),"."]}),"\n",(0,t.jsxs)(i.p,{children:[(0,t.jsx)(i.a,{href:"../configuration/plugins#port-1",children:"PORT"})," is used to declare the port(s) that your microservice is listening for connections on. This is used in combination with ",(0,t.jsx)(i.a,{href:"../configuration/plugins#route_prefix-1",children:"ROUTE_PREFIX"})," to create a dynamic traefik route to your microservice."]}),"\n",(0,t.jsx)(i.p,{children:"The following code is used internally to let traefik know where to connect to your microservice internally:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-ruby",children:"if ENV['OPENC3_OPERATOR_HOSTNAME']\n url = \"http://#{ENV['OPENC3_OPERATOR_HOSTNAME']}:#{port}\"\nelse\n if ENV['KUBERNETES_SERVICE_HOST']\n url = \"http://#{microservice_name.downcase.gsub('__', '-').gsub('_', '-')}-service:#{port}\"\n else\n url = \"http://openc3-operator:#{port}\"\n end\nend\n"})}),"\n",(0,t.jsx)(i.p,{children:"Note that this is the internal route to your microservice. Determining this route checks two different environment variables."}),"\n",(0,t.jsx)(i.p,{children:'OPENC3_OPERATOR_HOSTNAME is used to override the default service name for our regular docker compose operator of "openc3-operator". Usually this is not set.'}),"\n",(0,t.jsx)(i.p,{children:"In OpenC3 Enterprise, KUBERNETES_SERVICE_HOST is used to detect if we are running in a Kubernetes environment (it will be set by Kubernetes), in which case the service is expected to have a Kubernetes service named scope-user-microservicename-service. For example, if you are using the DEFAULT scope and have a microservice named MYMICROSERVICE the service would be found at the hostname: default-user-mymicroservice-service. Double underscores or single underscores are replaced by a dash and the name is all lower case."}),"\n",(0,t.jsxs)(i.p,{children:[(0,t.jsx)(i.a,{href:"../configuration/plugins#route_prefix-1",children:"ROUTE_PREFIX"})," is used to define the external route. The external route will take the form of http(s)://YOURCOSMOSDOMAIN",":PORT","/ROUTE_PREFIX. So for example, if you set the ",(0,t.jsx)(i.a,{href:"../configuration/plugins#route_prefix-1",children:"ROUTE_PREFIX"})," to /mymicroservice then on a default local installation, it could be reached at ",(0,t.jsx)(i.code,{children:"http://localhost:2900/mymicroservice"}),". The ",(0,t.jsx)(i.code,{children:"http://localhost:2900"})," part should be substituted by whatever domain you are accessing COSMOS at."]}),"\n",(0,t.jsxs)(i.p,{children:["Here is a snippet of code showing ",(0,t.jsx)(i.a,{href:"../configuration/plugins#port-1",children:"PORT"})," and ",(0,t.jsx)(i.a,{href:"../configuration/plugins#route_prefix-1",children:"ROUTE_PREFIX"})," in use within a plugin.txt file:"]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"VARIABLE cfdp_microservice_name CFDP\nVARIABLE cfdp_route_prefix /cfdp\nVARIABLE cfdp_port 2906\n\nMICROSERVICE CFDP <%= cfdp_microservice_name %>\n WORK_DIR .\n ROUTE_PREFIX <%= cfdp_route_prefix %>\n PORT <%= cfdp_port %>\n"})}),"\n",(0,t.jsx)(i.p,{children:"Leaving the variables at their default values the following will occur:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["The microservice will be exposed internally to Docker (Core or Enterprise) at: ",(0,t.jsx)(i.code,{children:"http://openc3-operator:2906"})]}),"\n",(0,t.jsxs)(i.li,{children:["The microservice will be exposed internally to Kubernetes (Enterprise) at: ",(0,t.jsx)(i.code,{children:"http://default-user-cfdp-service:2906"})]}),"\n",(0,t.jsxs)(i.li,{children:["The microservice will be exposed externally to the network at: ",(0,t.jsx)(i.code,{children:"http://localhost:2900/cfdp"})]}),"\n"]}),"\n",(0,t.jsxs)(i.p,{children:["The same can be done for ",(0,t.jsx)(i.a,{href:"../configuration/plugins#interface-1",children:"INTERFACE"})," but note that the Kubernetes service name will use the microservice name of the interface which takes the form of ",(0,t.jsx)(i.code,{children:"SCOPE__INTERFACE__INTERFACENAME"}),"."]}),"\n",(0,t.jsxs)(i.p,{children:["Here is an example using ",(0,t.jsx)(i.a,{href:"../configuration/plugins#port",children:"PORT"})," and ",(0,t.jsx)(i.a,{href:"../configuration/plugins#route_prefix",children:"ROUTE_PREFIX"})," with ",(0,t.jsx)(i.a,{href:"../configuration/plugins#interface-1",children:"INTERFACE"}),":"]}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{className:"language-bash",children:"VARIABLE my_interface_name MY_INT\nVARIABLE my_route_prefix /myint\nVARIABLE my_port 2888\n\nINTERFACE <%= my_interface_name %> http_server_interface.rb <%= my_port %>\n ROUTE_PREFIX <%= my_route_prefix %>\n PORT <%= my_port %>\n"})}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["The interface will be exposed internally to Docker (Core or Enterprise) at: ",(0,t.jsx)(i.code,{children:"http://openc3-operator:2888"})]}),"\n",(0,t.jsxs)(i.li,{children:["The interface will be exposed internally to Kubernetes (Enterprise) at: ",(0,t.jsx)(i.code,{children:"http://default-interface-my-int-service:2888"})]}),"\n",(0,t.jsxs)(i.li,{children:["The interface will be exposed externally to the network at: ",(0,t.jsx)(i.code,{children:"http://localhost:2900/myint"})]}),"\n"]}),"\n",(0,t.jsx)(i.admonition,{title:"Sharded Operator on Kubernetes (Enterprise)",type:"warning",children:(0,t.jsx)(i.p,{children:"The sharded operator is expected to be used on Kubernetes whenever the Kubernetes Operator is not used. Typically this will be because the user does not have permission to use the Kubernetes API directly to spawn containers which is required for use of the Kubernetes Operator. In this case, Kubernetes services will NOT be automatically created, and will have to be manually created by a user with permissions in Kubernetes, or through some other authorized method (like a custom framework dashboard or config file)."})}),"\n",(0,t.jsx)(i.h2,{id:"connecting-to-microservices-from-a-different-interface-in-plugintxt",children:"Connecting to microservices from a different INTERFACE in plugin.txt"}),"\n",(0,t.jsx)(i.p,{children:"Sometimes you might want to have an INTERFACE connect to a microservice you are running. For this case, only the PORT keyword is required on the INTERFACE or MICROSERVICE because we are only connecting internally and ROUTE_PREFIX isn't used."}),"\n",(0,t.jsx)(i.p,{children:"The following code taken from our demo plugin provides an example of how to calculate the correct hostname across both Core and Enterprise versions of COSMOS in a plugin.txt file:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{children:" <% example_host = ENV['KUBERNETES_SERVICE_HOST'] ? \"#{scope}-user-#{example_microservice_name.downcase.gsub('__', '-').gsub('_', '-')}-service\" : \"openc3-operator\" %>\n INTERFACE <%= example_int_name %> example_interface.rb <%= example_host %> <%= example_port %>\n MAP_TARGET <%= example_target_name %>\n"})}),"\n",(0,t.jsx)(i.p,{children:"Note that the above code does not handle the OPENC3_OPERATOR_HOSTNAME environment variable which might change the default name of openc3-operator. Update as needed."})]})}function h(e={}){let{wrapper:i}={...(0,o.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},5511:function(e,i,r){r.d(i,{R:()=>s,x:()=>c});var n=r(6363);let t={},o=n.createContext(t);function s(e){let i=n.useContext(o);return n.useMemo(function(){return"function"==typeof e?e(i):{...i,...e}},[i,e])}function c(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),n.createElement(o.Provider,{value:i},e.children)}}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([["2221"],{9557:function(e,n,s){s.r(n),s.d(n,{frontMatter:()=>t,toc:()=>a,default:()=>h,metadata:()=>r,assets:()=>l,contentTitle:()=>c});var r=JSON.parse('{"id":"configuration/conversions","title":"Conversions","description":"Conversions to apply to command parameters and telemetry items","source":"@site/docs/configuration/conversions.md","sourceDirName":"configuration","slug":"/configuration/conversions","permalink":"/tools/staticdocs/docs/configuration/conversions","draft":false,"unlisted":false,"editUrl":"https://github.com/OpenC3/cosmos/tree/main/docs.openc3.com/docs/configuration/conversions.md","tags":[],"version":"current","sidebarPosition":9,"frontMatter":{"sidebar_position":9,"title":"Conversions","description":"Conversions to apply to command parameters and telemetry items","sidebar_custom_props":{"myEmoji":"\u{1F504}"}},"sidebar":"defaultSidebar","previous":{"title":"Accessors","permalink":"/tools/staticdocs/docs/configuration/accessors"},"next":{"title":"Processors","permalink":"/tools/staticdocs/docs/configuration/processors"}}'),i=s(7259),o=s(5511);let t={sidebar_position:9,title:"Conversions",description:"Conversions to apply to command parameters and telemetry items",sidebar_custom_props:{myEmoji:"\u{1F504}"}},c="Overview",l={},a=[{value:"Custom Conversions",id:"custom-conversions",level:2},{value:"converted_type",id:"converted_type",level:3},{value:"converted_bit_size",id:"converted_bit_size",level:3},{value:"call",id:"call",level:3},{value:"Apply Conversion",id:"apply-conversion",level:3},{value:"GENERIC_CONVERSION",id:"generic_conversion",level:2},{value:"BIT_REVERSE_CONVERSION",id:"bit_reverse_conversion",level:2},{value:"IP_READ_CONVERSION",id:"ip_read_conversion",level:2},{value:"IP_WRITE_CONVERSION",id:"ip_write_conversion",level:2},{value:"OBJECT_READ_CONVERSION",id:"object_read_conversion",level:2},{value:"OBJECT_WRITE_CONVERSION",id:"object_write_conversion",level:2},{value:"PACKET_TIME_FORMATTED_CONVERSION",id:"packet_time_formatted_conversion",level:2},{value:"PACKET_TIME_SECONDS_CONVERSION",id:"packet_time_seconds_conversion",level:2},{value:"POLYNOMIAL_CONVERSION",id:"polynomial_conversion",level:2},{value:"PROCESSOR_CONVERSION",id:"processor_conversion",level:2},{value:"RECEIVED_COUNT_CONVERSION",id:"received_count_conversion",level:2},{value:"RECEIVED_TIME_FORMATTED_CONVERSION",id:"received_time_formatted_conversion",level:2},{value:"RECEIVED_TIME_SECONDS_CONVERSION",id:"received_time_seconds_conversion",level:2},{value:"SEGMENTED_POLYNOMIAL_CONVERSION",id:"segmented_polynomial_conversion",level:2},{value:"UNIX_TIME_CONVERSION",id:"unix_time_conversion",level:2},{value:"UNIX_TIME_FORMATTED_CONVERSION",id:"unix_time_formatted_conversion",level:2},{value:"UNIX_TIME_SECONDS_CONVERSION",id:"unix_time_seconds_conversion",level:2}];function d(e){let n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,o.R)(),...e.components},{TabItem:s,Tabs:r}=n;return s||p("TabItem",!0),r||p("Tabs",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"overview",children:"Overview"})}),"\n",(0,i.jsxs)(n.p,{children:["Conversions can be applied to both command parameters and telemetry items to modify the values sent to and received from targets. To apply a conversion to a command you use the ",(0,i.jsx)(n.a,{href:"/docs/configuration/command#write_conversion",children:"WRITE_CONVERSION"})," keyword. To apply a conversion to a telemetry item you use the ",(0,i.jsx)(n.a,{href:"/docs/configuration/telemetry#read_conversion",children:"READ_CONVERSION"})," keyword."]}),"\n",(0,i.jsx)(n.h2,{id:"custom-conversions",children:"Custom Conversions"}),"\n",(0,i.jsxs)(n.p,{children:["You can easily create your own custom conversions by using the ",(0,i.jsx)(n.a,{href:"/docs/getting-started/generators#conversion-generator",children:"Conversion Code Generator"}),". To generate a telemetry conversion you must be inside an existing COSMOS plugin. The generator takes both a target name and the conversion name. For example if your plugin is called ",(0,i.jsx)(n.code,{children:"openc3-cosmos-gse"})," and you have an existing target named ",(0,i.jsx)(n.code,{children:"GSE"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"openc3-cosmos-gse % openc3.sh cli generate conversion GSE double --python\nConversion targets/GSE/lib/double_conversion.py successfully generated!\nTo use the conversion add the following to a telemetry item:\n READ_CONVERSION double_conversion.py\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Note: To create a Ruby conversion simply replace ",(0,i.jsx)(n.code,{children:"--python"})," with ",(0,i.jsx)(n.code,{children:"--ruby"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["The above command creates a conversion called ",(0,i.jsx)(n.code,{children:"double_conversion.py"})," at ",(0,i.jsx)(n.code,{children:"targets/GSE/lib/double_conversion.py"}),". The code which is generated looks like the following:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"from openc3.conversions.conversion import Conversion\n# Using tlm() requires the following:\n# from openc3.api.tlm_api import tlm\n\n# Custom conversion class\n# See https://docs.openc3.com/docs/configuration/telemetry#read_conversion\nclass DoubleConversion(Conversion):\n def __init__(self):\n super().__init__()\n # Should be one of 'INT', 'UINT', 'FLOAT', 'STRING', 'BLOCK'\n self.converted_type = 'STRING'\n # Size of the converted type in bits\n # Use 0 for 'STRING' or 'BLOCK' where the size can be variable\n self.converted_bit_size = 0\n\n # @param value [Object] Value based on the item definition. This could be\n # a string, integer, float, or array of values.\n # @param packet [Packet] The packet object where the conversion is defined\n # @param buffer [String] The raw packet buffer\n def call(self, value, packet, buffer):\n # Read values from the packet and do a conversion\n # Used for DERIVED items that don't have a value\n # item1 = packet.read(\"ITEM1\") # returns CONVERTED value (default)\n # item2 = packet.read(\"ITEM2\", 'RAW') # returns RAW value\n # return (item1 + item2) / 2\n #\n # Perform conversion logic directly on value\n # Used when conversion is applied to a regular (not DERIVED) item\n # NOTE: You can also use packet.read(\"ITEM\") to get additional values\n # return value / 2 * packet.read(\"OTHER_ITEM\")\n return value\n"})}),"\n",(0,i.jsxs)(n.p,{children:["There are a lot of comments to help you know what to do. The primary things to modify are the ",(0,i.jsx)(n.code,{children:"converted_type"}),", ",(0,i.jsx)(n.code,{children:"converted_bit_size"}),", and ",(0,i.jsx)(n.code,{children:"call"})," method."]}),"\n",(0,i.jsx)(n.h3,{id:"converted_type",children:"converted_type"}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"converted_type"})," is the resulting type of the converted value. It lets consumers of the converted value know the resulting type. In our case we're doubling the input value and since this could be applied to an unsigned integer as well as a floating point value we'll choose ",(0,i.jsx)(n.code,{children:"FLOAT"}),"."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:" self.converted_type = 'FLOAT'\n"})}),"\n",(0,i.jsx)(n.h3,{id:"converted_bit_size",children:"converted_bit_size"}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"converted_bit_size"})," is the resulting size of the converted value. It lets consumers of the converted value know the resulting size. Since we chose ",(0,i.jsx)(n.code,{children:"FLOAT"})," as the type we'll choose ",(0,i.jsx)(n.code,{children:"32"})," as the bit size. We could have also chosen ",(0,i.jsx)(n.code,{children:"64"})," bits. Sometimes you know the type and size of the resulting conversion and can simply hard code them. Other times you need to pass them in as parameters and let the user decide."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:" self.converted_bit_size = 32\n"})}),"\n",(0,i.jsx)(n.h3,{id:"call",children:"call"}),"\n",(0,i.jsx)(n.p,{children:"The call method is where the actual conversion logic is implemented. In our case we want to double the input value so we simply return the value multiplied by 2. The final result with comments removed looks like the following:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"from openc3.conversions.conversion import Conversion\nclass DoubleConversion(Conversion):\n def __init__(self):\n super().__init__()\n self.converted_type = 'FLOAT'\n self.converted_bit_size = 32\n\n def call(self, value, packet, buffer):\n return value * 2\n"})}),"\n",(0,i.jsx)(n.h3,{id:"apply-conversion",children:"Apply Conversion"}),"\n",(0,i.jsxs)(n.p,{children:["Now that we have implemented the conversion logic we need to apply it to a telemetry item by adding the line ",(0,i.jsx)(n.code,{children:"READ_CONVERSION double_conversion.py"})," in the ",(0,i.jsx)(n.a,{href:"/docs/configuration/telemetry",children:"telemetry"})," definition file. This could look something like this:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'TELEMETRY GSE DATA BIG_ENDIAN "Data packet"\n ... # Header items\n APPEND_ITEM VALUE 16 UINT "Value I want to double"\n READ_CONVERSION double_conversion.py\n'})}),"\n",(0,i.jsx)(n.h1,{id:"built-in-conversions",children:"Built-in Conversions"}),"\n",(0,i.jsx)(n.h2,{id:"generic_conversion",children:"GENERIC_CONVERSION"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Applies a simple conversion to a single telemetry item."})}),"\n",(0,i.jsx)(n.p,{children:"The generic conversion is meant to be a quick and easy way to apply a conversion to a single telemetry item. It must be parsed and evaluated and thus is not as performant as a dedicated conversion class."}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Description"}),(0,i.jsx)(n.th,{children:"Required"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Type"}),(0,i.jsxs)(n.td,{children:["Data type after the conversion is applied",(0,i.jsx)("br",{}),(0,i.jsx)("br",{}),"Valid Values: ",(0,i.jsx)("span",{class:"values",children:"INT, UINT, FLOAT, STRING, BLOCK, TIME"})]}),(0,i.jsx)(n.td,{children:"False (warning will be generated)"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Size"}),(0,i.jsx)(n.td,{children:"Data size in bits after the conversion is applied"}),(0,i.jsx)(n.td,{children:"False (warning will be generated)"})]})]})]}),"\n",(0,i.jsxs)(r,{groupId:"script-language",children:[(0,i.jsx)(s,{value:"python",label:"Python",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"GENERIC_READ_CONVERSION_START FLOAT 32\n packet.read('TEMP1') / 1_000_000\nGENERIC_READ_CONVERSION_END\n"})})}),(0,i.jsx)(s,{value:"ruby",label:"Ruby",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-ruby",children:"GENERIC_READ_CONVERSION_START FLOAT 32\n packet.read('TEMP1') / 1_000_000\nGENERIC_READ_CONVERSION_END\n"})})})]}),"\n",(0,i.jsx)(n.h2,{id:"bit_reverse_conversion",children:"BIT_REVERSE_CONVERSION"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Reverses the bits of the current telemetry item. Can be used as both a read and write conversion."})}),"\n",(0,i.jsxs)(r,{groupId:"script-language",children:[(0,i.jsx)(s,{value:"python",label:"Python",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"READ_CONVERSION openc3/conversions/bit_reverse_conversion.py\nWRITE_CONVERSION openc3/conversions/bit_reverse_conversion.py\n"})})}),(0,i.jsx)(s,{value:"ruby",label:"Ruby",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-ruby",children:"READ_CONVERSION bit_reverse_conversion.rb\nWRITE_CONVERSION bit_reverse_conversion.rb\n"})})})]}),"\n",(0,i.jsx)(n.h2,{id:"ip_read_conversion",children:"IP_READ_CONVERSION"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Reads a packed 32 bit integer into an IP address string"})}),"\n",(0,i.jsx)(n.p,{children:"This command reads a packed 32 bit integer into an IP address string.\nFor example, 0xFFFF8000 would be converted to '255.255.128.0'."}),"\n",(0,i.jsxs)(r,{groupId:"script-language",children:[(0,i.jsx)(s,{value:"python",label:"Python",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"READ_CONVERSION openc3/conversions/ip_read_conversion.py\n"})})}),(0,i.jsx)(s,{value:"ruby",label:"Ruby",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-ruby",children:"READ_CONVERSION ip_read_conversion.rb\n"})})})]}),"\n",(0,i.jsx)(n.h2,{id:"ip_write_conversion",children:"IP_WRITE_CONVERSION"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Write an ip address string into a packed 32 bit integer"})}),"\n",(0,i.jsx)(n.p,{children:"This command writes an IP address string into a packed 32 bit integer. The IP address\nstring should be in the format 'x.x.x.x' where x is a number between 0 and 255.\nFor example, '255.255.128.0' would be converted to 0xFFFF8000."}),"\n",(0,i.jsxs)(r,{groupId:"script-language",children:[(0,i.jsx)(s,{value:"python",label:"Python",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"WRITE_CONVERSION openc3/conversions/ip_write_conversion.py\n"})})}),(0,i.jsx)(s,{value:"ruby",label:"Ruby",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-ruby",children:"WRITE_CONVERSION ip_write_conversion.rb\n"})})})]}),"\n",(0,i.jsx)(n.h2,{id:"object_read_conversion",children:"OBJECT_READ_CONVERSION"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Reads values from the given packet object"})}),"\n",(0,i.jsx)(n.p,{children:"This command reads all the values from the given packet object. The values are\nreturned as a Ruby hash or Python dict. The packet object must be defined in the target's configuration."}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Description"}),(0,i.jsx)(n.th,{children:"Required"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Command or Telemetry"}),(0,i.jsxs)(n.td,{children:["Whether the packet is a command or telemetry",(0,i.jsx)("br",{}),(0,i.jsx)("br",{}),"Valid Values: ",(0,i.jsx)("span",{class:"values",children:"CMD, TLM"})]}),(0,i.jsx)(n.td,{children:"True"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Target Name"}),(0,i.jsx)(n.td,{children:"Name of the target"}),(0,i.jsx)(n.td,{children:"True"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Packet Name"}),(0,i.jsx)(n.td,{children:"Name of the packet"}),(0,i.jsx)(n.td,{children:"True"})]})]})]}),"\n",(0,i.jsxs)(r,{groupId:"script-language",children:[(0,i.jsx)(s,{value:"python",label:"Python",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"READ_CONVERSION openc3/conversions/object_read_conversion.py CMD INST COLLECT\n"})})}),(0,i.jsx)(s,{value:"ruby",label:"Ruby",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-ruby",children:"READ_CONVERSION object_read_conversion.rb CMD INST COLLECT\n"})})})]}),"\n",(0,i.jsx)(n.h2,{id:"object_write_conversion",children:"OBJECT_WRITE_CONVERSION"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Writes values into the given packet object"})}),"\n",(0,i.jsx)(n.p,{children:"This command writes values into the given packet object. The values are specified\nin a hash format where the keys are the field names in the packet and the values\nare the values to write. The packet object must be defined in the target's configuration."}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Description"}),(0,i.jsx)(n.th,{children:"Required"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Command or Telemetry"}),(0,i.jsxs)(n.td,{children:["Whether the packet is a command or telemetry",(0,i.jsx)("br",{}),(0,i.jsx)("br",{}),"Valid Values: ",(0,i.jsx)("span",{class:"values",children:"CMD, TLM"})]}),(0,i.jsx)(n.td,{children:"True"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Target Name"}),(0,i.jsx)(n.td,{children:"Name of the target"}),(0,i.jsx)(n.td,{children:"True"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Packet Name"}),(0,i.jsx)(n.td,{children:"Name of the packet"}),(0,i.jsx)(n.td,{children:"True"})]})]})]}),"\n",(0,i.jsxs)(r,{groupId:"script-language",children:[(0,i.jsx)(s,{value:"python",label:"Python",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"WRITE_CONVERSION openc3/conversions/object_write_conversion.py CMD INST COLLECT\n"})})}),(0,i.jsx)(s,{value:"ruby",label:"Ruby",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-ruby",children:"WRITE_CONVERSION object_write_conversion.rb CMD INST COLLECT\n"})})})]}),"\n",(0,i.jsx)(n.h2,{id:"packet_time_formatted_conversion",children:"PACKET_TIME_FORMATTED_CONVERSION"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsxs)(n.strong,{children:['Converts the packet time to a formatted string like "YYYY/MM/DD HH:MM',":SS",'.US"']})}),"\n",(0,i.jsxs)(n.p,{children:["This in an internal conversion which is automatically applied to the\n'PACKET_TIMEFORMATTED' derived telemetry item. It is typically not explicitly used.\nFor more information see the ",(0,i.jsx)(n.a,{href:"/docs/configuration/telemetry#received-time-and-packet-time",children:"Received Time and Packet Time"})," documentation."]}),"\n",(0,i.jsxs)(r,{groupId:"script-language",children:[(0,i.jsx)(s,{value:"python",label:"Python",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"READ_CONVERSION openc3/conversions/packet_time_formatted_conversion.py\n"})})}),(0,i.jsx)(s,{value:"ruby",label:"Ruby",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-ruby",children:"READ_CONVERSION packet_time_formatted_conversion.rb\n"})})})]}),"\n",(0,i.jsx)(n.h2,{id:"packet_time_seconds_conversion",children:"PACKET_TIME_SECONDS_CONVERSION"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Converts the packet time to a floating point number of seconds since the epoch"})}),"\n",(0,i.jsxs)(n.p,{children:["This in an internal conversion which is automatically applied to the\n'PACKET_TIMESECONDS' derived telemetry item. It is typically not explicitly used.\nFor more information see the ",(0,i.jsx)(n.a,{href:"/docs/configuration/telemetry#received-time-and-packet-time",children:"Received Time and Packet Time"})," documentation."]}),"\n",(0,i.jsxs)(r,{groupId:"script-language",children:[(0,i.jsx)(s,{value:"python",label:"Python",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"READ_CONVERSION openc3/conversions/packet_time_seconds_conversion.py\n"})})}),(0,i.jsx)(s,{value:"ruby",label:"Ruby",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-ruby",children:"READ_CONVERSION packet_time_seconds_conversion.rb\n"})})})]}),"\n",(0,i.jsx)(n.h2,{id:"polynomial_conversion",children:"POLYNOMIAL_CONVERSION"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Adds a polynomial conversion factor to the current item. Can be used as both a read and write conversion."})}),"\n",(0,i.jsx)(n.p,{children:"For commands, the conversion factor is applied to raw value set by the user (via tool or script) before it is written into the binary command packet and sent. For telemetry, the conversion factor is applied to the raw value in the telemetry packet before it is displayed to the user. The user still has the ability to see the raw unconverted value in a details dialog."}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Description"}),(0,i.jsx)(n.th,{children:"Required"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"C0"}),(0,i.jsx)(n.td,{children:"Coefficient"}),(0,i.jsx)(n.td,{children:"True"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Cx"}),(0,i.jsx)(n.td,{children:"Additional coefficient values for the conversion. Any order polynomial conversion may be used so the value of 'x' will vary with the order of the polynomial. Note that larger order polynomials take longer to process than shorter order polynomials, but are sometimes more accurate."}),(0,i.jsx)(n.td,{children:"False"})]})]})]}),"\n",(0,i.jsxs)(r,{groupId:"script-language",children:[(0,i.jsx)(s,{value:"python",label:"Python",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"READ_CONVERSION openc3/conversions/polynomial_conversion.py 10 0.5 0.25\n# Since this is a common conversion it has an alias:\nPOLY_READ_CONVERSION 10 0.5 0.25\n\nWRITE_CONVERSION openc3/conversions/polynomial_conversion.py 10 0.5 0.25\n# Since this is a common conversion it has an alias:\nPOLY_WRITE_CONVERSION 10 0.5 0.25\n"})})}),(0,i.jsx)(s,{value:"ruby",label:"Ruby",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-ruby",children:"READ_CONVERSION polynomial_conversion.rb 10 0.5 0.25\n# Since this is a common conversion it has an alias:\nPOLY_READ_CONVERSION 10 0.5 0.25\n\nWRITE_CONVERSION polynomial_conversion.rb 10 0.5 0.25\n# Since this is a common conversion it has an alias:\nPOLY_WRITE_CONVERSION 10 0.5 0.25\n"})})})]}),"\n",(0,i.jsx)(n.h2,{id:"processor_conversion",children:"PROCESSOR_CONVERSION"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Read a value from a processor"})}),"\n",(0,i.jsxs)(n.p,{children:["This command reads a value from a processor. The value is read from the\nprocessor's available values. The processor must be defined in the target's configuration.\nSee the ",(0,i.jsx)(n.a,{href:"/docs/configuration/processors",children:"Processor"})," documentation for more information."]}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Description"}),(0,i.jsx)(n.th,{children:"Required"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Processor Name"}),(0,i.jsx)(n.td,{children:"Name of the processor"}),(0,i.jsx)(n.td,{children:"True"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Processor Value"}),(0,i.jsx)(n.td,{children:"Published processor value"}),(0,i.jsx)(n.td,{children:"True"})]})]})]}),"\n",(0,i.jsxs)(r,{groupId:"script-language",children:[(0,i.jsx)(s,{value:"python",label:"Python",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:'PROCESSOR TEMP1WATER openc3/conversions/watermark_processor.py TEMP1\nITEM TEMP1HIGH 0 0 DERIVED "High-water mark for TEMP1"\n READ_CONVERSION openc3/conversions/processor_conversion.py TEMP1WATER HIGH_WATER\n'})})}),(0,i.jsx)(s,{value:"ruby",label:"Ruby",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-ruby",children:'PROCESSOR TEMP1WATER watermark_processor.rb TEMP1\nITEM TEMP1HIGH 0 0 DERIVED "High-water mark for TEMP1"\n READ_CONVERSION processor_conversion.rb TEMP1WATER HIGH_WATER\n'})})})]}),"\n",(0,i.jsx)(n.h2,{id:"received_count_conversion",children:"RECEIVED_COUNT_CONVERSION"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Converts the packet received count to a UINT 32 value"})}),"\n",(0,i.jsx)(n.p,{children:"This in an internal conversion which is automatically applied to the\n'RECEIVED_COUNT' derived telemetry item. It is typically not explicitly used."}),"\n",(0,i.jsxs)(r,{groupId:"script-language",children:[(0,i.jsx)(s,{value:"python",label:"Python",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"READ_CONVERSION openc3/conversions/received_count_conversion.py\n"})})}),(0,i.jsx)(s,{value:"ruby",label:"Ruby",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-ruby",children:"READ_CONVERSION received_count_conversion.rb\n"})})})]}),"\n",(0,i.jsx)(n.h2,{id:"received_time_formatted_conversion",children:"RECEIVED_TIME_FORMATTED_CONVERSION"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsxs)(n.strong,{children:['Converts the packet received time to a formatted string like "YYYY/MM/DD HH:MM',":SS",'.US"']})}),"\n",(0,i.jsxs)(n.p,{children:["This in an internal conversion which is automatically applied to the\n'RECEIVED_TIMEFORMATTED' derived telemetry item. It is typically not explicitly used.\nFor more information see the ",(0,i.jsx)(n.a,{href:"/docs/configuration/telemetry#received-time-and-packet-time",children:"Received Time and Packet Time"})," documentation."]}),"\n",(0,i.jsxs)(r,{groupId:"script-language",children:[(0,i.jsx)(s,{value:"python",label:"Python",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"READ_CONVERSION openc3/conversions/received_time_formatted_conversion.py\n"})})}),(0,i.jsx)(s,{value:"ruby",label:"Ruby",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-ruby",children:"READ_CONVERSION received_time_formatted_conversion.rb\n"})})})]}),"\n",(0,i.jsx)(n.h2,{id:"received_time_seconds_conversion",children:"RECEIVED_TIME_SECONDS_CONVERSION"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Converts the packet received to a floating point number of seconds since the epoch"})}),"\n",(0,i.jsxs)(n.p,{children:["This in an internal conversion which is automatically applied to the\n'RECEIVED_TIMESECONDS' derived telemetry item. It is typically not explicitly used.\nFor more information see the ",(0,i.jsx)(n.a,{href:"/docs/configuration/telemetry#received-time-and-packet-time",children:"Received Time and Packet Time"})," documentation."]}),"\n",(0,i.jsxs)(r,{groupId:"script-language",children:[(0,i.jsx)(s,{value:"python",label:"Python",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"READ_CONVERSION openc3/conversions/received_time_formatted_conversion.py\n"})})}),(0,i.jsx)(s,{value:"ruby",label:"Ruby",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-ruby",children:"READ_CONVERSION received_time_formatted_conversion.rb\n"})})})]}),"\n",(0,i.jsx)(n.h2,{id:"segmented_polynomial_conversion",children:"SEGMENTED_POLYNOMIAL_CONVERSION"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Adds a segmented polynomial conversion factor to the current item. Can be used as both a read and write conversion."})}),"\n",(0,i.jsx)(n.p,{children:"For commands, this conversion factor is applied to the raw value set by the user (via tool or script) before it is written into the binary command packet and sent. For telemetry, the conversion factor is applied to the raw value in the telemetry packet before it is displayed to the user. The user still has the ability to see the raw unconverted value in a details dialog."}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Description"}),(0,i.jsx)(n.th,{children:"Required"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Lower Bound"}),(0,i.jsx)(n.td,{children:"Defines the lower bound of the range of values that this segmented polynomial applies to. Is ignored for the segment with the smallest lower bound."}),(0,i.jsx)(n.td,{children:"True"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"C0"}),(0,i.jsx)(n.td,{children:"Coefficient"}),(0,i.jsx)(n.td,{children:"True"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Cx"}),(0,i.jsx)(n.td,{children:"Additional coefficient values for the conversion. Any order polynomial conversion may be used so the value of 'x' will vary with the order of the polynomial. Note that larger order polynomials take longer to process than shorter order polynomials, but are sometimes more accurate."}),(0,i.jsx)(n.td,{children:"False"})]})]})]}),"\n",(0,i.jsxs)(r,{groupId:"script-language",children:[(0,i.jsx)(s,{value:"python",label:"Python",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"READ_CONVERSION openc3/conversions/segmented_polynomial_conversion.py 0 10 0.5 0.25 # Apply the conversion to all values < 50\n# Since this is a common conversion it has an alias:\nSEG_POLY_READ_CONVERSION 10 0.5 0.25 0 10 0.5 0.25 # Apply the conversion to all values < 50\nSEG_POLY_READ_CONVERSION 50 11 0.5 0.275 # Apply the conversion to all values >= 50 and < 100\nSEG_POLY_READ_CONVERSION 100 12 0.5 0.3 # Apply the conversion to all values >= 100\n\nWRITE_CONVERSION openc3/conversions/segmented_polynomial_conversion.py 0 10 0.5 0.25 # Apply the conversion to all values < 50\n# Since this is a common conversion it has an alias:\nSEG_POLY_WRITE_CONVERSION 10 0.5 0.25 0 10 0.5 0.25 # Apply the conversion to all values < 50\nSEG_POLY_WRITE_CONVERSION 50 11 0.5 0.275 # Apply the conversion to all values >= 50 and < 100\nSEG_POLY_WRITE_CONVERSION 100 12 0.5 0.3 # Apply the conversion to all values >= 100\n"})})}),(0,i.jsx)(s,{value:"ruby",label:"Ruby",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-ruby",children:"READ_CONVERSION segmented_polynomial_conversion.rb 0 10 0.5 0.25 # Apply the conversion to all values < 50\n# Since this is a common conversion it has an alias:\nSEG_POLY_READ_CONVERSION 10 0.5 0.25 0 10 0.5 0.25 # Apply the conversion to all values < 50\nSEG_POLY_READ_CONVERSION 50 11 0.5 0.275 # Apply the conversion to all values >= 50 and < 100\nSEG_POLY_READ_CONVERSION 100 12 0.5 0.3 # Apply the conversion to all values >= 100\n\nWRITE_CONVERSION segmented_polynomial_conversion.rb 0 10 0.5 0.25 # Apply the conversion to all values < 50\n# Since this is a common conversion it has an alias:\nSEG_POLY_WRITE_CONVERSION 10 0.5 0.25 0 10 0.5 0.25 # Apply the conversion to all values < 50\nSEG_POLY_WRITE_CONVERSION 50 11 0.5 0.275 # Apply the conversion to all values >= 50 and < 100\nSEG_POLY_WRITE_CONVERSION 100 12 0.5 0.3 # Apply the conversion to all values >= 100\n"})})})]}),"\n",(0,i.jsx)(n.h2,{id:"unix_time_conversion",children:"UNIX_TIME_CONVERSION"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Converts values to a native Ruby or Python time object"})}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Description"}),(0,i.jsx)(n.th,{children:"Required"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Seconds Item Name"}),(0,i.jsx)(n.td,{children:"The name of the item which contains the seconds since the epoch."}),(0,i.jsx)(n.td,{children:"True"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Microseconds Item Name"}),(0,i.jsx)(n.td,{children:"The name of the item which contains the microseconds since the epoch."}),(0,i.jsx)(n.td,{children:"False"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Seconds Type"}),(0,i.jsxs)(n.td,{children:["How to read the seconds item. Defaults to 'RAW'.",(0,i.jsx)("br",{}),(0,i.jsx)("br",{}),"Valid Values: ",(0,i.jsx)("span",{class:"values",children:"RAW, CONVERTED"})]}),(0,i.jsx)(n.td,{children:"False"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Microseconds Type"}),(0,i.jsxs)(n.td,{children:["How to read the microseconds item. Defaults to 'RAW'.",(0,i.jsx)("br",{}),(0,i.jsx)("br",{}),"Valid Values: ",(0,i.jsx)("span",{class:"values",children:"RAW, CONVERTED"})]}),(0,i.jsx)(n.td,{children:"False"})]})]})]}),"\n",(0,i.jsxs)(r,{groupId:"script-language",children:[(0,i.jsx)(s,{value:"python",label:"Python",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"READ_CONVERSION openc3/conversions/unix_time_conversion.py TIMESEC TIMEUS\n"})})}),(0,i.jsx)(s,{value:"ruby",label:"Ruby",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-ruby",children:"READ_CONVERSION unix_time_conversion.rb TIMESEC TIMEUS\n"})})})]}),"\n",(0,i.jsx)(n.h2,{id:"unix_time_formatted_conversion",children:"UNIX_TIME_FORMATTED_CONVERSION"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsxs)(n.strong,{children:['Converts values to a formatted time string like "YYYY/MM/DD HH:MM',":SS",'.US"']})}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Description"}),(0,i.jsx)(n.th,{children:"Required"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Seconds Item Name"}),(0,i.jsx)(n.td,{children:"The name of the item which contains the seconds since the epoch."}),(0,i.jsx)(n.td,{children:"True"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Microseconds Item Name"}),(0,i.jsx)(n.td,{children:"The name of the item which contains the microseconds since the epoch."}),(0,i.jsx)(n.td,{children:"False"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Seconds Type"}),(0,i.jsxs)(n.td,{children:["How to read the seconds item. Defaults to 'RAW'.",(0,i.jsx)("br",{}),(0,i.jsx)("br",{}),"Valid Values: ",(0,i.jsx)("span",{class:"values",children:"RAW, CONVERTED"})]}),(0,i.jsx)(n.td,{children:"False"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Microseconds Type"}),(0,i.jsxs)(n.td,{children:["How to read the microseconds item. Defaults to 'RAW'.",(0,i.jsx)("br",{}),(0,i.jsx)("br",{}),"Valid Values: ",(0,i.jsx)("span",{class:"values",children:"RAW, CONVERTED"})]}),(0,i.jsx)(n.td,{children:"False"})]})]})]}),"\n",(0,i.jsxs)(r,{groupId:"script-language",children:[(0,i.jsx)(s,{value:"python",label:"Python",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"READ_CONVERSION openc3/conversions/unix_time_formatted_conversion.py TIMESEC TIMEUS\n"})})}),(0,i.jsx)(s,{value:"ruby",label:"Ruby",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-ruby",children:"READ_CONVERSION unix_time_formatted_conversion.rb TIMESEC TIMEUS\n"})})})]}),"\n",(0,i.jsx)(n.h2,{id:"unix_time_seconds_conversion",children:"UNIX_TIME_SECONDS_CONVERSION"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Converts values to a floating point number of seconds since the epoch"})}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Parameter"}),(0,i.jsx)(n.th,{children:"Description"}),(0,i.jsx)(n.th,{children:"Required"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Seconds Item Name"}),(0,i.jsx)(n.td,{children:"The name of the item which contains the seconds since the epoch."}),(0,i.jsx)(n.td,{children:"True"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Microseconds Item Name"}),(0,i.jsx)(n.td,{children:"The name of the item which contains the microseconds since the epoch."}),(0,i.jsx)(n.td,{children:"False"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Seconds Type"}),(0,i.jsxs)(n.td,{children:["How to read the seconds item. Defaults to 'RAW'.",(0,i.jsx)("br",{}),(0,i.jsx)("br",{}),"Valid Values: ",(0,i.jsx)("span",{class:"values",children:"RAW, CONVERTED"})]}),(0,i.jsx)(n.td,{children:"False"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Microseconds Type"}),(0,i.jsxs)(n.td,{children:["How to read the microseconds item. Defaults to 'RAW'.",(0,i.jsx)("br",{}),(0,i.jsx)("br",{}),"Valid Values: ",(0,i.jsx)("span",{class:"values",children:"RAW, CONVERTED"})]}),(0,i.jsx)(n.td,{children:"False"})]})]})]}),"\n",(0,i.jsxs)(r,{groupId:"script-language",children:[(0,i.jsx)(s,{value:"python",label:"Python",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"READ_CONVERSION openc3/conversions/unix_time_seconds_conversion.py TIMESEC TIMEUS\n"})})}),(0,i.jsx)(s,{value:"ruby",label:"Ruby",children:(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-ruby",children:"READ_CONVERSION unix_time_seconds_conversion.rb TIMESEC TIMEUS\n"})})})]})]})}function h(e={}){let{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}function p(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},5511:function(e,n,s){s.d(n,{R:()=>t,x:()=>c});var r=s(6363);let i={},o=r.createContext(i);function t(e){let n=r.useContext(o);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:t(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([["6112"],{221:function(e,t,n){n.r(t),n.d(t,{frontMatter:()=>l,toc:()=>r,default:()=>h,metadata:()=>i,assets:()=>d,contentTitle:()=>s});var i=JSON.parse('{"id":"tools/table-manager","title":"Table Manager","description":"Binary file editor with upload / download","source":"@site/docs/tools/table-manager.md","sourceDirName":"tools","slug":"/tools/table-manager","permalink":"/tools/staticdocs/docs/tools/table-manager","draft":false,"unlisted":false,"editUrl":"https://github.com/OpenC3/cosmos/tree/main/docs.openc3.com/docs/tools/table-manager.md","tags":[],"version":"current","frontMatter":{"title":"Table Manager","description":"Binary file editor with upload / download","sidebar_custom_props":{"myEmoji":"\u{1FA91}"}},"sidebar":"defaultSidebar","previous":{"title":"System Health (Enterprise)","permalink":"/tools/staticdocs/docs/tools/systemhealth"},"next":{"title":"Telemetry Grapher","permalink":"/tools/staticdocs/docs/tools/tlm-grapher"}}'),o=n(7259),a=n(5511);let l={title:"Table Manager",description:"Binary file editor with upload / download",sidebar_custom_props:{myEmoji:"\u{1FA91}"}},s,d={},r=[{value:"Introduction",id:"introduction",level:2},{value:"File Menu Items",id:"file-menu-items",level:3},{value:"File Download",id:"file-download",level:2},{value:"Upload / Download",id:"upload--download",level:2},{value:"upload.rb",id:"uploadrb",level:3},{value:"download.rb",id:"downloadrb",level:3}];function c(e){let t={a:"a",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h2,{id:"introduction",children:"Introduction"}),"\n",(0,o.jsxs)(t.p,{children:["Table Manager is a binary file editor. It takes binary file ",(0,o.jsx)(t.a,{href:"/tools/staticdocs/docs/configuration/table",children:"definitions"})," similar to the COSMOS command packet definitions and builds a GUI to edit the fields in the binary file."]}),"\n",(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"Table Manager",src:n(5589).A+"",width:"1272",height:"849"})}),"\n",(0,o.jsx)(t.h3,{id:"file-menu-items",children:"File Menu Items"}),"\n",(0,o.jsx)("img",{src:n(3901).A,alt:"File Menu",style:{float:"left","margin-right":"50px",height:"150px"}}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsxs)(t.li,{children:["Create a new binary based on ",(0,o.jsx)(t.a,{href:"/tools/staticdocs/docs/configuration/table",children:"definition"})]}),"\n",(0,o.jsx)(t.li,{children:"Open an existing binary"}),"\n",(0,o.jsx)(t.li,{children:"Save the current binary"}),"\n",(0,o.jsx)(t.li,{children:"Rename the current binary"}),"\n",(0,o.jsx)(t.li,{children:"Delete the current binary"}),"\n"]}),"\n",(0,o.jsx)(t.h2,{id:"file-download",children:"File Download"}),"\n",(0,o.jsxs)(t.p,{children:["The three buttons next to File Download download the binary file, the ",(0,o.jsx)(t.a,{href:"/tools/staticdocs/docs/configuration/table",children:"definition"})," file, and the report file. The binary is the raw bits defined by the table. The ",(0,o.jsx)(t.a,{href:"/tools/staticdocs/docs/configuration/table",children:"definition"})," is the structure definition of those raw bits. The report file is a Table Manager generated CSV that shows all the table values in the binary."]}),"\n",(0,o.jsx)(t.h2,{id:"upload--download",children:"Upload / Download"}),"\n",(0,o.jsxs)(t.p,{children:["Table Manager has the ability to directly call a COSMOS script to upload a binary file to a target or download a file into Table Manager. If a file called ",(0,o.jsx)(t.code,{children:"upload.rb"})," is found in the Target's procedures directory then the Upload button becomes active. If a file called ",(0,o.jsx)(t.code,{children:"download.rb"})," is found in the Target's procedures directory then the Download button becomes active. The B/G button indicates whether to run the upload / download scripts in the background. If you uncheck this box a new Script Runner window will show the line by line execution of the script."]}),"\n",(0,o.jsx)(t.h3,{id:"uploadrb",children:"upload.rb"}),"\n",(0,o.jsxs)(t.p,{children:["The COSMOS demo creates the following ",(0,o.jsx)(t.code,{children:"upload.rb"})," script. Note that the ",(0,o.jsx)(t.code,{children:"ENV['TBL_FILENAME']"})," is set to the name of the table file and the script uses ",(0,o.jsx)(t.code,{children:"get_target_file"})," to get access to the file. At this point the logic to upload the file to the target is specific to the commanding defined by the target but an example script is given."]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-ruby",children:'# TBL_FILENAME is set to the name of the table file\nputs "file:#{ENV[\'TBL_FILENAME\']}"\n# Open the file\nfile = get_target_file(ENV[\'TBL_FILENAME\'])\nbuffer = file.read\n# puts buffer.formatted\n# Implement custom commanding logic to upload the table\n# Note that buffer is a Ruby string of bytes\n# You probably want to do something like:\n# buf_size = 512 # Size of a buffer in the upload command\n# i = 0\n# while i < buffer.length\n# # Send a part of the buffer\n# # NOTE: triple dots means start index, up to but not including, end index\n# # while double dots means start index, up to AND including, end index\n# cmd("TGT", "UPLOAD", "DATA" => buffer[i...(i + buf_size)])\n# i += buf_size\n# end\nfile.delete\n'})}),"\n",(0,o.jsx)(t.h3,{id:"downloadrb",children:"download.rb"}),"\n",(0,o.jsxs)(t.p,{children:["The COSMOS demo creates the following ",(0,o.jsx)(t.code,{children:"download.rb"})," script. Note that the ",(0,o.jsx)(t.code,{children:"ENV['TBL_FILENAME']"})," is set to the name of the table file to OVERWRITE and the script uses ",(0,o.jsx)(t.code,{children:"put_target_file"})," to get access to the file. At this point the logic to download the file from the target is specific to the commanding defined by the target but an example script is given."]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-ruby",children:"# TBL_FILENAME is set to the name of the table file to overwrite\nputs \"file:#{ENV['TBL_FILENAME']}\"\n# Download the file\n# Implement custom commanding logic to download the table\n# You probably want to do something like:\nbuffer = ''\n# i = 1\n# num_segments = 5 # calculate based on TBL_FILENAME\n# table_id = 1 # calculate based on TBL_FILENAME\n# while i < num_segments\n# # Request a part of the table buffer\n# cmd(\"TGT DUMP with TABLE_ID #{table_id}, SEGMENT #{i}\")\n# buffer += tlm(\"TGT DUMP_PKT DATA\")\n# i += 1\n# end\nput_target_file(ENV['TBL_FILENAME'], buffer)\n"})})]})}function h(e={}){let{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},3901:function(e,t,n){n.d(t,{A:()=>i});let i=n.p+"assets/images/file_menu-d672c1f8064e5f847a2464397c1e75ee423452f1ba4a7d0861319bc7c7891196.png"},5589:function(e,t,n){n.d(t,{A:()=>i});let i=n.p+"assets/images/table_manager-816d7a683e6883cb8049e5ec8ffef3076b37a489edcc0e5331bc5d81ab506da2.png"},5511:function(e,t,n){n.d(t,{R:()=>l,x:()=>s});var i=n(6363);let o={},a=i.createContext(o);function l(e){let t=i.useContext(a);return i.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:l(e.components),i.createElement(a.Provider,{value:t},e.children)}}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([["8104"],{176:function(e,t,i){i.r(t),i.d(t,{frontMatter:()=>d,toc:()=>o,default:()=>h,metadata:()=>n,assets:()=>a,contentTitle:()=>l});var n=JSON.parse('{"id":"configuration/target","title":"Targets","description":"Target definition file format and keywords","source":"@site/docs/configuration/target.md","sourceDirName":"configuration","slug":"/configuration/target","permalink":"/tools/staticdocs/docs/configuration/target","draft":false,"unlisted":false,"editUrl":"https://github.com/OpenC3/cosmos/tree/main/docs.openc3.com/docs/configuration/target.md","tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"sidebar_position":3,"title":"Targets","description":"Target definition file format and keywords","sidebar_custom_props":{"myEmoji":"\u{1F6F0}\uFE0F"}},"sidebar":"defaultSidebar","previous":{"title":"Plugins","permalink":"/tools/staticdocs/docs/configuration/plugins"},"next":{"title":"Commands","permalink":"/tools/staticdocs/docs/configuration/command"}}'),r=i(7259),s=i(5511);let d={sidebar_position:3,title:"Targets",description:"Target definition file format and keywords",sidebar_custom_props:{myEmoji:"\u{1F6F0}\uFE0F"}},l="target.txt Keywords",a={},o=[{value:"LANGUAGE",id:"language",level:2},{value:"REQUIRE",id:"require",level:2},{value:"IGNORE_PARAMETER",id:"ignore_parameter",level:2},{value:"IGNORE_ITEM",id:"ignore_item",level:2},{value:"COMMANDS",id:"commands",level:2},{value:"TELEMETRY",id:"telemetry",level:2},{value:"CMD_UNIQUE_ID_MODE",id:"cmd_unique_id_mode",level:2},{value:"TLM_UNIQUE_ID_MODE",id:"tlm_unique_id_mode",level:2}];function c(e){let t={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(t.p,{children:["Targets are the external embedded systems that COSMOS connects to. Targets are defined by the top level ",(0,r.jsx)(t.a,{href:"/tools/staticdocs/docs/configuration/plugins#target-1",children:"TARGET"})," keyword in the plugin.txt file. Each target is self contained in a target directory named after the target. In the root of the target directory there is a configuration file named target.txt which configures the individual target."]}),"\n",(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"targettxt-keywords",children:"target.txt Keywords"})}),"\n",(0,r.jsx)(t.h2,{id:"language",children:"LANGUAGE"}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)("div",{class:"right",children:"(Since 5.11.1)"}),(0,r.jsx)(t.strong,{children:"Programming language of the target interfaces and microservices"})]}),"\n",(0,r.jsx)(t.p,{children:"The target language must be either Ruby or Python. The language determines how the target's interfaces and microservices are run. Note that both Ruby and Python still use ERB to perform templating."}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Parameter"}),(0,r.jsx)(t.th,{children:"Description"}),(0,r.jsx)(t.th,{children:"Required"})]})}),(0,r.jsx)(t.tbody,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{}),(0,r.jsxs)(t.td,{children:["Ruby or Python",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"Valid Values: ",(0,r.jsx)("span",{class:"values",children:"ruby, python"})]}),(0,r.jsx)(t.td,{children:"True"})]})})]}),"\n",(0,r.jsx)(t.p,{children:"Example Usage:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-ruby",children:"LANGUAGE python\n"})}),"\n",(0,r.jsx)(t.h2,{id:"require",children:"REQUIRE"}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Requires a Ruby file"})}),"\n",(0,r.jsx)(t.p,{children:"List the Ruby files required to explicitly declare dependencies. This is now completely optional."}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Parameter"}),(0,r.jsx)(t.th,{children:"Description"}),(0,r.jsx)(t.th,{children:"Required"})]})}),(0,r.jsx)(t.tbody,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Filename"}),(0,r.jsx)(t.td,{children:'Filename to require. For files in the target\'s lib directory simply supply the filename, e.g. "REQUIRE my_file". Files in the base OpenC3 lib directory also should just list the filename. If a file is in a folder under the lib directory then you must specify the folder name, e.g. "REQUIRE folder/my_file". Note the ".rb" extension is optional when specifying the filename.'}),(0,r.jsx)(t.td,{children:"True"})]})})]}),"\n",(0,r.jsx)(t.p,{children:"Example Usage:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-ruby",children:"REQUIRE limits_response.rb\n"})}),"\n",(0,r.jsx)(t.h2,{id:"ignore_parameter",children:"IGNORE_PARAMETER"}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Ignore the given command parameter"})}),"\n",(0,r.jsx)(t.p,{children:"Hint to other OpenC3 tools to hide or ignore this command parameter when processing the command. For example, Command Sender and Command Sequence will not display the parameter (by default) when showing the command and Script Runner code completion will not display the parameter."}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Parameter"}),(0,r.jsx)(t.th,{children:"Description"}),(0,r.jsx)(t.th,{children:"Required"})]})}),(0,r.jsx)(t.tbody,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Parameter Name"}),(0,r.jsx)(t.td,{children:"The name of a command parameter. Note that this parameter will be ignored in ALL the commands it appears in."}),(0,r.jsx)(t.td,{children:"True"})]})})]}),"\n",(0,r.jsx)(t.p,{children:"Example Usage:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-ruby",children:"IGNORE_PARAMETER CCSDS_VERSION\n"})}),"\n",(0,r.jsx)(t.h2,{id:"ignore_item",children:"IGNORE_ITEM"}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Ignore the given telemetry item"})}),"\n",(0,r.jsx)(t.p,{children:"Hint to other OpenC3 tools to hide or ignore this telemetry item when processing the telemetry. For example, Packet Viewer will not display the item (by default) when showing the packet."}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Parameter"}),(0,r.jsx)(t.th,{children:"Description"}),(0,r.jsx)(t.th,{children:"Required"})]})}),(0,r.jsx)(t.tbody,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Item name"}),(0,r.jsx)(t.td,{children:"The name of a telemetry item. Note that this item will be ignored in ALL the telemetry it appears in."}),(0,r.jsx)(t.td,{children:"True"})]})})]}),"\n",(0,r.jsx)(t.p,{children:"Example Usage:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-ruby",children:"IGNORE_ITEM CCSDS_VERSION\n"})}),"\n",(0,r.jsx)(t.h2,{id:"commands",children:"COMMANDS"}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Process the given command definition file"})}),"\n",(0,r.jsx)(t.p,{children:"This keyword is used to explicitly add the command definition file to the list of command and telemetry files to process."}),"\n",(0,r.jsx)(t.admonition,{type:"warning",children:(0,r.jsx)(t.p,{children:"Usage of this keyword overrides automatic command and telemetry file discovery. If this keyword is used, you must also use the TELEMETRY keyword to specify the telemetry files to process."})}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Parameter"}),(0,r.jsx)(t.th,{children:"Description"}),(0,r.jsx)(t.th,{children:"Required"})]})}),(0,r.jsx)(t.tbody,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Filename"}),(0,r.jsx)(t.td,{children:'Name of a command definition file in the target\'s cmd_tlm directory, e.g. "cmd.txt".'}),(0,r.jsx)(t.td,{children:"True"})]})})]}),"\n",(0,r.jsx)(t.p,{children:"Example Usage:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-ruby",children:"COMMANDS inst_cmds_v2.txt\nTELEMETRY inst_tlm_v2.txt\n"})}),"\n",(0,r.jsx)(t.h2,{id:"telemetry",children:"TELEMETRY"}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Process the given telemetry definition file"})}),"\n",(0,r.jsx)(t.p,{children:"This keyword is used to explicitly add the telemetry definition file to the list of command and telemetry files to process."}),"\n",(0,r.jsx)(t.admonition,{type:"warning",children:(0,r.jsx)(t.p,{children:"Usage of this keyword overrides automatic command and telemetry file discovery. If this keyword is used, you must also use the COMMAND keyword to specify the command files to process."})}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Parameter"}),(0,r.jsx)(t.th,{children:"Description"}),(0,r.jsx)(t.th,{children:"Required"})]})}),(0,r.jsx)(t.tbody,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Filename"}),(0,r.jsx)(t.td,{children:'Name of a telemetry definition file in the target\'s cmd_tlm directory, e.g. "tlm.txt".'}),(0,r.jsx)(t.td,{children:"True"})]})})]}),"\n",(0,r.jsx)(t.p,{children:"Example Usage:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-ruby",children:"COMMANDS inst_cmds_v2.txt\nTELEMETRY inst_tlm_v2.txt\n"})}),"\n",(0,r.jsx)(t.h2,{id:"cmd_unique_id_mode",children:"CMD_UNIQUE_ID_MODE"}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)("div",{class:"right",children:"(Since 4.4.0)"}),(0,r.jsx)(t.strong,{children:"Command packet identifiers don't all share the same bit offset, size, and type"})]}),"\n",(0,r.jsx)(t.p,{children:"Ideally all commands for a target are identified using the exact same bit offset, size, and type field in each command. If ANY command identifiers differ then this flag must be set to force a brute force identification method."}),"\n",(0,r.jsx)(t.admonition,{type:"warning",children:(0,r.jsx)(t.p,{children:"Using this mode significantly slows packet identification"})}),"\n",(0,r.jsx)(t.h2,{id:"tlm_unique_id_mode",children:"TLM_UNIQUE_ID_MODE"}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)("div",{class:"right",children:"(Since 4.4.0)"}),(0,r.jsx)(t.strong,{children:"Telemetry packets identifiers don't all share the same bit offset, size, and type"})]}),"\n",(0,r.jsx)(t.p,{children:"Ideally all telemetry for a target are identified using the exact same bit offset, size, and type field in each packet. If ANY telemetry identifiers differ then this flag must be set to force a brute force identification method."}),"\n",(0,r.jsx)(t.admonition,{type:"warning",children:(0,r.jsx)(t.p,{children:"Using this mode significantly slows packet identification"})})]})}function h(e={}){let{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},5511:function(e,t,i){i.d(t,{R:()=>d,x:()=>l});var n=i(6363);let r={},s=n.createContext(r);function d(e){let t=n.useContext(s);return n.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(r):e.components||r:d(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([["6175"],{20:function(t){t.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Meta","slug":"/meta","permalink":"/tools/staticdocs/docs/meta","sidebar":"defaultSidebar","navigation":{"previous":{"title":"Testing COSMOS","permalink":"/tools/staticdocs/docs/development/testing"},"next":{"title":"Contributing","permalink":"/tools/staticdocs/docs/meta/contributing"}}}}')}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([["1548"],{6936:function(e,o,s){s.r(o),s.d(o,{frontMatter:()=>r,toc:()=>d,default:()=>h,metadata:()=>n,assets:()=>l,contentTitle:()=>c});var n=JSON.parse('{"id":"guides/troubleshooting","title":"Troubleshooting","description":"How to solve various issues we\'ve encountered","source":"@site/docs/guides/troubleshooting.md","sourceDirName":"guides","slug":"/guides/troubleshooting","permalink":"/tools/staticdocs/docs/guides/troubleshooting","draft":false,"unlisted":false,"editUrl":"https://github.com/OpenC3/cosmos/tree/main/docs.openc3.com/docs/guides/troubleshooting.md","tags":[],"version":"current","frontMatter":{"title":"Troubleshooting","description":"How to solve various issues we\'ve encountered","sidebar_custom_props":{"myEmoji":"\u{1F914}"}},"sidebar":"defaultSidebar","previous":{"title":"Scripting API Guide","permalink":"/tools/staticdocs/docs/guides/scripting-api"},"next":{"title":"Development","permalink":"/tools/staticdocs/docs/development"}}'),t=s(7259),i=s(5511);let r={title:"Troubleshooting",description:"How to solve various issues we've encountered",sidebar_custom_props:{myEmoji:"\u{1F914}"}},c,l={},d=[];function a(e){let o={a:"a",code:"code",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(o.p,{children:["We've seen a number of issues deploying COSMOS via Docker in various types of installations from single server to the cloud. This page captures some of the subtle issues we've discovered and ways to solve the problem. NOTE: Don't forget to also search our ",(0,t.jsx)(o.a,{href:"https://github.com/OpenC3/cosmos/issues",children:"Github Issues"})," (hit '/' and start typing)."]}),"\n",(0,t.jsxs)(o.ol,{children:["\n",(0,t.jsxs)(o.li,{children:["\n",(0,t.jsx)(o.p,{children:'After dozens of installed targets and interfaces, the CmdTlmServer logs indicate "unable to create thread". Microservices are crashing or not starting.'}),"\n",(0,t.jsxs)(o.p,{children:["This is typically due to hard limits on processes or file handles imposed by Linux. If you're on Podman, ensure you've followed the directions from the ",(0,t.jsx)(o.a,{href:"/docs/getting-started/podman",children:"Podman"})," page and have increased the ",(0,t.jsx)(o.code,{children:"pids_limit"})," in ",(0,t.jsx)(o.code,{children:"/etc/containers/containers.conf"}),". Also check your ",(0,t.jsx)(o.code,{children:"ulimit"})," variables by typing ",(0,t.jsx)(o.code,{children:"ulimit -a"})," and increase your file descriptors (",(0,t.jsx)(o.code,{children:"ulimit -t 65536"}),")."]}),"\n"]}),"\n",(0,t.jsxs)(o.li,{children:["\n",(0,t.jsx)(o.p,{children:"COSMOS becomes slow or unresponsive especially as additional plugins are added"}),"\n",(0,t.jsxs)(o.p,{children:["You may be maxing out your system. If you're on Enterprise you can check the ",(0,t.jsx)(o.a,{href:"/docs/tools/systemhealth",children:"System Health Tool"}),". Exec into the operator container (runs all the microservices) and see what the utilization is. NOTE: The container name may be different but you find it with ",(0,t.jsx)(o.code,{children:"docker ps"}),"."]}),"\n",(0,t.jsx)(o.pre,{children:(0,t.jsx)(o.code,{className:"language-bash",children:"docker ps\ndocker exec -it cosmos-openc3-operator-1 sh\n$ htop\n"})}),"\n",(0,t.jsx)(o.p,{children:"Check your memory utilization and CPU utilization. Is a single core pegged? You may need to distribute your workload better."}),"\n",(0,t.jsx)(o.p,{children:"If you're running Docker Desktop (Windows or Mac OS) you can update the Settings / Resources to add additional CPUs or Memory."}),"\n"]}),"\n",(0,t.jsxs)(o.li,{children:["\n",(0,t.jsx)(o.p,{children:'You\'re getting "too many files open" errors'}),"\n",(0,t.jsxs)(o.p,{children:["Check your ",(0,t.jsx)(o.code,{children:"ulimit"})," variables by typing ",(0,t.jsx)(o.code,{children:"ulimit -a"})," and increase your file descriptors ",(0,t.jsx)(o.code,{children:"ulimit -t 65536"}),". Note that you may want to put this in your ",(0,t.jsx)(o.code,{children:".bashrc"}),", ",(0,t.jsx)(o.code,{children:".zshrc"}),", etc to make this permanent."]}),"\n"]}),"\n",(0,t.jsxs)(o.li,{children:["\n",(0,t.jsx)(o.p,{children:"You get networking errors (without certificates)"}),"\n",(0,t.jsxs)(o.p,{children:["Make sure you're using ",(0,t.jsx)(o.code,{children:"127.0.0.1"})," instead of ",(0,t.jsx)(o.code,{children:"localhost"}),". Sometimes we've seen ",(0,t.jsx)(o.code,{children:"localhost"})," get mapped to ",(0,t.jsx)(o.code,{children:"::1"})," (IPV6) instead of ",(0,t.jsx)(o.code,{children:"127.0.0.1"})," (IPV4) which typically breaks things."]}),"\n",(0,t.jsxs)(o.p,{children:["Check your ",(0,t.jsx)(o.code,{children:"/etc/resolve.conf"})," and make sure you don't have any ",(0,t.jsx)(o.code,{children:"search"})," entries. You should have simple ",(0,t.jsx)(o.code,{children:"nameserver"})," entries."]}),"\n",(0,t.jsxs)(o.p,{children:["If you're on RHEL 9.x with rootless Podman make sure you've followed the directions from the ",(0,t.jsx)(o.a,{href:"/docs/getting-started/podman",children:"Podman"})," page and have configured Podman to use Netavark for DNS."]}),"\n"]}),"\n",(0,t.jsxs)(o.li,{children:["\n",(0,t.jsx)(o.p,{children:"You've enabled certificates and you're getting networking errors"}),"\n",(0,t.jsxs)(o.p,{children:["Make sure you've read both the ",(0,t.jsx)(o.a,{href:"/docs/configuration/ssl-tls",children:"SSL-TLS"})," docs and the ",(0,t.jsx)(o.a,{href:"https://github.com/OpenC3/cosmos-enterprise-project?tab=readme-ov-file#opening-to-the-network",children:"COSMOS Enterprise Project"})," instructions."]}),"\n"]}),"\n",(0,t.jsxs)(o.li,{children:["\n",(0,t.jsx)(o.p,{children:"You're getting 404 errors, missing icons, missing tools or functionality"}),"\n",(0,t.jsxs)(o.p,{children:["This is typically because the init container did not finish successfully. First examine the docker logs. NOTE: The container name maybe different but you find it with ",(0,t.jsx)(o.code,{children:"docker ps -a"}),"."]}),"\n",(0,t.jsx)(o.pre,{children:(0,t.jsx)(o.code,{className:"language-bash",children:"docker ps -a\ndocker logs cosmos-openc3-cosmos-init-1\n"})}),"\n",(0,t.jsxs)(o.p,{children:["Next ensure the files are actually present by execing into the operator container and checking. NOTE: The container name may be different but you find it with ",(0,t.jsx)(o.code,{children:"docker ps"}),"."]}),"\n",(0,t.jsx)(o.pre,{children:(0,t.jsx)(o.code,{className:"language-bash",children:"docker ps\ndocker exec -it cosmos-openc3-operator-1 sh\n$ cd /gems/gems/\n$ ls\n$ cd openc3-tool-base-6.6.1.pre.beta0.20250718002117/tools/base\n$ ls\n"})}),"\n",(0,t.jsxs)(o.p,{children:["In the above example we're making sure the tools/base files are there. You can ",(0,t.jsx)(o.code,{children:"cd"})," into any of the tools and ensure the files are present."]}),"\n"]}),"\n",(0,t.jsxs)(o.li,{children:["\n",(0,t.jsx)(o.p,{children:'On Windows, when using bind mounts in Docker compose, the system "locks up" and screens show "TooManyRequests" error'}),"\n",(0,t.jsx)(o.p,{children:"We've seen this on old versions of Docker Desktop when using bind mounts instead of named volumes. Our docker compose files use named volumes by default so be careful with bind mounts. We also recommend upgrading Docker Desktop and WLS2 if possible as this maybe OBE in newer versions of Docker Desktop / WSL2."}),"\n"]}),"\n",(0,t.jsxs)(o.li,{children:["\n",(0,t.jsxs)(o.p,{children:["When exposing COSMOS to the network through http, Chrome ",(0,t.jsx)(o.a,{href:"https://developer.chrome.com/docs/devtools/open",children:"DevTools"}),' shows "Web crypto API is not available".']}),"\n",(0,t.jsxs)(o.p,{children:["Make sure to follow all the instructions in the ",(0,t.jsx)(o.a,{href:"https://github.com/OpenC3/cosmos-enterprise-project/blob/main/README.md",children:"COSMOS Enterprise Project README"}),". In this case you need to do the following:"]}),"\n",(0,t.jsxs)(o.ul,{children:["\n",(0,t.jsx)(o.li,{children:"In Chrome go to: chrome://flags/#unsafely-treat-insecure-origin-as-secure"}),"\n",(0,t.jsx)(o.li,{children:"For Edge to to: edge://flags/#unsafely-treat-insecure-origin-as-secure"}),"\n",(0,t.jsx)(o.li,{children:"Add your http://<Your IP Address>:2900"}),"\n",(0,t.jsx)(o.li,{children:"Enable the Setting"}),"\n",(0,t.jsx)(o.li,{children:"Completely restart Chrome. On MacOS make sure the dot below the icon in chrome is gone by long pressing the icon and choosing Quit."}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(o.li,{children:["\n",(0,t.jsx)(o.p,{children:'When using your own certs, you see an error banner with "Token is invalid" with "Failed to open TCP connection to <KEYCLOAK URL> (execution expired)".'}),"\n",(0,t.jsxs)(o.p,{children:["We have seen this when a local firewall is blocking the 443 port to Keycloak. Keycloak itself can still be reachable at ",(0,t.jsx)(o.code,{children:"<KEYCLOAK URL>/auth"})," which makes it feel like this is not a firewall issue. However, if you exec into the ",(0,t.jsx)(o.code,{children:"cmd-tlm-api"})," container you should be able to curl the following Keycloak URL:"]}),"\n",(0,t.jsx)(o.pre,{children:(0,t.jsx)(o.code,{className:"language-bash",children:"docker ps\ndocker exec -it <CONTAINER ID FOR CMD_TLM_API> sh\n$ ping <KEYCLOAK URL>\n$ curl -vvv <KEYCLOAK URL>/realms/openc3/protocol/openid-connect/certs\n"})}),"\n",(0,t.jsx)(o.p,{children:"If this does not return you could be blocking the 443 port to Keycloak. Update your firewall settings and try again."}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(o.p,{children:["Encountering an issue not on this list? If you're a customer, please get in touch at ",(0,t.jsx)(o.a,{href:"mailto:support@openc3.com",children:"support@openc3.com"}),"."]})]})}function h(e={}){let{wrapper:o}={...(0,i.R)(),...e.components};return o?(0,t.jsx)(o,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},5511:function(e,o,s){s.d(o,{R:()=>r,x:()=>c});var n=s(6363);let t={},i=n.createContext(t);function r(e){let o=n.useContext(i);return n.useMemo(function(){return"function"==typeof e?e(o):{...o,...e}},[o,e])}function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),n.createElement(i.Provider,{value:o},e.children)}}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([["6443"],{17:function(e,t,s){s.r(t),s.d(t,{frontMatter:()=>l,toc:()=>c,default:()=>a,metadata:()=>n,assets:()=>o,contentTitle:()=>d});var n=JSON.parse('{"id":"guides/performance","title":"Performance","description":"Hardware requirements like memory and CPU","source":"@site/docs/guides/performance.md","sourceDirName":"guides","slug":"/guides/performance","permalink":"/tools/staticdocs/docs/guides/performance","draft":false,"unlisted":false,"editUrl":"https://github.com/OpenC3/cosmos/tree/main/docs.openc3.com/docs/guides/performance.md","tags":[],"version":"current","frontMatter":{"title":"Performance","description":"Hardware requirements like memory and CPU","sidebar_custom_props":{"myEmoji":"\u{1F4CA}"}},"sidebar":"defaultSidebar","previous":{"title":"Monitoring","permalink":"/tools/staticdocs/docs/guides/monitoring"},"next":{"title":"Raspberry Pi","permalink":"/tools/staticdocs/docs/guides/raspberrypi"}}'),r=s(7259),i=s(5511);let l={title:"Performance",description:"Hardware requirements like memory and CPU",sidebar_custom_props:{myEmoji:"\u{1F4CA}"}},d="COSMOS Hardware Requirements",o={},c=[{value:"Memory",id:"memory",level:2},{value:"CPU",id:"cpu",level:2},{value:"Performance Comparison",id:"performance-comparison",level:2}];function h(e){let t={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",section:"section",sup:"sup",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(t.p,{children:["The COSMOS architecture was created with scalability in mind. Our goal is to support an unlimited number of connections and use cloud technologies to scale. Only ",(0,r.jsx)(t.a,{href:"https://openc3.com/enterprise",children:"COSMOS Enterprise"})," supports Kubernetes and the various cloud platforms which allow this level of scalability. While true scalability is only achieved in COSMOS Enterprise, both Core and Enterprise have various levels of observability and configuration settings which can affect performance."]}),"\n",(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"cosmos-hardware-requirements",children:"COSMOS Hardware Requirements"})}),"\n",(0,r.jsx)(t.h2,{id:"memory",children:"Memory"}),"\n",(0,r.jsx)(t.p,{children:"COSMOS can run on a Raspberry Pi up to a Kubernetes cluster in the cloud. On all platforms the key performance factor is the number and complexity of the targets and their defined packets. Targets can vary from simple targets taking 100 MB of RAM to complex targets taking 400 MB. The COSMOS Core containers require about 800 MB of RAM. A good rule of thumb is to average about 300 MB of RAM for targets. As an example data point, the COSMOS Demo has 4 targets, two complex (INST & INST2) and two relatively simple (EXAMPLE & TEMPLATED), and requires 800 MB of RAM (on top of the 800 MB of base container RAM)."}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"Base RAM MB Calculator = 800 + (num targets) * 300"}),"\n"]}),"\n",(0,r.jsxs)(t.p,{children:["In addition, the Redis streams contain the last 10 min of both raw and decommutated data from all targets. Thus you must wait ~15min to truly see what the high water memory mark will be. In the COSMOS Demo the INST & INST2 targets are fairly simple with four 1Hz packet of ~15 items and one 10Hz packet with 20 items. This only causes 50 MiB of redis RAM usage according to ",(0,r.jsx)(t.code,{children:"docker stats"}),". Installing the COSMOS ",(0,r.jsx)(t.a,{href:"https://github.com/OpenC3/openc3-cosmos-load-sim",children:"LoadSim"})," with 10 packets with 1000 items each at 10Hz pushed the redis memory usage to about 350 MiB."]}),"\n",(0,r.jsx)(t.h2,{id:"cpu",children:"CPU"}),"\n",(0,r.jsx)(t.p,{children:"Another consideration is the CPU performance. In COSMOS Core, by default COSMOS spawns off 2 microservices per target. One combines packet logging and decommutation of the data and the other performs data reduction. In COSMOS Enterprise on Kubernetes, each process becomes an independent container that is deployed on the cluster allowing horizontal scaling."}),"\n",(0,r.jsxs)(t.p,{children:["The COSMOS command and telemetry API and script running API servers should have a dedicated core while targets can generally share cores. It's hard to provide a general rule of thumb with the wide variety of architectures, clock speeds, and core counts. The best practice is to install COSMOS with the expected load and do some monitoring with ",(0,r.jsx)(t.code,{children:"htop"})," to visualize the load on the various cores. Any time a single core gets overloaded (100%) this is a concern and system slowdown can occur."]}),"\n",(0,r.jsx)(t.h2,{id:"performance-comparison",children:"Performance Comparison"}),"\n",(0,r.jsxs)(t.p,{children:["Performance characterization was performed in Azure on a Standard D4s v5 (4 vcpus, 16 GiB memory) chosen to allow virtualization per ",(0,r.jsx)(t.a,{href:"https://docs.docker.com/desktop/vm-vdi/#turn-on-nested-virtualization-on-microsoft-hyper-v",children:"Docker"}),". COSMOS ",(0,r.jsx)(t.a,{href:"https://github.com/OpenC3/cosmos-enterprise/releases/tag/v5.9.1",children:"5.9.1"})," Enterprise was installed on both Windows 11 Pro ",(0,r.jsx)(t.sup,{children:(0,r.jsx)(t.a,{href:"#user-content-fn-1",id:"user-content-fnref-1","data-footnote-ref":!0,"aria-describedby":"footnote-label",children:"1"})})," and Ubuntu 22. Note: Enterprise was not utilizing Kubernetes, just Docker. Testing involved starting the COSMOS Demo, connecting all targets (EXAMPLE, INST, INST2, TEMPLATED), opening the following TlmViewer screens (ADCS, ARRAY, BLOCK, COMMANDING, HS, LATEST, LIMITS, OTHER, PARAMS, SIMPLE, TABS) and creating two TlmGrapher graphs consisting of INST HEALTH_STATUS TEMP[1-4] and INST ADCS POS[X,Y,Z] and INST ADCS VEL[X,Y,Z]. This was allowed to run for 1hr and results were collected using ",(0,r.jsx)(t.code,{children:"htop"}),":"]}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{style:{textAlign:"left"},children:"Platform"}),(0,r.jsx)(t.th,{style:{textAlign:"left"},children:"Core CPU %"}),(0,r.jsx)(t.th,{style:{textAlign:"left"},children:"RAM"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"Windows 11 Pro"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"12% 12% 10% 10%"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"3.9G / 7.7G"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"Headless Ubuntu 22"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"7% 7% 8% 6%"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"3.2G / 15.6G"})]})]})]}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:["Windows was only allocated 8 GB of RAM due to the ",(0,r.jsx)(t.a,{href:"https://learn.microsoft.com/en-us/windows/wsl/wsl-config#configuration-setting-for-wslconfig",children:".wslconfig"})," settings."]}),"\n",(0,r.jsx)(t.li,{children:"Since Ubuntu was running headless, the screens and graphs were brought up on another machine."}),"\n"]}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.code,{children:"docker stats"})," was also run to show individual container cpu and memory usage:"]}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{style:{textAlign:"left"},children:"NAME"}),(0,r.jsx)(t.th,{style:{textAlign:"left"},children:"Windows CPU %"}),(0,r.jsx)(t.th,{children:"Ubuntu CPU %"}),(0,r.jsx)(t.th,{style:{textAlign:"left"},children:"Windows MEM"}),(0,r.jsx)(t.th,{children:"Ubuntu MEM"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"cosmos-enterprise-project-openc3-traefik-1"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"4.16%"}),(0,r.jsx)(t.td,{children:"1.32%"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"43.54MiB"}),(0,r.jsx)(t.td,{children:"51.38MiB"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"cosmos-enterprise-project-openc3-cosmos-cmd-tlm-api-1"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"10.16%"}),(0,r.jsx)(t.td,{children:"6.14%"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"401.6MiB"}),(0,r.jsx)(t.td,{children:"392MiB"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"cosmos-enterprise-project-openc3-keycloak-1"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"0.17%"}),(0,r.jsx)(t.td,{children:"0.13%"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"476.8MiB"}),(0,r.jsx)(t.td,{children:"476.8MiB"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"cosmos-enterprise-project-openc3-operator-1"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"21.27%"}),(0,r.jsx)(t.td,{children:"13.91%"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"1.214GiB"}),(0,r.jsx)(t.td,{children:"1.207GiB"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"cosmos-enterprise-project-openc3-cosmos-script-runner-api-1"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"0.01%"}),(0,r.jsx)(t.td,{children:"0.01%"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"127.4MiB"}),(0,r.jsx)(t.td,{children:"117.1MiB"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"cosmos-enterprise-project-openc3-metrics-1"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"0.01%"}),(0,r.jsx)(t.td,{children:"0.00%"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"105.2MiB"}),(0,r.jsx)(t.td,{children:"83.87MiB"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"cosmos-enterprise-project-openc3-redis-ephemeral-1"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"4.05%"}),(0,r.jsx)(t.td,{children:"1.89%"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"46.22MiB"}),(0,r.jsx)(t.td,{children:"69.84MiB"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"cosmos-enterprise-project-openc3-redis-1"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"1.56%"}),(0,r.jsx)(t.td,{children:"0.72%"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"12.82MiB"}),(0,r.jsx)(t.td,{children:"9.484MiB"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"cosmos-enterprise-project-openc3-minio-1"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"0.01%"}),(0,r.jsx)(t.td,{children:"0.00%"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"152.9MiB"}),(0,r.jsx)(t.td,{children:"169.8MiB"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"cosmos-enterprise-project-openc3-postgresql-1"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"0.00%"}),(0,r.jsx)(t.td,{children:"0.39%"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"37.33MiB"}),(0,r.jsx)(t.td,{children:"41.02MiB"})]})]})]}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"memory profiles are similar between the two platforms"}),"\n",(0,r.jsx)(t.li,{children:"redis-ephemeral isn't using much memory on the Core Demo with its small packets"}),"\n"]}),"\n",(0,r.jsxs)(t.p,{children:["At this point the COSMOS ",(0,r.jsx)(t.a,{href:"https://github.com/OpenC3/openc3-cosmos-load-sim",children:"LoadSim"})," was installed with default settings which creates 10 packets with 1000 items each at 10Hz (110kB/s). After a 1 hr soak, htop now indicated:"]}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{style:{textAlign:"left"},children:"Platform"}),(0,r.jsx)(t.th,{style:{textAlign:"left"},children:"Core CPU %"}),(0,r.jsx)(t.th,{style:{textAlign:"left"},children:"RAM"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"Windows 11 Pro"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"40% 35% 39% 42%"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"4.64G / 7.7G"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"Headless Ubuntu 22"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"17% 20% 16% 18%"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"3.74G / 15.6G"})]})]})]}),"\n",(0,r.jsx)(t.p,{children:"The larger packets and data rate of the LoadSim target caused both platforms to dramatically increase CPU utilization but the Linux machine stays quite performant."}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.code,{children:"docker stats"})," was also run to show individual container cpu and memory usage:"]}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{style:{textAlign:"left"},children:"NAME"}),(0,r.jsx)(t.th,{style:{textAlign:"left"},children:"Windows CPU %"}),(0,r.jsx)(t.th,{children:"Ubuntu CPU %"}),(0,r.jsx)(t.th,{style:{textAlign:"left"},children:"Windows MEM"}),(0,r.jsx)(t.th,{children:"Ubuntu MEM"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"cosmos-enterprise-project-openc3-traefik-1"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"4.09%"}),(0,r.jsx)(t.td,{children:"0.01%"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"44.3MiB"}),(0,r.jsx)(t.td,{children:"0.34MiB"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"cosmos-enterprise-project-openc3-cosmos-cmd-tlm-api-1"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"17.78%"}),(0,r.jsx)(t.td,{children:"6.18%"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"407.9MiB"}),(0,r.jsx)(t.td,{children:"405.8MiB"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"cosmos-enterprise-project-openc3-keycloak-1"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"0.20%"}),(0,r.jsx)(t.td,{children:"0.12%"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"480.2MiB"}),(0,r.jsx)(t.td,{children:"481.5MiB"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"cosmos-enterprise-project-openc3-operator-1"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"221.15%"}),(0,r.jsx)(t.td,{children:"66.72%"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"1.6GiB"}),(0,r.jsx)(t.td,{children:"1.512GiB"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"cosmos-enterprise-project-openc3-cosmos-script-runner-api-1"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"0.01%"}),(0,r.jsx)(t.td,{children:"0.01%"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"136.6MiB"}),(0,r.jsx)(t.td,{children:"127.5MiB"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"cosmos-enterprise-project-openc3-metrics-1"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"0.01%"}),(0,r.jsx)(t.td,{children:"0.01%"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"106.3MiB"}),(0,r.jsx)(t.td,{children:"84.87MiB"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"cosmos-enterprise-project-openc3-redis-ephemeral-1"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"19.63%"}),(0,r.jsx)(t.td,{children:"3.91%"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"333.8MiB"}),(0,r.jsx)(t.td,{children:"370.8MiB"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"cosmos-enterprise-project-openc3-redis-1"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"7.42%"}),(0,r.jsx)(t.td,{children:"1.49%"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"15.87MiB"}),(0,r.jsx)(t.td,{children:"11.81MiB"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"cosmos-enterprise-project-openc3-minio-1"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"0.10%"}),(0,r.jsx)(t.td,{children:"0.02%"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"167.8MiB"}),(0,r.jsx)(t.td,{children:"179.2MiB"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"cosmos-enterprise-project-openc3-postgresql-1"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"0.00%"}),(0,r.jsx)(t.td,{children:"0.00%"}),(0,r.jsx)(t.td,{style:{textAlign:"left"},children:"35.4MiB"}),(0,r.jsx)(t.td,{children:"42.93MiB"})]})]})]}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"memory profiles are similar between the two platforms"}),"\n",(0,r.jsx)(t.li,{children:"redis-ephemeral is now using much more RAM as it is storing the large LoadSim packets"}),"\n",(0,r.jsx)(t.li,{children:"Windows is using much more CPU power running the operator, cmd-tlm, and redis"}),"\n"]}),"\n",(0,r.jsx)(t.h1,{id:"conclusions",children:"Conclusions"}),"\n",(0,r.jsxs)(t.p,{children:["While it is easy to run COSMOS on any Docker platform, increasing the number and complexity of the targets requires choosing the correct hardware. Sizing can be approximated but the best solution is to install representative targets and use ",(0,r.jsx)(t.code,{children:"docker stats"})," and ",(0,r.jsx)(t.code,{children:"htop"})," to judge the CPU and memory pressure on the given hardware."]}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.a,{href:"https://openc3.com/enterprise",children:"COSMOS Enterprise"})," on Kubernetes helps to eliminate the hardware sizing issue by scaling the cluster to meet the needs of the system. Check out ",(0,r.jsx)(t.a,{href:"https://openc3.com/news/scaling",children:"this recent talk"})," Ryan gave at GSAW showing how we scaled to over 160 satellites on a 4 node kubernetes cluster on EKS."]}),"\n",(0,r.jsx)("hr",{}),"\n","\n",(0,r.jsxs)(t.section,{"data-footnotes":!0,className:"footnotes",children:[(0,r.jsx)(t.h2,{className:"sr-only",id:"footnote-label",children:"Footnotes"}),"\n",(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsxs)(t.li,{id:"user-content-fn-1",children:["\n",(0,r.jsx)(t.p,{children:"Full specs of the Windows Platform:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"Windows 11 Pro\nDocker Desktop 4.22.0\nWSL version: 1.2.5.0\nKernel version: 5.15.90.1\nWSLg version: 1.0.51\nMSRDC version: 1.2.3770\nDirect3D version: 1.608.2-61064218\nDXCore version: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp\nWindows version: 10.0.22621.2134\n"})}),"\n",(0,r.jsx)(t.a,{href:"#user-content-fnref-1","data-footnote-backref":"","aria-label":"Back to reference 1",className:"data-footnote-backref",children:"\u21A9"}),"\n"]}),"\n"]}),"\n"]})]})}function a(e={}){let{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},5511:function(e,t,s){s.d(t,{R:()=>l,x:()=>d});var n=s(6363);let r={},i=n.createContext(r);function l(e){let t=n.useContext(i);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([["9074"],{8791:function(e,t,n){n.r(t),n.d(t,{default:()=>ea});var a=n(7259),i=n(6363),r=n(4014),l=n(5032),o=n(1443),s=n(3266),c=n(1103),d=n(6593),u=n(652),m=n(210);function b(){let{shown:e,scrollToTop:t}=function({threshold:e}){let[t,n]=(0,i.useState)(!1),a=(0,i.useRef)(!1),{startScroll:r,cancelScroll:l}=(0,u.gk)();return(0,u.Mq)(({scrollY:t},i)=>{let r=i?.scrollY;r&&(a.current?a.current=!1:t>=r?(l(),n(!1)):t<e?n(!1):t+window.innerHeight<document.documentElement.scrollHeight&&n(!0))}),(0,m.$)(e=>{e.location.hash&&(a.current=!0,n(!1))}),{shown:t,scrollToTop:()=>r(0)}}({threshold:300});return(0,a.jsx)("button",{"aria-label":(0,d.T)({id:"theme.BackToTopButton.buttonAriaLabel",message:"Scroll back to top",description:"The ARIA label for the back to top button"}),className:(0,r.A)("clean-btn",o.G.common.backToTopButton,"backToTopButton_yH7o",e&&"backToTopButtonShow_I9yW"),type:"button",onClick:t})}var h=n(1817),p=n(7596),x=n(4121),f=n(7418),j=n(7699);function _(e){return(0,a.jsx)("svg",{width:"20",height:"20","aria-hidden":"true",...e,children:(0,a.jsxs)("g",{fill:"#7a7a7a",children:[(0,a.jsx)("path",{d:"M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"}),(0,a.jsx)("path",{d:"M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"})]})})}function g({onClick:e}){return(0,a.jsx)("button",{type:"button",title:(0,d.T)({id:"theme.docs.sidebar.collapseButtonTitle",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),"aria-label":(0,d.T)({id:"theme.docs.sidebar.collapseButtonAriaLabel",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),className:(0,r.A)("button button--secondary button--outline","collapseSidebarButton_dO80"),onClick:e,children:(0,a.jsx)(_,{className:"collapseSidebarButtonIcon_TlfR"})})}var v=n(5941),A=n(40);let k=Symbol("EmptyContext"),C=i.createContext(k);function N({children:e}){let[t,n]=(0,i.useState)(null),r=(0,i.useMemo)(()=>({expandedItem:t,setExpandedItem:n}),[t]);return(0,a.jsx)(C.Provider,{value:r,children:e})}var S=n(8218),y=n(7285),T=n(3151),I=n(9686),L=n(5309),w=n(7755);function E({label:e}){return(0,a.jsx)("span",{title:e,className:"linkLabel_XLMJ",children:e})}function M({item:e,onItemClick:t,activePath:n,level:i,index:l,...c}){let{href:d,label:u,className:m,autoAddBaseUrl:b}=e,h=(0,s.w8)(e,n),p=(0,L.A)(d);return(0,a.jsx)("li",{className:(0,r.A)(o.G.docs.docSidebarItemLink,o.G.docs.docSidebarItemLinkLevel(i),"menu__list-item",m),children:(0,a.jsxs)(T.A,{className:(0,r.A)("menu__link",!p&&"menuExternalLink_yzoS",{"menu__link--active":h}),autoAddBaseUrl:b,"aria-current":h?"page":void 0,to:d,...p&&{onClick:t?()=>t(e):void 0},...c,children:[(0,a.jsx)(E,{label:u}),!p&&(0,a.jsx)(w.A,{})]})},u)}function B({collapsed:e,categoryLabel:t,onClick:n}){return(0,a.jsx)("button",{"aria-label":e?(0,d.T)({id:"theme.DocSidebarItem.expandCategoryAriaLabel",message:"Expand sidebar category '{label}'",description:"The ARIA label to expand the sidebar category"},{label:t}):(0,d.T)({id:"theme.DocSidebarItem.collapseCategoryAriaLabel",message:"Collapse sidebar category '{label}'",description:"The ARIA label to collapse the sidebar category"},{label:t}),"aria-expanded":!e,type:"button",className:"clean-btn menu__caret",onClick:n})}function G({label:e}){return(0,a.jsx)("span",{title:e,className:"categoryLinkLabel_RXyj",children:e})}function H(e){return 0===(0,s.Y)(e.item.items,e.activePath).length?(0,a.jsx)(D,{...e}):(0,a.jsx)(R,{...e})}function D({item:e,...t}){if("string"!=typeof e.href)return null;let{type:n,collapsed:i,collapsible:r,items:l,linkUnlisted:o,...s}=e,c={type:"link",...s};return(0,a.jsx)(M,{item:c,...t})}function R({item:e,onItemClick:t,activePath:n,level:l,index:c,...d}){let u,{items:m,label:b,collapsible:h,className:p,href:x}=e,{docs:{sidebar:{autoCollapseCategories:j}}}=(0,f.p)(),_=(u=(0,I.A)(),(0,i.useMemo)(()=>e.href&&!e.linkUnlisted?e.href:!u&&e.collapsible?(0,s.Nr)(e):void 0,[e,u])),g=(0,s.w8)(e,n),v=(0,y.ys)(x,n),{collapsed:N,setCollapsed:L}=(0,S.u)({initialState:()=>!!h&&!g&&e.collapsed}),{expandedItem:w,setExpandedItem:E}=function(){let e=(0,i.useContext)(C);if(e===k)throw new A.dV("DocSidebarItemsExpandedStateProvider");return e}(),M=(e=!N)=>{E(e?null:c),L(e)};return!function({isActive:e,collapsed:t,updateCollapsed:n,activePath:a}){let r=(0,A.ZC)(e),l=(0,A.ZC)(a);(0,i.useEffect)(()=>{let i=e&&!r,o=e&&r&&a!==l;(i||o)&&t&&n(!1)},[e,r,t,n,a,l])}({isActive:g,collapsed:N,updateCollapsed:M,activePath:n}),(0,i.useEffect)(()=>{h&&null!=w&&w!==c&&j&&L(!0)},[h,w,c,L,j]),(0,a.jsxs)("li",{className:(0,r.A)(o.G.docs.docSidebarItemCategory,o.G.docs.docSidebarItemCategoryLevel(l),"menu__list-item",{"menu__list-item--collapsed":N},p),children:[(0,a.jsxs)("div",{className:(0,r.A)("menu__list-item-collapsible",{"menu__list-item-collapsible--active":v}),children:[(0,a.jsx)(T.A,{className:(0,r.A)("categoryLink_u_d3","menu__link",{"menu__link--sublist":h,"menu__link--sublist-caret":!x&&h,"menu__link--active":g}),onClick:n=>{t?.(e),h&&(x?v?(n.preventDefault(),M()):M(!1):(n.preventDefault(),M()))},"aria-current":v?"page":void 0,role:h&&!x?"button":void 0,"aria-expanded":h&&!x?!N:void 0,href:h?_??"#":_,...d,children:(0,a.jsx)(G,{label:b})}),x&&h&&(0,a.jsx)(B,{collapsed:N,categoryLabel:b,onClick:e=>{e.preventDefault(),M()}})]}),(0,a.jsx)(S.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:N,children:(0,a.jsx)(F,{items:m,tabIndex:N?-1:0,onItemClick:t,activePath:n,level:l+1})})]})}function P({item:e,level:t,index:n}){let{value:i,defaultStyle:l,className:s}=e;return(0,a.jsx)("li",{className:(0,r.A)(o.G.docs.docSidebarItemLink,o.G.docs.docSidebarItemLinkLevel(t),l&&["menuHtmlItem_lYYB","menu__list-item"],s),dangerouslySetInnerHTML:{__html:i}},n)}function W({item:e,...t}){switch(e.type){case"category":return(0,a.jsx)(H,{item:e,...t});case"html":return(0,a.jsx)(P,{item:e,...t});default:return(0,a.jsx)(M,{item:e,...t})}}let F=(0,i.memo)(function({items:e,...t}){let n=(0,s.Y)(e,t.activePath);return(0,a.jsx)(N,{children:n.map((e,n)=>(0,a.jsx)(W,{item:e,index:n,...t},n))})});function Y({path:e,sidebar:t,className:n}){let l=function(){let{isActive:e}=(0,v.M)(),[t,n]=(0,i.useState)(e);return(0,u.Mq)(({scrollY:t})=>{e&&n(0===t)},[e]),e&&t}();return(0,a.jsx)("nav",{"aria-label":(0,d.T)({id:"theme.docs.sidebar.navAriaLabel",message:"Docs sidebar",description:"The ARIA label for the sidebar navigation"}),className:(0,r.A)("menu thin-scrollbar","menu___bF",l&&"menuWithAnnouncementBar_vNK3",n),children:(0,a.jsx)("ul",{className:(0,r.A)(o.G.docs.docSidebarMenu,"menu__list"),children:(0,a.jsx)(F,{items:t,activePath:e,level:1})})})}let z=i.memo(function({path:e,sidebar:t,onCollapse:n,isHidden:i}){let{navbar:{hideOnScroll:l},docs:{sidebar:{hideable:o}}}=(0,f.p)();return(0,a.jsxs)("div",{className:(0,r.A)("sidebar_dl38",l&&"sidebarWithHideableNavbar_QSyG",i&&"sidebarHidden_GEhy"),children:[l&&(0,a.jsx)(j.A,{tabIndex:-1,className:"sidebarLogo_KtsH"}),(0,a.jsx)(Y,{path:e,sidebar:t}),o&&(0,a.jsx)(g,{onClick:n})]})});var V=n(1356),U=n(6905);let X=({sidebar:e,path:t})=>{let n=(0,U.M)();return(0,a.jsx)("ul",{className:(0,r.A)(o.G.docs.docSidebarMenu,"menu__list"),children:(0,a.jsx)(F,{items:e,activePath:t,onItemClick:e=>{"category"===e.type&&e.href&&n.toggle(),"link"===e.type&&n.toggle()},level:1})})},q=i.memo(function(e){return(0,a.jsx)(V.GX,{component:X,props:e})});function K(e){let t=(0,x.l)();return(0,a.jsxs)(a.Fragment,{children:[("desktop"===t||"ssr"===t)&&(0,a.jsx)(z,{...e}),"mobile"===t&&(0,a.jsx)(q,{...e})]})}function O({toggleSidebar:e}){return(0,a.jsx)("div",{className:"expandButton_OZLq",title:(0,d.T)({id:"theme.docs.sidebar.expandButtonTitle",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),"aria-label":(0,d.T)({id:"theme.docs.sidebar.expandButtonAriaLabel",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),tabIndex:0,role:"button",onKeyDown:e,onClick:e,children:(0,a.jsx)(_,{className:"expandButtonIcon_DJWG"})})}let Z={docSidebarContainer:"docSidebarContainer_GDN6",docSidebarContainerHidden:"docSidebarContainerHidden_TX3e",sidebarViewport:"sidebarViewport_N1UE"};function J({children:e}){let t=(0,c.t)();return(0,a.jsx)(i.Fragment,{children:e},t?.name??"noSidebar")}function Q({sidebar:e,hiddenSidebarContainer:t,setHiddenSidebarContainer:n}){let{pathname:l}=(0,p.zy)(),[s,c]=(0,i.useState)(!1),d=(0,i.useCallback)(()=>{s&&c(!1),!s&&(0,h.O)()&&c(!0),n(e=>!e)},[n,s]);return(0,a.jsx)("aside",{className:(0,r.A)(o.G.docs.docSidebarContainer,Z.docSidebarContainer,t&&Z.docSidebarContainerHidden),onTransitionEnd:e=>{e.currentTarget.classList.contains(Z.docSidebarContainer)&&t&&c(!0)},children:(0,a.jsx)(J,{children:(0,a.jsxs)("div",{className:(0,r.A)(Z.sidebarViewport,s&&Z.sidebarViewportHidden),children:[(0,a.jsx)(K,{sidebar:e,path:l,onCollapse:d,isHidden:s}),s&&(0,a.jsx)(O,{toggleSidebar:d})]})})})}let $={docMainContainer:"docMainContainer_I77d",docMainContainerEnhanced:"docMainContainerEnhanced__Fhl",docItemWrapperEnhanced:"docItemWrapperEnhanced__m7t"};function ee({hiddenSidebarContainer:e,children:t}){let n=(0,c.t)();return(0,a.jsx)("main",{className:(0,r.A)($.docMainContainer,(e||!n)&&$.docMainContainerEnhanced),children:(0,a.jsx)("div",{className:(0,r.A)("container padding-top--md padding-bottom--lg",$.docItemWrapper,e&&$.docItemWrapperEnhanced),children:t})})}function et({children:e}){let t=(0,c.t)(),[n,r]=(0,i.useState)(!1);return(0,a.jsxs)("div",{className:"docsWrapper_fTY1",children:[(0,a.jsx)(b,{}),(0,a.jsxs)("div",{className:"docRoot_stlz",children:[t&&(0,a.jsx)(Q,{sidebar:t.items,hiddenSidebarContainer:n,setHiddenSidebarContainer:r}),(0,a.jsx)(ee,{hiddenSidebarContainer:n,children:e})]})]})}var en=n(5905);function ea(e){let t=(0,s.B5)(e);if(!t)return(0,a.jsx)(en.A,{});let{docElement:n,sidebarName:i,sidebarItems:d}=t;return(0,a.jsx)(l.e3,{className:(0,r.A)(o.G.page.docsDocPage),children:(0,a.jsx)(c.V,{name:i,items:d,children:(0,a.jsx)(et,{children:n})})})}},5905:function(e,t,n){n.d(t,{A:()=>o});var a=n(7259);n(6363);var i=n(4014),r=n(6593),l=n(2834);function o({className:e}){return(0,a.jsx)("main",{className:(0,i.A)("container margin-vert--xl",e),children:(0,a.jsx)("div",{className:"row",children:(0,a.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,a.jsx)(l.A,{as:"h1",className:"hero__title",children:(0,a.jsx)(r.A,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,a.jsx)("p",{children:(0,a.jsx)(r.A,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,a.jsx)("p",{children:(0,a.jsx)(r.A,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([["1144"],{27:function(e,t,n){n.r(t),n.d(t,{frontMatter:()=>d,toc:()=>r,default:()=>m,metadata:()=>o,assets:()=>c,contentTitle:()=>i});var o=JSON.parse('{"id":"tools/command-queue","title":"Command Queue (Enterprise)","description":"See all the command queues and interact with commands","source":"@site/docs/tools/command-queue.md","sourceDirName":"tools","slug":"/tools/command-queue","permalink":"/tools/staticdocs/docs/tools/command-queue","draft":false,"unlisted":false,"editUrl":"https://github.com/OpenC3/cosmos/tree/main/docs.openc3.com/docs/tools/command-queue.md","tags":[],"version":"current","frontMatter":{"title":"Command Queue (Enterprise)","description":"See all the command queues and interact with commands","sidebar_custom_props":{"myEmoji":"\u{1F4E5}"}},"sidebar":"defaultSidebar","previous":{"title":"Command History (Enterprise)","permalink":"/tools/staticdocs/docs/tools/command-history"},"next":{"title":"Data Extractor","permalink":"/tools/staticdocs/docs/tools/data-extractor"}}'),a=n(7259),s=n(5511);let d={title:"Command Queue (Enterprise)",description:"See all the command queues and interact with commands",sidebar_custom_props:{myEmoji:"\u{1F4E5}"}},i,c={},r=[{value:"Introduction",id:"introduction",level:2},{value:"Manipulating Queues",id:"manipulating-queues",level:3},{value:"Commands Table",id:"commands-table",level:2}];function l(e){let t={a:"a",code:"code",h2:"h2",h3:"h3",img:"img",p:"p",pre:"pre",...(0,s.R)(),...e.components},{TabItem:o,Tabs:d}=t;return o||u("TabItem",!0),d||u("Tabs",!0),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.h2,{id:"introduction",children:"Introduction"}),"\n",(0,a.jsxs)(t.p,{children:["Command Queue provides the ability to see the status of all queues created by the ",(0,a.jsx)(t.a,{href:"/docs/guides/scripting-api#command-queues",children:"Command Queue"})," API methods."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Command Queue",src:n(7109).A+"",width:"2736",height:"1476"})}),"\n",(0,a.jsx)(t.h3,{id:"manipulating-queues",children:"Manipulating Queues"}),"\n",(0,a.jsx)(t.p,{children:"You can create a new Command Queue by clicking + and delete one by clicking the trash. Different queues can be selected using the Queue selection. You can change the queue state by clicking the Hold / Release / Disable button group. Note that the current mode is indicated by which button is highlighted."}),"\n",(0,a.jsxs)(t.p,{children:["The queue starts out in Hold mode by default which means that commands are added to the queue in FIFO order and are not executed. When the queue is placed into Release mode, a backend microservice starts to execute the commands as fast as possible while still doing any ",(0,a.jsx)(t.a,{href:"/docs/configuration/command#validator",children:"validation"})," that is defined. When the queue is put into Disable mode, all commands sent to the queue will fail and an exception is raised in an executing script."]}),"\n",(0,a.jsxs)(t.p,{children:["You add commands to the queue by specifying the queue as a keyword argument to the normal ",(0,a.jsx)(t.code,{children:"cmd"})," ",(0,a.jsx)(t.a,{href:"/docs/guides/scripting-api#commands",children:"APIs"}),"."]}),"\n",(0,a.jsxs)(d,{groupId:"script-language",children:[(0,a.jsx)(o,{value:"ruby",label:"Ruby Example",children:(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-ruby",children:'cmd("INST ABORT", queue: "TEST")\n'})})}),(0,a.jsx)(o,{value:"python",label:"Python Example",children:(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-python",children:'cmd("INST ABORT", queue="TEST")\n'})})})]}),"\n",(0,a.jsxs)(t.p,{children:["You can manually add commands to the queue by clicking the ",(0,a.jsx)(t.code,{children:"Add Command"})," button which brings up a command editor dialog similar\nto Command Sender that allows you to select a command and fill out any parameters."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Add Command",src:n(8901).A+"",width:"2400",height:"1030"})}),"\n",(0,a.jsx)(t.h2,{id:"commands-table",children:"Commands Table"}),"\n",(0,a.jsx)(t.p,{children:"The commands table is sorted by the Index and lists the Time, User (or process), the Command, and Actions."}),"\n",(0,a.jsx)(t.p,{children:"The Index is the command index when the command was added to the queue. This will normally increment by 1 although commands can be deleted or executed out of order which will not reorder the queue. If the queue is emptied the index starts over at 1."}),"\n",(0,a.jsx)(t.p,{children:"The Time is the time the command was last modified. This is originally the time the command was added to the queue but updates as commands are edited."}),"\n",(0,a.jsx)(t.p,{children:"The User is the person to add the command to the queue or the last to edit it."}),"\n",(0,a.jsxs)(t.p,{children:["The Command is the command as sent via ",(0,a.jsx)(t.a,{href:"/docs/guides/scripting-api#cmd_no_hazardous_check",children:(0,a.jsx)(t.code,{children:"cmd_no_hazarous_check"})})," in a COSMOS script."]}),"\n",(0,a.jsx)(t.p,{children:"The Actions column allows you to remove and execute a command (play button), edit a command (pencil button), or delete a command from the queue (trash button)."}),"\n",(0,a.jsx)(t.p,{children:"You can download the list of commands as a CSV file by clicking the Download button next to the Search box."})]})}function m(e={}){let{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(l,{...e})}):l(e)}function u(e,t){throw Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},8901:function(e,t,n){n.d(t,{A:()=>o});let o=n.p+"assets/images/add_command-46f5156d66ce939d3baf87e565193dc4cd281c11c09cb15e11f3a08fdb750b4a.png"},7109:function(e,t,n){n.d(t,{A:()=>o});let o=n.p+"assets/images/command_queue-e5a7c681a35ccb9efa4e6f8af4a6d18afcc334b43b64e3aa30110213d913a6ee.png"},5511:function(e,t,n){n.d(t,{R:()=>d,x:()=>i});var o=n(6363);let a={},s=o.createContext(a);function d(e){let t=o.useContext(s);return o.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:d(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([["4242"],{2911:function(e,t,a){a.r(t),a.d(t,{frontMatter:()=>r,toc:()=>d,default:()=>A,metadata:()=>n,assets:()=>l,contentTitle:()=>o});var n=JSON.parse('{"id":"tools/cmd-tlm-server","title":"Command and Telemetry Server","description":"Status about interfaces, targets and log messages","source":"@site/docs/tools/cmd-tlm-server.md","sourceDirName":"tools","slug":"/tools/cmd-tlm-server","permalink":"/tools/staticdocs/docs/tools/cmd-tlm-server","draft":false,"unlisted":false,"editUrl":"https://github.com/OpenC3/cosmos/tree/main/docs.openc3.com/docs/tools/cmd-tlm-server.md","tags":[],"version":"current","frontMatter":{"title":"Command and Telemetry Server","description":"Status about interfaces, targets and log messages","sidebar_custom_props":{"myEmoji":"\u{1F4E1}"}},"sidebar":"defaultSidebar","previous":{"title":"Command Sender","permalink":"/tools/staticdocs/docs/tools/cmd-sender"},"next":{"title":"Command History (Enterprise)","permalink":"/tools/staticdocs/docs/tools/command-history"}}'),s=a(7259),i=a(5511);let r={title:"Command and Telemetry Server",description:"Status about interfaces, targets and log messages",sidebar_custom_props:{myEmoji:"\u{1F4E1}"}},o,l={},d=[{value:"Introduction",id:"introduction",level:2},{value:"Command and Telemetry Server Menus",id:"command-and-telemetry-server-menus",level:2},{value:"File Menu Items",id:"file-menu-items",level:3},{value:"Interfaces Tab",id:"interfaces-tab",level:2},{value:"Targets Tab",id:"targets-tab",level:2},{value:"Command Packets Tab",id:"command-packets-tab",level:2},{value:"Telemetry Packets Tab",id:"telemetry-packets-tab",level:2},{value:"Data Flows Tab",id:"data-flows-tab",level:2},{value:"Status Tab",id:"status-tab",level:2},{value:"Log Messages",id:"log-messages",level:2}];function c(e){let t={a:"a",h2:"h2",h3:"h3",img:"img",p:"p",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h2,{id:"introduction",children:"Introduction"}),"\n",(0,s.jsxs)(t.p,{children:["The Command and Telemetry Server application provides status about the ",(0,s.jsx)(t.a,{href:"/tools/staticdocs/docs/configuration/interfaces",children:"interfaces"})," and targets instantiated in your COSMOS installation. Interfaces can be connected or disconnected and raw byte counts are returned. The application also provides quick shortcuts to view both raw and formatted command and telemetry packets as they go through the COSMOS system. At the bottom of the Command and Telemetry Server is the Log Messages showing server messages."]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Cmd Tlm Server",src:a(791).A+"",width:"2908",height:"1984"})}),"\n",(0,s.jsx)(t.h2,{id:"command-and-telemetry-server-menus",children:"Command and Telemetry Server Menus"}),"\n",(0,s.jsx)(t.h3,{id:"file-menu-items",children:"File Menu Items"}),"\n",(0,s.jsx)(t.p,{children:"The Command and Telemetry Server has one menu under File -> Options:"}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"File Menu",src:a(2005).A+"",width:"302",height:"114"})}),"\n",(0,s.jsx)(t.p,{children:"This dialog changes the refresh rate of the Command and Telemetry Server to reduce load on both your browser window and the backend server. Note that this changes the refresh rate of the various tabs in the application. The Log Messages will continue to update as messages are generated."}),"\n",(0,s.jsx)(t.h2,{id:"interfaces-tab",children:"Interfaces Tab"}),"\n",(0,s.jsx)(t.p,{children:"The Interfaces tab displays all the interfaces defined by your COSMOS installation. You can Connect or Disconnect interfaces and view raw byte and packet counts."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Interfaces",src:a(813).A+"",width:"2878",height:"882"})}),"\n",(0,s.jsx)(t.p,{children:"You can get additional details about the interface by clicking the details button."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Interface Details",src:a(2615).A+"",width:"2746",height:"1696"})}),"\n",(0,s.jsx)(t.p,{children:"See the Data Flows tab for more details on how to interact with the interface data flows."}),"\n",(0,s.jsx)(t.h2,{id:"targets-tab",children:"Targets Tab"}),"\n",(0,s.jsx)(t.p,{children:"The Targets tab displays all the targets and their mapped interfaces along with the Command Authority status (Enterprise Only)."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Targets",src:a(4503).A+"",width:"2878",height:"1098"})}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.a,{href:"/tools/staticdocs/docs/configuration/command#command-authority-enterprise",children:"Command Authority (Enterprise)"})," allows individual users to take and release Command Authority which enables exclusive command and script access to that target for that user. Without taking Command Authority, users can not send a command or start a script under that target. Note, commands or scripts scheduled with Calendar or Autonomic are not affected by Command Authority."]}),"\n",(0,s.jsxs)(t.p,{children:["Command Authority, along with ",(0,s.jsx)(t.a,{href:"/tools/staticdocs/docs/configuration/command#critical-commanding-enterprise",children:"Critical Commanding (Enterprise)"}),", can be enabled in the Admin Console under the Scopes tab."]}),"\n",(0,s.jsx)(t.h2,{id:"command-packets-tab",children:"Command Packets Tab"}),"\n",(0,s.jsx)(t.p,{children:"The Command Packets tab displays all the available commands. The table can be sorted by clicking on the column headers. The table is paginated to support thousands of commands. The search bar searches all pages for a command."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Commands",src:a(3727).A+"",width:"2878",height:"1514"})}),"\n",(0,s.jsx)(t.p,{children:"Clicking on View Raw opens a dialog displaying the raw bytes for that command."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Raw Command",src:a(378).A+"",width:"782",height:"301"})}),"\n",(0,s.jsxs)(t.p,{children:["Clicking View in Command Sender opens up a new ",(0,s.jsx)(t.a,{href:"/tools/staticdocs/docs/tools/cmd-sender",children:"Command Sender"})," window with the specified command."]}),"\n",(0,s.jsx)(t.h2,{id:"telemetry-packets-tab",children:"Telemetry Packets Tab"}),"\n",(0,s.jsx)(t.p,{children:"The Telemetry Packets tab displays all the available telemetry. The table can be sorted by clicking on the column headers. The table is paginated to support thousands of telemetry packets. The search bar searches all pages for a telemetry packet."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Telemetry",src:a(1690).A+"",width:"2878",height:"1514"})}),"\n",(0,s.jsx)(t.p,{children:"Clicking on View Raw opens a dialog displaying the raw bytes for that telemetry packet."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Raw Telemetry",src:a(7679).A+"",width:"782",height:"406"})}),"\n",(0,s.jsxs)(t.p,{children:["Clicking View in Packet Viewer opens up a new ",(0,s.jsx)(t.a,{href:"/tools/staticdocs/docs/tools/packet-viewer",children:"Packet Viewer"})," window with the specified telemetry packet."]}),"\n",(0,s.jsx)(t.h2,{id:"data-flows-tab",children:"Data Flows Tab"}),"\n",(0,s.jsx)(t.p,{children:"The Data Flows tab displays all the Interface data flows through the system."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Data Flows",src:a(9671).A+"",width:"2878",height:"1822"})}),"\n",(0,s.jsx)(t.p,{children:'You can disconnect the interface from the COSMOS Processing by clicking and deleting the lines connecting the Processing to the Interface. This will leave the interface "connected" but no commands are sent out or telemetry processed. Removing the lines from the Interface to the Target will effectively "unmap" the interface and restart it. This may require re-installing the plugin to restore the interface.'}),"\n",(0,s.jsx)(t.p,{children:"From the Details dialog you can also view details about the individual Protocols applied to the Interface. In the EXAMPLE_INT Interface, when you click on the Length protocol you can see the details of the protocol."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Protocol Details",src:a(3050).A+"",width:"2768",height:"1212"})}),"\n",(0,s.jsx)(t.p,{children:"This dialog shows the various settings for the protocol as well as the raw data processed by the protocol."}),"\n",(0,s.jsx)(t.h2,{id:"status-tab",children:"Status Tab"}),"\n",(0,s.jsx)(t.p,{children:"The Status tab displays COSMOS system metrics."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Status",src:a(2243).A+"",width:"2878",height:"1498"})}),"\n",(0,s.jsx)(t.h2,{id:"log-messages",children:"Log Messages"}),"\n",(0,s.jsx)(t.p,{children:"The Log Messages table sits below all the tabs in the Command and Telemetry Server application. It displays server messages such as limits events (new RED, YELLOW, GREEN values), logging events (new files) and interface events (connecting and disconnecting). It can be filtered by severity or by entering values in the Search box. It can also be paused and resumed to inspect an individual message."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Log Messages",src:a(3864).A+"",width:"2788",height:"1172"})})]})}function A(e={}){let{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},3727:function(e,t,a){a.d(t,{A:()=>n});let n=a.p+"assets/images/cmd_packets-e7906db3691ccd29600e09cf005f6f53be9d9332ba4c319a1e81e1c8c6b665ed.png"},378:function(e,t,a){a.d(t,{A:()=>n});let n=a.p+"assets/images/cmd_raw-28307ac400b66050ada7ecc8b7701deffe8fb7f01129b63ec35a54857cb886b7.png"},791:function(e,t,a){a.d(t,{A:()=>n});let n=a.p+"assets/images/cmd_tlm_server-117772d4be1adbf89805f5b530da301b3dcc0d5085a552d779c9bc692bac4c44.png"},9671:function(e,t,a){a.d(t,{A:()=>n});let n=a.p+"assets/images/data_flows-6796d95b379f3f69e3fcf9629c68aae389f3d9a287db5b4d0bbc385d478134b4.png"},2005:function(e,t,a){a.d(t,{A:()=>n});let n="data:image/png;base64,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"},2615:function(e,t,a){a.d(t,{A:()=>n});let n=a.p+"assets/images/interface_details-b71797d470007be1e0520bb5b859b4da9cd3411303388be9e6db914a99628dff.png"},813:function(e,t,a){a.d(t,{A:()=>n});let n=a.p+"assets/images/interfaces-05db0ed276077b796b54a3bca76bd0841bfb0d700456258c878359d332ff9f8f.png"},3864:function(e,t,a){a.d(t,{A:()=>n});let n=a.p+"assets/images/log_messages-6da2901ac63928daa3dcaf39a78ca9e455482c48d4ba917ee704f697e5210818.png"},3050:function(e,t,a){a.d(t,{A:()=>n});let n=a.p+"assets/images/protocol_details-408f871b0bd8440091ac95ca76cac353bb06d0b3a6c3f756dd11e7e746d7c20c.png"},2243:function(e,t,a){a.d(t,{A:()=>n});let n=a.p+"assets/images/status-9b7ac4d919d196a2bf3379d0cb262c6609fb98074c744533bb9132097cb52155.png"},4503:function(e,t,a){a.d(t,{A:()=>n});let n=a.p+"assets/images/targets-b07f7cd9f19a4ca02d2838a4de58c25168f01ee256e692878e3b27b833632aca.png"},1690:function(e,t,a){a.d(t,{A:()=>n});let n=a.p+"assets/images/tlm_packets-18345c00fd6cc01a9f7a1e363fdf8375769ba5afa4ccf22c45925184eefc57ca.png"},7679:function(e,t,a){a.d(t,{A:()=>n});let n=a.p+"assets/images/tlm_raw-cc2223b25e8fc732557856168fd7fa04e7b3459bbd163825639fb6235a8e6180.png"},5511:function(e,t,a){a.d(t,{R:()=>r,x:()=>o});var n=a(6363);let s={},i=n.createContext(s);function r(e){let t=n.useContext(i);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([["6558"],{1850:function(e,t,o){o.r(t),o.d(t,{frontMatter:()=>r,toc:()=>c,default:()=>d,metadata:()=>n,assets:()=>l,contentTitle:()=>a});var n=JSON.parse('{"id":"meta/philosophy","title":"Philosophy","description":"COSMOS goals and philosophy","source":"@site/docs/meta/philosophy.md","sourceDirName":"meta","slug":"/meta/philosophy","permalink":"/tools/staticdocs/docs/meta/philosophy","draft":false,"unlisted":false,"editUrl":"https://github.com/OpenC3/cosmos/tree/main/docs.openc3.com/docs/meta/philosophy.md","tags":[],"version":"current","frontMatter":{"title":"Philosophy","description":"COSMOS goals and philosophy","sidebar_custom_props":{"myEmoji":"\u{1F914}"}},"sidebar":"defaultSidebar","previous":{"title":"Licenses","permalink":"/tools/staticdocs/docs/meta/licenses"},"next":{"title":"Security Vulnerabilities","permalink":"/tools/staticdocs/docs/meta/vulnerabilities"}}'),i=o(7259),s=o(5511);let r={title:"Philosophy",description:"COSMOS goals and philosophy",sidebar_custom_props:{myEmoji:"\u{1F914}"}},a,l={},c=[];function h(e){let t={li:"li",ol:"ol",p:"p",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.p,{children:"COSMOS is a C3 (Command, Control and Communication) system with the following primary goals:"}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"Interface with Anything"}),"\n",(0,i.jsx)(t.p,{children:"COSMOS should be able to communicate with anything that provides a computer-to-computer interface, regardless of what the interface is. This means that COSMOS adapts to what other systems are doing and evolves over time. It does not publish an API that hardware must adhere to if it wants to communicate with COSMOS."}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"Log Everything"}),"\n",(0,i.jsx)(t.p,{children:"All data that flows into and out of COSMOS is logged. This provides history as well as attribution for what happened when and why. Keeping accurate logs is an essential and critical aspect of COSMOS."}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"Open Architecture and Source"}),"\n",(0,i.jsx)(t.p,{children:"Nothing about how COSMOS is implemented is meant to be secret or hidden, even in Enterprise. In all implementations, the source code for everything in COSMOS is provided and available for users to inspect or modify as needed. Never worry about an unsolvable problem or having to accept some detail that you don't like. This also opens the world to integrate anything they need into COSMOS without restriction or limitation."}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"Be Modular"}),"\n",(0,i.jsx)(t.p,{children:"There are infinite number of things for COSMOS to connect to, but it is impossible to ship COSMOS with all the code it would need to talk to everything. For this reason, COSMOS is designed to be modular in all the places that matter."}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"Use Configuration when Possible, and Code When Logic Is Needed"}),"\n",(0,i.jsx)(t.p,{children:"Configuration is great for making COSMOS as usable as possible by non-software engineers. It also shows where common patterns exist. However, configuration is horrible when logic or custom math are needed."}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"Empower Developers"}),"\n",(0,i.jsx)(t.p,{children:"COSMOS is meant to be easy enough to be used by everyone, not just C2 software experts."}),"\n"]}),"\n"]})]})}function d(e={}){let{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},5511:function(e,t,o){o.d(t,{R:()=>r,x:()=>a});var n=o(6363);let i={},s=n.createContext(i);function r(e){let t=n.useContext(s);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([["646"],{2784:function(e,s,t){t.r(s),t.d(s,{frontMatter:()=>o,toc:()=>r,default:()=>h,metadata:()=>i,assets:()=>l,contentTitle:()=>c});var i=JSON.parse('{"id":"tools/admin","title":"Admin","description":"Administer COSMOS, install plugins, change settings","source":"@site/docs/tools/admin.md","sourceDirName":"tools","slug":"/tools/admin","permalink":"/tools/staticdocs/docs/tools/admin","draft":false,"unlisted":false,"editUrl":"https://github.com/OpenC3/cosmos/tree/main/docs.openc3.com/docs/tools/admin.md","tags":[],"version":"current","frontMatter":{"title":"Admin","description":"Administer COSMOS, install plugins, change settings","sidebar_custom_props":{"myEmoji":"\u{1F9D1}\u200D\u2696\uFE0F"}},"sidebar":"defaultSidebar","previous":{"title":"Tools","permalink":"/tools/staticdocs/docs/tools"},"next":{"title":"Autonomic (Enterprise)","permalink":"/tools/staticdocs/docs/tools/autonomic"}}'),n=t(7259),a=t(5511);let o={title:"Admin",description:"Administer COSMOS, install plugins, change settings",sidebar_custom_props:{myEmoji:"\u{1F9D1}\u200D\u2696\uFE0F"}},c,l={},r=[{value:"Introduction",id:"introduction",level:2},{value:"Plugins",id:"plugins",level:3},{value:"Targets",id:"targets",level:3},{value:"Interfaces",id:"interfaces",level:3},{value:"Routers",id:"routers",level:3},{value:"Microservices",id:"microservices",level:3},{value:"Packages",id:"packages",level:3},{value:"Tools",id:"tools",level:3},{value:"Redis",id:"redis",level:3},{value:"Secrets",id:"secrets",level:3},{value:"Settings",id:"settings",level:3},{value:"Roles (Enterprise)",id:"roles-enterprise",level:3},{value:"Scopes (Enterprise)",id:"scopes-enterprise",level:3}];function d(e){let s={a:"a",h2:"h2",h3:"h3",img:"img",p:"p",...(0,a.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.h2,{id:"introduction",children:"Introduction"}),"\n",(0,n.jsx)(s.p,{children:"Admin has it's own dedicated button at the top of the tools list. It is responsible for administering the COSMOS system including installing new plugins, viewing configuration, storing secrets and changing settings."}),"\n",(0,n.jsx)(s.h3,{id:"plugins",children:"Plugins"}),"\n",(0,n.jsx)(s.p,{children:"The Plugins tab is where you install new plugins into the COSMOS system. Plugins can dynamically add targets, microservices, interfaces, protocols, Telemetry Viewer widgets, and entire tools into the COSMOS runtime. The following screenshot shows the Plugins tab when only the COSMOS Demo is installed:"}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.img,{alt:"Plugins",src:t(9456).A+"",width:"2462",height:"974"})}),"\n",(0,n.jsx)(s.p,{children:"The plugin gem name is listed along with all the targets it contains. You can Download, Edit, Upgrade, or Delete (uninstall) the plugin using the buttons to the right. If a plugin's target has been modified, the target name turns into a link which when clicked will download the changed files. New plugins are installed by clicking the top field."}),"\n",(0,n.jsx)(s.h3,{id:"targets",children:"Targets"}),"\n",(0,n.jsx)(s.p,{children:"The Targets tab shows all the targets installed and what plugin they came from. Clicking the eyeball shows the raw JSON that makes up the target configuration."}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.img,{alt:"Targets",src:t(2342).A+"",width:"2200",height:"964"})}),"\n",(0,n.jsx)(s.h3,{id:"interfaces",children:"Interfaces"}),"\n",(0,n.jsx)(s.p,{children:"The Interfaces tab shows all the interfaces installed. Clicking the eyeball shows the raw JSON that makes up the interface configuration."}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.img,{alt:"Interfaces",src:t(3210).A+"",width:"2200",height:"766"})}),"\n",(0,n.jsx)(s.h3,{id:"routers",children:"Routers"}),"\n",(0,n.jsx)(s.p,{children:"The Routers tab shows all the routers installed. Clicking the eyeball shows the raw JSON that makes up the router configuration."}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.img,{alt:"Routers",src:t(9942).A+"",width:"2200",height:"480"})}),"\n",(0,n.jsx)(s.h3,{id:"microservices",children:"Microservices"}),"\n",(0,n.jsx)(s.p,{children:"The Microservices tab shows all the microservices installed, their update time, state, and count. Clicking the eyeball shows the raw JSON that makes up the microservice configuration."}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.img,{alt:"Microservices",src:t(48).A+"",width:"2200",height:"1226"})}),"\n",(0,n.jsx)(s.h3,{id:"packages",children:"Packages"}),"\n",(0,n.jsx)(s.p,{children:"The Packages tab shows all the Ruby gems and Python packages installed in the system. You can also install packages from this tab if you're in an offline (air gapped) environment where COSMOS can't pull dependencies from Rubygems or Pypi."}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.img,{alt:"Packages",src:t(2601).A+"",width:"1074",height:"1394"})}),"\n",(0,n.jsx)(s.h3,{id:"tools",children:"Tools"}),"\n",(0,n.jsx)(s.p,{children:"The Tools tab lists all the tools installed. You can reorder the tools in the Navigation bar by dragging and dropping the left side grab handle."}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.img,{alt:"Tools",src:t(9349).A+"",width:"2200",height:"2192"})}),"\n",(0,n.jsxs)(s.p,{children:["You can also add links to existing tools in the navigation bar by using the Add button. Any ",(0,n.jsx)(s.a,{href:"https://pictogrammers.com/library/mdi/",children:"material design icons"})," can be used as the Tool icon."]}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.img,{alt:"Add Tool",src:t(7108).A+"",width:"2060",height:"232"})}),"\n",(0,n.jsx)(s.h3,{id:"redis",children:"Redis"}),"\n",(0,n.jsx)(s.p,{children:"The Redis tab allows you to interact directly with the underlying Redis database, making it easy to modify or delete data. THIS IS DANGEROUS, and should only be performed by COSMOS developers."}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.img,{alt:"Redis",src:t(161).A+"",width:"2200",height:"1254"})}),"\n",(0,n.jsx)(s.h3,{id:"secrets",children:"Secrets"}),"\n",(0,n.jsxs)(s.p,{children:["The Secrets tab allows you to create secrets that can be used by Interfaces or Microservices using the ",(0,n.jsx)(s.a,{href:"../configuration/plugins#secret",children:"SECRET"})," keyword. Secrets require setting the Secret Name and then can be set to an individual value using the Secret Value, or to the contents of a file (like a certificate file) using the file selector. In the following example the USERNAME and PASSWORD were set to values while CA_FILE was set using an uploaded certificate file."]}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.img,{alt:"Secrets",src:t(1291).A+"",width:"2200",height:"962"})}),"\n",(0,n.jsx)(s.h3,{id:"settings",children:"Settings"}),"\n",(0,n.jsx)(s.p,{children:"The Settings tab contains various settings used throughout COSMOS. These including clearing saved tool configuration, hiding the Astro Clock, changing the system time zone, adding a top and bottom banner, creating a subtitle in the navigation bar, and changing the URLs of the various package libraries."}),"\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.img,{alt:"Settings1",src:t(7892).A+"",width:"2200",height:"2172"}),"\n",(0,n.jsx)(s.img,{alt:"Settings2",src:t(5532).A+"",width:"2200",height:"2436"})]}),"\n",(0,n.jsx)(s.h3,{id:"roles-enterprise",children:"Roles (Enterprise)"}),"\n",(0,n.jsxs)(s.p,{children:["The Roles tab allows users to create custom roles for role-based access control (RBAC). Roles define permissions and access levels throughout the COSMOS system. For more details, visit ",(0,n.jsx)(s.a,{href:"/tools/staticdocs/docs/guides/roles-permissions",children:"Roles and Permissions"}),"."]}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.img,{alt:"Roles",src:t(8567).A+"",width:"2514",height:"470"})}),"\n",(0,n.jsx)(s.h3,{id:"scopes-enterprise",children:"Scopes (Enterprise)"}),"\n",(0,n.jsxs)(s.p,{children:["The Scopes tab allows users to create scopes which define data boundaries between separate environments. This enables a single COSMOS deployment to manage multiple environments with isolated data (e.g., separate constellations). Scopes can be added using the top dialog, and scope configurations can be managed here. Users can toggle between their scopes from the top-right scopes dropdown. ",(0,n.jsx)(s.a,{href:"/tools/staticdocs/docs/configuration/command#command-authority-enterprise",children:"Command Authority"})," and ",(0,n.jsx)(s.a,{href:"/tools/staticdocs/docs/configuration/command#critical-commanding-enterprise",children:"Critical Commanding"})," can also be configured per scope from this tab."]}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.img,{alt:"Scopes",src:t(1393).A+"",width:"2510",height:"1568"})})]})}function h(e={}){let{wrapper:s}={...(0,a.R)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},7108:function(e,s,t){t.d(s,{A:()=>i});let i=t.p+"assets/images/add_tool-6919be6e6c05db133a8816a9fc03bf98b0789a8525da4cdaa7b041b25bf9edb8.png"},3210:function(e,s,t){t.d(s,{A:()=>i});let i=t.p+"assets/images/interfaces-fa10646a27eb9045b70c2c485498a864bed1896ff171b7f31f8698288e08ae73.png"},48:function(e,s,t){t.d(s,{A:()=>i});let i=t.p+"assets/images/microservices-805cc7d137958ac8183579cdb9a9845e7aef79db19723f0773f4ea4d957b48a1.png"},2601:function(e,s,t){t.d(s,{A:()=>i});let i=t.p+"assets/images/packages-72c40796a00462cca280fe6e87d6baa92f20a2efb378a0a1a60453827c4cd38f.png"},9456:function(e,s,t){t.d(s,{A:()=>i});let i=t.p+"assets/images/plugins-2ecbde86aa0ef62523fb1d17c385551a2fd5ff6a8f2db890f67bfb7adf66973e.png"},161:function(e,s,t){t.d(s,{A:()=>i});let i=t.p+"assets/images/redis-4553b5b35292cca3df1fa08577f2175efef34e0fdfe512f30ca70785b086b24f.png"},8567:function(e,s,t){t.d(s,{A:()=>i});let i=t.p+"assets/images/roles-37653453a2f2b704aacdf1c56c45d46b5fe56ac71c38a6d1fe29510fdc3ac203.png"},9942:function(e,s,t){t.d(s,{A:()=>i});let i=t.p+"assets/images/routers-489fe07165973feede7a63adf71781cca7ecb1f7d17c069761c1c57e70cf926e.png"},1393:function(e,s,t){t.d(s,{A:()=>i});let i=t.p+"assets/images/scopes-dd892c6192160e86820a63d0d7798ed75eff4f96a4be9be0fb6bddebb82a9ddc.png"},1291:function(e,s,t){t.d(s,{A:()=>i});let i=t.p+"assets/images/secrets-c8daf324829a0d4dde1d30f9da89d884ca06ce458e400dfa5d1de4ccb10395a1.png"},7892:function(e,s,t){t.d(s,{A:()=>i});let i=t.p+"assets/images/settings1-36a446ec0455ae5ab3a6d225647264647e517e1e2d83da5c639a63756e0339a6.png"},5532:function(e,s,t){t.d(s,{A:()=>i});let i=t.p+"assets/images/settings2-c18e478b65ba569bea37a2bb185b4702e347aecc570fbc7b26a6e66aeecc9129.png"},2342:function(e,s,t){t.d(s,{A:()=>i});let i=t.p+"assets/images/targets-c02c28769712aa226fdcbd3b90329285aeb39e775b9be1df6ab0e2ad31231518.png"},9349:function(e,s,t){t.d(s,{A:()=>i});let i=t.p+"assets/images/tools-d3ea80e2fdc04e5b85743146ebaf1fc7f1406b7b5e6ec9b700ed35dedc8d16e6.png"},5511:function(e,s,t){t.d(s,{R:()=>o,x:()=>c});var i=t(6363);let n={},a=i.createContext(n);function o(e){let s=i.useContext(a);return i.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),i.createElement(a.Provider,{value:s},e.children)}}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([["5300"],{4057:function(c,e,s){s.d(e,{A:()=>p});var o=s(6655),n=s(6529),a=s(680);let p={...o.A,Tabs:n.A,TabItem:a.A}}}]);
|