def test_hud(self):
   packer = CANPacker('chrysler_pacifica_2017_hybrid')
   self.assertEqual(
       [0x2a6, 0, '0100010100000000'.decode('hex'), 0],
       chryslercan.create_lkas_hud(
           packer,
           'park', False, False, 1, 0))
   self.assertEqual(
       [0x2a6, 0, '0100010000000000'.decode('hex'), 0],
       chryslercan.create_lkas_hud(
           packer,
           'park', False, False, 5*4, 0))
   self.assertEqual(
       [0x2a6, 0, '0100010000000000'.decode('hex'), 0],
       chryslercan.create_lkas_hud(
           packer,
           'park', False, False, 99999, 0))
   self.assertEqual(
       [0x2a6, 0, '0200060000000000'.decode('hex'), 0],
       chryslercan.create_lkas_hud(
           packer,
           'drive', True, False, 99999, 0))
   self.assertEqual(
       [0x2a6, 0, '0264060000000000'.decode('hex'), 0],
       chryslercan.create_lkas_hud(
           packer,
           'drive', True, False, 99999, 0x64))
    def test_correctness(self):
        # Test all commands, randomize the params.
        for _ in xrange(1000):
            gear = ('drive', 'reverse', 'low')[random.randint(0, 3) % 3]
            lkas_active = (random.randint(0, 2) % 2 == 0)
            hud_alert = random.randint(0, 6)
            hud_count = random.randint(0, 65536)
            lkas_car_model = random.randint(0, 65536)
            m_old = chryslercan.create_lkas_hud(self.chrysler_cp_old, gear,
                                                lkas_active, hud_alert,
                                                hud_count, lkas_car_model)
            m = chryslercan.create_lkas_hud(self.chrysler_cp, gear,
                                            lkas_active, hud_alert, hud_count,
                                            lkas_car_model)
            self.assertEqual(m_old, m)

            apply_steer = (random.randint(0, 2) % 2 == 0)
            moving_fast = (random.randint(0, 2) % 2 == 0)
            frame = random.randint(0, 65536)
            m_old = chryslercan.create_lkas_command(self.chrysler_cp_old,
                                                    apply_steer, moving_fast,
                                                    frame)
            m = chryslercan.create_lkas_command(self.chrysler_cp, apply_steer,
                                                moving_fast, frame)
            self.assertEqual(m_old, m)
    def update(self, sendcan, enabled, CS, frame, actuators, pcm_cancel_cmd,
               hud_alert, audible_alert):

        # this seems needed to avoid steering faults and to force the sync with the EPS counter
        if self.prev_frame == frame:
            return

        # *** compute control surfaces ***
        # steer torque
        apply_steer = actuators.steer * SteerLimitParams.STEER_MAX
        apply_steer = apply_toyota_steer_torque_limits(apply_steer,
                                                       self.apply_steer_last,
                                                       CS.steer_torque_motor,
                                                       SteerLimitParams)

        moving_fast = CS.v_ego > CS.CP.minSteerSpeed  # for status message
        lkas_active = moving_fast and enabled

        if not lkas_active:
            apply_steer = 0

        self.apply_steer_last = apply_steer

        if audible_alert in LOUD_ALERTS:
            self.send_chime = True

        can_sends = []

        #*** control msgs ***

        if self.send_chime:
            new_msg = create_chimes(AudibleAlert)
            can_sends.append(new_msg)
            if audible_alert not in LOUD_ALERTS:
                self.send_chime = False

        if pcm_cancel_cmd:
            # TODO: would be better to start from frame_2b3
            new_msg = create_wheel_buttons(self.ccframe)
            can_sends.append(new_msg)

        # frame is 100Hz (0.01s period)
        if (self.ccframe % 10 == 0):  # 0.1s period
            new_msg = create_lkas_heartbit(self.car_fingerprint)
            can_sends.append(new_msg)

        if (self.ccframe % 25 == 0):  # 0.25s period
            new_msg = create_lkas_hud(self.packer, CS.gear_shifter,
                                      lkas_active, hud_alert,
                                      self.car_fingerprint, self.hud_count)
            can_sends.append(new_msg)
            self.hud_count += 1

        new_msg = create_lkas_command(self.packer, int(apply_steer), frame)
        can_sends.append(new_msg)

        self.ccframe += 1
        self.prev_frame = frame
        sendcan.send(
            can_list_to_can_capnp(can_sends, msgtype='sendcan').to_bytes())
    def update(self, enabled, CS, actuators, pcm_cancel_cmd, hud_alert):
        # this seems needed to avoid steering faults and to force the sync with the EPS counter
        frame = CS.lkas_counter
        if self.prev_frame == frame:
            return car.CarControl.Actuators.new_message(), []

        # steer torque
        new_steer = int(round(actuators.steer * CarControllerParams.STEER_MAX))
        apply_steer = apply_toyota_steer_torque_limits(
            new_steer, self.apply_steer_last, CS.out.steeringTorqueEps,
            CarControllerParams)
        self.steer_rate_limited = new_steer != apply_steer

        moving_fast = CS.out.vEgo > CS.CP.minSteerSpeed  # for status message
        if CS.out.vEgo > (CS.CP.minSteerSpeed - 0.5):  # for command high bit
            self.gone_fast_yet = True
        elif self.car_fingerprint in (CAR.PACIFICA_2019_HYBRID,
                                      CAR.PACIFICA_2020,
                                      CAR.JEEP_CHEROKEE_2019):
            if CS.out.vEgo < (CS.CP.minSteerSpeed - 3.0):
                self.gone_fast_yet = False  # < 14.5m/s stock turns off this bit, but fine down to 13.5
        lkas_active = moving_fast and enabled

        if not lkas_active:
            apply_steer = 0

        self.apply_steer_last = apply_steer

        can_sends = []

        #*** control msgs ***

        if pcm_cancel_cmd:
            # TODO: would be better to start from frame_2b3
            new_msg = create_wheel_buttons(self.packer,
                                           self.ccframe,
                                           cancel=True)
            can_sends.append(new_msg)

        # LKAS_HEARTBIT is forwarded by Panda so no need to send it here.
        # frame is 100Hz (0.01s period)
        if (self.ccframe % 25 == 0):  # 0.25s period
            if (CS.lkas_car_model != -1):
                new_msg = create_lkas_hud(self.packer, CS.out.gearShifter,
                                          lkas_active, hud_alert,
                                          self.hud_count, CS.lkas_car_model)
                can_sends.append(new_msg)
                self.hud_count += 1

        new_msg = create_lkas_command(self.packer, int(apply_steer),
                                      self.gone_fast_yet, frame)
        can_sends.append(new_msg)

        self.ccframe += 1
        self.prev_frame = frame

        new_actuators = actuators.copy()
        new_actuators.steer = apply_steer / CarControllerParams.STEER_MAX

        return new_actuators, can_sends
