views:

532

answers:

4

I'm experimenting with the BMW Java SDK on the new BMW 116i Innovation Package. Basic things like turning the lights on and off, starting and stopping the motor work fine. What I'm trying to do now is that to write a carlet which would limit the speed to the maximum configured in the driver profile. Driver identity will be detected as usual via RFID reader.

My problem is that though I can read the speed from the tachometer, I can't really limit the speed. Here's what I've got working so far:

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);
                }

            }
        });
    }
}

This will just beep for two seconds if the driver goes faster than the driver profile allows.

My question is - is there a possibility to actually limit the speed (not just silly beeping)?

+1  A: 

How do you slow down using the imperfect human? You brake! Same with BMW SDK:

Brake brake = (Brake) mode.getDevice(Devices.BRAKE);
brake.apply(Brake.TO_THE_METAL);
Vladimir Dyuzhev
This may work - braking and checking the speed at the same time...However I don't think that's how it should be done. There's a factory setting with speed limit on 270, so there must be something resettable/reprogrammable.
lexicore
That's 270 km/h, right? Or BMW going to produce planes again? :)
Vladimir Dyuzhev
You cannot brake using the JVM, right?
Thilo
Why not?!? That's what JVM does all the time!
Vladimir Dyuzhev
Km/h, of course (I'm located in Germany). Sorry to be too "metric-minded".
lexicore
Kilometers here too! Canada! ;)
Vladimir Dyuzhev
+2  A: 

I think (and hope) that this is very likely not possible, and the reasons are that car manufacturers would be in a lot of legal trouble if they allowed "non-core" gadgets like a JVM built into the entertainment/navigation system to interfere with the motor or steering controls. That is a much worse security risk than your average browser exploit.

Fly-by-wire cars are scary enough as it is without end-user/hacker accessible parts.

Thilo
Third-party tuning requires a special allowance (so-called Bauartgenehmigung/Betriebserlaubnis) and additional insurance. BMW has nothing to do with this.
lexicore
Yeah... "botnet" may get the whole new exciting meaning... %)
Vladimir Dyuzhev
I think this is a little more (worse) than traditional tuning. I hope that the JVM is not even physically connected to devices that would allow braking or steering. Tuning/hacking aside, if it was, a software bug could cause horrible trouble. I believe that the factory set speed limit (270) must be enforced by motor-internal electronics, a completely separate system from this JVM. Those electronics may be tunable with the right gear, but that is a separate issue.
Thilo
A: 

Your big problem is that you're not taking the current gear ratio into account when you get the engine speed. You're looking at a speed of like 190, while the tach is going to return somewhere between 700 and 7000. You need a function that takes engine RPMs, gear ratio, and tire diameter, and returns actual speed.

Or you could get the car's speed from the speedometer or GPS.

Gabe
They have German terminology in the API. Tachometer is for speed, engine rotation rate is called RevCounter.
lexicore
+2  A: 

Wrench wrench = (Wrench) Toolkit.getToolkit().get(Instruments.WRENCH); wrench.hit(driver);

mvmn