定义传感器对象

在 Windows 可移植设备 (WPD) 中,设备上的逻辑实体称为 对象。 对象可以表示设备的信息或功能部件。 任何对象都有一个或多个属性。 可以将属性视为对象描述元数据。 例如,样本温度和湿度传感器上的 TempHumidity 对象支持 SENSOR_READING 属性。 此属性指定设备获取的当前温度和相对湿度。

WpdHelloWorldDriver 支持下表中显示的对象。

对象 描述
设备 包含描述性属性的根对象,例如固件版本、模型和友好名称。
存储 一个 公开属性的对象,例如存储容量、文件系统类型和可用字节计数。
文件夹 一个公开属性的对象,例如文件夹名称。
文件 公开属性的对象,例如文件名和实际文件内容。

由于示例传感器不支持存储、文件夹或文件对象,因此 WpdBasicHardwareDriver 不实现这些对象。 相反,每个传感器类型都由单个对象表示。 下表列出了 WpdBasicHardwareDriver 支持的对象。

对象 描述
设备 包含描述性属性的根对象,例如固件版本、模型和友好名称。
TempHumidity 显示温度读数和湿度读数以及可编辑的更新间隔属性的功能对象。
指南针 显示指南针读数的功能对象,以及可编辑的更新间隔属性。
PIR 显示被动红外读数的功能对象,以及可编辑的更新间隔属性。
QTI 显示环境光读数的功能对象,以及可编辑的更新间隔属性。
Flex 显示压力读数的功能对象,以及可编辑的更新间隔属性。
Ping 显示距离读数以及可编辑的更新间隔属性的功能对象。
压 电 显示振动读数的功能对象,以及可编辑的更新间隔属性。
Memsic 显示 2 轴加速计读数以及可编辑的更新间隔属性的功能对象。
Hitachi 显示 3 轴加速计读数以及可编辑的更新间隔属性的功能对象。

在 WPD 中,对象由字符串标识。 Device 对象的字符串标识符在 Portabledevice.h 文件中定义:

#define WPD_DEVICE_OBJECT_ID  L"DEVICE"

传感器对象的字符串标识符在 WpdBasicHardwareDriver 的 WpdObjectProperties.h 文件中定义:

#define SENSOR_OBJECT_ID             L"Sensor"
#define SENSOR_OBJECT_NAME_VALUE          L"Parallax Sensor"
#define COMPASS_SENSOR_OBJECT_ID              L"Compass"
#define COMPASS_SENSOR_OBJECT_NAME_VALUE      L"HM55B Compass Sensor"
#define PIR_SENSOR_OBJECT_ID                  L"PIR"
#define PIR_SENSOR_OBJECT_NAME_VALUE          L"Passive Infra-Red Sensor"
#define QTI_SENSOR_OBJECT_ID                  L"QTI"
#define QTI_SENSOR_OBJECT_NAME_VALUE          L"QTI Light Sensor"
#define FLEX_SENSOR_OBJECT_ID                 L"Flex"
#define FLEX_SENSOR_OBJECT_NAME_VALUE         L"Flex Force Sensor"
#define PING_SENSOR_OBJECT_ID                 L"Ping"
#define PING_SENSOR_OBJECT_NAME_VALUE         L"Ultrasonic Distance Sensor"
#define PIEZO_SENSOR_OBJECT_ID                L"Piezo"
#define PIEZO_SENSOR_OBJECT_NAME_VALUE        L"Piezo Vibration Sensor"
#define TEMP_SENSOR_OBJECT_ID                 L"TempHumidity"
#define TEMP_SENSOR_OBJECT_NAME_VALUE         L"Sensiron Temperature and Humidity Sensor"
#define MEMSIC_SENSOR_OBJECT_ID               L"Memsic"
#define MEMSIC_SENSOR_OBJECT_NAME_VALUE       L"Memsic Dual-Axis G-Force Sensor"
#define HITACHI_SENSOR_OBJECT_ID              L"Hitachi"
#define HITACHI_SENSOR_OBJECT_NAME_VALUE      L"Hitachi Tri-Axis G-Force Sensor"