Beispiel #5
0
  def update(self, sendcan, enabled, CS, frame, actuators,
             pcm_cancel_cmd, hud_alert, audible_alert):
    # this seems needed to avoid steering faults and to force the sync with the EPS counter
    frame = CS.lkas_counter
    if self.prev_frame == frame:
      return

    # *** compute control surfaces ***
    # steer torque
    apply_steer = actuators.steer * SteerLimitParams.STEER_MAX
    apply_steer = apply_toyota_steer_torque_limits(apply_steer, self.apply_steer_last,
                                                   CS.steer_torque_motor, SteerLimitParams)

    moving_fast = CS.v_ego > CS.CP.minSteerSpeed  # for status message
    if CS.v_ego > (CS.CP.minSteerSpeed - 0.5):  # for command high bit
      self.gone_fast_yet = True
    elif self.car_fingerprint in (CAR.PACIFICA_2019_HYBRID, CAR.JEEP_CHEROKEE_2019):
      if CS.v_ego < (CS.CP.minSteerSpeed - 3.0):
        self.gone_fast_yet = False  # < 14.5m/s stock turns off this bit, but fine down to 13.5
    lkas_active = moving_fast and enabled

    if not lkas_active:
      apply_steer = 0

    self.apply_steer_last = apply_steer

    if audible_alert in LOUD_ALERTS:
      self.send_chime = True

    can_sends = []

    #*** control msgs ***

    if self.send_chime:
      new_msg = create_chimes(AudibleAlert)
      can_sends.append(new_msg)
      if audible_alert not in LOUD_ALERTS:
        self.send_chime = False

    if pcm_cancel_cmd:
      # TODO: would be better to start from frame_2b3
      new_msg = create_wheel_buttons(self.ccframe)
      can_sends.append(new_msg)

    # LKAS_HEARTBIT is forwarded by Panda so no need to send it here.
    # frame is 100Hz (0.01s period)
    if (self.ccframe % 25 == 0):  # 0.25s period
      if (CS.lkas_car_model != -1):
        new_msg = create_lkas_hud(
            self.packer, CS.gear_shifter, lkas_active, hud_alert,
            self.hud_count, CS.lkas_car_model)
        can_sends.append(new_msg)
        self.hud_count += 1

    new_msg = create_lkas_command(self.packer, int(apply_steer), self.gone_fast_yet, frame)
    can_sends.append(new_msg)

    self.ccframe += 1
    self.prev_frame = frame
    sendcan.send(can_list_to_can_capnp(can_sends, msgtype='sendcan'))
