/* Redraws the UI using the passed PowertrainEventArgs object */ private void DrawPowertrainUpdate(PowertrainEventArgs args) { Image imgSpeedRPMPanel = Properties.Resources.speed_rpm_panel; List <Bitmap> imgSpeedText = new List <Bitmap>(); string strSpeedText = ((int)args.kmh).ToString(); if (strSpeedText.Length > 3) { strSpeedText = "999"; } int width = imgSpeedRPMPanel.Width; int height = imgSpeedRPMPanel.Height; int maxRpm = data.GetMaxRPM(); Image drawPanelTo = new Bitmap(width, height); Graphics gPanel = Graphics.FromImage(drawPanelTo); gPanel.FillRectangle(new SolidBrush(Color.OrangeRed), 1.0f, 1.0f, 27.0f * ((float)args.rpm / (float)maxRpm), 5.0f); gPanel.DrawImage(imgSpeedRPMPanel, new Rectangle(0, 0, width, height)); for (int i = 0; i < strSpeedText.Length; ++i) { gPanel.DrawImage(TEXT_BITMAPS[strSpeedText[i] - '0'], new Rectangle((i + 1) * 6, 6, 5, 5)); } gPanel.Flush(); gPanel.Dispose(); picSpeedRPM.Image = drawPanelTo; imgSpeedRPMPanel.Dispose(); }
/* 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); } }
/* 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 powertrain information from the game */ private void OnGotPowertrain(object sender, PowertrainEventArgs args) { this.BeginInvoke(new DrawPowertrainUpdateDelegate(DrawPowertrainUpdate), args); }
/* Event raisers */ private void RaisePowertrainReceived(PowertrainEventArgs args) { PowertrainReceivedEvent?.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; } }