示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        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}'! ]");
                    }
                }
            }
        }