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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([["8920"],{729:function(e,i,r){r.r(i),r.d(i,{metadata:()=>n,default:()=>h,frontMatter:()=>s,contentTitle:()=>c,toc:()=>l,assets:()=>a});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(9796);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)}},9796: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)}}}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([["2221"],{7304:function(e,n,s){s.r(n),s.d(n,{metadata:()=>r,default:()=>h,frontMatter:()=>t,contentTitle:()=>c,toc:()=>a,assets:()=>l});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(9796);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', 'BOOL', 'ARRAY', 'OBJECT', 'ANY', 'TIME'\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, BOOL, ARRAY, OBJECT, ANY, 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.")}},9796: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)}}}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([["6112"],{5696:function(e,t,n){n.r(t),n.d(t,{metadata:()=>i,default:()=>h,frontMatter:()=>l,contentTitle:()=>s,toc:()=>r,assets:()=>d});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(9796);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(8913).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(8794).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)}},8794:function(e,t,n){n.d(t,{A:()=>i});let i=n.p+"assets/images/file_menu-d672c1f8064e5f847a2464397c1e75ee423452f1ba4a7d0861319bc7c7891196.png"},8913:function(e,t,n){n.d(t,{A:()=>i});let i=n.p+"assets/images/table_manager-816d7a683e6883cb8049e5ec8ffef3076b37a489edcc0e5331bc5d81ab506da2.png"},9796: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)}}}]);
|