From ae7111ac3336ba463cb255e26db99d0395cd2779 Mon Sep 17 00:00:00 2001 From: Avii Date: Tue, 22 Oct 2024 12:31:35 +0200 Subject: [PATCH] Fix facilities rgData --- simconnect-sdk/src/simconnect/base.rs | 102 ++++++++++++++++---------- 1 file changed, 62 insertions(+), 40 deletions(-) diff --git a/simconnect-sdk/src/simconnect/base.rs b/simconnect-sdk/src/simconnect/base.rs index c445b74..0cd34e1 100644 --- a/simconnect-sdk/src/simconnect/base.rs +++ b/simconnect-sdk/src/simconnect/base.rs @@ -3,6 +3,10 @@ use std::{collections::HashMap, ffi::c_void}; use tracing::{error, span, trace, warn, Level}; +use crate::bindings::{ + SIMCONNECT_DATA_FACILITY_AIRPORT, SIMCONNECT_DATA_FACILITY_NDB, SIMCONNECT_DATA_FACILITY_VOR, + SIMCONNECT_DATA_FACILITY_WAYPOINT, +}; use crate::domain::{ Airport, ClientEvent, ClientEventRequest, Notification, Object, SystemEvent, SystemEventRequest, Waypoint, CLIENT_EVENT_DISCRIMINANT_START, NDB, VOR, @@ -255,18 +259,22 @@ impl SimConnect { event._base.dwRequestID, ); - let data = (0..event._base.dwArraySize as usize) - .map(|i| { - // `rgData` is defined as a 1-element array, but it is actually a variable-length array. - let record = unsafe { event.rgData.get_unchecked(i) }; + let as_pointer = event.rgData.as_ptr(); + let s = unsafe { + core::slice::from_raw_parts( + as_pointer as *mut SIMCONNECT_DATA_FACILITY_AIRPORT, + event._base.dwArraySize as usize, + ) + }; - Airport { - ident: fixed_c_str_to_string(&record.Ident), - region: fixed_c_str_to_string(&record.Region), - lat: record.Latitude, - lon: record.Longitude, - alt: record.Altitude, - } + let data = s + .iter() + .map(|record| Airport { + ident: fixed_c_str_to_string(&record.Ident), + region: fixed_c_str_to_string(&record.Region), + lat: record.Latitude, + lon: record.Longitude, + alt: record.Altitude, }) .collect::>(); @@ -284,19 +292,23 @@ impl SimConnect { event._base.dwRequestID, ); - let data = (0..event._base.dwArraySize as usize) - .map(|i| { - // `rgData` is defined as a 1-element array, but it is actually a variable-length array. - let record = unsafe { event.rgData.get_unchecked(i) }; + let as_pointer = event.rgData.as_ptr(); + let s = unsafe { + core::slice::from_raw_parts( + as_pointer as *mut SIMCONNECT_DATA_FACILITY_WAYPOINT, + event._base.dwArraySize as usize, + ) + }; - Waypoint { - ident: fixed_c_str_to_string(&record._base.Ident), - region: fixed_c_str_to_string(&record._base.Region), - lat: record._base.Latitude, - lon: record._base.Longitude, - alt: record._base.Altitude, - mag_var: record.fMagVar, - } + let data = s + .iter() + .map(|record| Waypoint { + ident: fixed_c_str_to_string(&record._base.Ident), + region: fixed_c_str_to_string(&record._base.Region), + lat: record._base.Latitude, + lon: record._base.Longitude, + alt: record._base.Altitude, + mag_var: record.fMagVar, }) .collect::>(); @@ -314,20 +326,24 @@ impl SimConnect { event._base.dwRequestID, ); - let data = (0..event._base.dwArraySize as usize) - .map(|i| { - // `rgData` is defined as a 1-element array, but it is actually a variable-length array. - let record = unsafe { event.rgData.get_unchecked(i) }; + let as_pointer = event.rgData.as_ptr(); + let s = unsafe { + core::slice::from_raw_parts( + as_pointer as *mut SIMCONNECT_DATA_FACILITY_NDB, + event._base.dwArraySize as usize, + ) + }; - NDB { - ident: fixed_c_str_to_string(&record._base._base.Ident), - region: fixed_c_str_to_string(&record._base._base.Region), - lat: record._base._base.Latitude, - lon: record._base._base.Longitude, - alt: record._base._base.Altitude, - mag_var: record._base.fMagVar, - frequency: record.fFrequency, - } + let data = s + .iter() + .map(|record| NDB { + ident: fixed_c_str_to_string(&record._base._base.Ident), + region: fixed_c_str_to_string(&record._base._base.Region), + lat: record._base._base.Latitude, + lon: record._base._base.Longitude, + alt: record._base._base.Altitude, + mag_var: record._base.fMagVar, + frequency: record.fFrequency, }) .collect::>(); @@ -345,11 +361,17 @@ impl SimConnect { event._base.dwRequestID, ); - let data = (0..event._base.dwArraySize as usize) - .map(|i| { - // `rgData` is defined as a 1-element array, but it is actually a variable-length array. - let record = unsafe { event.rgData.get_unchecked(i) }; + let as_pointer = event.rgData.as_ptr(); + let s = unsafe { + core::slice::from_raw_parts( + as_pointer as *mut SIMCONNECT_DATA_FACILITY_VOR, + event._base.dwArraySize as usize, + ) + }; + let data = s + .iter() + .map(|record| { let has_nav_signal = record.Flags & bindings::SIMCONNECT_RECV_ID_VOR_LIST_HAS_NAV_SIGNAL == bindings::SIMCONNECT_RECV_ID_VOR_LIST_HAS_NAV_SIGNAL;