private static Byte?GetRelationship(Android android, SensoryData previousSensoryData) { TimeSpan sinceLastUpdate = DateTime.UtcNow - (previousSensoryData?.TimeStamp ?? DateTime.UtcNow); Int32 maximumDeviation = (Int32)(sinceLastUpdate.TotalMinutes * 0.1); switch (android.RelationshipSensorAccuracy) { case SensorAccuracy.SensorOff: return(null); case SensorAccuracy.HighAccuracySensor: maximumDeviation += 16; break; case SensorAccuracy.MediumAccuracySensor: maximumDeviation += 64; break; case SensorAccuracy.LowAccuracySensor: maximumDeviation += 128; break; } Int32 result = (previousSensoryData?.Relationship ?? _randomGenerator.Next(0, 256)) + _randomGenerator.Next(-maximumDeviation, maximumDeviation); return(result < 0 ? (Byte)0 : result > 255 ? (Byte)255 : (Byte)result); }
private static Int32?GetCrowd(Android android, SensoryData previousSensoryData) { TimeSpan sinceLastUpdate = DateTime.UtcNow - (previousSensoryData?.TimeStamp ?? DateTime.UtcNow); Int32 maximumDeviation = (Int32)(sinceLastUpdate.TotalMinutes * 1); switch (android.CrowdSensorAccuracy) { case SensorAccuracy.SensorOff: return(null); case SensorAccuracy.HighAccuracySensor: maximumDeviation += 100; break; case SensorAccuracy.MediumAccuracySensor: maximumDeviation += 1000; break; case SensorAccuracy.LowAccuracySensor: maximumDeviation += 1000; break; } Int32 result = (previousSensoryData?.Crowd ?? _randomGenerator.Next(0, 1000000)) + _randomGenerator.Next(-maximumDeviation, maximumDeviation); return(result < 0 ? 0 : result > 1000000 ? 1000000 : result); }
private static async Task HandlePendingRequests() { using (HtfDbContext dbContext = new HtfDbContext()) { Console.WriteLine("[ HTF2017 - Getting pending sensory data requests... ]"); List <SensoryDataRequest> dataRequests = await dbContext.SensoryDataRequests .Where(x => !x.Fulfilled).OrderBy(x => x.TimeStamp).ToListAsync(); Console.WriteLine($"[ HTF2017 - {(dataRequests.Count > 0 ? $"{dataRequests.Count}" : "no")} pending sensory data requests found. ]"); foreach (SensoryDataRequest dataRequest in dataRequests) { Android android = await dbContext.Androids.Include(x => x.Team).SingleOrDefaultAsync(x => x.Id == dataRequest.AndroidId); if (android != null) { Location location = await dbContext.Locations.SingleOrDefaultAsync(x => x.Id == android.Team.LocationId); Console.WriteLine($"[ HTF2017 - Processing datarequest for '{android.Team.Name}'. ]"); SensoryData previousCrowdSensoryData = await dbContext.SensoryData .Where(x => x.AndroidId == dataRequest.AndroidId && x.Crowd.HasValue) .OrderByDescending(o => o.TimeStamp).FirstOrDefaultAsync(); SensoryData previousMoodSensoryData = await dbContext.SensoryData .Where(x => x.AndroidId == dataRequest.AndroidId && x.Mood.HasValue) .OrderByDescending(o => o.TimeStamp).FirstOrDefaultAsync(); SensoryData previousRelationshipSensoryData = await dbContext.SensoryData .Where(x => x.AndroidId == dataRequest.AndroidId && x.Relationship.HasValue) .OrderByDescending(o => o.TimeStamp).FirstOrDefaultAsync(); SensoryData data = new SensoryData { AndroidId = dataRequest.AndroidId, // https://www.movable-type.co.uk/scripts/latlong.html Longitude = dataRequest.Location ? location.Longitude : (Double?)null, Lattitude = dataRequest.Location ? location.Lattitude : (Double?)null, Crowd = dataRequest.Crowd ? GetCrowd(android, previousCrowdSensoryData) : null, Mood = dataRequest.Mood ? GetMood(android, previousMoodSensoryData) : null, Relationship = dataRequest.Relationship ? GetRelationship(android, previousRelationshipSensoryData) : null, TimeStamp = DateTime.UtcNow, AutonomousRequested = dataRequest.AutonomousRequest }; await dbContext.SensoryData.AddAsync(data); dataRequest.Fulfilled = true; Boolean isCompromised = IsAndroidCompromised(android.AutoPilot, android.LocationSensorAccuracy, android.CrowdSensorAccuracy, android.MoodSensorAccuracy, android.RelationshipSensorAccuracy); if (isCompromised) { android.Compromised = true; switch (android.AutoPilot) { case AutoPilot.Level1: android.Team.Score -= 10; break; case AutoPilot.Level2: android.Team.Score -= 100; break; case AutoPilot.Level3: android.Team.Score -= 1000; break; } } await dbContext.SaveChangesAsync(); Console.WriteLine($"[ HTF2017 - datarequest for '{android.Team.Name}' processed and fulfilled. ]"); } else { Console.WriteLine($"[ HTF2017 - PANIC - No team found for android '{dataRequest.AndroidId}'! ]"); } } } }