private void OnRecieveDataHandler(SimConnect sender, SIMCONNECT_RECV_SIMOBJECT_DATA data) { switch ((REQUESTS)data.dwRequestID) { case REQUESTS.AircraftRequest: foreach (AircraftData aircraftData in data.dwData) { clientRecieveAircraftDataHandler(aircraftData); } break; case REQUESTS.TrafficRequest: foreach (TrafficData trafficData in data.dwData) { clientRecieveTrafficDataHandler(data.dwObjectID, trafficData); } break; case REQUESTS.AttitudeRequest: foreach (AttitudeData attitudeData in data.dwData) { clientRecieveAttitudeDataHandler(attitudeData); } break; default: break; } }
private void SimConnect_OnRecvSimobjectData(SimConnect sender, SIMCONNECT_RECV_SIMOBJECT_DATA data) { Struct1 struct1 = (Struct1)data.dwData[0]; SetPith(struct1.PITCH); SetBank(struct1.BANK); }
void simconnect_OnRecvSimobjectData(SimConnect sender, SIMCONNECT_RECV_SIMOBJECT_DATA data) { switch ((DATA_REQUESTS)data.dwRequestID) { case DATA_REQUESTS.REQUEST_1: Struct1 s1 = (Struct1)data.dwData[0]; if (!simrunning) { sw.Start(); simrunning = true; } s1.time = sw.ElapsedMilliseconds; log.Add(s1); if (log.Count % 100 == 0) { Struct1 current = log.Last(); displayStats(current); } break; case DATA_REQUESTS.REQUEST_2: Struct2 s2 = (Struct2)data.dwData[0]; s2.time = log.Count == 0 ? 0 : log.Last().time; log2.Add(s2); break; default: displayText("Unknown request ID: " + data.dwRequestID); break; } }
private void SimConnect_OnRecvSimobjectData(SimConnect sender, SIMCONNECT_RECV_SIMOBJECT_DATA data) { Console.WriteLine("SimConnect_OnRecvSimobjectData"); uint iRequest = data.dwRequestID; uint iObject = data.dwObjectID; if (!lObjectIDs.Contains(iObject)) { lObjectIDs.Add(iObject); } foreach (SimvarRequest oSimvarRequest in lSimvarRequests) { if (iRequest == (uint)oSimvarRequest.eRequest && (!bObjectIDSelectionEnabled || iObject == m_iObjectIdRequest)) { double dValue = (double)data.dwData[0]; oSimvarRequest.dValue = dValue; oSimvarRequest.bPending = false; oSimvarRequest.bStillPending = false; // WatchServer sends to client var dict = new Dictionary <string, dynamic> { { "key", oSimvarRequest.sName }, { "value", dValue } }; watchServer.SendMessage(dict); } } }
private void ProcessData() { try { List <SIMCONNECT_RECV_SIMOBJECT_DATA> data = new List <SIMCONNECT_RECV_SIMOBJECT_DATA>(); while (_working) { _simConnectProcessEvent.WaitOne(); _simConnectProcessEvent.Reset(); lock (_dataQueue) { while (_dataQueue.Count > 0) { data.Add(_dataQueue.Dequeue()); } } while (data.Count > 0) { SIMCONNECT_RECV_SIMOBJECT_DATA d = data[0]; data.RemoveAt(0); } } } catch (ThreadAbortException) { } }
private void OnSimVarReceived(SimConnect sender, SIMCONNECT_RECV_SIMOBJECT_DATA data) { var request = _simVarsByRequests[(SimVars)data.dwRequestID]; request.Set(data.dwData[0]); _eventAggregator.GetEvent <SimVarReceivedEvent>().Publish(request); }
private void sc_OnRecvSimobjectData(SimConnect sender, SIMCONNECT_RECV_SIMOBJECT_DATA data) { if ((Requests)data.dwRequestID == Requests.UserPosition) { userPos = (LatLon)data.dwData; } }
private void Simconnect_OnRecvSimobjectData(SimConnect sender, SIMCONNECT_RECV_SIMOBJECT_DATA data) { switch (data.dwRequestID) { case (uint)DATA_REQUESTS.FLIGHT_STATUS: { var flightStatus = data.dwData[0] as FlightStatusStruct?; if (flightStatus.HasValue) { AircraftStatusUpdated?.Invoke(this, new AircraftStatusUpdatedEventArgs( new AircraftStatus { Latitude = flightStatus.Value.Latitude, Longitude = flightStatus.Value.Longitude, Altitude = flightStatus.Value.Altitude, AltitudeAboveGround = flightStatus.Value.AltitudeAboveGround, Bank = flightStatus.Value.Bank, Heading = flightStatus.Value.MagneticHeading, TrueHeading = flightStatus.Value.TrueHeading, GroundSpeed = flightStatus.Value.GroundSpeed, IndicatedAirSpeed = flightStatus.Value.IndicatedAirspeed, VerticalSpeed = flightStatus.Value.VerticalSpeed, IsOnGround = flightStatus.Value.IsOnGround == 1, Transponder = flightStatus.Value.Transponder.ToString().PadLeft(4, '0'), FrequencyCom1 = flightStatus.Value.Com1, FrequencyCom2 = flightStatus.Value.Com2 })); } } break; } }
private void SimClient_OnRecvSimobjectData(SimConnect sender, SIMCONNECT_RECV_SIMOBJECT_DATA data) { try { DataRxEvent?.Invoke((RequestsEnum)data.dwRequestID, data); } catch (Exception) { } }
private void OnRecvSimobjectData(SimConnect sender, SIMCONNECT_RECV_SIMOBJECT_DATA data) { AircraftStatusModel aircraftStatusModel = new AircraftStatusModel((AircraftStatusStruct)data.dwData[0]); var json = JsonConvert.SerializeObject(aircraftStatusModel); connection.Send <string>("flightdata", json); }
void simconnect_OnRecvSimobjectData(SimConnect sender, SIMCONNECT_RECV_SIMOBJECT_DATA data) { nbFromSimconnect += 1; if (!Acm.AlreadySending) { if (Acm.CurrentPort != null) { switch ((MySimConnect.DATA_REQUESTS)data.dwRequestID) { case MySimConnect.DATA_REQUESTS.REQUEST_1: MySimConnect.Struct1 s1 = (MySimConnect.Struct1)data.dwData[0]; MySimConnect.curHeading = Convert.ToUInt32(s1.heading * 180 / Math.PI); MySimConnect.curAltitude = Convert.ToInt32(s1.altitude); string msg; msg = "<DATA;"; msg += s1.autopilot + ";"; msg += s1.yawdamp_h + ";"; msg += s1.heading_h + ";"; msg += s1.approach_h + ";"; msg += s1.nav_h + ";"; msg += s1.altitude_h + ";"; msg += s1.vs_h + ";"; msg += Convert.ToInt32(s1.altitude) + ";"; msg += Convert.ToInt32(s1.heading * 180 / Math.PI) + ";"; msg += Math.Round(s1.altimeter, 2) + ";"; msg += Math.Round(s1.fuel_quantity / s1.fuel_capacity * 100) + ";"; msg += Math.Round(s1.wind_direction) + ";"; msg += Math.Round(s1.wind_velocity) + ";"; msg += Math.Round(s1.flaps * 100) + ";"; msg += Convert.ToInt32(s1.heading_var) + ";"; msg += Convert.ToInt32(s1.altitude_var) + ";"; msg += Convert.ToInt32(s1.vs_var) + ";"; msg += (s1.autopilot == 1 ? "AP" : "--"); msg += (s1.yawdamp_h == 1 ? "YD" : "--"); msg += (s1.heading_h == 1 ? "HDG" : "---"); msg += (s1.approach_h == 1 ? "APR" : "---"); msg += (s1.nav_h == 1 ? "NAV" : "---"); msg += (s1.altitude_h == 1 ? "ALT" : (s1.vs_h == 1 ? "VS-" : "---")); msg += ";END;>"; //DisplayInfo("(" + Acm.CurrentPort.PortName + "): SEND: " + msg); Acm.SendValue(msg); break; default: break; } } } }
protected virtual void SimConnect_OnRecvSimobjectData(SimConnect sender, SIMCONNECT_RECV_SIMOBJECT_DATA data) { if (data.dwRequestID == (uint)REQUESTS.AIRPLANE) { //this.AirPlaneData = (C172Struct)data.dwData[0]; SIMCONNECT_DATA_XYZ AIRCRAFT_ORIENTATION_AXIS = (SIMCONNECT_DATA_XYZ)data.dwData[0]; Console.WriteLine("{0}, {1}, {2}", AIRCRAFT_ORIENTATION_AXIS.x, AIRCRAFT_ORIENTATION_AXIS.y, AIRCRAFT_ORIENTATION_AXIS.z); } }
private void _simconnect_OnRecvSimobjectData(SimConnect sender, SIMCONNECT_RECV_SIMOBJECT_DATA data) { _simConnectEvent.Reset(); lock (_dataQueue) { _dataQueue.Enqueue(data); } _simConnectProcessEvent.Set(); }
void sc_OnRecvSimobjectData(SimConnect sender, SIMCONNECT_RECV_SIMOBJECT_DATA data) { if ((Requests)data.dwRequestID == Requests.UserPosition) { LatLon userPos = (LatLon)data.dwData; CreateNearbyObjects(new Coordinate(userPos.Latitude, userPos.Longitude), placementRadiusMeters); RemoveFarAwayObjects(new Coordinate(userPos.Latitude, userPos.Longitude), placementRadiusMeters); } }
protected override void OnRecvObjectData(SimConnect sender, SIMCONNECT_RECV_SIMOBJECT_DATA data) { AirplaneGeoInfo geoInfo = (AirplaneGeoInfo)data.dwData[0]; AirplaneGeoInfoChangedEventArgs args = new AirplaneGeoInfoChangedEventArgs { info = geoInfo }; OnAircraftDataChanged?.Invoke(this, args); }
private void OnRecvSimobjectData(SimConnect simConnect, SIMCONNECT_RECV_SIMOBJECT_DATA data) { REQUEST request = (REQUEST)data.dwRequestID; (simConnect as SimConnectzmo) !.typeToRequest ! .Where(candidate => candidate.Value == request) .Select(candidate => candidate.Key) .Single() .Process(simConnect, data.dwData[0]); }
public void receiveData(SIMCONNECT_RECV_SIMOBJECT_DATA data) { int diffSeconds = latestData.zuluTime; latestData = (flightData)data.dwData[0]; if (!flightDataValid) { // First reception of data initialFuel = latestData.totalFuel; flightDataValid = true; return; } diffSeconds = latestData.zuluTime - diffSeconds; if (diffSeconds <= 0) { return; } int envBonusFactor = latestData.altitude_agl <= 1000 ? 5 : latestData.altitude_agl < 2000 ? 3 : 1; envBonusTime += envBonusFactor * diffSeconds; envBonus += envBonusFactor * diffSeconds * weatherSeverity(); if (isTacho) { rentalTicker += diffSeconds * latestData.rpmPercentage / 36.0f; } else { engineTime += diffSeconds; } if (latestData.timeOfDay != 1) { nightTime += diffSeconds; } if (engines.Length > 0) { engines[0].feed(diffSeconds, latestData.combustion1 != 0, latestData.rpm1, latestData.cht1, latestData.mixture1, latestData.altitude); } if (engines.Length > 1) { engines[1].feed(diffSeconds, latestData.combustion2 != 0, latestData.rpm2, latestData.cht2, latestData.mixture2, latestData.altitude); } if (engines.Length > 2) { engines[2].feed(diffSeconds, latestData.combustion3 != 0, latestData.rpm3, latestData.cht3, latestData.mixture3, latestData.altitude); } if (engines.Length > 3) { engines[3].feed(diffSeconds, latestData.combustion4 != 0, latestData.rpm4, latestData.cht4, latestData.mixture4, latestData.altitude); } }
private async void OnRecvSimobjectData(SimConnect sender, SIMCONNECT_RECV_SIMOBJECT_DATA data) { try { var position = (SimUpdate)data.dwData; currentPosition = position; await simHub.SendPositionObject(position); } catch (Exception) { } }
/* * Data has been received from FS */ public void onRecvSimobjectData(SimConnect sender, SIMCONNECT_RECV_SIMOBJECT_DATA data) { switch ((DATA_REQUESTID)data.dwRequestID) { case DATA_REQUESTID.AIRCRAFT_SPECS: { if (currentAircraft != null) { currentAircraft.receiveData(data); } break; } case DATA_REQUESTID.AIRCRAFT_INFO: { aircraft_info latestInfo = (aircraft_info)data.dwData[0]; if (currentAircraft != null) { if (currentAircraft.specifications.title != latestInfo.title) { eventAircraftChanged(sender); } else { currentAircraft.latestInfo = latestInfo; if (!currentAircraft.probeDataValid) { updateProbedataFunction(); } updateFunction(); } } break; } case DATA_REQUESTID.FLIGHT_DATA: { if (currentFlight != null) { currentFlight.receiveData(data); checkCurrentState(currentFlight.latestData); } break; } case DATA_REQUESTID.FLIGHT_FINISH_DATA: { finishFlight(data); break; } } }
void simconnect_OnRecvSimobjectData(SimConnect sender, SIMCONNECT_RECV_SIMOBJECT_DATA data) { switch ((DATA_REQUESTS)data.dwRequestID) { case DATA_REQUESTS.REQUEST_1: Control1 s1 = (Control1)data.dwData[0]; send(); break; default: break; } }
public void receiveData(SIMCONNECT_RECV_SIMOBJECT_DATA data) { switch ((DATA_REQUESTID)data.dwRequestID) { case DATA_REQUESTID.AIRCRAFT_SPECS: { specifications = (aicraft_specs)data.dwData[0]; specifications.estimateFuelFlow /= 1000.0f; // estimateFF seems to be multiplied by 1000 by FS. break; } } }
void SimConnect_OnRecvSimobjectData(SimConnect sender, SIMCONNECT_RECV_SIMOBJECT_DATA data) { PositionData s1 = (PositionData)data.dwData[0]; double heading = s1.heading * 180.0 / Math.PI; double trueheading = s1.trueheading * 180.0 / Math.PI; string message = string.Format("{7}|{0:f10}|{1:f10}|{2:f0}|{3:f0}|{4:f0}|{5:f0}|{6:f0}", s1.latitude, s1.longitude, s1.altitude, s1.airspeed, s1.groundspeed, heading, trueheading, seq_id++); Console.WriteLine(message); // TODO: add timestamp if (FSXDataReceived != null) { FSXDataReceived(message); } }
private void Simconnect_OnRecvSimobjectData(SimConnect sender, SIMCONNECT_RECV_SIMOBJECT_DATA data) { // Must be general SimObject information switch (data.dwRequestID) { case (uint)DATA_REQUESTS.FLIGHT_STATUS: { var flightStatus = data.dwData[0] as FlightStatusStruct?; if (flightStatus.HasValue) { try { //object obj = data.dwData[0]; //AircraftData acData = (AircraftData?)obj ?? default; TelemetryData telemetryData = new TelemetryData { Pitch = (float)flightStatus.Value.Pitch, Roll = (float)flightStatus.Value.Bank, Yaw = (float)flightStatus.Value.Yaw, Surge = (float)flightStatus.Value.zAccel, Sway = (float)flightStatus.Value.xAccel, Heave = (float)flightStatus.Value.yAccel, RollSpeed = (float)flightStatus.Value.xVelocity, YawSpeed = (float)flightStatus.Value.yVelocity, PitchSpeed = (float)flightStatus.Value.zVelocity, Speed = (float)flightStatus.Value.GroundSpeed, RPM = (float)flightStatus.Value.RPM }; IsConnected = true; IsRunning = true; TelemetryEventArgs args = new TelemetryEventArgs(new TelemetryInfoElem(telemetryData, lastTelemetryData)); RaiseEvent(OnTelemetryUpdate, args); lastTelemetryData = telemetryData; } catch (Exception e) { LogError(Name + "TelemetryProvider Exception while receiving data", e); IsConnected = false; IsRunning = false; Thread.Sleep(1000); } } } break; } }
private void SimConnect_OnRecvSimobjectData(SimConnect sender, SIMCONNECT_RECV_SIMOBJECT_DATA data) { if (data.dwRequestID == (uint)(Requests.MainRequest)) { SimConnectData typedData = (SimConnectData)data.dwData[0]; if (!double.IsNaN(typedData.latitude)) { flightData.Latitude = typedData.latitude; } if (!double.IsNaN(typedData.longitude)) { flightData.Longitude = typedData.longitude; } if (!double.IsNaN(typedData.altitude)) { flightData.AltitudeFt = typedData.altitude; } if (!double.IsNaN(typedData.groundSpeed)) { flightData.GroundSpeedKt = typedData.groundSpeed; } if (!double.IsNaN(typedData.groundTrack)) { flightData.GroundTrackDegrees = typedData.groundTrack; } if (!double.IsNaN(typedData.pitch)) { flightData.PitchDegrees = -typedData.pitch; } if (!double.IsNaN(typedData.roll)) { flightData.RollDegrees = -typedData.roll; } if (!double.IsNaN(typedData.trueHeading)) { flightData.TrueHeadingDegrees = typedData.trueHeading; } Debug.WriteLine("SimConnect - Alt:{0:F2}, Lat:{1:F4}, Lon:{2:F4}, GS:{3:F1}, GT:{4:F1}, Pitch:{5:F2}, Roll:{6:F2}, TH:{7:F1}", typedData.altitude, typedData.latitude, typedData.longitude, typedData.groundSpeed, typedData.groundTrack, typedData.pitch, typedData.roll, typedData.trueHeading); Debug.WriteLine("Flight Data - Alt:{0:F2}, Lat:{1:F4}, Lon:{2:F4}, GS:{3:F1}, GT:{4:F1}, Pitch:{5:F2}, Roll:{6:F2}, TH:{7:F1}", flightData.AltitudeFt, flightData.Latitude, flightData.Longitude, flightData.GroundSpeedKt, flightData.GroundTrackDegrees, flightData.PitchDegrees, flightData.RollDegrees, flightData.TrueHeadingDegrees); } Debug.Flush(); }
private void simconnect_OnRecvSimObjectData(SimConnect sender, SIMCONNECT_RECV_SIMOBJECT_DATA data) { switch ((DATA_REQUESTS)data.dwRequestID) { case DATA_REQUESTS.REQUEST_PLAYER_UPDATE_AND_ATTACH: AirplaneData dt = (AirplaneData)data.dwData[0]; dt.desired = 0; simconnect.SetDataOnSimObject(DEFINITIONS.AirplaneData, towplaneid, 0, dt); break; default: MessageBox.Show("Unknown Request ID " + data.dwRequestID); break; } }
// for future use /* void SimConnect_OnRecvEvent(SimConnect sender, SIMCONNECT_RECV_EVENT data) * { * switch ((EVENTS)(data.uEventID)) * { * case EVENTS.FlightPlanActivated: * int n = 5; * break; * * case EVENTS.FlightPlanDeactivated: * int aa = 7; * break; * * case EVENTS.SimStop: * int x = 6; * break; * * case EVENTS.SimStart: * int z = 7; * break; * * * default: * break; * } * * }*/ // for future use /* void SimConnect_OnRecvFilename(SimConnect sender, SIMCONNECT_RECV_EVENT_FILENAME data) * { * switch ((EVENTS)(data.uEventID)) * { * case EVENTS.FlightPlanActivated: * int n = 5; * break; * * default: * break; * } * }*/ // when receiving object data first asked for simenvironment info to get aircraft title one time // once that is received then ask once a second for aircraft info void SimConnect_OnRecvSimobjectData(SimConnect sender, SIMCONNECT_RECV_SIMOBJECT_DATA data) { switch ((DATA_REQUESTS)data.dwRequestID) { case DATA_REQUESTS.DataRequest: flightDataHandler.Invoke(FlightData((SimPlaneDataStructure)data.dwData[0])); break; case DATA_REQUESTS.SimEnvironmentReq: environmentDataHandler.Invoke(EnvironmentData((SimEnvironmentDataStructure)data.dwData[0])); break; default: break; } }
void finishFlight(SIMCONNECT_RECV_SIMOBJECT_DATA data) { fuelStruct fuel = (fuelStruct)data.dwData[0]; String parameters = currentFlight.getUrlParameters(); parameters += String.Format("&lat={0:f}&lon={1:f}", currentAircraft.latestInfo.lat, currentAircraft.latestInfo.lon); parameters += "&" + fuel.getUrlParameters(); using (SubmitForm dialog = new SubmitForm(parameters)) { dialog.ShowDialog(); } disposeFlight(); updateFunction(); currentAircraft.invalidatePosition(); }
private void Simconnect_OnRecvSimobjectData(SimConnect sender, SIMCONNECT_RECV_SIMOBJECT_DATA data) { // Must be general SimObject information switch (data.dwRequestID) { case (uint)DATA_REQUESTS.AIRCRAFT_POSITION: { var position = data.dwData[0] as AircraftPositionStruct?; if (position.HasValue) { ProcessAircraftPosition(position.Value); } } break; } }
void simconnect_OnRecvSimobjectData(SimConnect sender, SIMCONNECT_RECV_SIMOBJECT_DATA data) { switch ((DEFINITIONS)data.dwRequestID) { case DEFINITIONS.SimData: try { handleSimData((SimData)data.dwData[0]); } catch (Exception e) { Console.WriteLine(e.ToString()); } break; } }
void sc_OnRecvSimobjectData(SimConnect sender, SIMCONNECT_RECV_SIMOBJECT_DATA data) { UserPosition pos = (UserPosition)data.dwData; if (!Objects.ContainsKey(data.dwObjectID)) { Objects.Add(data.dwObjectID, pos); lstViewer.Items.Add(pos.ListItem); } pos.ListItem.SubItems[colheaderLatitude.Index].Text = pos.LatitudeDegrees.ToString(); pos.ListItem.SubItems[colheaderLongitude.Index].Text = pos.LongitudeDegrees.ToString(); pos.ListItem.SubItems[colheaderAltitude.Index].Text = pos.AltitudeFeet.ToString(); pos.ListItem.SubItems[colheaderPitch.Index].Text = pos.PitchDegrees.ToString(); pos.ListItem.SubItems[colheaderBank.Index].Text = pos.BankDegrees.ToString(); pos.ListItem.SubItems[colheaderHeading.Index].Text = pos.HeadingDegrees.ToString(); }
private void OnRecvSimobjectData(SimConnect sender, SIMCONNECT_RECV_SIMOBJECT_DATA data) { try { Donnees = (DonneesAvion)data.dwData[0]; } catch (Exception e) { Console.WriteLine("OnRecvSimobjectData a échoué :" + e.Message); } }
void sc_OnRecvSimobjectData(SimConnect sender, SIMCONNECT_RECV_SIMOBJECT_DATA data) { if (data.dwRequestID == (uint)Requests.PlanePosition) { PlanePosition.Struct pos = (PlanePosition.Struct)data.dwData[0]; if (UseMagneticHeading) pos.heading = pos.magheading; SimPosition = new PlanePosition(pos); byte[] packet = P3DHIL.ExtensionMethods.StructExtensionMethods.StructureToByteArray(pos); _udpSend.SendAsync(packet, packet.Length, "127.0.0.1", 49005).ContinueWith((x) => { Console.WriteLine("UDP Send [{0}|{1}] {2}", x.Result, packet.Length, x.Exception.Message); }, TaskContinuationOptions.NotOnRanToCompletion); NotifyOfPropertyChange(() => SimPosition); } else if (data.dwRequestID == (uint)Requests.SurfacesPosition) { SurfacesPosition.Struct pos = (SurfacesPosition.Struct)data.dwData[0]; SimControl = new SurfacesPosition(pos); NotifyOfPropertyChange(() => SimControl); } else { Console.WriteLine("Unknown"); } }
void simconnect_OnRecvSimobjectData(SimConnect sender, SIMCONNECT_RECV_SIMOBJECT_DATA data) { if(data.dwRequestID >= (uint)SIMCONNECT_EVENTS.EVENTID_POSITIONREPORT_FOR_AIUPDATE) HandleAIPositionReport(data.dwObjectID, (AIPositionReportStruct)data.dwData[0]); else { switch ((SIMCONNECT_EVENTS)data.dwRequestID) { case SIMCONNECT_EVENTS.EVENTID_POSITIONREPORT: var posreport = (PositionReportStruct)data.dwData[0]; var positionReportMsg = new PositionReportMessage() { TrueAltitude = posreport.truealtitude, PressureAltitude = posreport.pressurealtitude, Longitude = posreport.longitude, Latitude = posreport.latitude, Groundspeed = posreport.groundspeed, Pitch = -posreport.pitch, Bank = -posreport.bank, Heading = posreport.heading, }; broker.Publish(positionReportMsg); break; } } }
void simconnect_OnRecvSimobjectData(SimConnect sender, SIMCONNECT_RECV_SIMOBJECT_DATA data) { Struct1 s1 = (Struct1)data.dwData[0]; // calculate timestep, there is no good way to get a timestamp from the sim // jitter will add noise to the calculated accelerations, but it should average out int ticks = Environment.TickCount; rxIntervalSmoothed = (0.001 * (ticks - lastTicks) + 9 * rxIntervalSmoothed) / 10; // convert to seconds and apply some smoothing lastTicks = ticks; // display the frequency of data reception int rxFrequency = (int)(1 / rxIntervalSmoothed); labelRxFreq.Text = rxFrequency.ToString(); //build a rotation matrix with the given roll, pitch, heading, using aircraft axis convention (x = roll axis, y = pitch axis, z = yaw axis) double[] dcm = new double[9]; double Sp = Math.Sin(s1.pitch * degToRad); double Cp = Math.Cos(s1.pitch * degToRad); double Sr = Math.Sin(s1.roll * degToRad); double Cr = Math.Cos(s1.roll * degToRad); double Sy = Math.Sin(s1.headingTrue * degToRad); double Cy = Math.Cos(s1.headingTrue * degToRad); dcm[0] = Cp * Cy; dcm[1] = Sr * Sp * Cy - Cr * Sy; dcm[2] = Cr * Sp * Cy + Sr * Sy; dcm[3] = Cp * Sy; dcm[4] = Sr * Sp * Sy + Cr * Cy; dcm[5] = Cr * Sp * Sy - Sr * Cy; dcm[6] = -Sp; dcm[7] = Sr * Cp; dcm[8] = Cr * Cp; // differentiate world speeds to get accels, then add gravity and rotate to body frame // fsx uses X as left/right, Y as up/down, Z as fore/aft; here we convert to aircraft convention // accelerations are positive in AFT LEFT DOWN direction double vxe = s1.vz; double vye = s1.vx; double vze = s1.vy; // if deltaT is 0, just use gravity double axe = rxIntervalSmoothed > 0 ? (vxe - vxeOld) / rxIntervalSmoothed : 0; double aye = rxIntervalSmoothed > 0 ? (vye - vyeOld) / rxIntervalSmoothed : 0; double aze = rxIntervalSmoothed > 0 ? (vze - vzeOld) / rxIntervalSmoothed + 9.81 : 9.81; vxeOld = vxe; vyeOld = vye; vzeOld = vze; // multiply earth frame accelerations by rotation matrix to get body frame accelerations double axb = axe * dcm[0] + aye * dcm[3] + aze * dcm[6]; double ayb = axe * dcm[1] + aye * dcm[4] + aze * dcm[7]; double azb = axe * dcm[2] + aye * dcm[5] + aze * dcm[8]; // ***** Code for modelling gyro errors ********* // calculate StdDev required to give the user-specified bias instability (rads/min) at the current sample rate // the bias instability is the 1sd error in angle after one minute of integration // biasinstability = sigma*sqrt(n) int samplesPerMinute = 60 * rxFrequency; double sigma = gyroBiasDrift / Math.Sqrt(samplesPerMinute); sigma /= 60; // convert to rads/sec // integrate noise to make the bias follow a random walk calculatedGyroBiasX += gaussianRandom(sigma); calculatedGyroBiasY += gaussianRandom(sigma); calculatedGyroBiasZ += gaussianRandom(sigma); // constrain them within limits constrainDouble(ref calculatedGyroBiasX, -gyroBiasLimit, gyroBiasLimit); constrainDouble(ref calculatedGyroBiasY, -gyroBiasLimit, gyroBiasLimit); constrainDouble(ref calculatedGyroBiasZ, -gyroBiasLimit, gyroBiasLimit); // add bias drift plus white noise s1.omegaX += (float)(gaussianRandom(gyroNoise) + calculatedGyroBiasX); s1.omegaY += (float)(gaussianRandom(gyroNoise) + calculatedGyroBiasY); s1.omegaZ += (float)(gaussianRandom(gyroNoise) + calculatedGyroBiasZ); // display the "gyro" readings and calculated accelerations labelOmegaX.Text = s1.omegaX.ToString(); labelOmegaY.Text = s1.omegaY.ToString(); labelOmegaZ.Text = s1.omegaZ.ToString(); labelAX.Text = axb.ToString(); labelAY.Text = ayb.ToString(); labelAZ.Text = azb.ToString(); // Convert to binary format, using x-plane UDP protocol // x-plane data is in 36 byte blocks with an index and 32 bytes of data (usually as floats) // gyro rates and accelerations are sent with index 255 // BitConverter class is used to get a byte[4] array for each float. This is then copied to the main byte[] // some things are reversed to meet android conventions byte[] simData = new byte[201]; simData[0] = 70; simData[1] = 83; simData[2] = 88; simData[3] = 33; // "FSX!" header simData[4] = 0; //not used simData[5] = 20; simData[6] = 0; simData[7] = 0; simData[8] = 0; // index for lat/lon/alt as int32 BitConverter.GetBytes(s1.latitude).CopyTo(simData, 9); BitConverter.GetBytes(s1.longitude).CopyTo(simData, 13); BitConverter.GetBytes(s1.trueAltitude / 0.3048f).CopyTo(simData, 17); //convert to feet for x-plane compatability simData[41] = 3; simData[42] = 0; simData[43] = 0; simData[44] = 0; //index for speeds BitConverter.GetBytes(s1.ias / 0.5144f).CopyTo(simData, 45); //convert to knots for x-plane compatability BitConverter.GetBytes(s1.groundspeed / 0.5144f).CopyTo(simData, 57); simData[77] = 17; simData[78] = 0; simData[79] = 0; simData[80] = 0; //index for pitch roll heading BitConverter.GetBytes(s1.pitch).CopyTo(simData, 81); BitConverter.GetBytes(-s1.roll).CopyTo(simData, 85); BitConverter.GetBytes(s1.headingTrue).CopyTo(simData, 89); BitConverter.GetBytes(s1.headingMag).CopyTo(simData, 93); simData[113] = 4; simData[114] = 0; simData[115] = 0; simData[116] = 0; //index for processed accels, convert to Gs BitConverter.GetBytes((float)azb / 9.8f).CopyTo(simData, 133); // down BitConverter.GetBytes((float)axb / 9.8f).CopyTo(simData, 137); // aft BitConverter.GetBytes((float)ayb / 9.8f).CopyTo(simData, 141); // left simData[149] = 16; simData[150] = 0; simData[151] = 0; simData[152] = 0; // index for gyro rates BitConverter.GetBytes(-s1.omegaY).CopyTo(simData, 153); // pitch rate BitConverter.GetBytes(-s1.omegaX).CopyTo(simData, 157); // roll rate BitConverter.GetBytes(s1.omegaZ).CopyTo(simData, 161); // yaw rate simData[185] = 18; simData[186] = 0; simData[187] = 0; simData[188] = 0; BitConverter.GetBytes(s1.gpsBearing).CopyTo(simData, 197); // send over the network to the remote host and port specified by user if (TxRxUDP) { byte[] packet = simData; try { udpClient.Send(packet, packet.Length, remoteHost, remotePort); } catch (Exception ex) { displayText(ex.Message); } } }
void simconnect_OnRecvSimobjectData(SimConnect sender, SIMCONNECT_RECV_SIMOBJECT_DATA data) { Console.WriteLine("Got SimobjectData"); switch ((DATA_REQUESTS)data.dwRequestID) { case DATA_REQUESTS.REQUEST_1: Struct1 s1 = (Struct1)data.dwData[0]; Console.WriteLine("Title: " + s1.title); Console.WriteLine("COM1: " + s1.com1freq); Console.WriteLine("COM2: " + s1.com2freq); form1.setFrequencies(s1.com1freq, s1.com1standby, s1.com2freq, s1.com2standby); form1.updateSerialDisplay(); break; default: Console.WriteLine("Unknown request ID: " + data.dwRequestID); break; } }
static void simConnect_OnRecvSimobjectData(SimConnect sender, SIMCONNECT_RECV_SIMOBJECT_DATA data) { Dictionary<string, string> simData = new Dictionary<string, string>(); switch ((DATA_REQUESTS)data.dwRequestID) { case DATA_REQUESTS.DataRequest: DataStructure s1 = (DataStructure)data.dwData[0]; simData.Add("Pitch", s1.pitch.ToString()); simData.Add("Roll", s1.roll.ToString()); simData.Add("XAccel", s1.xAccel.ToString()); simData.Add("YAccel", s1.yAccel.ToString()); simData.Add("ZAccel", s1.zAccel.ToString()); simData.Add("GForce", s1.gforce.ToString()); simData.Add("RPM1", s1.rpm2.ToString()); simData.Add("RPM2", s1.rpm1.ToString()); simData.Add("Surface", s1.surface.ToString()); simData.Add("Crashed", s1.crashed.ToString()); simData.Add("TAS", s1.tas.ToString()); simData.Add("Heading", s1.heading.ToString()); simData.Add("Altitude", s1.altitude.ToString()); break; default: //displayText("Unknown request ID: " + data.dwRequestID); break; } //return simData; }
void simConnect_OnRecvSimobjectData(SimConnect sender, SIMCONNECT_RECV_SIMOBJECT_DATA data) { switch ((DATA_REQUESTS)data.dwRequestID) { case DATA_REQUESTS.DataRequest: DataStructure s1 = (DataStructure)data.dwData[0]; pitch.Text = s1.pitch.ToString(); roll.Text = s1.roll.ToString(); xAccel.Text = s1.xAccel.ToString(); YAccel.Text = s1.yAccel.ToString(); ZAccel.Text = s1.zAccel.ToString(); GForce.Text = s1.gforce.ToString(); rpm1.Text = s1.rpm1.ToString(); rpm2.Text = s1.rpm2.ToString(); altAboveGround.Text = s1.altaboveground.ToString(); surface.Text = s1.surface.ToString(); crashed.Text = s1.crashed.ToString(); tas.Text = s1.tas.ToString(); heading.Text = s1.heading.ToString(); altitude.Text = s1.altitude.ToString(); break; default: DisplayText("Unknown request ID: " + data.dwRequestID); break; } }
private void simconnect_OnRecvSimobjectData(SimConnect sender, SIMCONNECT_RECV_SIMOBJECT_DATA data) { switch ((DATA_REQUESTS)data.dwRequestID) { case DATA_REQUESTS.REQUEST_1: Struct1 s1 = (Struct1)data.dwData[0]; Airspeed = s1.indicatedAirspeed; break; default: //Console.WriteLine("Unknown request ID: " + data.dwRequestID); break; } }