openc3-cosmos-tool-docs 5.17.1 → 5.18.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (160) hide show
  1. checksums.yaml +4 -4
  2. data/tools/staticdocs/404.html +4 -4
  3. data/tools/staticdocs/assets/css/{styles.8a0f1b26.css → styles.80ddca08.css} +1 -1
  4. data/tools/staticdocs/assets/js/{019369f3.34291acc.js → 019369f3.727d87f1.js} +1 -1
  5. data/tools/staticdocs/assets/js/{058ffc22.8d9049f4.js → 058ffc22.f2d69d72.js} +1 -1
  6. data/tools/staticdocs/assets/js/{0686a885.dde7b18b.js → 0686a885.83641127.js} +1 -1
  7. data/tools/staticdocs/assets/js/078dbab0.945c9f59.js +1 -0
  8. data/tools/staticdocs/assets/js/{0f5d161c.ca02c5b2.js → 0f5d161c.e26d88b8.js} +1 -1
  9. data/tools/staticdocs/assets/js/{0ff569c9.ad025a56.js → 0ff569c9.aa4daee5.js} +1 -1
  10. data/tools/staticdocs/assets/js/{103cc3be.6b6cd0fa.js → 103cc3be.78f97eb1.js} +1 -1
  11. data/tools/staticdocs/assets/js/{13196248.9e7794e3.js → 13196248.ca2e8950.js} +1 -1
  12. data/tools/staticdocs/assets/js/{13c1b4e4.cec67b9c.js → 13c1b4e4.22a0b1d4.js} +1 -1
  13. data/tools/staticdocs/assets/js/{2047b354.bdd2586a.js → 2047b354.25d11993.js} +1 -1
  14. data/tools/staticdocs/assets/js/22b3ac48.7a5ea984.js +1 -0
  15. data/tools/staticdocs/assets/js/{2bb7bf90.043455de.js → 2bb7bf90.fa05d998.js} +1 -1
  16. data/tools/staticdocs/assets/js/3917.1ec7d126.js +1 -0
  17. data/tools/staticdocs/assets/js/{3dd7ef3b.c7c1d93f.js → 3dd7ef3b.d55880a8.js} +1 -1
  18. data/tools/staticdocs/assets/js/{40365d27.7eb3f7b1.js → 40365d27.4b4b2ccd.js} +1 -1
  19. data/tools/staticdocs/assets/js/{411898ad.d5f62a27.js → 411898ad.1d6a609d.js} +1 -1
  20. data/tools/staticdocs/assets/js/{42170351.69a8ed02.js → 42170351.c68b85e1.js} +1 -1
  21. data/tools/staticdocs/assets/js/43652efd.d1e1add3.js +1 -0
  22. data/tools/staticdocs/assets/js/53ca7c5b.c3111020.js +1 -0
  23. data/tools/staticdocs/assets/js/{54d0d530.28ba5be7.js → 54d0d530.d3f9a4ac.js} +1 -1
  24. data/tools/staticdocs/assets/js/{5b233ba7.9c621552.js → 5b233ba7.6fdd6b6c.js} +1 -1
  25. data/tools/staticdocs/assets/js/{5bc719f6.7fa17221.js → 5bc719f6.daa2a049.js} +1 -1
  26. data/tools/staticdocs/assets/js/{5c6ce5ec.5e6ca46b.js → 5c6ce5ec.61a9cae2.js} +1 -1
  27. data/tools/staticdocs/assets/js/5e3ed378.2bee863a.js +1 -0
  28. data/tools/staticdocs/assets/js/5fe211ef.a9f21277.js +1 -0
  29. data/tools/staticdocs/assets/js/6831b732.185eb427.js +1 -0
  30. data/tools/staticdocs/assets/js/{696b4199.0335bd94.js → 696b4199.a5ae3d65.js} +1 -1
  31. data/tools/staticdocs/assets/js/{6b210247.2cbd59e6.js → 6b210247.e96f3982.js} +1 -1
  32. data/tools/staticdocs/assets/js/{6b65133b.87dc7da6.js → 6b65133b.4e84b1c2.js} +1 -1
  33. data/tools/staticdocs/assets/js/6f92e431.65aa0240.js +1 -0
  34. data/tools/staticdocs/assets/js/72c6d8a8.98daa27a.js +1 -0
  35. data/tools/staticdocs/assets/js/{75e64983.932fbc0e.js → 75e64983.6ef0928b.js} +1 -1
  36. data/tools/staticdocs/assets/js/{867640d5.ffd4cf4c.js → 867640d5.48133ad5.js} +1 -1
  37. data/tools/staticdocs/assets/js/{89e76475.97389cc5.js → 89e76475.13ce283b.js} +1 -1
  38. data/tools/staticdocs/assets/js/{8f7843ee.d1ffd5ee.js → 8f7843ee.7a68246a.js} +1 -1
  39. data/tools/staticdocs/assets/js/9424f0b3.61c6bd97.js +1 -0
  40. data/tools/staticdocs/assets/js/{97535711.fc45ced1.js → 97535711.5311ddd9.js} +1 -1
  41. data/tools/staticdocs/assets/js/{99581c43.8e571df8.js → 99581c43.527aab44.js} +1 -1
  42. data/tools/staticdocs/assets/js/{9fb6059a.42881e94.js → 9fb6059a.a5107afb.js} +1 -1
  43. data/tools/staticdocs/assets/js/{a507c363.04b98d2c.js → a507c363.d2cc5d72.js} +1 -1
  44. data/tools/staticdocs/assets/js/{a677c089.b2928bac.js → a677c089.abc52ace.js} +1 -1
  45. data/tools/staticdocs/assets/js/{a9987364.8f065f19.js → a9987364.5ef1644f.js} +1 -1
  46. data/tools/staticdocs/assets/js/{aa6b6c1b.d78e5212.js → aa6b6c1b.c51c044d.js} +1 -1
  47. data/tools/staticdocs/assets/js/{b4596165.6806d46b.js → b4596165.daa24b72.js} +1 -1
  48. data/tools/staticdocs/assets/js/b6d70f94.4923c793.js +1 -0
  49. data/tools/staticdocs/assets/js/b9f60ba6.e55cd937.js +1 -0
  50. data/tools/staticdocs/assets/js/{bd0034eb.b4e3d6c1.js → bd0034eb.6691ccc4.js} +1 -1
  51. data/tools/staticdocs/assets/js/c24eae19.251e0038.js +1 -0
  52. data/tools/staticdocs/assets/js/{cb8c3f08.a0ef4b5f.js → cb8c3f08.b82ad06f.js} +1 -1
  53. data/tools/staticdocs/assets/js/cd879be4.f956406f.js +1 -0
  54. data/tools/staticdocs/assets/js/d1b923aa.d6bafb72.js +1 -0
  55. data/tools/staticdocs/assets/js/{d1bfc316.2d823a88.js → d1bfc316.0a5ff560.js} +1 -1
  56. data/tools/staticdocs/assets/js/{d24bf9b6.53eca5e8.js → d24bf9b6.6c422113.js} +1 -1
  57. data/tools/staticdocs/assets/js/{d57a4b5d.aaa48891.js → d57a4b5d.8f23a506.js} +1 -1
  58. data/tools/staticdocs/assets/js/{d5d77c37.be6fe7b6.js → d5d77c37.70fdbbc6.js} +1 -1
  59. data/tools/staticdocs/assets/js/{d8ca4191.c6632184.js → d8ca4191.2349d796.js} +1 -1
  60. data/tools/staticdocs/assets/js/{d9b92eba.c6a2c7e5.js → d9b92eba.8f82360d.js} +1 -1
  61. data/tools/staticdocs/assets/js/{db8fa1d0.f078bc02.js → db8fa1d0.8f1b2c9f.js} +1 -1
  62. data/tools/staticdocs/assets/js/{dc5f7beb.a4afe7cd.js → dc5f7beb.e3a82d1e.js} +1 -1
  63. data/tools/staticdocs/assets/js/{e501b0d1.d108a8a9.js → e501b0d1.0b407477.js} +1 -1
  64. data/tools/staticdocs/assets/js/ebec1ccb.9bea92b0.js +1 -0
  65. data/tools/staticdocs/assets/js/f15615f1.5c433923.js +1 -0
  66. data/tools/staticdocs/assets/js/{fd886806.a21dd400.js → fd886806.4a41fa80.js} +1 -1
  67. data/tools/staticdocs/assets/js/main.b5390098.js +2 -0
  68. data/tools/staticdocs/assets/js/runtime~main.12d1e41d.js +1 -0
  69. data/tools/staticdocs/docs/configuration/command.html +96 -180
  70. data/tools/staticdocs/docs/configuration/format.html +25 -54
  71. data/tools/staticdocs/docs/configuration/interfaces.html +25 -80
  72. data/tools/staticdocs/docs/configuration/plugins.html +138 -178
  73. data/tools/staticdocs/docs/configuration/protocols.html +91 -110
  74. data/tools/staticdocs/docs/configuration/ssl-tls.html +33 -104
  75. data/tools/staticdocs/docs/configuration/table.html +67 -125
  76. data/tools/staticdocs/docs/configuration/target.html +23 -31
  77. data/tools/staticdocs/docs/configuration/telemetry-screens.html +194 -455
  78. data/tools/staticdocs/docs/configuration/telemetry.html +104 -187
  79. data/tools/staticdocs/docs/configuration.html +4 -4
  80. data/tools/staticdocs/docs/development/curl.html +17 -126
  81. data/tools/staticdocs/docs/development/developing.html +29 -80
  82. data/tools/staticdocs/docs/development/host-install.html +10 -23
  83. data/tools/staticdocs/docs/development/json-api.html +20 -32
  84. data/tools/staticdocs/docs/development/log-structure.html +14 -14
  85. data/tools/staticdocs/docs/development/roadmap.html +15 -15
  86. data/tools/staticdocs/docs/development/streaming-api.html +11 -83
  87. data/tools/staticdocs/docs/development/testing.html +17 -26
  88. data/tools/staticdocs/docs/development.html +4 -4
  89. data/tools/staticdocs/docs/getting-started/generators.html +35 -109
  90. data/tools/staticdocs/docs/getting-started/gettingstarted.html +26 -74
  91. data/tools/staticdocs/docs/getting-started/installation.html +24 -35
  92. data/tools/staticdocs/docs/getting-started/key_concepts.html +35 -35
  93. data/tools/staticdocs/docs/getting-started/podman.html +26 -57
  94. data/tools/staticdocs/docs/getting-started/requirements.html +21 -21
  95. data/tools/staticdocs/docs/getting-started/upgrading.html +12 -17
  96. data/tools/staticdocs/docs/getting-started.html +4 -4
  97. data/tools/staticdocs/docs/guides/bridges.html +19 -63
  98. data/tools/staticdocs/docs/guides/cfs.html +44 -184
  99. data/tools/staticdocs/docs/guides/custom-widgets.html +20 -47
  100. data/tools/staticdocs/docs/guides/little-endian-bitfields.html +5 -14
  101. data/tools/staticdocs/docs/guides/local-mode.html +16 -21
  102. data/tools/staticdocs/docs/guides/logging.html +12 -12
  103. data/tools/staticdocs/docs/guides/monitoring.html +22 -137
  104. data/tools/staticdocs/docs/guides/performance.html +18 -27
  105. data/tools/staticdocs/docs/guides/raspberrypi.html +10 -23
  106. data/tools/staticdocs/docs/guides/script-writing.html +85 -391
  107. data/tools/staticdocs/docs/guides/scripting-api.html +482 -1353
  108. data/tools/staticdocs/docs/guides.html +4 -4
  109. data/tools/staticdocs/docs/meta/contributing.html +14 -19
  110. data/tools/staticdocs/docs/meta/licenses.html +13 -31
  111. data/tools/staticdocs/docs/meta/philosophy.html +4 -4
  112. data/tools/staticdocs/docs/meta/xtce.html +15 -17
  113. data/tools/staticdocs/docs/meta.html +4 -4
  114. data/tools/staticdocs/docs/privacy.html +20 -20
  115. data/tools/staticdocs/docs/tools/autonomic.html +22 -22
  116. data/tools/staticdocs/docs/tools/bucket-explorer.html +13 -13
  117. data/tools/staticdocs/docs/tools/calendar.html +21 -21
  118. data/tools/staticdocs/docs/tools/cmd-sender.html +16 -16
  119. data/tools/staticdocs/docs/tools/cmd-tlm-server.html +23 -23
  120. data/tools/staticdocs/docs/tools/data-extractor.html +27 -27
  121. data/tools/staticdocs/docs/tools/data-viewer.html +13 -13
  122. data/tools/staticdocs/docs/tools/handbooks.html +7 -7
  123. data/tools/staticdocs/docs/tools/limits-monitor.html +19 -19
  124. data/tools/staticdocs/docs/tools/packet-viewer.html +16 -16
  125. data/tools/staticdocs/docs/tools/script-runner.html +36 -75
  126. data/tools/staticdocs/docs/tools/table-manager.html +13 -48
  127. data/tools/staticdocs/docs/tools/tlm-grapher.html +23 -23
  128. data/tools/staticdocs/docs/tools/tlm-viewer.html +18 -18
  129. data/tools/staticdocs/docs/tools.html +4 -4
  130. data/tools/staticdocs/docs.html +14 -14
  131. data/tools/staticdocs/index.html +4 -4
  132. data/tools/staticdocs/lunr-index-1724101625047.json +1 -0
  133. data/tools/staticdocs/lunr-index.json +1 -1
  134. data/tools/staticdocs/markdown-page.html +5 -5
  135. data/tools/staticdocs/search-doc-1724101625047.json +1 -0
  136. data/tools/staticdocs/search-doc.json +1 -1
  137. metadata +71 -71
  138. data/tools/staticdocs/assets/js/078dbab0.b275e04c.js +0 -1
  139. data/tools/staticdocs/assets/js/22b3ac48.0f4fbe9d.js +0 -1
  140. data/tools/staticdocs/assets/js/43652efd.be2c1d02.js +0 -1
  141. data/tools/staticdocs/assets/js/4650.292aca67.js +0 -1
  142. data/tools/staticdocs/assets/js/53ca7c5b.3f1245d5.js +0 -1
  143. data/tools/staticdocs/assets/js/5e3ed378.77db7b87.js +0 -1
  144. data/tools/staticdocs/assets/js/5fe211ef.71dc8326.js +0 -1
  145. data/tools/staticdocs/assets/js/6831b732.5714d508.js +0 -1
  146. data/tools/staticdocs/assets/js/6f92e431.300a9857.js +0 -1
  147. data/tools/staticdocs/assets/js/72c6d8a8.cfccace6.js +0 -1
  148. data/tools/staticdocs/assets/js/9424f0b3.29299bde.js +0 -1
  149. data/tools/staticdocs/assets/js/b6d70f94.f5514e8b.js +0 -1
  150. data/tools/staticdocs/assets/js/b9f60ba6.c3b3046d.js +0 -1
  151. data/tools/staticdocs/assets/js/c24eae19.6b084c7c.js +0 -1
  152. data/tools/staticdocs/assets/js/cd879be4.6f19050a.js +0 -1
  153. data/tools/staticdocs/assets/js/d1b923aa.3f3e186d.js +0 -1
  154. data/tools/staticdocs/assets/js/ebec1ccb.1ded1149.js +0 -1
  155. data/tools/staticdocs/assets/js/f15615f1.f9b655a6.js +0 -1
  156. data/tools/staticdocs/assets/js/main.c2e2b617.js +0 -2
  157. data/tools/staticdocs/assets/js/runtime~main.2bb31799.js +0 -1
  158. data/tools/staticdocs/lunr-index-1719505302032.json +0 -1
  159. data/tools/staticdocs/search-doc-1719505302032.json +0 -1
  160. /data/tools/staticdocs/assets/js/{main.c2e2b617.js.LICENSE.txt → main.b5390098.js.LICENSE.txt} +0 -0
