robopark 3.1.2 → 3.3.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/README.md +66 -95
- package/bin/robopark.js +9 -2
- package/conversation/elevenlabs_agent.py +1617 -1617
- package/conversation/supervisor_store.py +189 -189
- package/dist/{kernel/config-schema.js → config-schema.js} +1 -0
- package/dist/config-schema.js.map +1 -0
- package/dist/robopark/add-robot.js +1 -0
- package/dist/robopark/add-robot.js.map +1 -0
- package/dist/robopark/agent-ctl.js +1 -0
- package/dist/robopark/agent-ctl.js.map +1 -0
- package/dist/robopark/auto-start.js +51 -73
- package/dist/robopark/auto-start.js.map +1 -0
- package/dist/robopark/conversation.js +1 -0
- package/dist/robopark/conversation.js.map +1 -0
- package/dist/robopark/discovery.js +1 -0
- package/dist/robopark/discovery.js.map +1 -0
- package/dist/robopark/doctor.js +1 -0
- package/dist/robopark/doctor.js.map +1 -0
- package/dist/robopark/enroll.js +1 -0
- package/dist/robopark/enroll.js.map +1 -0
- package/dist/robopark/llm-set.js +1 -0
- package/dist/robopark/llm-set.js.map +1 -0
- package/dist/robopark/motor-control.js +1 -0
- package/dist/robopark/motor-control.js.map +1 -0
- package/dist/robopark/preview-agent-launcher.js +1 -0
- package/dist/robopark/preview-agent-launcher.js.map +1 -0
- package/dist/robopark/probe.js +16 -15
- package/dist/robopark/probe.js.map +1 -0
- package/dist/robopark/profile.js +1 -0
- package/dist/robopark/profile.js.map +1 -0
- package/dist/robopark/python-env.js +1 -7
- package/dist/robopark/python-env.js.map +1 -0
- package/dist/robopark/robot-runtime.js +1 -0
- package/dist/robopark/robot-runtime.js.map +1 -0
- package/dist/robopark/scan.js +1 -0
- package/dist/robopark/scan.js.map +1 -0
- package/dist/robopark/screen-control.js +1 -0
- package/dist/robopark/screen-control.js.map +1 -0
- package/dist/robopark/secrets.js +1 -0
- package/dist/robopark/secrets.js.map +1 -0
- package/dist/robopark/serve.js +4 -6
- package/dist/robopark/serve.js.map +1 -0
- package/dist/robopark/server-add.js +1 -0
- package/dist/robopark/server-add.js.map +1 -0
- package/dist/robopark/setup-livekit.js +53 -52
- package/dist/robopark/setup-livekit.js.map +1 -0
- package/dist/robopark/setup.js +1 -0
- package/dist/robopark/setup.js.map +1 -0
- package/dist/robopark/stop-all.js +1 -0
- package/dist/robopark/stop-all.js.map +1 -0
- package/dist/robopark/verify.js +1 -0
- package/dist/robopark/verify.js.map +1 -0
- package/dist/robopark/vision-agent-launcher.js +1 -0
- package/dist/robopark/vision-agent-launcher.js.map +1 -0
- package/dist/robopark/vision-control.js +1 -0
- package/dist/robopark/vision-control.js.map +1 -0
- package/dist/robopark-cli.js +7 -125
- package/dist/robopark-cli.js.map +1 -0
- package/package.json +16 -25
- package/pi-client/_install_steps.sh +29 -29
- package/pi-client/client.py +76 -76
- package/pi-client/install.sh +40 -40
- package/pi-client/join_convo.sh +54 -54
- package/pi-client/livekit_bridge.py +24 -24
- package/pi-client/motor_bridge.py +10 -10
- package/scheduler/__pycache__/main.cpython-312.pyc +0 -0
- package/scheduler/main.py +196 -17
- package/scheduler/media_lock.py +57 -57
- package/scheduler/preview_agent.py +1122 -1122
- package/scheduler/production_config.json +73 -113
- package/scheduler/scripts/install-robot-supervisor-linux.sh +33 -33
- package/{static → scheduler/static}/vendor/elevenlabs-client.iife.js +24199 -24199
- package/scheduler/static/voice-join.html +177 -0
- package/screen/screen_runtime.py +75 -75
- package/vision/app_pi_clean.py +297 -297
- package/vision/audio_server_pi.py +24 -24
- package/vision/install.sh +34 -34
- package/vision/motor_server.py +275 -275
- package/vision/requirements_camera.txt +6 -6
- package/vision/requirements_motor.txt +4 -4
- package/vision/requirements_pi_unified.txt +2 -2
- package/vision/requirements_vision_agent.txt +19 -19
- package/vision/run.sh +244 -244
- package/vision/services/services.sh +12 -12
- package/dist/kernel/types.js +0 -7
- package/dist/robopark/access.js +0 -99
- package/dist/robopark/control-center-html.js +0 -9191
- package/dist/robopark/control-server.js +0 -148
- package/dist/robopark/deployment-commands.js +0 -47
- package/dist/robopark/standalone.js +0 -562
- package/dist/robopark/voice-join-html.js +0 -57
- package/scripts/windows-shim-fix.cjs +0 -58
- package/static/robopark/barracuda.png +0 -0
- package/static/robopark/bmw.png +0 -0
- package/static/robopark/jaguar.png +0 -0
- package/static/robopark/magnus.jpg +0 -0
- package/static/robopark/panda.png +0 -0
- package/static/robopark/tesla.png +0 -0
- package/static/robopark/titan.jpg +0 -0
- package/static/robopark/volt.png +0 -0
- package/static/vendor/elevenlabs-client.LICENSE +0 -21
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# Camera-only dependencies used by `robopark conversation up`.
|
|
2
|
-
# OpenCV is supplied by apt on Raspberry Pi through --system-site-packages.
|
|
3
|
-
Flask==3.0.0
|
|
4
|
-
Flask-CORS==4.0.0
|
|
5
|
-
requests>=2.31
|
|
6
|
-
numpy>=2.1; python_version >= '3.13'
|
|
1
|
+
# Camera-only dependencies used by `robopark conversation up`.
|
|
2
|
+
# OpenCV is supplied by apt on Raspberry Pi through --system-site-packages.
|
|
3
|
+
Flask==3.0.0
|
|
4
|
+
Flask-CORS==4.0.0
|
|
5
|
+
requests>=2.31
|
|
6
|
+
numpy>=2.1; python_version >= '3.13'
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
fastapi>=0.115
|
|
2
|
-
uvicorn>=0.30
|
|
3
|
-
pydantic>=2.7
|
|
4
|
-
lgpio==0.2.2.0; platform_system == 'Linux'
|
|
1
|
+
fastapi>=0.115
|
|
2
|
+
uvicorn>=0.30
|
|
3
|
+
pydantic>=2.7
|
|
4
|
+
lgpio==0.2.2.0; platform_system == 'Linux'
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
# Runtime requirements for the packaged RoboPark vision-agent.
|
|
2
|
-
#
|
|
3
|
-
# This intentionally excludes the legacy optional YOLO/GPIO stack from
|
|
4
|
-
# requirements_pi_unified.txt. The packaged agent launches app_pi_clean.py and
|
|
5
|
-
# audio_server_pi.py only. Raspberry Pi OpenCV/PyAudio/Picamera2 are supplied
|
|
6
|
-
# by apt and exposed to ~/.robopark/venv through --system-site-packages.
|
|
7
|
-
Flask==3.0.0
|
|
8
|
-
Flask-CORS==4.0.0
|
|
9
|
-
requests>=2.31
|
|
10
|
-
fastapi>=0.115
|
|
11
|
-
uvicorn[standard]>=0.30
|
|
12
|
-
python-multipart>=0.0.12
|
|
13
|
-
sounddevice>=0.4.6
|
|
14
|
-
soundfile>=0.12.1
|
|
15
|
-
groq>=0.11
|
|
16
|
-
lgpio==0.2.2.0; platform_system == 'Linux'
|
|
17
|
-
# Python 3.13 has no compatible NumPy 1.24 wheel. On older Pi images, use the
|
|
18
|
-
# distro NumPy provided through system-site-packages instead.
|
|
19
|
-
numpy>=2.1; python_version >= '3.13'
|
|
1
|
+
# Runtime requirements for the packaged RoboPark vision-agent.
|
|
2
|
+
#
|
|
3
|
+
# This intentionally excludes the legacy optional YOLO/GPIO stack from
|
|
4
|
+
# requirements_pi_unified.txt. The packaged agent launches app_pi_clean.py and
|
|
5
|
+
# audio_server_pi.py only. Raspberry Pi OpenCV/PyAudio/Picamera2 are supplied
|
|
6
|
+
# by apt and exposed to ~/.robopark/venv through --system-site-packages.
|
|
7
|
+
Flask==3.0.0
|
|
8
|
+
Flask-CORS==4.0.0
|
|
9
|
+
requests>=2.31
|
|
10
|
+
fastapi>=0.115
|
|
11
|
+
uvicorn[standard]>=0.30
|
|
12
|
+
python-multipart>=0.0.12
|
|
13
|
+
sounddevice>=0.4.6
|
|
14
|
+
soundfile>=0.12.1
|
|
15
|
+
groq>=0.11
|
|
16
|
+
lgpio==0.2.2.0; platform_system == 'Linux'
|
|
17
|
+
# Python 3.13 has no compatible NumPy 1.24 wheel. On older Pi images, use the
|
|
18
|
+
# distro NumPy provided through system-site-packages instead.
|
|
19
|
+
numpy>=2.1; python_version >= '3.13'
|
package/vision/run.sh
CHANGED
|
@@ -1,244 +1,244 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
set -euo pipefail
|
|
3
|
-
|
|
4
|
-
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
5
|
-
STATE_DIR="$ROOT_DIR/.run"
|
|
6
|
-
LOG_DIR="$STATE_DIR/logs"
|
|
7
|
-
VENV_DIR="$ROOT_DIR/venv"
|
|
8
|
-
|
|
9
|
-
mkdir -p "$LOG_DIR"
|
|
10
|
-
|
|
11
|
-
if [ -f "$ROOT_DIR/.env" ]; then
|
|
12
|
-
set -a
|
|
13
|
-
source "$ROOT_DIR/.env"
|
|
14
|
-
set +a
|
|
15
|
-
fi
|
|
16
|
-
|
|
17
|
-
source "$ROOT_DIR/services/services.sh"
|
|
18
|
-
|
|
19
|
-
require_venv() {
|
|
20
|
-
if [ ! -f "$VENV_DIR/bin/activate" ]; then
|
|
21
|
-
echo "Missing venv. Run: ./install.sh"
|
|
22
|
-
exit 1
|
|
23
|
-
fi
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
is_running() {
|
|
27
|
-
local name="$1"
|
|
28
|
-
local pid_file="$STATE_DIR/$name.pid"
|
|
29
|
-
if [ ! -f "$pid_file" ]; then
|
|
30
|
-
return 1
|
|
31
|
-
fi
|
|
32
|
-
local pid
|
|
33
|
-
pid="$(cat "$pid_file" 2>/dev/null || true)"
|
|
34
|
-
if [ -z "$pid" ]; then
|
|
35
|
-
return 1
|
|
36
|
-
fi
|
|
37
|
-
kill -0 "$pid" >/dev/null 2>&1
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
start_one() {
|
|
41
|
-
local name="$1"
|
|
42
|
-
local cmd_var="SERVICE_${name}_CMD"
|
|
43
|
-
local cmd
|
|
44
|
-
cmd="${!cmd_var}"
|
|
45
|
-
if [ -z "$cmd" ]; then
|
|
46
|
-
echo "Unknown service: $name"
|
|
47
|
-
exit 1
|
|
48
|
-
fi
|
|
49
|
-
|
|
50
|
-
if is_running "$name"; then
|
|
51
|
-
echo "$name already running"
|
|
52
|
-
return 0
|
|
53
|
-
fi
|
|
54
|
-
|
|
55
|
-
require_venv
|
|
56
|
-
source "$VENV_DIR/bin/activate"
|
|
57
|
-
|
|
58
|
-
local log_file="$LOG_DIR/$name.log"
|
|
59
|
-
local pid_file="$STATE_DIR/$name.pid"
|
|
60
|
-
|
|
61
|
-
echo "Starting $name"
|
|
62
|
-
nohup bash -lc "cd \"$ROOT_DIR\" && source \"$VENV_DIR/bin/activate\" && $cmd" >>"$log_file" 2>&1 &
|
|
63
|
-
echo $! >"$pid_file"
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
detect_terminal() {
|
|
67
|
-
if command -v lxterminal >/dev/null 2>&1; then
|
|
68
|
-
echo "lxterminal"
|
|
69
|
-
return 0
|
|
70
|
-
fi
|
|
71
|
-
if command -v gnome-terminal >/dev/null 2>&1; then
|
|
72
|
-
echo "gnome-terminal"
|
|
73
|
-
return 0
|
|
74
|
-
fi
|
|
75
|
-
if command -v xterm >/dev/null 2>&1; then
|
|
76
|
-
echo "xterm"
|
|
77
|
-
return 0
|
|
78
|
-
fi
|
|
79
|
-
return 1
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
start_one_term() {
|
|
83
|
-
local name="$1"
|
|
84
|
-
local cmd_var="SERVICE_${name}_CMD"
|
|
85
|
-
local cmd
|
|
86
|
-
cmd="${!cmd_var}"
|
|
87
|
-
if [ -z "$cmd" ]; then
|
|
88
|
-
echo "Unknown service: $name"
|
|
89
|
-
exit 1
|
|
90
|
-
fi
|
|
91
|
-
|
|
92
|
-
if is_running "$name"; then
|
|
93
|
-
echo "$name already running"
|
|
94
|
-
return 0
|
|
95
|
-
fi
|
|
96
|
-
|
|
97
|
-
require_venv
|
|
98
|
-
|
|
99
|
-
local term
|
|
100
|
-
term="$(detect_terminal || true)"
|
|
101
|
-
if [ -z "$term" ]; then
|
|
102
|
-
echo "No supported terminal found (need lxterminal, gnome-terminal, or xterm)"
|
|
103
|
-
exit 1
|
|
104
|
-
fi
|
|
105
|
-
|
|
106
|
-
local log_file="$LOG_DIR/$name.log"
|
|
107
|
-
local pid_file="$STATE_DIR/$name.pid"
|
|
108
|
-
local title="RoboVision:$name"
|
|
109
|
-
local run_cmd
|
|
110
|
-
run_cmd="cd \"$ROOT_DIR\" && source \"$VENV_DIR/bin/activate\" && exec $cmd"
|
|
111
|
-
|
|
112
|
-
echo "Starting $name in terminal ($term)"
|
|
113
|
-
|
|
114
|
-
if [ "$term" = "lxterminal" ]; then
|
|
115
|
-
lxterminal --title="$title" --command="bash -lc '$run_cmd'" >>"$log_file" 2>&1 &
|
|
116
|
-
echo $! >"$pid_file"
|
|
117
|
-
return 0
|
|
118
|
-
fi
|
|
119
|
-
|
|
120
|
-
if [ "$term" = "gnome-terminal" ]; then
|
|
121
|
-
gnome-terminal --title="$title" -- bash -lc "$run_cmd" >>"$log_file" 2>&1 &
|
|
122
|
-
echo $! >"$pid_file"
|
|
123
|
-
return 0
|
|
124
|
-
fi
|
|
125
|
-
|
|
126
|
-
if [ "$term" = "xterm" ]; then
|
|
127
|
-
xterm -T "$title" -e bash -lc "$run_cmd" >>"$log_file" 2>&1 &
|
|
128
|
-
echo $! >"$pid_file"
|
|
129
|
-
return 0
|
|
130
|
-
fi
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
stop_one() {
|
|
134
|
-
local name="$1"
|
|
135
|
-
local pid_file="$STATE_DIR/$name.pid"
|
|
136
|
-
|
|
137
|
-
if ! is_running "$name"; then
|
|
138
|
-
rm -f "$pid_file"
|
|
139
|
-
echo "$name not running"
|
|
140
|
-
return 0
|
|
141
|
-
fi
|
|
142
|
-
|
|
143
|
-
local pid
|
|
144
|
-
pid="$(cat "$pid_file")"
|
|
145
|
-
echo "Stopping $name (pid $pid)"
|
|
146
|
-
kill "$pid" >/dev/null 2>&1 || true
|
|
147
|
-
|
|
148
|
-
local i
|
|
149
|
-
for i in $(seq 1 30); do
|
|
150
|
-
if kill -0 "$pid" >/dev/null 2>&1; then
|
|
151
|
-
sleep 0.2
|
|
152
|
-
else
|
|
153
|
-
break
|
|
154
|
-
fi
|
|
155
|
-
done
|
|
156
|
-
|
|
157
|
-
if kill -0 "$pid" >/dev/null 2>&1; then
|
|
158
|
-
kill -9 "$pid" >/dev/null 2>&1 || true
|
|
159
|
-
fi
|
|
160
|
-
|
|
161
|
-
rm -f "$pid_file"
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
status_one() {
|
|
165
|
-
local name="$1"
|
|
166
|
-
local port_var="SERVICE_${name}_PORT"
|
|
167
|
-
local port
|
|
168
|
-
port="${!port_var}"
|
|
169
|
-
|
|
170
|
-
if is_running "$name"; then
|
|
171
|
-
echo "$name: running (port ${port:-n/a})"
|
|
172
|
-
else
|
|
173
|
-
echo "$name: stopped"
|
|
174
|
-
fi
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
tail_one() {
|
|
178
|
-
local name="$1"
|
|
179
|
-
local log_file="$LOG_DIR/$name.log"
|
|
180
|
-
if [ ! -f "$log_file" ]; then
|
|
181
|
-
echo "No log file: $log_file"
|
|
182
|
-
exit 1
|
|
183
|
-
fi
|
|
184
|
-
tail -n 200 -f "$log_file"
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
usage() {
|
|
188
|
-
echo "Usage: ./run.sh <start|start-term|stop|restart|status|logs> [service]"
|
|
189
|
-
echo "Services: ${SERVICES[*]}"
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
ACTION="${1:-}"
|
|
193
|
-
NAME="${2:-all}"
|
|
194
|
-
|
|
195
|
-
case "$ACTION" in
|
|
196
|
-
start)
|
|
197
|
-
if [ "$NAME" = "all" ]; then
|
|
198
|
-
for s in "${SERVICES[@]}"; do start_one "$s"; done
|
|
199
|
-
else
|
|
200
|
-
start_one "$NAME"
|
|
201
|
-
fi
|
|
202
|
-
;;
|
|
203
|
-
start-term)
|
|
204
|
-
if [ "$NAME" = "all" ]; then
|
|
205
|
-
for s in "${SERVICES[@]}"; do start_one_term "$s"; done
|
|
206
|
-
else
|
|
207
|
-
start_one_term "$NAME"
|
|
208
|
-
fi
|
|
209
|
-
;;
|
|
210
|
-
stop)
|
|
211
|
-
if [ "$NAME" = "all" ]; then
|
|
212
|
-
for s in "${SERVICES[@]}"; do stop_one "$s"; done
|
|
213
|
-
else
|
|
214
|
-
stop_one "$NAME"
|
|
215
|
-
fi
|
|
216
|
-
;;
|
|
217
|
-
restart)
|
|
218
|
-
if [ "$NAME" = "all" ]; then
|
|
219
|
-
for s in "${SERVICES[@]}"; do stop_one "$s"; done
|
|
220
|
-
for s in "${SERVICES[@]}"; do start_one "$s"; done
|
|
221
|
-
else
|
|
222
|
-
stop_one "$NAME"
|
|
223
|
-
start_one "$NAME"
|
|
224
|
-
fi
|
|
225
|
-
;;
|
|
226
|
-
status)
|
|
227
|
-
if [ "$NAME" = "all" ]; then
|
|
228
|
-
for s in "${SERVICES[@]}"; do status_one "$s"; done
|
|
229
|
-
else
|
|
230
|
-
status_one "$NAME"
|
|
231
|
-
fi
|
|
232
|
-
;;
|
|
233
|
-
logs)
|
|
234
|
-
if [ "$NAME" = "all" ]; then
|
|
235
|
-
echo "Specify a service for logs"
|
|
236
|
-
exit 1
|
|
237
|
-
fi
|
|
238
|
-
tail_one "$NAME"
|
|
239
|
-
;;
|
|
240
|
-
*)
|
|
241
|
-
usage
|
|
242
|
-
exit 1
|
|
243
|
-
;;
|
|
244
|
-
esac
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
5
|
+
STATE_DIR="$ROOT_DIR/.run"
|
|
6
|
+
LOG_DIR="$STATE_DIR/logs"
|
|
7
|
+
VENV_DIR="$ROOT_DIR/venv"
|
|
8
|
+
|
|
9
|
+
mkdir -p "$LOG_DIR"
|
|
10
|
+
|
|
11
|
+
if [ -f "$ROOT_DIR/.env" ]; then
|
|
12
|
+
set -a
|
|
13
|
+
source "$ROOT_DIR/.env"
|
|
14
|
+
set +a
|
|
15
|
+
fi
|
|
16
|
+
|
|
17
|
+
source "$ROOT_DIR/services/services.sh"
|
|
18
|
+
|
|
19
|
+
require_venv() {
|
|
20
|
+
if [ ! -f "$VENV_DIR/bin/activate" ]; then
|
|
21
|
+
echo "Missing venv. Run: ./install.sh"
|
|
22
|
+
exit 1
|
|
23
|
+
fi
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
is_running() {
|
|
27
|
+
local name="$1"
|
|
28
|
+
local pid_file="$STATE_DIR/$name.pid"
|
|
29
|
+
if [ ! -f "$pid_file" ]; then
|
|
30
|
+
return 1
|
|
31
|
+
fi
|
|
32
|
+
local pid
|
|
33
|
+
pid="$(cat "$pid_file" 2>/dev/null || true)"
|
|
34
|
+
if [ -z "$pid" ]; then
|
|
35
|
+
return 1
|
|
36
|
+
fi
|
|
37
|
+
kill -0 "$pid" >/dev/null 2>&1
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
start_one() {
|
|
41
|
+
local name="$1"
|
|
42
|
+
local cmd_var="SERVICE_${name}_CMD"
|
|
43
|
+
local cmd
|
|
44
|
+
cmd="${!cmd_var}"
|
|
45
|
+
if [ -z "$cmd" ]; then
|
|
46
|
+
echo "Unknown service: $name"
|
|
47
|
+
exit 1
|
|
48
|
+
fi
|
|
49
|
+
|
|
50
|
+
if is_running "$name"; then
|
|
51
|
+
echo "$name already running"
|
|
52
|
+
return 0
|
|
53
|
+
fi
|
|
54
|
+
|
|
55
|
+
require_venv
|
|
56
|
+
source "$VENV_DIR/bin/activate"
|
|
57
|
+
|
|
58
|
+
local log_file="$LOG_DIR/$name.log"
|
|
59
|
+
local pid_file="$STATE_DIR/$name.pid"
|
|
60
|
+
|
|
61
|
+
echo "Starting $name"
|
|
62
|
+
nohup bash -lc "cd \"$ROOT_DIR\" && source \"$VENV_DIR/bin/activate\" && $cmd" >>"$log_file" 2>&1 &
|
|
63
|
+
echo $! >"$pid_file"
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
detect_terminal() {
|
|
67
|
+
if command -v lxterminal >/dev/null 2>&1; then
|
|
68
|
+
echo "lxterminal"
|
|
69
|
+
return 0
|
|
70
|
+
fi
|
|
71
|
+
if command -v gnome-terminal >/dev/null 2>&1; then
|
|
72
|
+
echo "gnome-terminal"
|
|
73
|
+
return 0
|
|
74
|
+
fi
|
|
75
|
+
if command -v xterm >/dev/null 2>&1; then
|
|
76
|
+
echo "xterm"
|
|
77
|
+
return 0
|
|
78
|
+
fi
|
|
79
|
+
return 1
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
start_one_term() {
|
|
83
|
+
local name="$1"
|
|
84
|
+
local cmd_var="SERVICE_${name}_CMD"
|
|
85
|
+
local cmd
|
|
86
|
+
cmd="${!cmd_var}"
|
|
87
|
+
if [ -z "$cmd" ]; then
|
|
88
|
+
echo "Unknown service: $name"
|
|
89
|
+
exit 1
|
|
90
|
+
fi
|
|
91
|
+
|
|
92
|
+
if is_running "$name"; then
|
|
93
|
+
echo "$name already running"
|
|
94
|
+
return 0
|
|
95
|
+
fi
|
|
96
|
+
|
|
97
|
+
require_venv
|
|
98
|
+
|
|
99
|
+
local term
|
|
100
|
+
term="$(detect_terminal || true)"
|
|
101
|
+
if [ -z "$term" ]; then
|
|
102
|
+
echo "No supported terminal found (need lxterminal, gnome-terminal, or xterm)"
|
|
103
|
+
exit 1
|
|
104
|
+
fi
|
|
105
|
+
|
|
106
|
+
local log_file="$LOG_DIR/$name.log"
|
|
107
|
+
local pid_file="$STATE_DIR/$name.pid"
|
|
108
|
+
local title="RoboVision:$name"
|
|
109
|
+
local run_cmd
|
|
110
|
+
run_cmd="cd \"$ROOT_DIR\" && source \"$VENV_DIR/bin/activate\" && exec $cmd"
|
|
111
|
+
|
|
112
|
+
echo "Starting $name in terminal ($term)"
|
|
113
|
+
|
|
114
|
+
if [ "$term" = "lxterminal" ]; then
|
|
115
|
+
lxterminal --title="$title" --command="bash -lc '$run_cmd'" >>"$log_file" 2>&1 &
|
|
116
|
+
echo $! >"$pid_file"
|
|
117
|
+
return 0
|
|
118
|
+
fi
|
|
119
|
+
|
|
120
|
+
if [ "$term" = "gnome-terminal" ]; then
|
|
121
|
+
gnome-terminal --title="$title" -- bash -lc "$run_cmd" >>"$log_file" 2>&1 &
|
|
122
|
+
echo $! >"$pid_file"
|
|
123
|
+
return 0
|
|
124
|
+
fi
|
|
125
|
+
|
|
126
|
+
if [ "$term" = "xterm" ]; then
|
|
127
|
+
xterm -T "$title" -e bash -lc "$run_cmd" >>"$log_file" 2>&1 &
|
|
128
|
+
echo $! >"$pid_file"
|
|
129
|
+
return 0
|
|
130
|
+
fi
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
stop_one() {
|
|
134
|
+
local name="$1"
|
|
135
|
+
local pid_file="$STATE_DIR/$name.pid"
|
|
136
|
+
|
|
137
|
+
if ! is_running "$name"; then
|
|
138
|
+
rm -f "$pid_file"
|
|
139
|
+
echo "$name not running"
|
|
140
|
+
return 0
|
|
141
|
+
fi
|
|
142
|
+
|
|
143
|
+
local pid
|
|
144
|
+
pid="$(cat "$pid_file")"
|
|
145
|
+
echo "Stopping $name (pid $pid)"
|
|
146
|
+
kill "$pid" >/dev/null 2>&1 || true
|
|
147
|
+
|
|
148
|
+
local i
|
|
149
|
+
for i in $(seq 1 30); do
|
|
150
|
+
if kill -0 "$pid" >/dev/null 2>&1; then
|
|
151
|
+
sleep 0.2
|
|
152
|
+
else
|
|
153
|
+
break
|
|
154
|
+
fi
|
|
155
|
+
done
|
|
156
|
+
|
|
157
|
+
if kill -0 "$pid" >/dev/null 2>&1; then
|
|
158
|
+
kill -9 "$pid" >/dev/null 2>&1 || true
|
|
159
|
+
fi
|
|
160
|
+
|
|
161
|
+
rm -f "$pid_file"
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
status_one() {
|
|
165
|
+
local name="$1"
|
|
166
|
+
local port_var="SERVICE_${name}_PORT"
|
|
167
|
+
local port
|
|
168
|
+
port="${!port_var}"
|
|
169
|
+
|
|
170
|
+
if is_running "$name"; then
|
|
171
|
+
echo "$name: running (port ${port:-n/a})"
|
|
172
|
+
else
|
|
173
|
+
echo "$name: stopped"
|
|
174
|
+
fi
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
tail_one() {
|
|
178
|
+
local name="$1"
|
|
179
|
+
local log_file="$LOG_DIR/$name.log"
|
|
180
|
+
if [ ! -f "$log_file" ]; then
|
|
181
|
+
echo "No log file: $log_file"
|
|
182
|
+
exit 1
|
|
183
|
+
fi
|
|
184
|
+
tail -n 200 -f "$log_file"
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
usage() {
|
|
188
|
+
echo "Usage: ./run.sh <start|start-term|stop|restart|status|logs> [service]"
|
|
189
|
+
echo "Services: ${SERVICES[*]}"
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
ACTION="${1:-}"
|
|
193
|
+
NAME="${2:-all}"
|
|
194
|
+
|
|
195
|
+
case "$ACTION" in
|
|
196
|
+
start)
|
|
197
|
+
if [ "$NAME" = "all" ]; then
|
|
198
|
+
for s in "${SERVICES[@]}"; do start_one "$s"; done
|
|
199
|
+
else
|
|
200
|
+
start_one "$NAME"
|
|
201
|
+
fi
|
|
202
|
+
;;
|
|
203
|
+
start-term)
|
|
204
|
+
if [ "$NAME" = "all" ]; then
|
|
205
|
+
for s in "${SERVICES[@]}"; do start_one_term "$s"; done
|
|
206
|
+
else
|
|
207
|
+
start_one_term "$NAME"
|
|
208
|
+
fi
|
|
209
|
+
;;
|
|
210
|
+
stop)
|
|
211
|
+
if [ "$NAME" = "all" ]; then
|
|
212
|
+
for s in "${SERVICES[@]}"; do stop_one "$s"; done
|
|
213
|
+
else
|
|
214
|
+
stop_one "$NAME"
|
|
215
|
+
fi
|
|
216
|
+
;;
|
|
217
|
+
restart)
|
|
218
|
+
if [ "$NAME" = "all" ]; then
|
|
219
|
+
for s in "${SERVICES[@]}"; do stop_one "$s"; done
|
|
220
|
+
for s in "${SERVICES[@]}"; do start_one "$s"; done
|
|
221
|
+
else
|
|
222
|
+
stop_one "$NAME"
|
|
223
|
+
start_one "$NAME"
|
|
224
|
+
fi
|
|
225
|
+
;;
|
|
226
|
+
status)
|
|
227
|
+
if [ "$NAME" = "all" ]; then
|
|
228
|
+
for s in "${SERVICES[@]}"; do status_one "$s"; done
|
|
229
|
+
else
|
|
230
|
+
status_one "$NAME"
|
|
231
|
+
fi
|
|
232
|
+
;;
|
|
233
|
+
logs)
|
|
234
|
+
if [ "$NAME" = "all" ]; then
|
|
235
|
+
echo "Specify a service for logs"
|
|
236
|
+
exit 1
|
|
237
|
+
fi
|
|
238
|
+
tail_one "$NAME"
|
|
239
|
+
;;
|
|
240
|
+
*)
|
|
241
|
+
usage
|
|
242
|
+
exit 1
|
|
243
|
+
;;
|
|
244
|
+
esac
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
|
|
3
|
-
SERVICES=("vision" "motor" "audio")
|
|
4
|
-
|
|
5
|
-
SERVICE_vision_PORT=5000
|
|
6
|
-
SERVICE_vision_CMD="python app_pi_clean.py"
|
|
7
|
-
|
|
8
|
-
SERVICE_motor_PORT=8001
|
|
9
|
-
SERVICE_motor_CMD="python motor_server.py"
|
|
10
|
-
|
|
11
|
-
SERVICE_audio_PORT=8000
|
|
12
|
-
SERVICE_audio_CMD="python audio_server_pi.py"
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
SERVICES=("vision" "motor" "audio")
|
|
4
|
+
|
|
5
|
+
SERVICE_vision_PORT=5000
|
|
6
|
+
SERVICE_vision_CMD="python app_pi_clean.py"
|
|
7
|
+
|
|
8
|
+
SERVICE_motor_PORT=8001
|
|
9
|
+
SERVICE_motor_CMD="python motor_server.py"
|
|
10
|
+
|
|
11
|
+
SERVICE_audio_PORT=8000
|
|
12
|
+
SERVICE_audio_CMD="python audio_server_pi.py"
|