Latest commit

History

18 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Human Digital Control Station [HDCS]

HDCS is a command, control, and instrumentation interface.

Designed initially for use with testing small hybrid rockets, it can be expanded or reduced to fit the needs of many other instrumentation and control applications.

Check out the video demo at this link!

Demo Video

To run, clone the git repository on your local machine, then in a command line :

python __HDCS__.py

You may find you are missing the dependencies:

  • Python 3.6.2+
  • PyQt5
    • pyqtgraph
    • numpy
  • Installed fonts found in /fonts folder

Architecture

This code is intimately intertwined with a number of other systems, chief of which is ADCS. The ADCS code can be found here.

Ultimately, the micro-controllers (far right of diagram) take the majority of the data in, and actuate the commands.

Note: One can definitely separate each module of HDCS from the ADCS / Micro grand scheme. Modules each continue to be written to be as portable as possible.

UI Design & Automatic Refactoring Features

The (Qt Creator) program is used to add features to the GUI, and also to signal to the program which variables should be shown on screen - in "displays" - and which should not.

A key finding in the creation of HDCS is that updating Qt Stylesheets to reflect the state of a variable (in limits, or out of limits), is seriously too slow for the scale of QLabels on-screen. Because of this, we refactor the GUI on each startup.

UI refactoring refers to the conversion of all the QLabels which are automatically identified as "color-able" (see definitions below), into highly efficientQGraphicsItems.

In addition to the performance improvements, this also allows us to drag and drop any displays as we wish.


Creation of a new instrumentation variable into the interface

  1. Open the MainWindow GUI file (mainwindow.ui) found in the "design_files" folder. Note that this is a Qt Creator / Qt Designer file, so get that program first to edit it.

  2. Add the new display window as a QLabel object

  3. Change the ObjectName to exactly the same as the "key" it will have in the state variable dictionary, for example: 'countdown_time'

  4. Pick which display style you would like to have

    • Color-State Display "csd" (color text to reflect if in or out of limits)

      • csd0 : do not display numeric state in text
      • csd1 : display numeric state in text
    • Background-color-State Display "bsd" (color background to reflect if in or out of limits)

      • bsd0 : do not display numeric state in text
      • bsd1 : display numeric state in text
  5. Save the file and convert to .py with the Qt -> PyQt utility (see .bat files in design_files folder)

  6. Add the instrumentation variable to Definitions.State as a new key, value pair in the dictionary.

  7. Add the instrumentation's safe limits in State_Limits if needed

  8. Add the key to the Definitions.Control_Keys variable (if the key is not instrumentation)

About

Human Digital Control Station [HDCS] - Rocket Test Software

Resources

Stars

46 stars

Watchers

8 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

18 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Human Digital Control Station [HDCS]

HDCS is a command, control, and instrumentation interface.

Designed initially for use with testing small hybrid rockets, it can be expanded or reduced to fit the needs of many other instrumentation and control applications.

Check out the video demo at this link!

Demo Video

To run, clone the git repository on your local machine, then in a command line :

python __HDCS__.py

You may find you are missing the dependencies:

  • Python 3.6.2+
  • PyQt5
    • pyqtgraph
    • numpy
  • Installed fonts found in /fonts folder

Architecture

This code is intimately intertwined with a number of other systems, chief of which is ADCS. The ADCS code can be found here.

Ultimately, the micro-controllers (far right of diagram) take the majority of the data in, and actuate the commands.

Note: One can definitely separate each module of HDCS from the ADCS / Micro grand scheme. Modules each continue to be written to be as portable as possible.

UI Design & Automatic Refactoring Features

The (Qt Creator) program is used to add features to the GUI, and also to signal to the program which variables should be shown on screen - in "displays" - and which should not.

A key finding in the creation of HDCS is that updating Qt Stylesheets to reflect the state of a variable (in limits, or out of limits), is seriously too slow for the scale of QLabels on-screen. Because of this, we refactor the GUI on each startup.

UI refactoring refers to the conversion of all the QLabels which are automatically identified as "color-able" (see definitions below), into highly efficientQGraphicsItems.

In addition to the performance improvements, this also allows us to drag and drop any displays as we wish.


