Driver update methods
A sensor driver supports internal methods that handle updates to the current report interval, change sensitivity, and so on. The pseudocode demonstrates this using the following methods:
- DriverUpdateCRI(sensorID)
- DriverUpdateCS(sensorID)
- DriverUpdateLDA(sensorID)
- DriverUpdateSensorState(sensorID, state, events)
- DriverUpdateDatafields(sensorID)
Sensor reporting-field updates
The DriverUpdateCRI, DriverUpdateCS, and DriverUpdateLDA methods demonstrate how a driver updates the current report interval, change sensitivity, and location data accuracy fields.
DriverUpdateCRI(sensorID)
{
if (true == flagCRI)
{
// Note that only the clients that have specified a CRI are considered
// when determining which client has the lowest requested CRI
Set selectedCRI of sensorID device to lowest of clientCRIs
if (selectedCRI < effectiveMinCRI)
{
selectedCRI = effectiveMinCRI
}
}
else //no client has specified a CRI
{
selectedCRI = defaultCRI
}
effectiveCRI = DriverUpdateSensorDeviceCRI(sensorID, selectedCRI)
}
DriverUpdateCS(sensorID)
{
for (each datafield supported by sensorID)
{
if (true == flagCS)
{
// Note that only the clients that have specified a CS are considered
// when determining which client has the lowest requested CS
Set selectedCS[n] of sensorID device to lowest of clientCS[n]
}
else //no client has specified a CS
{
selectedCS[n] = defaultCS[n]
}
}
effectiveCS[] = DriverUpdateSensorDeviceCS(sensorID, selectedCS[])
}
DriverUpdateLDA(sensorID)
{
if (true == flagLDA)
{
// Note that only the clients that have specified an LDAare considered
// when determining which client has the lowest (most accurate) requested LDA
Set selectedLDA of sensorID device to lowest (most accurate) of clientLDAs
}
else //no client has specified a LDA
{
selectedLDA = defaultLDA
}
effectiveLDA = DriverUpdateSensorDeviceLDA(sensorID, selectedLDA)
}
Sensor state updates
The DriverUpdateSensorState method demonstrates how a driver updates the sensor event reporting and power states.
DriverUpdateSensorState(sensorID)
{
if (clientCount == 0) // no clients
{
if (subscriberCount == 0) //no subscribers
{
selectedRS = reportingStateNoEvents
selectedPS = powerStatePowerOff
}
else //has subscribers
{
//illegal state
selectedRS = reportingStateNoEvents
selectedPS = powerStatePowerOff
}
}
else //has clients
{
if (subscriberCount == 0) //no subscribers
{
if (true == flagCRI)
{
selectedRS = reportingStateAllEvents
selectedPS = powerStateFullPower
}
else
{
selectedRS = reportingStateNoEvents
selectedPS = powerStateLowPower
}
else
}
else //has subscribers
{
selectedRS = reportingStateAllEvents
selectedPS = powerStateFullPower
}
}
effectiveRS = DriverUpdateSensorDeviceRS(sensorID, selectedRS)
effectivePS = DriverUpdateSensorDevicePS(sensorID, selectedPS)
}
Data field updates
The DriverUpdateDatafields method demonstrates how a driver updates its data fields.
DriverUpdateDatafields(sensorID)
{
if (effectiveRS == eventsOff)
{
if (sensor device is intelligent (ex. HID))
{
HIDSensorPollData(sensorID)
// a poll response by the sensor device will happen asynchronously
// the sensor device responds to this poll request by sending an
// input packed, and this is received in the
// DriverHandleAsyncDataEvent() just as any other data packet
// is received
}
else if (sensor device is simple (ex. SPB))
{
currentDatafields[] = SpbSensorPollData(sensorID)
// ** TODO: Data is not updated asynchronously when polled
// ** via SPB. Datafields[] must be assigned similarly to
// ** DDIHandleAsyncDataEvent() when that logic has been
// ** finalized. A shared helper method is likely best.
}
else if (sensor device is fusion)
{
//handle fusion sensor
}
else //is some other kind of sensor
{
//special action
}
}
else
{
// datafields are being updated by events
// (i.e. DDIHandleAsyncDataEvent)
}
}
Related topics
Feedback
https://aka.ms/ContentUserFeedback.
Coming soon: Throughout 2024 we will be phasing out GitHub Issues as the feedback mechanism for content and replacing it with a new feedback system. For more information see:Submit and view feedback for