def getTurn(controller):
    
    # car obj
    carObj = controller.owner
    
    reverse = controller.sensors['Reverse']
    if reverse.positive == True:
        return carObj['reverseTurn']
    
    #current and max car speed
    carSpeed = carObj.getLinearVelocity(True).y
    carMaxSpeed = carObj['maxSpeed']
    
    #interpolation switch speed:
    #maxSpeed/4
    switchSpeed = carMaxSpeed/4
    
    #interpolate based on current speed
    if carSpeed < switchSpeed:
        return tools3d.linearInterpolation(
            carSpeed,
            0,carObj['minSpeedTurn'],
            switchSpeed,carObj['switchSpeedTurn'])
    else:
        return tools3d.linearInterpolation(
            carSpeed,
            switchSpeed,carObj['switchSpeedTurn'],
            carMaxSpeed,carObj['maxSpeedTurn'])	
    def execute(self,bgeCar):

        carspeed = bgeCar.getSpeed()

        #if car is stopped, we send gas message and return
        if carspeed == 0:
            bge.logic.sendMessage(bgeCar.carname + '_Gas')
            return
        
        #deduce car target speed by interpolation
        target_speed = tools3d.linearInterpolation(
            bgeCar.dist_next_interface,
            0,
            bgeCar.tiManager.getInterfaceTargetSpeed(bgeCar.next_interface_idx),
            bgeCar.tiManager.getDistanceWithPreviousInterface(bgeCar.next_interface_idx),
            bgeCar.tiManager.getPreviousInterfaceTargetSpeed(bgeCar.next_interface_idx))

        if carspeed > target_speed:
            bge.logic.sendMessage(bgeCar.carname + '_Brake')
        else:
            bge.logic.sendMessage(bgeCar.carname + '_Gas')