Creation of a new instrumentation variable into the interface

  1. Open the MainWindow GUI file (mainwindow.ui) found in the "design_files" folder. Note that this is a Qt Creator / Qt Designer file, so get that program first to edit it.

  2. Add the new display window as a QLabel object

  3. Change the ObjectName to exactly the same as the "key" it will have in the state variable dictionary, for example: 'countdown_time'

  4. Pick which display style you would like to have

    • Color-State Display "csd" (color text to reflect if in or out of limits)

      • csd0 : do not display numeric state in text
      • csd1 : display numeric state in text
    • Background-color-State Display "bsd" (color background to reflect if in or out of limits)

      • bsd0 : do not display numeric state in text
      • bsd1 : display numeric state in text
  5. Save the file and convert to .py with the Qt -> PyQt utility (see .bat files in design_files folder)

  6. Add the instrumentation variable to Definitions.State as a new key, value pair in the dictionary.

  7. Add the instrumentation's safe limits in State_Limits if needed

  8. Add the key to the Definitions.Control_Keys variable (if the key is not instrumentation)

About

Human Digital Control Station [HDCS] - Rocket Test Software

Resources

Stars

46 stars

Watchers

8 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

18 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Human Digital Control Station [HDCS]

HDCS is a command, control, and instrumentation interface.

Designed initially for use with testing small hybrid rockets, it can be expanded or reduced to fit the needs of many other instrumentation and control applications.

Check out the video demo at this link!

Demo Video

To run, clone the git repository on your local machine, then in a command line :

python __HDCS__.py

You may find you are missing the dependencies:

  • Python 3.6.2+
  • PyQt5
    • pyqtgraph
    • numpy
  • Installed fonts found in /fonts folder

Architecture

This code is intimately intertwined with a number of other systems, chief of which is ADCS. The ADCS code can be found here.

Ultimately, the micro-controllers (far right of diagram) take the majority of the data in, and actuate the commands.

Note: One can definitely separate each module of HDCS from the ADCS / Micro grand scheme. Modules each continue to be written to be as portable as possible.

UI Design & Automatic Refactoring Features

The (Qt Creator) program is used to add features to the GUI, and also to signal to the program which variables should be shown on screen - in "displays" - and which should not.

A key finding in the creation of HDCS is that updating Qt Stylesheets to reflect the state of a variable (in limits, or out of limits), is seriously too slow for the scale of QLabels on-screen. Because of this, we refactor the GUI on each startup.

UI refactoring refers to the conversion of all the QLabels which are automatically identified as "color-able" (see definitions below), into highly efficientQGraphicsItems.

In addition to the performance improvements, this also allows us to drag and drop any displays as we wish.


Creation of a new instrumentation variable into the interface

  1. Open the MainWindow GUI file (mainwindow.ui) found in the "design_files" folder. Note that this is a Qt Creator / Qt Designer file, so get that program first to edit it.

  2. Add the new display window as a QLabel object

  3. Change the ObjectName to exactly the same as the "key" it will have in the state variable dictionary, for example: 'countdown_time'

  4. Pick which display style you would like to have

    • Color-State Display "csd" (color text to reflect if in or out of limits)

      • csd0 : do not display numeric state in text
      • csd1 : display numeric state in text
    • Background-color-State Display "bsd" (color background to reflect if in or out of limits)

      • bsd0 : do not display numeric state in text
      • bsd1 : display numeric state in text
  5. Save the file and convert to .py with the Qt -> PyQt utility (see .bat files in design_files folder)

  6. Add the instrumentation variable to Definitions.State as a new key, value pair in the dictionary.

  7. Add the instrumentation's safe limits in State_Limits if needed

  8. Add the key to the Definitions.Control_Keys variable (if the key is not instrumentation)

About

Human Digital Control Station [HDCS] - Rocket Test Software

Resources

Stars

46 stars

Watchers

8 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

18 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Human Digital Control Station [HDCS]

HDCS is a command, control, and instrumentation interface.

Designed initially for use with testing small hybrid rockets, it can be expanded or reduced to fit the needs of many other instrumentation and control applications.

Check out the video demo at this link!

Demo Video

To run, clone the git repository on your local machine, then in a command line :

python __HDCS__.py

You may find you are missing the dependencies:

  • Python 3.6.2+
  • PyQt5
    • pyqtgraph
    • numpy
  • Installed fonts found in /fonts folder

Architecture