Beispiel #6
0
    def update(self, CC, CS, low_speed_alert):
        can_sends = []

        # EPS faults if LKAS re-enables too quickly
        lkas_active = CC.latActive and not low_speed_alert and (
            self.frame - self.last_lkas_falling_edge > 200)

        # *** control msgs ***

        das_bus = 2 if self.CP.carFingerprint in RAM_CARS else 0
        if CC.cruiseControl.cancel:
            can_sends.append(
                create_cruise_buttons(self.packer,
                                      CS.button_counter + 1,
                                      das_bus,
                                      cancel=True))
        elif CC.enabled and CS.out.cruiseState.standstill:
            can_sends.append(
                create_cruise_buttons(self.packer,
                                      CS.button_counter + 1,
                                      das_bus,
                                      resume=True))

        # HUD alerts
        if self.frame % 25 == 0:
            if CS.lkas_car_model != -1:
                can_sends.append(
                    create_lkas_hud(self.packer, self.CP, lkas_active,
                                    CC.hudControl.visualAlert, self.hud_count,
                                    CS.lkas_car_model, CS.auto_high_beam))
                self.hud_count += 1

        # steering
        if self.frame % 2 == 0:
            # steer torque
            new_steer = int(
                round(CC.actuators.steer * CarControllerParams.STEER_MAX))
            apply_steer = apply_toyota_steer_torque_limits(
                new_steer, self.apply_steer_last, CS.out.steeringTorqueEps,
                CarControllerParams)
            if not lkas_active:
                apply_steer = 0
            self.steer_rate_limited = new_steer != apply_steer
            self.apply_steer_last = apply_steer

            idx = self.frame // 2
            can_sends.append(
                create_lkas_command(self.packer, self.CP, int(apply_steer),
                                    lkas_active, idx))

        self.frame += 1
        if not lkas_active and self.lkas_active_prev:
            self.last_lkas_falling_edge = self.frame
        self.lkas_active_prev = lkas_active

        new_actuators = CC.actuators.copy()
        new_actuators.steer = self.apply_steer_last / CarControllerParams.STEER_MAX

        return new_actuators, can_sends
Beispiel #7
0
 def test_hud(self):
     packer = CANPacker('chrysler_pacifica_2017_hybrid')
     self.assertEqual([0x2a6, 0, b'\x01\x00\x01\x01\x00\x00\x00\x00', 0],
                      chryslercan.create_lkas_hud(packer, GearShifter.park,
                                                  False, False, 1, 0))
     self.assertEqual([0x2a6, 0, b'\x01\x00\x01\x00\x00\x00\x00\x00', 0],
                      chryslercan.create_lkas_hud(packer, GearShifter.park,
                                                  False, False, 5 * 4, 0))
     self.assertEqual([0x2a6, 0, b'\x01\x00\x01\x00\x00\x00\x00\x00', 0],
                      chryslercan.create_lkas_hud(packer, GearShifter.park,
                                                  False, False, 99999, 0))
     self.assertEqual([0x2a6, 0, b'\x02\x00\x06\x00\x00\x00\x00\x00', 0],
                      chryslercan.create_lkas_hud(packer, GearShifter.drive,
                                                  True, False, 99999, 0))
     self.assertEqual([0x2a6, 0, b'\x02\x64\x06\x00\x00\x00\x00\x00', 0],
                      chryslercan.create_lkas_hud(packer, GearShifter.drive,
                                                  True, False, 99999, 0x64))
