Option Explicit On
Option Strict On

Public Class frmOvenTest
  Inherits System.Windows.Forms.Form
  Private Const BROILTEMP As Integer = 550    ' Temperatura rusztu 
  Private Const CLEANTEMP As Integer = 600    ' Temperatura
                                              ' samooczyszczania

  Dim MyOven As New COven()

  Private Sub btnUpdate_Click(ByVal sender As System.Object, _
          ByVal e As System.EventArgs) Handles btnUpdate.Click
    ' Cel : ten przycisk działa na stan danych piekarnika 
    ' zgodnie z ustawieniem przycisków radiowych 
    ' i ramek tekstowych 

    If CheckSettings() = 0 Then  ' Sprawdzamy, czy wszystko jest we 
                                 ' właściwym stanie    
      Exit Sub
    End If
    If rbOvenOff.Checked = True Then
      txtTemp.Text = "0"
    End If

    UpdateOvenTemperature()

    txtTemp.Text = txtOvenTemp.Text

  End Sub

  Private Sub UpdateOvenTemperature()
    ' Cel: Ta procedura porównuje bieżącą temperaturę piekarnika 
    '      z pożądaną temperaturą i aktualizuje ją. Aby nieco urealnić 
    '      ten proces, zmiany są opóźniane poprzez użycie 
    '      funkcji VBN DateDiff().
    '
    ' Argumenty:
    '  Brak
    '
    ' Zwracana wartość:
    '  Niedostępna 

    Dim Start, Finish As Double
    Dim NewDate As Date
    Dim StartTemp, EndTemp, DiffTemp, Increments, Offset As Integer

    StartTemp = CInt(txtOvenTemp.Text)
    EndTemp = CInt(txtTemp.Text)
    Increments = 5
    Offset = 5
    DiffTemp = EndTemp - StartTemp

    If DiffTemp < 0 Then       '  Jeśli zmniejszamy temperaturę
      DiffTemp = 0 - DiffTemp   ' Ustaw na dodatnie 
      Increments = -5           ' Liczymy raczej w dół niż w górę 
    End If

    While DiffTemp > 0
      NewDate = DateAdd(DateInterval.Second, 1, Now) 
      ' Opóźnienie około  sekundy 
      While DateDiff(DateInterval.Second, Now, NewDate) > 0
        ' Pusta pętla 
      End While
      StartTemp += Increments
      DiffTemp -= Offset
      txtOvenTemp.Text = CStr(StartTemp)
      Me.Update()      ' Aktualizacja formularza
    End While

  End Sub

  Private Function CheckSettings() As Integer
    ' Cel: ta procedura sprawdza, czy 
    '      wszystkie przyciski radiowe są zgodne 
    '      z wykonywanym działaniem 
    '
    ' Argumenty:
    '  Niedostępne
    '
    ' Zwracana wartość:
    '  integer  -1 - jeśli jest w porządku, 0 - w innym przypadku

    ' Czy piekarnik jest włączony?
    If rbOvenOff.Checked = True Then
      txtTemp.Text = "0"
      txtOvenTemp.Text = "0"
      MessageBox.Show("Piekarnik jest wyłączony")
      Return 0
    End If
    ' W czasie pieczenia na ruszcie drzwiczki piekarnika są zwykle otwarte 
    If rbDoorClosed.Checked = True And rbBroil.Checked = True Then
      MessageBox.Show("Prawdopodobnie trzeba otworzyć drzwiczki")
      If txtTemp.Text = "0" Then
        txtTemp.Text = CStr(BROILTEMP)
      End If
      Return 0
    End If

    ' Jeśli pieczesz lub włączyłeś samooczyszczanie, zamknij drzwi 
    If rbDoorClosed.Checked = False And rbBroil.Checked <> True Then
      If rbClean.Checked = False Then
        Beep()
        MessageBox.Show("Pieczenie jest szybsze, jeśli drzwi są" & _  
                        "zamknięte")
        Return 0
      End If
    End If

    ' Pokaż temperaturę
    If rbDoorClosed.Checked = False And rbBroil.Checked = True Then
      txtTemp.Text = CStr(BROILTEMP)
      Return -1
    End If

    ' Jeśli czyścisz piekarnik...
    If rbDoorClosed.Checked = False And rbClean.Checked = True Then
      Beep()
      MessageBox.Show("Zamknij drzwi podczas samooczyszczania")
      Return 0
    End If

    ' ...ustaw temperaturę na maksimum.
    If rbDoorClosed.Checked = True And rbClean.Checked = True Then
      txtTemp.Text = CStr(CLEANTEMP)
      Return -1
    End If
    Return -1
  End Function

  Private Sub Form1_Load(ByVal sender As System.Object, _
               ByVal e As System.EventArgs) Handles MyBase.Load
    InitializeOven(MyOven)
  End Sub

  Private Sub InitializeOven(ByVal MyOven As COven)
    ' Cel: ta metoda ustawia stan początkowy piekarnika na podany  
    '      w polach tekstowych.
    '
    ' Argumenty:
    '  MyOven    obiekt COven. Nie musi być podawany, dopóki 
    '         ma zasięg modułu. Zrobienie tego pozwoli jednak
    '         zmienić jego zasięg i nadal używać tej procedury 
    '         bez konieczności zmiany tego kodu.
    '
    ' Zwracana wartość:
    '  Niedostępna

    If MyOven.OvenStatus = 0 Then   ' Pokazuje stan piekarnika
      rbOvenOff.Checked = True
    Else
      rbOvenOn.Checked = True
    End If

    If MyOven.DoorStatus = 0 Then   ' Pokazuje stan drzwiczek
      rbDoorClosed.Checked = True
    Else
      rbDoorOpen.Checked = True
    End If

    If MyOven.DoorStatus = 0 Then   'Pokazuje stan drzwiczek
      rbDoorClosed.Checked = True
    Else
      rbDoorOpen.Checked = True
    End If

    If MyOven.LightStatus = 0 Then  ' Światło w piekarniku
      rbLightOff.Checked = True
    Else
      rbLightOn.Checked = True
    End If

    txtTemp.Text = CStr(MyOven.Temperature)   ' Temperatura
    txtOvenTemp.Text = CStr(MyOven.Temperature)
  End Sub

  Private Sub btnExit_Click(ByVal sender As System.Object, _
          ByVal e As System.EventArgs) Handles btnExit.Click
    Me.Dispose()
  End Sub
  ' ================= Przyciski radiowe =========================
  Private Sub rbOvenOn_Leave(ByVal sender As Object, _
          ByVal e As System.EventArgs) Handles rbOvenOn.Leave
    rbOvenOn.Checked = True
    MyOven.OvenStatus = -1
  End Sub

  Private Sub rbOvenOff_Leave(ByVal sender As Object, _
          ByVal e As System.EventArgs) Handles rbOvenOff.Leave
    rbOvenOff.Checked = True
    MyOven.OvenStatus = 0
  End Sub

  Private Sub rbLightOn_Leave(ByVal sender As Object, _
          ByVal e As System.EventArgs) Handles rbLightOn.Leave
    rbLightOn.Checked = True
    MyOven.LightStatus = 0
  End Sub

  Private Sub rbLightOff_Leave(ByVal sender As Object, _
          ByVal e As System.EventArgs) Handles rbLightOff.Leave
    rbLightOff.Checked = True
    MyOven.LightStatus = 0
  End Sub

  Private Sub rbDoorOpen_Leave(ByVal sender As Object, _
          ByVal e As System.EventArgs) Handles rbDoorOpen.Leave
    rbDoorOpen.Checked = True
    MyOven.DoorStatus = -1
  End Sub

  Private Sub rbDoorClosed_Leave(ByVal sender As Object, _
          ByVal e As System.EventArgs) Handles rbDoorClosed.Leave
    rbDoorClosed.Checked = True
    MyOven.DoorStatus = 0

  End Sub

  Private Sub rbBroil_Leave(ByVal sender As Object, _
          ByVal e As System.EventArgs) Handles rbBroil.Leave
    If rbDoorClosed.Checked = True And rbBroil.Checked = True Then
      MessageBox.Show("Prawdopodobnie trzeba otworzyć drzwiczki")
      Exit Sub
    End If
    MyOven.Broil()
    txtTemp.Text = CStr(BROILTEMP)
  End Sub

  Private Sub rbClean_Leave(ByVal sender As Object, _
          ByVal e As System.EventArgs) Handles rbClean.Leave
    MyOven.SelfClean()
    txtTemp.Text = CStr(CLEANTEMP)
  End Sub
  ' ============= Pola tekstowe ========================

  Private Sub txtTemp_Leave(ByVal sender As Object, _
          ByVal e As System.EventArgs) Handles txtTemp.Leave
    If txtTemp.Text = "0" Then
      MyOven.Temperature = 0
      rbOvenOff.Checked = True
    End If
  End Sub

End Class