@@ -0,0 +1 @@
1
+ "use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([[5750],{2793:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>A,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var n=i(1085),a=i(1184);const s={title:"Data Extractor"},o=void 0,d={id:"tools/data-extractor",title:"Data Extractor",description:"Introduction",source:"@site/docs/tools/data-extractor.md",sourceDirName:"tools",slug:"/tools/data-extractor",permalink:"/tools/staticdocs/docs/tools/data-extractor",draft:!1,unlisted:!1,editUrl:"https://github.com/OpenC3/cosmos/tree/main/docs.openc3.com/docs/tools/data-extractor.md",tags:[],version:"current",frontMatter:{title:"Data Extractor"},sidebar:"defaultSidebar",previous:{title:"Command and Telemetry Server",permalink:"/tools/staticdocs/docs/tools/cmd-tlm-server"},next:{title:"Data Viewer",permalink:"/tools/staticdocs/docs/tools/data-viewer"}},l={},c=[{value:"Introduction",id:"introduction",level:2},{value:"Data Extractor Menus",id:"data-extractor-menus",level:2},{value:"File Menu Items",id:"file-menu-items",level:3},{value:"Open Configuration",id:"open-configuration",level:4},{value:"Save Configuration",id:"save-configuration",level:4},{value:"Mode Menu Items",id:"mode-menu-items",level:3},{value:"Selecting Items for Output",id:"selecting-items-for-output",level:2},{value:"Start/End Date/Time",id:"startend-datetime",level:3},{value:"Adding Target(s) Packet(s) Item(s)",id:"adding-targets-packets-items",level:3},{value:"Removing Items",id:"removing-items",level:3},{value:"Editing Items",id:"editing-items",level:3},{value:"Processing Items",id:"processing-items",level:2}];function r(e){const t={h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",p:"p",ul:"ul",...(0,a.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h2,{id:"introduction",children:"Introduction"}),"\n",(0,n.jsx)(t.p,{children:"Data Extractor extracts command and telemetry items into comma or tab separated files. Individual items or entire packets can be processed over any time period. Data Extractor also has a number of options to control the output for post processing in Excel or Matlab, for example."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Data Extractor",src:i(2994).A+"",width:"1271",height:"728"})}),"\n",(0,n.jsx)(t.h2,{id:"data-extractor-menus",children:"Data Extractor Menus"}),"\n",(0,n.jsx)(t.h3,{id:"file-menu-items",children:"File Menu Items"}),"\n",(0,n.jsx)("img",{src:i(8441).A,alt:"File Menu",style:{float:"left","margin-right":"50px",height:"150px"}}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"Opens a saved configuration"}),"\n",(0,n.jsx)(t.li,{children:"Save the current configuration (item list)"}),"\n",(0,n.jsx)(t.li,{children:"Reset the configuration (default settings)"}),"\n",(0,n.jsx)(t.li,{children:"Delimit output with commas"}),"\n",(0,n.jsx)(t.li,{children:"Delimit output with tabs"}),"\n"]}),"\n",(0,n.jsx)(t.h4,{id:"open-configuration",children:"Open Configuration"}),"\n",(0,n.jsx)(t.p,{children:"The Open Configuration dialog displays a list of all saved configurations. You select a configuration and then click Ok to load it. You can delete existing configurations by clicking the Trash icon next to a configuration name."}),"\n",(0,n.jsx)(t.h4,{id:"save-configuration",children:"Save Configuration"}),"\n",(0,n.jsx)(t.p,{children:"The Save Configuration dialog also displays a list of all saved configurations. You click the Configuration Name text field, enter the name of your new configuration, and click Ok to save. You can delete existing configurations by clicking the Trash icon next to a configuration name."}),"\n",(0,n.jsx)(t.h3,{id:"mode-menu-items",children:"Mode Menu Items"}),"\n",(0,n.jsx)("img",{src:i(2132).A,alt:"Mode Menu",style:{float:"left","margin-right":"50px",height:"150px"}}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"Fill empty cells with the previous value"}),"\n",(0,n.jsx)(t.li,{children:"Add a Matlab comment ('%') to the header"}),"\n",(0,n.jsx)(t.li,{children:"Only output changed values"}),"\n",(0,n.jsx)(t.li,{children:"Only list item name as column header"}),"\n",(0,n.jsx)(t.li,{children:"List full Target Packet Item as header"}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"selecting-items-for-output",children:"Selecting Items for Output"}),"\n",(0,n.jsx)(t.h3,{id:"startend-datetime",children:"Start/End Date/Time"}),"\n",(0,n.jsx)(t.p,{children:"Data Extractor provides text fields where you specify the time range to extract items. Clicking the Start Date and End Date text fields opens a Date Chooser dialog. Note you can also manually type in the date. Clicking the Start Time and End Time icon opens up a Time Chooser dialog. Note you can also manually type in the time."}),"\n",(0,n.jsx)(t.h3,{id:"adding-targets-packets-items",children:"Adding Target(s) Packet(s) Item(s)"}),"\n",(0,n.jsx)(t.p,{children:'Data Extractor provides Target, Packet, Item drop downs to select the items you want to export. When you select a Target the Packet drop down defaults to [All] which sets the button to "Add Target". This would add EVERY item defined in EVERY packet in the target. Note: This can be a LOT of telemetry points but any added point can be removed.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Select Target",src:i(9780).A+"",width:"1276",height:"630"})}),"\n",(0,n.jsx)(t.p,{children:'When you select a Packet the Item drop down defaults to [All] which sets the button to "Add Packet". This would add EVERY item defined in the specified packet. Note: This can be a LOT of telemetry points but any added point can be removed.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Select Packet",src:i(8375).A+"",width:"1276",height:"629"})}),"\n",(0,n.jsx)(t.p,{children:'When you select an individual Item the button changes to "Add Item" and the Description field updates with the item\'s description.'}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Select Item",src:i(8898).A+"",width:"1276",height:"601"})}),"\n",(0,n.jsx)(t.h3,{id:"removing-items",children:"Removing Items"}),"\n",(0,n.jsx)(t.p,{children:"Once you've added items the Items table will have a list of items. Items can be removed by clicking the Trash icon next to the item. ALL items can be removed by clicking the Trash icon in the header."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Delete All Mouseover",src:i(920).A+"",width:"391",height:"129"})}),"\n",(0,n.jsx)(t.h3,{id:"editing-items",children:"Editing Items"}),"\n",(0,n.jsx)(t.p,{children:"Items can be edited by clicking the Pencil icon next to the item. ALL items can be edited by clicking the pencil icon in the header."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Edit All Mouseover",src:i(3857).A+"",width:"375",height:"124"})}),"\n",(0,n.jsx)(t.p,{children:"Clicking the Edit All brings up the Edit All Items dialog."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Edit All",src:i(7670).A+"",width:"599",height:"382"})}),"\n",(0,n.jsx)(t.p,{children:"This allows you to change the data type of all items in the list. Clicking the pencil next to an individual item brings up a similar dialog to edit the individual item."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Edit TEMP1",src:i(4049).A+"",width:"599",height:"382"})}),"\n",(0,n.jsx)(t.h2,{id:"processing-items",children:"Processing Items"}),"\n",(0,n.jsx)(t.p,{children:"Clicking the Process button starts the processing of the items list. A progress wheel is shown on the left side of the table and the Process button changes to Cancel to allow canceling the process."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Processing",src:i(4106).A+"",width:"1273",height:"630"})}),"\n",(0,n.jsx)(t.p,{children:"When the processing is complete, the browser shows a file download link. Note this varies by browser. This example is from Chrome."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Processing Done",src:i(3367).A+"",width:"1273",height:"630"})})]})}function A(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(r,{...e})}):r(e)}},8441:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/file_menu-7880f656c65d1c95d94f11d85f83f1fb2cf1e743397022902485e1330467bdb4.png"},2132:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/mode_menu-9ff9a2c1b2cae1eb15a7bd95c0d2bd939cf8f183a083edfcb2b70748dd1bbfe1.png"},8898:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/add_item-4e7c51e0d6a7304260097ccfe8a64d7f2d2b428dba9758070a618ca0dcc89457.png"},8375:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/add_packet-74322c89982856286103da2c91c4246a4a8aa319c216bc1c169515ab28381cd6.png"},9780:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/add_target-f1f0d16faf5f3c1ecdfe3daa90d44d082053845d5f7a59e988d90ff0b5ba00ff.png"},2994:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/data_extractor-e0cd7006244f50f7d1811ee3f287b300aa3ccfb09f4716e1dd9990d1cc38a510.png"},920:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/delete_all_mouseover-e45ea88fcc088c18c88e03ddad5ad6fa9fa3869f67c1548bdfb3da447eceb228.png"},7670:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/edit_all_items-1de8be31edb8443427b834f03efea4ac5bceb722e5da0c0b38b2d006ff4364a7.png"},3857:(e,t,i)=>{i.d(t,{A:()=>n});const n="data:image/png;base64,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"},4049:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/edit_temp1-545919bb22c6882d3b02cd4a4d8b9410b69e410c958b4472b8a643f48889f434.png"},4106:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/processing-25c56ec1beef6f8df3db085378c31d2dd44289280414497d87ce8d12b4beebb9.png"},3367:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/processing_done-1d74097c066b6067e07a73735626dbff19f3102599c548b3874eb4f52ad5335d.png"},1184:(e,t,i)=>{i.d(t,{R:()=>o,x:()=>d});var n=i(4041);const a={},s=n.createContext(a);function o(e){const t=n.useContext(s);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(a):e.components||a:o(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]);
@@ -0,0 +1 @@
1
+ "use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([[2932],{3045:(n,e,s)=>{s.r(e),s.d(e,{default:()=>l});s(4041);var o=s(145);function r(n,e){return`docs-${n}-${e}`}var c=s(4647),t=s(8150),i=s(6613),u=s(1085);function a(n){const{version:e}=n;return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(i.A,{version:e.version,tag:r(e.pluginId,e.version)}),(0,u.jsx)(o.be,{children:e.noIndex&&(0,u.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})]})}function d(n){const{version:e,route:s}=n;return(0,u.jsx)(o.e3,{className:e.className,children:(0,u.jsx)(c.n,{version:e,children:(0,t.v)(s.routes)})})}function l(n){return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(a,{...n}),(0,u.jsx)(d,{...n})]})}}}]);
@@ -1 +1 @@
1
- "use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([[6464],{9723:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>r,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>l,toc:()=>d});var s=t(1085),n=t(1184);const o={title:"Limits Monitor"},a=void 0,l={id:"tools/limits-monitor",title:"Limits Monitor",description:"Introduction",source:"@site/docs/tools/limits-monitor.md",sourceDirName:"tools",slug:"/tools/limits-monitor",permalink:"/tools/staticdocs/docs/tools/limits-monitor",draft:!1,unlisted:!1,editUrl:"https://github.com/OpenC3/cosmos/tree/main/docs.openc3.com/docs/tools/limits-monitor.md",tags:[],version:"current",frontMatter:{title:"Limits Monitor"},sidebar:"defaultSidebar",previous:{title:"Handbooks",permalink:"/tools/staticdocs/docs/tools/handbooks"},next:{title:"Packet Viewer",permalink:"/tools/staticdocs/docs/tools/packet-viewer"}},r={},d=[{value:"Introduction",id:"introduction",level:2},{value:"Limits Monitor Menus",id:"limits-monitor-menus",level:2},{value:"File Menu Items",id:"file-menu-items",level:3},{value:"Show Ignored",id:"show-ignored",level:4},{value:"Change Limits Set",id:"change-limits-set",level:4},{value:"Open Configuration",id:"open-configuration",level:4},{value:"Save Configuration",id:"save-configuration",level:4},{value:"Limits Items",id:"limits-items",level:2},{value:"Limits Log",id:"limits-log",level:2}];function c(e){const i={a:"a",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",p:"p",ul:"ul",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.h2,{id:"introduction",children:"Introduction"}),"\n",(0,s.jsx)(i.p,{children:"The Limits Monitor application provides situational awareness for all telemetry items with limits. All limits items which violate their yellow or red limits are shown and continue to be shown until explicity dismissed. Individual items and entire packets can be manually ignored to filter out known issues. In addition, all limits events are logged in a table which can be searched."}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"Cmd Tlm Server",src:t(3814).A+"",width:"1270",height:"803"})}),"\n",(0,s.jsx)(i.h2,{id:"limits-monitor-menus",children:"Limits Monitor Menus"}),"\n",(0,s.jsx)(i.h3,{id:"file-menu-items",children:"File Menu Items"}),"\n",(0,s.jsx)("img",{src:t(443).A,alt:"File Menu",style:{float:"left","margin-right":"50px",height:"150px"}}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Show the list of ignored items"}),"\n",(0,s.jsx)(i.li,{children:"Change the overall COSMOS limits set"}),"\n",(0,s.jsx)(i.li,{children:"Opens a saved configuration"}),"\n",(0,s.jsx)(i.li,{children:"Save the current configuration (ignored items)"}),"\n",(0,s.jsx)(i.li,{children:"Reset the configuration (defaults settings)"}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"show-ignored",children:"Show Ignored"}),"\n",(0,s.jsx)(i.p,{children:"This dialog displays all the items which the user has manually ignored by clicking the ignore icons next to out of limits items. Note that entire Packets which have been ignored are listed as TARGET PACKET without an item (as shown by INST MECH). Ignored items are removed by clicking the Trash icon. This means that the next time this item goes out of limits it will be displayed."}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"Ignored",src:t(7527).A+"",width:"594",height:"306"})}),"\n",(0,s.jsx)(i.h4,{id:"change-limits-set",children:"Change Limits Set"}),"\n",(0,s.jsxs)(i.p,{children:["Limits sets are defined with the ",(0,s.jsx)(i.a,{href:"../configuration/telemetry#limits",children:"LIMITS"})," keyword on telemetry items. Each item must have at least a DEFAULT limits set but can also have other named limit sets. COSMOS only has a single limits set active at one time. This dialog allows the user to change the active limits set and apply new limit values across all of COSMOS."]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"Change Limits Set",src:t(8151).A+"",width:"647",height:"217"})}),"\n",(0,s.jsx)(i.h4,{id:"open-configuration",children:"Open Configuration"}),"\n",(0,s.jsx)(i.p,{children:"The Open Configuration dialog displays a list of all saved configurations. You select a configuration and then click Ok to load it. You can delete existing configurations by clicking the Trash icon next to a configuration name."}),"\n",(0,s.jsx)(i.h4,{id:"save-configuration",children:"Save Configuration"}),"\n",(0,s.jsx)(i.p,{children:"The Save Configuration dialog also displays a list of all saved configurations. You click the Configuration Name text field, enter the name of your new configuration, and click Ok to save. You can delete existing configurations by clicking the Trash icon next to a configuration name."}),"\n",(0,s.jsx)(i.h2,{id:"limits-items",children:"Limits Items"}),"\n",(0,s.jsx)(i.p,{children:"The main interface of Limits Monitor is the top where items are displayed when they violate a yellow or red limit."}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"Limits",src:t(3814).A+"",width:"1270",height:"803"})}),"\n",(0,s.jsxs)(i.p,{children:["Items with limits values are displayed using a red yellow green limits bar displaying where the current value lies within the defined limits (as shown by the various TEMP items). Items with yellow or red ",(0,s.jsx)(i.a,{href:"/tools/staticdocs/docs/configuration/telemetry#state",children:"states"})," are simply displayed with their state color (as shown by GROUND1STATUS). The COSMOS Demo contains both INST HEALTH_STATUS TEMP2 and INST2 HEALTH_STATUS TEMP2 which are identically named items within different target packets. Limits Monitor only displays the item name to save space, however if you mouse over the value box the full target and packet name is displayed."]}),"\n",(0,s.jsx)(i.p,{children:"Clicking the first nested 'X' icon ignores the entire packet where the item resides. Any additional items in that packet which go out of limits are also ignored by Limits Monitor. Clicking the second (middle) 'X' ignores ONLY that specific item. If any packets or items are ignored the Overall Limits State is updated to indicate \"(Some items ignored)\" to indicate the Limits State is potentially being affected by ignored items."}),"\n",(0,s.jsx)(i.p,{children:"Clicking the last icon (eye with strike-through) temporarily hides the specified item. This is different from ignoring an item because if this item goes out of limits it will be again be displayed. Hiding an item is useful if the item has gone back to green and you want to continue to track it but want to clean up the current list of items. For example, we might hide the GROUND1STATUS items in the above example as they have transitioned back to green."}),"\n",(0,s.jsx)(i.h2,{id:"limits-log",children:"Limits Log"}),"\n",(0,s.jsx)(i.p,{children:"The Log section lists all limits events. Events can be filtered by using the Search box as shown."}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"Log",src:t(4012).A+"",width:"1261",height:"522"})})]})}function h(e={}){const{wrapper:i}={...(0,n.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},443:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/file_menu-953e2fc0c1a5b30c90d6f748add6ee28f8b42f30fc33d0b3c8709d6c85f06585.png"},8151:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/change_limits_set-b72da282ea28d783bd7e1d0cd48db72486dacb4e76e1cd46d52c7999028d9c0d.png"},7527:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/ignored-0917bd9f41f4e93704daa45cc0a7b70809bdbba03615d6de254336141b598992.png"},3814:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/limits_monitor-34ca441e5a7198b4dc57a27b2e6fcb973dddad5eaaa5e9bf0d60738f4143c73a.png"},4012:(e,i,t)=>{t.d(i,{A:()=>s});const s=t.p+"assets/images/log-6cf3276d9e6b7dc30573b2b6a5989c6c5defc658e2c0ae4c2150a5fd11fd49d3.png"},1184:(e,i,t)=>{t.d(i,{R:()=>a});var s=t(4041);const n={},o=s.createContext(n);function a(e){const i=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}}}]);
1
+ "use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([[6464],{9723:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>r,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>l,toc:()=>d});var n=t(1085),s=t(1184);const o={title:"Limits Monitor"},a=void 0,l={id:"tools/limits-monitor",title:"Limits Monitor",description:"Introduction",source:"@site/docs/tools/limits-monitor.md",sourceDirName:"tools",slug:"/tools/limits-monitor",permalink:"/tools/staticdocs/docs/tools/limits-monitor",draft:!1,unlisted:!1,editUrl:"https://github.com/OpenC3/cosmos/tree/main/docs.openc3.com/docs/tools/limits-monitor.md",tags:[],version:"current",frontMatter:{title:"Limits Monitor"},sidebar:"defaultSidebar",previous:{title:"Handbooks",permalink:"/tools/staticdocs/docs/tools/handbooks"},next:{title:"Packet Viewer",permalink:"/tools/staticdocs/docs/tools/packet-viewer"}},r={},d=[{value:"Introduction",id:"introduction",level:2},{value:"Limits Monitor Menus",id:"limits-monitor-menus",level:2},{value:"File Menu Items",id:"file-menu-items",level:3},{value:"Show Ignored",id:"show-ignored",level:4},{value:"Change Limits Set",id:"change-limits-set",level:4},{value:"Open Configuration",id:"open-configuration",level:4},{value:"Save Configuration",id:"save-configuration",level:4},{value:"Limits Items",id:"limits-items",level:2},{value:"Limits Log",id:"limits-log",level:2}];function c(e){const i={a:"a",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",p:"p",ul:"ul",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.h2,{id:"introduction",children:"Introduction"}),"\n",(0,n.jsx)(i.p,{children:"The Limits Monitor application provides situational awareness for all telemetry items with limits. All limits items which violate their yellow or red limits are shown and continue to be shown until explicity dismissed. Individual items and entire packets can be manually ignored to filter out known issues. In addition, all limits events are logged in a table which can be searched."}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.img,{alt:"Cmd Tlm Server",src:t(3814).A+"",width:"1270",height:"803"})}),"\n",(0,n.jsx)(i.h2,{id:"limits-monitor-menus",children:"Limits Monitor Menus"}),"\n",(0,n.jsx)(i.h3,{id:"file-menu-items",children:"File Menu Items"}),"\n",(0,n.jsx)("img",{src:t(443).A,alt:"File Menu",style:{float:"left","margin-right":"50px",height:"150px"}}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:"Show the list of ignored items"}),"\n",(0,n.jsx)(i.li,{children:"Change the overall COSMOS limits set"}),"\n",(0,n.jsx)(i.li,{children:"Opens a saved configuration"}),"\n",(0,n.jsx)(i.li,{children:"Save the current configuration (ignored items)"}),"\n",(0,n.jsx)(i.li,{children:"Reset the configuration (defaults settings)"}),"\n"]}),"\n",(0,n.jsx)(i.h4,{id:"show-ignored",children:"Show Ignored"}),"\n",(0,n.jsx)(i.p,{children:"This dialog displays all the items which the user has manually ignored by clicking the ignore icons next to out of limits items. Note that entire Packets which have been ignored are listed as TARGET PACKET without an item (as shown by INST MECH). Ignored items are removed by clicking the Trash icon. This means that the next time this item goes out of limits it will be displayed."}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.img,{alt:"Ignored",src:t(7527).A+"",width:"594",height:"306"})}),"\n",(0,n.jsx)(i.h4,{id:"change-limits-set",children:"Change Limits Set"}),"\n",(0,n.jsxs)(i.p,{children:["Limits sets are defined with the ",(0,n.jsx)(i.a,{href:"../configuration/telemetry#limits",children:"LIMITS"})," keyword on telemetry items. Each item must have at least a DEFAULT limits set but can also have other named limit sets. COSMOS only has a single limits set active at one time. This dialog allows the user to change the active limits set and apply new limit values across all of COSMOS."]}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.img,{alt:"Change Limits Set",src:t(8151).A+"",width:"647",height:"217"})}),"\n",(0,n.jsx)(i.h4,{id:"open-configuration",children:"Open Configuration"}),"\n",(0,n.jsx)(i.p,{children:"The Open Configuration dialog displays a list of all saved configurations. You select a configuration and then click Ok to load it. You can delete existing configurations by clicking the Trash icon next to a configuration name."}),"\n",(0,n.jsx)(i.h4,{id:"save-configuration",children:"Save Configuration"}),"\n",(0,n.jsx)(i.p,{children:"The Save Configuration dialog also displays a list of all saved configurations. You click the Configuration Name text field, enter the name of your new configuration, and click Ok to save. You can delete existing configurations by clicking the Trash icon next to a configuration name."}),"\n",(0,n.jsx)(i.h2,{id:"limits-items",children:"Limits Items"}),"\n",(0,n.jsx)(i.p,{children:"The main interface of Limits Monitor is the top where items are displayed when they violate a yellow or red limit."}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.img,{alt:"Limits",src:t(3814).A+"",width:"1270",height:"803"})}),"\n",(0,n.jsxs)(i.p,{children:["Items with limits values are displayed using a red yellow green limits bar displaying where the current value lies within the defined limits (as shown by the various TEMP items). Items with yellow or red ",(0,n.jsx)(i.a,{href:"/tools/staticdocs/docs/configuration/telemetry#state",children:"states"})," are simply displayed with their state color (as shown by GROUND1STATUS). The COSMOS Demo contains both INST HEALTH_STATUS TEMP2 and INST2 HEALTH_STATUS TEMP2 which are identically named items within different target packets. Limits Monitor only displays the item name to save space, however if you mouse over the value box the full target and packet name is displayed."]}),"\n",(0,n.jsx)(i.p,{children:"Clicking the first nested 'X' icon ignores the entire packet where the item resides. Any additional items in that packet which go out of limits are also ignored by Limits Monitor. Clicking the second (middle) 'X' ignores ONLY that specific item. If any packets or items are ignored the Overall Limits State is updated to indicate \"(Some items ignored)\" to indicate the Limits State is potentially being affected by ignored items."}),"\n",(0,n.jsx)(i.p,{children:"Clicking the last icon (eye with strike-through) temporarily hides the specified item. This is different from ignoring an item because if this item goes out of limits it will be again be displayed. Hiding an item is useful if the item has gone back to green and you want to continue to track it but want to clean up the current list of items. For example, we might hide the GROUND1STATUS items in the above example as they have transitioned back to green."}),"\n",(0,n.jsx)(i.h2,{id:"limits-log",children:"Limits Log"}),"\n",(0,n.jsx)(i.p,{children:"The Log section lists all limits events. Events can be filtered by using the Search box as shown."}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.img,{alt:"Log",src:t(4012).A+"",width:"1261",height:"522"})})]})}function h(e={}){const{wrapper:i}={...(0,s.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},443:(e,i,t)=>{t.d(i,{A:()=>n});const n=t.p+"assets/images/file_menu-953e2fc0c1a5b30c90d6f748add6ee28f8b42f30fc33d0b3c8709d6c85f06585.png"},8151:(e,i,t)=>{t.d(i,{A:()=>n});const n=t.p+"assets/images/change_limits_set-b72da282ea28d783bd7e1d0cd48db72486dacb4e76e1cd46d52c7999028d9c0d.png"},7527:(e,i,t)=>{t.d(i,{A:()=>n});const n=t.p+"assets/images/ignored-0917bd9f41f4e93704daa45cc0a7b70809bdbba03615d6de254336141b598992.png"},3814:(e,i,t)=>{t.d(i,{A:()=>n});const n=t.p+"assets/images/limits_monitor-34ca441e5a7198b4dc57a27b2e6fcb973dddad5eaaa5e9bf0d60738f4143c73a.png"},4012:(e,i,t)=>{t.d(i,{A:()=>n});const n=t.p+"assets/images/log-6cf3276d9e6b7dc30573b2b6a5989c6c5defc658e2c0ae4c2150a5fd11fd49d3.png"},1184:(e,i,t)=>{t.d(i,{R:()=>a,x:()=>l});var n=t(4041);const s={},o=n.createContext(s);function a(e){const i=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function l(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),n.createElement(o.Provider,{value:i},e.children)}}}]);
@@ -1 +1 @@
1
- "use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([[8444],{3860:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>h,frontMatter:()=>t,metadata:()=>r,toc:()=>c});var o=s(1085),i=s(1184);const t={title:"Understanding Licenses"},l=void 0,r={id:"meta/licenses",title:"Understanding Licenses",description:"OpenC3 COSMOS is offered under a tri-licensing model allowing users to choose between the following three options:",source:"@site/docs/meta/licenses.md",sourceDirName:"meta",slug:"/meta/licenses",permalink:"/tools/staticdocs/docs/meta/licenses",draft:!1,unlisted:!1,editUrl:"https://github.com/OpenC3/cosmos/tree/main/docs.openc3.com/docs/meta/licenses.md",tags:[],version:"current",frontMatter:{title:"Understanding Licenses"},sidebar:"defaultSidebar",previous:{title:"Contributing",permalink:"/tools/staticdocs/docs/meta/contributing"},next:{title:"Philosophy",permalink:"/tools/staticdocs/docs/meta/philosophy"}},a={},c=[{value:"AGPLv3",id:"agplv3",level:2},{value:"Evaluation and Education Use Only",id:"evaluation-and-education-use-only",level:2},{value:"Commercial License",id:"commercial-license",level:2},{value:"Why you should buy a Commercial License",id:"why-you-should-buy-a-commercial-license",level:2}];function d(e){const n={a:"a",code:"code",em:"em",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.p,{children:"OpenC3 COSMOS is offered under a tri-licensing model allowing users to choose between the following three options:"}),"\n",(0,o.jsx)(n.h2,{id:"agplv3",children:"AGPLv3"}),"\n",(0,o.jsxs)(n.p,{children:["This is our default open source license and the license that most free users use. The AGPLv3 is a modification of the GPLv3 which is what is known as a copy-left license or a viral license. You can read the whole thing here: ",(0,o.jsx)(n.a,{href:"https://github.com/OpenC3/cosmos/blob/main/LICENSE.txt",children:"OpenC3 AGPLv3"})]}),"\n",(0,o.jsx)(n.p,{children:"Obviously, the actual license text applies, but here is a short summary:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"The AGPL allows users to use the code however they want: For business, personal, etc., as long as they follow the other terms:"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Users are anyone who could access the web-app. On the public internet, that is the whole world. On a private network, it is anyone with access to that network."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"The software is provided as-is, no warranty"}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Users must be given access to all the source code and are also allowed to use it however they want under the same terms of the AGPLv3. This includes any modifications made, anything added, and all plugins."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"For web applications (like COSMOS), a link must be provided to all of the source code."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"There are some key implications of the above:"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"You cannot keep anything proprietary from your users. They have the rights to take the code (and configuration) and do anything they want with it. You CANNOT impede these rights or you are violating the AGPLv3 and YOU lose the rights to use our software."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"You must provide a digital link to all source code for your users, including plugins."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"All plugins must be licensed in an AGPLv3 compatible fashion. We recommend the MIT license because that allows your plugins to be compatible with the AGPLv3 and our commercial license. You can also use a dual license similar to what we do indicating the AGPLv3 or a purchased OpenC3 Commercial license."}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"The AGPLv3 license is often chosen because it works well for open core products like COSMOS. Competitors cannot take the open source product and license it under different terms. They would be forever locked into the AGPLv3 which is difficult to monetize, because your customers can take any code you provide and publish it on the internet for free use by everyone."}),"\n",(0,o.jsx)(n.p,{children:"As the copyright holder, OpenC3 is able to license the product and derivatives commercially. No-one else can do this. (OpenC3 is also able to license legacy Ball Aerospace COSMOS code under IP agreement)"}),"\n",(0,o.jsx)(n.h2,{id:"evaluation-and-education-use-only",children:"Evaluation and Education Use Only"}),"\n",(0,o.jsxs)(n.p,{children:["This license takes effect as soon as you use any plugin we publish under Evaluation and Education terms. Currently the only plugin we use for this is our CCSDS CFDP plugin: ",(0,o.jsx)(n.a,{href:"https://github.com/OpenC3/openc3-cosmos-cfdp",children:"CFDP Plugin"})]}),"\n",(0,o.jsx)(n.p,{children:"You can read the whole license here:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:'# OpenC3 Evaluation and Educational License\n#\n# Copyright 2023 OpenC3, Inc.\n#\n# This work is licensed for evaluation and educational purposes only.\n# It may NOT be used for formal development, integration and test, operations\n# or any other commercial purpose without the purchase of a commercial license\n# from OpenC3, Inc.\n#\n# The above copyright notice and this permission notice shall be included in all copies\n# or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,\n# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n# PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n'})}),"\n",(0,o.jsx)(n.p,{children:"This license is pretty straight forward, but the key is you can't use this code for any real work leading to a product (Formal Development, Integration and Test, or Operations) unless you switch to purchasing a commercial license."}),"\n",(0,o.jsx)(n.h2,{id:"commercial-license",children:"Commercial License"}),"\n",(0,o.jsx)(n.p,{children:"This license is a signed contract with OpenC3. It allows use of our code for a program under contractual terms where you do not have to follow the AGPLv3."}),"\n",(0,o.jsx)(n.p,{children:"Generally we license to a specific project with terms that allow for unlimited users, and installs as needed by that project. Any code and plugins that you develop under the commercial license can be kept proprietary."}),"\n",(0,o.jsx)(n.p,{children:"These licenses are sold as yearly subscriptions, or as a non-expiring perpetual license. We also offer site licenses, and licenses to support unlimited missions on a government framework architecture."}),"\n",(0,o.jsx)(n.p,{children:"Of course with our commercial license, you also get all the extra functionality of our Enterprise product."}),"\n",(0,o.jsx)(n.h2,{id:"why-you-should-buy-a-commercial-license",children:"Why you should buy a Commercial License"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"You want to save years and tens of millions of dollars developing the same functionality yourself."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"You want all of the Enterprise functionality of COSMOS Enterprise Edition"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsx)(n.li,{children:"User Accounts"}),"\n",(0,o.jsx)(n.li,{children:"Role Based Access Control"}),"\n",(0,o.jsx)(n.li,{children:"LDAP Support"}),"\n",(0,o.jsx)(n.li,{children:"Kubernetes Support"}),"\n",(0,o.jsx)(n.li,{children:"Cloud Deployment Configurations"}),"\n",(0,o.jsx)(n.li,{children:"The right to use CFDP and other Enterprise Only plugins"}),"\n",(0,o.jsx)(n.li,{children:"Grafana Support"}),"\n",(0,o.jsx)(n.li,{children:"Support from the COSMOS Developers"}),"\n",(0,o.jsxs)(n.li,{children:["Lots more - See our ",(0,o.jsx)(n.a,{href:"https://openc3.com/enterprise",children:"Enterprise"})," page"]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"You don't want to follow the AGPLv3"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsx)(n.li,{children:"You want to keep the code and plugins you develop proprietary"}),"\n",(0,o.jsx)(n.li,{children:"You don't want to publish an accessible link to your source code"}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"You want to support the continued development and innovation of the COSMOS product"}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:(0,o.jsx)(n.em,{children:"We appreciate all of our commercial customers. You make OpenC3 possible. Thank you."})})})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},1184:(e,n,s)=>{s.d(n,{R:()=>l});var o=s(4041);const i={},t=o.createContext(i);function l(e){const n=o.useContext(t);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}}}]);
1
+ "use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([[8444],{3860:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>h,frontMatter:()=>t,metadata:()=>r,toc:()=>a});var s=o(1085),i=o(1184);const t={title:"Understanding Licenses"},l=void 0,r={id:"meta/licenses",title:"Understanding Licenses",description:"OpenC3 COSMOS is offered under a tri-licensing model allowing users to choose between the following three options:",source:"@site/docs/meta/licenses.md",sourceDirName:"meta",slug:"/meta/licenses",permalink:"/tools/staticdocs/docs/meta/licenses",draft:!1,unlisted:!1,editUrl:"https://github.com/OpenC3/cosmos/tree/main/docs.openc3.com/docs/meta/licenses.md",tags:[],version:"current",frontMatter:{title:"Understanding Licenses"},sidebar:"defaultSidebar",previous:{title:"Contributing",permalink:"/tools/staticdocs/docs/meta/contributing"},next:{title:"Philosophy",permalink:"/tools/staticdocs/docs/meta/philosophy"}},c={},a=[{value:"AGPLv3",id:"agplv3",level:2},{value:"Evaluation and Education Use Only",id:"evaluation-and-education-use-only",level:2},{value:"Commercial License",id:"commercial-license",level:2},{value:"Why you should buy a Commercial License",id:"why-you-should-buy-a-commercial-license",level:2}];function d(e){const n={a:"a",code:"code",em:"em",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.p,{children:"OpenC3 COSMOS is offered under a tri-licensing model allowing users to choose between the following three options:"}),"\n",(0,s.jsx)(n.h2,{id:"agplv3",children:"AGPLv3"}),"\n",(0,s.jsxs)(n.p,{children:["This is our default open source license and the license that most free users use. The AGPLv3 is a modification of the GPLv3 which is what is known as a copy-left license or a viral license. You can read the whole thing here: ",(0,s.jsx)(n.a,{href:"https://github.com/OpenC3/cosmos/blob/main/LICENSE.txt",children:"OpenC3 AGPLv3"})]}),"\n",(0,s.jsx)(n.p,{children:"Obviously, the actual license text applies, but here is a short summary:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"The AGPL allows users to use the code however they want: For business, personal, etc., as long as they follow the other terms:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Users are anyone who could access the web-app. On the public internet, that is the whole world. On a private network, it is anyone with access to that network."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"The software is provided as-is, no warranty"}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Users must be given access to all the source code and are also allowed to use it however they want under the same terms of the AGPLv3. This includes any modifications made, anything added, and all plugins."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"For web applications (like COSMOS), a link must be provided to all of the source code."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"There are some key implications of the above:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"You cannot keep anything proprietary from your users. They have the rights to take the code (and configuration) and do anything they want with it. You CANNOT impede these rights or you are violating the AGPLv3 and YOU lose the rights to use our software."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"You must provide a digital link to all source code for your users, including plugins."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"All plugins must be licensed in an AGPLv3 compatible fashion. We recommend the MIT license because that allows your plugins to be compatible with the AGPLv3 and our commercial license. You can also use a dual license similar to what we do indicating the AGPLv3 or a purchased OpenC3 Commercial license."}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"The AGPLv3 license is often chosen because it works well for open core products like COSMOS. Competitors cannot take the open source product and license it under different terms. They would be forever locked into the AGPLv3 which is difficult to monetize, because your customers can take any code you provide and publish it on the internet for free use by everyone."}),"\n",(0,s.jsx)(n.p,{children:"As the copyright holder, OpenC3 is able to license the product and derivatives commercially. No-one else can do this. (OpenC3 is also able to license legacy Ball Aerospace COSMOS code under IP agreement)"}),"\n",(0,s.jsx)(n.h2,{id:"evaluation-and-education-use-only",children:"Evaluation and Education Use Only"}),"\n",(0,s.jsxs)(n.p,{children:["This license takes effect as soon as you use any plugin we publish under Evaluation and Education terms. Currently the only plugin we use for this is our CCSDS CFDP plugin: ",(0,s.jsx)(n.a,{href:"https://github.com/OpenC3/openc3-cosmos-cfdp",children:"CFDP Plugin"})]}),"\n",(0,s.jsx)(n.p,{children:"You can read the whole license here:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:'# OpenC3 Evaluation and Educational License\n#\n# Copyright 2023 OpenC3, Inc.\n#\n# This work is licensed for evaluation and educational purposes only.\n# It may NOT be used for formal development, integration and test, operations\n# or any other commercial purpose without the purchase of a commercial license\n# from OpenC3, Inc.\n#\n# The above copyright notice and this permission notice shall be included in all copies\n# or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,\n# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n# PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n'})}),"\n",(0,s.jsx)(n.p,{children:"This license is pretty straight forward, but the key is you can't use this code for any real work leading to a product (Formal Development, Integration and Test, or Operations) unless you switch to purchasing a commercial license."}),"\n",(0,s.jsx)(n.h2,{id:"commercial-license",children:"Commercial License"}),"\n",(0,s.jsx)(n.p,{children:"This license is a signed contract with OpenC3. It allows use of our code for a program under contractual terms where you do not have to follow the AGPLv3."}),"\n",(0,s.jsx)(n.p,{children:"Generally we license to a specific project with terms that allow for unlimited users, and installs as needed by that project. Any code and plugins that you develop under the commercial license can be kept proprietary."}),"\n",(0,s.jsx)(n.p,{children:"These licenses are sold as yearly subscriptions, or as a non-expiring perpetual license. We also offer site licenses, and licenses to support unlimited missions on a government framework architecture."}),"\n",(0,s.jsx)(n.p,{children:"Of course with our commercial license, you also get all the extra functionality of our Enterprise product."}),"\n",(0,s.jsx)(n.h2,{id:"why-you-should-buy-a-commercial-license",children:"Why you should buy a Commercial License"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"You want to save years and tens of millions of dollars developing the same functionality yourself."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"You want all of the Enterprise functionality of COSMOS Enterprise Edition"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"User Accounts"}),"\n",(0,s.jsx)(n.li,{children:"Role Based Access Control"}),"\n",(0,s.jsx)(n.li,{children:"LDAP Support"}),"\n",(0,s.jsx)(n.li,{children:"Kubernetes Support"}),"\n",(0,s.jsx)(n.li,{children:"Cloud Deployment Configurations"}),"\n",(0,s.jsx)(n.li,{children:"The right to use CFDP and other Enterprise Only plugins"}),"\n",(0,s.jsx)(n.li,{children:"Grafana Support"}),"\n",(0,s.jsx)(n.li,{children:"Support from the COSMOS Developers"}),"\n",(0,s.jsxs)(n.li,{children:["Lots more - See our ",(0,s.jsx)(n.a,{href:"https://openc3.com/enterprise",children:"Enterprise"})," page"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"You don't want to follow the AGPLv3"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"You want to keep the code and plugins you develop proprietary"}),"\n",(0,s.jsx)(n.li,{children:"You don't want to publish an accessible link to your source code"}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"You want to support the continued development and innovation of the COSMOS product"}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:(0,s.jsx)(n.em,{children:"We appreciate all of our commercial customers. You make OpenC3 possible. Thank you."})})})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},1184:(e,n,o)=>{o.d(n,{R:()=>l,x:()=>r});var s=o(4041);const i={},t=s.createContext(i);function l(e){const n=s.useContext(t);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),s.createElement(t.Provider,{value:n},e.children)}}}]);
@@ -1 +1 @@
1
- "use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([[3942],{7628:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>a,metadata:()=>r,toc:()=>l});var o=s(1085),t=s(1184);const a={sidebar_position:7,title:"Podman"},i=void 0,r={id:"getting-started/podman",title:"Podman",description:"OpenC3 COSMOS Using Rootless Podman and Docker-Compose",source:"@site/docs/getting-started/podman.md",sourceDirName:"getting-started",slug:"/getting-started/podman",permalink:"/tools/staticdocs/docs/getting-started/podman",draft:!1,unlisted:!1,editUrl:"https://github.com/OpenC3/cosmos/tree/main/docs.openc3.com/docs/getting-started/podman.md",tags:[],version:"current",sidebarPosition:7,frontMatter:{sidebar_position:7,title:"Podman"},sidebar:"defaultSidebar",previous:{title:"Requirements and Design",permalink:"/tools/staticdocs/docs/getting-started/requirements"},next:{title:"Configuration",permalink:"/tools/staticdocs/docs/configuration"}},c={},l=[{value:"OpenC3 COSMOS Using Rootless Podman and Docker-Compose",id:"openc3-cosmos-using-rootless-podman-and-docker-compose",level:3},{value:"MacOS Instructions",id:"macos-instructions",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",...(0,t.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h3,{id:"openc3-cosmos-using-rootless-podman-and-docker-compose",children:"OpenC3 COSMOS Using Rootless Podman and Docker-Compose"}),"\n",(0,o.jsx)(n.admonition,{title:"Optional Installation Option",type:"info",children:(0,o.jsx)(n.p,{children:"These directions are for installing and running COSMOS using Podman instead of Docker. If you have Docker available, that is a simpler method."})}),"\n",(0,o.jsx)(n.p,{children:"Podman is an alternative container technology to Docker that is actively promoted by RedHat. The key benefit is that Podman can run without a root-level daemon service, making it significantly more secure by design, over standard Docker. However, it is a little more complicated to use. These directions will get you up and running with Podman. The following directions have been tested against RHEL 8.8, and RHEL 9.2, but should be similar on other operating systems."}),"\n",(0,o.jsx)(n.admonition,{title:"Rootless Podman Does Not Work (Directly) with NFS Home Directories",type:"warning",children:(0,o.jsxs)(n.p,{children:["NFS does not work for holding container storage due to issues with user ids and group ids. There are workarounds available but they all involve moving container storage to another location: either a different partition on the host local disk, or into a special mounted disk image. See: [",(0,o.jsx)(n.a,{href:"https://www.redhat.com/sysadmin/rootless-podman-nfs",children:"https://www.redhat.com/sysadmin/rootless-podman-nfs"}),"]",(0,o.jsx)(n.a,{href:"https://www.redhat.com/sysadmin/rootless-podman-nfs",children:"https://www.redhat.com/sysadmin/rootless-podman-nfs"}),"). Note that there is also a newish Podman setting that allows you to more easily change where the storage location is in /etc/containers/storage.conf called rootless_storage_path. See ",(0,o.jsx)(n.a,{href:"https://www.redhat.com/sysadmin/nfs-rootless-podman",children:"https://www.redhat.com/sysadmin/nfs-rootless-podman"})]})}),"\n",(0,o.jsx)(n.h1,{id:"redhat-88-and-92-instructions",children:"Redhat 8.8 and 9.2 Instructions"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Install Prerequisite Packages"}),"\n",(0,o.jsx)(n.p,{children:"Note: This downloads and installs docker-compose from the latest 2.x release on Github. If your operating system has a docker-compose package, it will be easier to install using that instead. RHEL8 does not have a docker-compose package."}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo yum update\nsudo yum install git podman-docker netavark\ncurl -SL https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-x86_64 -o docker-compose\nsudo mv docker-compose /usr/local/bin/docker-compose\nsudo chmod +x /usr/local/bin/docker-compose\nsudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose\n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Configure Host OS for Redis"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo su\necho never > /sys/kernel/mm/transparent_hugepage/enabled\necho never > /sys/kernel/mm/transparent_hugepage/defrag\nsysctl -w vm.max_map_count=262144\nexit\n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Configure Podman to use Netavark for DNS"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo cp /usr/share/containers/containers.conf /etc/containers/.\nsudo vi /etc/containers/containers.conf\n"})}),"\n",(0,o.jsx)(n.p,{children:'Then edit the network_backend line to be "netavark" instead of "cni"'}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Start rootless podman socket service"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"systemctl enable --now --user podman.socket\n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Put the following into your .bashrc file (or .bash_profile or whatever)"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:'export DOCKER_HOST="unix://$XDG_RUNTIME_DIR/podman/podman.sock"\n'})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Source the profile file for your current terminal"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"source .bashrc\n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Get COSMOS - A release or the current main branch (main branch shown)"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/OpenC3/cosmos.git\n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Optional - Set Default Container Registry"}),"\n",(0,o.jsx)(n.p,{children:"If you don't want podman to keep querying you for which registry to use, you can create a $HOME/.config/containers/registries.conf and modify to just have the main docker registry (or modify the /etc/containers/registries.conf file directly)"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"mkdir -p $HOME/.config/containers\ncp /etc/containers/registries.conf $HOME/.config/containers/.\nvi $HOME/.config/containers/registries.conf\n"})}),"\n",(0,o.jsx)(n.p,{children:"Then edit the unqualified-search-registries = line to just have the registry you care about (probably docker.io)"}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Edit cosmos/compose.yaml"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"cd cosmos\nvi compose.yaml\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Edit compose.yaml and uncomment the user: 0:0 lines and comment the user: ",(0,o.jsx)(n.code,{children:'"${OPENC3_USER_ID}:${OPENC3_GROUP_ID}"'})," lines.\nYou may also want to update the traefik configuration to allow access from the internet by removing 127.0.0.1 and probably switching to either an SSL config file, or the allow http one. Also make sure your firewall allows\nwhatever port you choose to use in. Rootless podman will need to use a higher numbered port (not 1-1023)."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Run COSMOS"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"./openc3.sh run\n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Wait until everything is built and running and then goto ",(0,o.jsx)(n.a,{href:"http://localhost:2900",children:"http://localhost:2900"})," in your browser"]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.admonition,{title:"Podman on MacOS",type:"info",children:(0,o.jsx)(n.p,{children:"Podman can also be used on MacOS, though we still generally recommend Docker Desktop"})}),"\n",(0,o.jsx)(n.h2,{id:"macos-instructions",children:"MacOS Instructions"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Install podman"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"brew install podman\n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Start the podman virtual machine"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"podman machine init\npodman machine start\n# Note: update to your username in the next line or copy paste from what 'podman machine start' says\nexport DOCKER_HOST='unix:///Users/ryanmelt/.local/share/containers/podman/machine/qemu/podman.sock'\n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Install docker-compose"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"brew install docker-compose # Optional if you already have Docker Desktop\n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Edit cosmos/compose.yaml"}),"\n",(0,o.jsxs)(n.p,{children:["Edit compose.yaml and uncomment the user: 0:0 lines and comment the user: ",(0,o.jsx)(n.code,{children:'"${OPENC3_USER_ID}:${OPENC3_GROUP_ID}"'})," lines."]}),"\n",(0,o.jsxs)(n.p,{children:["Important: on MacOS you must also remove all ",":z"," from the volume mount lines"]}),"\n",(0,o.jsx)(n.p,{children:"You may also want to update the traefik configuration to allow access from the internet."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Run COSMOS"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"cd cosmos\n./openc3.sh run\n"})}),"\n"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},1184:(e,n,s)=>{s.d(n,{R:()=>i});var o=s(4041);const t={},a=o.createContext(t);function i(e){const n=o.useContext(a);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}}}]);
1
+ "use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([[3942],{7628:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>a,metadata:()=>r,toc:()=>l});var s=o(1085),t=o(1184);const a={sidebar_position:7,title:"Podman"},i=void 0,r={id:"getting-started/podman",title:"Podman",description:"OpenC3 COSMOS Using Rootless Podman and Docker-Compose",source:"@site/docs/getting-started/podman.md",sourceDirName:"getting-started",slug:"/getting-started/podman",permalink:"/tools/staticdocs/docs/getting-started/podman",draft:!1,unlisted:!1,editUrl:"https://github.com/OpenC3/cosmos/tree/main/docs.openc3.com/docs/getting-started/podman.md",tags:[],version:"current",sidebarPosition:7,frontMatter:{sidebar_position:7,title:"Podman"},sidebar:"defaultSidebar",previous:{title:"Requirements and Design",permalink:"/tools/staticdocs/docs/getting-started/requirements"},next:{title:"Configuration",permalink:"/tools/staticdocs/docs/configuration"}},c={},l=[{value:"OpenC3 COSMOS Using Rootless Podman and Docker-Compose",id:"openc3-cosmos-using-rootless-podman-and-docker-compose",level:3},{value:"MacOS Instructions",id:"macos-instructions",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h3,{id:"openc3-cosmos-using-rootless-podman-and-docker-compose",children:"OpenC3 COSMOS Using Rootless Podman and Docker-Compose"}),"\n",(0,s.jsx)(n.admonition,{title:"Optional Installation Option",type:"info",children:(0,s.jsx)(n.p,{children:"These directions are for installing and running COSMOS using Podman instead of Docker. If you have Docker available, that is a simpler method."})}),"\n",(0,s.jsx)(n.p,{children:"Podman is an alternative container technology to Docker that is actively promoted by RedHat. The key benefit is that Podman can run without a root-level daemon service, making it significantly more secure by design, over standard Docker. However, it is a little more complicated to use. These directions will get you up and running with Podman. The following directions have been tested against RHEL 8.8, and RHEL 9.2, but should be similar on other operating systems."}),"\n",(0,s.jsx)(n.admonition,{title:"Rootless Podman Does Not Work (Directly) with NFS Home Directories",type:"warning",children:(0,s.jsxs)(n.p,{children:["NFS does not work for holding container storage due to issues with user ids and group ids. There are workarounds available but they all involve moving container storage to another location: either a different partition on the host local disk, or into a special mounted disk image. See: [",(0,s.jsx)(n.a,{href:"https://www.redhat.com/sysadmin/rootless-podman-nfs",children:"https://www.redhat.com/sysadmin/rootless-podman-nfs"}),"]",(0,s.jsx)(n.a,{href:"https://www.redhat.com/sysadmin/rootless-podman-nfs",children:"https://www.redhat.com/sysadmin/rootless-podman-nfs"}),"). Note that there is also a newish Podman setting that allows you to more easily change where the storage location is in /etc/containers/storage.conf called rootless_storage_path. See ",(0,s.jsx)(n.a,{href:"https://www.redhat.com/sysadmin/nfs-rootless-podman",children:"https://www.redhat.com/sysadmin/nfs-rootless-podman"})]})}),"\n",(0,s.jsx)(n.h1,{id:"redhat-88-and-92-instructions",children:"Redhat 8.8 and 9.2 Instructions"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Install Prerequisite Packages"}),"\n",(0,s.jsx)(n.p,{children:"Note: This downloads and installs docker-compose from the latest 2.x release on Github. If your operating system has a docker-compose package, it will be easier to install using that instead. RHEL8 does not have a docker-compose package."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"sudo yum update\nsudo yum install git podman-docker netavark\ncurl -SL https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-x86_64 -o docker-compose\nsudo mv docker-compose /usr/local/bin/docker-compose\nsudo chmod +x /usr/local/bin/docker-compose\nsudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Configure Host OS for Redis"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"sudo su\necho never > /sys/kernel/mm/transparent_hugepage/enabled\necho never > /sys/kernel/mm/transparent_hugepage/defrag\nsysctl -w vm.max_map_count=262144\nexit\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Configure Podman to use Netavark for DNS"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"sudo cp /usr/share/containers/containers.conf /etc/containers/.\nsudo vi /etc/containers/containers.conf\n"})}),"\n",(0,s.jsx)(n.p,{children:'Then edit the network_backend line to be "netavark" instead of "cni"'}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Start rootless podman socket service"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"systemctl enable --now --user podman.socket\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Put the following into your .bashrc file (or .bash_profile or whatever)"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'export DOCKER_HOST="unix://$XDG_RUNTIME_DIR/podman/podman.sock"\n'})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Source the profile file for your current terminal"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"source .bashrc\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Get COSMOS - A release or the current main branch (main branch shown)"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/OpenC3/cosmos.git\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Optional - Set Default Container Registry"}),"\n",(0,s.jsx)(n.p,{children:"If you don't want podman to keep querying you for which registry to use, you can create a $HOME/.config/containers/registries.conf and modify to just have the main docker registry (or modify the /etc/containers/registries.conf file directly)"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"mkdir -p $HOME/.config/containers\ncp /etc/containers/registries.conf $HOME/.config/containers/.\nvi $HOME/.config/containers/registries.conf\n"})}),"\n",(0,s.jsx)(n.p,{children:"Then edit the unqualified-search-registries = line to just have the registry you care about (probably docker.io)"}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Edit cosmos/compose.yaml"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"cd cosmos\nvi compose.yaml\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Edit compose.yaml and uncomment the user: 0:0 lines and comment the user: ",(0,s.jsx)(n.code,{children:'"${OPENC3_USER_ID}:${OPENC3_GROUP_ID}"'})," lines.\nYou may also want to update the traefik configuration to allow access from the internet by removing 127.0.0.1 and probably switching to either an SSL config file, or the allow http one. Also make sure your firewall allows\nwhatever port you choose to use in. Rootless podman will need to use a higher numbered port (not 1-1023)."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Run COSMOS"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"./openc3.sh run\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Wait until everything is built and running and then goto ",(0,s.jsx)(n.a,{href:"http://localhost:2900",children:"http://localhost:2900"})," in your browser"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{title:"Podman on MacOS",type:"info",children:(0,s.jsx)(n.p,{children:"Podman can also be used on MacOS, though we still generally recommend Docker Desktop"})}),"\n",(0,s.jsx)(n.h2,{id:"macos-instructions",children:"MacOS Instructions"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Install podman"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"brew install podman\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Start the podman virtual machine"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"podman machine init\npodman machine start\n# Note: update to your username in the next line or copy paste from what 'podman machine start' says\nexport DOCKER_HOST='unix:///Users/ryanmelt/.local/share/containers/podman/machine/qemu/podman.sock'\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Install docker-compose"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"brew install docker-compose # Optional if you already have Docker Desktop\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Edit cosmos/compose.yaml"}),"\n",(0,s.jsxs)(n.p,{children:["Edit compose.yaml and uncomment the user: 0:0 lines and comment the user: ",(0,s.jsx)(n.code,{children:'"${OPENC3_USER_ID}:${OPENC3_GROUP_ID}"'})," lines."]}),"\n",(0,s.jsxs)(n.p,{children:["Important: on MacOS you must also remove all ",":z"," from the volume mount lines"]}),"\n",(0,s.jsx)(n.p,{children:"You may also want to update the traefik configuration to allow access from the internet."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Run COSMOS"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"cd cosmos\n./openc3.sh run\n"})}),"\n"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},1184:(e,n,o)=>{o.d(n,{R:()=>i,x:()=>r});var s=o(4041);const t={},a=s.createContext(t);function i(e){const n=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:i(e.components),s.createElement(a.Provider,{value:n},e.children)}}}]);
@@ -1 +1 @@
1
- "use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([[5380],{3521:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>s,metadata:()=>r,toc:()=>d});var a=n(1085),i=n(1184);const s={title:"Streaming API"},o=void 0,r={id:"development/streaming-api",title:"Streaming API",description:"This information is just generally used behind the scenes in COSMOS tools",source:"@site/docs/development/streaming-api.md",sourceDirName:"development",slug:"/development/streaming-api",permalink:"/tools/staticdocs/docs/development/streaming-api",draft:!1,unlisted:!1,editUrl:"https://github.com/OpenC3/cosmos/tree/main/docs.openc3.com/docs/development/streaming-api.md",tags:[],version:"current",frontMatter:{title:"Streaming API"},sidebar:"defaultSidebar",previous:{title:"Roadmap",permalink:"/tools/staticdocs/docs/development/roadmap"},next:{title:"Testing COSMOS",permalink:"/tools/staticdocs/docs/development/testing"}},c={},d=[];function l(e){const t={admonition:"admonition",code:"code",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.admonition,{title:"This documentation is for COSMOS Developers",type:"note",children:(0,a.jsx)(t.p,{children:"This information is just generally used behind the scenes in COSMOS tools"})}),"\n",(0,a.jsx)(t.p,{children:"The COSMOS 5 Streaming Api is the primary interface to receive a stream of the telemetry packets and/or command packets that have passed through the COSMOS system, both logged and continuously in realtime. Either raw binary packets or decommutated JSON packets can be requested."}),"\n",(0,a.jsx)(t.p,{children:"This API is implemented over Websockets using the Rails ActionCable framework. Actioncable client libraries are known to exist for at least Javascript, Ruby, and Python. Other languages may exist or could be created. Websockets allow for easy interaction with the new COSMOS 5 Javascript based frontend."}),"\n",(0,a.jsx)(t.p,{children:"The following interactions are all shown in Javascript, but would be very similar in any language.\nConnecting to this API begins by initiating an ActionCable connection."}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{children:"cable = ActionCable.createConsumer('/openc3-api/cable')\n"})}),"\n",(0,a.jsx)(t.p,{children:"This call opens the HTTP connection to the given URL and upgrades it to a websocket connection. This connection can then be shared with multiple \u201csubscriptions\u201d."}),"\n",(0,a.jsx)(t.p,{children:"A subscription describes a set of data that you want the API to stream to you. Creating a subscription looks like this:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-javascript",children:'subscription = cable.subscriptions.create(\n {\n channel: "StreamingChannel",\n scope: "DEFAULT",\n token: token,\n },\n {\n received: (data) => {\n // Handle received data\n },\n connected: () => {\n // First chance to add what you want to stream here\n },\n disconnected: () => {\n // Handle the subscription being disconnected\n },\n rejected: () => {\n // Handle the subscription being rejected\n },\n }\n);\n'})}),"\n",(0,a.jsxs)(t.p,{children:["Subscribing to the StreamingApi requires passing a channel name set to \u201cStreamingChannel\u201d, a scope which is typically \u201cDEFAULT\u201d, and an access token (a password in OpenSource COSMOS). In Javascript you also pass a set of callback functions that run at various lifecycle points in the subscription. The most important of these are ",(0,a.jsx)(t.code,{children:"connected"})," and ",(0,a.jsx)(t.code,{children:"received"}),"."]}),"\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.code,{children:"connected"})," runs when the subscription is accepted by the StreamApi. This callback is the first opportunity to request specific data that you would like streamed. Data can also be added or removed at any time while the subscription is open."]}),"\n",(0,a.jsx)(t.p,{children:"Data can be added to the stream by requesting individual items from a packet or by requesting the entire packet."}),"\n",(0,a.jsx)(t.p,{children:"Adding items to stream is done as follows:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-javascript",children:'var items = [\n ["DECOM__TLM__INST__ADCS__Q1__RAW", "0"],\n ["DECOM__CMD__INST__COLLECT__DURATION__WITH_UNITS", "1"],\n];\nOpenC3Auth.updateToken(OpenC3Auth.defaultMinValidity).then(() => {\n this.subscription.perform("add", {\n scope: window.openc3Scope,\n token: localStorage.openc3Token,\n items: items,\n start_time: this.startDateTime,\n end_time: this.endDateTime,\n });\n});\n'})}),"\n",(0,a.jsxs)(t.p,{children:["The values in the item name are separated by double underscores, e.g. ",(0,a.jsx)(t.code,{children:"<MODE>__<CMD or TLM>__<TARGET NAME>__<PACKET NAME>__<ITEM NAME>__<VALUE TYPE>__<REDUCED TYPE>"}),". Mode is either RAW, DECOM, REDUCED_MINUTE, REDUCED_HOUR, or REDUCED_DAY. The next parameter is CMD or TLM followed by the target, packet and item names. The Value Type is one of RAW, CONVERTED, FORMATTED, or WITH_UNITS. The last parameter is optional if you want to use the reduced data types. Reduced Type is one of SAMPLE, MIN, MAX, AVG, or STDDEV."]}),"\n",(0,a.jsx)(t.p,{children:"Adding packets to stream is done as follows:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-javascript",children:'var packets = [\n ["RAW__TLM__INST__ADCS", "0"],\n ["DECOM__TLM__INST__HEALTH_STATUS__FORMATTED", "1"],\n];\nOpenC3Auth.updateToken(OpenC3Auth.defaultMinValidity).then(() => {\n this.subscription.perform("add", {\n scope: window.openc3Scope,\n token: localStorage.openc3Token,\n packets: packets,\n start_time: this.startDateTime,\n end_time: this.endDateTime,\n });\n});\n'})}),"\n",(0,a.jsxs)(t.p,{children:["The values in the packet name are separated by double underscores, e.g. ",(0,a.jsx)(t.code,{children:"<MODE>__<CMD or TLM>__<TARGET NAME>__<PACKET NAME>__<VALUE TYPE>"}),". Mode is either RAW or DECOM. The next parameter is CMD or TLM followed by the target and packet names. The Value Type is one of RAW, CONVERTED, FORMATTED, or WITH_UNITS."]}),"\n",(0,a.jsx)(t.p,{children:"For Raw mode, VALUE TYPE should be set to RAW or omitted (e.g. TLM__INST__ADCS__RAW or TLM__INST__ADCS).\nstart_time and end_time are standard COSMOS 64-bit integer timestamps in nanoseconds since the Unix Epoch (midnight January 1st, 1970). If start_time is null, that indicates to start streaming from the current time in realtime, indefinitely until items are removed, or the subscription is unsubscribed. end_time is ignored if start_time is null. If start_time is given and end_time is null, that indicates to playback from the given starttime and then continue indefinitely in realtime. If both start_time and end_time are given, then that indicates a temporary playback of historical data."}),"\n",(0,a.jsx)(t.p,{children:"Data returned by the streaming API is handled by the received callback in Javascript. Data is returned as a JSON Array, with a JSON object in the array for each packet returned. Results are batched, and the current implementation will return up to 100 packets in each batch (the array will have 100 entries). 100 packets per batch is not guaranteed, and batches may take on varying sizes based on the size of the data returned, or other factors. An empty array indicates that all data has been sent for a purely historical query and can be used as an end of data indicator."}),"\n",(0,a.jsx)(t.p,{children:"For decommutated items, each packet is represented as a JSON object with a 'time' field holding the COSMOS nanosecond timestamp of the packet, and then each of the requested item keys with their corresponding value from the packet."}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-json",children:'[\n {\n "time": 1234657585858,\n "TLM__INST__ADCS__Q1__RAW": 50.0,\n "TLM__INST__ADCS__Q2__RAW": 100.0\n },\n {\n "time": 1234657585859,\n "TLM__INST__ADCS__Q1__RAW": 60.0,\n "TLM__INST__ADCS__Q2__RAW": 110.0\n }\n]\n'})}),"\n",(0,a.jsx)(t.p,{children:"For raw packets, each packet is represented as a JSON object with a time field holding the COSMOS nanosecond timestamp of the packet, a packet field holding the topic the packet was read from in the form of SCOPE__TELEMETRY__TARGETNAME__PACKETNAME, and a buffer field holding a BASE64 encoded copy of the packet data."}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-json",children:'[\n {\n "time": 1234657585858,\n "packet": "DEFAULT__TELEMETRY__INST__ADCS",\n "buffer": "SkdfjGodkdfjdfoekfsg"\n },\n {\n "time": 1234657585859,\n "packet": "DEFAULT__TELEMETRY__INST__ADCS",\n "buffer": "3i5n49dmnfg9fl32k3"\n }\n]\n'})})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(l,{...e})}):l(e)}},1184:(e,t,n)=>{n.d(t,{R:()=>o});var a=n(4041);const i={},s=a.createContext(i);function o(e){const t=a.useContext(s);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}}}]);
1
+ "use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([[5380],{3521:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>s,metadata:()=>r,toc:()=>d});var a=n(1085),i=n(1184);const s={title:"Streaming API"},o=void 0,r={id:"development/streaming-api",title:"Streaming API",description:"This information is just generally used behind the scenes in COSMOS tools",source:"@site/docs/development/streaming-api.md",sourceDirName:"development",slug:"/development/streaming-api",permalink:"/tools/staticdocs/docs/development/streaming-api",draft:!1,unlisted:!1,editUrl:"https://github.com/OpenC3/cosmos/tree/main/docs.openc3.com/docs/development/streaming-api.md",tags:[],version:"current",frontMatter:{title:"Streaming API"},sidebar:"defaultSidebar",previous:{title:"Roadmap",permalink:"/tools/staticdocs/docs/development/roadmap"},next:{title:"Testing COSMOS",permalink:"/tools/staticdocs/docs/development/testing"}},c={},d=[];function l(e){const t={admonition:"admonition",code:"code",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.admonition,{title:"This documentation is for COSMOS Developers",type:"note",children:(0,a.jsx)(t.p,{children:"This information is just generally used behind the scenes in COSMOS tools"})}),"\n",(0,a.jsx)(t.p,{children:"The COSMOS 5 Streaming Api is the primary interface to receive a stream of the telemetry packets and/or command packets that have passed through the COSMOS system, both logged and continuously in realtime. Either raw binary packets or decommutated JSON packets can be requested."}),"\n",(0,a.jsx)(t.p,{children:"This API is implemented over Websockets using the Rails ActionCable framework. Actioncable client libraries are known to exist for at least Javascript, Ruby, and Python. Other languages may exist or could be created. Websockets allow for easy interaction with the new COSMOS 5 Javascript based frontend."}),"\n",(0,a.jsx)(t.p,{children:"The following interactions are all shown in Javascript, but would be very similar in any language.\nConnecting to this API begins by initiating an ActionCable connection."}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{children:"cable = ActionCable.createConsumer('/openc3-api/cable')\n"})}),"\n",(0,a.jsx)(t.p,{children:"This call opens the HTTP connection to the given URL and upgrades it to a websocket connection. This connection can then be shared with multiple \u201csubscriptions\u201d."}),"\n",(0,a.jsx)(t.p,{children:"A subscription describes a set of data that you want the API to stream to you. Creating a subscription looks like this:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-javascript",children:'subscription = cable.subscriptions.create(\n {\n channel: "StreamingChannel",\n scope: "DEFAULT",\n token: token,\n },\n {\n received: (data) => {\n // Handle received data\n },\n connected: () => {\n // First chance to add what you want to stream here\n },\n disconnected: () => {\n // Handle the subscription being disconnected\n },\n rejected: () => {\n // Handle the subscription being rejected\n },\n }\n);\n'})}),"\n",(0,a.jsxs)(t.p,{children:["Subscribing to the StreamingApi requires passing a channel name set to \u201cStreamingChannel\u201d, a scope which is typically \u201cDEFAULT\u201d, and an access token (a password in OpenSource COSMOS). In Javascript you also pass a set of callback functions that run at various lifecycle points in the subscription. The most important of these are ",(0,a.jsx)(t.code,{children:"connected"})," and ",(0,a.jsx)(t.code,{children:"received"}),"."]}),"\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.code,{children:"connected"})," runs when the subscription is accepted by the StreamApi. This callback is the first opportunity to request specific data that you would like streamed. Data can also be added or removed at any time while the subscription is open."]}),"\n",(0,a.jsx)(t.p,{children:"Data can be added to the stream by requesting individual items from a packet or by requesting the entire packet."}),"\n",(0,a.jsx)(t.p,{children:"Adding items to stream is done as follows:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-javascript",children:'var items = [\n ["DECOM__TLM__INST__ADCS__Q1__RAW", "0"],\n ["DECOM__CMD__INST__COLLECT__DURATION__WITH_UNITS", "1"],\n];\nOpenC3Auth.updateToken(OpenC3Auth.defaultMinValidity).then(() => {\n this.subscription.perform("add", {\n scope: window.openc3Scope,\n token: localStorage.openc3Token,\n items: items,\n start_time: this.startDateTime,\n end_time: this.endDateTime,\n });\n});\n'})}),"\n",(0,a.jsxs)(t.p,{children:["The values in the item name are separated by double underscores, e.g. ",(0,a.jsx)(t.code,{children:"<MODE>__<CMD or TLM>__<TARGET NAME>__<PACKET NAME>__<ITEM NAME>__<VALUE TYPE>__<REDUCED TYPE>"}),". Mode is either RAW, DECOM, REDUCED_MINUTE, REDUCED_HOUR, or REDUCED_DAY. The next parameter is CMD or TLM followed by the target, packet and item names. The Value Type is one of RAW, CONVERTED, FORMATTED, or WITH_UNITS. The last parameter is optional if you want to use the reduced data types. Reduced Type is one of SAMPLE, MIN, MAX, AVG, or STDDEV."]}),"\n",(0,a.jsx)(t.p,{children:"Adding packets to stream is done as follows:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-javascript",children:'var packets = [\n ["RAW__TLM__INST__ADCS", "0"],\n ["DECOM__TLM__INST__HEALTH_STATUS__FORMATTED", "1"],\n];\nOpenC3Auth.updateToken(OpenC3Auth.defaultMinValidity).then(() => {\n this.subscription.perform("add", {\n scope: window.openc3Scope,\n token: localStorage.openc3Token,\n packets: packets,\n start_time: this.startDateTime,\n end_time: this.endDateTime,\n });\n});\n'})}),"\n",(0,a.jsxs)(t.p,{children:["The values in the packet name are separated by double underscores, e.g. ",(0,a.jsx)(t.code,{children:"<MODE>__<CMD or TLM>__<TARGET NAME>__<PACKET NAME>__<VALUE TYPE>"}),". Mode is either RAW or DECOM. The next parameter is CMD or TLM followed by the target and packet names. The Value Type is one of RAW, CONVERTED, FORMATTED, or WITH_UNITS."]}),"\n",(0,a.jsx)(t.p,{children:"For Raw mode, VALUE TYPE should be set to RAW or omitted (e.g. TLM__INST__ADCS__RAW or TLM__INST__ADCS).\nstart_time and end_time are standard COSMOS 64-bit integer timestamps in nanoseconds since the Unix Epoch (midnight January 1st, 1970). If start_time is null, that indicates to start streaming from the current time in realtime, indefinitely until items are removed, or the subscription is unsubscribed. end_time is ignored if start_time is null. If start_time is given and end_time is null, that indicates to playback from the given starttime and then continue indefinitely in realtime. If both start_time and end_time are given, then that indicates a temporary playback of historical data."}),"\n",(0,a.jsx)(t.p,{children:"Data returned by the streaming API is handled by the received callback in Javascript. Data is returned as a JSON Array, with a JSON object in the array for each packet returned. Results are batched, and the current implementation will return up to 100 packets in each batch (the array will have 100 entries). 100 packets per batch is not guaranteed, and batches may take on varying sizes based on the size of the data returned, or other factors. An empty array indicates that all data has been sent for a purely historical query and can be used as an end of data indicator."}),"\n",(0,a.jsx)(t.p,{children:"For decommutated items, each packet is represented as a JSON object with a 'time' field holding the COSMOS nanosecond timestamp of the packet, and then each of the requested item keys with their corresponding value from the packet."}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-json",children:'[\n {\n "time": 1234657585858,\n "TLM__INST__ADCS__Q1__RAW": 50.0,\n "TLM__INST__ADCS__Q2__RAW": 100.0\n },\n {\n "time": 1234657585859,\n "TLM__INST__ADCS__Q1__RAW": 60.0,\n "TLM__INST__ADCS__Q2__RAW": 110.0\n }\n]\n'})}),"\n",(0,a.jsx)(t.p,{children:"For raw packets, each packet is represented as a JSON object with a time field holding the COSMOS nanosecond timestamp of the packet, a packet field holding the topic the packet was read from in the form of SCOPE__TELEMETRY__TARGETNAME__PACKETNAME, and a buffer field holding a BASE64 encoded copy of the packet data."}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-json",children:'[\n {\n "time": 1234657585858,\n "packet": "DEFAULT__TELEMETRY__INST__ADCS",\n "buffer": "SkdfjGodkdfjdfoekfsg"\n },\n {\n "time": 1234657585859,\n "packet": "DEFAULT__TELEMETRY__INST__ADCS",\n "buffer": "3i5n49dmnfg9fl32k3"\n }\n]\n'})})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(l,{...e})}):l(e)}},1184:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>r});var a=n(4041);const i={},s=a.createContext(i);function o(e){const t=a.useContext(s);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),a.createElement(s.Provider,{value:t},e.children)}}}]);
@@ -0,0 +1 @@
1
+ "use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([[3135],{3465:(e,a,s)=>{s.r(a),s.d(a,{default:()=>x});s(4041);var t=s(4357),d=s(145),c=s(7473),l=s(2665),r=s(9729),i=s(7703),n=s(1650),o=s(3412);const m={mdxPageWrapper:"mdxPageWrapper_SLvB"};var p=s(1085);function x(e){const{content:a}=e,{metadata:s,assets:x}=a,{title:g,editUrl:h,description:_,frontMatter:j,lastUpdatedBy:v,lastUpdatedAt:A}=s,{keywords:u,wrapperClassName:w,hide_table_of_contents:f}=j,N=x.image??j.image,k=!!(h||A||v);return(0,p.jsx)(d.e3,{className:(0,t.A)(w??c.G.wrapper.mdxPages,c.G.page.mdxPage),children:(0,p.jsxs)(l.A,{children:[(0,p.jsx)(d.be,{title:g,description:_,keywords:u,image:N}),(0,p.jsx)("main",{className:"container container--fluid margin-vert--lg",children:(0,p.jsxs)("div",{className:(0,t.A)("row",m.mdxPageWrapper),children:[(0,p.jsxs)("div",{className:(0,t.A)("col",!f&&"col--8"),children:[(0,p.jsx)(n.A,{metadata:s}),(0,p.jsx)("article",{children:(0,p.jsx)(r.A,{children:(0,p.jsx)(a,{})})}),k&&(0,p.jsx)(o.A,{className:(0,t.A)("margin-top--sm",c.G.pages.pageFooterEditMetaRow),editUrl:h,lastUpdatedAt:A,lastUpdatedBy:v})]}),!f&&a.toc.length>0&&(0,p.jsx)("div",{className:"col col--2",children:(0,p.jsx)(i.A,{toc:a.toc,minHeadingLevel:j.toc_min_heading_level,maxHeadingLevel:j.toc_max_heading_level})})]})})]})})}}}]);
@@ -0,0 +1 @@
1
+ "use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([[864],{7975:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>o,frontMatter:()=>s,metadata:()=>d,toc:()=>h});var r=i(1085),t=i(1184);const s={sidebar_position:8,title:"Tables"},l=void 0,d={id:"configuration/table",title:"Tables",description:"Table Definition Files",source:"@site/docs/configuration/table.md",sourceDirName:"configuration",slug:"/configuration/table",permalink:"/tools/staticdocs/docs/configuration/table",draft:!1,unlisted:!1,editUrl:"https://github.com/OpenC3/cosmos/tree/main/docs.openc3.com/docs/configuration/table.md",tags:[],version:"current",sidebarPosition:8,frontMatter:{sidebar_position:8,title:"Tables"},sidebar:"defaultSidebar",previous:{title:"Protocols",permalink:"/tools/staticdocs/docs/configuration/protocols"},next:{title:"Screens",permalink:"/tools/staticdocs/docs/configuration/telemetry-screens"}},a={},h=[{value:"Table Definition Files",id:"table-definition-files",level:2},{value:"TABLEFILE",id:"tablefile",level:2},{value:"TABLE",id:"table",level:2},{value:"TABLE Modifiers",id:"table-modifiers",level:2},{value:"PARAMETER",id:"parameter",level:3},{value:"PARAMETER Modifiers",id:"parameter-modifiers",level:3},{value:"FORMAT_STRING",id:"format_string",level:4},{value:"UNITS",id:"units",level:4},{value:"DESCRIPTION",id:"description",level:4},{value:"META",id:"meta",level:4},{value:"OVERLAP",id:"overlap",level:4},{value:"KEY",id:"key",level:4},{value:"VARIABLE_BIT_SIZE",id:"variable_bit_size",level:4},{value:"REQUIRED",id:"required",level:4},{value:"MINIMUM_VALUE",id:"minimum_value",level:4},{value:"MAXIMUM_VALUE",id:"maximum_value",level:4},{value:"DEFAULT_VALUE",id:"default_value",level:4},{value:"STATE",id:"state",level:4},{value:"WRITE_CONVERSION",id:"write_conversion",level:4},{value:"POLY_WRITE_CONVERSION",id:"poly_write_conversion",level:4},{value:"SEG_POLY_WRITE_CONVERSION",id:"seg_poly_write_conversion",level:4},{value:"GENERIC_WRITE_CONVERSION_START",id:"generic_write_conversion_start",level:4},{value:"GENERIC_WRITE_CONVERSION_END",id:"generic_write_conversion_end",level:4},{value:"OVERFLOW",id:"overflow",level:4},{value:"HIDDEN",id:"hidden",level:4},{value:"UNEDITABLE",id:"uneditable",level:4},{value:"APPEND_PARAMETER",id:"append_parameter",level:3},{value:"SELECT_TABLE",id:"select_table",level:2},{value:"DEFAULT",id:"default",level:2},{value:"Example File",id:"example-file",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"table-definition-files",children:"Table Definition Files"}),"\n",(0,r.jsxs)(n.p,{children:["Table definition files define the binary tables that can be displayed in COSMOS ",(0,r.jsx)(n.a,{href:"/tools/staticdocs/docs/tools/table-manager",children:"Table Manager"}),"\n. Table definitions are defined in the target's tables/config directory and are typically named after the table such as ",(0,r.jsx)(n.code,{children:"PPSSelectionTable_def.txt"}),". The ",(0,r.jsx)(n.code,{children:"_def.txt"})," extention helps to identify the file as a table definition. Table definitions can be combined using the ",(0,r.jsx)(n.code,{children:"TABLEFILE"})," keyword. This allows you to build individual table components into a larger binary."]}),"\n",(0,r.jsxs)(n.p,{children:["The Table definition files share a lot of similarity with the ",(0,r.jsx)(n.a,{href:"/tools/staticdocs/docs/configuration/command",children:"Command Configuration"}),". You have the same data types: INT, UINT, FLOAT, STRING, BLOCK. These correspond to integers, unsigned integers, floating point numbers, strings and binary blocks of data."]}),"\n",(0,r.jsx)("div",{style:{clear:"both"}}),"\n",(0,r.jsx)(n.h1,{id:"table-keywords",children:"Table Keywords"}),"\n",(0,r.jsx)(n.h2,{id:"tablefile",children:"TABLEFILE"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Specify another file to open and process for table definitions"})}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Required"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"File Name"}),(0,r.jsx)(n.td,{children:"Name of the file. The file will be looked for in the directory of the current definition file."}),(0,r.jsx)(n.td,{children:"True"})]})})]}),"\n",(0,r.jsx)(n.h2,{id:"table",children:"TABLE"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Start a new table definition"})}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Required"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Name"}),(0,r.jsx)(n.td,{children:"Name of the table in quotes. The name will appear on the GUI tab."}),(0,r.jsx)(n.td,{children:"True"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Endianness"}),(0,r.jsxs)(n.td,{children:["Indicates if the data in this table is in Big Endian or Little Endian format",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"Valid Values: ",(0,r.jsx)("span",{class:"values",children:"BIG_ENDIAN, LITTLE_ENDIAN"})]}),(0,r.jsx)(n.td,{children:"True"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Display"}),(0,r.jsxs)(n.td,{children:["Indicates the table contains KEY_VALUE rows (e.g. each row is unique), or a ROW_COLUMN table with identical rows containing different values.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"Valid Values: ",(0,r.jsx)("span",{class:"values",children:"KEY_VALUE, ROW_COLUMN"})]}),(0,r.jsx)(n.td,{children:"False"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:"When Display is KEY_VALUE the remaining parameters are:"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Required"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Description"}),(0,r.jsx)(n.td,{children:"Description of the table in quotes. The description is used in mouseover popups and status line information."}),(0,r.jsx)(n.td,{children:"False"})]})})]}),"\n",(0,r.jsx)(n.p,{children:"When Display is ROW_COLUMN the remaining parameters are:"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Required"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Rows"}),(0,r.jsx)(n.td,{children:"The number of rows in the table"}),(0,r.jsx)(n.td,{children:"False"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Description"}),(0,r.jsx)(n.td,{children:"Description of the table in quotes. The description is used in mouseover popups and status line information."}),(0,r.jsx)(n.td,{children:"False"})]})]})]}),"\n",(0,r.jsx)(n.h2,{id:"table-modifiers",children:"TABLE Modifiers"}),"\n",(0,r.jsx)(n.p,{children:"The following keywords must follow a TABLE keyword."}),"\n",(0,r.jsx)(n.h3,{id:"parameter",children:"PARAMETER"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Defines a parameter in the current table"})}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Required"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Name"}),(0,r.jsx)(n.td,{children:"Name of the parameter. Must be unique within the table."}),(0,r.jsx)(n.td,{children:"True"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Bit Offset"}),(0,r.jsx)(n.td,{children:"Bit offset into the table of the Most Significant Bit of this parameter. May be negative to indicate on offset from the end of the table. Always use a bit offset of 0 for derived parameters."}),(0,r.jsx)(n.td,{children:"True"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Bit Size"}),(0,r.jsx)(n.td,{children:"Bit size of this parameter. Zero or Negative values may be used to indicate that a string fills the packet up to the offset from the end of the packet specified by this value. If Bit Offset is 0 and Bit Size is 0 then this is a derived parameter and the Data Type must be set to 'DERIVED'."}),(0,r.jsx)(n.td,{children:"True"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Data Type"}),(0,r.jsxs)(n.td,{children:["Data Type of this parameter",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"Valid Values: ",(0,r.jsx)("span",{class:"values",children:"INT, UINT, FLOAT, DERIVED, STRING, BLOCK"})]}),(0,r.jsx)(n.td,{children:"True"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:"When Data Type is INT, UINT, FLOAT, DERIVED the remaining parameters are:"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Required"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Minimum Value"}),(0,r.jsx)(n.td,{children:"Minimum allowed value for this parameter"}),(0,r.jsx)(n.td,{children:"True"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Maximum Value"}),(0,r.jsx)(n.td,{children:"Maximum allowed value for this parameter"}),(0,r.jsx)(n.td,{children:"True"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Default Value"}),(0,r.jsx)(n.td,{children:"Default value for this parameter. You must provide a default but if you mark the parameter REQUIRED then scripts will be forced to specify a value."}),(0,r.jsx)(n.td,{children:"True"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Description"}),(0,r.jsx)(n.td,{children:"Description for this parameter which must be enclosed with quotes"}),(0,r.jsx)(n.td,{children:"False"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Endianness"}),(0,r.jsxs)(n.td,{children:["Indicates if the data in this command is to be sent in Big Endian or Little Endian format. See guide on ",(0,r.jsx)(n.a,{href:"/tools/staticdocs/docs/guides/little-endian-bitfields",children:"Little Endian Bitfields"}),".",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"Valid Values: ",(0,r.jsx)("span",{class:"values",children:"BIG_ENDIAN, LITTLE_ENDIAN"})]}),(0,r.jsx)(n.td,{children:"False"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:"When Data Type is STRING, BLOCK the remaining parameters are:"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Required"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Default Value"}),(0,r.jsx)(n.td,{children:"Default value for this parameter. You must provide a default but if you mark the parameter REQUIRED then scripts will be forced to specify a value."}),(0,r.jsx)(n.td,{children:"True"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Description"}),(0,r.jsx)(n.td,{children:"Description for this parameter which must be enclosed with quotes"}),(0,r.jsx)(n.td,{children:"False"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Endianness"}),(0,r.jsxs)(n.td,{children:["Indicates if the data in this command is to be sent in Big Endian or Little Endian format",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"Valid Values: ",(0,r.jsx)("span",{class:"values",children:"BIG_ENDIAN, LITTLE_ENDIAN"})]}),(0,r.jsx)(n.td,{children:"False"})]})]})]}),"\n",(0,r.jsx)(n.h3,{id:"parameter-modifiers",children:"PARAMETER Modifiers"}),"\n",(0,r.jsx)(n.p,{children:"The following keywords must follow a PARAMETER keyword."}),"\n",(0,r.jsx)(n.h4,{id:"format_string",children:"FORMAT_STRING"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Adds printf style formatting"})}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Required"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Format"}),(0,r.jsx)(n.td,{children:"How to format using printf syntax. For example, '0x%0X' will display the value in hex."}),(0,r.jsx)(n.td,{children:"True"})]})})]}),"\n",(0,r.jsx)(n.p,{children:"Example Usage:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-ruby",children:'FORMAT_STRING "0x%0X"\n'})}),"\n",(0,r.jsx)(n.h4,{id:"units",children:"UNITS"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Add displayed units"})}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Required"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Full Name"}),(0,r.jsx)(n.td,{children:"Full name of the units type, e.g. Celsius"}),(0,r.jsx)(n.td,{children:"True"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Abbreviated"}),(0,r.jsx)(n.td,{children:"Abbreviation for the units, e.g. C"}),(0,r.jsx)(n.td,{children:"True"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:"Example Usage:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-ruby",children:"UNITS Celsius C\nUNITS Kilometers KM\n"})}),"\n",(0,r.jsx)(n.h4,{id:"description",children:"DESCRIPTION"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Override the defined description"})}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Required"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Value"}),(0,r.jsx)(n.td,{children:"The new description"}),(0,r.jsx)(n.td,{children:"True"})]})})]}),"\n",(0,r.jsx)(n.h4,{id:"meta",children:"META"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Stores custom user metadata"})}),"\n",(0,r.jsx)(n.p,{children:"Meta data is user specific data that can be used by custom tools for various purposes. One example is to store additional information needed to generate source code header files."}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Required"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Meta Name"}),(0,r.jsx)(n.td,{children:"Name of the metadata to store"}),(0,r.jsx)(n.td,{children:"True"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Meta Values"}),(0,r.jsx)(n.td,{children:"One or more values to be stored for this Meta Name"}),(0,r.jsx)(n.td,{children:"False"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:"Example Usage:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-ruby",children:'META TEST "This parameter is for test purposes only"\n'})}),"\n",(0,r.jsx)(n.h4,{id:"overlap",children:"OVERLAP"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)("div",{class:"right",children:"(Since 4.4.1)"}),(0,r.jsx)(n.strong,{children:"This item is allowed to overlap other items in the packet"})]}),"\n",(0,r.jsx)(n.p,{children:"If an item's bit offset overlaps another item, OpenC3 issues a warning. This keyword explicitly allows an item to overlap another and supresses the warning message."}),"\n",(0,r.jsx)(n.h4,{id:"key",children:"KEY"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)("div",{class:"right",children:"(Since 5.0.10)"}),(0,r.jsx)(n.strong,{children:"Defines the key used to access this raw value in the packet."})]}),"\n",(0,r.jsx)(n.p,{children:"Keys are often JsonPath or XPath strings"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Required"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Key string"}),(0,r.jsx)(n.td,{children:"The key to access this item"}),(0,r.jsx)(n.td,{children:"True"})]})})]}),"\n",(0,r.jsx)(n.p,{children:"Example Usage:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-ruby",children:"KEY $.book.title\n"})}),"\n",(0,r.jsx)(n.h4,{id:"variable_bit_size",children:"VARIABLE_BIT_SIZE"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)("div",{class:"right",children:"(Since 5.18.0)"}),(0,r.jsx)(n.strong,{children:"Marks an item as having its bit size defined by another length item"})]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Required"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Length Item Name"}),(0,r.jsx)(n.td,{children:"The name of the associated length item"}),(0,r.jsx)(n.td,{children:"True"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Length Bits Per Count"}),(0,r.jsx)(n.td,{children:"Bits per count of the length item. Defaults to 8"}),(0,r.jsx)(n.td,{children:"False"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Length Value Bit Offset"}),(0,r.jsx)(n.td,{children:"Offset in Bits to Apply to Length Field Value. Defaults to 0"}),(0,r.jsx)(n.td,{children:"False"})]})]})]}),"\n",(0,r.jsx)(n.h4,{id:"required",children:"REQUIRED"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Parameter is required to be populated in scripts"})}),"\n",(0,r.jsx)(n.p,{children:"When sending the command via Script Runner a value must always be given for the current command parameter. This prevents the user from relying on a default value. Note that this does not affect Command Sender which will still populate the field with the default value provided in the PARAMETER definition."}),"\n",(0,r.jsx)(n.h4,{id:"minimum_value",children:"MINIMUM_VALUE"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Override the defined minimum value"})}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Required"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Value"}),(0,r.jsx)(n.td,{children:"The new minimum value for the parameter"}),(0,r.jsx)(n.td,{children:"True"})]})})]}),"\n",(0,r.jsx)(n.h4,{id:"maximum_value",children:"MAXIMUM_VALUE"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Override the defined maximum value"})}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Required"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Value"}),(0,r.jsx)(n.td,{children:"The new maximum value for the parameter"}),(0,r.jsx)(n.td,{children:"True"})]})})]}),"\n",(0,r.jsx)(n.h4,{id:"default_value",children:"DEFAULT_VALUE"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Override the defined default value"})}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Required"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Value"}),(0,r.jsx)(n.td,{children:"The new default value for the parameter"}),(0,r.jsx)(n.td,{children:"True"})]})})]}),"\n",(0,r.jsx)(n.h4,{id:"state",children:"STATE"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Defines a key/value pair for the current command parameter"})}),"\n",(0,r.jsx)(n.p,{children:"Key value pairs allow for user friendly strings. For example, you might define states for ON = 1 and OFF = 0. This allows the word ON to be used rather than the number 1 when sending the command parameter and allows for much greater clarity and less chance for user error."}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Required"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Key"}),(0,r.jsx)(n.td,{children:"The string state name"}),(0,r.jsx)(n.td,{children:"True"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Value"}),(0,r.jsx)(n.td,{children:"The numerical state value"}),(0,r.jsx)(n.td,{children:"True"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Hazardous / Disable Messages"}),(0,r.jsxs)(n.td,{children:["Indicates the state is hazardous. This will cause a popup to ask for user confirmation when sending this command. For non-hazardous states you can also set DISABLE_MESSAGES which will not print the command when using that state.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"Valid Values: ",(0,r.jsx)("span",{class:"values",children:"HAZARDOUS"})]}),(0,r.jsx)(n.td,{children:"False"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Hazardous Description"}),(0,r.jsx)(n.td,{children:"String describing why this state is hazardous"}),(0,r.jsx)(n.td,{children:"False"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:"Example Usage:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-ruby",children:'APPEND_PARAMETER ENABLE 32 UINT 0 1 0 "Enable setting"\n STATE FALSE 0\n STATE TRUE 1\nAPPEND_PARAMETER STRING 1024 STRING "NOOP" "String parameter"\n STATE "NOOP" "NOOP" DISABLE_MESSAGES\n STATE "ARM LASER" "ARM LASER" HAZARDOUS "Arming the laser is an eye safety hazard"\n STATE "FIRE LASER" "FIRE LASER" HAZARDOUS "WARNING! Laser will be fired!"\n'})}),"\n",(0,r.jsx)(n.h4,{id:"write_conversion",children:"WRITE_CONVERSION"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Applies a conversion when writing the current command parameter"})}),"\n",(0,r.jsxs)(n.p,{children:["Conversions are implemented in a custom Ruby or Python file which should be\nlocated in the target's lib folder. The class must inherit from Conversion.\nIt must implement the ",(0,r.jsx)(n.code,{children:"initialize"})," (Ruby) or ",(0,r.jsx)(n.code,{children:"__init__"})," (Python) method if it\ntakes extra parameters and must always implement the ",(0,r.jsx)(n.code,{children:"call"})," method. The conversion\nfactor is applied to the value entered by the user before it is written into\nthe binary command packet and sent."]}),"\n",(0,r.jsx)(n.admonition,{title:"Multiple write conversions on command parameters",type:"info",children:(0,r.jsx)(n.p,{children:"When a command is built, each item gets written (and write conversions are run)\nto set the default value. Then items are written (again write conversions are run)\nwith user provided values. Thus write conversions can be run twice. Also there are\nno guarantees which parameters have already been written. The packet itself has a\ngiven_values() method which can be used to retrieve a hash of the user provided\nvalues to the command. That can be used to check parameter values passed in."})}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Required"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Class Filename"}),(0,r.jsx)(n.td,{children:"The filename which contains the Ruby or Python class. The filename must be named after the class such that the class is a CamelCase version of the underscored filename. For example, 'the_great_conversion.rb' should contain 'class TheGreatConversion'."}),(0,r.jsx)(n.td,{children:"True"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Parameter"}),(0,r.jsx)(n.td,{children:"Additional parameter values for the conversion which are passed to the class constructor."}),(0,r.jsx)(n.td,{children:"False"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:"Ruby Example:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-ruby",children:"WRITE_CONVERSION the_great_conversion.rb 1000\n\nDefined in the_great_conversion.rb:\n\nrequire 'openc3/conversions/conversion'\nmodule OpenC3\n class TheGreatConversion < Conversion\n def initialize(multiplier)\n super()\n @multiplier = multiplier.to_f\n end\n def call(value, packet, buffer)\n return value * multiplier\n end\n end\nend\n"})}),"\n",(0,r.jsx)(n.p,{children:"Python Example:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-python",children:"WRITE_CONVERSION the_great_conversion.py 1000\n\nDefined in the_great_conversion.py:\n\nfrom openc3.conversions.conversion import Conversion\nclass TheGreatConversion(Conversion):\n def __init__(self, multiplier):\n super().__init__()\n self.multiplier = float(multiplier)\n def call(self, value, packet, buffer):\n return value * multiplier\n"})}),"\n",(0,r.jsx)(n.h4,{id:"poly_write_conversion",children:"POLY_WRITE_CONVERSION"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Adds a polynomial conversion factor to the current command parameter"})}),"\n",(0,r.jsx)(n.p,{children:"The conversion factor is applied to the value entered by the user before it is written into the binary command packet and sent."}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Required"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"C0"}),(0,r.jsx)(n.td,{children:"Coefficient"}),(0,r.jsx)(n.td,{children:"True"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Cx"}),(0,r.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,r.jsx)(n.td,{children:"False"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:"Example Usage:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-ruby",children:"POLY_WRITE_CONVERSION 10 0.5 0.25\n"})}),"\n",(0,r.jsx)(n.h4,{id:"seg_poly_write_conversion",children:"SEG_POLY_WRITE_CONVERSION"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Adds a segmented polynomial conversion factor to the current command parameter"})}),"\n",(0,r.jsx)(n.p,{children:"This conversion factor is applied to the value entered by the user before it is written into the binary command packet and sent."}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Required"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Lower Bound"}),(0,r.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,r.jsx)(n.td,{children:"True"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"C0"}),(0,r.jsx)(n.td,{children:"Coefficient"}),(0,r.jsx)(n.td,{children:"True"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Cx"}),(0,r.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,r.jsx)(n.td,{children:"False"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:"Example Usage:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-ruby",children:"SEG_POLY_WRITE_CONVERSION 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,r.jsx)(n.h4,{id:"generic_write_conversion_start",children:"GENERIC_WRITE_CONVERSION_START"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Start a generic write conversion"})}),"\n",(0,r.jsx)(n.p,{children:"Adds a generic conversion function to the current command parameter.\nThis conversion factor is applied to the value entered by the user before it\nis written into the binary command packet and sent. The conversion is specified\nas Ruby or Python code that receives two implied parameters. 'value' which is the raw\nvalue being written and 'packet' which is a reference to the command packet\nclass (Note, referencing the packet as 'myself' is still supported for backwards\ncompatibility). The last line of code should return the converted\nvalue. The GENERIC_WRITE_CONVERSION_END keyword specifies that all lines of\ncode for the conversion have been given."}),"\n",(0,r.jsx)(n.admonition,{title:"Multiple write conversions on command parameters",type:"info",children:(0,r.jsx)(n.p,{children:"When a command is built, each item gets written (and write conversions are run)\nto set the default value. Then items are written (again write conversions are run)\nwith user provided values. Thus write conversions can be run twice. Also there are\nno guarantees which parameters have already been written. The packet itself has a\ngiven_values() method which can be used to retrieve a hash of the user provided\nvalues to the command. That can be used to check parameter values passed in."})}),"\n",(0,r.jsx)(n.admonition,{type:"warning",children:(0,r.jsx)(n.p,{children:"Generic conversions are not a good long term solution. Consider creating a conversion class and using WRITE_CONVERSION instead. WRITE_CONVERSION is easier to debug and higher performance."})}),"\n",(0,r.jsx)(n.p,{children:"Ruby Example:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-ruby",children:"APPEND_PARAMETER ITEM1 32 UINT 0 0xFFFFFFFF 0\n GENERIC_WRITE_CONVERSION_START\n return (value * 1.5).to_i # Convert the value by a scale factor\n GENERIC_WRITE_CONVERSION_END\n"})}),"\n",(0,r.jsx)(n.p,{children:"Python Example:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-python",children:"APPEND_PARAMETER ITEM1 32 UINT 0 0xFFFFFFFF 0\n GENERIC_WRITE_CONVERSION_START\n return int(value * 1.5) # Convert the value by a scale factor\n GENERIC_WRITE_CONVERSION_END\n"})}),"\n",(0,r.jsx)(n.h4,{id:"generic_write_conversion_end",children:"GENERIC_WRITE_CONVERSION_END"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Complete a generic write conversion"})}),"\n",(0,r.jsx)(n.h4,{id:"overflow",children:"OVERFLOW"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Set the behavior when writing a value overflows the type"})}),"\n",(0,r.jsx)(n.p,{children:"By default OpenC3 throws an error if you try to write a value which overflows its specified type, e.g. writing 255 to a 8 bit signed value. Setting the overflow behavior also allows for OpenC3 to 'TRUNCATE' the value by eliminating any high order bits. You can also set 'SATURATE' which causes OpenC3 to replace the value with the maximum or minimum allowable value for that type. Finally you can specify 'ERROR_ALLOW_HEX' which will allow for a maximum hex value to be writen, e.g. you can successfully write 255 to a 8 bit signed value."}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Required"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Behavior"}),(0,r.jsxs)(n.td,{children:["How OpenC3 treats an overflow value. Only applies to signed and unsigned integer data types.",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"Valid Values: ",(0,r.jsx)("span",{class:"values",children:"ERROR, ERROR_ALLOW_HEX, TRUNCATE, SATURATE"})]}),(0,r.jsx)(n.td,{children:"True"})]})})]}),"\n",(0,r.jsx)(n.p,{children:"Example Usage:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-ruby",children:"OVERFLOW TRUNCATE\n"})}),"\n",(0,r.jsx)(n.h4,{id:"hidden",children:"HIDDEN"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Indicates that the parameter should not be shown to the user in the Table Manager GUI"})}),"\n",(0,r.jsx)(n.p,{children:"Hidden parameters still exist and will be saved to the resulting binary. This is useful for padding and other essential but non-user editable fields."}),"\n",(0,r.jsx)(n.h4,{id:"uneditable",children:"UNEDITABLE"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Indicates that the parameter should be shown to the user but not editable."})}),"\n",(0,r.jsx)(n.p,{children:"Uneditable parameters are useful for control fields which the user may be interested in but should not be able to edit."}),"\n",(0,r.jsx)(n.h3,{id:"append_parameter",children:"APPEND_PARAMETER"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Defines a parameter in the current table"})}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Required"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Name"}),(0,r.jsx)(n.td,{children:"Name of the parameter. Must be unique within the table."}),(0,r.jsx)(n.td,{children:"True"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Bit Size"}),(0,r.jsx)(n.td,{children:"Bit size of this parameter. Zero or Negative values may be used to indicate that a string fills the packet up to the offset from the end of the packet specified by this value. If Bit Offset is 0 and Bit Size is 0 then this is a derived parameter and the Data Type must be set to 'DERIVED'."}),(0,r.jsx)(n.td,{children:"True"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Data Type"}),(0,r.jsxs)(n.td,{children:["Data Type of this parameter",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"Valid Values: ",(0,r.jsx)("span",{class:"values",children:"INT, UINT, FLOAT, DERIVED, STRING, BLOCK"})]}),(0,r.jsx)(n.td,{children:"True"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:"When Data Type is INT, UINT, FLOAT, DERIVED the remaining parameters are:"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Required"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Minimum Value"}),(0,r.jsx)(n.td,{children:"Minimum allowed value for this parameter"}),(0,r.jsx)(n.td,{children:"True"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Maximum Value"}),(0,r.jsx)(n.td,{children:"Maximum allowed value for this parameter"}),(0,r.jsx)(n.td,{children:"True"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Default Value"}),(0,r.jsx)(n.td,{children:"Default value for this parameter. You must provide a default but if you mark the parameter REQUIRED then scripts will be forced to specify a value."}),(0,r.jsx)(n.td,{children:"True"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Description"}),(0,r.jsx)(n.td,{children:"Description for this parameter which must be enclosed with quotes"}),(0,r.jsx)(n.td,{children:"False"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Endianness"}),(0,r.jsxs)(n.td,{children:["Indicates if the data in this command is to be sent in Big Endian or Little Endian format. See guide on ",(0,r.jsx)(n.a,{href:"/tools/staticdocs/docs/guides/little-endian-bitfields",children:"Little Endian Bitfields"}),".",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"Valid Values: ",(0,r.jsx)("span",{class:"values",children:"BIG_ENDIAN, LITTLE_ENDIAN"})]}),(0,r.jsx)(n.td,{children:"False"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:"When Data Type is STRING, BLOCK the remaining parameters are:"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Required"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Default Value"}),(0,r.jsx)(n.td,{children:"Default value for this parameter. You must provide a default but if you mark the parameter REQUIRED then scripts will be forced to specify a value."}),(0,r.jsx)(n.td,{children:"True"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Description"}),(0,r.jsx)(n.td,{children:"Description for this parameter which must be enclosed with quotes"}),(0,r.jsx)(n.td,{children:"False"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Endianness"}),(0,r.jsxs)(n.td,{children:["Indicates if the data in this command is to be sent in Big Endian or Little Endian format",(0,r.jsx)("br",{}),(0,r.jsx)("br",{}),"Valid Values: ",(0,r.jsx)("span",{class:"values",children:"BIG_ENDIAN, LITTLE_ENDIAN"})]}),(0,r.jsx)(n.td,{children:"False"})]})]})]}),"\n",(0,r.jsx)(n.h2,{id:"select_table",children:"SELECT_TABLE"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Select an existing table for editing, typically done to override an existing definition"})}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Required"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Table"}),(0,r.jsx)(n.td,{children:"The name of the existin table"}),(0,r.jsx)(n.td,{children:"True"})]})})]}),"\n",(0,r.jsx)(n.h2,{id:"default",children:"DEFAULT"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Specify default values for a SINGLE row in a multi-column table"})}),"\n",(0,r.jsx)(n.p,{children:"If you have multiple rows you need a DEFAULT line for each row. If all your rows are identical consider using ERB as shown in the OpenC3 demo."}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Parameter"}),(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"Required"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Default values"}),(0,r.jsx)(n.td,{children:"A STATE value or data value corresponding to the data type"}),(0,r.jsx)(n.td,{children:"False"})]})})]}),"\n",(0,r.jsx)(n.h2,{id:"example-file",children:"Example File"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"Example File: TARGET/tables/config/MCConfigurationTable_def.txt"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-ruby",children:'TABLE "MC_Configuration" BIG_ENDIAN KEY_VALUE "Memory Control Configuration Table"\n APPEND_PARAMETER "Scrub_Region_1_Start_Addr" 32 UINT 0 0x03FFFFFB 0\n FORMAT_STRING "0x%0X"\n APPEND_PARAMETER "Scrub_Region_1_End_Addr" 32 UINT 0 0x03FFFFFF 0x03FFFFFF\n FORMAT_STRING "0x%0X"\n APPEND_PARAMETER "Scrub_Region_2_Start_Addr" 32 UINT 0 0x03FFFFB 0\n FORMAT_STRING "0x%0X"\n APPEND_PARAMETER "Scrub_Region_2_End_Addr" 32 UINT 0 0x03FFFFF 0x03FFFFF\n FORMAT_STRING "0x%0X"\n APPEND_PARAMETER "Dump_Packet_Throttle_(sec)" 32 UINT 0 0x0FFFFFFFF 2 "Number of seconds to wait between dumping large packets"\n APPEND_PARAMETER "Memory_Scrubbing" 8 UINT 0 1 1\n STATE DISABLE 0\n STATE ENABLE 1\n APPEND_PARAMETER "SIOC_Memory_Config" 8 UINT 1 3 3\n APPEND_PARAMETER "Uneditable_Text" 32 UINT MIN MAX 0xDEADBEEF "Uneditable field"\n FORMAT_STRING "0x%0X"\n UNEDITABLE\n APPEND_PARAMETER "Uneditable_State" 16 UINT MIN MAX 0 "Uneditable field"\n STATE DISABLE 0\n STATE ENABLE 1\n UNEDITABLE\n APPEND_PARAMETER "Uneditable_Check" 16 UINT MIN MAX 1 "Uneditable field"\n STATE UNCHECKED 0\n STATE CHECKED 1\n UNEDITABLE\n APPEND_PARAMETER "Binary" 32 STRING 0xDEADBEEF "Binary string"\n APPEND_PARAMETER "Pad" 16 UINT 0 0 0\n HIDDEN\n'})})]})}function o(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},1184:(e,n,i)=>{i.d(n,{R:()=>l,x:()=>d});var r=i(4041);const t={},s=r.createContext(t);function l(e){const n=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:l(e.components),r.createElement(s.Provider,{value:n},e.children)}}}]);