My app needs to be able to read data from ANT plus speed or speed/cadence sensors.
To handle this I create an AntPlus.BikeSpeed and AntPlus.BikeSpeedCadence objects, both with appropriate listeners.
It mostly works, BUT if I do the following the BikeSpeedCadence sensor returns null values for speed.
- Connect to Speed sensor
- Open app - speed reads correctly.
- Close App
- close speed sensor and connect to Speed+Cadence sensor.
- Open app. SPEED READS NULL.
Below is my full speed/cadence code:
using Toybox.AntPlus;
using Toybox.System as Sys;
using Toybox.Attention as Attention;
class aero_bsc_listener extends AntPlus.BikeSpeedCadenceListener
{
hidden var m_spd;
hidden var ctr;
hidden var warned;
hidden var device;
function initialize(_device)
{
BikeSpeedCadenceListener.initialize();
m_spd = null;
warned = false;
ctr = 0;
device = _device;
}
function onBikeSpeedCadenceUpdate(info)
{
if (info != null)
{
m_spd = info.speed;
if (as_fit_file.isLogging())
{
as_fit_file.fields[ROAD_SPEED_FIELD].setData(m_spd);
}
else if (info.speed > 2)
{
if (!warned)
{
Attention.playTone(Attention.TONE_LOUD_BEEP);
ctr++;
if (ctr == 10)
{
warned = true;
}
}
}
else
{
if (warned)
{
warned = false;
ctr = 0;
}
}
}
}
function getSpeed()
{
return m_spd;
}
}
class antplus_bsc
{
hidden var m_bsc;
hidden var m_listener;
function initialize()
{
// Initialise BSC device:
m_listener = new aero_bsc_listener(self);
m_bsc = new AntPlus.BikeSpeedCadence(m_listener);
}
function isTracking()
{
return m_bsc.getDeviceState().state == AntPlus.DEVICE_STATE_TRACKING;
}
function getSpeed()
{
var spd = m_listener.getSpeed();
if (spd == null) {spd = 0;}
else if (spd < 0) {spd = 0;}
return spd;
}
function getDeviceNumber()
{
return m_bsc.getDeviceState().deviceNumber;
}
// Returns device state.
function getDeviceStateText()
{
var text = "";
if (isTracking())
{
text = "Tracking";
}
else
{
text = "Closed";
}
return text;
}
}