@myerscarpenter/quest-dev 1.1.0 → 1.2.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/build/commands/battery.d.ts +9 -0
- package/build/commands/battery.d.ts.map +1 -0
- package/build/commands/battery.js +31 -0
- package/build/commands/battery.js.map +1 -0
- package/build/commands/open.d.ts +1 -1
- package/build/commands/open.d.ts.map +1 -1
- package/build/commands/open.js +14 -14
- package/build/commands/open.js.map +1 -1
- package/build/commands/screenshot.d.ts +1 -1
- package/build/commands/screenshot.d.ts.map +1 -1
- package/build/commands/screenshot.js +55 -9
- package/build/commands/screenshot.js.map +1 -1
- package/build/commands/stay-awake.d.ts +14 -0
- package/build/commands/stay-awake.d.ts.map +1 -0
- package/build/commands/stay-awake.js +234 -0
- package/build/commands/stay-awake.js.map +1 -0
- package/build/index.js +49 -5
- package/build/index.js.map +1 -1
- package/build/utils/adb.d.ts +12 -7
- package/build/utils/adb.d.ts.map +1 -1
- package/build/utils/adb.js +138 -30
- package/build/utils/adb.js.map +1 -1
- package/build/utils/filename.d.ts +9 -0
- package/build/utils/filename.d.ts.map +1 -0
- package/build/utils/filename.js +17 -0
- package/build/utils/filename.js.map +1 -0
- package/build/utils/filename.test.d.ts +5 -0
- package/build/utils/filename.test.d.ts.map +1 -0
- package/build/utils/filename.test.js +40 -0
- package/build/utils/filename.test.js.map +1 -0
- package/package.json +2 -1
- package/src/commands/battery.ts +34 -0
- package/src/commands/open.ts +18 -14
- package/src/commands/screenshot.ts +61 -9
- package/src/commands/stay-awake.ts +254 -0
- package/src/index.ts +77 -9
- package/src/utils/adb.ts +148 -30
- package/src/utils/filename.test.ts +55 -0
- package/src/utils/filename.ts +18 -0
- package/tests/adb.test.ts +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"battery.d.ts","sourceRoot":"","sources":["../../src/commands/battery.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAuBpD"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Quest battery command
|
|
3
|
+
* Shows battery percentage and charging status
|
|
4
|
+
*/
|
|
5
|
+
import { checkADBPath, getBatteryStatus } from '../utils/adb.js';
|
|
6
|
+
/**
|
|
7
|
+
* Main battery command handler
|
|
8
|
+
*/
|
|
9
|
+
export async function batteryCommand() {
|
|
10
|
+
// Check prerequisites (silent)
|
|
11
|
+
checkADBPath();
|
|
12
|
+
// Check devices without verbose output
|
|
13
|
+
try {
|
|
14
|
+
const { execCommand } = await import('../utils/exec.js');
|
|
15
|
+
const output = await execCommand('adb', ['devices']);
|
|
16
|
+
const lines = output.trim().split('\n').slice(1);
|
|
17
|
+
const devices = lines.filter(line => line.trim() && !line.includes('List of devices'));
|
|
18
|
+
if (devices.length === 0) {
|
|
19
|
+
console.error('Error: No ADB devices connected');
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
console.error('Error: Failed to list ADB devices');
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
// Get and display battery status
|
|
28
|
+
const status = await getBatteryStatus();
|
|
29
|
+
console.log(status);
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=battery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"battery.js","sourceRoot":"","sources":["../../src/commands/battery.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAmB,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAElF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,+BAA+B;IAC/B,YAAY,EAAE,CAAC;IAEf,uCAAuC;IACvC,IAAI,CAAC;QACH,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAEvF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;YACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,iCAAiC;IACjC,MAAM,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACtB,CAAC"}
|
package/build/commands/open.d.ts
CHANGED
|
@@ -5,5 +5,5 @@
|
|
|
5
5
|
/**
|
|
6
6
|
* Main open command handler
|
|
7
7
|
*/
|
|
8
|
-
export declare function openCommand(url: string, closeOthers?: boolean): Promise<void>;
|
|
8
|
+
export declare function openCommand(url: string, closeOthers?: boolean, browser?: string): Promise<void>;
|
|
9
9
|
//# sourceMappingURL=open.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"open.d.ts","sourceRoot":"","sources":["../../src/commands/open.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA0IH;;GAEG;AACH,wBAAsB,WAAW,
|
|
1
|
+
{"version":3,"file":"open.d.ts","sourceRoot":"","sources":["../../src/commands/open.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA0IH;;GAEG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,MAAM,EACX,WAAW,GAAE,OAAe,EAC5B,OAAO,GAAE,MAA6B,GACrC,OAAO,CAAC,IAAI,CAAC,CAkEf"}
|
package/build/commands/open.js
CHANGED
|
@@ -7,8 +7,8 @@ import { execCommandFull } from '../utils/exec.js';
|
|
|
7
7
|
/**
|
|
8
8
|
* Close all tabs except the one with the target URL
|
|
9
9
|
*/
|
|
10
|
-
async function closeOtherTabs(targetUrl) {
|
|
11
|
-
const cdpPort = getCDPPort();
|
|
10
|
+
async function closeOtherTabs(targetUrl, browser) {
|
|
11
|
+
const cdpPort = await getCDPPort(browser);
|
|
12
12
|
try {
|
|
13
13
|
// Get list of tabs
|
|
14
14
|
const result = await execCommandFull('cdp-cli', ['--cdp-url', `http://localhost:${cdpPort}`, 'tabs']);
|
|
@@ -52,8 +52,8 @@ async function closeOtherTabs(targetUrl) {
|
|
|
52
52
|
/**
|
|
53
53
|
* Try to navigate or reload existing tab via cdp-cli
|
|
54
54
|
*/
|
|
55
|
-
async function tryNavigateExistingTab(targetUrl) {
|
|
56
|
-
const cdpPort = getCDPPort();
|
|
55
|
+
async function tryNavigateExistingTab(targetUrl, browser) {
|
|
56
|
+
const cdpPort = await getCDPPort(browser);
|
|
57
57
|
try {
|
|
58
58
|
// Get list of tabs using cdp-cli
|
|
59
59
|
const result = await execCommandFull('cdp-cli', ['--cdp-url', `http://localhost:${cdpPort}`, 'tabs']);
|
|
@@ -115,7 +115,7 @@ async function tryNavigateExistingTab(targetUrl) {
|
|
|
115
115
|
/**
|
|
116
116
|
* Main open command handler
|
|
117
117
|
*/
|
|
118
|
-
export async function openCommand(url, closeOthers = false) {
|
|
118
|
+
export async function openCommand(url, closeOthers = false, browser = 'com.oculus.browser') {
|
|
119
119
|
// Parse URL to determine if we need reverse port forwarding
|
|
120
120
|
let parsedUrl;
|
|
121
121
|
try {
|
|
@@ -145,25 +145,25 @@ export async function openCommand(url, closeOthers = false) {
|
|
|
145
145
|
// Set up port forwarding
|
|
146
146
|
if (port !== null) {
|
|
147
147
|
// Localhost URL: need reverse forwarding so Quest can reach the dev server
|
|
148
|
-
await ensurePortForwarding(port);
|
|
148
|
+
await ensurePortForwarding(port, browser);
|
|
149
149
|
}
|
|
150
150
|
else {
|
|
151
151
|
// External URL: only need CDP forwarding to control the browser
|
|
152
|
-
await ensureCDPForwarding();
|
|
152
|
+
await ensureCDPForwarding(browser);
|
|
153
153
|
}
|
|
154
154
|
// Check if browser is running
|
|
155
|
-
const browserRunning = await isBrowserRunning();
|
|
155
|
+
const browserRunning = await isBrowserRunning(browser);
|
|
156
156
|
if (!browserRunning) {
|
|
157
|
-
console.log('
|
|
158
|
-
await launchBrowser(url);
|
|
157
|
+
console.log('Browser is not running');
|
|
158
|
+
await launchBrowser(url, browser);
|
|
159
159
|
}
|
|
160
160
|
else {
|
|
161
|
-
console.log('
|
|
161
|
+
console.log('Browser is already running');
|
|
162
162
|
// Try to navigate existing or blank tab via cdp-cli first
|
|
163
|
-
const navigated = await tryNavigateExistingTab(url);
|
|
163
|
+
const navigated = await tryNavigateExistingTab(url, browser);
|
|
164
164
|
if (!navigated) {
|
|
165
165
|
console.log('No existing or blank tab found, opening URL...');
|
|
166
|
-
await launchBrowser(url);
|
|
166
|
+
await launchBrowser(url, browser);
|
|
167
167
|
}
|
|
168
168
|
}
|
|
169
169
|
// Close other tabs if requested
|
|
@@ -171,7 +171,7 @@ export async function openCommand(url, closeOthers = false) {
|
|
|
171
171
|
// Wait for browser to stabilize after launch/navigation
|
|
172
172
|
console.log('Waiting for browser to stabilize...');
|
|
173
173
|
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
174
|
-
await closeOtherTabs(url);
|
|
174
|
+
await closeOtherTabs(url, browser);
|
|
175
175
|
}
|
|
176
176
|
console.log('\nDone!\n');
|
|
177
177
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"open.js","sourceRoot":"","sources":["../../src/commands/open.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,YAAY,EACZ,eAAe,EACf,oBAAoB,EACpB,mBAAmB,EACnB,gBAAgB,EAChB,aAAa,EACb,UAAU,EACX,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAe,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEhE;;GAEG;AACH,KAAK,UAAU,cAAc,CAAC,SAAiB;
|
|
1
|
+
{"version":3,"file":"open.js","sourceRoot":"","sources":["../../src/commands/open.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,5 +5,5 @@
|
|
|
5
5
|
/**
|
|
6
6
|
* Main screenshot command handler
|
|
7
7
|
*/
|
|
8
|
-
export declare function screenshotCommand(
|
|
8
|
+
export declare function screenshotCommand(directoryPath: string, caption: string | undefined): Promise<void>;
|
|
9
9
|
//# sourceMappingURL=screenshot.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screenshot.d.ts","sourceRoot":"","sources":["../../src/commands/screenshot.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"screenshot.d.ts","sourceRoot":"","sources":["../../src/commands/screenshot.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiJH;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAyEzG"}
|
|
@@ -2,9 +2,30 @@
|
|
|
2
2
|
* Quest screenshot command
|
|
3
3
|
* Triggers Quest's native screenshot service and pulls the file
|
|
4
4
|
*/
|
|
5
|
-
import { resolve } from 'path';
|
|
5
|
+
import { resolve, join } from 'path';
|
|
6
|
+
import { existsSync, statSync } from 'fs';
|
|
6
7
|
import { checkADBPath, checkADBDevices, checkUSBFileTransfer, checkQuestAwake } from '../utils/adb.js';
|
|
7
8
|
import { execCommand, execCommandFull } from '../utils/exec.js';
|
|
9
|
+
import { generateScreenshotFilename } from '../utils/filename.js';
|
|
10
|
+
/**
|
|
11
|
+
* Validate directory exists and is writable
|
|
12
|
+
*/
|
|
13
|
+
function validateDirectory(dirPath) {
|
|
14
|
+
const resolvedPath = resolve(dirPath);
|
|
15
|
+
if (!existsSync(resolvedPath)) {
|
|
16
|
+
console.error(`Error: Directory does not exist: ${resolvedPath}`);
|
|
17
|
+
console.error('');
|
|
18
|
+
console.error('Please create the directory first.');
|
|
19
|
+
console.error('');
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
const stat = statSync(resolvedPath);
|
|
23
|
+
if (!stat.isDirectory()) {
|
|
24
|
+
console.error(`Error: Path is not a directory: ${resolvedPath}`);
|
|
25
|
+
console.error('');
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
8
29
|
/**
|
|
9
30
|
* Trigger Quest screenshot service
|
|
10
31
|
*/
|
|
@@ -100,12 +121,33 @@ async function deleteRemoteScreenshot(filename) {
|
|
|
100
121
|
console.log(`Deleted screenshot from Quest: ${filename}`);
|
|
101
122
|
}
|
|
102
123
|
}
|
|
124
|
+
/**
|
|
125
|
+
* Add caption to JPEG COM metadata
|
|
126
|
+
*/
|
|
127
|
+
async function addJpegMetadata(filePath, caption) {
|
|
128
|
+
try {
|
|
129
|
+
const { exiftool } = await import('exiftool-vendored');
|
|
130
|
+
await exiftool.write(filePath, { Comment: caption });
|
|
131
|
+
await exiftool.end();
|
|
132
|
+
console.log(`Caption added: "${caption}"`);
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
console.error('Warning: Failed to add caption metadata:', error.message);
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
103
140
|
/**
|
|
104
141
|
* Main screenshot command handler
|
|
105
142
|
*/
|
|
106
|
-
export async function screenshotCommand(
|
|
107
|
-
const
|
|
143
|
+
export async function screenshotCommand(directoryPath, caption) {
|
|
144
|
+
const resolvedDir = resolve(directoryPath);
|
|
108
145
|
console.log('\nQuest Screenshot\n');
|
|
146
|
+
// Validate directory (fail-fast before expensive ADB ops)
|
|
147
|
+
validateDirectory(resolvedDir);
|
|
148
|
+
// Generate filename
|
|
149
|
+
const localFilename = generateScreenshotFilename();
|
|
150
|
+
const outputPath = join(resolvedDir, localFilename);
|
|
109
151
|
// Check prerequisites
|
|
110
152
|
checkADBPath();
|
|
111
153
|
await checkADBDevices();
|
|
@@ -119,7 +161,7 @@ export async function screenshotCommand(outputPath) {
|
|
|
119
161
|
}
|
|
120
162
|
// Wait for screenshot to save and verify it's complete (has JPEG EOI marker)
|
|
121
163
|
console.log('Waiting for screenshot to save...');
|
|
122
|
-
let
|
|
164
|
+
let questFilename = null;
|
|
123
165
|
const maxAttempts = 20;
|
|
124
166
|
for (let i = 0; i < maxAttempts; i++) {
|
|
125
167
|
await new Promise(resolve => setTimeout(resolve, 500));
|
|
@@ -128,13 +170,13 @@ export async function screenshotCommand(outputPath) {
|
|
|
128
170
|
// Check that the JPEG is fully written (has EOI marker)
|
|
129
171
|
const complete = await isJpegComplete(newScreenshot);
|
|
130
172
|
if (complete) {
|
|
131
|
-
|
|
132
|
-
console.log(`Screenshot ready: ${
|
|
173
|
+
questFilename = newScreenshot;
|
|
174
|
+
console.log(`Screenshot ready: ${questFilename}`);
|
|
133
175
|
break;
|
|
134
176
|
}
|
|
135
177
|
}
|
|
136
178
|
}
|
|
137
|
-
if (!
|
|
179
|
+
if (!questFilename) {
|
|
138
180
|
console.error('Error: Screenshot was not created or is incomplete');
|
|
139
181
|
console.error('');
|
|
140
182
|
console.error('The screenshot service was triggered but no valid screenshot appeared.');
|
|
@@ -147,11 +189,15 @@ export async function screenshotCommand(outputPath) {
|
|
|
147
189
|
process.exit(1);
|
|
148
190
|
}
|
|
149
191
|
// Pull screenshot
|
|
150
|
-
if (!await pullScreenshot(
|
|
192
|
+
if (!await pullScreenshot(questFilename, outputPath)) {
|
|
151
193
|
process.exit(1);
|
|
152
194
|
}
|
|
195
|
+
// Add metadata (non-fatal, only if caption provided)
|
|
196
|
+
if (caption) {
|
|
197
|
+
await addJpegMetadata(outputPath, caption);
|
|
198
|
+
}
|
|
153
199
|
// Delete from Quest after successful pull
|
|
154
|
-
await deleteRemoteScreenshot(
|
|
200
|
+
await deleteRemoteScreenshot(questFilename);
|
|
155
201
|
console.log('\nDone!\n');
|
|
156
202
|
}
|
|
157
203
|
//# sourceMappingURL=screenshot.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screenshot.js","sourceRoot":"","sources":["../../src/commands/screenshot.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"screenshot.js","sourceRoot":"","sources":["../../src/commands/screenshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Quest stay-awake command
|
|
3
|
+
* Keeps Quest screen awake by setting screen timeout to 24 hours
|
|
4
|
+
* Restores original timeout on exit (Ctrl-C)
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Child watchdog process - polls for parent death and cleans up
|
|
8
|
+
*/
|
|
9
|
+
export declare function stayAwakeWatchdog(parentPid: number, originalTimeout: number): Promise<void>;
|
|
10
|
+
/**
|
|
11
|
+
* Main stay-awake command handler
|
|
12
|
+
*/
|
|
13
|
+
export declare function stayAwakeCommand(idleTimeout?: number): Promise<void>;
|
|
14
|
+
//# sourceMappingURL=stay-awake.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stay-awake.d.ts","sourceRoot":"","sources":["../../src/commands/stay-awake.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA6CH;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiCjG;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,WAAW,GAAE,MAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAmKlF"}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Quest stay-awake command
|
|
3
|
+
* Keeps Quest screen awake by setting screen timeout to 24 hours
|
|
4
|
+
* Restores original timeout on exit (Ctrl-C)
|
|
5
|
+
*/
|
|
6
|
+
import { checkADBPath } from '../utils/adb.js';
|
|
7
|
+
import { execCommand } from '../utils/exec.js';
|
|
8
|
+
import { execSync, spawn } from 'child_process';
|
|
9
|
+
import * as os from 'os';
|
|
10
|
+
import * as fs from 'fs';
|
|
11
|
+
/**
|
|
12
|
+
* Get current screen timeout setting
|
|
13
|
+
*/
|
|
14
|
+
async function getScreenTimeout() {
|
|
15
|
+
const output = await execCommand('adb', ['shell', 'settings', 'get', 'system', 'screen_off_timeout']);
|
|
16
|
+
return parseInt(output.trim(), 10);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Set screen timeout (in milliseconds)
|
|
20
|
+
*/
|
|
21
|
+
async function setScreenTimeout(timeout) {
|
|
22
|
+
await execCommand('adb', ['shell', 'settings', 'put', 'system', 'screen_off_timeout', timeout.toString()]);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Disable Quest proximity sensor (keeps screen on even when not worn)
|
|
26
|
+
*/
|
|
27
|
+
async function disableProximitySensor() {
|
|
28
|
+
await execCommand('adb', ['shell', 'am', 'broadcast', '-a', 'com.oculus.vrpowermanager.prox_close']);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Enable Quest proximity sensor (re-enable normal behavior)
|
|
32
|
+
* Note: automation_disable actually RE-ENABLES normal proximity sensor automation
|
|
33
|
+
*/
|
|
34
|
+
async function enableProximitySensor() {
|
|
35
|
+
await execCommand('adb', ['shell', 'am', 'broadcast', '-a', 'com.oculus.vrpowermanager.automation_disable']);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Wake the Quest screen
|
|
39
|
+
*/
|
|
40
|
+
async function wakeScreen() {
|
|
41
|
+
await execCommand('adb', ['shell', 'input', 'keyevent', 'KEYCODE_WAKEUP']);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Child watchdog process - polls for parent death and cleans up
|
|
45
|
+
*/
|
|
46
|
+
export async function stayAwakeWatchdog(parentPid, originalTimeout) {
|
|
47
|
+
const pollInterval = 5000; // Check every 5 seconds
|
|
48
|
+
const checkParent = setInterval(() => {
|
|
49
|
+
try {
|
|
50
|
+
// Check if parent process still exists
|
|
51
|
+
process.kill(parentPid, 0);
|
|
52
|
+
// Parent still alive, continue polling
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
// Parent is dead - perform cleanup
|
|
56
|
+
console.log('Parent process died, restoring Quest settings...');
|
|
57
|
+
clearInterval(checkParent);
|
|
58
|
+
// Restore settings synchronously
|
|
59
|
+
try {
|
|
60
|
+
execSync(`adb shell settings put system screen_off_timeout ${originalTimeout}`, { stdio: 'ignore' });
|
|
61
|
+
execSync(`adb shell am broadcast -a com.oculus.vrpowermanager.automation_disable`, { stdio: 'ignore' });
|
|
62
|
+
// Cleanup PID file
|
|
63
|
+
const pidFile = `${os.homedir()}/.quest-dev-stay-awake.pid`;
|
|
64
|
+
try {
|
|
65
|
+
fs.unlinkSync(pidFile);
|
|
66
|
+
}
|
|
67
|
+
catch { }
|
|
68
|
+
console.log(`Screen timeout restored to ${originalTimeout}ms (${Math.round(originalTimeout / 1000)}s)`);
|
|
69
|
+
console.log('Proximity sensor re-enabled');
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
console.error('Failed to restore settings:', err.message);
|
|
73
|
+
}
|
|
74
|
+
process.exit(0);
|
|
75
|
+
}
|
|
76
|
+
}, pollInterval);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Main stay-awake command handler
|
|
80
|
+
*/
|
|
81
|
+
export async function stayAwakeCommand(idleTimeout = 300000) {
|
|
82
|
+
// Check prerequisites
|
|
83
|
+
checkADBPath();
|
|
84
|
+
// Check devices without verbose output
|
|
85
|
+
try {
|
|
86
|
+
const output = await execCommand('adb', ['devices']);
|
|
87
|
+
const lines = output.trim().split('\n').slice(1);
|
|
88
|
+
const devices = lines.filter(line => line.trim() && !line.includes('List of devices'));
|
|
89
|
+
if (devices.length === 0) {
|
|
90
|
+
console.error('Error: No ADB devices connected');
|
|
91
|
+
process.exit(1);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
console.error('Error: Failed to list ADB devices');
|
|
96
|
+
process.exit(1);
|
|
97
|
+
}
|
|
98
|
+
// PID file management
|
|
99
|
+
const pidFilePath = `${os.homedir()}/.quest-dev-stay-awake.pid`;
|
|
100
|
+
// Check for existing process
|
|
101
|
+
if (fs.existsSync(pidFilePath)) {
|
|
102
|
+
const existingPid = parseInt(fs.readFileSync(pidFilePath, 'utf-8'));
|
|
103
|
+
try {
|
|
104
|
+
process.kill(existingPid, 0); // Test if process exists
|
|
105
|
+
console.error(`Error: stay-awake is already running (PID: ${existingPid})`);
|
|
106
|
+
process.exit(1);
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
// Process dead, cleanup stale PID file
|
|
110
|
+
fs.unlinkSync(pidFilePath);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Get original timeout
|
|
114
|
+
let originalTimeout;
|
|
115
|
+
try {
|
|
116
|
+
originalTimeout = await getScreenTimeout();
|
|
117
|
+
console.log(`Original screen timeout: ${originalTimeout}ms (${Math.round(originalTimeout / 1000)}s)`);
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
console.error('Failed to get current screen timeout');
|
|
121
|
+
process.exit(1);
|
|
122
|
+
}
|
|
123
|
+
// Write PID file
|
|
124
|
+
try {
|
|
125
|
+
fs.writeFileSync(pidFilePath, process.pid.toString());
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
console.warn('Failed to write PID file, hook will not work');
|
|
129
|
+
}
|
|
130
|
+
// Spawn child watchdog process
|
|
131
|
+
let childProcess = null;
|
|
132
|
+
try {
|
|
133
|
+
childProcess = spawn(process.execPath, [
|
|
134
|
+
process.argv[1], // quest-dev script path
|
|
135
|
+
'stay-awake-watchdog',
|
|
136
|
+
'--parent-pid', process.pid.toString(),
|
|
137
|
+
'--original-timeout', originalTimeout.toString()
|
|
138
|
+
], {
|
|
139
|
+
detached: true,
|
|
140
|
+
stdio: 'ignore'
|
|
141
|
+
});
|
|
142
|
+
childProcess.unref(); // Allow parent to exit without waiting for child
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
console.warn('Failed to spawn watchdog child process');
|
|
146
|
+
}
|
|
147
|
+
// Wake screen and disable proximity sensor
|
|
148
|
+
try {
|
|
149
|
+
await wakeScreen();
|
|
150
|
+
console.log('Quest screen woken up');
|
|
151
|
+
await disableProximitySensor();
|
|
152
|
+
console.log('Proximity sensor disabled');
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
console.error('Failed to wake screen or disable proximity sensor:', error.message);
|
|
156
|
+
}
|
|
157
|
+
// Set timeout to 24 hours (86400000ms)
|
|
158
|
+
const longTimeout = 86400000;
|
|
159
|
+
try {
|
|
160
|
+
await setScreenTimeout(longTimeout);
|
|
161
|
+
console.log(`Screen timeout set to 24 hours`);
|
|
162
|
+
console.log(`Quest will stay awake (idle timeout: ${Math.round(idleTimeout / 1000)}s). Press Ctrl-C to restore original settings.`);
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
console.error('Failed to set screen timeout');
|
|
166
|
+
process.exit(1);
|
|
167
|
+
}
|
|
168
|
+
// Idle timer mechanism
|
|
169
|
+
let idleTimerHandle = null;
|
|
170
|
+
let cleanupInProgress = false;
|
|
171
|
+
const resetIdleTimer = () => {
|
|
172
|
+
if (idleTimerHandle)
|
|
173
|
+
clearTimeout(idleTimerHandle);
|
|
174
|
+
idleTimerHandle = setTimeout(() => {
|
|
175
|
+
console.log('\nIdle timeout reached, exiting...');
|
|
176
|
+
cleanup();
|
|
177
|
+
}, idleTimeout);
|
|
178
|
+
};
|
|
179
|
+
// Set up cleanup on exit (must be synchronous for signal handlers)
|
|
180
|
+
const cleanup = () => {
|
|
181
|
+
if (cleanupInProgress)
|
|
182
|
+
return; // Guard against double-cleanup
|
|
183
|
+
cleanupInProgress = true;
|
|
184
|
+
// Clear idle timer
|
|
185
|
+
if (idleTimerHandle)
|
|
186
|
+
clearTimeout(idleTimerHandle);
|
|
187
|
+
// Kill child watchdog
|
|
188
|
+
if (childProcess) {
|
|
189
|
+
try {
|
|
190
|
+
childProcess.kill();
|
|
191
|
+
}
|
|
192
|
+
catch { }
|
|
193
|
+
}
|
|
194
|
+
console.log('\nRestoring original settings...');
|
|
195
|
+
try {
|
|
196
|
+
// Remove PID file
|
|
197
|
+
try {
|
|
198
|
+
fs.unlinkSync(pidFilePath);
|
|
199
|
+
}
|
|
200
|
+
catch { }
|
|
201
|
+
// Restore Quest settings
|
|
202
|
+
execSync(`adb shell settings put system screen_off_timeout ${originalTimeout}`, { stdio: 'ignore' });
|
|
203
|
+
execSync(`adb shell am broadcast -a com.oculus.vrpowermanager.automation_disable`, { stdio: 'ignore' });
|
|
204
|
+
console.log(`Screen timeout restored to ${originalTimeout}ms (${Math.round(originalTimeout / 1000)}s)`);
|
|
205
|
+
console.log(`Proximity sensor re-enabled`);
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
console.error('Failed to restore settings:', error.message);
|
|
209
|
+
}
|
|
210
|
+
process.exit(0);
|
|
211
|
+
};
|
|
212
|
+
// Handle Ctrl-C and termination
|
|
213
|
+
process.on('SIGINT', cleanup);
|
|
214
|
+
process.on('SIGTERM', cleanup);
|
|
215
|
+
process.on('SIGHUP', cleanup);
|
|
216
|
+
// Handle SIGUSR1 for activity reset
|
|
217
|
+
process.on('SIGUSR1', () => {
|
|
218
|
+
console.log('Activity detected, resetting idle timer');
|
|
219
|
+
resetIdleTimer();
|
|
220
|
+
});
|
|
221
|
+
// Start idle timer
|
|
222
|
+
resetIdleTimer();
|
|
223
|
+
// Keep process running with an interval that does nothing
|
|
224
|
+
console.log('Keeping Quest awake...');
|
|
225
|
+
setInterval(() => {
|
|
226
|
+
// Do nothing, just keep process alive
|
|
227
|
+
}, 60000); // Check every minute
|
|
228
|
+
// Prevent process from exiting
|
|
229
|
+
await new Promise((resolve) => {
|
|
230
|
+
// This will only resolve when cleanup is called
|
|
231
|
+
process.on('exit', () => resolve());
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=stay-awake.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stay-awake.js","sourceRoot":"","sources":["../../src/commands/stay-awake.ts"],"names":[],"mappings":"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"}
|