dualsense-ts 5.5.0 → 6.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/MIGRATION_GUIDE.md +19 -0
- package/README.md +168 -22
- package/dist/dualsense.d.ts +15 -1
- package/dist/dualsense.d.ts.map +1 -1
- package/dist/dualsense.js +94 -10
- package/dist/dualsense.js.map +1 -1
- package/dist/elements/battery.d.ts +28 -0
- package/dist/elements/battery.d.ts.map +1 -0
- package/dist/elements/battery.js +49 -0
- package/dist/elements/battery.js.map +1 -0
- package/dist/elements/index.d.ts +4 -0
- package/dist/elements/index.d.ts.map +1 -1
- package/dist/elements/index.js +4 -0
- package/dist/elements/index.js.map +1 -1
- package/dist/elements/lightbar.d.ts +26 -0
- package/dist/elements/lightbar.d.ts.map +1 -0
- package/dist/elements/lightbar.js +44 -0
- package/dist/elements/lightbar.js.map +1 -0
- package/dist/elements/mute.d.ts +1 -1
- package/dist/elements/mute.d.ts.map +1 -1
- package/dist/elements/mute.js +2 -2
- package/dist/elements/mute.js.map +1 -1
- package/dist/elements/player_leds.d.ts +23 -0
- package/dist/elements/player_leds.d.ts.map +1 -0
- package/dist/elements/player_leds.js +52 -0
- package/dist/elements/player_leds.js.map +1 -0
- package/dist/elements/trigger.d.ts +3 -0
- package/dist/elements/trigger.d.ts.map +1 -1
- package/dist/elements/trigger.js +3 -0
- package/dist/elements/trigger.js.map +1 -1
- package/dist/elements/trigger_feedback.d.ts +109 -0
- package/dist/elements/trigger_feedback.d.ts.map +1 -0
- package/dist/elements/trigger_feedback.js +168 -0
- package/dist/elements/trigger_feedback.js.map +1 -0
- package/dist/hid/battery_state.d.ts +10 -0
- package/dist/hid/battery_state.d.ts.map +1 -0
- package/dist/hid/battery_state.js +14 -0
- package/dist/hid/battery_state.js.map +1 -0
- package/dist/hid/bt_checksum.d.ts +2 -0
- package/dist/hid/bt_checksum.d.ts.map +1 -0
- package/dist/hid/bt_checksum.js +60 -0
- package/dist/hid/bt_checksum.js.map +1 -0
- package/dist/hid/command.d.ts +11 -21
- package/dist/hid/command.d.ts.map +1 -1
- package/dist/hid/command.js +21 -0
- package/dist/hid/command.js.map +1 -1
- package/dist/hid/dualsense_hid.d.ts +12 -9
- package/dist/hid/dualsense_hid.d.ts.map +1 -1
- package/dist/hid/dualsense_hid.js +68 -26
- package/dist/hid/dualsense_hid.js.map +1 -1
- package/dist/hid/hid_provider.d.ts +10 -0
- package/dist/hid/hid_provider.d.ts.map +1 -1
- package/dist/hid/hid_provider.js +18 -3
- package/dist/hid/hid_provider.js.map +1 -1
- package/dist/hid/index.d.ts +2 -0
- package/dist/hid/index.d.ts.map +1 -1
- package/dist/hid/index.js +2 -0
- package/dist/hid/index.js.map +1 -1
- package/dist/hid/node_hid_provider.d.ts +1 -0
- package/dist/hid/node_hid_provider.d.ts.map +1 -1
- package/dist/hid/web_hid_provider.d.ts.map +1 -1
- package/dist/hid/web_hid_provider.js +3 -1
- package/dist/hid/web_hid_provider.js.map +1 -1
- package/dist/id.d.ts +3 -0
- package/dist/id.d.ts.map +1 -1
- package/nodehid_example/debug.ts +183 -41
- package/package.json +5 -5
- package/src/dualsense.ts +118 -13
- package/src/elements/battery.ts +54 -0
- package/src/elements/index.ts +4 -0
- package/src/elements/lightbar.ts +52 -0
- package/src/elements/mute.ts +2 -2
- package/src/elements/player_leds.ts +52 -0
- package/src/elements/trigger.ts +4 -0
- package/src/elements/trigger_feedback.ts +267 -0
- package/src/hid/battery_state.ts +9 -0
- package/src/hid/bt_checksum.spec.ts +15 -0
- package/src/hid/bt_checksum.ts +58 -0
- package/src/hid/command.ts +27 -37
- package/src/hid/dualsense_hid.ts +89 -29
- package/src/hid/hid_provider.ts +20 -2
- package/src/hid/index.ts +2 -0
- package/src/hid/web_hid_provider.ts +3 -1
- package/src/id.ts +4 -0
- package/webhid_example/build/asset-manifest.json +6 -6
- package/webhid_example/build/index.html +1 -1
- package/webhid_example/build/static/css/{main.237f8cfa.css → main.9393bbb9.css} +2 -2
- package/webhid_example/build/static/css/main.9393bbb9.css.map +1 -0
- package/webhid_example/build/static/js/main.53ce5f89.js +3 -0
- package/webhid_example/build/static/js/main.53ce5f89.js.map +1 -0
- package/webhid_example/src/App.tsx +63 -12
- package/webhid_example/src/Controller.tsx +19 -0
- package/webhid_example/src/hud/BatteryIndicator.tsx +78 -0
- package/webhid_example/src/hud/ControllerConnection.tsx +59 -57
- package/webhid_example/src/hud/Debugger.tsx +93 -79
- package/webhid_example/src/hud/Gyro.tsx +48 -53
- package/webhid_example/src/hud/HUDLayout.tsx +2 -10
- package/webhid_example/src/hud/LightbarControls.tsx +82 -0
- package/webhid_example/src/hud/MuteLedControls.tsx +28 -0
- package/webhid_example/src/hud/PlayerLedControls.tsx +87 -0
- package/webhid_example/src/hud/Reticle.tsx +12 -62
- package/webhid_example/src/hud/RightStick.tsx +26 -0
- package/webhid_example/src/hud/StickVisualization.tsx +81 -0
- package/webhid_example/src/hud/TriggerEffectControls.tsx +417 -0
- package/webhid_example/src/hud/index.tsx +7 -0
- package/webhid_example/src/index.css +20 -1
- package/webhid_example/build/static/css/main.237f8cfa.css.map +0 -1
- package/webhid_example/build/static/js/main.0432376e.js +0 -3
- package/webhid_example/build/static/js/main.0432376e.js.map +0 -1
- /package/webhid_example/build/static/js/{main.0432376e.js.LICENSE.txt → main.53ce5f89.js.LICENSE.txt} +0 -0
package/MIGRATION_GUIDE.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# Migration Guide
|
|
2
2
|
|
|
3
|
+
### v5 to v6
|
|
4
|
+
|
|
5
|
+
`TriggerMode` is deprecated. The low-level `DualsenseHID` methods for setting trigger effects now accept 11-byte effect blocks instead of individual mode/value pairs.
|
|
6
|
+
|
|
7
|
+
Use the new element-based API instead:
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
import { TriggerEffect } from "dualsense-ts";
|
|
11
|
+
|
|
12
|
+
controller.right.trigger.feedback.set({
|
|
13
|
+
effect: TriggerEffect.Weapon,
|
|
14
|
+
start: 0.2,
|
|
15
|
+
end: 0.6,
|
|
16
|
+
strength: 0.9,
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
controller.right.trigger.feedback.reset();
|
|
20
|
+
```
|
|
21
|
+
|
|
3
22
|
### v4 to v5
|
|
4
23
|
|
|
5
24
|
`node-hid` is now an optional peer dependency, simplifying the use of this library in the browser.
|
package/README.md
CHANGED
|
@@ -1,18 +1,24 @@
|
|
|
1
1
|
# dualsense-ts
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
`dualsense-ts` is the natural interface for your DualSense controller. It's fully-typed, fully-featured, easy to use, and supports wired and wireless connections in both node.js and the browser.
|
|
4
|
+
|
|
5
|
+
**[Live demo](https://nsfm.github.io/dualsense-ts/)** - connect a controller and try it out!
|
|
4
6
|
|
|
5
7
|
## Getting started
|
|
6
8
|
|
|
7
9
|
### Installation
|
|
8
10
|
|
|
9
|
-
[This package is distributed via npm](https://npmjs.
|
|
11
|
+
[This package is distributed via npm](https://www.npmjs.com/package/dualsense-ts). Install it the usual way:
|
|
10
12
|
|
|
11
13
|
- `npm add dualsense-ts`
|
|
12
14
|
|
|
13
|
-
In the browser
|
|
15
|
+
#### In the browser
|
|
16
|
+
|
|
17
|
+
`dualsense-ts` has zero dependencies and relies on the [WebHID API](https://developer.mozilla.org/en-US/docs/Web/API/WebHID_API). At this time, only Chrome, Edge, and Opera are compatible.
|
|
14
18
|
|
|
15
|
-
In node.js
|
|
19
|
+
#### In node.js
|
|
20
|
+
|
|
21
|
+
`dualsense-ts` relies on `node-hid` as a peer dependency, so you'll need to add it to your project as well:
|
|
16
22
|
|
|
17
23
|
- `npm add node-hid`
|
|
18
24
|
|
|
@@ -30,18 +36,19 @@ const controller = new Dualsense();
|
|
|
30
36
|
If the device disconnects, `dualsense-ts` will quietly wait for it to come back. You can monitor the connection status with `controller.connection` using any of the Input APIs listed in the next section.
|
|
31
37
|
|
|
32
38
|
```typescript
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
controller.connection.on("change", ({ active }) = > {
|
|
39
|
+
controller.connection.on("change", ({ active }) => {
|
|
36
40
|
console.log(`controller ${active ? '' : 'dis'}connected`)
|
|
37
41
|
});
|
|
42
|
+
|
|
43
|
+
controller.connection.active // returns true while the controller is available
|
|
44
|
+
controller.wireless // returns true while connected over bluetooth
|
|
38
45
|
```
|
|
39
46
|
|
|
40
47
|
### Input APIs
|
|
41
48
|
|
|
42
49
|
`dualsense-ts` provides several interfaces for reading input:
|
|
43
50
|
|
|
44
|
-
- _Synchronous_: It's safe to read the current input state at any time
|
|
51
|
+
- _Synchronous_: It's safe to read the current input state at any time. When the controller disconnects, these all reset to their neutral states.
|
|
45
52
|
|
|
46
53
|
```typescript
|
|
47
54
|
// Buttons
|
|
@@ -60,10 +67,10 @@ controller.left.analog.magnitude; // 0.23, 0 to 1
|
|
|
60
67
|
|
|
61
68
|
// Touchpad - each touch point works like an analog input
|
|
62
69
|
controller.touchpad.right.contact.state; // false
|
|
63
|
-
|
|
70
|
+
controller.touchpad.right.x.state; // -0.44, -1 to 1
|
|
64
71
|
```
|
|
65
72
|
|
|
66
|
-
- _Callbacks_: Each input is an EventEmitter or EventTarget that provides `input`, `press`, `release`, and `change` events
|
|
73
|
+
- _Callbacks_: Each input is an EventEmitter or EventTarget that provides `input`, `press`, `release`, and `change` events:
|
|
67
74
|
|
|
68
75
|
```typescript
|
|
69
76
|
// Change events are triggered only when an input's value changes
|
|
@@ -89,7 +96,7 @@ controller.dpad.on("press", (dpad, input) =>
|
|
|
89
96
|
controller.left.analog.x.on("input", console.log)
|
|
90
97
|
```
|
|
91
98
|
|
|
92
|
-
- _Promises_: Wait for one-off inputs using `await
|
|
99
|
+
- _Promises_: Wait for one-off inputs using `await`:
|
|
93
100
|
|
|
94
101
|
```typescript
|
|
95
102
|
// Resolves next time `dpad up` is released
|
|
@@ -102,7 +109,7 @@ const { left, up, down, right } = await controller.dpad.promise("press");
|
|
|
102
109
|
await controller.promise();
|
|
103
110
|
```
|
|
104
111
|
|
|
105
|
-
- _Async Iterators_: Each input is an async iterator that provides state changes
|
|
112
|
+
- _Async Iterators_: Each input is an async iterator that provides state changes:
|
|
106
113
|
|
|
107
114
|
```typescript
|
|
108
115
|
for await (const { pressure } of controller.left.trigger) {
|
|
@@ -114,6 +121,8 @@ for await (const { pressure } of controller.left.trigger) {
|
|
|
114
121
|
|
|
115
122
|
#### Motion Control
|
|
116
123
|
|
|
124
|
+
You can access raw gyroscope and accelerometer readings from the device:
|
|
125
|
+
|
|
117
126
|
```typescript
|
|
118
127
|
controller.gyroscope.on("change", ({ x, y, z }) => {
|
|
119
128
|
console.log(`Gyroscope: \n\t${x}\n\t${y}\n\t${z}`)
|
|
@@ -123,14 +132,47 @@ controller.accelerometer.on("change", ({ x, y, z }) => {
|
|
|
123
132
|
console.log(`Accelerometer: \n\t${x}\n\t${y}\n\t${z}`)
|
|
124
133
|
}
|
|
125
134
|
|
|
126
|
-
controller.accelerometer.z.on("change", ({
|
|
127
|
-
if (
|
|
135
|
+
controller.accelerometer.z.on("change", ({ magnitude }) => {
|
|
136
|
+
if (magnitude > 0.3) console.log('Controller is moving!')
|
|
128
137
|
})
|
|
129
138
|
```
|
|
130
139
|
|
|
140
|
+
You'll need to perform additional processing to get the most use out of them - for example, by buffering accelerometer inputs and using a rolling Fourier transform to detect shaking.
|
|
141
|
+
|
|
142
|
+
#### Battery
|
|
143
|
+
|
|
144
|
+
The controller provides its current battery level and charging status:
|
|
145
|
+
|
|
146
|
+
```typescript
|
|
147
|
+
// Check charging status
|
|
148
|
+
import { ChargeStatus } from "dualsense-ts";
|
|
149
|
+
|
|
150
|
+
controller.battery.status.on("change", ({ state }) => {
|
|
151
|
+
switch (state) {
|
|
152
|
+
case ChargeStatus.Charging:
|
|
153
|
+
console.log("Charging");
|
|
154
|
+
break;
|
|
155
|
+
case ChargeStatus.Discharging:
|
|
156
|
+
console.log("On battery");
|
|
157
|
+
break;
|
|
158
|
+
case ChargeStatus.Full:
|
|
159
|
+
console.log("Fully charged");
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
// React to battery level changes
|
|
165
|
+
controller.battery.level.on("change", ({ state }) => {
|
|
166
|
+
console.log(`Battery: ${Math.round(state * 100)}%`);
|
|
167
|
+
if (state < 0.2) console.log("Low battery!");
|
|
168
|
+
});
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
After connection it may take a second for these values to populate. Please note that the battery level is not a precise reading - it changes in 10% increments and is prone to flip-flopping. `dualsense-ts` makes an attempt to buffer and normalize these values.
|
|
172
|
+
|
|
131
173
|
#### Rumble
|
|
132
174
|
|
|
133
|
-
|
|
175
|
+
The controller has two haptic rumbles. The left motor produces a stronger, lower-frequency rumble, while the right actuator produces a lighter, higher-frequency vibration. They are controlled independently:
|
|
134
176
|
|
|
135
177
|
```typescript
|
|
136
178
|
controller.rumble(1.0); // 100% rumble intensity
|
|
@@ -144,10 +186,105 @@ controller.rumble(false); // Another way to stop rumbling
|
|
|
144
186
|
|
|
145
187
|
// Control right rumble intensity with the right trigger
|
|
146
188
|
controller.right.trigger.on("change", (trigger) => {
|
|
147
|
-
controller.right.rumble(trigger.
|
|
189
|
+
controller.right.rumble(trigger.pressure);
|
|
190
|
+
});
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
#### Adaptive Triggers
|
|
194
|
+
|
|
195
|
+
Adaptive trigger feedback is controlled via `controller.left.trigger.feedback` / `controller.right.trigger.feedback`.
|
|
196
|
+
|
|
197
|
+
```typescript
|
|
198
|
+
import { Dualsense, TriggerEffect } from "dualsense-ts";
|
|
199
|
+
|
|
200
|
+
const controller = new Dualsense();
|
|
201
|
+
|
|
202
|
+
// Continuous resistance starting at 30% travel
|
|
203
|
+
controller.right.trigger.feedback.set({
|
|
204
|
+
effect: TriggerEffect.Feedback,
|
|
205
|
+
position: 0.3, // 0 - 1
|
|
206
|
+
strength: 0.8,
|
|
148
207
|
});
|
|
208
|
+
|
|
209
|
+
// Weapon trigger — resistance with snap release
|
|
210
|
+
controller.right.trigger.feedback.set({
|
|
211
|
+
effect: TriggerEffect.Weapon,
|
|
212
|
+
start: 0.2,
|
|
213
|
+
end: 0.6,
|
|
214
|
+
strength: 0.9,
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
// Vibration with frequency
|
|
218
|
+
controller.right.trigger.feedback.set({
|
|
219
|
+
effect: TriggerEffect.Vibration,
|
|
220
|
+
position: 0.1,
|
|
221
|
+
amplitude: 0.7,
|
|
222
|
+
frequency: 40, // in Hz, 0 - 255
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
// Reset to default linear feel
|
|
226
|
+
controller.right.trigger.feedback.reset();
|
|
227
|
+
|
|
228
|
+
// Reset both triggers
|
|
229
|
+
controller.resetTriggerFeedback();
|
|
230
|
+
|
|
231
|
+
// Read current config
|
|
232
|
+
console.log(controller.right.trigger.feedback.config);
|
|
233
|
+
console.log(controller.right.trigger.feedback.effect); // TriggerEffect.Off
|
|
149
234
|
```
|
|
150
235
|
|
|
236
|
+
Feedback state is automatically restored if the controller disconnects and reconnects — no handling required on your end.
|
|
237
|
+
|
|
238
|
+
#### Trigger effects
|
|
239
|
+
|
|
240
|
+
| Effect | Description |
|
|
241
|
+
| ------------------------- | ---------------------------------------------------------- |
|
|
242
|
+
| `TriggerEffect.Off` | No resistance (default linear feel) |
|
|
243
|
+
| `TriggerEffect.Feedback` | Zone-based continuous resistance from a start position |
|
|
244
|
+
| `TriggerEffect.Weapon` | Resistance with a snap release point |
|
|
245
|
+
| `TriggerEffect.Bow` | Weapon feel with snap-back force |
|
|
246
|
+
| `TriggerEffect.Galloping` | Rhythmic two-stroke oscillation |
|
|
247
|
+
| `TriggerEffect.Vibration` | Zone-based oscillation with amplitude and frequency |
|
|
248
|
+
| `TriggerEffect.Machine` | Dual-amplitude vibration with frequency and period control |
|
|
249
|
+
|
|
250
|
+
Each effect accepts a unique set of configuration options — your editor's type hints will guide you through the available parameters for each effect. The [interactive demo](https://nsfm.github.io/dualsense-ts/) includes full slider controls for every effect and parameter, making it a great tool for finding the right values.
|
|
251
|
+
|
|
252
|
+
Effect names are based on [Nielk1's DualSense trigger effect documentation](https://gist.github.com/Nielk1/6d54cc2c00d2201ccb8c2720ad7538db).
|
|
253
|
+
|
|
254
|
+
#### Lights
|
|
255
|
+
|
|
256
|
+
You can control the controller's lightbar as well as the player indicator LEDs:
|
|
257
|
+
|
|
258
|
+
```typescript
|
|
259
|
+
import { PlayerID, Brightness } from "dualsense-ts";
|
|
260
|
+
|
|
261
|
+
// Light bar — set color with {r, g, b} (0–255 per channel)
|
|
262
|
+
controller.lightbar.set({ r: 255, g: 0, b: 128 });
|
|
263
|
+
controller.lightbar.color; // { r: 255, g: 0, b: 128 }
|
|
264
|
+
|
|
265
|
+
// Light bar pulse effects — firmware-driven one-shot animations
|
|
266
|
+
// This overrides your custom color
|
|
267
|
+
controller.lightbar.fadeBlue(); // Fades to blue and holds
|
|
268
|
+
// You must call `fadeOut()` to restore custom lightbar colors
|
|
269
|
+
controller.lightbar.fadeOut(); // Fades to black, then returns to set color
|
|
270
|
+
|
|
271
|
+
// Player indicator LEDs — 5 white LEDs, individually addressable
|
|
272
|
+
controller.playerLeds.set(PlayerID.Player1); // Use a preset pattern
|
|
273
|
+
controller.playerLeds.setLed(0, true); // Toggle individual LEDs (0–4)
|
|
274
|
+
controller.playerLeds.setLed(4, true);
|
|
275
|
+
controller.playerLeds.clear(); // All off
|
|
276
|
+
controller.playerLeds.setBrightness(Brightness.Medium); // High, Medium, or Low
|
|
277
|
+
|
|
278
|
+
// Mute LED — read-only, reflects controller firmware state
|
|
279
|
+
controller.mute.status.on("change", ({ state }) => {
|
|
280
|
+
console.log(`Mute: ${state ? "muted" : "unmuted"}`);
|
|
281
|
+
});
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
The `{r, g, b}` format is directly compatible with popular color libraries — pass the output of `colord().toRgb()`, `tinycolor().toRgb()`, or `Color().object()` straight to `lightbar.set()`.
|
|
285
|
+
|
|
286
|
+
The mute LED cannot be controlled (the firmware toggles it on and off with the button) but you can read its current state. `controller.mute` allows you to read the button like a normal input, while `controller.mute.status` is a toggle input tied to the LED's state.
|
|
287
|
+
|
|
151
288
|
### With React
|
|
152
289
|
|
|
153
290
|
Check out [the example app](./webhid_example/) for more details.
|
|
@@ -184,10 +321,9 @@ import { DualsenseContext } from "./DualsenseContext";
|
|
|
184
321
|
export const RequestController = () => {
|
|
185
322
|
const controller = useContext(DualsenseContext);
|
|
186
323
|
return (
|
|
187
|
-
<button
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
/>
|
|
324
|
+
<button onClick={controller.hid.provider.getRequest()}>
|
|
325
|
+
Grant Permission
|
|
326
|
+
</button>
|
|
191
327
|
);
|
|
192
328
|
};
|
|
193
329
|
```
|
|
@@ -211,7 +347,7 @@ export const ControllerConnection = () => {
|
|
|
211
347
|
|
|
212
348
|
return (
|
|
213
349
|
<p dir={triangle ? "ltr" : "rtl"}>{`Controller ${
|
|
214
|
-
|
|
350
|
+
connected ? "" : "dis"
|
|
215
351
|
}connected`}</p>
|
|
216
352
|
);
|
|
217
353
|
};
|
|
@@ -221,7 +357,17 @@ export const ControllerConnection = () => {
|
|
|
221
357
|
|
|
222
358
|
Try out the [example app](https://nsfm.github.io/dualsense-ts/)'s debugger to look for clues. Please open an issue on Github if you have questions or something doesn't seem right.
|
|
223
359
|
|
|
224
|
-
If
|
|
360
|
+
If something seems wrong, use the debugger to view the report buffer. Collect a few buffers in different states if possible. Please provide your controller's model number in the report - it's located on the back. Some versions have unique quirks.
|
|
361
|
+
|
|
362
|
+
## Other Dualsense Variants
|
|
363
|
+
|
|
364
|
+
The Dualsense FlexStrike and Dualsense Access controllers are not yet supported. This functionality is on the roadmap.
|
|
365
|
+
|
|
366
|
+
The PS4 Dualshock controller is not supported.
|
|
367
|
+
|
|
368
|
+
## Multiplayer
|
|
369
|
+
|
|
370
|
+
Multiple controllers are not yet supported. This functionality is coming soon.
|
|
225
371
|
|
|
226
372
|
## Migration Guide
|
|
227
373
|
|
package/dist/dualsense.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Momentary, Dpad, DpadParams, Mute, Unisense, UnisenseParams, Touchpad, Gyroscope, GyroscopeParams, Accelerometer, AccelerometerParams } from "./elements";
|
|
1
|
+
import { Momentary, Dpad, DpadParams, Mute, Unisense, UnisenseParams, Touchpad, Gyroscope, GyroscopeParams, Accelerometer, AccelerometerParams, Battery, BatteryParams, Lightbar, PlayerLeds } from "./elements";
|
|
2
2
|
import { Input, InputParams } from "./input";
|
|
3
3
|
import { DualsenseHID } from "./hid";
|
|
4
4
|
import { Intensity } from "./math";
|
|
@@ -34,6 +34,8 @@ export interface DualsenseParams extends InputParams {
|
|
|
34
34
|
gyroscope?: GyroscopeParams;
|
|
35
35
|
/** Settings for the accelerometer */
|
|
36
36
|
accelerometer?: AccelerometerParams;
|
|
37
|
+
/** Settings for the battery */
|
|
38
|
+
battery?: BatteryParams;
|
|
37
39
|
}
|
|
38
40
|
/** Represents a Dualsense controller */
|
|
39
41
|
export declare class Dualsense extends Input<Dualsense> {
|
|
@@ -66,13 +68,25 @@ export declare class Dualsense extends Input<Dualsense> {
|
|
|
66
68
|
readonly gyroscope: Gyroscope;
|
|
67
69
|
/** Tracks the controller's linear acceleration */
|
|
68
70
|
readonly accelerometer: Accelerometer;
|
|
71
|
+
/** Battery level and charging status */
|
|
72
|
+
readonly battery: Battery;
|
|
73
|
+
/** The RGB light bar at the top of the controller */
|
|
74
|
+
readonly lightbar: Lightbar;
|
|
75
|
+
/** The 5 white player indicator LEDs */
|
|
76
|
+
readonly playerLeds: PlayerLeds;
|
|
77
|
+
/** Buffered battery reading, sampled on a slow cadence */
|
|
78
|
+
private readonly pendingBattery;
|
|
69
79
|
/** Represents the underlying HID device. Provides input events */
|
|
70
80
|
readonly hid: DualsenseHID;
|
|
71
81
|
/** A virtual button representing whether or not a controller is connected */
|
|
72
82
|
readonly connection: Momentary;
|
|
73
83
|
get active(): boolean;
|
|
84
|
+
/** Returns `true` if the controller is connected via Bluetooth */
|
|
85
|
+
get wireless(): boolean;
|
|
74
86
|
constructor(params?: DualsenseParams);
|
|
75
87
|
private get rumbleIntensity();
|
|
88
|
+
/** Reset adaptive trigger feedback on both sides to the default linear feel */
|
|
89
|
+
resetTriggerFeedback(): void;
|
|
76
90
|
/** Check or adjust rumble intensity evenly across both sides of the controller */
|
|
77
91
|
rumble(intensity?: Intensity): number;
|
|
78
92
|
/** Distributes HID event values to the controller's inputs */
|
package/dist/dualsense.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dualsense.d.ts","sourceRoot":"","sources":["../src/dualsense.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,IAAI,EACJ,UAAU,EACV,IAAI,EACJ,QAAQ,EACR,cAAc,EACd,QAAQ,EACR,SAAS,EACT,eAAe,EACf,aAAa,EACb,mBAAmB,
|
|
1
|
+
{"version":3,"file":"dualsense.d.ts","sourceRoot":"","sources":["../src/dualsense.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,IAAI,EACJ,UAAU,EACV,IAAI,EACJ,QAAQ,EACR,cAAc,EACd,QAAQ,EACR,SAAS,EACT,eAAe,EACf,aAAa,EACb,mBAAmB,EACnB,OAAO,EACP,aAAa,EACb,QAAQ,EACR,UAAU,EACX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,KAAK,EAAY,WAAW,EAAE,MAAM,SAAS,CAAC;AACvD,OAAO,EAEL,YAAY,EAKb,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEnC,oEAAoE;AACpE,MAAM,WAAW,eAAgB,SAAQ,WAAW;IAClD,oEAAoE;IACpE,GAAG,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC1B,0CAA0C;IAC1C,EAAE,CAAC,EAAE,WAAW,CAAC;IACjB,mCAAmC;IACnC,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,sCAAsC;IACtC,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,qCAAqC;IACrC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,qCAAqC;IACrC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,oCAAoC;IACpC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,qCAAqC;IACrC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,oCAAoC;IACpC,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,6DAA6D;IAC7D,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,8DAA8D;IAC9D,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,iCAAiC;IACjC,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,qCAAqC;IACrC,aAAa,CAAC,EAAE,mBAAmB,CAAC;IACpC,+BAA+B;IAC/B,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAED,wCAAwC;AACxC,qBAAa,SAAU,SAAQ,KAAK,CAAC,SAAS,CAAC;IAC7C,SAAgB,KAAK,EAAE,SAAS,CAAQ;IAExC,6BAA6B;IAC7B,SAAgB,EAAE,EAAE,SAAS,CAAC;IAC9B,uCAAuC;IACvC,SAAgB,IAAI,EAAE,IAAI,CAAC;IAC3B,yBAAyB;IACzB,SAAgB,OAAO,EAAE,SAAS,CAAC;IACnC,wBAAwB;IACxB,SAAgB,MAAM,EAAE,SAAS,CAAC;IAClC,0BAA0B;IAC1B,SAAgB,QAAQ,EAAE,SAAS,CAAC;IACpC,wBAAwB;IACxB,SAAgB,MAAM,EAAE,SAAS,CAAC;IAClC,6BAA6B;IAC7B,SAAgB,KAAK,EAAE,SAAS,CAAC;IACjC,wBAAwB;IACxB,SAAgB,MAAM,EAAE,SAAS,CAAC;IAClC,0CAA0C;IAC1C,SAAgB,IAAI,EAAE,IAAI,CAAC;IAC3B,gDAAgD;IAChD,SAAgB,IAAI,EAAE,QAAQ,CAAC;IAC/B,iDAAiD;IACjD,SAAgB,KAAK,EAAE,QAAQ,CAAC;IAChC,uDAAuD;IACvD,SAAgB,QAAQ,EAAE,QAAQ,CAAC;IACnC,+CAA+C;IAC/C,SAAgB,SAAS,EAAE,SAAS,CAAC;IACrC,kDAAkD;IAClD,SAAgB,aAAa,EAAE,aAAa,CAAC;IAC7C,wCAAwC;IACxC,SAAgB,OAAO,EAAE,OAAO,CAAC;IACjC,qDAAqD;IACrD,SAAgB,QAAQ,WAAkB;IAC1C,wCAAwC;IACxC,SAAgB,UAAU,aAAoB;IAE9C,0DAA0D;IAC1D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAG7B;IAEF,kEAAkE;IAClE,SAAgB,GAAG,EAAE,YAAY,CAAC;IAElC,6EAA6E;IAC7E,SAAgB,UAAU,EAAE,SAAS,CAAC;IAEtC,IAAW,MAAM,IAAI,OAAO,CAI3B;IAED,kEAAkE;IAClE,IAAW,QAAQ,IAAI,OAAO,CAE7B;gBAEW,MAAM,GAAE,eAAoB;IAqLxC,OAAO,KAAK,eAAe,GAE1B;IAED,+EAA+E;IACxE,oBAAoB,IAAI,IAAI;IAKnC,kFAAkF;IAC3E,MAAM,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,MAAM;IAM5C,8DAA8D;IAC9D,OAAO,CAAC,UAAU;CAuDnB"}
|
package/dist/dualsense.js
CHANGED
|
@@ -9,9 +9,22 @@ class Dualsense extends input_1.Input {
|
|
|
9
9
|
get active() {
|
|
10
10
|
return Object.values(this).some((input) => input !== this && input instanceof input_1.Input && input.active);
|
|
11
11
|
}
|
|
12
|
+
/** Returns `true` if the controller is connected via Bluetooth */
|
|
13
|
+
get wireless() {
|
|
14
|
+
return this.hid.wireless;
|
|
15
|
+
}
|
|
12
16
|
constructor(params = {}) {
|
|
13
17
|
super(params);
|
|
14
18
|
this.state = this;
|
|
19
|
+
/** The RGB light bar at the top of the controller */
|
|
20
|
+
this.lightbar = new elements_1.Lightbar();
|
|
21
|
+
/** The 5 white player indicator LEDs */
|
|
22
|
+
this.playerLeds = new elements_1.PlayerLeds();
|
|
23
|
+
/** Buffered battery reading, sampled on a slow cadence */
|
|
24
|
+
this.pendingBattery = {
|
|
25
|
+
peakLevel: 0,
|
|
26
|
+
status: hid_1.ChargeStatus.Discharging,
|
|
27
|
+
};
|
|
15
28
|
this.ps = new elements_1.Momentary({
|
|
16
29
|
icon: "㎰",
|
|
17
30
|
name: "Home",
|
|
@@ -89,34 +102,100 @@ class Dualsense extends input_1.Input {
|
|
|
89
102
|
threshold: 0.01,
|
|
90
103
|
...(params.accelerometer ?? {}),
|
|
91
104
|
});
|
|
105
|
+
this.battery = new elements_1.Battery({
|
|
106
|
+
icon: "🔋",
|
|
107
|
+
name: "Battery",
|
|
108
|
+
...(params.battery ?? {}),
|
|
109
|
+
});
|
|
92
110
|
this.connection[input_1.InputSet](false);
|
|
93
111
|
this.hid = params.hid ?? new hid_1.DualsenseHID(new hid_1.PlatformHIDProvider());
|
|
94
112
|
this.hid.register((state) => {
|
|
95
113
|
this.processHID(state);
|
|
96
114
|
});
|
|
115
|
+
const rumbleMemo = { left: -1, right: -1 };
|
|
116
|
+
const triggerFeedbackMemo = { left: "", right: "" };
|
|
117
|
+
const lightbarMemo = { key: "" };
|
|
118
|
+
const playerLedsMemo = { key: "" };
|
|
97
119
|
/** Refresh connection state */
|
|
120
|
+
let lastConnected = false;
|
|
98
121
|
setInterval(() => {
|
|
99
122
|
const { provider: { connected }, } = this.hid;
|
|
100
123
|
this.connection[input_1.InputSet](connected);
|
|
124
|
+
if (connected && !lastConnected) {
|
|
125
|
+
// Invalidate memos so the output loop restores desired state on reconnect.
|
|
126
|
+
triggerFeedbackMemo.left = "";
|
|
127
|
+
triggerFeedbackMemo.right = "";
|
|
128
|
+
lightbarMemo.key = "";
|
|
129
|
+
playerLedsMemo.key = "";
|
|
130
|
+
}
|
|
131
|
+
lastConnected = connected;
|
|
101
132
|
if (!connected)
|
|
102
133
|
this.hid.provider.connect();
|
|
103
134
|
}, 200);
|
|
104
|
-
/** Refresh
|
|
105
|
-
|
|
135
|
+
/** Refresh battery state on a slow cadence to filter transient glitches */
|
|
136
|
+
setInterval(() => {
|
|
137
|
+
if (!this.connection.active)
|
|
138
|
+
return;
|
|
139
|
+
this.battery.level[input_1.InputSet](this.pendingBattery.peakLevel);
|
|
140
|
+
this.battery.status[input_1.InputSet](this.pendingBattery.status);
|
|
141
|
+
this.pendingBattery.peakLevel = 0;
|
|
142
|
+
}, 1000);
|
|
143
|
+
/** Refresh output state (rumble + trigger feedback) */
|
|
106
144
|
setInterval(() => {
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
rumbleMemo.
|
|
145
|
+
if (!this.connection.active)
|
|
146
|
+
return;
|
|
147
|
+
const leftRumble = this.left.rumble();
|
|
148
|
+
const rightRumble = this.right.rumble();
|
|
149
|
+
if (leftRumble !== rumbleMemo.left || rightRumble !== rumbleMemo.right) {
|
|
150
|
+
this.hid.setRumble(leftRumble * 255, rightRumble * 255);
|
|
151
|
+
rumbleMemo.left = leftRumble;
|
|
152
|
+
rumbleMemo.right = rightRumble;
|
|
153
|
+
}
|
|
154
|
+
const leftFeedback = this.left.trigger.feedback;
|
|
155
|
+
const rightFeedback = this.right.trigger.feedback;
|
|
156
|
+
const leftKey = leftFeedback.toKey();
|
|
157
|
+
const rightKey = rightFeedback.toKey();
|
|
158
|
+
const feedbackChanged = leftKey !== triggerFeedbackMemo.left ||
|
|
159
|
+
rightKey !== triggerFeedbackMemo.right;
|
|
160
|
+
if (feedbackChanged) {
|
|
161
|
+
// Force rumble into the same batch so MotorPower scope bit is always present.
|
|
162
|
+
this.hid.setRumble(leftRumble * 255, rightRumble * 255);
|
|
163
|
+
rumbleMemo.left = leftRumble;
|
|
164
|
+
rumbleMemo.right = rightRumble;
|
|
165
|
+
}
|
|
166
|
+
if (leftKey !== triggerFeedbackMemo.left) {
|
|
167
|
+
this.hid.setLeftTriggerFeedback(leftFeedback.toBytes());
|
|
168
|
+
triggerFeedbackMemo.left = leftKey;
|
|
169
|
+
}
|
|
170
|
+
if (rightKey !== triggerFeedbackMemo.right) {
|
|
171
|
+
this.hid.setRightTriggerFeedback(rightFeedback.toBytes());
|
|
172
|
+
triggerFeedbackMemo.right = rightKey;
|
|
173
|
+
}
|
|
174
|
+
const lightbarKey = this.lightbar.toKey();
|
|
175
|
+
if (lightbarKey !== lightbarMemo.key) {
|
|
176
|
+
const { r, g, b } = this.lightbar.color;
|
|
177
|
+
this.hid.setLightbar(r, g, b);
|
|
178
|
+
lightbarMemo.key = lightbarKey;
|
|
179
|
+
}
|
|
180
|
+
const pulse = this.lightbar.consumePulse();
|
|
181
|
+
if (pulse !== hid_1.PulseOptions.Off) {
|
|
182
|
+
this.hid.setLightbar(0, 0, 0, pulse);
|
|
183
|
+
}
|
|
184
|
+
const playerLedsKey = this.playerLeds.toKey();
|
|
185
|
+
if (playerLedsKey !== playerLedsMemo.key) {
|
|
186
|
+
this.hid.setPlayerLeds(this.playerLeds.bitmask, this.playerLeds.brightness);
|
|
187
|
+
playerLedsMemo.key = playerLedsKey;
|
|
114
188
|
}
|
|
115
189
|
}, 1000 / 30);
|
|
116
190
|
}
|
|
117
191
|
get rumbleIntensity() {
|
|
118
192
|
return (this.left.rumble() + this.right.rumble()) / 2;
|
|
119
193
|
}
|
|
194
|
+
/** Reset adaptive trigger feedback on both sides to the default linear feel */
|
|
195
|
+
resetTriggerFeedback() {
|
|
196
|
+
this.left.trigger.feedback.reset();
|
|
197
|
+
this.right.trigger.feedback.reset();
|
|
198
|
+
}
|
|
120
199
|
/** Check or adjust rumble intensity evenly across both sides of the controller */
|
|
121
200
|
rumble(intensity) {
|
|
122
201
|
this.left.rumble(intensity);
|
|
@@ -129,7 +208,7 @@ class Dualsense extends input_1.Input {
|
|
|
129
208
|
this.options[input_1.InputSet](state["Options" /* InputId.Options */]);
|
|
130
209
|
this.create[input_1.InputSet](state["Create" /* InputId.Create */]);
|
|
131
210
|
this.mute[input_1.InputSet](state["Mute" /* InputId.Mute */]);
|
|
132
|
-
this.mute.status[input_1.InputSet](state["
|
|
211
|
+
this.mute.status[input_1.InputSet](state["MuteLed" /* InputId.MuteLed */]);
|
|
133
212
|
this.triangle[input_1.InputSet](state["Triangle" /* InputId.Triangle */]);
|
|
134
213
|
this.circle[input_1.InputSet](state["Circle" /* InputId.Circle */]);
|
|
135
214
|
this.cross[input_1.InputSet](state["Cross" /* InputId.Cross */]);
|
|
@@ -165,6 +244,11 @@ class Dualsense extends input_1.Input {
|
|
|
165
244
|
this.accelerometer.x[input_1.InputSet](state["AccelX" /* InputId.AccelX */]);
|
|
166
245
|
this.accelerometer.y[input_1.InputSet](state["AccelY" /* InputId.AccelY */]);
|
|
167
246
|
this.accelerometer.z[input_1.InputSet](state["AccelZ" /* InputId.AccelZ */]);
|
|
247
|
+
const level = state["BatteryLevel" /* InputId.BatteryLevel */];
|
|
248
|
+
if (level > this.pendingBattery.peakLevel) {
|
|
249
|
+
this.pendingBattery.peakLevel = level;
|
|
250
|
+
}
|
|
251
|
+
this.pendingBattery.status = state["BatteryStatus" /* InputId.BatteryStatus */];
|
|
168
252
|
}
|
|
169
253
|
}
|
|
170
254
|
exports.Dualsense = Dualsense;
|
package/dist/dualsense.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dualsense.js","sourceRoot":"","sources":["../src/dualsense.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dualsense.js","sourceRoot":"","sources":["../src/dualsense.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Input, InputParams } from "../input";
|
|
2
|
+
import { Intensity } from "../math";
|
|
3
|
+
import { ChargeStatus } from "../hid/battery_state";
|
|
4
|
+
/** Tracks the controller's battery charge level as a 0–1 intensity */
|
|
5
|
+
export declare class BatteryLevel extends Input<Intensity> {
|
|
6
|
+
state: Intensity;
|
|
7
|
+
get active(): boolean;
|
|
8
|
+
}
|
|
9
|
+
/** Tracks the controller's charging status */
|
|
10
|
+
export declare class BatteryStatus extends Input<ChargeStatus> {
|
|
11
|
+
state: ChargeStatus;
|
|
12
|
+
get active(): boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface BatteryParams extends InputParams {
|
|
15
|
+
level?: InputParams;
|
|
16
|
+
status?: InputParams;
|
|
17
|
+
}
|
|
18
|
+
/** Groups battery level and charging status */
|
|
19
|
+
export declare class Battery extends Input<Battery> {
|
|
20
|
+
readonly state: Battery;
|
|
21
|
+
/** Battery charge level, normalized 0–1 */
|
|
22
|
+
readonly level: BatteryLevel;
|
|
23
|
+
/** Current charging status */
|
|
24
|
+
readonly status: BatteryStatus;
|
|
25
|
+
get active(): boolean;
|
|
26
|
+
constructor(params?: BatteryParams);
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=battery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"battery.d.ts","sourceRoot":"","sources":["../../src/elements/battery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,sEAAsE;AACtE,qBAAa,YAAa,SAAQ,KAAK,CAAC,SAAS,CAAC;IACzC,KAAK,EAAE,SAAS,CAAK;IAE5B,IAAW,MAAM,IAAI,OAAO,CAE3B;CACF;AAED,8CAA8C;AAC9C,qBAAa,aAAc,SAAQ,KAAK,CAAC,YAAY,CAAC;IAC7C,KAAK,EAAE,YAAY,CAA4B;IAEtD,IAAW,MAAM,IAAI,OAAO,CAE3B;CACF;AAED,MAAM,WAAW,aAAc,SAAQ,WAAW;IAChD,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,+CAA+C;AAC/C,qBAAa,OAAQ,SAAQ,KAAK,CAAC,OAAO,CAAC;IACzC,SAAgB,KAAK,EAAE,OAAO,CAAQ;IAEtC,2CAA2C;IAC3C,SAAgB,KAAK,EAAE,YAAY,CAAC;IACpC,8BAA8B;IAC9B,SAAgB,MAAM,EAAE,aAAa,CAAC;IAEtC,IAAW,MAAM,IAAI,OAAO,CAE3B;gBAEW,MAAM,GAAE,aAAkB;CAavC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Battery = exports.BatteryStatus = exports.BatteryLevel = void 0;
|
|
4
|
+
const input_1 = require("../input");
|
|
5
|
+
const battery_state_1 = require("../hid/battery_state");
|
|
6
|
+
/** Tracks the controller's battery charge level as a 0–1 intensity */
|
|
7
|
+
class BatteryLevel extends input_1.Input {
|
|
8
|
+
constructor() {
|
|
9
|
+
super(...arguments);
|
|
10
|
+
this.state = 0;
|
|
11
|
+
}
|
|
12
|
+
get active() {
|
|
13
|
+
return this.state > 0;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.BatteryLevel = BatteryLevel;
|
|
17
|
+
/** Tracks the controller's charging status */
|
|
18
|
+
class BatteryStatus extends input_1.Input {
|
|
19
|
+
constructor() {
|
|
20
|
+
super(...arguments);
|
|
21
|
+
this.state = battery_state_1.ChargeStatus.Discharging;
|
|
22
|
+
}
|
|
23
|
+
get active() {
|
|
24
|
+
return this.state === battery_state_1.ChargeStatus.Charging;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.BatteryStatus = BatteryStatus;
|
|
28
|
+
/** Groups battery level and charging status */
|
|
29
|
+
class Battery extends input_1.Input {
|
|
30
|
+
get active() {
|
|
31
|
+
return this.level.active || this.status.active;
|
|
32
|
+
}
|
|
33
|
+
constructor(params = {}) {
|
|
34
|
+
super(params);
|
|
35
|
+
this.state = this;
|
|
36
|
+
this.level = new BatteryLevel({
|
|
37
|
+
icon: "🔋",
|
|
38
|
+
name: "BatteryLevel",
|
|
39
|
+
...(params.level ?? {}),
|
|
40
|
+
});
|
|
41
|
+
this.status = new BatteryStatus({
|
|
42
|
+
icon: "🔌",
|
|
43
|
+
name: "BatteryStatus",
|
|
44
|
+
...(params.status ?? {}),
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
exports.Battery = Battery;
|
|
49
|
+
//# sourceMappingURL=battery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"battery.js","sourceRoot":"","sources":["../../src/elements/battery.ts"],"names":[],"mappings":";;;AAAA,oCAA8C;AAE9C,wDAAoD;AAEpD,sEAAsE;AACtE,MAAa,YAAa,SAAQ,aAAgB;IAAlD;;QACS,UAAK,GAAc,CAAC,CAAC;IAK9B,CAAC;IAHC,IAAW,MAAM;QACf,OAAO,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IACxB,CAAC;CACF;AAND,oCAMC;AAED,8CAA8C;AAC9C,MAAa,aAAc,SAAQ,aAAmB;IAAtD;;QACS,UAAK,GAAiB,4BAAY,CAAC,WAAW,CAAC;IAKxD,CAAC;IAHC,IAAW,MAAM;QACf,OAAO,IAAI,CAAC,KAAK,KAAK,4BAAY,CAAC,QAAQ,CAAC;IAC9C,CAAC;CACF;AAND,sCAMC;AAOD,+CAA+C;AAC/C,MAAa,OAAQ,SAAQ,aAAc;IAQzC,IAAW,MAAM;QACf,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IACjD,CAAC;IAED,YAAY,SAAwB,EAAE;QACpC,KAAK,CAAC,MAAM,CAAC,CAAC;QAZA,UAAK,GAAY,IAAI,CAAC;QAapC,IAAI,CAAC,KAAK,GAAG,IAAI,YAAY,CAAC;YAC5B,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,cAAc;YACpB,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;SACxB,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,aAAa,CAAC;YAC9B,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,eAAe;YACrB,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;SACzB,CAAC,CAAC;IACL,CAAC;CACF;AAzBD,0BAyBC"}
|