Windows传感器开发之选择传感器

不同类型的传感器报告不同的信息。微软将这些信息称之为数据域 (Data Field),它们集合在一个 SensorDataReport 中。一台电脑可能需要配备一个以上的传感器供一款应用使用。这款应用在信息可用的情况下并不会关注信息的来源(即来自于哪个传感器)。

下表显示了 Win32/COM 和 .NET 最常用数据域的常量名称。与传感器标识符一样,这些常量仅代表它们对应的 GUID 的人类可读的名称。这种对应方法为那些微软预定义的“已知”数据域之外的数据域提供了扩展性。

常量 (Win32*/COM)

常量 (.NET)

属性键 (GUID,PID)

SENSOR_DATA_TYPE_TIMESTAMP

SensorDataTypeTimestamp

{DB5E0CF2-CF1F-4C18-B46C-D86011D62150},2

SENSOR_DATA_TYPE_LIGHT_LEVEL_LUX

SensorDataTypeLightLevelLux

{E4C77CE2-DCB7-46E9-8439-4FEC548833A6},2

SENSOR_DATA_TYPE_ACCELERATION_X_G

SensorDataTypeAccelerationXG

{3F8A69A2-07C5-4E48-A965-CD797AAB56D5},2

SENSOR_DATA_TYPE_ACCELERATION_Y_G

SensorDataTypeAccelerationYG

{3F8A69A2-07C5-4E48-A965-CD797AAB56D5},3

SENSOR_DATA_TYPE_ACCELERATION_Z_G

SensorDataTypeAccelerationZG

{3F8A69A2-07C5-4E48-A965-CD797AAB56D5},4

SENSOR_DATA_TYPE_ANGULAR_VELOCITY_X_DEGRE
ES_PER_SECOND

SensorDataTypeAngularVelocityXDegreesPerSecond

{3F8A69A2-07C5-4E48-A965-CD797AAB56D5},10

SENSOR_DATA_TYPE_ANGULAR_VELOCITY_Y_DEGRE
ES_PER_SECOND

SensorDataTypeAngularVelocityYDegreesPerSecond

{3F8A69A2-07C5-4E48-A965-CD797AAB56D5},11

SENSOR_DATA_TYPE_ANGULAR_VELOCITY_Z_DEGRE
ES_PER_SECOND

SensorDataTypeAngularVelocityZDegreesPerSecond

{3F8A69A2-07C5-4E48-A965-CD797AAB56D5},12

SENSOR_DATA_TYPE_TILT_X_DEGREES

SensorDataTypeTiltXDegrees

{1637D8A2-4248-4275-865D-558DE84AEDFD},2

SENSOR_DATA_TYPE_TILT_Y_DEGREES

SensorDataTypeTiltYDegrees

{1637D8A2-4248-4275-865D-558DE84AEDFD},3

SENSOR_DATA_TYPE_TILT_Z_DEGREES

SensorDataTypeTiltZDegrees

{1637D8A2-4248-4275-865D-558DE84AEDFD},4

SENSOR_DATA_TYPE_MAGNETIC_HEADING_COMPEN
SATED_MAGNETIC_NORTH_DEGREES

SensorDataTypeMagneticHeadingCompen
satedTrueNorthDegrees

{1637D8A2-4248-4275-865D-558DE84AEDFD},11

SENSOR_DATA_TYPE_MAGNETIC_FIELD_STRENGTH_
X_MILLIGAUSS

SensorDataTypeMagneticFieldStrengthXMilligauss

{1637D8A2-4248-4275-865D-558DE84AEDFD},19

SENSOR_DATA_TYPE_MAGNETIC_FIELD_STRENGTH_
Y_MILLIGAUSS

SensorDataTypeMagneticFieldStrengthYMilligauss

{1637D8A2-4248-4275-865D-558DE84AEDFD},20

SENSOR_DATA_TYPE_MAGNETIC_FIELD_STRENGTH_
Z_MILLIGAUSS

SensorDataTypeMagneticFieldStrengthZMilligauss

{1637D8A2-4248-4275-865D-558DE84AEDFD},21

SENSOR_DATA_TYPE_QUATERNION

SensorDataTypeQuaternion

{1637D8A2-4248-4275-865D-558DE84AEDFD},17

SENSOR_DATA_TYPE_ROTATION_MATRIX

SensorDataTypeRotationMatrix

{1637D8A2-4248-4275-865D-558DE84AEDFD},16

SENSOR_DATA_TYPE_LATITUDE_DEGREES

SensorDataTypeLatitudeDegrees

{055C74D8-CA6F-47D6-95C6-1ED3637A0FF4},2

SENSOR_DATA_TYPE_LONGITUDE_DEGREES

SensorDataTypeLongitudeDegrees

{055C74D8-CA6F-47D6-95C6-1ED3637A0FF4},3

SENSOR_DATA_TYPE_ALTITUDE_ELLIPSOID_METERS

SensorDataTypeAltitudeEllipsoidMeters

{055C74D8-CA6F-47D6-95C6-1ED3637A0FF4},5

使得数据域标识符与传感器 ID 不同的原因是使用了名为属性键的数据类型。一个属性键包括一个 GUID (类似于传感器的 GUID) 以及一个名为“PID”的额外编号(属性 ID)。您可能会注意到属性键的 GUID 部分对于同一类别的传感器是通用的。数据域的所有值都具有本机数据类型,例如Boolean、unsigned char、int、float、double 等。

在 Win32/COM 中,数据域的值存储在名为 PROPVARIANT 的多态数据类型中。在 .NET 中,有一个名为“对象”(object) 的 CLR(通用语言运行时)数据类型执行相同的操作。而多态数据类型则需要被查询和/或转换为“预期”或“记录”数据类型。

使用传感器的 SupportsDataField() 方法检查传感器,获取感兴趣的数据域。这是选择传感器时最常使用的编程术语。根据应用的使用模型不同,可能仅需要使用部分的数据域。应当选择那些可以支持预期数据域的传感器。类型转换时要求对来自基类传感器的子类成员变量进行分配。

ISensor* m_pAls;
ISensor* m_pAccel;
ISensor* m_pTilt;
// Cycle through the collection looking for sensors we care about.
ULONG ulCount = 0;
HRESULT hr = pSensorCollection->GetCount(&ulCount);
if (FAILED(hr))
{
    ::MessageBox(NULL, _T("Unable to get count of sensors on the computer."), _T("Sensor C++ Sample"), MB_OK | MB_ICONERROR);
    return -1;
}
for (int i = 0; i < (int)ulCount; i++)
{
    hr = pSensorCollection->GetAt(i, &pSensor);
    if (SUCCEEDED(hr))
    {
        VARIANT_BOOL bSupported = VARIANT_FALSE;
        hr = pSensor->SupportsDataField(SENSOR_DATA_TYPE_LIGHT_LEVEL_LUX, &bSupported);
        if (SUCCEEDED(hr) && (bSupported == VARIANT_TRUE)) m_pAls = pSensor;
        hr = pSensor->SupportsDataField(SENSOR_DATA_TYPE_ACCELERATION_Z_G, &bSupported);
        if (SUCCEEDED(hr) && (bSupported == VARIANT_TRUE)) m_pAccel = pSensor;
        hr = pSensor->SupportsDataField(SENSOR_DATA_TYPE_TILT_Z_DEGREES, &bSupported);
        if (SUCCEEDED(hr) && (bSupported == VARIANT_TRUE)) m_pTilt = pSensor;
        .
        .
        .
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值