Merge remote-tracking branch 'origin/sync-priv-20240201' into sync-priv-20240201

This commit is contained in:
DevTekVE
2024-02-09 18:36:46 +01:00
10 changed files with 70 additions and 53 deletions
+1
View File
@@ -236,6 +236,7 @@ std::unordered_map<std::string, uint32_t> keys = {
{"DevUIInfo", PERSISTENT},
{"DisableOnroadUploads", PERSISTENT},
{"DisengageLateralOnBrake", PERSISTENT},
{"DrivingModelGeneration", PERSISTENT},
{"DrivingModelName", PERSISTENT},
{"DrivingModelText", PERSISTENT},
{"DrivingModelUrl", PERSISTENT},
+12 -10
View File
@@ -28,6 +28,7 @@ from openpilot.selfdrive.controls.lib.latcontrol_torque import LatControlTorque
from openpilot.selfdrive.controls.lib.events import Events, ET
from openpilot.selfdrive.controls.lib.alertmanager import AlertManager, set_offroad_alert
from openpilot.selfdrive.controls.lib.vehicle_model import VehicleModel
from openpilot.selfdrive.sunnypilot import get_model_generation
from openpilot.system.hardware import HARDWARE
SOFT_DISABLE_TIME = 3 # seconds
@@ -57,8 +58,6 @@ ACTUATOR_FIELDS = tuple(car.CarControl.Actuators.schema.fields.keys())
ACTIVE_STATES = (State.enabled, State.softDisabling, State.overriding)
ENABLED_STATES = (State.preEnabled, *ACTIVE_STATES)
MODEL_USE_LATERAL_PLANNER = False
class Controls:
def __init__(self, CI=None):
@@ -211,6 +210,9 @@ class Controls:
self.process_not_running = False
self.custom_model, self.model_gen = get_model_generation()
self.model_use_lateral_planner = self.custom_model and self.model_gen == "1"
self.can_log_mono_time = 0
self.startup_event = get_startup_event(car_recognized, controller_available, len(self.CP.carFw) > 0)
@@ -363,8 +365,8 @@ class Controls:
self.events.add(EventName.calibrationInvalid)
# Handle lane change
lane_change_edge_block = self.sm['lateralPlanSPDEPRECATED'].laneChangeEdgeBlockDEPRECATED if MODEL_USE_LATERAL_PLANNER else self.sm['modelV2SP'].laneChangeEdgeBlock
lane_change_svs = self.sm['lateralPlanDEPRECATED'] if MODEL_USE_LATERAL_PLANNER else self.sm['modelV2'].meta
lane_change_edge_block = self.sm['lateralPlanSPDEPRECATED'].laneChangeEdgeBlockDEPRECATED if self.model_use_lateral_planner else self.sm['modelV2SP'].laneChangeEdgeBlock
lane_change_svs = self.sm['lateralPlanDEPRECATED'] if self.model_use_lateral_planner else self.sm['modelV2'].meta
if lane_change_svs.laneChangeState == LaneChangeState.preLaneChange and lane_change_edge_block:
self.events.add(EventName.laneChangeRoadEdge)
elif lane_change_svs.laneChangeState == LaneChangeState.preLaneChange:
@@ -454,7 +456,7 @@ class Controls:
self.logged_comm_issue = None
if not (self.CP.notCar and self.joystick_mode):
if MODEL_USE_LATERAL_PLANNER:
if self.model_use_lateral_planner:
if not self.sm['lateralPlan'].mpcSolutionValid:
self.events.add(EventName.plannerErrorDEPRECATED)
if not self.sm['liveLocationKalman'].posenetOK:
@@ -671,7 +673,7 @@ class Controls:
lat_plan = self.sm['lateralPlan']
long_plan = self.sm['longitudinalPlan']
model_v2 = self.sm['modelV2']
blinker_svs = lat_plan if MODEL_USE_LATERAL_PLANNER else model_v2.meta
blinker_svs = lat_plan if self.model_use_lateral_planner else model_v2.meta
CC = car.CarControl.new_message()
CC.enabled = self.enabled
@@ -710,7 +712,7 @@ class Controls:
actuators.accel = self.LoC.update(CC.longActive, CS, long_plan, pid_accel_limits, t_since_plan)
# Steering PID loop and lateral MPC
if MODEL_USE_LATERAL_PLANNER:
if self.model_use_lateral_planner:
self.desired_curvature = get_lag_adjusted_curvature(self.CP, CS.vEgo, lat_plan.psis, lat_plan.curvatures)
else:
self.desired_curvature = clip_curvature(CS.vEgo, self.desired_curvature, model_v2.action.desiredCurvature)
@@ -719,7 +721,7 @@ class Controls:
self.steer_limited, self.desired_curvature,
self.sm['liveLocationKalman'],
model_data=model_v2)
if MODEL_USE_LATERAL_PLANNER:
if self.model_use_lateral_planner:
actuators.curvature = self.desired_curvature
else:
lac_log = log.ControlsState.LateralDebugState.new_message()
@@ -759,7 +761,7 @@ class Controls:
lac_log.active and self.events.add(EventName.steerSaturated)
elif lac_log.saturated:
# TODO probably should not use dpath_points but curvature
dpath_points = lat_plan.dPathPoints if MODEL_USE_LATERAL_PLANNER else model_v2.position.y
dpath_points = lat_plan.dPathPoints if self.model_use_lateral_planner else model_v2.position.y
if len(dpath_points):
# Check if we deviated from the path
# TODO use desired vs actual curvature
@@ -868,7 +870,7 @@ class Controls:
# Curvature & Steering angle
lp = self.sm['liveParameters']
lp_mono_time_svs = 'lateralPlanDEPRECATED' if MODEL_USE_LATERAL_PLANNER else 'modelV2'
lp_mono_time_svs = 'lateralPlanDEPRECATED' if self.model_use_lateral_planner else 'modelV2'
steer_angle_without_offset = math.radians(CS.steeringAngleDeg - lp.angleOffsetDeg)
curvature = -self.VM.calc_curvature(steer_angle_without_offset, CS.vEgo, lp.roll)
+6 -4
View File
@@ -3,6 +3,7 @@ from openpilot.common.conversions import Conversions as CV
from openpilot.common.params import Params
from openpilot.common.realtime import DT_MDL
from openpilot.selfdrive.controls.lib.drive_helpers import get_road_edge
from openpilot.selfdrive.sunnypilot import get_model_generation
LaneChangeState = log.LaneChangeState
LaneChangeDirection = log.LaneChangeDirection
@@ -10,8 +11,6 @@ LaneChangeDirection = log.LaneChangeDirection
LANE_CHANGE_SPEED_MIN = 20 * CV.MPH_TO_MS
LANE_CHANGE_TIME_MAX = 10.
MODEL_USE_LATERAL_PLANNER = False
DESIRES = {
LaneChangeDirection.none: {
LaneChangeState.off: log.Desire.none,
@@ -63,6 +62,9 @@ class DesireHelper:
self.lane_change_set_timer = int(self.param_s.get("AutoLaneChangeTimer", encoding="utf8"))
self.lane_change_bsm_delay = self.param_s.get_bool("AutoLaneChangeBsmDelay")
self.custom_model, self.model_gen = get_model_generation()
self.model_use_lateral_planner = self.custom_model and self.model_gen == "1"
def read_param(self):
self.edge_toggle = self.param_s.get_bool("RoadEdge")
self.lane_change_set_timer = int(self.param_s.get("AutoLaneChangeTimer", encoding="utf8"))
@@ -77,7 +79,7 @@ class DesireHelper:
one_blinker = carstate.leftBlinker != carstate.rightBlinker
below_lane_change_speed = v_ego < LANE_CHANGE_SPEED_MIN
if MODEL_USE_LATERAL_PLANNER:
if self.model_use_lateral_planner:
self.road_edge = get_road_edge(carstate, model_data, self.edge_toggle)
if not carstate.madsEnabled or self.lane_change_timer > LANE_CHANGE_TIME_MAX:
@@ -93,7 +95,7 @@ class DesireHelper:
self.lane_change_wait_timer = 0
# LaneChangeState.preLaneChange
elif self.lane_change_state == LaneChangeState.preLaneChange and (self.road_edge if MODEL_USE_LATERAL_PLANNER else lat_plan_sp.laneChangeEdgeBlockDEPRECATED):
elif self.lane_change_state == LaneChangeState.preLaneChange and (self.road_edge if self.model_use_lateral_planner else lat_plan_sp.laneChangeEdgeBlockDEPRECATED):
self.lane_change_direction = LaneChangeDirection.none
elif self.lane_change_state == LaneChangeState.preLaneChange:
# Set lane change direction
+6 -4
View File
@@ -10,6 +10,7 @@ from openpilot.selfdrive.controls.lib.lateral_mpc_lib.lat_mpc import N as LAT_MP
from openpilot.selfdrive.controls.lib.lane_planner import LanePlanner, TRAJECTORY_SIZE
from openpilot.selfdrive.controls.lib.drive_helpers import CONTROL_N, MIN_SPEED, get_speed_error, get_road_edge
from openpilot.selfdrive.controls.lib.desire_helper import DesireHelper
from openpilot.selfdrive.sunnypilot import get_model_generation
import cereal.messaging as messaging
from cereal import log
@@ -27,8 +28,6 @@ LATERAL_JERK_COST = 0.04
# speed lateral control is stable on all cars
STEERING_RATE_COST = 700.0
MODEL_USE_LATERAL_PLANNER = False
class LateralPlanner:
def __init__(self, CP, debug=False):
@@ -75,6 +74,9 @@ class LateralPlanner:
self.param_read_counter = 0
self.read_param()
self.custom_model, self.model_gen = get_model_generation()
self.model_use_lateral_planner = self.custom_model and self.model_gen == "1"
def read_param(self):
self.dynamic_lane_profile = int(self.param_s.get("DynamicLaneProfile", encoding='utf8'))
if self.param_read_counter % 50 == 0:
@@ -99,7 +101,7 @@ class LateralPlanner:
md = sm['modelV2']
# TODO: SP - Refactor to work with legacy models
if MODEL_USE_LATERAL_PLANNER:
if self.model_use_lateral_planner:
self.LP.parse_model(md)
if len(md.position.x) == TRAJECTORY_SIZE and (len(md.orientation.x) == TRAJECTORY_SIZE or
(len(md.velocity.x) == TRAJECTORY_SIZE and len(md.lateralPlannerSolutionDEPRECATED.x) == TRAJECTORY_SIZE)):
@@ -175,7 +177,7 @@ class LateralPlanner:
else:
self.solution_invalid_cnt = 0
if not MODEL_USE_LATERAL_PLANNER:
if not self.model_use_lateral_planner:
self.road_edge = get_road_edge(sm['carState'], md, self.edge_toggle)
def get_dynamic_lane_profile(self, longitudinal_plan_sp):
+14 -16
View File
@@ -8,18 +8,18 @@ from openpilot.common.swaglog import cloudlog
from openpilot.selfdrive.modeld.constants import ModelConstants
from openpilot.selfdrive.controls.lib.longitudinal_planner import LongitudinalPlanner
from openpilot.selfdrive.controls.lib.lateral_planner import LateralPlanner
from openpilot.selfdrive.sunnypilot import get_model_generation
import cereal.messaging as messaging
USE_LATERAL_PLANNER = True
MODEL_USE_LATERAL_PLANNER = False
def cumtrapz(x, t):
return np.concatenate([[0], np.cumsum(((x[0:-1] + x[1:])/2) * np.diff(t))])
def publish_ui_plan(sm, pm, lateral_planner=None, longitudinal_planner=None):
def publish_ui_plan(sm, pm, lateral_planner, longitudinal_planner):
# TODO: SP - Reimplement lateral planner with legacy models
if MODEL_USE_LATERAL_PLANNER:
custom_model, model_gen = get_model_generation()
model_use_lateral_planner = custom_model and model_gen == "1"
if model_use_lateral_planner:
plan_odo = cumtrapz(longitudinal_planner.v_desired_trajectory_full, ModelConstants.T_IDXS)
model_odo = cumtrapz(lateral_planner.v_plan, ModelConstants.T_IDXS)
@@ -28,12 +28,12 @@ def publish_ui_plan(sm, pm, lateral_planner=None, longitudinal_planner=None):
uiPlan = ui_send.uiPlan
uiPlan.frameId = sm['modelV2'].frameId
# TODO: SP - Reimplement lateral planner with legacy models
if MODEL_USE_LATERAL_PLANNER:
if model_use_lateral_planner:
x_fp = (lateral_planner.x_sol if lateral_planner.dynamic_lane_profile_status else lateral_planner.lat_mpc.x_sol)[:,0]
y_fp = (lateral_planner.x_sol if lateral_planner.dynamic_lane_profile_status else lateral_planner.lat_mpc.x_sol)[:,1]
uiPlan.position.x = np.interp(plan_odo, model_odo, x_fp).tolist() if MODEL_USE_LATERAL_PLANNER else list(sm['modelV2'].position.x)
uiPlan.position.y = np.interp(plan_odo, model_odo, y_fp).tolist() if MODEL_USE_LATERAL_PLANNER else list(sm['modelV2'].position.y)
uiPlan.position.z = np.interp(plan_odo, model_odo, lateral_planner.path_xyz[:,2]).tolist() if MODEL_USE_LATERAL_PLANNER else list(sm['modelV2'].position.z)
uiPlan.position.x = np.interp(plan_odo, model_odo, x_fp).tolist() if model_use_lateral_planner else list(sm['modelV2'].position.x)
uiPlan.position.y = np.interp(plan_odo, model_odo, y_fp).tolist() if model_use_lateral_planner else list(sm['modelV2'].position.y)
uiPlan.position.z = np.interp(plan_odo, model_odo, lateral_planner.path_xyz[:,2]).tolist() if model_use_lateral_planner else list(sm['modelV2'].position.z)
uiPlan.accel = longitudinal_planner.a_desired_trajectory_full.tolist()
pm.send('uiPlan', ui_send)
@@ -50,8 +50,8 @@ def plannerd_thread():
longitudinal_planner = LongitudinalPlanner(CP)
# TODO: SP - Reimplement lateral planner with legacy models
lateral_planner = LateralPlanner(CP, debug=debug_mode) if USE_LATERAL_PLANNER else None
lateral_planner_svs = ['lateralPlanDEPRECATED', 'lateralPlanSPDEPRECATED'] if USE_LATERAL_PLANNER else []
lateral_planner = LateralPlanner(CP, debug=debug_mode)
lateral_planner_svs = ['lateralPlanDEPRECATED', 'lateralPlanSPDEPRECATED']
pm = messaging.PubMaster(['longitudinalPlan', 'uiPlan', 'longitudinalPlanSP'] + lateral_planner_svs)
sm = messaging.SubMaster(['carControl', 'carState', 'controlsState', 'radarState', 'modelV2',
@@ -63,13 +63,11 @@ def plannerd_thread():
sm.update()
if sm.updated['modelV2']:
# TODO: SP - Reimplement lateral planner with legacy models
if USE_LATERAL_PLANNER:
lateral_planner.update(sm)
lateral_planner.publish(sm, pm)
lateral_planner.update(sm)
lateral_planner.publish(sm, pm)
longitudinal_planner.update(sm)
longitudinal_planner.publish(sm, pm)
publish_ui_plan(sm, pm, lateral_planner=lateral_planner, longitudinal_planner=longitudinal_planner)
publish_ui_plan(sm, pm, lateral_planner, longitudinal_planner)
def main():
plannerd_thread()
+3 -4
View File
@@ -4,14 +4,12 @@ import numpy as np
from typing import Dict
from cereal import log
from openpilot.selfdrive.modeld.constants import ModelConstants, Plan, Meta
from openpilot.selfdrive.sunnypilot import get_model_generation
SEND_RAW_PRED = os.getenv('SEND_RAW_PRED')
ConfidenceClass = log.ModelDataV2.ConfidenceClass
MODEL_USE_LATERAL_PLANNER = False
MODEL_USE_DESIRED_CURVATURES = False
class PublishState:
def __init__(self):
@@ -50,6 +48,7 @@ def fill_model_msg(msg: capnp._DynamicStructBuilder, net_output_data: Dict[str,
vipc_frame_id: int, vipc_frame_id_extra: int, frame_id: int, frame_drop: float,
timestamp_eof: int, timestamp_llk: int, model_execution_time: float,
nav_enabled: bool, v_ego: float, steer_delay: float, valid: bool) -> None:
custom_model, model_gen = get_model_generation()
frame_age = frame_id - vipc_frame_id if frame_id > vipc_frame_id else 0
msg.valid = valid
@@ -76,7 +75,7 @@ def fill_model_msg(msg: capnp._DynamicStructBuilder, net_output_data: Dict[str,
fill_xyzt(orientation_rate, ModelConstants.T_IDXS, *net_output_data['plan'][0,:,Plan.ORIENTATION_RATE].T)
# lateral planning
if MODEL_USE_LATERAL_PLANNER:
if custom_model and model_gen == "1":
solution = modelV2.lateralPlannerSolution
solution.x, solution.y, solution.yaw, solution.yawRate = [net_output_data['lat_planner_solution'][0,:,i].tolist() for i in range(4)]
solution.xStd, solution.yStd, solution.yawStd, solution.yawRateStd = [net_output_data['lat_planner_solution_stds'][0,:,i].tolist() for i in range(4)]
+16 -15
View File
@@ -25,6 +25,7 @@ from openpilot.selfdrive.modeld.parse_model_outputs import Parser
from openpilot.selfdrive.modeld.fill_model_msg import fill_model_msg, fill_pose_msg, PublishState
from openpilot.selfdrive.modeld.constants import ModelConstants
from openpilot.selfdrive.modeld.models.commonmodel_pyx import ModelFrame, CLContext
from openpilot.selfdrive.sunnypilot import get_model_generation
PROCESS_NAME = "selfdrive.modeld.modeld"
SEND_RAW_PRED = os.getenv('SEND_RAW_PRED')
@@ -39,9 +40,6 @@ CUSTOM_MODEL_PATH = "/data/media/0/models"
LaneChangeState = log.LaneChangeState
MODEL_USE_LATERAL_PLANNER = False
MODEL_USE_DESIRED_CURVATURES = False
class FrameMeta:
frame_id: int = 0
@@ -61,6 +59,7 @@ class ModelState:
model: ModelRunner
def __init__(self, context: CLContext):
self.custom_model, self.model_gen = get_model_generation()
self.frame = ModelFrame(context)
self.wide_frame = ModelFrame(context)
self.prev_desire = np.zeros(ModelConstants.DESIRE_LEN, dtype=np.float32)
@@ -74,11 +73,11 @@ class ModelState:
'features_buffer': np.zeros(ModelConstants.HISTORY_BUFFER_LEN * ModelConstants.FEATURE_LEN, dtype=np.float32),
}
if MODEL_USE_LATERAL_PLANNER:
if self.custom_model and self.model_gen == "1":
self.inputs['lat_planner_state'] = np.zeros(ModelConstants.LAT_PLANNER_STATE_LEN, dtype=np.float32)
else:
self.inputs['lateral_control_params'] = np.zeros(ModelConstants.LATERAL_CONTROL_PARAMS_LEN, dtype=np.float32)
if MODEL_USE_DESIRED_CURVATURES:
if self.custom_model and self.model_gen == "2":
self.inputs['prev_desired_curvs'] = np.zeros(ModelConstants.PREV_DESIRED_CURVS_LEN, dtype=np.float32)
else:
self.inputs['prev_desired_curv'] = np.zeros(ModelConstants.PREV_DESIRED_CURV_LEN * (ModelConstants.HISTORY_BUFFER_LEN+1), dtype=np.float32)
@@ -121,7 +120,7 @@ class ModelState:
self.prev_desire[:] = inputs['desire']
self.inputs['traffic_convention'][:] = inputs['traffic_convention']
if not MODEL_USE_LATERAL_PLANNER:
if not (self.custom_model and self.model_gen == "1"):
self.inputs['lateral_control_params'][:] = inputs['lateral_control_params']
self.inputs['nav_features'][:] = inputs['nav_features']
self.inputs['nav_instructions'][:] = inputs['nav_instructions']
@@ -139,10 +138,10 @@ class ModelState:
self.inputs['features_buffer'][:-ModelConstants.FEATURE_LEN] = self.inputs['features_buffer'][ModelConstants.FEATURE_LEN:]
self.inputs['features_buffer'][-ModelConstants.FEATURE_LEN:] = outputs['hidden_state'][0, :]
if MODEL_USE_LATERAL_PLANNER:
if self.custom_model and self.model_gen == "1":
self.inputs['lat_planner_state'][2] = interp(DT_MDL, ModelConstants.T_IDXS, outputs['lat_planner_solution'][0, :, 2])
self.inputs['lat_planner_state'][3] = interp(DT_MDL, ModelConstants.T_IDXS, outputs['lat_planner_solution'][0, :, 3])
elif MODEL_USE_DESIRED_CURVATURES:
elif self.custom_model and self.model_gen == "2":
self.inputs['prev_desired_curvs'][:-1] = self.inputs['prev_desired_curvs'][1:]
self.inputs['prev_desired_curvs'][-1] = outputs['desired_curvature'][0, 0]
else:
@@ -161,6 +160,8 @@ def main(demo=False):
model = ModelState(cl_context)
cloudlog.warning("models loaded, modeld starting")
custom_model, model_gen = get_model_generation()
# visionipc clients
while True:
available_streams = VisionIpcClient.available_streams("camerad", block=False)
@@ -191,7 +192,7 @@ def main(demo=False):
publish_state = PublishState()
params = Params()
if not MODEL_USE_LATERAL_PLANNER:
if not (custom_model and model_gen == "1"):
with car.CarParams.from_bytes(params.get("CarParams", block=True)) as msg:
steer_delay = msg.steerActuatorDelay + .2
#steer_delay = 0.4
@@ -205,7 +206,7 @@ def main(demo=False):
model_transform_main = np.zeros((3, 3), dtype=np.float32)
model_transform_extra = np.zeros((3, 3), dtype=np.float32)
live_calib_seen = False
if MODEL_USE_LATERAL_PLANNER:
if custom_model and model_gen == "1":
driving_style = np.array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], dtype=np.float32)
nav_features = np.zeros(ModelConstants.NAV_FEATURE_LEN, dtype=np.float32)
nav_instructions = np.zeros(ModelConstants.NAV_INSTRUCTION_LEN, dtype=np.float32)
@@ -260,11 +261,11 @@ def main(demo=False):
# TODO: path planner timeout?
sm.update(0)
desire = sm["lateralPlan"].desire.raw if MODEL_USE_LATERAL_PLANNER else DH.desire
desire = sm["lateralPlan"].desire.raw if custom_model and model_gen == "1" else DH.desire
v_ego = sm["carState"].vEgo
is_rhd = sm["driverMonitoringState"].isRHD
frame_id = sm["roadCameraState"].frameId
if not MODEL_USE_LATERAL_PLANNER:
if not (custom_model and model_gen == "1"):
# TODO add lag
lateral_control_params = np.array([sm["carState"].vEgo, steer_delay], dtype=np.float32)
if sm.updated["liveCalibration"]:
@@ -324,7 +325,7 @@ def main(demo=False):
'nav_features': nav_features,
'nav_instructions': nav_instructions}
if MODEL_USE_LATERAL_PLANNER:
if custom_model and model_gen == "1":
inputs['driving_style'] = driving_style
else:
inputs['lateral_control_params'] = lateral_control_params
@@ -342,7 +343,7 @@ def main(demo=False):
fill_model_msg(modelv2_send, model_output, publish_state, meta_main.frame_id, meta_extra.frame_id, frame_id, frame_drop_ratio,
meta_main.timestamp_eof, timestamp_llk, model_execution_time, nav_enabled, v_ego, steer_delay, live_calib_seen)
if not MODEL_USE_LATERAL_PLANNER:
if not (custom_model and model_gen == "1"):
desire_state = modelv2_send.modelV2.meta.desireState
l_lane_change_prob = desire_state[log.Desire.laneChangeLeft]
r_lane_change_prob = desire_state[log.Desire.laneChangeRight]
@@ -355,7 +356,7 @@ def main(demo=False):
pm.send('modelV2', modelv2_send)
pm.send('cameraOdometry', posenet_send)
if not MODEL_USE_LATERAL_PLANNER:
if not (custom_model and model_gen == "1"):
modelv2_sp_send = messaging.new_message('modelV2SP')
modelv2_sp_send.valid = True
modelv2_sp_send.modelV2SP.laneChangePrev = DH.prev_lane_change
+8
View File
@@ -0,0 +1,8 @@
from openpilot.common.params import Params
def get_model_generation():
params = Params()
custom_model = params.get_bool("CustomDrivingModel")
gen = params.get("DrivingModelGeneration", encoding="utf8")
return custom_model, gen
@@ -28,6 +28,7 @@ public:
downloadUri = json["download_uri"].toString();
index = json["index"].toString();
environment = json["environment"].toString();
generation = json["generation"].toString();
}
QJsonObject toJson() const {
@@ -38,6 +39,7 @@ public:
json["download_uri"] = downloadUri;
json["index"] = index;
json["environment"] = environment;
json["generation"] = generation;
return json;
}
@@ -47,6 +49,7 @@ public:
QString downloadUri;
QString index;
QString environment;
QString generation;
};
class ModelsFetcher : public QObject {
@@ -44,6 +44,7 @@ void SoftwarePanelSP::HandleModelDownloadProgressReport() {
params.put("DrivingModelText", selectedModelToDownload->fullName.toStdString());
params.put("DrivingModelName", selectedModelToDownload->displayName.toStdString());
//params.put("DrivingModelUrl", selectedModelToDownload->downloadUri.toStdString()); // TODO: Placeholder for future implementations
params.put("DrivingModelGeneration", selectedModelToDownload->generation.toStdString());
selectedModelToDownload.reset();
params.putBool("CustomDrivingModel", true);
}