Ejemplo n.º 1
0
 public static async Task CheckOutHamsters() // Method to check out the hamsters from the daycare.
 {
     await Task.Run(() =>
     {
         var dbContext = new DaycareContext();
         dbContext.Cages.ToList().ForEach(c => c.Hamsters.Clear());
         dbContext.ExerciseCages.First().Hamsters.Clear();
         dbContext.Hamsters.ToList().ForEach(h => h.Logs.Add(new Log(Simulator.Date, Activity.Departure)));
         dbContext.Hamsters.ToList().ForEach(h => h.CheckedIn = null);
         dbContext.SaveChanges();
     });
 }
Ejemplo n.º 2
0
        public static async Task FillCages() // Method for filling cages with hamsters. Seperates females from males and putts them in two different queues.
        {
            await Task.Run(() =>
            {
                var dbContext = new DaycareContext();

                var maleHamsterQueue   = new Queue <Hamster>();
                var femaleHamsterQueue = new Queue <Hamster>();

                foreach (var hamster in dbContext.Hamsters)
                {
                    if (hamster.Gender == Gender.Female)
                    {
                        femaleHamsterQueue.Enqueue(hamster);
                    }
                    else if (hamster.Gender == Gender.Male)
                    {
                        maleHamsterQueue.Enqueue(hamster);
                    }
                }
                foreach (var cage in dbContext.Cages)
                {
                    if (maleHamsterQueue.Count > 0)
                    {
                        for (int i = 0; i < 3; i++)
                        {
                            var hamster = maleHamsterQueue.Dequeue();
                            cage.Hamsters.Add(hamster);
                            hamster.Logs.Add(new Log(Simulator.Date, Activity.Arrival));
                            hamster.CheckedIn = Simulator.Date;
                        }
                    }
                    else
                    {
                        for (int i = 0; i < 3; i++)
                        {
                            var hamster = femaleHamsterQueue.Dequeue();
                            cage.Hamsters.Add(hamster);
                            hamster.Logs.Add(new Log(Simulator.Date, Activity.Arrival));
                            hamster.CheckedIn = Simulator.Date;
                        }
                    }
                }
                dbContext.SaveChanges();
                return(true);
            });
        }
Ejemplo n.º 3
0
        public static string TimeBeforeActivity(Hamster hamster, int day, Activity activity)
        {
            var dbContext     = new DaycareContext();
            var timeBefore    = new TimeSpan();
            var exerciseQuery = hamster.Logs.Where(l => l.Activity == activity && l.Date.Day == day).ToList().OrderBy(l => l.Date);

            if (exerciseQuery.Count() == 0)
            {
                var checkInTime = new TimeSpan(7, 0, 0);
                timeBefore = Simulator.Date.TimeOfDay - checkInTime;
            }
            else if (exerciseQuery.Count() > 0)
            {
                var checkInTime = new TimeSpan(7, 0, 0);
                timeBefore = exerciseQuery.First().Date.TimeOfDay - checkInTime;
            }
            return($"{timeBefore.TotalMinutes} min wait");
        }
Ejemplo n.º 4
0
        public static async Task GoToCage() // Method for getting the hamsters back to their cage from Exercise cage.
        {
            await Task.Run(() =>
            {
                var dbContext = new DaycareContext();

                foreach (var cage in dbContext.ExerciseCages)
                {
                    foreach (var hamster in cage.Hamsters)
                    {
                        var freeCage = dbContext.Cages.First(c => c.Hamsters.Count < 3);
                        freeCage.Hamsters.Add(hamster);
                        //hamster.Logs.Add(new Log(Simulator.Date, Activity.InCage));
                        cage.Hamsters.Remove(hamster);
                    }
                }
                dbContext.SaveChanges();
            });
        }
Ejemplo n.º 5
0
        public static async Task Exercise() // Method for getting hamsters from their cage to exercise cage.
                                            // Checks number of times the hamsters has been exercising and picks the hamster who's been exercising least.
        {
            await Task.Run(() =>
            {
                var dbContext = new DaycareContext();

                var query = from Hamster in dbContext.Hamsters.ToList()
                            group Hamster by Hamster into HamsterGroup
                            select new { Hamster = HamsterGroup.Key, ExerciseCount = HamsterGroup.Key.Logs.Where(l => l.Activity == Activity.Exercise).Count() };

                query            = query.ToList().OrderBy(h => h.ExerciseCount);
                var exerciseCage = dbContext.ExerciseCages.First();
                Gender gender    = Gender.Unspecified;
                int counter      = 0;

                foreach (var group in query)
                {
                    if (counter == 0)
                    {
                        gender = group.Hamster.Gender;
                    }
                    if (group.Hamster.Gender == gender && counter < 6)
                    {
                        foreach (var cage in dbContext.Cages)
                        {
                            foreach (var hamster in dbContext.Hamsters)
                            {
                                if (hamster == group.Hamster)
                                {
                                    cage.Hamsters.Remove(hamster);
                                }
                            }
                        }
                        exerciseCage.Hamsters.Add(group.Hamster);
                        counter++;
                    }
                }
                dbContext.SaveChanges();
            });
        }
