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(); }); }
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); }); }
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"); }
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(); }); }
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(); }); }
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(); }); }
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(); } } } }
// 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); } } } }
// 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(); } } }); }
// 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); } } } } }