using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; using Xamarin.Forms; namespace budzik { public partial class MainPage : ContentPage { public MainPage() { InitializeComponent(); // start timera Device.StartTimer(TimeSpan.FromSeconds(1), OnTimerTick); // ustawiamy bieżącą datę dayNow = DateTime.Now.ToString("dd"); monthNow = DateTime.Now.ToString("MM"); yearNow = DateTime.Now.ToString("yyyy"); // pobieramy bieżący czas hourNow = DateTime.Now.ToString("HH"); minuteNow = DateTime.Now.ToString("mm"); secondNow = DateTime.Now.ToString("ss"); // wstępnie ustawiamy czas na bieżący hourSet = Int32.Parse(hourNow); minuteSet = Int32.Parse(minuteNow); secondSet = Int32.Parse(secondNow); } // zmienne pomocnicze do sprawdzania czasu i daty bool isTimeEqual = false; bool isDateEqual = false; // zmienne do wyświetlania bieżącego ustawionego czasu oraz ich różnicy DateTime dateSet; DateTime dateNow; // różnica czasu bieżąca i nastawiona TimeSpan timeSpan; // różnica czasu bieżąca i nastawiona potrzebna do skonfigurowania progressBar uint timeSpanProgressBar; // flaga ustawienia timeSpanProgressBar bool IsTimeSpanProgressBarSet = false; // zmienne czasu i daty (bieżącej i ustawionej) private int hourSet = 0; private int minuteSet = 0; private int secondSet = 0; private string hourNow = "0"; private string minuteNow = "0"; private string secondNow = "0"; private string daySet = "0"; private string monthSet = "0"; private string yearSet = "0"; private string dayNow = "0"; private string monthNow = "0"; private string yearNow = "0"; // flaga ustawienia daty bool isDatePickerChanged = false; // flaga uruchomienia steppera bool isStepperChanged = false; // flaga uruchomienia alertu (budzik zadzwonił) bool isAlertRaised = false; // metoda uruchamiana przez timer co 1s private bool OnTimerTick() { // pobieramy bieżący czas hourNow = DateTime.Now.ToString("HH"); minuteNow = DateTime.Now.ToString("mm"); secondNow = DateTime.Now.ToString("ss"); // jeśli nie jest ustwaiona data bierzemy datę bieżącą if (!isDatePickerChanged) { daySet = dayNow; monthSet = monthNow; yearSet = yearNow; } // sprawdzenie daty i czasu budzika isTimeEqual = (Int32.Parse(hourNow) == hourSet && Int32.Parse(minuteNow) == minuteSet && Int32.Parse(secondNow) == secondSet); isDateEqual = (dayNow == daySet && monthNow == monthSet && yearNow == yearSet); // trigerowanie alarmu if (isTimeEqual && isDateEqual && switchSet.IsToggled && (isDatePickerChanged || isStepperChanged)) { DisplayAlert("Budzik", "Dzwonię!", "OK"); // ustawiamy flagę uruchomienia alertu isAlertRaised = true; // reset budzika reset(); } //var dateSet = new DateTime(2008, 5, 1, 8, 30, 52); // rok, miesiąc, dzień, godzina, minuta i sekunda. dateSet = new DateTime(2022, Int32.Parse(monthSet), Int32.Parse(daySet), hourSet, minuteSet, secondSet); dateNow = new DateTime(2022, Int32.Parse(monthNow), Int32.Parse(dayNow), Int32.Parse(hourNow), Int32.Parse(minuteNow), Int32.Parse(secondNow)); labelDataSet.Text = dateSet.ToString() + " data ustawiona"; labelDataCurrent.Text = dateNow.ToString() + " data bierząca"; // obliczamy różnice czasu bieżącą i nastawioną timeSpan = dateSet - dateNow; // ustawiamy timeSpanProgressBar // jeśli IsTimeSpanProgressBarSet nie jest ustwiona // (np.zmieniło się ustawienie czasu budzika) if (!IsTimeSpanProgressBarSet && switchSet.IsToggled) { timeSpanProgressBar = (uint)timeSpan.TotalMilliseconds; IsTimeSpanProgressBarSet = true; // uruchom progressbar runProgressBar(1,timeSpanProgressBar); } // wyswietlamy różnice czasu labelTimeSpan.Text = timeSpan.ToString() + " czas do startu budzika"; if (switchSet.IsToggled && !isAlertRaised) { // wyświetlenie sekund do startu alarmu labelTimeSpanSeconds.Text = timeSpan.TotalSeconds.ToString(); } else { labelTimeSpanSeconds.Text = "alarm wyłaczony"; } return true; } private void reset() { daySet = dayNow; monthSet = monthNow; yearSet = yearNow; // ustawiamy czas na bierzący hourSet = Int32.Parse(hourNow); minuteSet = Int32.Parse(minuteNow); secondSet = Int32.Parse(secondNow); isDatePickerChanged = false; isStepperChanged = false; IsTimeSpanProgressBarSet = false; // reset nie działa // runProgressBar(0, 0); } // ustawianie godzin private void stepperHour_ValueChanged(object sender, ValueChangedEventArgs e) { hourSet = (int)e.NewValue; labelStepperHour.Text = hourSet.ToString(); // zmienił się czas budzika, dlatego musimy jezszcze raz ustawić czas progressBar IsTimeSpanProgressBarSet = false; // ustawiamy flagę zmiany ustawianego czasu isStepperChanged = true; } // ustawianie minut private void stepperMinute_ValueChanged(object sender, ValueChangedEventArgs e) { minuteSet = (int)e.NewValue; labelStepperMinute.Text = minuteSet.ToString(); // zmienił się czas budzika, dlatego musimy jezszcze raz ustawić czas progressBar IsTimeSpanProgressBarSet = false; // ustawiamy flagę zmiany ustawianego czasu isStepperChanged = true; } // ustawianie sekund private void stepperSecond_ValueChanged(object sender, ValueChangedEventArgs e) { secondSet = (int)e.NewValue; labelStepperSecond.Text = secondSet.ToString(); // zmienił się czas budzika, dlatego musimy jezszcze raz ustawić czas progressBar IsTimeSpanProgressBarSet = false; // ustawiamy flagę zmiany ustawianego czasu isStepperChanged = true; } // ustawianie daty private void datePickerSet_DateSelected(object sender, DateChangedEventArgs e) { daySet = datePickerSet.Date.ToString("dd"); monthSet = datePickerSet.Date.ToString("MM"); yearSet = datePickerSet.Date.ToString("yyyy"); // zmienił się czas budzika, dlatego musimy jezszcze raz ustawić czas progressBar IsTimeSpanProgressBarSet = false; // sygnał, ze użytkownik ustawił datę isDatePickerChanged = true; } // uruchomienie progressBar async private void runProgressBar(int progress, uint timeSpanProgress) { await progressBar1.ProgressTo(progress, timeSpanProgress, Easing.Linear); } // włącznik budzika private void switchSet_Toggled(object sender, ToggledEventArgs e) { if (!switchSet.IsToggled) { DisplayAlert("Budzik", "Alarm jest wyłączony!", "OK"); progressBar1.IsVisible = false; } else { DisplayAlert("Budzik", "Alarm jest uaktywniony!", "OK"); progressBar1.IsVisible = true; // resetujemy flagę uruchomionego alarmu isAlertRaised = false; } } } }