Как программно ограничить скорость с BMW JSDK на 116i с Java? - PullRequest
22 голосов
/ 01 апреля 2010

Я экспериментирую с BMW Java SDK на новом инновационном пакете BMW 116i. Основные вещи, такие как включение и выключение света, запуск и остановка двигателя, работают нормально. Сейчас я пытаюсь написать карлет, который ограничит скорость до максимальной, заданной в профиле водителя. Идентификатор водителя будет определен как обычно с помощью считывателя RFID.

Моя проблема в том, что, хотя я могу считать скорость с тахометра, я не могу реально ограничить скорость. Вот то, что я до сих пор работаю:

public class SpeenControllingCarlet extends GenericCarlet {

    public void start(final VehicleModel model) throws CarletException {
        RfidReader rfidReader = (RfidReader) model
                .getDevice(Devices.DRIVER_RFID_READER);
        Rfid rfid = rfidReader.getRfid();
        DriverProfile driverProfile = model.getDriverProfileRegistry()
                .getDriverProfile(rfid.toString());
        if (driverProfile == null) {
            return;
        }
        final Double maxAllowedSpeed = Double.valueOf(driverProfile
                .getCustomAttribute("maxAllowedSpeed", "190"));
        Tachometer tachometer = (Tachometer) mode.getDevice(Devices.TACHOMETER);
        tachometer.addSpeedListener(new SpeedListener() {
            public void onSpeedChanged(SpeedChangedEvent speedChangedEvent) {
                if (speedChangedEvent.getCurrentSpeed() > maxAllowedSpeed)
                {
                    Horn horn = (Horn) mode.getDevice(Devices.HORN);
                    horn.beep(440, 2000);
                }

            }
        });
    }
}

Это будет звуковой сигнал в течение двух секунд, если драйвер будет работать быстрее, чем позволяет профиль драйвера.

У меня вопрос - есть ли возможность на самом деле ограничить скорость (не просто глупый писк)?

Ответы [ 4 ]

9 голосов
/ 01 апреля 2010

Как вы замедляетесь, используя несовершенного человека? Вы тормозите! То же самое с BMW SDK:

Brake brake = (Brake) mode.getDevice(Devices.BRAKE);
brake.apply(Brake.TO_THE_METAL);
7 голосов
/ 02 апреля 2010
Wrench wrench = (Wrench) Toolkit.getToolkit().get(Instruments.WRENCH);
wrench.hit(driver);
3 голосов
/ 01 апреля 2010

Ваша большая проблема в том, что вы не учитываете текущее передаточное число, когда получаете скорость двигателя. Вы смотрите на скорость около 190, а тач будет возвращаться где-то между 700 и 7000. Вам нужна функция, которая измеряет обороты двигателя, передаточное число и диаметр шины и возвращает фактическую скорость.

Или вы можете узнать скорость автомобиля по спидометру или GPS.

3 голосов
/ 01 апреля 2010

Я думаю (и надеюсь), что это, скорее всего, невозможно, и причина в том, что у производителей автомобилей будут большие юридические проблемы, если они разрешат использовать «неосновные» гаджеты, такие как JVM, встроенные в развлечения / навигацию Система мешает управлению двигателем или рулем. Это намного худший риск для безопасности, чем ваш обычный браузер.

Автомобили с электроприводом достаточно страшны, так как не имеют частей, доступных конечному пользователю / хакеру.

...