V8 wip3 da (#139)

* carinfo

* Update index.html

<a href='/carinfo'>View Car Information</a><br>
This commit is contained in:
机械小鸽 2025-02-27 09:46:13 +08:00 committed by GitHub
parent 8b6564008c
commit 3bf25ea4b6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 195 additions and 2 deletions

1
openpilot/opendbc_repo Symbolic link
View File

@ -0,0 +1 @@
../opendbc_repo/

View File

@ -33,6 +33,17 @@ from openpilot.common.swaglog import cloudlog
import traceback
from ftplib import FTP
from openpilot.common.params import Params
from cereal import log, messaging
from cereal import log, messaging
import time
from functools import wraps
from openpilot.opendbc_repo.opendbc.car.interfaces import CarInterfaceBase
from openpilot.opendbc_repo.opendbc.car.values import PLATFORMS
# Initialize messaging
sm = messaging.SubMaster(['carState'])
app = Flask(__name__)
@app.route("/")
@ -134,8 +145,6 @@ def upload_folder_to_ftp(local_folder, directory, remote_path):
@app.route("/footage/full/upload_carrot/<route>/<segment>")
def upload_carrot(route, segment):
from openpilot.common.params import Params
local_folder = Paths.log_root() + f"{route}--{segment}"
# <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD> Ȯ<><C8AE>
@ -444,6 +453,139 @@ def store_toggle_values_route():
except Exception as e:
return jsonify({"error": "Failed to update values", "details": str(e)}), 400
@app.route("/carinfo")
def carinfo():
try:
params = Params()
# 更新消息
sm.update()
# 获取车辆基本信息
try:
car_name = params.get("CarName", encoding='utf8')
if car_name in PLATFORMS:
platform = PLATFORMS[car_name]
car_fingerprint = platform.config.platform_str
car_specs = platform.config.specs
else:
car_fingerprint = "Unknown Fingerprint"
car_specs = None
except Exception as e:
print(f"Failed to get vehicle basic info: {e}")
car_name = "Unknown Model"
car_fingerprint = "Unknown Fingerprint"
car_specs = None
# 获取车辆状态信息
try:
CS = sm['carState']
# 基本状态判断
is_car_started = CS.vEgo > 0.1
is_car_engaged = CS.cruiseState.enabled
# 构建基础信息
car_info = {
"Vehicle Status": {
"Running Status": "Moving" if is_car_started else "Stopped",
"Cruise System": "Enabled" if is_car_engaged else "Disabled",
"Current Speed": f"{CS.vEgo * 3.6:.1f} km/h",
"Engine RPM": f"{CS.engineRPM:.0f} RPM" if hasattr(CS, 'engineRPM') and CS.engineRPM > 0 else "Unknown",
"Gear Position": str(CS.gearShifter) if hasattr(CS, 'gearShifter') else "Unknown"
},
"Basic Information": {
"Car Model": car_name,
"Fingerprint": str(car_fingerprint),
"Weight": f"{car_specs.mass:.0f} kg" if car_specs and hasattr(car_specs, 'mass') else "Unknown",
"Wheelbase": f"{car_specs.wheelbase:.3f} m" if car_specs and hasattr(car_specs, 'wheelbase') else "Unknown",
"Steering Ratio": f"{car_specs.steerRatio:.1f}" if car_specs and hasattr(car_specs, 'steerRatio') else "Unknown"
}
}
# 详细信息
if is_car_started or is_car_engaged:
car_info.update({
"Cruise Information": {
"Cruise Status": "On" if CS.cruiseState.enabled else "Off",
"Adaptive Cruise": "On" if CS.cruiseState.available else "Off",
"Set Speed": f"{CS.cruiseState.speed * 3.6:.1f} km/h" if CS.cruiseState.speed > 0 else "Not Set",
"Following Distance": str(CS.cruiseState.followDistance) if hasattr(CS.cruiseState, 'followDistance') else "Unknown"
},
"Wheel Speeds": {
"Front Left": f"{CS.wheelSpeeds.fl * 3.6:.1f} km/h",
"Front Right": f"{CS.wheelSpeeds.fr * 3.6:.1f} km/h",
"Rear Left": f"{CS.wheelSpeeds.rl * 3.6:.1f} km/h",
"Rear Right": f"{CS.wheelSpeeds.rr * 3.6:.1f} km/h"
},
"Steering System": {
"Steering Angle": f"{CS.steeringAngleDeg:.1f}°",
"Steering Torque": f"{CS.steeringTorque:.1f} Nm",
"Steering Rate": f"{CS.steeringRateDeg:.1f}°/s",
"Lane Departure": "Yes" if CS.leftBlinker or CS.rightBlinker else "No"
},
"Pedal Status": {
"Throttle Position": f"{CS.gas * 100:.1f}%",
"Brake Pressure": f"{CS.brake * 100:.1f}%",
"Gas Pedal": "Pressed" if CS.gasPressed else "Released",
"Brake Pedal": "Pressed" if CS.brakePressed else "Released"
},
"Safety Systems": {
"ESP Status": "Active" if CS.espDisabled else "Normal",
"ABS Status": "Active" if hasattr(CS, 'absActive') and CS.absActive else "Normal",
"Traction Control": "Active" if hasattr(CS, 'tcsActive') and CS.tcsActive else "Normal",
"Collision Warning": "Warning" if hasattr(CS, 'collisionWarning') and CS.collisionWarning else "Normal"
},
"Door Status": {
"Driver Door": "Open" if CS.doorOpen else "Closed",
"Passenger Door": "Open" if hasattr(CS, 'passengerDoorOpen') and CS.passengerDoorOpen else "Closed",
"Trunk": "Open" if hasattr(CS, 'trunkOpen') and CS.trunkOpen else "Closed",
"Hood": "Open" if hasattr(CS, 'hoodOpen') and CS.hoodOpen else "Closed",
"Seatbelt": "Unbuckled" if CS.seatbeltUnlatched else "Buckled"
},
"Light Status": {
"Left Turn Signal": "On" if CS.leftBlinker else "Off",
"Right Turn Signal": "On" if CS.rightBlinker else "Off",
"High Beam": "On" if CS.genericToggle else "Off",
"Low Beam": "On" if hasattr(CS, 'lowBeamOn') and CS.lowBeamOn else "Off"
},
"Blind Spot Monitor": {
"Left Side": "Vehicle Detected" if CS.leftBlindspot else "Clear",
"Right Side": "Vehicle Detected" if CS.rightBlindspot else "Clear"
}
})
# 添加可选的其他信息
other_info = {}
if hasattr(CS, 'outsideTemp'):
other_info["Outside Temperature"] = f"{CS.outsideTemp:.1f}°C"
if hasattr(CS, 'fuelGauge'):
other_info["Range"] = f"{CS.fuelGauge:.1f}km"
if hasattr(CS, 'odometer'):
other_info["Odometer"] = f"{CS.odometer:.1f}km"
if hasattr(CS, 'instantFuelConsumption'):
other_info["Instant Fuel Consumption"] = f"{CS.instantFuelConsumption:.1f}L/100km"
if other_info:
car_info["Other Information"] = other_info
except Exception as e:
print(f"Error getting vehicle state info: {str(e)}")
traceback.print_exc()
car_info = {
"Basic Information": {
"Car Model": car_name,
"Fingerprint": str(car_fingerprint)
},
"Status": "Unable to get vehicle state information, please check if the vehicle is started"
}
return render_template("carinfo.html", car_info=car_info)
except Exception as e:
print(f"Error rendering carinfo page: {str(e)}")
traceback.print_exc()
return render_template("carinfo.html", car_info={"error": f"Error getting vehicle information: {str(e)}"})
def main():
try:
set_core_affinity([0, 1, 2, 3])

View File

@ -0,0 +1,49 @@
{% extends "layout.html" %}
{% block title %}Vehicle Information{% endblock %}
{% block main %}
<div class="container">
<h1 class="text-center mb-4">Vehicle Information</h1>
{% if car_info %}
{% if car_info.get("error") %}
<div class="alert alert-danger">
{{ car_info.get("error") }}
</div>
{% else %}
{% for section, data in car_info.items() %}
<div class="card mb-3">
<div class="card-header">
<h5 class="mb-0">{{ section }}</h5>
</div>
<div class="card-body">
{% if data is mapping %}
{% for key, value in data.items() %}
<div class="row mb-2">
<div class="col-6">
<strong>{{ key }}</strong>
</div>
<div class="col-6">
{% if value is string and "km/h" in value %}
<span class="badge bg-primary">{{ value }}</span>
{% else %}
{{ value }}
{% endif %}
</div>
</div>
{% endfor %}
{% else %}
{{ data }}
{% endif %}
</div>
</div>
{% endfor %}
{% endif %}
{% else %}
<div class="alert alert-warning">
Unable to retrieve vehicle information
</div>
{% endif %}
</div>
{% endblock %}

View File

@ -8,6 +8,7 @@
<br>
<h1>Fleet Manager</h1>
<br>
<a href='/carinfo'>View Car Information</a><br>
<a href='/footage'>View Dashcam Footage</a><br>
<br><a href='/preserved'>Access Preserved Footage</a><br>
<br><a href='/screenrecords'>View Screen Recordings</a><br>