public void Start(HomeSimCockpitSDK.StartStopType StartStartStopType) { // nie ma żadnych zmiennych więc nie trzeba nic robić if (_variables == null || _variables.Length == 0) { return; } // wyczyszczenie słowników _inputsDictionary.Clear(); _registeredVariables.Clear(); // sprawdzenie czy są zmienne z zarejestrowanymi "słuchaczami" foreach (PMDGVariable input in _variables) { if (input.IsListenerRegistered) { input.Module = this; input.Reset(); input.FirstSet(); _registeredVariables.Add(input); // uint key = 0; // switch (input.Type) // { // case HomeSimCockpitSDK.VariableType.Bool: // key = BOOL_FLAG | input.FSXGroup; // break; // // case HomeSimCockpitSDK.VariableType.Int: // key = INT_FLAG | input.FSXGroup; // break; // // case HomeSimCockpitSDK.VariableType.Double: // key = DOUBLE_FLAG | input.FSXGroup; // break; // // case HomeSimCockpitSDK.VariableType.String: // key = STRING_FLAG | input.FSXGroup; // break; // } // if (!_inputsDictionary.ContainsKey(key)) // { // _inputsDictionary[key] = new List<FSXInput>(); // } // _inputsDictionary[key].Add(input); } } if (_registeredVariables.Count == 0) { // nie ma żadnych zmiennych zarejestrowanych więc nie ma nic do roboty return; } // połączenie z FSX _working = true; OpenSimConnect(); //_simconnect.RegisterDataDefineStruct<PMDG.PMDG_NGX_Data>(PMDG.PMDGEnum.PMDG_NGX_DATA_DEFINITION); _simconnect.MapClientDataNameToID(PMDG.PMDG737NGXSDK.PMDG_NGX_DATA_NAME, PMDG.PMDGEnum.PMDG_NGX_DATA_ID); _simconnect.AddToClientDataDefinition(PMDG.PMDGEnum.PMDG_NGX_DATA_DEFINITION, 0, (uint)Marshal.SizeOf(typeof(PMDG.PMDG_NGX_Data)), 0, 0); _simconnect.RequestClientData(PMDG.PMDGEnum.PMDG_NGX_DATA_ID, PMDG.PMDGEnum.DATA_REQUEST, PMDG.PMDGEnum.PMDG_NGX_DATA_DEFINITION, SIMCONNECT_CLIENT_DATA_PERIOD.ON_SET, SIMCONNECT_CLIENT_DATA_REQUEST_FLAG.CHANGED, 0, 0, 0); _simconnect.RegisterStruct <SIMCONNECT_RECV_CLIENT_DATA, PMDG.PMDG_NGX_Data>(PMDG.PMDGEnum.PMDG_NGX_DATA_DEFINITION); //_simconnect.RegisterStruct<SIMCONNECT_RECV, PMDG.PMDG_NGX_Data>(PMDG.PMDGEnum.PMDG_NGX_DATA_DEFINITION); // // pobranie metody "RegisterDataDefineStruct" // Type simConnectType = _simconnect.GetType(); // // // utworzenie Assembly i Module // AssemblyBuilder asmBuilder = null; // ModuleBuilder modBuilder = null; // AssemblyName assemblyName = new AssemblyName(); // assemblyName.Name = "DynamicStructs"; // AppDomain thisDomain = Thread.GetDomain(); // asmBuilder = thisDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run); // modBuilder = asmBuilder.DefineDynamicModule(asmBuilder.GetName().Name, false); // // // utworzenie dynamicznie struktur do odbierania danych // foreach (KeyValuePair<uint, List<FSXInput>> kvp in _inputsDictionary) // { // int index = 0; // uint structId = kvp.Key; // TypeBuilder typeBuilder = modBuilder.DefineType("Struct_bool_" + kvp.Key.ToString(), TypeAttributes.Public | TypeAttributes.AutoClass | TypeAttributes.AnsiClass | TypeAttributes.BeforeFieldInit | TypeAttributes.SequentialLayout, typeof(ValueType)); // foreach (FSXInput input in kvp.Value) // { // input._DynamicName = "field_" + (index++).ToString(); // input._DynamicValue = null; // Type t = FSXTypeToType(input.FSXType); // typeBuilder.DefineField(input._DynamicName, t, FieldAttributes.Public); // _simconnect.AddToDataDefinition((DATA_DEFINITIONS)structId, input.FSXName, FSXUnitToFSXUnitName(input.FSXUnit), input.FSXType, input.FSXEpsilon, SimConnect.SIMCONNECT_UNUSED); // } // Type structType = typeBuilder.CreateType(); // MethodInfo dynamicMethod = _simconnect.GetType().GetMethod("RegisterDataDefineStruct").MakeGenericMethod(new Type[] { structType }); // dynamicMethod.Invoke(_simconnect, new object[] { (DATA_DEFINITIONS)structId }); // // _simconnect.RequestDataOnSimObject((DATA_REQUESTS)(structId | FIRST_REQUEST_FLAG), (DATA_DEFINITIONS)structId, SimConnect.SIMCONNECT_OBJECT_ID_USER, SIMCONNECT_PERIOD.ONCE, SIMCONNECT_DATA_REQUEST_FLAG.DEFAULT, 0, 0, 0); // _simconnect.RequestDataOnSimObject((DATA_REQUESTS)structId, (DATA_DEFINITIONS)structId, SimConnect.SIMCONNECT_OBJECT_ID_USER, SIMCONNECT_PERIOD.SIM_FRAME, SIMCONNECT_DATA_REQUEST_FLAG.CHANGED, 0, 0, 0); // } // wystartowanie wątka // (w wątku jednorazowane pobranie wartości // i żądanie uaktualnień wartości gdy się zmienią) //throw new NotImplementedException(); }