Beispiel #8
0
    def update(self, enabled, CS, frame, actuators, pcm_cancel_cmd,
               leftLaneVisible, rightLaneVisible):  # TODO hud_alert
        P = CarControllerParams

        steer_ready = CS.out.vEgo > CS.CP.minSteerSpeed

        if steer_ready:
            self.steer_command_bit = True
        if not steer_ready:
            self.steer_command_bit = False

        bad_to_bone = enabled and steer_ready

        if bad_to_bone:
            new_steer = int(round(actuators.steer * P.STEER_MAX))
        else:
            new_steer = 0

        apply_steer = apply_std_steer_torque_limits(new_steer,
                                                    self.apply_steer_last,
                                                    CS.out.steeringTorque, P)
        self.steer_rate_limited = new_steer != apply_steer
        self.apply_steer_last = apply_steer

        # *** control msgs ***

        can_sends = []

        # *** control msgs ***

        #    if pcm_cancel_cmd:  # TODO: ENABLE ONCE STEERING WORKS
        #      new_msg = create_wheel_buttons(self.packer, self.frame, cancel=True)
        #      can_sends.append(new_msg)
        counter = (frame / 2) % 16

        if frame % 2 == 0:
            can_sends.append(
                create_lkas_command(self.packer, int(apply_steer), counter,
                                    self.steer_command_bit))

        if frame % 5 == 0:
            can_sends.append(
                create_lkas_hud(self.packer, enabled, leftLaneVisible,
                                rightLaneVisible))

        return can_sends
Beispiel #9
0
    def update(self, CC, CS):
        can_sends = []

        lkas_active = CC.latActive and self.lkas_control_bit_prev

        # cruise buttons
        if (self.frame - self.last_button_frame) * DT_CTRL > 0.05:
            das_bus = 2 if self.CP.carFingerprint in RAM_CARS else 0

            # ACC cancellation
            if CC.cruiseControl.cancel:
                self.last_button_frame = self.frame
                can_sends.append(
                    create_cruise_buttons(self.packer,
                                          CS.button_counter + 1,
                                          das_bus,
                                          cancel=True))

            # ACC resume from standstill
            elif CC.cruiseControl.resume:
                self.last_button_frame = self.frame
                can_sends.append(
                    create_cruise_buttons(self.packer,
                                          CS.button_counter + 1,
                                          das_bus,
                                          resume=True))

        # HUD alerts
        if self.frame % 25 == 0:
            if CS.lkas_car_model != -1:
                can_sends.append(
                    create_lkas_hud(self.packer, self.CP, lkas_active,
                                    CC.hudControl.visualAlert, self.hud_count,
                                    CS.lkas_car_model, CS.auto_high_beam))
                self.hud_count += 1

        # steering
        if self.frame % 2 == 0:

            # TODO: can we make this more sane? why is it different for all the cars?
            lkas_control_bit = self.lkas_control_bit_prev
            if CS.out.vEgo > self.CP.minSteerSpeed:
                lkas_control_bit = True
            elif self.CP.carFingerprint in (CAR.PACIFICA_2019_HYBRID,
                                            CAR.PACIFICA_2020,
                                            CAR.JEEP_CHEROKEE_2019):
                if CS.out.vEgo < (self.CP.minSteerSpeed - 3.0):
                    lkas_control_bit = False
            elif self.CP.carFingerprint in RAM_CARS:
                if CS.out.vEgo < (self.CP.minSteerSpeed - 0.5):
                    lkas_control_bit = False

            # EPS faults if LKAS re-enables too quickly
            lkas_control_bit = lkas_control_bit and (
                self.frame - self.last_lkas_falling_edge > 200)

            if not lkas_control_bit and self.lkas_control_bit_prev:
                self.last_lkas_falling_edge = self.frame
            self.lkas_control_bit_prev = lkas_control_bit

            # steer torque
            new_steer = int(round(CC.actuators.steer * self.params.STEER_MAX))
            apply_steer = apply_toyota_steer_torque_limits(
                new_steer, self.apply_steer_last, CS.out.steeringTorqueEps,
                self.params)
            if not lkas_active or not lkas_control_bit:
                apply_steer = 0
            self.apply_steer_last = apply_steer

            can_sends.append(
                create_lkas_command(self.packer, self.CP, int(apply_steer),
                                    lkas_control_bit))

        self.frame += 1

        new_actuators = CC.actuators.copy()
        new_actuators.steer = self.apply_steer_last / self.params.STEER_MAX

        return new_actuators, can_sends
