/* Runs when triggered by an ACReader object */ private void OnPacketReceived(object sender, ACReceivedEventArgs args) { PacketID id = args.id; if (id == PacketID.RESPONSE) { responseMtx.WaitOne(); responsePacket = (HandshakeResponse)args.packet; responseMtx.ReleaseMutex(); dataMtx.WaitOne(); maxRpm = 0; dataMtx.ReleaseMutex(); } else if (id == PacketID.UPDATE) { RTCarInfo packet = (RTCarInfo)args.packet; dataMtx.WaitOne(); if (packet.engineRPM > maxRpm) { maxRpm = (int)packet.engineRPM; } dataMtx.ReleaseMutex(); PositionEventArgs newPos = new PositionEventArgs(); newPos.x = packet.carCoordinates[0]; newPos.y = packet.carCoordinates[1]; newPos.z = packet.carCoordinates[2]; GForceEventArgs newGs = new GForceEventArgs(); newGs.lat = packet.accG_horizontal; newGs.lon = packet.accG_frontal; PowertrainEventArgs newPow = new PowertrainEventArgs(); newPow.rpm = (int)packet.engineRPM; newPow.kmh = packet.speed_Kmh; newPow.mph = packet.speed_Mph; AxesEventArgs newAxes = new AxesEventArgs(); newAxes.throttle = packet.gas; newAxes.brake = packet.brake; newAxes.clutch = 1.0f - packet.clutch; newAxes.steering = packet.steer; RaisePositionReceived(newPos); RaiseGForceReceived(newGs); RaisePowertrainReceived(newPow); RaiseAxesReceived(newAxes); } }
/* Redraws the UI using the passed AxesEventArgs object */ private void DrawAxesUpdate(AxesEventArgs args) { Image imgWheelComponents = Properties.Resources.steering_wheel_components; Image imgWheel = Properties.Resources.steering_wheel; int width = imgWheelComponents.Width; int height = imgWheelComponents.Height; Image drawWheelTo = new Bitmap(width, height); Graphics gWheel = Graphics.FromImage(drawWheelTo); gWheel.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; gWheel.DrawImage(imgWheelComponents, new Rectangle(0, 0, width, height)); gWheel.TranslateTransform(width / 2, height / 2); gWheel.RotateTransform(args.steering * maxDirRotation); gWheel.TranslateTransform(-1 * width / 2, -1 * height / 2); gWheel.DrawImage(imgWheel, new Rectangle(0, 0, width, height)); gWheel.Flush(); gWheel.Dispose(); picSteeringWheel.Image = drawWheelTo; imgWheelComponents.Dispose(); imgWheel.Dispose(); Image imgPedals = Properties.Resources.pedal_set; width = imgPedals.Width; height = imgPedals.Height; Image drawPedalsTo = new Bitmap(width, height); Graphics gPedals = Graphics.FromImage(drawPedalsTo); gPedals.FillRectangle(new SolidBrush(Color.Blue), 0, height - args.clutch * 22, 16, args.clutch * 22); gPedals.FillRectangle(new SolidBrush(Color.Red), 21, height - args.brake * 22, 16, args.brake * 22); gPedals.FillRectangle(new SolidBrush(Color.LawnGreen), 42, height - args.throttle * 28, 18, args.throttle * 28); gPedals.DrawImage(imgPedals, new Rectangle(0, 0, width, height)); gPedals.Flush(); gPedals.Dispose(); picPedals.Image = drawPedalsTo; imgPedals.Dispose(); }
/* Runs when triggered by an F117Reader object */ private void OnPacketReceived(object sender, F117ReceivedEventArgs args) { UDPPacket packet = args.packet; dataMtx.WaitOne(); maxRpm = (int)packet.m_max_rpm; dataMtx.ReleaseMutex(); PositionEventArgs newPos = new PositionEventArgs(); newPos.x = packet.m_x; newPos.y = packet.m_y; newPos.z = packet.m_z; GForceEventArgs newGs = new GForceEventArgs(); newGs.lat = packet.m_gforce_lat; newGs.lon = packet.m_gforce_lon; PowertrainEventArgs newPow = new PowertrainEventArgs(); newPow.rpm = (int)packet.m_engineRate; newPow.kmh = packet.m_speed * 3.6f; newPow.mph = packet.m_speed * 2.23694f; AxesEventArgs newAxes = new AxesEventArgs(); newAxes.throttle = packet.m_throttle; newAxes.brake = packet.m_brake; newAxes.clutch = packet.m_clutch; newAxes.steering = packet.m_steer * -1.0f; RaisePositionReceived(newPos); RaiseGForceReceived(newGs); RaisePowertrainReceived(newPow); RaiseAxesReceived(newAxes); }
/* Runs when the program receives axes information from the game */ private void OnGotAxes(object sender, AxesEventArgs args) { this.BeginInvoke(new DrawAxesUpdateDelegate(DrawAxesUpdate), args); }
private void RaiseAxesReceived(AxesEventArgs args) { AxesReceivedEvent?.Invoke(this, args); }
/* Runs when triggered by an F118Reader object */ private void OnPacketReceived(object sender, F118ReceivedEventArgs args) { PacketID id = args.id; int carIndex = 0; switch (id) { case PacketID.MOTION: PacketMotionData motion = (PacketMotionData)args.packet; carIndex = motion.m_header.m_playerCarIndex; PositionEventArgs newPos = new PositionEventArgs(); newPos.x = motion.m_carMotionData[carIndex].m_worldPositionX; newPos.y = motion.m_carMotionData[carIndex].m_worldPositionY; newPos.z = motion.m_carMotionData[carIndex].m_worldPositionZ; GForceEventArgs newGs = new GForceEventArgs(); newGs.lat = motion.m_carMotionData[carIndex].m_gForceLateral; newGs.lon = motion.m_carMotionData[carIndex].m_gForceLongitudinal; RaisePositionReceived(newPos); RaiseGForceReceived(newGs); break; case PacketID.TELEMETRY: PacketCarTelemetryData telemetry = (PacketCarTelemetryData)args.packet; carIndex = telemetry.m_header.m_playerCarIndex; PowertrainEventArgs newPow = new PowertrainEventArgs(); sbyte gearByte = telemetry.m_carTelemetryData[carIndex].m_gear; if (gearByte == -1) { newPow.gear = 'R'; } else if (gearByte == 0) { newPow.gear = 'N'; } else { newPow.gear = (char)('0' + gearByte); } newPow.rpm = telemetry.m_carTelemetryData[carIndex].m_engineRPM; newPow.kmh = telemetry.m_carTelemetryData[carIndex].m_speed; newPow.mph = telemetry.m_carTelemetryData[carIndex].m_speed * 0.621371f; AxesEventArgs newAxes = new AxesEventArgs(); newAxes.throttle = telemetry.m_carTelemetryData[carIndex].m_throttle / 100.0f; newAxes.brake = telemetry.m_carTelemetryData[carIndex].m_brake / 100.0f; newAxes.clutch = telemetry.m_carTelemetryData[carIndex].m_clutch / 100.0f; newAxes.steering = telemetry.m_carTelemetryData[carIndex].m_steer / 100.0f; RaisePowertrainReceived(newPow); RaiseAxesReceived(newAxes); break; case PacketID.STATUS: PacketCarStatusData status = (PacketCarStatusData)args.packet; dataMtx.WaitOne(); maxRpm = status.m_carStatusData[carIndex].m_maxRPM; dataMtx.ReleaseMutex(); break; default: return; } }