添加强制上下线和视频流

This commit is contained in:
Comma Device
2026-03-14 23:19:41 +08:00
parent bdb05826f4
commit e74a404b62
28 changed files with 257 additions and 215 deletions

10
system/manager/process_config.py Normal file → Executable file
View File

@@ -78,6 +78,9 @@ def enable_connect(started, params, CP: car.CarParams) -> bool:
def enable_xiaoge_data(started, params, CP: car.CarParams) -> bool:
return params.get_bool("ShareData")
def enable_webrtc(started, params, CP: car.CarParams) -> bool:
return params.get_int("DisableDM") == 2
def c3x_lite(started: bool, params: Params, CP: car.CarParams) -> bool:
return started and params.get_bool("HardwareC3xLite")
@@ -86,7 +89,7 @@ procs = [
NativeProcess("loggerd", "system/loggerd", ["./loggerd"], logging),
NativeProcess("encoderd", "system/loggerd", ["./encoderd"], only_onroad),
NativeProcess("stream_encoderd", "system/loggerd", ["./encoderd", "--stream"], notcar),
NativeProcess("stream_encoderd", "system/loggerd", ["./encoderd", "--stream"], or_(notcar, and_(only_onroad, enable_webrtc))),
PythonProcess("logmessaged", "system.logmessaged", always_run),
NativeProcess("camerad", "system/camerad", ["./camerad"], driverview, enabled=not WEBCAM),
@@ -132,17 +135,16 @@ procs = [
# debug procs
NativeProcess("bridge", "cereal/messaging", ["./bridge"], notcar),
PythonProcess("webrtcd", "system.webrtc.webrtcd", notcar),
PythonProcess("webrtcd", "system.webrtc.webrtcd", or_(notcar, and_(only_onroad, enable_webrtc))),
PythonProcess("webjoystick", "tools.bodyteleop.web", notcar),
PythonProcess("joystick", "tools.joystick.joystick_control", and_(joystick, iscar)),
#PythonProcess("fleet_manager", "selfdrive.frogpilot.fleetmanager.fleet_manager", check_fleet, enabled=not PC),
PythonProcess("fleet_manager", "selfdrive.frogpilot.fleetmanager.fleet_manager", check_fleet),
PythonProcess("carrot_man", "selfdrive.carrot.carrot_man", always_run),#, enabled=not PC),
PythonProcess("carrot_server", "selfdrive.carrot.carrot_server", always_run),
#Xiaoge data broadcaster (conditional on ShareData param)
PythonProcess("xiaoge_data", "selfdrive.carrot.xiaoge_data", enable_xiaoge_data),
# c3x lite
PythonProcess("beep", "selfdrive.controls.beep", c3x_lite, enabled=TICI),
]

View File

@@ -42,7 +42,7 @@ class CerealOutgoingMessageProxy:
return msg_dict
def update(self):
async def update(self):
# this is blocking in async context...
self.sm.update(0)
for service, updated in self.sm.updated.items():
@@ -53,7 +53,11 @@ class CerealOutgoingMessageProxy:
outgoing_msg = {"type": service, "logMonoTime": mono_time, "valid": valid, "data": msg_dict}
encoded_msg = json.dumps(outgoing_msg).encode()
for channel in self.channels:
channel.send(encoded_msg)
# 支持 WebSocketResponse用于浏览器端调试
if isinstance(channel, web.WebSocketResponse):
await channel.send_bytes(encoded_msg)
else:
channel.send(encoded_msg)
class CerealIncomingMessageProxy:
@@ -94,7 +98,7 @@ class CerealProxyRunner:
while True:
try:
self.proxy.update()
await self.proxy.update()
except InvalidStateError:
self.logger.warning("Cereal outgoing proxy invalid state (connection closed)")
break
@@ -229,7 +233,11 @@ async def get_stream(request: 'web.Request'):
stream_dict[session.identifier] = session
return web.json_response({"sdp": answer.sdp, "type": answer.type})
# 基本 CORS 支持,方便外部网页直接访问
return web.json_response(
{"sdp": answer.sdp, "type": answer.type},
headers={"Access-Control-Allow-Origin": "*"},
)
async def get_schema(request: 'web.Request'):
@@ -246,19 +254,43 @@ async def on_shutdown(app: 'web.Application'):
del app['streams']
@web.middleware
async def cors_middleware(request, handler):
response = await handler(request)
response.headers['Access-Control-Allow-Origin'] = '*'
response.headers['Access-Control-Allow-Methods'] = 'GET, POST, PUT, DELETE, OPTIONS'
response.headers['Access-Control-Allow-Headers'] = 'Content-Type, Authorization'
return response
async def handle_cors_preflight(request):
if request.method == 'OPTIONS':
headers = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type, Authorization',
'Access-Control-Max-Age': '86400',
}
return web.Response(status=200, headers=headers)
return await request.app['handler'](request)
def webrtcd_thread(host: str, port: int, debug: bool):
logging.basicConfig(level=logging.CRITICAL, handlers=[logging.StreamHandler()])
logging_level = logging.DEBUG if debug else logging.INFO
logging.getLogger("WebRTCStream").setLevel(logging_level)
logging.getLogger("webrtcd").setLevel(logging_level)
app = web.Application()
# 加上 CORS 中间件,允许外部网页(如 carrot web直接访问
app = web.Application(middlewares=[cors_middleware])
app['streams'] = dict()
app['debug'] = debug
app.on_shutdown.append(on_shutdown)
app.router.add_post("/stream", get_stream)
app.router.add_get("/schema", get_schema)
# 处理任意路径的 CORS 预检请求
app.router.add_route('OPTIONS', '/{tail:.*}', handle_cors_preflight)
web.run_app(app, host=host, port=port)