Settings

Developers can use the Settings module to configure ble pereferences and retrieve general board information. You can combine preference changes with the Macro module to make them permanent.

import com.mbientlab.metawear.module.Settings;

final Settings settings = board.getModule(Settings.class);

Ble Advertising

Advertising parameters control how the Bluetooth LE radio sends its adversiting packets and are configured with the BleAdvertisementConfigEditor interface. You can configure paramters such as the device name, timeout, tx power, and scan response.

import com.mbientlab.metawear.module.Settings;

settings.editBleAdConfig()
        .deviceName("AntiWare")
        .txPower((byte) -4)
        .interval((short) 1024)
        .timeout((byte) 100)
        .commit();

Check out these posts from the Nordic Developer Zone if you are unsure of what these parameters do:

Connection Parameters

Bluetooth LE connection parameters control how the ble devices communicate with each other. Configuring thes parameters is done with the BleConnectionParameterEditor interface. A more detailed explanation on connection parameters can be found on the Nordic Developer Zone:

// change min conn interval to 10ms,
// max conn interval to 1024ms
settings.editBleConnParams()
        .minConnectionInterval(100f)
        .maxConnectionInterval(1024f)
        .commit();

Battery State

Battery state is defined as a forced data producer and represented by the BatteryState class. Unlike reading the battery characteristc with the MetaWearBoard class, reading the battery state with the Settings module lets you use the battery data with the route API.

settings.battery().addRouteAsync(new RouteBuilder() {
    @Override
    public void configure(RouteComponent source) {
        source.stream(new Subscriber() {
            @Override
            public void apply(Data data, Object ... env) {
                Log.i("MainActivity", "battery state = " + data.value(BatteryState.class));
            }
        });
    }
}).continueWith(new Continuation<Route, Void>() {
    @Override
    public Void then(Task<Route> task) throws Exception {
        settings.battery().read();
        return null;
    }
});

Handling Disconnects

The board can be programmed to react to a disconnect by registering an Observer with the onDisconnectAsync function.

final Led led = board.getModule(Led.class);

settings.onDisconnectAsync(new CodeBlock() {
    @Override
    public void program() {
        led.editPattern(Color.RED, PatternPreset.SOLID)
                .repeatCount((byte) 2)
                .commit();
        led.play();
    }
});

Power Status

Firmware v1.3.2 exposes battery charging and power status notifications which provides information on when the battery is charging / not charging and when a power source is attached / removed, respectively. The data is interpreted as a byte or boolean with 1 (true) signifying battery charging / power source attached, and 0 (false) meaning battery not charging / power source removed. Not all boards support this feature and a null pointer will be returned if powerStatus or chargeStatus is called on an unsupported board.

settings.powerStatus().addRouteAsync(new RouteBuilder() {
    @Override
    public void configure(RouteComponent source) {
        source.stream(new Subscriber() {
            @Override
            public void apply(Data data, Object... env) {
                Log.i("MainActivity", "power source state changed: " + data.value(Byte.class));
            }
        });
    }
});

Because the power and charge statuses are active data producers, the module has provided the readCurrentChargeStatusAsync and readCurrentPowerStatusAsync methods so your app can retrieve the current charge and power statuses respectively. Unlike the normal read function, this variant eschews the data route system and sends the data directly to the Android device.

settings.readCurrentPowerStatusAsync().continueWith(new Continuation<Byte, Void>() {
    @Override
    public Void then(Task<Byte> task) throws Exception {
        Log.i("MainActivity", "power source attached? " + task.getResult();
        return null;
    }
});

MMS 3V Regulator

The MMS (MetaMotion) board has a 3V regulator that can be turned on and off for IOs.

It is automatically turned on to power the coin vibration motor (if there is one attached), the ambient light sensor, and the LED.

However, if you have an external peripheral on the IOs that needs 3V power (such as a buzzer or UV sensor), you can use this function to turn on the power:

settings.enable3VRegulator(true);

And to turn it off:

settings.enable3VRegulator(false);