添加强制上下线和视频流
This commit is contained in:
10
system/manager/process_config.py
Normal file → Executable file
10
system/manager/process_config.py
Normal file → Executable 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),
|
||||
]
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user