Beispiel #10
0
    def update(self, enabled, CS, actuators, pcm_cancel_cmd, hud_alert,
               dragonconf):
        # this seems needed to avoid steering faults and to force the sync with the EPS counter
        frame = CS.lkas_counter
        if self.prev_frame == frame:
            return []

        # *** compute control surfaces ***
        # steer torque
        new_steer = actuators.steer * SteerLimitParams.STEER_MAX
        apply_steer = apply_toyota_steer_torque_limits(
            new_steer, self.apply_steer_last, CS.out.steeringTorqueEps,
            SteerLimitParams)
        self.steer_rate_limited = new_steer != apply_steer

        moving_fast = CS.out.vEgo > CS.CP.minSteerSpeed  # for status message
        if CS.out.vEgo > (CS.CP.minSteerSpeed - 0.5):  # for command high bit
            self.gone_fast_yet = True
        elif self.car_fingerprint in (CAR.PACIFICA_2019_HYBRID,
                                      CAR.JEEP_CHEROKEE_2019):
            if CS.out.vEgo < (CS.CP.minSteerSpeed - 3.0):
                self.gone_fast_yet = False  # < 14.5m/s stock turns off this bit, but fine down to 13.5
        lkas_active = moving_fast and enabled

        if not lkas_active:
            apply_steer = 0

        # dp
        blinker_on = CS.out.leftBlinker or CS.out.rightBlinker
        if not enabled:
            self.blinker_end_frame = 0
        if self.last_blinker_on and not blinker_on:
            self.blinker_end_frame = frame + dragonconf.dpSignalOffDelay
        apply_steer = common_controller_ctrl(
            enabled, dragonconf.dpLatCtrl, dragonconf.dpSteeringOnSignal,
            blinker_on or frame < self.blinker_end_frame, apply_steer)
        self.last_blinker_on = blinker_on

        self.apply_steer_last = apply_steer

        can_sends = []

        #*** control msgs ***

        if pcm_cancel_cmd:
            # TODO: would be better to start from frame_2b3
            new_msg = create_wheel_buttons(self.packer,
                                           self.ccframe,
                                           cancel=True)
            can_sends.append(new_msg)

        # LKAS_HEARTBIT is forwarded by Panda so no need to send it here.
        # frame is 100Hz (0.01s period)
        if (self.ccframe % 25 == 0):  # 0.25s period
            if (CS.lkas_car_model != -1):
                new_msg = create_lkas_hud(self.packer, CS.out.gearShifter,
                                          lkas_active, hud_alert,
                                          self.hud_count, CS.lkas_car_model)
                can_sends.append(new_msg)
                self.hud_count += 1

        new_msg = create_lkas_command(self.packer, int(apply_steer),
                                      self.gone_fast_yet, frame)
        can_sends.append(new_msg)

        self.ccframe += 1
        self.prev_frame = frame

        return can_sends
Beispiel #11
0
    def lkas_control(self, CS, actuators, can_sends, enabled, hud_alert,
                     jvepilot_state):
        if self.prev_frame == CS.frame:
            return
        self.prev_frame = CS.frame

        self.lkas_frame += 1
        lkas_counter = CS.lkas_counter
        if self.prev_lkas_counter == lkas_counter:
            lkas_counter = (self.prev_lkas_counter +
                            1) % 16  # Predict the next frame
        self.prev_lkas_counter = lkas_counter

        # *** compute control surfaces ***
        # steer torque
        new_steer = int(round(actuators.steer * CarControllerParams.STEER_MAX))
        apply_steer = apply_toyota_steer_torque_limits(
            new_steer, self.apply_steer_last, CS.out.steeringTorqueEps,
            CarControllerParams)
        self.steer_rate_limited = new_steer != apply_steer

        low_steer_models = self.car_fingerprint in (CAR.JEEP_CHEROKEE,
                                                    CAR.PACIFICA_2017_HYBRID,
                                                    CAR.PACIFICA_2018,
                                                    CAR.PACIFICA_2018_HYBRID)
        if not self.min_steer_check:
            self.moving_fast = True
            self.torq_enabled = enabled or low_steer_models
        elif low_steer_models:
            self.moving_fast = not CS.out.steerError and CS.lkas_active
            self.torq_enabled = self.torq_enabled or CS.torq_status > 1
        else:
            self.moving_fast = CS.out.vEgo > CS.CP.minSteerSpeed  # for status message
            if CS.out.vEgo > (CS.CP.minSteerSpeed -
                              0.5):  # for command high bit
                self.torq_enabled = True
            elif CS.out.vEgo < (CS.CP.minSteerSpeed - 3.0):
                self.torq_enabled = False  # < 14.5m/s stock turns off this bit, but fine down to 13.5

        lkas_active = self.moving_fast and enabled
        if not lkas_active:
            apply_steer = 0

        self.apply_steer_last = apply_steer

        if self.lkas_frame % 10 == 0:  # 0.1s period
            new_msg = create_lkas_heartbit(
                self.packer,
                0 if jvepilot_state.carControl.useLaneLines else 1,
                CS.lkasHeartbit)
            can_sends.append(new_msg)

        if self.lkas_frame % 25 == 0:  # 0.25s period
            if CS.lkas_car_model != -1:
                new_msg = create_lkas_hud(self.packer, CS.out.gearShifter,
                                          lkas_active, hud_alert,
                                          self.hud_count, CS.lkas_car_model)
                can_sends.append(new_msg)
                self.hud_count += 1

        new_msg = create_lkas_command(self.packer, int(apply_steer),
                                      self.torq_enabled, lkas_counter)
        can_sends.append(new_msg)