Ejemplo n.º 6
0
 private async Task LogTickActivity() // Logs hamsters on every tick.
 {
     await Task.Run(() =>
     {
         var dbContext = new DaycareContext();
         foreach (var cage in dbContext.Cages)
         {
             foreach (var hamster in cage.Hamsters)
             {
                 hamster.Logs.Add(new Log(Date, Activity.InCage));
             }
         }
         foreach (var cage in dbContext.ExerciseCages)
         {
             foreach (var hamster in cage.Hamsters)
             {
                 hamster.Logs.Add(new Log(Date, Activity.Exercise));
             }
         }
         dbContext.SaveChanges();
     });
 }
Ejemplo n.º 7
0
        private static void Print() // A method that prints all info from the database log.
        {
            _printerActive = true;
            var dbContext = new DaycareContext();
            var nowDate   = DateTime.Now;
            var dateTime  = new DateTime(nowDate.Year, nowDate.Month, nowDate.Day, 7, 0, 0);
            var tickCount = 0;

            while (true)
            {
                while (_printerActive)
                {
                    Thread.Sleep(_printSpeed);
                    var getLogs = dbContext.Logs.Where(l => l.TimeStamp == dateTime).OrderBy(h => h.Hamster.Name).ThenBy(h => h.Activity).ToList();
                    if (getLogs.Count() == 60 && tickCount == 0)
                    {
                        Console.WriteLine($"Tick: {tickCount++}".PadRight(15) + $"{dateTime}");
                        Console.WriteLine();
                        Console.WriteLine($"Name".PadRight(15) + $"Age".PadRight(15) + $"Activity".PadRight(15) + $"Time waiting for exercise (min)".PadRight(35) + $"Exercised number of times");
                        Console.WriteLine();
                        var count = 2;
                        foreach (var log in getLogs)
                        {
                            if (count % 2 == 0)
                            {
                                int numberOftimesExercised = log.Hamster.Logs.Where(l => l.Activity == Activity.Exercise && l.TimeStamp >= dateTime.Date).Count() / 10;
                                var minutes = TimeWaitingForExercise(log.Hamster, dateTime);
                                Console.WriteLine($"{log.Hamster.Name}".PadRight(15) + $"{log.Hamster.Age}".PadRight(15) + $"{log.Activity}".PadRight(15) + $"{minutes}".PadRight(35) + $"{numberOftimesExercised}");
                            }
                            else
                            {
                                Console.WriteLine($"".PadRight(30) + $"{log.Activity}");
                            }
                            count++;
                        }
                        if (dateTime.Hour == 17)
                        {
                            dateTime  = dateTime.AddHours(14);
                            tickCount = 0;
                        }
                        else
                        {
                            dateTime = dateTime.AddMinutes(6);
                        }
                        Console.WriteLine();
                    }
                    else if (getLogs.Count() > 1 && tickCount > 0)
                    {
                        Console.WriteLine($"Tick: {tickCount++}".PadRight(15) + $"{dateTime}");
                        Console.WriteLine();
                        Console.WriteLine($"Name".PadRight(15) + $"Age".PadRight(15) + $"Gender".PadRight(15) + $"Activity".PadRight(15) + $"Time waiting for exercise (min)".PadRight(35) + $"Exercised number of times");
                        Console.WriteLine();

                        foreach (var log in getLogs)
                        {
                            int numberOftimesExercised = log.Hamster.Logs.Where(l => l.Activity == Activity.Exercise && l.TimeStamp >= dateTime.Date).Count() / 10;
                            var minutes = TimeWaitingForExercise(log.Hamster, dateTime);
                            Console.WriteLine($"{log.Hamster.Name}".PadRight(15) + $"{log.Hamster.Age}".PadRight(15) + $"{log.Hamster.Gender}".PadRight(15) + $"{log.Activity}".PadRight(15) + $"{minutes}".PadRight(35) + $"{numberOftimesExercised}");
                        }
                        if (dateTime.Hour == 17)
                        {
                            dateTime  = dateTime.AddHours(14);
                            tickCount = 0;
                        }
                        else
                        {
                            dateTime = dateTime.AddMinutes(6);
                        }
                        Console.WriteLine();
                    }
                }
            }
        }
