deepadb 1.0.9 → 1.1.1
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/LICENSE +21 -21
- package/README.md +61 -32
- package/build/server.d.ts.map +1 -1
- package/build/server.js +4 -2
- package/build/server.js.map +1 -1
- package/build/tools/at-commands.d.ts.map +1 -1
- package/build/tools/at-commands.js +31 -51
- package/build/tools/at-commands.js.map +1 -1
- package/build/tools/diagnostics.d.ts.map +1 -1
- package/build/tools/diagnostics.js +3 -1
- package/build/tools/diagnostics.js.map +1 -1
- package/build/tools/files.d.ts +27 -1
- package/build/tools/files.d.ts.map +1 -1
- package/build/tools/files.js +1063 -7
- package/build/tools/files.js.map +1 -1
- package/build/tools/forwarding.d.ts.map +1 -1
- package/build/tools/forwarding.js +38 -0
- package/build/tools/forwarding.js.map +1 -1
- package/build/tools/qemu.d.ts +15 -0
- package/build/tools/qemu.d.ts.map +1 -1
- package/build/tools/qemu.js +19 -7
- package/build/tools/qemu.js.map +1 -1
- package/build/tools/sensors.d.ts +18 -0
- package/build/tools/sensors.d.ts.map +1 -0
- package/build/tools/sensors.js +533 -0
- package/build/tools/sensors.js.map +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1,533 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hardware Sensor Access — Read values from device hardware sensors.
|
|
3
|
+
*
|
|
4
|
+
* Two tools:
|
|
5
|
+
* - adb_sensor_read: Android HAL level via `dumpsys sensorservice` (no root)
|
|
6
|
+
* - adb_iio_read: Linux IIO subsystem via `/sys/bus/iio/` (root required)
|
|
7
|
+
*
|
|
8
|
+
* Data sources:
|
|
9
|
+
* - `dumpsys sensorservice` — sensor inventory and last-known event values
|
|
10
|
+
* - `/sys/bus/iio/devices/` — raw IIO channels and ODPM power monitors
|
|
11
|
+
*
|
|
12
|
+
* The sensor inventory is device-dependent — the tools report what's available
|
|
13
|
+
* rather than assuming a fixed set. A Pixel 6a exposes 44 sensors (36 hardware
|
|
14
|
+
* + 8 AOSP virtual) via HAL and 2 PMIC power monitors (16 rails) via IIO.
|
|
15
|
+
*/
|
|
16
|
+
import { z } from "zod";
|
|
17
|
+
import { OutputProcessor } from "../middleware/output-processor.js";
|
|
18
|
+
// ── HAL Sensor Types & Constants ──────────────────────────────────────────────
|
|
19
|
+
/** Map Android sensor type IDs to human-readable categories and units. */
|
|
20
|
+
const SENSOR_TYPE_MAP = {
|
|
21
|
+
"android.sensor.accelerometer": { category: "accelerometer", unit: "m/s²" },
|
|
22
|
+
"android.sensor.magnetic_field": { category: "magnetometer", unit: "μT" },
|
|
23
|
+
"android.sensor.orientation": { category: "orientation", unit: "°" },
|
|
24
|
+
"android.sensor.gyroscope": { category: "gyroscope", unit: "rad/s" },
|
|
25
|
+
"android.sensor.light": { category: "light", unit: "lux" },
|
|
26
|
+
"android.sensor.pressure": { category: "barometer", unit: "hPa" },
|
|
27
|
+
"android.sensor.proximity": { category: "proximity", unit: "cm" },
|
|
28
|
+
"android.sensor.gravity": { category: "gravity", unit: "m/s²" },
|
|
29
|
+
"android.sensor.linear_acceleration": { category: "linear_accel", unit: "m/s²" },
|
|
30
|
+
"android.sensor.rotation_vector": { category: "rotation", unit: "" },
|
|
31
|
+
"android.sensor.magnetic_field_uncalibrated": { category: "magnetometer", unit: "μT" },
|
|
32
|
+
"android.sensor.game_rotation_vector": { category: "rotation", unit: "" },
|
|
33
|
+
"android.sensor.gyroscope_uncalibrated": { category: "gyroscope", unit: "rad/s" },
|
|
34
|
+
"android.sensor.significant_motion": { category: "motion", unit: "" },
|
|
35
|
+
"android.sensor.step_detector": { category: "step", unit: "" },
|
|
36
|
+
"android.sensor.step_counter": { category: "step", unit: "steps" },
|
|
37
|
+
"android.sensor.geomagnetic_rotation_vector": { category: "rotation", unit: "" },
|
|
38
|
+
"android.sensor.tilt_detector": { category: "motion", unit: "" },
|
|
39
|
+
"android.sensor.pick_up_gesture": { category: "motion", unit: "" },
|
|
40
|
+
"android.sensor.device_orientation": { category: "orientation", unit: "" },
|
|
41
|
+
"android.sensor.accelerometer_uncalibrated": { category: "accelerometer", unit: "m/s²" },
|
|
42
|
+
};
|
|
43
|
+
/** Known category names for the filter parameter. */
|
|
44
|
+
const CATEGORIES = [
|
|
45
|
+
"all", "accelerometer", "gyroscope", "magnetometer", "light",
|
|
46
|
+
"barometer", "proximity", "gravity", "linear_accel", "rotation",
|
|
47
|
+
"orientation", "motion", "step", "temperature",
|
|
48
|
+
];
|
|
49
|
+
// ── HAL Parsers ──────────────────────────────────────────────────────────────
|
|
50
|
+
/** Parse the "Sensor List:" section from dumpsys sensorservice. */
|
|
51
|
+
function parseSensorList(dump) {
|
|
52
|
+
const sensors = [];
|
|
53
|
+
const listStart = dump.indexOf("Sensor List:");
|
|
54
|
+
if (listStart === -1)
|
|
55
|
+
return sensors;
|
|
56
|
+
const listEnd = dump.indexOf("Fusion States:");
|
|
57
|
+
const block = dump.substring(listStart, listEnd > listStart ? listEnd : listStart + 10000);
|
|
58
|
+
const lines = block.split("\n");
|
|
59
|
+
// Pre-build line start offsets for O(1) line lookup (avoids O(n²) substring+split)
|
|
60
|
+
const lineStarts = [0];
|
|
61
|
+
for (let i = 0; i < block.length; i++) {
|
|
62
|
+
if (block[i] === "\n")
|
|
63
|
+
lineStarts.push(i + 1);
|
|
64
|
+
}
|
|
65
|
+
// Each sensor entry looks like:
|
|
66
|
+
// 0x01010001) LSM6DSR Accelerometer | STMicro | ver: 1 | type: android.sensor.accelerometer(1) | ...
|
|
67
|
+
// followed by a line with mode info: continuous | minRate=... | maxRate=... | ...
|
|
68
|
+
const entryRegex = /^(0x[\da-f]+)\)\s+(.+?)\s*\|\s*(.+?)\s*\|\s*ver:\s*(\d+)\s*\|\s*type:\s*(\S+?)(?:\(\d+\))?\s*\|/gm;
|
|
69
|
+
let match;
|
|
70
|
+
while ((match = entryRegex.exec(block)) !== null) {
|
|
71
|
+
const handle = match[1];
|
|
72
|
+
const name = match[2].trim();
|
|
73
|
+
const vendor = match[3].trim();
|
|
74
|
+
const version = parseInt(match[4], 10);
|
|
75
|
+
const type = match[5];
|
|
76
|
+
const typeInfo = SENSOR_TYPE_MAP[type];
|
|
77
|
+
// O(log n) line lookup via binary search on pre-built offsets
|
|
78
|
+
let lo = 0, hi = lineStarts.length - 1;
|
|
79
|
+
while (lo < hi) {
|
|
80
|
+
const mid = (lo + hi + 1) >> 1;
|
|
81
|
+
if (lineStarts[mid] <= match.index)
|
|
82
|
+
lo = mid;
|
|
83
|
+
else
|
|
84
|
+
hi = mid - 1;
|
|
85
|
+
}
|
|
86
|
+
const matchLine = lo;
|
|
87
|
+
const nextLine = lines[matchLine + 1] || "";
|
|
88
|
+
const modeMatch = nextLine.match(/^\s+(continuous|on-change|one-shot|special-trigger)/);
|
|
89
|
+
const minRateMatch = nextLine.match(/minRate=([\d.]+)Hz/);
|
|
90
|
+
const maxRateMatch = nextLine.match(/maxRate=([\d.]+)Hz/);
|
|
91
|
+
const wakeUp = /\bwakeUp\b/.test(nextLine) && !nextLine.includes("non-wakeUp");
|
|
92
|
+
// Detect temperature sensors by vendor type string
|
|
93
|
+
let category = typeInfo?.category || "other";
|
|
94
|
+
let unit = typeInfo?.unit || "";
|
|
95
|
+
if (type.includes("temperature") || type.includes("temp")) {
|
|
96
|
+
category = "temperature";
|
|
97
|
+
unit = "°C";
|
|
98
|
+
}
|
|
99
|
+
sensors.push({
|
|
100
|
+
handle, name, vendor, version, type, category, unit,
|
|
101
|
+
mode: modeMatch?.[1] || "unknown",
|
|
102
|
+
minRate: minRateMatch?.[1] ? `${minRateMatch[1]} Hz` : "—",
|
|
103
|
+
maxRate: maxRateMatch?.[1] ? `${maxRateMatch[1]} Hz` : "—",
|
|
104
|
+
wakeUp,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
return sensors;
|
|
108
|
+
}
|
|
109
|
+
/** Parse the "Recent Sensor events:" section for last-known values. */
|
|
110
|
+
function parseRecentEvents(dump) {
|
|
111
|
+
const events = new Map();
|
|
112
|
+
const eventsStart = dump.indexOf("Recent Sensor events:");
|
|
113
|
+
if (eventsStart === -1)
|
|
114
|
+
return events;
|
|
115
|
+
const eventsEnd = dump.indexOf("Active sensors:");
|
|
116
|
+
const block = dump.substring(eventsStart, eventsEnd > eventsStart ? eventsEnd : eventsStart + 20000);
|
|
117
|
+
// Each sensor's events block starts with: "SensorName: last N events"
|
|
118
|
+
// Event lines: " N (ts=..., wall=HH:MM:SS.mmm) val1, val2, val3, ..."
|
|
119
|
+
const sensorBlockRegex = /^(\S.+?):\s+last\s+\d+\s+events$/gm;
|
|
120
|
+
let sMatch;
|
|
121
|
+
const positions = [];
|
|
122
|
+
while ((sMatch = sensorBlockRegex.exec(block)) !== null) {
|
|
123
|
+
positions.push({ name: sMatch[1].trim(), headerStart: sMatch.index, start: sMatch.index + sMatch[0].length });
|
|
124
|
+
}
|
|
125
|
+
for (let i = 0; i < positions.length; i++) {
|
|
126
|
+
const pos = positions[i];
|
|
127
|
+
const end = i + 1 < positions.length ? positions[i + 1].headerStart : block.length;
|
|
128
|
+
const eventBlock = block.substring(pos.start, end);
|
|
129
|
+
// Get the LAST event line (most recent reading)
|
|
130
|
+
const eventLines = eventBlock.split("\n").filter(l => l.match(/^\s+\d+\s+\(ts=/));
|
|
131
|
+
const lastLine = eventLines[eventLines.length - 1];
|
|
132
|
+
if (!lastLine)
|
|
133
|
+
continue;
|
|
134
|
+
const wallMatch = lastLine.match(/wall=([^\)]+)/);
|
|
135
|
+
const valsMatch = lastLine.match(/\)\s+(.+)/);
|
|
136
|
+
if (!valsMatch)
|
|
137
|
+
continue;
|
|
138
|
+
const values = valsMatch[1].split(",")
|
|
139
|
+
.map(v => v.trim())
|
|
140
|
+
.filter(v => v.length > 0)
|
|
141
|
+
.map(v => parseFloat(v))
|
|
142
|
+
.filter(v => !isNaN(v));
|
|
143
|
+
events.set(pos.name, {
|
|
144
|
+
sensorName: pos.name,
|
|
145
|
+
timestamp: wallMatch?.[1] || "unknown",
|
|
146
|
+
values,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
return events;
|
|
150
|
+
}
|
|
151
|
+
// ── HAL Display Helpers ──────────────────────────────────────────────────────
|
|
152
|
+
/** Format sensor values with axis labels and units based on sensor type. */
|
|
153
|
+
function formatValues(sensor, values) {
|
|
154
|
+
const u = sensor.unit;
|
|
155
|
+
switch (sensor.category) {
|
|
156
|
+
case "accelerometer":
|
|
157
|
+
case "gravity":
|
|
158
|
+
case "linear_accel":
|
|
159
|
+
return values.length >= 3
|
|
160
|
+
? `x=${values[0].toFixed(3)} y=${values[1].toFixed(3)} z=${values[2].toFixed(3)} ${u}`
|
|
161
|
+
: values.map(v => v.toFixed(3)).join(", ") + (u ? ` ${u}` : "");
|
|
162
|
+
case "gyroscope":
|
|
163
|
+
return values.length >= 3
|
|
164
|
+
? `x=${values[0].toFixed(4)} y=${values[1].toFixed(4)} z=${values[2].toFixed(4)} ${u}`
|
|
165
|
+
: values.map(v => v.toFixed(4)).join(", ") + (u ? ` ${u}` : "");
|
|
166
|
+
case "magnetometer":
|
|
167
|
+
return values.length >= 3
|
|
168
|
+
? `x=${values[0].toFixed(2)} y=${values[1].toFixed(2)} z=${values[2].toFixed(2)} ${u}`
|
|
169
|
+
: values.map(v => v.toFixed(2)).join(", ") + (u ? ` ${u}` : "");
|
|
170
|
+
case "light": return `${values[0]?.toFixed(1) ?? "?"} ${u}`;
|
|
171
|
+
case "barometer": return `${values[0]?.toFixed(2) ?? "?"} ${u}`;
|
|
172
|
+
case "proximity": return `${values[0]?.toFixed(1) ?? "?"} ${u}`;
|
|
173
|
+
case "temperature": return `${values[0]?.toFixed(1) ?? "?"} ${u}`;
|
|
174
|
+
case "step": return `${values[0]?.toFixed(0) ?? "?"} ${u}`.trim();
|
|
175
|
+
default:
|
|
176
|
+
return values.map(v => v.toFixed(3)).join(", ") + (u ? ` ${u}` : "");
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/** Format sensor rate range for display, avoiding ugly double-dash output. */
|
|
180
|
+
function formatRateRange(minRate, maxRate) {
|
|
181
|
+
const hasMin = minRate !== "—";
|
|
182
|
+
const hasMax = maxRate !== "—";
|
|
183
|
+
if (hasMin && hasMax)
|
|
184
|
+
return `, ${minRate}–${maxRate}`;
|
|
185
|
+
if (hasMin)
|
|
186
|
+
return `, ${minRate}`;
|
|
187
|
+
if (hasMax)
|
|
188
|
+
return `, up to ${maxRate}`;
|
|
189
|
+
return "";
|
|
190
|
+
}
|
|
191
|
+
// ── IIO Helpers ──────────────────────────────────────────────────────────────
|
|
192
|
+
/** Classify an IIO device by its kernel driver name. */
|
|
193
|
+
function classifyIioDevice(name) {
|
|
194
|
+
const lower = name.toLowerCase();
|
|
195
|
+
if (lower.includes("odpm"))
|
|
196
|
+
return "odpm";
|
|
197
|
+
if (lower.includes("accel"))
|
|
198
|
+
return "accel";
|
|
199
|
+
if (lower.includes("gyro") || lower.includes("anglvel"))
|
|
200
|
+
return "gyro";
|
|
201
|
+
if (lower.includes("magn"))
|
|
202
|
+
return "magn";
|
|
203
|
+
if (lower.includes("pressure") || lower.includes("baro"))
|
|
204
|
+
return "pressure";
|
|
205
|
+
if (lower.includes("light") || lower.includes("als") || lower.includes("illuminance"))
|
|
206
|
+
return "light";
|
|
207
|
+
if (lower.includes("temp"))
|
|
208
|
+
return "temp";
|
|
209
|
+
if (lower.includes("adc"))
|
|
210
|
+
return "adc";
|
|
211
|
+
return "unknown";
|
|
212
|
+
}
|
|
213
|
+
/** Parse the ODPM channel-to-rail mapping from enabled_rails output. */
|
|
214
|
+
function parseEnabledRails(text) {
|
|
215
|
+
const rails = new Map();
|
|
216
|
+
// Format: CH0[S10M_VDD_TPU]:TPU
|
|
217
|
+
const regex = /^CH(\d+)\[([^\]]+)\]:(.+)$/gm;
|
|
218
|
+
let match;
|
|
219
|
+
while ((match = regex.exec(text)) !== null) {
|
|
220
|
+
rails.set(parseInt(match[1], 10), { rail: match[2], subsystem: match[3].trim() });
|
|
221
|
+
}
|
|
222
|
+
return rails;
|
|
223
|
+
}
|
|
224
|
+
/** Parse LPF power output into channel values. */
|
|
225
|
+
function parseLpfValues(text) {
|
|
226
|
+
const values = new Map();
|
|
227
|
+
// Format: CH0[rail_name], 12345
|
|
228
|
+
const regex = /^CH(\d+)\[[^\]]+\],\s*(\d+)/gm;
|
|
229
|
+
let match;
|
|
230
|
+
while ((match = regex.exec(text)) !== null) {
|
|
231
|
+
values.set(parseInt(match[1], 10), parseInt(match[2], 10));
|
|
232
|
+
}
|
|
233
|
+
return values;
|
|
234
|
+
}
|
|
235
|
+
/** Parse self-describing key=value output from IIO for-loop reads.
|
|
236
|
+
* Input format: "in_accel_x_raw=123\nin_accel_y_raw=456\n..."
|
|
237
|
+
* Returns a map of attribute name → numeric value. */
|
|
238
|
+
function parseKeyValueOutput(text) {
|
|
239
|
+
const result = new Map();
|
|
240
|
+
for (const line of text.trim().split("\n")) {
|
|
241
|
+
const eq = line.indexOf("=");
|
|
242
|
+
if (eq === -1)
|
|
243
|
+
continue;
|
|
244
|
+
const key = line.substring(0, eq).trim();
|
|
245
|
+
const val = parseFloat(line.substring(eq + 1).trim());
|
|
246
|
+
if (key.length > 0)
|
|
247
|
+
result.set(key, val); // NaN preserved for missing values
|
|
248
|
+
}
|
|
249
|
+
return result;
|
|
250
|
+
}
|
|
251
|
+
/** Read a list of IIO sysfs attributes in a single shell round-trip using
|
|
252
|
+
* self-describing key=value output. Immune to `cat` alignment issues when
|
|
253
|
+
* multiple files are read together. Returns attr name → numeric value. */
|
|
254
|
+
async function readIioAttrs(bridge, serial, base, attrs, timeoutMs) {
|
|
255
|
+
if (attrs.length === 0)
|
|
256
|
+
return new Map();
|
|
257
|
+
const list = attrs.join(" ");
|
|
258
|
+
const result = await bridge.shell(`su -c 'for f in ${list}; do v=$(cat ${base}/$f 2>/dev/null) && echo "$f=$v" || echo "$f=NaN"; done'`, { device: serial, timeout: timeoutMs, ignoreExitCode: true });
|
|
259
|
+
return parseKeyValueOutput(result.stdout);
|
|
260
|
+
}
|
|
261
|
+
/** Map IIO channel type prefixes to SI units.
|
|
262
|
+
* Note: IIO standard specifies temperature in millidegrees Celsius after scale,
|
|
263
|
+
* but some drivers apply the 1000x conversion in the scale factor itself.
|
|
264
|
+
* The unit label "°C" is correct for most production drivers. */
|
|
265
|
+
function getIioUnit(channelKey) {
|
|
266
|
+
if (channelKey.includes("accel"))
|
|
267
|
+
return "m/s²";
|
|
268
|
+
if (channelKey.includes("anglvel"))
|
|
269
|
+
return "rad/s";
|
|
270
|
+
if (channelKey.includes("magn"))
|
|
271
|
+
return "Gauss";
|
|
272
|
+
if (channelKey.includes("pressure"))
|
|
273
|
+
return "kPa";
|
|
274
|
+
if (channelKey.includes("temp"))
|
|
275
|
+
return "°C";
|
|
276
|
+
if (channelKey.includes("illuminance"))
|
|
277
|
+
return "lux";
|
|
278
|
+
if (channelKey.includes("voltage"))
|
|
279
|
+
return "mV";
|
|
280
|
+
if (channelKey.includes("current"))
|
|
281
|
+
return "mA";
|
|
282
|
+
if (channelKey.includes("power"))
|
|
283
|
+
return "mW";
|
|
284
|
+
if (channelKey.includes("energy"))
|
|
285
|
+
return "mJ";
|
|
286
|
+
return "";
|
|
287
|
+
}
|
|
288
|
+
/** Format a power value for display with auto-scaling units. */
|
|
289
|
+
function formatPower(mw) {
|
|
290
|
+
if (mw >= 1000)
|
|
291
|
+
return `${(mw / 1000).toFixed(2)} W`;
|
|
292
|
+
if (mw >= 1)
|
|
293
|
+
return `${mw.toFixed(1)} mW`;
|
|
294
|
+
return `${(mw * 1000).toFixed(0)} μW`;
|
|
295
|
+
}
|
|
296
|
+
// ── Tool Registration ────────────────────────────────────────────────────────
|
|
297
|
+
export function registerSensorTools(ctx) {
|
|
298
|
+
// ── adb_sensor_read ─────────────────────────────────────────────────────
|
|
299
|
+
ctx.server.tool("adb_sensor_read", "Read current hardware sensor values from the device. Enumerates all available sensors from sensorservice and returns their last-known readings with timestamps. Sensor availability is device-dependent — the tool reports what's present. No root required.", {
|
|
300
|
+
category: z.enum(CATEGORIES).optional().default("all")
|
|
301
|
+
.describe("Filter by sensor category: all, accelerometer, gyroscope, magnetometer, light, barometer, proximity, gravity, linear_accel, rotation, orientation, motion, step, temperature"),
|
|
302
|
+
listOnly: z.boolean().optional().default(false)
|
|
303
|
+
.describe("If true, list available sensors without reading values (faster, useful for discovery)"),
|
|
304
|
+
device: z.string().optional().describe("Device serial"),
|
|
305
|
+
}, async ({ category, listOnly, device }) => {
|
|
306
|
+
try {
|
|
307
|
+
const resolved = await ctx.deviceManager.resolveDevice(device);
|
|
308
|
+
const serial = resolved.serial;
|
|
309
|
+
const bridge = ctx.bridge;
|
|
310
|
+
const result = await bridge.shell("dumpsys sensorservice", {
|
|
311
|
+
device: serial, timeout: 10000, ignoreExitCode: true,
|
|
312
|
+
});
|
|
313
|
+
const dump = result.stdout;
|
|
314
|
+
const sensors = parseSensorList(dump);
|
|
315
|
+
if (sensors.length === 0) {
|
|
316
|
+
return { content: [{ type: "text", text: "No sensors found in sensorservice dump." }], isError: true };
|
|
317
|
+
}
|
|
318
|
+
// Filter by category
|
|
319
|
+
const filtered = category === "all"
|
|
320
|
+
? sensors
|
|
321
|
+
: sensors.filter(s => s.category === category);
|
|
322
|
+
if (filtered.length === 0) {
|
|
323
|
+
const available = [...new Set(sensors.map(s => s.category))].sort().join(", ");
|
|
324
|
+
return { content: [{ type: "text", text: `No sensors found for category "${category}". Available categories: ${available}` }] };
|
|
325
|
+
}
|
|
326
|
+
// List-only mode: just show sensor inventory
|
|
327
|
+
if (listOnly) {
|
|
328
|
+
const lines = [`${filtered.length} sensors (${category === "all" ? "all categories" : category}):\n`];
|
|
329
|
+
for (const s of filtered) {
|
|
330
|
+
const rateStr = formatRateRange(s.minRate, s.maxRate);
|
|
331
|
+
lines.push(` [${s.category}] ${s.name} (${s.vendor}) — ${s.mode}${rateStr}${s.wakeUp ? " [wake]" : ""}`);
|
|
332
|
+
}
|
|
333
|
+
const categories = [...new Set(sensors.map(s => s.category))].sort();
|
|
334
|
+
lines.push(`\nCategories: ${categories.join(", ")}`);
|
|
335
|
+
lines.push(`Total: ${sensors.length} sensors on device`);
|
|
336
|
+
return { content: [{ type: "text", text: lines.join("\n") }] };
|
|
337
|
+
}
|
|
338
|
+
// Full mode: sensor values
|
|
339
|
+
const events = parseRecentEvents(dump);
|
|
340
|
+
const lines = [];
|
|
341
|
+
lines.push(`${filtered.length} sensors (${category === "all" ? "all categories" : category}):\n`);
|
|
342
|
+
let withValues = 0;
|
|
343
|
+
for (const s of filtered) {
|
|
344
|
+
const event = events.get(s.name);
|
|
345
|
+
if (event) {
|
|
346
|
+
withValues++;
|
|
347
|
+
const valStr = formatValues(s, event.values);
|
|
348
|
+
lines.push(` ${s.name} (${s.vendor})`);
|
|
349
|
+
lines.push(` ${valStr} [${event.timestamp}]`);
|
|
350
|
+
}
|
|
351
|
+
else {
|
|
352
|
+
lines.push(` ${s.name} (${s.vendor})`);
|
|
353
|
+
lines.push(` (no recent reading — sensor may be inactive)`);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
lines.push(`\n${withValues}/${filtered.length} sensors have recent readings`);
|
|
357
|
+
lines.push(`Total: ${sensors.length} sensors on device`);
|
|
358
|
+
return { content: [{ type: "text", text: lines.join("\n") }] };
|
|
359
|
+
}
|
|
360
|
+
catch (error) {
|
|
361
|
+
return { content: [{ type: "text", text: OutputProcessor.formatError(error) }], isError: true };
|
|
362
|
+
}
|
|
363
|
+
});
|
|
364
|
+
// ── adb_iio_read ───────────────────────────────────────────────────────────
|
|
365
|
+
const IIO_BASE = "/sys/bus/iio/devices";
|
|
366
|
+
ctx.server.tool("adb_iio_read", "Read raw hardware data from the Linux IIO (Industrial I/O) subsystem. Discovers all IIO devices and reads their current values. On Tensor/Exynos devices, this exposes per-rail power monitors (ODPM) showing real-time power consumption per SoC subsystem (CPU clusters, GPU, display, memory, TPU, GPS, etc.) — data not available through the Android sensor HAL. On other devices, may expose raw accelerometer, gyroscope, magnetometer, or ADC channels. Root required.", {
|
|
367
|
+
listOnly: z.boolean().optional().default(false)
|
|
368
|
+
.describe("If true, list available IIO devices without reading values"),
|
|
369
|
+
device: z.string().optional().describe("Device serial"),
|
|
370
|
+
}, async ({ listOnly, device }) => {
|
|
371
|
+
try {
|
|
372
|
+
const resolved = await ctx.deviceManager.resolveDevice(device);
|
|
373
|
+
const serial = resolved.serial;
|
|
374
|
+
const bridge = ctx.bridge;
|
|
375
|
+
// Check root availability
|
|
376
|
+
const rootCheck = await bridge.shell("su -c id", {
|
|
377
|
+
device: serial, timeout: 5000, ignoreExitCode: true,
|
|
378
|
+
});
|
|
379
|
+
if (!rootCheck.stdout.includes("uid=0")) {
|
|
380
|
+
return { content: [{ type: "text", text: "Root required. The IIO subsystem (/sys/bus/iio/) is not accessible without root on stock Android (SELinux blocks untrusted_app access to sysfs). Use adb_sensor_read for non-root sensor access via the Android HAL." }], isError: true };
|
|
381
|
+
}
|
|
382
|
+
// Enumerate IIO devices
|
|
383
|
+
const lsResult = await bridge.shell(`su -c "ls ${IIO_BASE}/ 2>/dev/null"`, {
|
|
384
|
+
device: serial, timeout: 5000, ignoreExitCode: true,
|
|
385
|
+
});
|
|
386
|
+
const deviceDirs = lsResult.stdout.trim().split("\n")
|
|
387
|
+
.map(l => l.trim())
|
|
388
|
+
.filter(l => l.startsWith("iio:device"))
|
|
389
|
+
.filter(l => /^iio:device\d+$/.test(l)); // defense-in-depth: strict naming
|
|
390
|
+
if (deviceDirs.length === 0) {
|
|
391
|
+
return { content: [{ type: "text", text: "No IIO devices found in /sys/bus/iio/devices/. This device may not expose hardware sensors or power monitors through the IIO subsystem." }] };
|
|
392
|
+
}
|
|
393
|
+
// Read device names and classify
|
|
394
|
+
const devices = [];
|
|
395
|
+
for (const dir of deviceDirs) {
|
|
396
|
+
const nameResult = await bridge.shell(`su -c "cat ${IIO_BASE}/${dir}/name 2>/dev/null"`, {
|
|
397
|
+
device: serial, timeout: 3000, ignoreExitCode: true,
|
|
398
|
+
});
|
|
399
|
+
const name = nameResult.stdout.trim() || "unknown";
|
|
400
|
+
devices.push({ path: dir, name, type: classifyIioDevice(name) });
|
|
401
|
+
}
|
|
402
|
+
// List-only mode
|
|
403
|
+
if (listOnly) {
|
|
404
|
+
const lines = [`${devices.length} IIO device(s):\n`];
|
|
405
|
+
for (const d of devices) {
|
|
406
|
+
lines.push(` ${d.path}: ${d.name} [${d.type}]`);
|
|
407
|
+
}
|
|
408
|
+
return { content: [{ type: "text", text: lines.join("\n") }] };
|
|
409
|
+
}
|
|
410
|
+
// Full read — handle each device type
|
|
411
|
+
const output = [];
|
|
412
|
+
for (const dev of devices) {
|
|
413
|
+
if (dev.type === "odpm") {
|
|
414
|
+
output.push(await readOdpmDevice(bridge, serial, dev));
|
|
415
|
+
}
|
|
416
|
+
else {
|
|
417
|
+
output.push(await readGenericIioDevice(bridge, serial, dev));
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
return { content: [{ type: "text", text: output.join("\n\n") }] };
|
|
421
|
+
}
|
|
422
|
+
catch (error) {
|
|
423
|
+
return { content: [{ type: "text", text: OutputProcessor.formatError(error) }], isError: true };
|
|
424
|
+
}
|
|
425
|
+
});
|
|
426
|
+
/** Read an ODPM power monitor device and return formatted output. */
|
|
427
|
+
async function readOdpmDevice(bridge, serial, dev) {
|
|
428
|
+
const base = `${IIO_BASE}/${dev.path}`;
|
|
429
|
+
const lines = [`=== ${dev.name} (${dev.path}) — Power Monitor ===\n`];
|
|
430
|
+
// Parallel reads: enabled_rails, lpf_power, sampling_rate
|
|
431
|
+
const [railsR, powerR, rateR] = await Promise.allSettled([
|
|
432
|
+
bridge.shell(`su -c "cat ${base}/enabled_rails"`, { device: serial, timeout: 5000, ignoreExitCode: true }),
|
|
433
|
+
bridge.shell(`su -c "cat ${base}/lpf_power"`, { device: serial, timeout: 5000, ignoreExitCode: true }),
|
|
434
|
+
bridge.shell(`su -c "cat ${base}/sampling_rate"`, { device: serial, timeout: 3000, ignoreExitCode: true }),
|
|
435
|
+
]);
|
|
436
|
+
const railsText = railsR.status === "fulfilled" ? railsR.value.stdout : "";
|
|
437
|
+
const powerText = powerR.status === "fulfilled" ? powerR.value.stdout : "";
|
|
438
|
+
const rateText = rateR.status === "fulfilled" ? rateR.value.stdout.trim() : "?";
|
|
439
|
+
const rails = parseEnabledRails(railsText);
|
|
440
|
+
const powerValues = parseLpfValues(powerText);
|
|
441
|
+
const channelCount = rails.size;
|
|
442
|
+
if (channelCount === 0) {
|
|
443
|
+
lines.push(" (no enabled channels)");
|
|
444
|
+
return lines.join("\n");
|
|
445
|
+
}
|
|
446
|
+
// Build channel data — lpf_power values are in μW from the ODPM driver
|
|
447
|
+
const channels = [];
|
|
448
|
+
for (const [idx, info] of rails) {
|
|
449
|
+
const pRaw = powerValues.get(idx) ?? 0;
|
|
450
|
+
channels.push({
|
|
451
|
+
index: idx, rail: info.rail, subsystem: info.subsystem,
|
|
452
|
+
powerMw: pRaw / 1000, // μW → mW
|
|
453
|
+
});
|
|
454
|
+
}
|
|
455
|
+
// Sort by power consumption descending
|
|
456
|
+
channels.sort((a, b) => b.powerMw - a.powerMw);
|
|
457
|
+
// Format output
|
|
458
|
+
lines.push(` Sampling rate: ${rateText} Hz`);
|
|
459
|
+
lines.push(` Channels: ${channelCount}\n`);
|
|
460
|
+
const totalPower = channels.reduce((sum, ch) => sum + ch.powerMw, 0);
|
|
461
|
+
for (const ch of channels) {
|
|
462
|
+
const pct = totalPower > 0 ? ((ch.powerMw / totalPower) * 100).toFixed(1) : "0.0";
|
|
463
|
+
lines.push(` CH${ch.index} ${ch.subsystem} (${ch.rail})`);
|
|
464
|
+
lines.push(` ${formatPower(ch.powerMw)} (${pct}%)`);
|
|
465
|
+
}
|
|
466
|
+
lines.push(`\n Total: ${formatPower(totalPower)}`);
|
|
467
|
+
return lines.join("\n");
|
|
468
|
+
}
|
|
469
|
+
/** Read a generic (non-ODPM) IIO device and return formatted output. */
|
|
470
|
+
async function readGenericIioDevice(bridge, serial, dev) {
|
|
471
|
+
const base = `${IIO_BASE}/${dev.path}`;
|
|
472
|
+
const lines = [`=== ${dev.name} (${dev.path}) — ${dev.type === "unknown" ? "IIO Device" : dev.type} ===\n`];
|
|
473
|
+
// List all attributes to discover what's available
|
|
474
|
+
const lsResult = await bridge.shell(`su -c "ls ${base}/ 2>/dev/null"`, {
|
|
475
|
+
device: serial, timeout: 3000, ignoreExitCode: true,
|
|
476
|
+
});
|
|
477
|
+
const attrs = lsResult.stdout.trim().split("\n").map(a => a.trim()).filter(a => a.length > 0);
|
|
478
|
+
// Find raw value attributes (defense-in-depth: only allow alphanumeric + underscore)
|
|
479
|
+
const iioAttrSafe = /^[a-zA-Z0-9_]+$/;
|
|
480
|
+
const rawAttrs = attrs.filter(a => a.match(/^in_.*_raw$/) && iioAttrSafe.test(a));
|
|
481
|
+
const scaleAttrs = attrs.filter(a => a.match(/^in_.*_scale$/) && iioAttrSafe.test(a));
|
|
482
|
+
const offsetAttrs = attrs.filter(a => a.match(/^in_.*_offset$/) && iioAttrSafe.test(a));
|
|
483
|
+
if (rawAttrs.length === 0) {
|
|
484
|
+
// No raw attributes — report what's available
|
|
485
|
+
const interesting = attrs.filter(a => !["name", "power", "subsystem", "uevent", "dev"].includes(a));
|
|
486
|
+
lines.push(` No raw sensor channels found.`);
|
|
487
|
+
if (interesting.length > 0) {
|
|
488
|
+
lines.push(` Available attributes: ${interesting.join(", ")}`);
|
|
489
|
+
}
|
|
490
|
+
return lines.join("\n");
|
|
491
|
+
}
|
|
492
|
+
// Read raw values using self-describing key=value output (immune to alignment issues)
|
|
493
|
+
// Single-quoted su -c argument prevents outer shell expansion; $f expanded by inner su shell
|
|
494
|
+
const rawMap = await readIioAttrs(bridge, serial, base, rawAttrs, 10000);
|
|
495
|
+
// Read scales (same self-describing approach)
|
|
496
|
+
const scaleMap = new Map();
|
|
497
|
+
const scaleRaw = await readIioAttrs(bridge, serial, base, scaleAttrs, 5000);
|
|
498
|
+
for (const [key, val] of scaleRaw) {
|
|
499
|
+
scaleMap.set(key.replace("_scale", ""), val);
|
|
500
|
+
}
|
|
501
|
+
// Read offsets (same self-describing approach)
|
|
502
|
+
const offsetMap = new Map();
|
|
503
|
+
const offsetRaw = await readIioAttrs(bridge, serial, base, offsetAttrs, 5000);
|
|
504
|
+
for (const [key, val] of offsetRaw) {
|
|
505
|
+
offsetMap.set(key.replace("_offset", ""), val);
|
|
506
|
+
}
|
|
507
|
+
// Format each raw channel — lookup by attribute name, not array index
|
|
508
|
+
for (const attr of rawAttrs) {
|
|
509
|
+
const channelKey = attr.replace("_raw", "");
|
|
510
|
+
const raw = rawMap.get(attr) ?? NaN;
|
|
511
|
+
// Look up scale: try exact match, then shared scale (strip axis/index suffix)
|
|
512
|
+
const scale = scaleMap.get(channelKey)
|
|
513
|
+
?? scaleMap.get(channelKey.replace(/_[xyz]$/, ""))
|
|
514
|
+
?? scaleMap.get(channelKey.replace(/_\d+$/, ""))
|
|
515
|
+
?? 1;
|
|
516
|
+
const offset = offsetMap.get(channelKey)
|
|
517
|
+
?? offsetMap.get(channelKey.replace(/_[xyz]$/, ""))
|
|
518
|
+
?? offsetMap.get(channelKey.replace(/_\d+$/, ""))
|
|
519
|
+
?? 0;
|
|
520
|
+
const calibrated = (raw + offset) * scale;
|
|
521
|
+
const unit = getIioUnit(channelKey);
|
|
522
|
+
const label = channelKey.replace("in_", "").replace(/_/g, " ");
|
|
523
|
+
if (isNaN(raw)) {
|
|
524
|
+
lines.push(` ${label}: (no reading)`);
|
|
525
|
+
}
|
|
526
|
+
else {
|
|
527
|
+
lines.push(` ${label}: ${calibrated.toFixed(4)}${unit ? " " + unit : ""} (raw: ${raw})`);
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
return lines.join("\n");
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
//# sourceMappingURL=sensors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sensors.js","sourceRoot":"","sources":["../../src/tools/sensors.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "deepadb",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "DeepADB — full-featured Android Debug Bridge MCP server.
|
|
3
|
+
"version": "1.1.1",
|
|
4
|
+
"description": "DeepADB — full-featured Android Debug Bridge MCP server. 198 tools across 44 modules for device inspection from UI to baseband.",
|
|
5
|
+
"mcpName": "io.github.fullread/deepadb",
|
|
5
6
|
"type": "module",
|
|
6
7
|
"bin": {
|
|
7
8
|
"deepadb": "build/index.js"
|