diff --git a/crates/irsdk/src/lib.rs b/crates/irsdk/src/lib.rs index f22c37f..d02dc8b 100644 --- a/crates/irsdk/src/lib.rs +++ b/crates/irsdk/src/lib.rs @@ -13,11 +13,15 @@ use windows::core::{PCWSTR, w}; const MEM_MAP_FILE_NAME: PCWSTR = w!(r"Local\IRSDKMemMapFileName"); const DATA_VALID_EVENT_NAME: PCWSTR = w!(r"Local\IRSDKDataValidEvent"); const TIMEOUT_MS: u32 = 1000; +const FILE_NOT_FOUND_CODE: i32 = 0x80070002u32 as i32; #[derive(Clone, Debug, thiserror::Error)] pub enum IRacingClientError { - #[error(transparent)] - Windows(#[from] windows::core::Error), + #[error("Unknown windows error")] + Windows(#[source] windows::core::Error), + + #[error("iRacing is not running")] + Disconnected(#[source] Option), #[error(transparent)] RawTelemError(#[from] ibt::RawTelemError), @@ -26,6 +30,16 @@ pub enum IRacingClientError { RawConversionError(#[from] ibt::telemetry::RawConversionError), } +impl From for IRacingClientError { + fn from(err: windows::core::Error) -> Self { + if err.code().0 == FILE_NOT_FOUND_CODE { + Self::Disconnected(Some(err)) + } else { + Self::Windows(err) + } + } +} + #[derive(Debug)] pub struct IRacingClient { file_mapping_handle: HANDLE, @@ -85,6 +99,10 @@ impl IRacingClient { let ptr = self.mem_map_address.Value as *const raw::Header; let raw_header = unsafe { raw::Header::from_raw_ptr(ptr)? }; + if raw_header.status != 1 { + return Err(IRacingClientError::Disconnected(None)); + } + Ok(raw_header) }