This code is intimately intertwined with a number of other systems, chief of which is ADCS. The ADCS code can be found here.

Ultimately, the micro-controllers (far right of diagram) take the majority of the data in, and actuate the commands.

Note: One can definitely separate each module of HDCS from the ADCS / Micro grand scheme. Modules each continue to be written to be as portable as possible.

UI Design & Automatic Refactoring Features

The (Qt Creator) program is used to add features to the GUI, and also to signal to the program which variables should be shown on screen - in "displays" - and which should not.

A key finding in the creation of HDCS is that updating Qt Stylesheets to reflect the state of a variable (in limits, or out of limits), is seriously too slow for the scale of QLabels on-screen. Because of this, we refactor the GUI on each startup.

UI refactoring refers to the conversion of all the QLabels which are automatically identified as "color-able" (see definitions below), into highly efficientQGraphicsItems.

In addition to the performance improvements, this also allows us to drag and drop any displays as we wish.


Creation of a new instrumentation variable into the interface

  1. Open the MainWindow GUI file (mainwindow.ui) found in the "design_files" folder. Note that this is a Qt Creator / Qt Designer file, so get that program first to edit it.

  2. Add the new display window as a QLabel object

  3. Change the ObjectName to exactly the same as the "key" it will have in the state variable dictionary, for example: 'countdown_time'

  4. Pick which display style you would like to have

    • Color-State Display "csd" (color text to reflect if in or out of limits)

      • csd0 : do not display numeric state in text
      • csd1 : display numeric state in text
    • Background-color-State Display "bsd" (color background to reflect if in or out of limits)

      • bsd0 : do not display numeric state in text
      • bsd1 : display numeric state in text
  5. Save the file and convert to .py with the Qt -> PyQt utility (see .bat files in design_files folder)

  6. Add the instrumentation variable to Definitions.State as a new key, value pair in the dictionary.

  7. Add the instrumentation's safe limits in State_Limits if needed

  8. Add the key to the Definitions.Control_Keys variable (if the key is not instrumentation)

About

Human Digital Control Station [HDCS] - Rocket Test Software

Resources

Stars

46 stars

Watchers

8 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

18 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Human Digital Control Station [HDCS]

HDCS is a command, control, and instrumentation interface.

Designed initially for use with testing small hybrid rockets, it can be expanded or reduced to fit the needs of many other instrumentation and control applications.

Check out the video demo at this link!

Demo Video

To run, clone the git repository on your local machine, then in a command line :

python __HDCS__.py

You may find you are missing the dependencies:

  • Python 3.6.2+
  • PyQt5
    • pyqtgraph
    • numpy
  • Installed fonts found in /fonts folder

Architecture

This code is intimately intertwined with a number of other systems, chief of which is ADCS. The ADCS code can be found here.

Ultimately, the micro-controllers (far right of diagram) take the majority of the data in, and actuate the commands.

Note: One can definitely separate each module of HDCS from the ADCS / Micro grand scheme. Modules each continue to be written to be as portable as possible.

UI Design & Automatic Refactoring Features

The (Qt Creator) program is used to add features to the GUI, and also to signal to the program which variables should be shown on screen - in "displays" - and which should not.

A key finding in the creation of HDCS is that updating Qt Stylesheets to reflect the state of a variable (in limits, or out of limits), is seriously too slow for the scale of QLabels on-screen. Because of this, we refactor the GUI on each startup.

UI refactoring refers to the conversion of all the QLabels which are automatically identified as "color-able" (see definitions below), into highly efficientQGraphicsItems.

In addition to the performance improvements, this also allows us to drag and drop any displays as we wish.


Creation of a new instrumentation variable into the interface

  1. Open the MainWindow GUI file (mainwindow.ui) found in the "design_files" folder. Note that this is a Qt Creator / Qt Designer file, so get that program first to edit it.

  2. Add the new display window as a QLabel object

  3. Change the ObjectName to exactly the same as the "key" it will have in the state variable dictionary, for example: 'countdown_time'

  4. Pick which display style you would like to have

    • Color-State Display "csd" (color text to reflect if in or out of limits)

      • csd0 : do not display numeric state in text
      • csd1 : display numeric state in text
    • Background-color-State Display "bsd" (color background to reflect if in or out of limits)

      • bsd0 : do not display numeric state in text
      • bsd1 : display numeric state in text
  5. Save the file and convert to .py with the Qt -> PyQt utility (see .bat files in design_files folder)

  6. Add the instrumentation variable to Definitions.State as a new key, value pair in the dictionary.

  7. Add the instrumentation's safe limits in State_Limits if needed

  8. Add the key to the Definitions.Control_Keys variable (if the key is not instrumentation)