Ejemplo n.º 8
0
        // Prints out 15 choosen logs and statistics on choosen hamster when program is paused.
        // As well as reading some keys to make the user be able to scroll thru logs and days.
        private static ConsoleKeyInfo PrintLogPause()
        {
            var firstIndex = 0;
            var lastIndex  = 14;

            while (true)
            {
                var cursorTop = 3;
                using (var dbContext = new DaycareContext())
                {
                    CleanConsole(20, 1, 3, 100);
                    var logQuery = dbContext.Hamsters.First(h => h.Id == hamsterIdToShow).Logs.Where(l => l.Date.Day == dayChoosenToPrint).
                                   OrderByDescending(l => l.Id);
                    var logQueryBetween = logQuery.TakeBetween(firstIndex, lastIndex);
                    if (hamsterQueryCount == 1)
                    {
                        Writer.Write($"Day {simPauseDayCount}", 1, 3);
                        foreach (var log in logQueryBetween)
                        {
                            var hamster = log.Hamster;

                            var logText = "";
                            if (log.Activity == Activity.Leaving)
                            {
                                logText = $"{log.Activity} {log.Location} {log.Date.TimeOfDay}";
                            }
                            if (log.Activity == Activity.Arriving)
                            {
                                logText = $"{log.Activity} at {log.Location} {log.Date.TimeOfDay}";
                            }
                            else
                            {
                                logText   = log.Activity == Activity.Moving
                                ? logText = $"{log.Activity} to {log.Location} {log.Date.TimeOfDay}"
                                : $"{log.Activity} in {log.Location} {log.Date.TimeOfDay}";
                            }
                            var timebeforeExercise  = Statistics.TimeBeforeActivity(hamster, dayChoosenToPrint, Activity.Exercising);
                            var timesExercised      = Statistics.TimesActivity(hamster, dayChoosenToPrint, Activity.Exercising);
                            var timeSpentExercising = Statistics.TimeActivity(hamster, dayChoosenToPrint, Activity.Exercising);
                            var timeSpentSleeping   = Statistics.TimeActivity(hamster, dayChoosenToPrint, Activity.Sleeping);
                            var timeSpentPlaying    = Statistics.TimeActivity(hamster, dayChoosenToPrint, Activity.Playing);
                            var timeSpentEating     = Statistics.TimeActivity(hamster, dayChoosenToPrint, Activity.Eating);
                            CleanConsole(1, 19, cursorTop, 80);
                            Writer.Write(logText, 19, cursorTop++);
                            Writer.Write("Exercising", 1, 5);
                            Writer.Write(timebeforeExercise, 1, 6);
                            Writer.Write(timeSpentExercising, 1, 7);
                            Writer.Write(timesExercised, 1, 8);
                            Writer.Write("Sleeping", 1, 10);
                            Writer.Write(timeSpentSleeping, 1, 11);
                            Writer.Write("Playing", 1, 13);
                            Writer.Write(timeSpentPlaying, 1, 14);
                            Writer.Write("Eating", 1, 16);
                            Writer.Write(timeSpentEating, 1, 17);
                        }
                        rowsToClear = cursorTop;
                    }
                    var keyInput = Console.ReadKey(true);
                    if (keyInput.Key == ConsoleKey.LeftArrow)
                    {
                        if (dayChoosenToPrint > firstDay)
                        {
                            dayChoosenToPrint--;
                            simPauseDayCount--;
                            firstIndex = 0;
                            lastIndex  = 14;
                        }
                    }
                    if (keyInput.Key == ConsoleKey.RightArrow)
                    {
                        if (dayChoosenToPrint < Simulator.Simulator.Date.Day)
                        {
                            dayChoosenToPrint++;
                            simPauseDayCount++;
                            firstIndex = 0;
                            lastIndex  = 14;
                        }
                    }
                    if (keyInput.Key == ConsoleKey.DownArrow)
                    {
                        if (lastIndex < logQuery.Count() - 1)
                        {
                            firstIndex++;
                            lastIndex++;
                        }
                    }
                    if (keyInput.Key == ConsoleKey.UpArrow)
                    {
                        if (firstIndex > 0)
                        {
                            firstIndex--;
                            lastIndex--;
                        }
                    }
                    if (keyInput.Key == ConsoleKey.F1 || keyInput.Key == ConsoleKey.Backspace)
                    {
                        CleanConsole(20, 1, 3, 100);
                        return(keyInput);
                    }
                    if (keyInput.Key == ConsoleKey.F2 && Program.Simulator.CancelSimulation)
                    {
                        Console.Clear(); return(keyInput);
                    }
                    if (keyInput.Key == ConsoleKey.Escape && Program.Simulator.CancelSimulation)
                    {
                        Console.Clear(); return(keyInput);
                    }
                }
            }
        }
