Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 12 Next »

The VictoR Android Software Development Kit (SDK) allows developers to communicate with a VictoR device over Bluetooth Low Energy (BLE) and Universal Serial Bus (USB) in Java. The following documentation will walk users through the workflow of connecting to a device, reading and writing data to the services of the VictoR device, and how to register for notifications should the state of the device or its services change while connected. Currently, only the Device Configuration and Device Information services are directly supported by the SDK.

Supported ICD Rev: H1
Supported VictoR Firmware Revision:

  • Application Firmware Rev: 03.080

  • Co-Processor Firmware Rev: 01.001

  • Kernel Module Firmware Rev: 01.001

  • BLE Firmware Rev: 03.032

SDK:

  • Minimum Android SDK : 29

  • Target Android SDK: 32

  • Compile Android SDK : 32

Introduction

The Victor SDK is made up of two aar libraries, VictoRCore and VictoRCommunications. Both are essential in working with a VictoR device. It is important users add both libraries as dependencies for a Java project dealing with VictoR devices. If working in Android Studio, the libraries can be added to the project by first navigating to the Project Structure option under the File menu.

Once the Project Structure window opens, users can add dependencies to the aar libraries.

Additionally, users will need to add a dependency for the Serial Java library used by the SDK. This can be done b modifying the settings.gradle file with the following highlighted lines…:

…and adding a reference to the git repo for the serial library to the VictoRCommunications module.

Device Manager

Instantiation

The act of connecting and disconnecting to a device, as well as maintaining a record of connected devices, is handled by the device manager. Before any work can be done on reading, writing, and subscribing to services, users must first create and work with the device manager.

BLE
import com.fn.victorcommunications.VictorBleDeviceManager;

public class MainActivity extends Activity
{
    VictorBleDeviceManager deviceManager;
    
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        deviceManager = new VictorBleDeviceManager(this);
    }
}
USB
import com.fn.victorcommunications.VictorUsbDeviceManager;

public class MainActivity extends Activity
{
    VictorUsbDeviceManager deviceManager;
    
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        deviceManager = new VictorUsbDeviceManager(this);
    }
}

Scanning for Devices

Once a DeviceManager has been instantiated, a scan must be performed to identify any active VictoR devices accepting connections over BLE or USB (dependent on the device manager instantiated). By default, scanning for devices is set to take 10 seconds, with a query for any devices with the term “victor” in its name, with case sensitivity not taken into account. Once the scan has completed, a Set of VictorDeviceInfo objects is returned, which each contain the name and address of a VictoR device. The following illustrates the work flow for a BLE device manager, but the same workflow exists for the USB device manager in all cases save for when specifying scan parameters, explained in the next section.

import com.fn.victorcore.VictorDeviceInfo;
import com.fn.victorcommunications.VictorBleDeviceManager;

public class MainActivity extends Activity
{
    VictorBleDeviceManager deviceManager;
    
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        deviceManager = new VictorBleDeviceManager(this);
    }
    
    public void Scan()
    {
        CompletableFuture<Set<VictorDeviceInfo>> futureScannedDevices = deviceManager.scanForDevices();
    }
}

Setting Scan Parameters

Users have a means to also specify VictorDeviceScanParameters when scanning for VictoR devices. Options include specifying the scan time, the string query for victor device names, and whether the case of the device name is important. It is important to note that the VictorDeviceScanParameters are not used when scanning for USB devices, as this uses an entirely different set of filters to find any connected devices over USB.

import com.fn.victorcore.VictorDeviceInfo;
import com.fn.victorcore.VictorDeviceScanParameters;
import com.fn.victorcommunications.VictorBleDeviceManager;

public class MainActivity extends Activity
{    
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        deviceManager = new VictorBleDeviceManager(this);
    }
    
    public void Scan()
    {
        deviceManager = new VictorBleDeviceManager(this);
        
        VictorDeviceScanParameters scanParameters = new VictorDeviceScanParameters();
        scanParameters.setScanTime(3000L);
    
        CompletableFuture<Set<VictorDeviceInfo>> futureScannedDevices = deviceManager.scanForDevices(scanParameters);
    }
}

Device Callbacks

Additionally, users can choose to receive a callback during the act of scanning for devices, rather than having to wait for the scan to complete. Callbacks can be set by passing a VictorDeviceCallback object that defines the onDeviceFound method.

import com.fn.victorcore.VictorDeviceInfo;
import com.fn.victorcore.VictorDeviceCallback;
import com.fn.victorcommunications.VictorBleDeviceManager;

public class MainActivity extends Activity
{
    private final VictorDeviceCallback deviceCallback = new VictorDeviceCallback()
    {
        @Override
        public void onDeviceFound(VictorDeviceInfo deviceInfo)
        {
            System.out.printf("Found " + deviceInfo + "\n"));
        }
    