About

Human Digital Control Station [HDCS] - Rocket Test Software

Resources

Stars

46 stars

Watchers

8 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

18 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Human Digital Control Station [HDCS]

HDCS is a command, control, and instrumentation interface.

Designed initially for use with testing small hybrid rockets, it can be expanded or reduced to fit the needs of many other instrumentation and control applications.

Check out the video demo at this link!

Demo Video

To run, clone the git repository on your local machine, then in a command line :

python __HDCS__.py

You may find you are missing the dependencies:

  • Python 3.6.2+
  • PyQt5
    • pyqtgraph
    • numpy
  • Installed fonts found in /fonts folder

Architecture

This code is intimately intertwined with a number of other systems, chief of which is ADCS. The ADCS code can be found here.

Ultimately, the micro-controllers (far right of diagram) take the majority of the data in, and actuate the commands.

Note: One can definitely separate each module of HDCS from the ADCS / Micro grand scheme. Modules each continue to be written to be as portable as possible.

UI Design & Automatic Refactoring Features

The (Qt Creator) program is used to add features to the GUI, and also to signal to the program which variables should be shown on screen - in "displays" - and which should not.

A key finding in the creation of HDCS is that updating Qt Stylesheets to reflect the state of a variable (in limits, or out of limits), is seriously too slow for the scale of QLabels on-screen. Because of this, we refactor the GUI on each startup.

UI refactoring refers to the conversion of all the QLabels which are automatically identified as "color-able" (see definitions below), into highly efficientQGraphicsItems.

In addition to the performance improvements, this also allows us to drag and drop any displays as we wish.


Creation of a new instrumentation variable into the interface

  1. Open the MainWindow GUI file (mainwindow.ui) found in the "design_files" folder. Note that this is a Qt Creator / Qt Designer file, so get that program first to edit it.

  2. Add the new display window as a QLabel object

  3. Change the ObjectName to exactly the same as the "key" it will have in the state variable dictionary, for example: 'countdown_time'

  4. Pick which display style you would like to have

    • Color-State Display "csd" (color text to reflect if in or out of limits)

      • csd0 : do not display numeric state in text
      • csd1 : display numeric state in text
    • Background-color-State Display "bsd" (color background to reflect if in or out of limits)

      • bsd0 : do not display numeric state in text
      • bsd1 : display numeric state in text
  5. Save the file and convert to .py with the Qt -> PyQt utility (see .bat files in design_files folder)

  6. Add the instrumentation variable to Definitions.State as a new key, value pair in the dictionary.

  7. Add the instrumentation's safe limits in State_Limits if needed

  8. Add the key to the Definitions.Control_Keys variable (if the key is not instrumentation)

About

Human Digital Control Station [HDCS] - Rocket Test Software

Resources

Stars

46 stars

Watchers

8 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

18 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Human Digital Control Station [HDCS]

HDCS is a command, control, and instrumentation interface.

Designed initially for use with testing small hybrid rockets, it can be expanded or reduced to fit the needs of many other instrumentation and control applications.

Check out the video demo at this link!

Demo Video

To run, clone the git repository on your local machine, then in a command line :

python __HDCS__.py

You may find you are missing the dependencies:

  • Python 3.6.2+
  • PyQt5
    • pyqtgraph
    • numpy
  • Installed fonts found in /fonts folder

Architecture

This code is intimately intertwined with a number of other systems, chief of which is ADCS. The ADCS code can be found here.

Ultimately, the micro-controllers (far right of diagram) take the majority of the data in, and actuate the commands.

Note: One can definitely separate each module of HDCS from the ADCS / Micro grand scheme. Modules each continue to be written to be as portable as possible.

UI Design & Automatic Refactoring Features

The (Qt Creator) program is used to add features to the GUI, and also to signal to the program which variables should be shown on screen - in "displays" - and which should not.