Beispiel #12
0
    def update(self, sendcan, enabled, CS, frame, actuators, pcm_cancel_cmd,
               hud_alert, audible_alert):
        #update custom UI buttons and alerts
        CS.UE.update_custom_ui()
        if (frame % 1000 == 0):
            CS.cstm_btns.send_button_info()
            CS.UE.uiSetCarEvent(CS.cstm_btns.car_folder, CS.cstm_btns.car_name)

        # Get the angle from ALCA.
        alca_enabled = False
        alca_steer = 0.
        alca_angle = 0.
        turn_signal_needed = 0
        # Update ALCA status and custom button every 0.1 sec.
        if self.ALCA.pid == None:
            self.ALCA.set_pid(CS)
        if (frame % 10 == 0):
            self.ALCA.update_status(CS.cstm_btns.get_button_status("alca") > 0)
        # steer torque
        alca_angle, alca_steer, alca_enabled, turn_signal_needed = self.ALCA.update(
            enabled, CS, frame, actuators)

        # this seems needed to avoid steering faults and to force the sync with the EPS counter
        frame = CS.lkas_counter
        if self.prev_frame == frame:
            return

        # *** compute control surfaces ***
        # steer torque
        apply_steer = alca_steer * SteerLimitParams.STEER_MAX
        apply_steer = apply_toyota_steer_torque_limits(apply_steer,
                                                       self.apply_steer_last,
                                                       CS.steer_torque_motor,
                                                       SteerLimitParams)

        moving_fast = CS.v_ego > CS.CP.minSteerSpeed  # for status message
        if CS.v_ego > (CS.CP.minSteerSpeed - 0.5):  # for command high bit
            self.gone_fast_yet = True
        elif self.car_fingerprint in (CAR.PACIFICA_2019_HYBRID,
                                      CAR.JEEP_CHEROKEE_2019):
            if CS.v_ego < (CS.CP.minSteerSpeed - 3.0):
                self.gone_fast_yet = False  # < 14.5m/s stock turns off this bit, but fine down to 13.5
        lkas_active = moving_fast and enabled

        if not lkas_active:
            apply_steer = 0

        if not CS.lane_departure_toggle_on:
            apply_steer = 0
        self.apply_steer_last = apply_steer

        if audible_alert in LOUD_ALERTS:
            self.send_chime = True

        can_sends = []

        #*** control msgs ***

        if self.send_chime:
            new_msg = create_chimes(AudibleAlert)
            can_sends.append(new_msg)
            if audible_alert not in LOUD_ALERTS:
                self.send_chime = False

        if pcm_cancel_cmd:
            # TODO: would be better to start from frame_2b3
            new_msg = create_wheel_buttons(self.ccframe)
            can_sends.append(new_msg)

        # frame is 100Hz (0.01s period)
        if (self.ccframe % 10 == 0):  # 0.1s period
            new_msg = create_lkas_heartbit(self.packer, CS.lkas_status_ok)
            can_sends.append(new_msg)

        if (self.ccframe % 25 == 0):  # 0.25s period
            if (CS.lkas_car_model != -1):
                new_msg = create_lkas_hud(self.packer, CS.gear_shifter,
                                          lkas_active, hud_alert,
                                          self.hud_count, CS.lkas_car_model)
                can_sends.append(new_msg)
                self.hud_count += 1

        new_msg = create_lkas_command(self.packer, int(apply_steer),
                                      self.gone_fast_yet, frame)
        can_sends.append(new_msg)

        self.ccframe += 1
        self.prev_frame = frame
        sendcan.send(
            can_list_to_can_capnp(can_sends, msgtype='sendcan').to_bytes())
