37using ::apollo::common::VehicleSignal;
38using ::apollo::drivers::canbus::ProtocolData;
44const int32_t kMaxFailAttempt = 10;
45const int32_t CHECK_RESPONSE_STEER_UNIT_FLAG = 1;
46const int32_t CHECK_RESPONSE_SPEED_UNIT_FLAG = 2;
52 CanSender<::apollo::canbus::Lincoln> *
const can_sender,
53 MessageManager<::apollo::canbus::Lincoln> *
const message_manager) {
55 AINFO <<
"LincolnController has already been initiated.";
56 return ErrorCode::CANBUS_ERROR;
59 common::VehicleConfigHelper::Instance()->GetConfig().vehicle_param());
61 if (!
params_.has_driving_mode()) {
62 AERROR <<
"Vehicle conf pb not set driving_mode.";
63 return ErrorCode::CANBUS_ERROR;
66 if (can_sender ==
nullptr) {
67 AERROR <<
"Canbus sender is null.";
68 return ErrorCode::CANBUS_ERROR;
72 if (message_manager ==
nullptr) {
73 AERROR <<
"Protocol manager is null.";
74 return ErrorCode::CANBUS_ERROR;
79 brake_60_ =
dynamic_cast<Brake60 *
>(
81 if (brake_60_ ==
nullptr) {
82 AERROR <<
"Brake60 does not exist in the LincolnMessageManager!";
83 return ErrorCode::CANBUS_ERROR;
88 if (throttle_62_ ==
nullptr) {
89 AERROR <<
"Throttle62 does not exist in the LincolnMessageManager!";
90 return ErrorCode::CANBUS_ERROR;
95 if (steering_64_ ==
nullptr) {
96 AERROR <<
"Steering64 does not exist in the LincolnMessageManager!";
97 return ErrorCode::CANBUS_ERROR;
100 gear_66_ =
dynamic_cast<Gear66 *
>(
102 if (gear_66_ ==
nullptr) {
103 AERROR <<
"Gear66 does not exist in the LincolnMessageManager!";
104 return ErrorCode::CANBUS_ERROR;
108 if (turnsignal_68_ ==
nullptr) {
109 AERROR <<
"Turnsignal68 does not exist in the LincolnMessageManager!";
110 return ErrorCode::CANBUS_ERROR;
120 AINFO <<
"LincolnController is initialized.";
124 return ErrorCode::OK;
129 AERROR <<
"LincolnController has NOT been initiated.";
132 const auto &update_func = [
this] { SecurityDogThreadFunc(); };
133 thread_.reset(
new std::thread(update_func));
140 AERROR <<
"LincolnController stops or starts improperly!";
144 if (thread_ !=
nullptr && thread_->joinable()) {
147 AINFO <<
"LincolnController stopped.";
163 chassis_.set_error_code(chassis_error_code());
166 chassis_.set_engine_started(
true);
168 if (chassis_detail.has_ems() && chassis_detail.
ems().has_engine_rpm()) {
169 chassis_.set_engine_rpm(
172 chassis_.set_engine_rpm(0);
175 if (chassis_detail.has_vehicle_spd() &&
177 chassis_.set_speed_mps(
179 chassis_.mutable_wheel_speed()->set_is_wheel_spd_rr_valid(
181 chassis_.mutable_wheel_speed()->set_wheel_direction_rr(
183 chassis_.mutable_wheel_speed()->set_wheel_spd_rr(
186 chassis_.mutable_wheel_speed()->set_is_wheel_spd_rl_valid(
188 chassis_.mutable_wheel_speed()->set_wheel_direction_rl(
190 chassis_.mutable_wheel_speed()->set_wheel_spd_rl(
193 chassis_.mutable_wheel_speed()->set_is_wheel_spd_fr_valid(
195 chassis_.mutable_wheel_speed()->set_wheel_direction_fr(
197 chassis_.mutable_wheel_speed()->set_wheel_spd_fr(
200 chassis_.mutable_wheel_speed()->set_is_wheel_spd_fl_valid(
202 chassis_.mutable_wheel_speed()->set_wheel_direction_fl(
204 chassis_.mutable_wheel_speed()->set_wheel_spd_fl(
208 chassis_.set_speed_mps(0);
211 if (chassis_detail.has_basic() && chassis_detail.
basic().has_odo_meter()) {
213 chassis_.set_odometer_m(
216 chassis_.set_odometer_m(0);
222 chassis_.set_fuel_range_m(0);
224 if (chassis_detail.has_gas() && chassis_detail.
gas().has_throttle_output()) {
225 chassis_.set_throttle_percentage(
228 chassis_.set_throttle_percentage(0);
231 if (chassis_detail.has_brake() && chassis_detail.
brake().has_brake_output()) {
232 chassis_.set_brake_percentage(
235 chassis_.set_brake_percentage(0);
238 if (chassis_detail.has_gear() && chassis_detail.
gear().has_gear_state()) {
244 if (chassis_detail.has_eps() && chassis_detail.
eps().has_steering_angle()) {
245 chassis_.set_steering_percentage(
249 chassis_.set_steering_percentage(0);
252 if (chassis_detail.has_eps() && chassis_detail.
eps().has_epas_torque()) {
253 chassis_.set_steering_torque_nm(
256 chassis_.set_steering_torque_nm(0);
259 if (chassis_detail.has_eps() &&
260 chassis_detail.
epb().has_parking_brake_status()) {
264 chassis_.set_parking_brake(
false);
268 if (chassis_detail.has_light() &&
269 chassis_detail.
light().has_lincoln_lamp_type()) {
270 chassis_.mutable_signal()->set_high_beam(
273 chassis_.mutable_signal()->set_high_beam(
false);
277 if (chassis_detail.has_light() &&
278 chassis_detail.
light().has_turn_light_type() &&
281 chassis_.mutable_signal()->set_turn_signal(
285 chassis_.mutable_signal()->set_turn_signal(
288 chassis_.mutable_signal()->set_turn_signal(
292 chassis_.mutable_signal()->set_turn_signal(
296 if (chassis_detail.has_light() && chassis_detail.
light().has_is_horn_on() &&
298 chassis_.mutable_signal()->set_horn(
true);
300 chassis_.mutable_signal()->set_horn(
false);
305 if (chassis_detail.has_eps() && chassis_detail.
eps().has_timestamp_65()) {
309 if (chassis_error_mask_) {
310 chassis_.set_chassis_error_mask(chassis_error_mask_);
315 if (chassis_detail.
basic().has_gps_valid()) {
316 chassis_.mutable_chassis_gps()->set_latitude(
318 chassis_.mutable_chassis_gps()->set_longitude(
320 chassis_.mutable_chassis_gps()->set_gps_valid(
322 chassis_.mutable_chassis_gps()->set_year(chassis_detail.
basic().
year());
323 chassis_.mutable_chassis_gps()->set_month(chassis_detail.
basic().
month());
324 chassis_.mutable_chassis_gps()->set_day(chassis_detail.
basic().
day());
325 chassis_.mutable_chassis_gps()->set_hours(chassis_detail.
basic().
hours());
326 chassis_.mutable_chassis_gps()->set_minutes(
328 chassis_.mutable_chassis_gps()->set_seconds(
330 chassis_.mutable_chassis_gps()->set_compass_direction(
332 chassis_.mutable_chassis_gps()->set_pdop(chassis_detail.
basic().
pdop());
333 chassis_.mutable_chassis_gps()->set_is_gps_fault(
335 chassis_.mutable_chassis_gps()->set_is_inferred(
337 chassis_.mutable_chassis_gps()->set_altitude(
339 chassis_.mutable_chassis_gps()->set_heading(
341 chassis_.mutable_chassis_gps()->set_hdop(chassis_detail.
basic().
hdop());
342 chassis_.mutable_chassis_gps()->set_vdop(chassis_detail.
basic().
vdop());
343 chassis_.mutable_chassis_gps()->set_quality(
345 chassis_.mutable_chassis_gps()->set_num_satellites(
347 chassis_.mutable_chassis_gps()->set_gps_speed(
350 chassis_.mutable_chassis_gps()->set_gps_valid(
false);
355 chassis_.mutable_vehicle_id()->set_vin(chassis_detail.
vehicle_id().
vin());
356 if (!received_vin_) {
359 received_vin_ =
true;
363 if (chassis_detail.has_surround()) {
364 chassis_.mutable_surround()->CopyFrom(chassis_detail.
surround());
369 chassis_.mutable_engage_advice()->set_advice(
371 chassis_.mutable_engage_advice()->set_reason(
"Chassis error!");
372 }
else if (chassis_.
parking_brake() || CheckSafetyError(chassis_detail)) {
373 chassis_.mutable_engage_advice()->set_advice(
375 chassis_.mutable_engage_advice()->set_reason(
376 "Vehicle is not in a safe state to engage!");
378 chassis_.mutable_engage_advice()->set_advice(
384bool LincolnController::VerifyID() {
return true; }
386void LincolnController::Emergency() {
394ErrorCode LincolnController::EnableAutoMode() {
396 AINFO <<
"Already in COMPLETE_AUTO_DRIVE mode";
397 return ErrorCode::OK;
405 CHECK_RESPONSE_STEER_UNIT_FLAG | CHECK_RESPONSE_SPEED_UNIT_FLAG;
406 if (!CheckResponse(flag,
true)) {
407 AERROR <<
"Failed to switch to COMPLETE_AUTO_DRIVE mode.";
410 return ErrorCode::CANBUS_ERROR;
413 AINFO <<
"Switch to COMPLETE_AUTO_DRIVE mode ok.";
414 return ErrorCode::OK;
417ErrorCode LincolnController::DisableAutoMode() {
422 AINFO <<
"Switch to COMPLETE_MANUAL ok.";
423 return ErrorCode::OK;
426ErrorCode LincolnController::EnableSteeringOnlyMode() {
430 AINFO <<
"Already in AUTO_STEER_ONLY mode";
431 return ErrorCode::OK;
438 if (!CheckResponse(CHECK_RESPONSE_STEER_UNIT_FLAG,
true)) {
439 AERROR <<
"Failed to switch to AUTO_STEER_ONLY mode.";
442 return ErrorCode::CANBUS_ERROR;
445 AINFO <<
"Switch to AUTO_STEER_ONLY mode ok.";
446 return ErrorCode::OK;
449ErrorCode LincolnController::EnableSpeedOnlyMode() {
453 AINFO <<
"Already in AUTO_SPEED_ONLY mode";
454 return ErrorCode::OK;
461 if (!CheckResponse(CHECK_RESPONSE_SPEED_UNIT_FLAG,
true)) {
462 AERROR <<
"Failed to switch to AUTO_SPEED_ONLY mode.";
465 return ErrorCode::CANBUS_ERROR;
468 AINFO <<
"Switch to AUTO_SPEED_ONLY mode ok.";
469 return ErrorCode::OK;
476 AINFO <<
"This drive mode no need to set gear.";
480 Lincoln chassis_detail;
483 chassis_detail.gear().gear_state();
484 if (ref_gear_position == current_gear_position) {
490 if (ref_gear_position != current_gear_position &&
495 gear_tmp_ = ref_gear_position;
524 AERROR <<
"Gear command is invalid!";
540void LincolnController::Brake(
double pedal) {
543 AINFO <<
"The current drive mode does not need to set acceleration.";
551void LincolnController::Throttle(
double pedal) {
554 AINFO <<
"The current drive mode does not need to set acceleration.";
562void LincolnController::Acceleration(
double acc) {
565 AINFO <<
"The current drive mode does not need to set acceleration.";
575void LincolnController::Steer(
double angle) {
578 AINFO <<
"The current driving mode does not need to set steer.";
581 const double real_angle =
590void LincolnController::Steer(
double angle,
double angle_spd) {
593 AINFO <<
"The current driving mode does not need to set steer.";
596 const double real_angle =
598 const double real_angle_spd =
599 ProtocolData<::apollo::canbus::Lincoln>::BoundedValue(
608void LincolnController::SetEpbBreak(
const ControlCommand &command) {
609 if (command.parking_brake()) {
616ErrorCode LincolnController::HandleCustomOperation(
617 const external_command::ChassisCommand &command) {
618 return ErrorCode::OK;
621void LincolnController::SetBeam(
const VehicleSignal &vehicle_signal) {
622 if (vehicle_signal.has_high_beam() && vehicle_signal.high_beam()) {
624 }
else if (vehicle_signal.has_low_beam() && vehicle_signal.low_beam()) {
631void LincolnController::SetHorn(
const VehicleSignal &vehicle_signal) {
632 if (vehicle_signal.horn()) {
639void LincolnController::SetTurningSignal(
const VehicleSignal &vehicle_signal) {
641 auto signal = vehicle_signal.turn_signal();
651void LincolnController::ResetProtocol() {
655bool LincolnController::CheckChassisError() {
656 Lincoln chassis_detail;
659 int32_t error_cnt = 0;
660 int32_t chassis_error_mask = 0;
663 bool steer_fault = chassis_detail.eps().watchdog_fault() |
664 chassis_detail.eps().channel_1_fault() |
665 chassis_detail.eps().channel_2_fault() |
666 chassis_detail.eps().calibration_fault() |
667 chassis_detail.eps().connector_fault();
669 chassis_error_mask |=
670 ((chassis_detail.eps().watchdog_fault()) << (++error_cnt));
671 chassis_error_mask |=
672 ((chassis_detail.eps().channel_1_fault()) << (++error_cnt));
673 chassis_error_mask |=
674 ((chassis_detail.eps().channel_2_fault()) << (++error_cnt));
675 chassis_error_mask |=
676 ((chassis_detail.eps().calibration_fault()) << (++error_cnt));
677 chassis_error_mask |=
678 ((chassis_detail.eps().connector_fault()) << (++error_cnt));
680 if (!chassis_detail.has_brake()) {
682 << chassis_detail.DebugString();
686 bool brake_fault = chassis_detail.brake().watchdog_fault() |
687 chassis_detail.brake().channel_1_fault() |
688 chassis_detail.brake().channel_2_fault() |
689 chassis_detail.brake().boo_fault() |
690 chassis_detail.brake().connector_fault();
692 chassis_error_mask |=
693 ((chassis_detail.brake().watchdog_fault()) << (++error_cnt));
694 chassis_error_mask |=
695 ((chassis_detail.brake().channel_1_fault()) << (++error_cnt));
696 chassis_error_mask |=
697 ((chassis_detail.brake().channel_2_fault()) << (++error_cnt));
698 chassis_error_mask |= ((chassis_detail.brake().boo_fault()) << (++error_cnt));
699 chassis_error_mask |=
700 ((chassis_detail.brake().connector_fault()) << (++error_cnt));
702 if (!chassis_detail.has_gas()) {
703 AERROR_EVERY(100) <<
"Lincoln has NO gas." << chassis_detail.DebugString();
707 bool throttle_fault = chassis_detail.gas().watchdog_fault() |
708 chassis_detail.gas().channel_1_fault() |
709 chassis_detail.gas().channel_2_fault() |
710 chassis_detail.gas().connector_fault();
712 chassis_error_mask |=
713 ((chassis_detail.gas().watchdog_fault()) << (++error_cnt));
714 chassis_error_mask |=
715 ((chassis_detail.gas().channel_1_fault()) << (++error_cnt));
716 chassis_error_mask |=
717 ((chassis_detail.gas().channel_2_fault()) << (++error_cnt));
718 chassis_error_mask |=
719 ((chassis_detail.gas().connector_fault()) << (++error_cnt));
721 if (!chassis_detail.has_gear()) {
722 AERROR_EVERY(100) <<
"Lincoln has NO gear." << chassis_detail.DebugString();
726 bool gear_fault = chassis_detail.gear().canbus_fault();
728 chassis_error_mask |=
729 ((chassis_detail.gear().canbus_fault()) << (++error_cnt));
731 set_chassis_error_mask(chassis_error_mask);
736 << chassis_detail.eps().watchdog_fault() <<
", "
737 << chassis_detail.eps().channel_1_fault() <<
", "
738 << chassis_detail.eps().channel_2_fault() <<
", "
739 << chassis_detail.eps().calibration_fault() <<
", "
740 << chassis_detail.eps().connector_fault();
746 << chassis_detail.brake().watchdog_fault() <<
", "
747 << chassis_detail.brake().channel_1_fault() <<
", "
748 << chassis_detail.brake().channel_2_fault() <<
", "
749 << chassis_detail.brake().boo_fault() <<
", "
750 << chassis_detail.brake().connector_fault();
753 if (throttle_fault) {
756 << chassis_detail.gas().watchdog_fault() <<
", "
757 << chassis_detail.gas().channel_1_fault() <<
", "
758 << chassis_detail.gas().channel_2_fault() <<
", "
759 << chassis_detail.gas().connector_fault();
765 << chassis_detail.gear().canbus_fault();
768 if (steer_fault || brake_fault || throttle_fault) {
775void LincolnController::SecurityDogThreadFunc() {
777 AERROR <<
"Failed to run SecurityDogThreadFunc() because can_sender_ is "
782 std::this_thread::yield();
785 std::chrono::duration<double, std::micro> default_period{50000};
788 int32_t speed_ctrl_fail = 0;
789 int32_t steer_ctrl_fail = 0;
793 bool emergency_mode =
false;
798 !CheckResponse(CHECK_RESPONSE_STEER_UNIT_FLAG,
false)) {
800 if (steer_ctrl_fail >= kMaxFailAttempt) {
801 emergency_mode =
true;
811 !CheckResponse(CHECK_RESPONSE_SPEED_UNIT_FLAG,
false)) {
813 if (speed_ctrl_fail >= kMaxFailAttempt) {
814 emergency_mode =
true;
820 if (CheckChassisError()) {
821 emergency_mode =
true;
828 std::chrono::duration<double, std::micro> elapsed{end - start};
829 if (elapsed < default_period) {
830 std::this_thread::sleep_for(default_period - elapsed);
834 <<
"Too much time consumption in LincolnController looping process:"
841bool LincolnController::CheckResponse(
const int32_t flags,
bool need_wait) {
844 int32_t retry_num = 20;
845 Lincoln chassis_detail;
846 bool is_eps_online =
false;
847 bool is_vcu_online =
false;
848 bool is_esp_online =
false;
855 bool check_ok =
true;
856 if (flags & CHECK_RESPONSE_STEER_UNIT_FLAG) {
857 is_eps_online = chassis_detail.has_check_response() &&
858 chassis_detail.check_response().has_is_eps_online() &&
859 chassis_detail.check_response().is_eps_online();
860 check_ok = check_ok && is_eps_online;
863 if (flags & CHECK_RESPONSE_SPEED_UNIT_FLAG) {
864 is_vcu_online = chassis_detail.has_check_response() &&
865 chassis_detail.check_response().has_is_vcu_online() &&
866 chassis_detail.check_response().is_vcu_online();
867 is_esp_online = chassis_detail.has_check_response() &&
868 chassis_detail.check_response().has_is_esp_online() &&
869 chassis_detail.check_response().is_esp_online();
870 check_ok = check_ok && is_vcu_online && is_esp_online;
875 AINFO <<
"Need to check response again.";
878 std::this_thread::sleep_for(
879 std::chrono::duration<double, std::milli>(20));
881 }
while (need_wait && retry_num);
883 AINFO <<
"check_response fail: is_eps_online:" << is_eps_online
884 <<
", is_vcu_online:" << is_vcu_online
885 <<
", is_esp_online:" << is_esp_online;
889void LincolnController::set_chassis_error_mask(
const int32_t mask) {
890 std::lock_guard<std::mutex> lock(chassis_mask_mutex_);
891 chassis_error_mask_ = mask;
894int32_t LincolnController::chassis_error_mask() {
895 std::lock_guard<std::mutex> lock(chassis_mask_mutex_);
896 return chassis_error_mask_;
900 std::lock_guard<std::mutex> lock(chassis_error_code_mutex_);
901 return chassis_error_code_;
904void LincolnController::set_chassis_error_code(
906 std::lock_guard<std::mutex> lock(chassis_error_code_mutex_);
907 chassis_error_code_ = error_code;
910bool LincolnController::CheckSafetyError(
911 const ::apollo::canbus::Lincoln &chassis_detail) {
913 chassis_detail.safety().is_passenger_door_open() ||
914 chassis_detail.safety().is_rearleft_door_open() ||
915 chassis_detail.safety().is_rearright_door_open() ||
916 chassis_detail.safety().is_hood_open() ||
917 chassis_detail.safety().is_trunk_open() ||
918 (chassis_detail.safety().is_passenger_detected() &&
919 (!chassis_detail.safety().is_passenger_airbag_enabled() ||
920 !chassis_detail.safety().is_passenger_buckled()));
921 ADEBUG <<
"Vehicle safety error status is : " << safety_error;