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 次下载
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