手柄
Haply::HardwareAPI::Devices::Handle
封装了与 Haply 句柄交互所需的逻辑。
警告句柄仍处于开发阶段,API 不稳定,也不能保证向后兼容。
必须对该类进行专门化,以覆盖其中一个受保护的虚拟方法,当从设备接收到特定事件时,将调用该方法:
- OnReceiveHandleInfo:唤醒设备后调用。
- OnReceiveHandleStatusMessage 从设备接收到新的状态更新时调用。
- 设备报告错误时调用 OnReceiveHandleErrorResponse。
构造函数需要一个代表句柄串行端口的SerialStream类实例作为参数。构建完成后,发送设备唤醒(SendDeviceWakeup)命令将唤醒句柄,并允许发送请求状态(RequestStatus)命令以获取最新的设备状态。接收方法应跟随任何命令方法,以处理设备的响应并触发其中一个重载虚拟方法。
手柄实现可通过设备状态中的字段自定义,字段的长度由字段决定。Haply Quill 的用户字段定义如下:
- :手柄平面上按钮的状态,其中 1 表示按住按钮。
- :电池电量,数值 100 表示电池已充满。
该类中的所有方法都将阻塞,直到各自的 IO 操作完成或出错。处理操作的频率约为 50Hz。如果多个设备由同一线程管理,则整体处理频率将以所有设备的最低频率为上限。因此,不建议在同一线程中混合使用处理程序和Inverse3。
索引
班级
成员
名称 | 类型 | 说明 |
---|---|---|
USER_DATA_MAX | static constexpr uint8_t | 文件中可包含的最大字节数 ... |
方法
名称 | 类型 | 说明 |
---|---|---|
手柄 | (...) | 从...中构造一个句柄对象。 |
发送设备唤醒 | void() | 唤醒句柄,以便执行其他命令。 |
请求状态 | void() | 从句柄中获取最新状态。 |
发送手柄状态 | void(const uint16_t, const uint8_t, ...) | 使用所提供的信息更新特定于句柄的用户状态 ... |
发送错误处理请求 | void(const uint16_t) | 从句柄中获取最新的错误信息。 |
接收 | int() | 接收并处理来自句柄的回复。 |
获取横握状态 | VersegripStatusResponse(...) | 获取 Versegrip 状态对象作为响应。 |
成员
USER_DATA_MAX
静态 constexpr uint8_t USER_DATA_MAX = 255
任何 Haply 句柄专门实现的用户字段所能包含的最大字节数。
方法
手柄
处理 Haply::HardwareAPI::IO::SerialStream* stream、 float timeout)
根据提供的数据流构造一个句柄对象。
参数
-
流表示与设备相关联的串行端口的流对象。流的生命周期必须与句柄对象的生命周期相匹配或超过。我们建议使用SerialStream类构建该流。
-
等待设备响应的最长时间。如果设备在此时间内未响应,操作将失败,并将错误信息打印到 stderr。
默认超时为 5 秒,负值将禁用超时。
发送设备唤醒
void SendDeviceWakeup()
唤醒句柄,以便执行其他命令。
必须先向设备发送该命令,然后才能发送其他命令。
之后必须调用Receive来处理句柄的响应,然后再调用 OnReceiveHandleInfo 重载方法。
请求状态
void RequestStatus()
从句柄中获取最新状态。
之后必须调用Receive来处理句柄的响应,然后再调用 OnReceiveHandleStatusMessage 重载方法。
发送手柄状态
void SendHandleState( const uint16_t device_id、 const uint8_t user_data_length、 const uint8_t * user_data)
使用提供的参数更新特定于句柄的用户状态。
之后必须调用Receive来处理句柄的响应,然后再调用 OnReceiveHandleStatusMessage 重载方法。
参数
-
device_id设备的 ID。该字段目前被句柄忽略,可以安全地设置为 0。
-
user_data_length从 user_data 中读取的字节数。必须小于USER_DATA_MAX。
-
user_data将被读取并用于更新句柄特定状态的字节。请查阅句柄的相关文档,以确定如何格式化这些字节。
发送错误处理请求
void SendHandleErrorRequest(const uint16_t device_id)
从句柄中获取最新的错误信息。
之后必须调用Receive来处理句柄的响应,然后再调用 OnReceiveHandleErrorResponse 重载方法。
参数
- device_id设备的 ID。该字段目前被句柄忽略,可以安全地设置为 0。
接收
int Receive()
接收并处理来自句柄的回复。
必须跟随对以下方法之一的任何调用,并将调用相关的重载方法:
- 发送设备唤醒-> OnReceiveHandleInfo
- 请求状态-> OnReceiveHandleStatusMessage
- 发送手柄状态-> 接收手柄状态信息
- SendHandleErrorRequest-> OnReceiveHandleErrorResponse
将阻塞,直到收到设备发送的信息或遇到错误。
返回
如果操作成功完成,则返回 0。如果发生错误,该方法将返回负值,错误信息将被打印到 stderr,并可能返回 false。
获取横握状态
VersegripStatusResponseGetVersegripStatus()
获取 Versegrip 状态对象作为响应。
新款 VerseGrip 可与连接到 USB 端口的加密狗配合使用,将有线手柄的易用性与无线手柄的自由性结合在一起。由于我们的无线通信频率超过了 1kHz,因此现在可以通过非常简单的方式在无线模式下使用手柄。只需在应用程序的标准循环中调用 "GetVersegripStatus",即可获得手柄的状态。