A key finding in the creation of HDCS is that updating Qt Stylesheets to reflect the state of a variable (in limits, or out of limits), is seriously too slow for the scale of QLabels on-screen. Because of this, we refactor the GUI on each startup.

UI refactoring refers to the conversion of all the QLabels which are automatically identified as "color-able" (see definitions below), into highly efficientQGraphicsItems.

In addition to the performance improvements, this also allows us to drag and drop any displays as we wish.


Creation of a new instrumentation variable into the interface

  1. Open the MainWindow GUI file (mainwindow.ui) found in the "design_files" folder. Note that this is a Qt Creator / Qt Designer file, so get that program first to edit it.

  2. Add the new display window as a QLabel object

  3. Change the ObjectName to exactly the same as the "key" it will have in the state variable dictionary, for example: 'countdown_time'

  4. Pick which display style you would like to have

    • Color-State Display "csd" (color text to reflect if in or out of limits)

      • csd0 : do not display numeric state in text
      • csd1 : display numeric state in text
    • Background-color-State Display "bsd" (color background to reflect if in or out of limits)

      • bsd0 : do not display numeric state in text
      • bsd1 : display numeric state in text
  5. Save the file and convert to .py with the Qt -> PyQt utility (see .bat files in design_files folder)

  6. Add the instrumentation variable to Definitions.State as a new key, value pair in the dictionary.

  7. Add the instrumentation's safe limits in State_Limits if needed

  8. Add the key to the Definitions.Control_Keys variable (if the key is not instrumentation)

About

Human Digital Control Station [HDCS] - Rocket Test Software

Resources

Stars

46 stars

Watchers

8 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

18 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Human Digital Control Station [HDCS]

HDCS is a command, control, and instrumentation interface.

Designed initially for use with testing small hybrid rockets, it can be expanded or reduced to fit the needs of many other instrumentation and control applications.

Check out the video demo at this link!

Demo Video

To run, clone the git repository on your local machine, then in a command line :

python __HDCS__.py

You may find you are missing the dependencies:

  • Python 3.6.2+
  • PyQt5
    • pyqtgraph
    • numpy
  • Installed fonts found in /fonts folder

Architecture

This code is intimately intertwined with a number of other systems, chief of which is ADCS. The ADCS code can be found here.

Ultimately, the micro-controllers (far right of diagram) take the majority of the data in, and actuate the commands.

Note: One can definitely separate each module of HDCS from the ADCS / Micro grand scheme. Modules each continue to be written to be as portable as possible.

UI Design & Automatic Refactoring Features

The (Qt Creator) program is used to add features to the GUI, and also to signal to the program which variables should be shown on screen - in "displays" - and which should not.

A key finding in the creation of HDCS is that updating Qt Stylesheets to reflect the state of a variable (in limits, or out of limits), is seriously too slow for the scale of QLabels on-screen. Because of this, we refactor the GUI on each startup.

UI refactoring refers to the conversion of all the QLabels which are automatically identified as "color-able" (see definitions below), into highly efficientQGraphicsItems.

In addition to the performance improvements, this also allows us to drag and drop any displays as we wish.


Creation of a new instrumentation variable into the interface

  1. Open the MainWindow GUI file (mainwindow.ui) found in the "design_files" folder. Note that this is a Qt Creator / Qt Designer file, so get that program first to edit it.

  2. Add the new display window as a QLabel object

  3. Change the ObjectName to exactly the same as the "key" it will have in the state variable dictionary, for example: 'countdown_time'

  4. Pick which display style you would like to have

    • Color-State Display "csd" (color text to reflect if in or out of limits)

      • csd0 : do not display numeric state in text
      • csd1 : display numeric state in text
    • Background-color-State Display "bsd" (color background to reflect if in or out of limits)

      • bsd0 : do not display numeric state in text
      • bsd1 : display numeric state in text
  5. Save the file and convert to .py with the Qt -> PyQt utility (see .bat files in design_files folder)

  6. Add the instrumentation variable to Definitions.State as a new key, value pair in the dictionary.

  7. Add the instrumentation's safe limits in State_Limits if needed

  8. Add the key to the Definitions.Control_Keys variable (if the key is not instrumentation)

About

Human Digital Control Station [HDCS] - Rocket Test Software

Resources

Stars

46 stars

Watchers

8 watching

Forks

Releases

Packages

Contributors

Languages