#遥测 #接口 #会话 #设置 #直播 #数据 #连接

iracing

Rust 编写的 iRacing 实时遥测、会话数据和设置文件接口

13 个不稳定版本 (3 个破坏性更新)

0.4.1 2020 年 12 月 24 日
0.4.0 2020 年 4 月 12 日
0.3.0 2020 年 4 月 3 日
0.2.8 2020 年 3 月 26 日
0.1.2 2020 年 3 月 13 日

#240游戏

每月 33 次下载

MIT 许可证

48KB
947

iRacing.rs

Rust 的实时遥测和会话数据接口。

用法

请参阅 /examples 中的更多示例

extern crate iracing;
use iracing::Connection;
use iracing::telemetry::TelemetryError;

pub fn main() {

    // Open the iRacing Telemetry data
    let conn = Connection::new().expect("Unable to open telemetry. Is iRacing running?");

    // Get a blocking telemetry client
    let bc = Connection::blocking().expect("Unable to start telemetry reader");

    loop {
        // bc.get() will block until new telemetry data is available.
        let sample = match bc.get() {
            Ok(sample) => sample,
            Err(TelemetryError::TIMEOUT(ms)) => panic!("Telemetry timed out after {}ms", ms);
            Err(error) => panic!("Telemetry Error: {:?}", error);
        }
    }
}

iRacing 遥测如何工作

iRacing 提供了很少的文档说明如何导出遥测数据,以下是我的版本。

iRacing 将遥测导出到一个 非持久内存映射文件
这允许 iRacing 提供高更新率的遥测数据,可以被多个读取应用程序读取。

共享内存空间始终称为 Local\\IRSDKMemMapFileName
此内存包含四个主要区域

  • 一个顶层头,描述内存空间的内容,包括

    • 数据版本(目前为 2.0)
    • 更新率(通常为 60Hz)
    • 数据最后更新的游戏周期
    • 查找和读取会话信息和遥测所需的信息。
  • 一个 ISO-8859-1 编码的 YAML 字符串,包含半静态会话信息,如赛道名称和布局、正在驾驶的车辆以及驾驶这些车辆的驾驶员。

  • 一个二级头,描述遥测缓冲区中的可用数据

  • 最多 4 个遥测数据缓冲区

模拟器在写入遥测时遍历最多 4 个遥测数据缓冲区,并更新顶层头以指示每个缓冲区最后更新的时间和位置。所有缓冲区具有相同的结构,每个会话可用的值数量是固定的。

会话数据可以按照顶层头中指明的位置和大小读取为字符串,并解析为 YAML 以获取会话的完整详细信息。YAML 文档的结构在 IRSDK 文档中提供。

可用的遥测数据是可变的,主要取决于玩家的车辆。顶层头表示可用的遥测值数量以及指向描述这些内容的结构数组开始的指针。结构如下

typedef struct iracing_telem_var_header {
    int value_type /* Enum of value type */
    int offset /* Offset from start of telemetry buffer where variable is stored */
    int count /* A count of values for this variable */

    char [3]pad /* Padding */

    char [32]name /* Varaible name */
    char [64]desc /* Variable description */
    char [32]units /* Variable units */
}

如果顶级标题指示有548个变量,则变量标题将是一个包含548个元素的数组(iracing_telem_var_header[548])。然后,这个标题可以用作查找表,在遥测缓冲区中查找特定的遥测变量。

例如,给定以下变量标题

{
    .value_type = 1, /* float */
    .offset = 0x4F82,
    .count = 6,
    .pad = [0,0,0],
    .name = "DampDeflectLR",
    .desc = "Damper Deflection (Left-Rear)",
    .units = "mm"
};

我们知道变量 "DampDeflectLR" 距遥测缓冲区起始处有 0x4F82 字节,值是浮点数,每个4字节,共有6个值。

知道这一点后,我们需要从遥测缓冲区的起始处读取24字节,从 0x4F82 字节到 0x4F93,这将给我们一个包含6个 float 的数组

一个C实现可能如下所示

float* suspension_deflect = (float*)calloc(6, sizeof(float));
size_t suspection_deflect_loc = 0x4F82;

memcpy(suspension_deflect, telem_buffer_start + suspension_deflect_loc, 6 * sizeof(float));

依赖关系

~5MB
~90K SLoC