예제 #1
0
        internal void AddLap(LapRecording li)
        {
            lapStore.Add(1, li);

            lastMotion    = li.lapMotion.Last().carMotion;
            lastTelemetry = li.lapTelemetry.Last().carTelemetry;
        }
예제 #2
0
 public void CheckMyApex(uint frame, CarMotionData data)
 {
     lock (locker)
     {
         lastCarMotionData = data;
         lastMotionFrame = frame;
         CheckMyApex();
     }
 }
예제 #3
0
 internal void AddMotionData(int lapNumber, PacketHeader context, CarMotionData carMotionData)
 {
     if (currentLapIndex == lapNumber)
     {
         GetLap(lapNumber).lapMotion.Add(new MotionInContext()
         {
             context = context, carMotion = carMotionData
         });
     }
 }
예제 #4
0
        public void AddData(LapData lapData, CarMotionData motionData)
        {
            if (lapData.currentLapInvalid == 1 || lapData.lapDistance < 0)
            {
                return;
            }

            // minder dan 5 meter sinds vorig punt
            var samePoints = pointVectors.Where(pv => pv.InPit == (lapData.pitStatus != 0) && 
                                                      lapData.lapDistance - pv.lapDistance < 5 &&  
                                                      lapData.lapDistance - pv.lapDistance > 0);
            if (samePoints.Any())
            {
                return;
                //var nextPoint = samePoints.First();
                //if (samePoints.Count() > 1)
                //{
                //    pointVectors.RemoveAll(pv => lapData.lapDistance != nextPoint.lapDistance &&  
                //                                    pv.InPit == (lapData.pitStatus != 0) &&
                //                                    pv.lapDistance - lapData.lapDistance > 5 &&
                //                                    pv.lapDistance - lapData.lapDistance < 10);
                //}
                //else
                //{
                //    nextPoint.lapDistance = (lapData.lapDistance + nextPoint.lapDistance) / 2;
                //    nextPoint.worldForwardDirX = (ushort)((motionData.worldForwardDirX / 2 + nextPoint.worldForwardDirX) / 2);
                //    nextPoint.worldForwardDirY = (ushort)((motionData.worldForwardDirY / 2 + nextPoint.worldForwardDirY) / 2);
                //    nextPoint.worldForwardDirZ = (ushort)((motionData.worldForwardDirZ / 2 + nextPoint.worldForwardDirZ) / 2);
                //    nextPoint.worldPositionX = (motionData.worldPositionX + nextPoint.worldPositionX) / 2f;
                //    nextPoint.worldPositionY = (motionData.worldPositionY + nextPoint.worldPositionY) / 2f;
                //    nextPoint.worldPositionZ = (motionData.worldPositionZ + nextPoint.worldPositionZ) / 2f;
                //}
            }

            //avg = samePoints.All()
            //    if (pointVectors.Any(pv =>  &&
            //    ((pv.worldPositionX - motionData.worldPositionX) * (pv.worldPositionX - motionData.worldPositionX) +
            //    (pv.worldPositionY - motionData.worldPositionY) * (pv.worldPositionY - motionData.worldPositionY) +
            //    (pv.worldPositionZ - motionData.worldPositionZ) * (pv.worldPositionZ - motionData.worldPositionZ)) < 10))

            else
            {
                pointVectors.Add(new CircuitLocation()
                {
                    InPit = (lapData.pitStatus != 0),
                    worldPositionX = motionData.worldPositionX,
                    worldPositionY = motionData.worldPositionY,
                    worldPositionZ = motionData.worldPositionZ,
                    lapDistance = lapData.lapDistance,
                    surfaceType = 0,
                    worldForwardDirX = motionData.worldForwardDirX,
                    worldForwardDirY = motionData.worldForwardDirY,
                    worldForwardDirZ = motionData.worldForwardDirZ,
                    //worldRightDirX = motionData.worldRightDirX,
                    //worldRightDirY = motionData.worldRightDirY,
                    //worldRightDirZ = motionData.worldRightDirZ
                });
                if (motionData.worldPositionX < minx) minx = motionData.worldPositionX;
                if (motionData.worldPositionX > maxx) maxx = motionData.worldPositionX;
                if (motionData.worldPositionY < miny) miny = motionData.worldPositionY;
                if (motionData.worldPositionY > maxy) maxy = motionData.worldPositionY;
                if (motionData.worldPositionZ < minz) minz = motionData.worldPositionZ;
                if (motionData.worldPositionZ > maxz) maxz = motionData.worldPositionZ;
                pointVectors = pointVectors.OrderBy(pv => pv.lapDistance).ToList();

            }
        }
예제 #5
0
        internal void AnalyzeApex(LapData lapData, CarTelemetryData carTelemetryData, CarMotionData motionData)
        {
            var nextSpeed = carTelemetryData.speed;
            if ((lastSpeed < 50 || lastSpeed > 230) && (nextSpeed < 50 || nextSpeed > 230))
            {
                // ignore
                Breaking = -1;
                return;
            }
            
           
            lock (Locker)
            {
                var m = motionData;
                var t = carTelemetryData;
                var l = lapData;
                var distance = (int)Math.Round(l.lapDistance, 0);

                if (Breaking == -1 && t.brake > 0 && l.lapDistance > 0)
                {
                    Breaking = l.lapDistance;
                    BreakingSpeed = t.speed;
                    lastCandidate = -1;
                }
                else if (Breaking > 0 && t.speed > 0 && t.brake == 0 && t.throttle > 0.2f)
                {
                    if (lastCandidate == -1)
                    {
                        lastCandidate = l.lapDistance;
                        ApexSpeed = t.speed;
                    }
                }
                
                if (Breaking!=-1 && BreakingSpeed - ApexSpeed > 50 && lastCandidate > 0 && (t.speed - ApexSpeed)> 10)
                {
                    AddApex((int)Math.Round(lastCandidate, 0));
                    Breaking = -1;
                }
            }
            lastSpeed = nextSpeed;
        }