这些对象标识符常量将传递给源模块中的方法,这些方法处理对象枚举 (WpdObjectEnum.cpp) 、 (WpdObjectProperties.cpp) 和设备功能检索 (WpdCapabilities.cpp) 。 WpdObjectEnumerator::OnFindNext 方法的以下摘录显示了如何在示例驱动程序的对象枚举中使用这些标识符:

// If the enumeration context reports that there are more objects to return, then continue, if not,
    // return an empty results set.
    if ((hr == S_OK) && (pEnumeratorContext != NULL) && (pEnumeratorContext->HasMoreChildrenToEnumerate() == TRUE))
    {
        if (pEnumeratorContext->m_strParentObjectID.CompareNoCase(L"") == 0)
        {
            // We are being asked for the WPD_DEVICE_OBJECT_ID
            hr = AddStringValueToPropVariantCollection(pObjectIDCollection, WPD_DEVICE_OBJECT_ID);
            CHECK_HR(hr, "Failed to add 'DEVICE' object ID to enumeration collection");

            // Update the number of children we are returning for this enumeration call
            NumObjectsEnumerated++;
        }
        else if (pEnumeratorContext->m_strParentObjectID.CompareNoCase(WPD_DEVICE_OBJECT_ID) == 0)
        {
    
            // We are being asked for direct children of the WPD_DEVICE_OBJECT_ID
            switch (m_pBaseDriver->m_SensorType)
            {
            case WpdBaseDriver::UNKNOWN:
                    hr = AddStringValueToPropVariantCollection(pObjectIDCollection, SENSOR_OBJECT_ID);
                    break;
            case WpdBaseDriver::COMPASS:
                    hr = AddStringValueToPropVariantCollection(pObjectIDCollection, COMPASS_SENSOR_OBJECT_ID);
                    break;
            case WpdBaseDriver::SENSIRON:
                    hr = AddStringValueToPropVariantCollection(pObjectIDCollection, TEMP_SENSOR_OBJECT_ID);
                    break;
            case WpdBaseDriver::FLEX:
                    hr = AddStringValueToPropVariantCollection(pObjectIDCollection, FLEX_SENSOR_OBJECT_ID);
                    break;
            case WpdBaseDriver::PING:
                    hr = AddStringValueToPropVariantCollection(pObjectIDCollection, PING_SENSOR_OBJECT_ID);
                    break;
            case WpdBaseDriver::PIR:
                    hr = AddStringValueToPropVariantCollection(pObjectIDCollection, PIR_SENSOR_OBJECT_ID);
                    break;
            case WpdBaseDriver::MEMSIC:
                    hr = AddStringValueToPropVariantCollection(pObjectIDCollection, MEMSIC_SENSOR_OBJECT_ID);
                    break;
            case WpdBaseDriver::QTI:
                    hr = AddStringValueToPropVariantCollection(pObjectIDCollection, QTI_SENSOR_OBJECT_ID);
                    break;
            case WpdBaseDriver::PIEZO:
                    hr = AddStringValueToPropVariantCollection(pObjectIDCollection, PIEZO_SENSOR_OBJECT_ID);
                    break;
            case WpdBaseDriver::HITACHI:
                    hr = AddStringValueToPropVariantCollection(pObjectIDCollection, HITACHI_SENSOR_OBJECT_ID);
                    break;
                default:
                    break;

在 WpdBasicHardwareDriver 示例中,驱动程序定义了包含所有传感器的单个功能类别。 驱动程序开发人员可以扩展此示例,并为每个传感器类型定义单独的功能类别,以便应用程序可以确定驱动程序支持哪些传感器。 这要求开发人员修改 WpdCapabilities::OnGetFunctionalCategories 方法,以便正确返回这些新类别。