        @Override
        public void onConnectionStateChange(VictorDeviceInfo deviceInfo, boolean connected)
        {
              System.out.printf("Got a connection state change from %s.\n", deviceInfo)));
        }
    
        @Override
        public void onAttributeChange(VictorDeviceInfo deviceInfo, UUID attribute, byte[] data)
        {
              System.out.printf("Got an attribute change for attribute %s from %s.\n", attribute, deviceInfo)));
        }
    };
    
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        deviceManager = new VictorBleDeviceManager(this);
    }
    
    public void Scan()
    {
        deviceManager = new VictorBleDeviceManager(this);
    
        CompletableFuture<Set<VictorDeviceInfo>> futureScannedDevices = deviceManager.scanForDevices(deviceCallback);
    }
}

Connecting To A Device

Once a powered on VictoR device has been found by scanning for devices with the DeviceManager, the resulting VictorDeviceInfo can be used to connect to the device along with the DeviceManager that found the device.

CompletableFuture<Boolean> futureConnected = deviceManager.connect(deviceInfo.getAddress());

Subscribing to Connection State Changes

It is also possible to subscribe to the connection state of a VictoR device. This results in callbacks being triggered whenever the device is connected to or disconnected from.

private final VictorDeviceCallback deviceCallback = new VictorDeviceCallback()
{
    @Override
    public void onDeviceFound(VictorDeviceInfo deviceInfo)
    {
        System.out.printf("Found " + deviceInfo + "\n"));
    }

    @Override
    public void onConnectionStateChange(VictorDeviceInfo deviceInfo, boolean connected)
    {
          System.out.printf("Got a connection state change from %s.\n", deviceInfo)));
    }

    @Override
    public void onAttributeChange(VictorDeviceInfo deviceInfo, UUID attribute, byte[] data)
    {
          System.out.printf("Got an attribute change for attribute %s from %s.\n", attribute, deviceInfo)));
    }
};

deviceManager.subscribeConnectionStateChange(deviceInfo.getAddress(), deviceCallback);

Disconnecting From A Device

A VictoR device can be disconnected by using the device manager that originally connected to the device, along with the device’s address.

CompletableFuture<Boolean> futureDisconnected = deviceManager.disconnect(deviceInfo.getAddress());

Reading From A VictoR Device

In order to read from a VictoR device, once a connection has been established through a device manager, a service object the attribute in question is associated with must first be created. Once the service object has been created, calls to read data from the connected device can be made, given the device manager containing the device has been passed to the service object on creation.

DeviceConfigurationService deviceConfigService = new DeviceConfigurationService(deviceManager);
DeviceInformationService deviceInfoService = new DeviceInformationService(deviceManager);

Deserialization of the data from the VictoR device is handled by the service objects, resulting in either a primitive data type or a custom made class defined in the SDK where appropriate. For example, when reading the serial number for the device through the DeviceInformationService class, the CompletableFuture returns a string.

String serialNumber = deviceInfoService.getSerialNumber().get();

However, when reading the General System Parameters for the device through the DeviceConfigurationService class, the CompletableFutrue returns a GeneralSystemParameters object (defined in the SDK) that provides accessors for the various pieces of data inside of the General System Parameters attribute.

GeneralSystemParameters generalSystemParameters = deviceConfigService.getGeneralSystemParameters().get();
boolean bluetoothEnabled = generalSystemParameters.isBluetoothLinkEnabled();
PowerProfileOption powerProfileOption = generalSystemParameters.getPowerProfile();
short minimumInactivityInterval = generalSystemParameters.getMinimumInactivityInterval();

NOTE: When reading from a device, please reference the supported ICD document specified above to ensure the attribute itself, as well as reading from the attribute, is supported.

Writing To A VictoR Device

Similar to reading from a VictoR device, writing to a VictoR device requires an established connection with a powered on device through a device manager and a service object that contains the data to be written. Serialization of data when writing to the VictoR device is handled by the service objects, converting the data into a byte array before being sent to the device.

VideoParameters newVideoParameters = new VideoParameters();
newVideoParameters.getFrameSize().setRows((short)128);
newVideoParameters.getFrameSize().setColumns((short)64);
newVideoParameters.setFrameRate((short)24);
newVideoParameters.setOpticalPath(VideoParameters.OpticalPathOptions.Auto);
deviceConfigService.setVideoParameters(newVideoParameters);

NOTE: When writing to a device, please reference the supported ICD document specified above to ensure the attribute itself, as well as writing to the attribute, is supported.

Subscribing To Attribute Changes

Attributes on the VictoR device, when supported, can be subscribed to through the usage of the VictorDeviceCallback class and the service containing the data to be subscribed to.

private final DeviceInformationService.DeviceInformationCallback deviceInformationCallback = new DeviceInformationService.DeviceInformationCallback()
{
    public void onCurrentBatteryLevelChanged(VictorDeviceInfo deviceInfo, short currentBatteryLevel)
    {
        debugTextView.post(() -> debugTextView.append("Current Battery Level: " + currentBatteryLevel + "\n"));
    }
};

deviceInfoService.subscribeToCurrentBatteryLevel(deviceInfo.getAddress(), deviceInformationCallback);

It is important to note that as of the ICD referenced at the start of this guide, the VictoR device does not support subscribing to battery level over USB.

  • No labels