mirror of
https://github.com/chirimen-oh/node-web-gpio.git
synced 2025-02-01 14:48:40 +00:00
Compare commits
No commits in common. "4b12d332ff75a5ef3f5afb4a4078a9ac0e38b0a7" and "3bda207e91ff7b032617697b9d592b2bda5c26ef" have entirely different histories.
4b12d332ff
...
3bda207e91
24 changed files with 3360 additions and 2157 deletions
|
@ -19,6 +19,8 @@
|
|||
--dark-hl-8: #6A9955;
|
||||
--light-hl-9: #267F99;
|
||||
--dark-hl-9: #4EC9B0;
|
||||
--light-hl-10: #000000;
|
||||
--dark-hl-10: #C8C8C8;
|
||||
--light-code-background: #FFFFFF;
|
||||
--dark-code-background: #1E1E1E;
|
||||
}
|
||||
|
@ -34,6 +36,7 @@
|
|||
--hl-7: var(--light-hl-7);
|
||||
--hl-8: var(--light-hl-8);
|
||||
--hl-9: var(--light-hl-9);
|
||||
--hl-10: var(--light-hl-10);
|
||||
--code-background: var(--light-code-background);
|
||||
} }
|
||||
|
||||
|
@ -48,10 +51,11 @@
|
|||
--hl-7: var(--dark-hl-7);
|
||||
--hl-8: var(--dark-hl-8);
|
||||
--hl-9: var(--dark-hl-9);
|
||||
--hl-10: var(--dark-hl-10);
|
||||
--code-background: var(--dark-code-background);
|
||||
} }
|
||||
|
||||
:root[data-theme='light'] {
|
||||
body.light {
|
||||
--hl-0: var(--light-hl-0);
|
||||
--hl-1: var(--light-hl-1);
|
||||
--hl-2: var(--light-hl-2);
|
||||
|
@ -62,10 +66,11 @@
|
|||
--hl-7: var(--light-hl-7);
|
||||
--hl-8: var(--light-hl-8);
|
||||
--hl-9: var(--light-hl-9);
|
||||
--hl-10: var(--light-hl-10);
|
||||
--code-background: var(--light-code-background);
|
||||
}
|
||||
|
||||
:root[data-theme='dark'] {
|
||||
body.dark {
|
||||
--hl-0: var(--dark-hl-0);
|
||||
--hl-1: var(--dark-hl-1);
|
||||
--hl-2: var(--dark-hl-2);
|
||||
|
@ -76,6 +81,7 @@
|
|||
--hl-7: var(--dark-hl-7);
|
||||
--hl-8: var(--dark-hl-8);
|
||||
--hl-9: var(--dark-hl-9);
|
||||
--hl-10: var(--dark-hl-10);
|
||||
--code-background: var(--dark-code-background);
|
||||
}
|
||||
|
||||
|
@ -89,4 +95,5 @@
|
|||
.hl-7 { color: var(--hl-7); }
|
||||
.hl-8 { color: var(--hl-8); }
|
||||
.hl-9 { color: var(--hl-9); }
|
||||
.hl-10 { color: var(--hl-10); }
|
||||
pre, code { background: var(--code-background); }
|
||||
|
|
1043
docs/assets/icons.css
Normal file
1043
docs/assets/icons.css
Normal file
File diff suppressed because it is too large
Load diff
File diff suppressed because one or more lines are too long
BIN
docs/assets/icons.png
Normal file
BIN
docs/assets/icons.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 9.4 KiB |
File diff suppressed because one or more lines are too long
Before Width: | Height: | Size: 14 KiB |
BIN
docs/assets/icons@2x.png
Normal file
BIN
docs/assets/icons@2x.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 28 KiB |
File diff suppressed because one or more lines are too long
|
@ -1 +0,0 @@
|
|||
window.navigationData = "data:application/octet-stream;base64,H4sIAAAAAAAAA43QMQvCMBAF4P9yc7AoIpLNQaRDaXdxONJIgzGNuasI0v8uxUFC2uD83vs47vwG1i8GCaemrA9KaSIQ4JE7kKAsEmkqftmq47sFATfjWpDrzX4UkdD0gef3U/LPukK/DFToc0bpnmhN+z31GEIfUirt5MTa64BseregxXlOCvoxaOK5N18HpyaDiqQUi7vtePkAPGD3pbIBAAA="
|
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load diff
BIN
docs/assets/widgets.png
Normal file
BIN
docs/assets/widgets.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 480 B |
BIN
docs/assets/widgets@2x.png
Normal file
BIN
docs/assets/widgets@2x.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 855 B |
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -1,11 +1,17 @@
|
|||
<!DOCTYPE html><html class="default" lang="en"><head><meta charset="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>node-web-gpio</title><meta name="description" content="Documentation for node-web-gpio"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="assets/style.css"/><link rel="stylesheet" href="assets/highlight.css"/><script defer src="assets/main.js"></script><script async src="assets/icons.js" id="tsd-icons-script"></script><script async src="assets/search.js" id="tsd-search-script"></script><script async src="assets/navigation.js" id="tsd-nav-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><div class="table-cell" id="tsd-search" data-base="."><div class="field"><label for="tsd-search-field" class="tsd-widget tsd-toolbar-icon search no-caption"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="assets/icons.svg#icon-search"></use></svg></label><input type="text" id="tsd-search-field" aria-label="Search"/></div><div class="field"><div id="tsd-toolbar-links"></div></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="index.html" class="title">node-web-gpio</a></div><div class="table-cell" id="tsd-widgets"><a href="#" class="tsd-widget tsd-toolbar-icon menu no-caption" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="assets/icons.svg#icon-menu"></use></svg></a></div></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><h2>node-web-gpio</h2></div><div class="tsd-panel tsd-typography"><a id="md:node-web-gpio" class="tsd-anchor"></a><h1 class="tsd-anchor-link">node-web-gpio<a href="#md:node-web-gpio" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h1><p>GPIO access with Node.js</p>
|
||||
<a id="md:usage" class="tsd-anchor"></a><h2 class="tsd-anchor-link">Usage<a href="#md:usage" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h2><pre><code class="js"><span class="hl-0">const</span><span class="hl-1"> { </span><span class="hl-2">requestGPIOAccess</span><span class="hl-1"> } = </span><span class="hl-3">require</span><span class="hl-1">(</span><span class="hl-4">"node-web-gpio"</span><span class="hl-1">);</span><br/><span class="hl-0">const</span><span class="hl-1"> { </span><span class="hl-2">promisify</span><span class="hl-1"> } = </span><span class="hl-3">require</span><span class="hl-1">(</span><span class="hl-4">"util"</span><span class="hl-1">);</span><br/><span class="hl-0">const</span><span class="hl-1"> </span><span class="hl-2">sleep</span><span class="hl-1"> = </span><span class="hl-3">promisify</span><span class="hl-1">(</span><span class="hl-5">setTimeout</span><span class="hl-1">);</span><br/><br/><span class="hl-0">async</span><span class="hl-1"> </span><span class="hl-0">function</span><span class="hl-1"> </span><span class="hl-3">main</span><span class="hl-1">() {</span><br/><span class="hl-1"> </span><span class="hl-0">const</span><span class="hl-1"> </span><span class="hl-2">gpioAccess</span><span class="hl-1"> = </span><span class="hl-6">await</span><span class="hl-1"> </span><span class="hl-3">requestGPIOAccess</span><span class="hl-1">();</span><br/><span class="hl-1"> </span><span class="hl-0">const</span><span class="hl-1"> </span><span class="hl-2">port</span><span class="hl-1"> = </span><span class="hl-5">gpioAccess</span><span class="hl-1">.</span><span class="hl-5">ports</span><span class="hl-1">.</span><span class="hl-3">get</span><span class="hl-1">(</span><span class="hl-7">26</span><span class="hl-1">);</span><br/><br/><span class="hl-1"> </span><span class="hl-6">await</span><span class="hl-1"> </span><span class="hl-5">port</span><span class="hl-1">.</span><span class="hl-3">export</span><span class="hl-1">(</span><span class="hl-4">"out"</span><span class="hl-1">);</span><br/><br/><span class="hl-1"> </span><span class="hl-6">for</span><span class="hl-1"> (;;) {</span><br/><span class="hl-1"> </span><span class="hl-6">await</span><span class="hl-1"> </span><span class="hl-5">port</span><span class="hl-1">.</span><span class="hl-3">write</span><span class="hl-1">(</span><span class="hl-7">1</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-6">await</span><span class="hl-1"> </span><span class="hl-3">sleep</span><span class="hl-1">(</span><span class="hl-7">1000</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-6">await</span><span class="hl-1"> </span><span class="hl-5">port</span><span class="hl-1">.</span><span class="hl-3">write</span><span class="hl-1">(</span><span class="hl-7">0</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-6">await</span><span class="hl-1"> </span><span class="hl-3">sleep</span><span class="hl-1">(</span><span class="hl-7">1000</span><span class="hl-1">);</span><br/><span class="hl-1"> }</span><br/><span class="hl-1">}</span><br/><br/><span class="hl-3">main</span><span class="hl-1">();</span>
|
||||
</code><button type="button">Copy</button></pre>
|
||||
<!DOCTYPE html><html class="default"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>node-web-gpio</title><meta name="description" content="Documentation for node-web-gpio"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="assets/style.css"/><link rel="stylesheet" href="assets/highlight.css"/><script async src="assets/search.js" id="search-script"></script></head><body><script>document.body.classList.add(localStorage.getItem("tsd-theme") || "os")</script><header><div class="tsd-page-toolbar"><div class="container"><div class="table-wrap"><div class="table-cell" id="tsd-search" data-base="."><div class="field"><label for="tsd-search-field" class="tsd-widget search no-caption">Search</label><input type="text" id="tsd-search-field"/></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="index.html" class="title">node-web-gpio</a></div><div class="table-cell" id="tsd-widgets"><div id="tsd-filter"><a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a><div class="tsd-filter-group"><div class="tsd-select" id="tsd-filter-visibility"><span class="tsd-select-label">All</span><ul class="tsd-select-list"><li data-value="public">Public</li><li data-value="protected">Public/Protected</li><li data-value="private" class="selected">All</li></ul></div> <input type="checkbox" id="tsd-filter-inherited" checked/><label class="tsd-widget" for="tsd-filter-inherited">Inherited</label><input type="checkbox" id="tsd-filter-externals" checked/><label class="tsd-widget" for="tsd-filter-externals">Externals</label></div></div><a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a></div></div></div></div><div class="tsd-page-title"><div class="container"><h1>node-web-gpio</h1></div></div></header><div class="container container-main"><div class="row"><div class="col-8 col-content"><div class="tsd-panel tsd-typography">
|
||||
<a href="#node-web-gpio" id="node-web-gpio" style="color: inherit; text-decoration: none;">
|
||||
<h1>node-web-gpio</h1>
|
||||
</a>
|
||||
<p>GPIO access with Node.js</p>
|
||||
|
||||
<a id="md:document" class="tsd-anchor"></a><h2 class="tsd-anchor-link">Document<a href="#md:document" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h2><ul>
|
||||
<li><a href="http://chirimen.org/node-web-gpio/" target="_blank" class="external">TSDoc</a></li>
|
||||
</ul>
|
||||
<a id="md:reference" class="tsd-anchor"></a><h2 class="tsd-anchor-link">Reference<a href="#md:reference" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h2><ul>
|
||||
<li><a href="http://browserobo.github.io/WebGPIO" target="_blank" class="external">Web GPIO API for W3C Draft</a></li>
|
||||
</ul>
|
||||
</div></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="assets/icons.svg#icon-chevronDown"></use></svg>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-protected" name="protected"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Protected</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-external" name="external"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>External</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div><details open class="tsd-accordion tsd-page-navigation"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="assets/icons.svg#icon-chevronDown"></use></svg>On This Page</h3></summary><div class="tsd-accordion-details"><a href="#md:node-web-gpio"><span>node-<wbr/>web-<wbr/>gpio</span></a><ul><li><a href="#md:usage"><span>Usage</span></a></li><li><a href="#md:document"><span>Document</span></a></li><li><a href="#md:reference"><span>Reference</span></a></li></ul></div></details></div><div class="site-menu"><nav class="tsd-navigation"><a href="modules.html" class="current"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="assets/icons.svg#icon-1"></use></svg><span>node-web-gpio</span></a><ul class="tsd-small-nested-navigation" id="tsd-nav-container" data-base="."><li>Loading...</li></ul></nav></div></div></div><footer><p class="tsd-generator">Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></footer><div class="overlay"></div></body></html>
|
||||
<a href="#usage" id="usage" style="color: inherit; text-decoration: none;">
|
||||
<h2>Usage</h2>
|
||||
</a>
|
||||
<pre><code class="language-js"><span class="hl-0">const</span><span class="hl-1"> { </span><span class="hl-2">requestGPIOAccess</span><span class="hl-1"> } = </span><span class="hl-3">require</span><span class="hl-1">(</span><span class="hl-4">"node-web-gpio"</span><span class="hl-1">);</span><br/><span class="hl-0">const</span><span class="hl-1"> { </span><span class="hl-2">promisify</span><span class="hl-1"> } = </span><span class="hl-3">require</span><span class="hl-1">(</span><span class="hl-4">"util"</span><span class="hl-1">);</span><br/><span class="hl-0">const</span><span class="hl-1"> </span><span class="hl-2">sleep</span><span class="hl-1"> = </span><span class="hl-3">promisify</span><span class="hl-1">(</span><span class="hl-5">setTimeout</span><span class="hl-1">);</span><br/><br/><span class="hl-0">async</span><span class="hl-1"> </span><span class="hl-0">function</span><span class="hl-1"> </span><span class="hl-3">main</span><span class="hl-1">() {</span><br/><span class="hl-1"> </span><span class="hl-0">const</span><span class="hl-1"> </span><span class="hl-2">gpioAccess</span><span class="hl-1"> = </span><span class="hl-6">await</span><span class="hl-1"> </span><span class="hl-3">requestGPIOAccess</span><span class="hl-1">();</span><br/><span class="hl-1"> </span><span class="hl-0">const</span><span class="hl-1"> </span><span class="hl-2">port</span><span class="hl-1"> = </span><span class="hl-5">gpioAccess</span><span class="hl-1">.</span><span class="hl-5">ports</span><span class="hl-1">.</span><span class="hl-3">get</span><span class="hl-1">(</span><span class="hl-7">26</span><span class="hl-1">);</span><br/><br/><span class="hl-1"> </span><span class="hl-6">await</span><span class="hl-1"> </span><span class="hl-5">port</span><span class="hl-1">.</span><span class="hl-3">export</span><span class="hl-1">(</span><span class="hl-4">"out"</span><span class="hl-1">);</span><br/><br/><span class="hl-1"> </span><span class="hl-6">for</span><span class="hl-1"> (;;) {</span><br/><span class="hl-1"> </span><span class="hl-6">await</span><span class="hl-1"> </span><span class="hl-5">port</span><span class="hl-1">.</span><span class="hl-3">write</span><span class="hl-1">(</span><span class="hl-7">1</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-6">await</span><span class="hl-1"> </span><span class="hl-3">sleep</span><span class="hl-1">(</span><span class="hl-7">1000</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-6">await</span><span class="hl-1"> </span><span class="hl-5">port</span><span class="hl-1">.</span><span class="hl-3">write</span><span class="hl-1">(</span><span class="hl-7">0</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-6">await</span><span class="hl-1"> </span><span class="hl-3">sleep</span><span class="hl-1">(</span><span class="hl-7">1000</span><span class="hl-1">);</span><br/><span class="hl-1"> }</span><br/><span class="hl-1">}</span><br/><br/><span class="hl-3">main</span><span class="hl-1">();</span>
|
||||
</code></pre>
|
||||
|
||||
<a href="#document" id="document" style="color: inherit; text-decoration: none;">
|
||||
<h2>Document</h2>
|
||||
</a>
|
||||
<p><a href="http://browserobo.github.io/WebGPIO">Web GPIO API</a></p>
|
||||
</div></div><div class="col-4 col-menu menu-sticky-wrap menu-highlight"><nav class="tsd-navigation primary"><ul><li class="current"><a href="modules.html">Exports</a></li></ul></nav><nav class="tsd-navigation secondary menu-sticky"><ul><li class="tsd-kind-class"><a href="classes/GPIOAccess.html" class="tsd-kind-icon">GPIOAccess</a></li><li class="tsd-kind-class"><a href="classes/GPIOPort.html" class="tsd-kind-icon">GPIOPort</a></li><li class="tsd-kind-class"><a href="classes/GPIOPortMap.html" class="tsd-kind-icon">GPIOPort<wbr/>Map</a></li><li class="tsd-kind-class"><a href="classes/InvalidAccessError.html" class="tsd-kind-icon">Invalid<wbr/>Access<wbr/>Error</a></li><li class="tsd-kind-class"><a href="classes/OperationError.html" class="tsd-kind-icon">Operation<wbr/>Error</a></li><li class="tsd-kind-function"><a href="modules.html#requestGPIOAccess" class="tsd-kind-icon">requestGPIOAccess</a></li></ul></nav></div></div></div><footer class="with-border-bottom"><div class="container"><h2>Legend</h2><div class="tsd-legend-group"><ul class="tsd-legend"><li class="tsd-kind-constructor tsd-parent-kind-class"><span class="tsd-kind-icon">Constructor</span></li><li class="tsd-kind-property tsd-parent-kind-class"><span class="tsd-kind-icon">Property</span></li><li class="tsd-kind-method tsd-parent-kind-class"><span class="tsd-kind-icon">Method</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-constructor tsd-parent-kind-class tsd-is-inherited"><span class="tsd-kind-icon">Inherited constructor</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-property tsd-parent-kind-class tsd-is-private"><span class="tsd-kind-icon">Private property</span></li></ul></div><h2>Settings</h2><p>Theme <select id="theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></p></div></footer><div class="container tsd-generator"><p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></div><div class="overlay"></div><script src="assets/main.js"></script></body></html>
|
File diff suppressed because one or more lines are too long
51
index.ts
51
index.ts
|
@ -1,7 +1,6 @@
|
|||
import { EventEmitter } from 'node:events';
|
||||
import { promises as fs } from 'node:fs';
|
||||
import * as os from 'node:os';
|
||||
import * as path from 'node:path';
|
||||
import { EventEmitter } from 'events';
|
||||
import { promises as fs } from 'fs';
|
||||
import * as path from 'path';
|
||||
|
||||
/**
|
||||
* Interval of file system polling, in milliseconds.
|
||||
|
@ -32,19 +31,9 @@ const Uint16Max = 65535;
|
|||
function parseUint16(parseString: string) {
|
||||
const n = Number.parseInt(parseString, 10);
|
||||
if (0 <= n && n <= Uint16Max) return n;
|
||||
// biome-ignore lint/style/noUselessElse:
|
||||
else throw new RangeError(`Must be between 0 and ${Uint16Max}.`);
|
||||
}
|
||||
|
||||
/**
|
||||
* GPIO0 オフセット
|
||||
* @see {@link https://github.com/raspberrypi/linux/issues/6037}
|
||||
*/
|
||||
const GpioOffset =
|
||||
process.platform === 'linux' && 6.6 <= Number(os.release().match(/\d+\.\d+/))
|
||||
? 512
|
||||
: 0;
|
||||
|
||||
/** ポート番号 */
|
||||
type PortNumber = number;
|
||||
/** ポート名 */
|
||||
|
@ -73,7 +62,6 @@ interface GPIOChangeEvent {
|
|||
*/
|
||||
interface GPIOChangeEventHandler {
|
||||
/** イベント */
|
||||
// biome-ignore lint/style/useShorthandFunctionType:
|
||||
(event: GPIOChangeEvent): void;
|
||||
}
|
||||
|
||||
|
@ -94,11 +82,10 @@ export class GPIOAccess extends EventEmitter {
|
|||
super();
|
||||
|
||||
this._ports = ports == null ? new GPIOPortMap() : ports;
|
||||
// biome-ignore lint/complexity/noForEach:
|
||||
this._ports.forEach((port) =>
|
||||
port.on('change', (event) => {
|
||||
this.emit('change', event);
|
||||
}),
|
||||
})
|
||||
);
|
||||
|
||||
this.on('change', (event: GPIOChangeEvent): void => {
|
||||
|
@ -122,8 +109,8 @@ export class GPIOAccess extends EventEmitter {
|
|||
async unexportAll(): Promise<void> {
|
||||
await Promise.all(
|
||||
[...this.ports.values()].map((port) =>
|
||||
port.exported ? port.unexport() : undefined,
|
||||
),
|
||||
port.exported ? port.unexport() : undefined
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -161,7 +148,7 @@ export class GPIOPort extends EventEmitter {
|
|||
constructor(portNumber: PortNumber) {
|
||||
super();
|
||||
|
||||
this._portNumber = parseUint16(portNumber.toString()) + GpioOffset;
|
||||
this._portNumber = parseUint16(portNumber.toString());
|
||||
this._pollingInterval = PollingInterval;
|
||||
this._direction = new OperationError('Unknown direction.');
|
||||
this._exported = new OperationError('Unknown export.');
|
||||
|
@ -237,23 +224,22 @@ export class GPIOPort extends EventEmitter {
|
|||
if (!this.exported) {
|
||||
await fs.writeFile(
|
||||
path.join(SysfsGPIOPath, 'export'),
|
||||
String(this.portNumber),
|
||||
String(this.portNumber)
|
||||
);
|
||||
}
|
||||
await fs.writeFile(
|
||||
path.join(SysfsGPIOPath, this.portName, 'direction'),
|
||||
direction,
|
||||
direction
|
||||
);
|
||||
if (direction === 'in') {
|
||||
this._timeout = setInterval(
|
||||
// eslint-disable-next-line
|
||||
this.read.bind(this),
|
||||
this._pollingInterval,
|
||||
this._pollingInterval
|
||||
);
|
||||
}
|
||||
// biome-ignore lint/suspicious/noExplicitAny:
|
||||
} catch (error: any) {
|
||||
if (this._exportRetry === 0) {
|
||||
if (this._exportRetry == 0) {
|
||||
await sleep(100);
|
||||
console.warn('May be the first time port access. Retry..');
|
||||
++this._exportRetry;
|
||||
|
@ -278,9 +264,8 @@ export class GPIOPort extends EventEmitter {
|
|||
try {
|
||||
await fs.writeFile(
|
||||
path.join(SysfsGPIOPath, 'unexport'),
|
||||
String(this.portNumber),
|
||||
String(this.portNumber)
|
||||
);
|
||||
// biome-ignore lint/suspicious/noExplicitAny:
|
||||
} catch (error: any) {
|
||||
throw new OperationError(error);
|
||||
}
|
||||
|
@ -295,13 +280,13 @@ export class GPIOPort extends EventEmitter {
|
|||
async read(): Promise<GPIOValue> {
|
||||
if (!(this.exported && this.direction === 'in')) {
|
||||
throw new InvalidAccessError(
|
||||
`The exported must be true and value of direction must be "in".`,
|
||||
`The exported must be true and value of direction must be "in".`
|
||||
);
|
||||
}
|
||||
|
||||
try {
|
||||
const buffer = await fs.readFile(
|
||||
path.join(SysfsGPIOPath, this.portName, 'value'),
|
||||
path.join(SysfsGPIOPath, this.portName, 'value')
|
||||
);
|
||||
|
||||
const value = parseUint16(buffer.toString()) as GPIOValue;
|
||||
|
@ -312,7 +297,6 @@ export class GPIOPort extends EventEmitter {
|
|||
}
|
||||
|
||||
return value;
|
||||
// biome-ignore lint/suspicious/noExplicitAny:
|
||||
} catch (error: any) {
|
||||
throw new OperationError(error);
|
||||
}
|
||||
|
@ -325,16 +309,15 @@ export class GPIOPort extends EventEmitter {
|
|||
async write(value: GPIOValue): Promise<void> {
|
||||
if (!(this.exported && this.direction === 'out')) {
|
||||
throw new InvalidAccessError(
|
||||
`The exported must be true and value of direction must be "out".`,
|
||||
`The exported must be true and value of direction must be "out".`
|
||||
);
|
||||
}
|
||||
|
||||
try {
|
||||
await fs.writeFile(
|
||||
path.join(SysfsGPIOPath, this.portName, 'value'),
|
||||
parseUint16(value.toString()).toString(),
|
||||
parseUint16(value.toString()).toString()
|
||||
);
|
||||
// biome-ignore lint/suspicious/noExplicitAny:
|
||||
} catch (error: any) {
|
||||
throw new OperationError(error);
|
||||
}
|
||||
|
@ -376,7 +359,7 @@ export async function requestGPIOAccess(): Promise<GPIOAccess> {
|
|||
[...Array(GPIOPortMapSizeMax).keys()].map((portNumber) => [
|
||||
portNumber,
|
||||
new GPIOPort(portNumber),
|
||||
]),
|
||||
])
|
||||
);
|
||||
|
||||
return new GPIOAccess(ports);
|
||||
|
|
23
package.json
23
package.json
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "node-web-gpio",
|
||||
"version": "1.1.1",
|
||||
"version": "1.0.33",
|
||||
"description": "GPIO access with Node.js",
|
||||
"main": "dist/index.js",
|
||||
"types": "dist/index.d.ts",
|
||||
|
@ -14,17 +14,19 @@
|
|||
"author": "Kohei Watanabe <kou029w@gmail.com>",
|
||||
"license": "MIT",
|
||||
"devDependencies": {
|
||||
"@biomejs/biome": "^1.9.3",
|
||||
"@types/node": "^22.7.4",
|
||||
"husky": "^9.1.6",
|
||||
"lint-staged": "^15.2.10",
|
||||
"prettier": "^3.3.3",
|
||||
"typedoc": "^0.26.7",
|
||||
"typescript": "^5.6.2"
|
||||
"@types/node": "^20.0.0",
|
||||
"@typescript-eslint/eslint-plugin": "^8.0.0",
|
||||
"@typescript-eslint/parser": "^8.0.0",
|
||||
"eslint": "^9.0.0",
|
||||
"husky": "^9.0.0",
|
||||
"lint-staged": "^15.0.0",
|
||||
"prettier": "^3.0.0",
|
||||
"typedoc": "^0.26.0",
|
||||
"typescript": "^5.0.0"
|
||||
},
|
||||
"scripts": {
|
||||
"build": "tsc",
|
||||
"lint": "biome lint index.ts",
|
||||
"lint": "eslint index.ts",
|
||||
"prepare": "husky install && rm -rf dist && npm run build",
|
||||
"precommit": "lint-staged",
|
||||
"docs": "npm run remove:docs && npm run typedoc -- --options typedoc.json --exclude '**/*.spec.ts' ./ README.md",
|
||||
|
@ -44,6 +46,5 @@
|
|||
"robotics",
|
||||
"robots",
|
||||
"rpi"
|
||||
],
|
||||
"packageManager": "yarn@1.22.19+sha1.4ba7fc5c6e704fce2066ecbfb0b0d8976fe62447"
|
||||
]
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
{
|
||||
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
||||
"extends": ["config:best-practices", ":automergeAll", "schedule:monthly"]
|
||||
"extends": ["config:base", ":preserveSemverRanges"],
|
||||
"automerge": true
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue