Skip to content

Commit 9ba0b30

Browse files
committed
sensors run.sh: add dynamic Sensors runner with auto profile and CLI controls
- add Runner/suites/Multimedia/Sensors/run.sh in standard testkit format - DT-free discovery via ssc_sensor_info; skip early if inventory not parsable - ADSP remoteproc gating using functestlib remoteproc helpers - supports --list, --profile, --sensors csv, durations/heartbeat, strict mode - writes logs to OUT_DIR and emits Sensors.res for LAVA Signed-off-by: Srikanth Muppandam <smuppand@qti.qualcomm.com>
1 parent daa3980 commit 9ba0b30

1 file changed

Lines changed: 340 additions & 0 deletions

File tree

  • Runner/suites/Multimedia/Sensors
Lines changed: 340 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,340 @@
1+
#!/bin/sh
2+
# Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
3+
# SPDX-License-Identifier: BSD-3-Clause
4+
# Dynamic Sensors validation (DT-free): discover via ssc_sensor_info and validate selected sensor types.
5+
6+
TESTNAME="Sensors"
7+
8+
SCRIPT_DIR="$(
9+
cd "$(dirname "$0")" || exit 1
10+
pwd
11+
)"
12+
13+
# shellcheck disable=SC2034
14+
RES_FILE="$SCRIPT_DIR/${TESTNAME}.res"
15+
16+
usage() {
17+
cat <<EOF
18+
Usage: $0 [options]
19+
20+
Discovery:
21+
--list List discovered sensor TYPEs (from ssc_sensor_info) and exit 0
22+
--sensors <csv> Comma-separated list of sensor TYPEs to test
23+
Example: --sensors accel,gyro,mag
24+
--profile <name> Choose a preset list:
25+
basic : accel,gyro
26+
core : accel,gyro
27+
vision: accel,gyro,mag,pressure
28+
all : all discovered types (debug)
29+
Default: auto (core/vision inferred by presence of mag/pressure)
30+
31+
Durations / progress:
32+
--out <dir> Output directory (default: ./logs_Sensors)
33+
--see-duration <sec> see_workhorse duration (default: 5)
34+
--drva-duration <sec> ssc_drva_test duration (default: 10)
35+
--hb <sec> Heartbeat seconds (default: 5)
36+
--strict <0|1> Require accel+gyro to exist (default: 1)
37+
38+
Other:
39+
--help Show this help
40+
41+
Examples:
42+
$0 --list
43+
$0 --profile basic
44+
$0 --profile vision
45+
$0 --sensors accel,gyro,tilt --strict 0
46+
$0 --profile all --strict 0
47+
48+
Environment overrides:
49+
OUT_DIR, SEE_DURATION, DRVA_DURATION, HB_SECS, STRICT_REQUIRED,
50+
SENSORS_TIMEOUT_PAD_SECS, SENSORS_DISPLAY_EVENTS, SENSORS_DRVA_NUM_SAMPLES
51+
EOF
52+
}
53+
54+
SENSORS_CSV=""
55+
PROFILE="auto"
56+
LIST_ONLY=0
57+
58+
while [ $# -gt 0 ]; do
59+
case "$1" in
60+
--out) OUT_DIR="$2"; shift 2 ;;
61+
--see-duration) SEE_DURATION="$2"; shift 2 ;;
62+
--drva-duration) DRVA_DURATION="$2"; shift 2 ;;
63+
--hb) HB_SECS="$2"; shift 2 ;;
64+
--strict) STRICT_REQUIRED="$2"; shift 2 ;;
65+
--sensors) SENSORS_CSV="$2"; shift 2 ;;
66+
--profile) PROFILE="$2"; shift 2 ;;
67+
--list) LIST_ONLY=1; shift 1 ;;
68+
--help|-h) usage; exit 0 ;;
69+
*) echo "[WARN] Unknown arg: $1" >&2; shift 1 ;;
70+
esac
71+
done
72+
73+
INIT_ENV=""
74+
SEARCH="$SCRIPT_DIR"
75+
while [ "$SEARCH" != "/" ]; do
76+
if [ -f "$SEARCH/init_env" ]; then
77+
INIT_ENV="$SEARCH/init_env"
78+
break
79+
fi
80+
SEARCH=$(dirname "$SEARCH")
81+
done
82+
83+
if [ -z "$INIT_ENV" ]; then
84+
echo "[ERROR] Could not find init_env (starting at $SCRIPT_DIR)" >&2
85+
echo "$TESTNAME SKIP" >"$RES_FILE" 2>/dev/null || true
86+
exit 0
87+
fi
88+
89+
if [ -z "${__INIT_ENV_LOADED:-}" ]; then
90+
# shellcheck disable=SC1090
91+
. "$INIT_ENV"
92+
__INIT_ENV_LOADED=1
93+
fi
94+
95+
# shellcheck disable=SC1090,SC1091
96+
. "$TOOLS/functestlib.sh"
97+
# shellcheck disable=SC1090,SC1091
98+
. "$TOOLS/lib_sensors.sh"
99+
100+
# Resolve test path and cd (single SKIP/exit path)
101+
SKIP_REASON=""
102+
test_path=$(find_test_case_by_name "$TESTNAME")
103+
if [ -z "$test_path" ] || [ ! -d "$test_path" ]; then
104+
SKIP_REASON="$TESTNAME SKIP - test path not found"
105+
elif ! cd "$test_path"; then
106+
SKIP_REASON="$TESTNAME SKIP - cannot cd into $test_path"
107+
else
108+
RES_FILE="$test_path/${TESTNAME}.res"
109+
fi
110+
111+
if [ -n "$SKIP_REASON" ]; then
112+
log_skip "$SKIP_REASON"
113+
echo "$TESTNAME SKIP" >"$RES_FILE" 2>/dev/null || true
114+
exit 0
115+
fi
116+
117+
OUT_DIR="${OUT_DIR:-./logs_Sensors}"
118+
SEE_DURATION="${SEE_DURATION:-5}"
119+
DRVA_DURATION="${DRVA_DURATION:-10}"
120+
HB_SECS="${HB_SECS:-5}"
121+
STRICT_REQUIRED="${STRICT_REQUIRED:-1}"
122+
: "${SENSORS_DRVA_NUM_SAMPLES:=325}"
123+
124+
mkdir -p "$OUT_DIR" 2>/dev/null || true
125+
126+
# ---- clock sanity (fix 1970 timestamps) ----
127+
# If system time is too old, many logs become confusing. We don't FAIL for this.
128+
now_epoch="$(date +%s 2>/dev/null || echo 0)"
129+
# Jan 1, 2022 = 1640995200 (safe threshold)
130+
if [ "$now_epoch" -lt 1640995200 ] 2>/dev/null; then
131+
log_warn "System clock looks unset (epoch=$now_epoch). Logs may show 1970, consider enabling NTP or setting RTC."
132+
fi
133+
134+
log_info "------------------- Starting $TESTNAME testcase -------------------"
135+
log_info "OUT_DIR=$OUT_DIR SEE_DURATION=$SEE_DURATION DRVA_DURATION=$DRVA_DURATION HB_SECS=$HB_SECS STRICT_REQUIRED=$STRICT_REQUIRED PROFILE=$PROFILE"
136+
[ -n "$SENSORS_CSV" ] && log_info "Requested sensors (override): $SENSORS_CSV"
137+
138+
deps="ssc_sensor_info see_workhorse awk sed grep sort wc tr"
139+
if ! check_dependencies "$deps"; then
140+
log_skip "$TESTNAME SKIP - missing dependencies: $deps"
141+
echo "$TESTNAME SKIP" >"$RES_FILE"
142+
exit 0
143+
fi
144+
145+
if [ ! -d /etc/sensors/config ]; then
146+
log_skip "$TESTNAME SKIP - /etc/sensors/config not present (likely non-prop build)"
147+
echo "$TESTNAME SKIP" >"$RES_FILE"
148+
exit 0
149+
fi
150+
151+
# ADSP remoteproc gating
152+
sensors_check_adsp_remoteproc "adsp.mbn"
153+
adsp_rc=$?
154+
155+
log_info "ADSP remoteproc:"
156+
log_info " path=${SENSORS_ADSP_RPROC_PATH:-unknown} state=${SENSORS_ADSP_STATE:-unknown} firmware=${SENSORS_ADSP_FW:-unknown}"
157+
158+
if [ "$adsp_rc" -eq 3 ]; then
159+
log_skip "$TESTNAME SKIP - ADSP remoteproc not found"
160+
echo "$TESTNAME SKIP" >"$RES_FILE"
161+
exit 0
162+
elif [ "$adsp_rc" -eq 2 ]; then
163+
log_fail "$TESTNAME FAIL - ADSP not running and firmware missing: ${SENSORS_ADSP_FW:-adsp.mbn}"
164+
echo "$TESTNAME FAIL" >"$RES_FILE"
165+
exit 0
166+
elif [ "$adsp_rc" -eq 1 ]; then
167+
log_fail "$TESTNAME FAIL - ADSP remoteproc state is not running: ${SENSORS_ADSP_STATE:-unknown}"
168+
echo "$TESTNAME FAIL" >"$RES_FILE"
169+
exit 0
170+
fi
171+
172+
# Discover sensors
173+
SSC_LOG="$OUT_DIR/ssc_sensor_info.txt"
174+
log_info "Collecting sensor inventory -> $SSC_LOG"
175+
176+
if ! sensors_dump_ssc_sensor_info "$SSC_LOG"; then
177+
log_skip "$TESTNAME SKIP - ssc_sensor_info failed to run (see $SSC_LOG)"
178+
echo "$TESTNAME SKIP" >"$RES_FILE"
179+
exit 0
180+
fi
181+
182+
if [ ! -s "$SSC_LOG" ] || ! grep -q '^TYPE[[:space:]]*=' "$SSC_LOG" 2>/dev/null; then
183+
log_skip "$TESTNAME SKIP - ssc_sensor_info produced no TYPE entries (see $SSC_LOG)"
184+
echo "$TESTNAME SKIP" >"$RES_FILE"
185+
exit 0
186+
fi
187+
188+
types_nl="$(sensors_types_from_ssc_file "$SSC_LOG" 2>/dev/null || true)"
189+
if [ -z "$types_nl" ]; then
190+
log_skip "$TESTNAME SKIP - no parsable sensor inventory from ssc_sensor_info (see $SSC_LOG)"
191+
echo "$TESTNAME SKIP" >"$RES_FILE"
192+
exit 0
193+
fi
194+
195+
log_info "Sensor TYPEs discovered:"
196+
printf '%s\n' "$types_nl" | while IFS= read -r t; do
197+
[ -n "$t" ] && log_info " - $t"
198+
done
199+
200+
# ---- list-only mode should be a clean PASS for LAVA ----
201+
if [ "$LIST_ONLY" -eq 1 ]; then
202+
log_pass "$TESTNAME PASS - --list requested"
203+
echo "$TESTNAME PASS" >"$RES_FILE"
204+
exit 0
205+
fi
206+
207+
# strict accel+gyro requirement
208+
req_missing=0
209+
for r in accel gyro; do
210+
if ! sensors_type_present "$types_nl" "$r"; then
211+
log_warn "Missing required sensor type: $r"
212+
req_missing=1
213+
fi
214+
done
215+
if [ "$STRICT_REQUIRED" = "1" ] && [ "$req_missing" -eq 1 ]; then
216+
log_fail "$TESTNAME FAIL - required sensor types missing (need accel+gyro)"
217+
echo "$TESTNAME FAIL" >"$RES_FILE"
218+
exit 0
219+
fi
220+
221+
# infer kit for auto profile
222+
is_vision=0
223+
if sensors_type_present "$types_nl" "mag" || sensors_type_present "$types_nl" "pressure"; then
224+
is_vision=1
225+
log_info "Kit guess (DT-free): Vision-like (mag/pressure present)"
226+
else
227+
log_info "Kit guess (DT-free): Core-like (mag/pressure not present)"
228+
fi
229+
230+
TARGET_NL=""
231+
232+
# 1) explicit sensor list overrides everything
233+
if [ -n "$SENSORS_CSV" ]; then
234+
OLDIFS=$IFS
235+
IFS=,
236+
set -- "$SENSORS_CSV"
237+
IFS=$OLDIFS
238+
for s in "$@"; do
239+
s="$(printf '%s' "$s" | tr -d '[:space:]')"
240+
[ -z "$s" ] && continue
241+
TARGET_NL="$(sensors_append_unique_line "$TARGET_NL" "$s")"
242+
done
243+
else
244+
# 2) profile selection
245+
case "$PROFILE" in
246+
auto)
247+
if [ "$is_vision" -eq 1 ]; then
248+
PROFILE="vision"
249+
else
250+
PROFILE="core"
251+
fi
252+
;;
253+
esac
254+
255+
case "$PROFILE" in
256+
basic|core)
257+
TARGET_NL="accel
258+
gyro"
259+
;;
260+
vision)
261+
TARGET_NL="accel
262+
gyro
263+
mag
264+
pressure"
265+
;;
266+
all)
267+
TARGET_NL="$types_nl"
268+
;;
269+
*)
270+
log_skip "$TESTNAME SKIP - unknown profile: $PROFILE"
271+
echo "$TESTNAME SKIP" >"$RES_FILE"
272+
exit 0
273+
;;
274+
esac
275+
fi
276+
277+
log_info "Sensors selected to test:"
278+
printf '%s\n' "$TARGET_NL" | while IFS= read -r s; do
279+
[ -n "$s" ] && log_info " - $s"
280+
done
281+
282+
TARGET_FILE="$OUT_DIR/targets.txt"
283+
printf '%s\n' "$TARGET_NL" >"$TARGET_FILE" 2>/dev/null || true
284+
285+
pass_count=0
286+
fail_count=0
287+
skip_count=0
288+
289+
while IFS= read -r s; do
290+
[ -z "$s" ] && continue
291+
292+
log_info "---- Sensor test: $s ----"
293+
294+
if ! sensors_type_present "$types_nl" "$s"; then
295+
log_info "Sensor $s: not present -> SKIP"
296+
skip_count=$((skip_count + 1))
297+
continue
298+
fi
299+
300+
if sensors_run_see_workhorse "$s" "$SEE_DURATION" "$OUT_DIR" "$HB_SECS"; then
301+
log_info "see_workhorse: PASS ($s) [log: $OUT_DIR/see_workhorse_${s}.log]"
302+
else
303+
log_error "see_workhorse: FAIL ($s) [log: $OUT_DIR/see_workhorse_${s}.log]"
304+
fail_count=$((fail_count + 1))
305+
continue
306+
fi
307+
308+
sensors_run_ssc_drva_test "$s" "$DRVA_DURATION" "$OUT_DIR" "$HB_SECS"
309+
rc=$?
310+
if [ "$rc" -eq 0 ]; then
311+
log_info "ssc_drva_test: PASS ($s) [log: $OUT_DIR/ssc_drva_test_${s}.log]"
312+
pass_count=$((pass_count + 1))
313+
continue
314+
fi
315+
if [ "$rc" -eq 2 ]; then
316+
log_info "ssc_drva_test: SKIP ($s) (tool not present)"
317+
pass_count=$((pass_count + 1))
318+
continue
319+
fi
320+
321+
log_error "ssc_drva_test: FAIL ($s) [log: $OUT_DIR/ssc_drva_test_${s}.log]"
322+
fail_count=$((fail_count + 1))
323+
done <"$TARGET_FILE"
324+
325+
log_info "Summary: pass=$pass_count fail=$fail_count skip=$skip_count (logs in $OUT_DIR)"
326+
327+
if [ "$fail_count" -gt 0 ]; then
328+
log_fail "$TESTNAME FAIL - failures=$fail_count passes=$pass_count skips=$skip_count (logs in $OUT_DIR)"
329+
echo "$TESTNAME FAIL" >"$RES_FILE"
330+
else
331+
if [ "$pass_count" -eq 0 ]; then
332+
log_skip "$TESTNAME SKIP - no selected sensors were validated (all missing/unsupported)"
333+
echo "$TESTNAME SKIP" >"$RES_FILE"
334+
else
335+
log_pass "$TESTNAME PASS - passes=$pass_count skips=$skip_count"
336+
echo "$TESTNAME PASS" >"$RES_FILE"
337+
fi
338+
fi
339+
340+
exit 0

0 commit comments

Comments
 (0)