Ejemplo n.º 9
0
        // Prints out the 15 latest logs and statistics on choosen hamster.
        public static void PrintLog()
        {
            Task.Run(() =>
            {
                CleanConsole(20, 0, 3, 100);
                dayChoosenToPrint = printersDay;
                simPauseDayCount  = simRunDayCount;
                while (hamsterQueryCount == 1 && Program.Simulator.IsRunning && !Program.Simulator.CancelSimulation)
                {
                    var cursorTop = 3;
                    using (var dbContext = new DaycareContext())
                    {
                        if (printersDay < Simulator.Simulator.Date.Day)
                        {
                            CleanConsole(20, 0, 3, 100);
                            printersDay       = Simulator.Simulator.Date.Day;
                            dayChoosenToPrint = printersDay;
                            simRunDayCount++;
                            simPauseDayCount = simRunDayCount;
                        }
                        var logQuery = dbContext.Hamsters.First(h => h.Id == hamsterIdToShow).Logs.Where(l => l.Date.Day == printersDay).
                                       OrderByDescending(l => l.Id).Take(15);

                        Writer.Write($"Day {simRunDayCount}", 1, 3);
                        foreach (var log in logQuery)
                        {
                            var hamster = log.Hamster;
                            var logText = "";
                            if (log.Activity == Activity.Leaving)
                            {
                                logText = $"{log.Activity} {log.Location} {log.Date.TimeOfDay}";
                            }
                            if (log.Activity == Activity.Arriving)
                            {
                                logText = $"{log.Activity} at {log.Location} {log.Date.TimeOfDay}";
                            }
                            else
                            {
                                logText   = log.Activity == Activity.Moving
                                ? logText = $"{log.Activity} to {log.Location} {log.Date.TimeOfDay}"
                                : $"{log.Activity} in {log.Location} {log.Date.TimeOfDay}";
                            }
                            if (hamsterQueryCount == 1)
                            {
                                var timebeforeExercise  = Statistics.TimeBeforeActivity(hamster, printersDay, Activity.Exercising);
                                var timesExercised      = Statistics.TimesActivity(hamster, printersDay, Activity.Exercising);
                                var timeSpentExercising = Statistics.TimeActivity(hamster, printersDay, Activity.Exercising);
                                var timeSpentSleeping   = Statistics.TimeActivity(hamster, printersDay, Activity.Sleeping);
                                var timeSpentPlaying    = Statistics.TimeActivity(hamster, printersDay, Activity.Playing);
                                var timeSpentEating     = Statistics.TimeActivity(hamster, printersDay, Activity.Eating);
                                CleanConsole(1, 19, cursorTop, 100);
                                Writer.Write(logText, 19, cursorTop++);
                                Writer.Write("Exercising", 1, 5);
                                Writer.Write(timebeforeExercise, 1, 6);
                                Writer.Write(timeSpentExercising, 1, 7);
                                Writer.Write(timesExercised, 1, 8);
                                Writer.Write("Sleeping", 1, 10);
                                Writer.Write(timeSpentSleeping, 1, 11);
                                Writer.Write("Playing", 1, 13);
                                Writer.Write(timeSpentPlaying, 1, 14);
                                Writer.Write("Eating", 1, 16);
                                Writer.Write(timeSpentEating, 1, 17);
                            }
                        }
                        rowsToClear = logQuery.Count();
                    }
                }
            });
        }