Beispiel #13
0
    def update(self, enabled, CS, actuators, pcm_cancel_cmd, hud_alert):
        # this seems needed to avoid steering faults and to force the sync with the EPS counter
        frame = CS.lkas_counter
        if self.prev_frame == frame:
            return []

        # *** compute control surfaces ***
        if self.on_timer < 200 and CS.veh_on:
            self.on_timer += 1

        wp_type = int(0)

        if Params().get('LkasFullRangeAvailable') == b'1':
            wp_type = int(1)
        if Params().get('ChryslerMangoMode') == b'1':
            wp_type = int(2)

        if enabled:
            if CS.out.steeringAngleDeg > 50. and wp_type == 1 and self.timer > 97:
                self.timer = 97
            if self.timer < 99 and wp_type == 1 and CS.out.vEgo < 65:
                self.timer += 1
            else:
                self.timer = 99
        else:
            self.timer = 0

        lkas_active = self.timer == 99

        # steer torque
        new_steer = int(round(actuators.steer * CarControllerParams.STEER_MAX))
        apply_steer = apply_toyota_steer_torque_limits(
            new_steer, self.apply_steer_last, CS.out.steeringTorqueEps,
            CarControllerParams)
        #self.steer_rate_limited = new_steer != apply_steer

        #moving_fast = CS.out.vEgo > CS.CP.minSteerSpeed  # for status message
        #if CS.out.vEgo > (CS.CP.minSteerSpeed - 0.5):  # for command high bit
        #  self.gone_fast_yet = True
        #elif self.car_fingerprint in (CAR.PACIFICA_2019_HYBRID, CAR.PACIFICA_2020, CAR.JEEP_CHEROKEE_2019):
        #  if CS.out.vEgo < (CS.CP.minSteerSpeed - 3.0):
        #    self.gone_fast_yet = False  # < 14.5m/s stock turns off this bit, but fine down to 13.5
        #lkas_active = moving_fast and enabled

        if not lkas_active:
            apply_steer = 0

        self.steer_rate_limited = new_steer != apply_steer

        self.apply_steer_last = apply_steer

        if CS.out.standstill:
            self.steer_type = wp_type

        if wp_type != 2:
            self.steerErrorMod = CS.steerError
            if self.steerErrorMod:
                self.steer_type = int(0)
        elif CS.apaFault or CS.out.gearShifter not in (GearShifter.drive, GearShifter.low) or \
                abs(CS.out.steeringAngleDeg) > 330. or self.on_timer < 200 or CS.apa_steer_status:
            self.steer_type = int(0)

        self.apaActive = CS.apasteerOn and self.steer_type == 2

        can_sends = []

        #*** control msgs ***

        # if pcm_cancel_cmd:
        #   # TODO: would be better to start from frame_2b3
        #   new_msg = create_wheel_buttons(self.packer, self.ccframe, cancel=True)
        #   can_sends.append(new_msg)

        # LKAS_HEARTBIT is forwarded by Panda so no need to send it here.
        # frame is 100Hz (0.01s period)
        if (self.ccframe % 2 == 0) and wp_type == 2:  # 0.02s period
            if (CS.lkas_car_model != -1):
                new_msg = create_apa_hud(self.packer, CS.out.gearShifter,
                                         self.apaActive, CS.apaFault,
                                         hud_alert, lkas_active,
                                         self.hud_count, CS.lkas_car_model,
                                         self.steer_type)
                can_sends.append(new_msg)
                self.hud_count += 1
        if (self.ccframe % 2 == 0) and wp_type != 2:  # 0.25s period
            if (CS.lkas_car_model != -1):
                new_msg = create_lkas_hud(self.packer, CS.out.gearShifter,
                                          lkas_active, hud_alert,
                                          self.hud_count, CS.lkas_car_model,
                                          self.steer_type)
                can_sends.append(new_msg)
                self.hud_count += 1
        #new_msg = create_lkas_command(self.packer, int(apply_steer), self.gone_fast_yet, frame)
        new_msg = create_lkas_command(self.packer, int(apply_steer),
                                      lkas_active, frame)
        can_sends.append(new_msg)

        self.ccframe += 1
        self.prev_frame = frame

        return can_sends