Ejemplo n.º 10
0
        // Method that uses a stringbuilder in combination with reading console.readkey() key-presses.
        // And navigate the graphical interface based on the input.
        internal static bool Input()
        {
            hamsterIdToShow   = 1;
            simPauseDayCount  = 1;
            simRunDayCount    = 1;
            firstDay          = Simulator.Simulator.Date.Day;
            printersDay       = Simulator.Simulator.Date.Day;
            dayChoosenToPrint = Simulator.Simulator.Date.Day;
            var  inputBuilder       = new StringBuilder();
            int  rowCounter         = 0;
            var  keyInput           = new ConsoleKeyInfo();
            bool returnedFromScroll = false;

            while (true)
            {
                using (var dbContext = new DaycareContext())
                {
                    if (rowsToClear > 0)
                    {
                        CleanConsole(rowsToClear, 0, 2, 80);
                        rowsToClear = 0;
                    }
                    else
                    {
                        CleanConsole(1, 0, 2, 80);
                    }
                    Writer.Write(inputBuilder.ToString().CapitalFirst(), 1, 2);
                    int cursorTop = 3;
                    CleanConsole(rowCounter, 1, 3, 80);
                    rowCounter = 0;
                    // Printing hamster names or the information/logs on a specific hamster
                    // Depending on if the input finds more then one hamster in the databas.
                    if (inputBuilder.Length > 0)
                    {
                        var hamsterQuery = dbContext.Hamsters
                                           .Where(h => h.Name.StartsWith(inputBuilder.ToString()))
                                           .OrderBy(h => h.Name);
                        hamsterQueryCount = hamsterQuery.Count();
                        Thread.Sleep(10);
                        cursorTop = 3;
                        CleanConsole(20, 1, 3, 80);
                        foreach (var hamster in hamsterQuery)
                        {
                            rowCounter++;
                            Writer.Write(hamster.Name, 1, cursorTop++);
                        }
                        if (hamsterQueryCount == 1)
                        {
                            var hamster = hamsterQuery.First();
                            Writer.Write(hamster.Name, 1, 2, ConsoleColor.DarkGray);
                            if (hamster.Logs.Count > 0)
                            {
                                hamsterIdToShow = hamster.Id;
                                if (Program.Simulator.IsRunning)
                                {
                                    PrintLog();
                                }
                                else if (!Program.Simulator.IsRunning)
                                {
                                    keyInput           = PrintLogPause();
                                    returnedFromScroll = true;
                                }
                            }
                        }
                    }
                    if (inputBuilder.Length == 0)
                    {
                        hamsterQueryCount = 0;
                        Thread.Sleep(10);
                        cursorTop = 3;
                        foreach (var hamster in dbContext.Hamsters.OrderBy(h => h.Name))
                        {
                            rowCounter++;
                            if (rowCounter == dbContext.Hamsters.Count() / 2 + 1)
                            {
                                cursorTop = 3;
                            }
                            if (rowCounter > dbContext.Hamsters.Count() / 2)
                            {
                                CleanConsole(1, 20, cursorTop, 65);
                                Writer.Write(hamster.Name, 25, cursorTop++);
                            }
                            else
                            {
                                CleanConsole(1, 1, cursorTop, 80);
                                Writer.Write(hamster.Name, 1, cursorTop++);
                            }
                        }
                    }
                    if (!returnedFromScroll)
                    {
                        keyInput = Console.ReadKey(true);
                    }
                    returnedFromScroll = false;
                    if (keyInput.Key == ConsoleKey.PageUp && Program.Simulator.timeInterval > 1)
                    {
                        Program.Simulator.timeInterval--;
                    }
                    if (keyInput.Key == ConsoleKey.PageDown)
                    {
                        Program.Simulator.timeInterval++;
                    }
                    if (keyInput.Key == ConsoleKey.Escape && Program.Simulator.CancelSimulation)
                    {
                        Console.Clear(); return(false);
                    }
                    if (keyInput.Key == ConsoleKey.Escape)
                    {
                        SimulationCancelled(null, new TickEventArgs(Program.Simulator.TickCounter));
                    }
                    if (keyInput.Key == ConsoleKey.F1 && !Program.Simulator.CancelSimulation)
                    {
                        Program.Simulator.Pause();
                    }
                    if (keyInput.Key == ConsoleKey.F2 && Program.Simulator.CancelSimulation)
                    {
                        Console.Clear(); return(true);
                    }
                    if (keyInput.Key == ConsoleKey.Backspace && inputBuilder.Length > 0)
                    {
                        inputBuilder.Remove((inputBuilder.Length - 1), 1);
                    }
                    if (char.IsLetter(keyInput.KeyChar) && hamsterQueryCount != 1)
                    {
                        if (dbContext.Hamsters.Where(c => c.Name.StartsWith(inputBuilder + keyInput.KeyChar.ToString())).Any())
                        {
                            inputBuilder.Append(keyInput.KeyChar);
                        }
                    }
                }
            }
        }