#!/bin/sh
#
# Skrypt wymaga przekazania przynajmniej jednego argumentu: czasu uruchomienia alarmu,
# w formacie gg:mm (poprawno nastawy jest weryfikowana jedynie pobienie). 
# Opcjonalny drugi argument okrela czynno inicjowan o zadanym czasie. 
# W przypadku braku drugiego argumentu, alarmem jest najzwyklejszy dzwonek powoki. 
#
# Przed zaniciem koniecznie sprawd, czy budzik dziaa!
#
# Jeli w wywoaniu przekazany zostanie drugi argument i obejmuje on wicej ni 
# jedno polecenie, naley argument uj w cudzysw.

# Weryfikacja poprawnoci wywoania i kontrola poprawnoci pierwszego argumentu.
# W razie stwierdzenia bdu wypisywany jest komunikat o sposobie uycia skryptu.

if [ $# -eq 0 ]
then
        echo "Stosowanie: $0 hh:mm [alarm]"
        echo "np. $0 13:30 \"mplayer /media/music/dr_octagon/01.mp3\" "
        exit 1
else
        alarm_time="$1"

        # Weryfikacja poprawnoci formatu czasu alarmu; pierwsza cyfra powinna by
        # z zakresu 0-2, za cyframi godzin powinien znajdowa si dwukropek, a za 
        # nim liczba z zakresu od 0 do 59. Uwaga: to jedynie zgrubna kontrola.

        if [ ! `echo "$alarm_time" | sed -n '/[0-2][[:digit:]]:[0-5][[:digit:]]/p'` ]
        then
                echo "Niepoprawny czas - podawa w formacie gg:mm (24-godz.)"
                exit 1
        fi

fi

# Ustawienie numeru sekundy w minucie
seconds=1

# Weryfikacja drugiego argumentu; jeli go brak, domylnym alarmem jest
# uruchomienie dzwonka powoki. Argument -e polecenia echo wymusza interpretacj
# symboli specjalnych, a \a to wedle dokumentacji man echo(1) symbol dzwonka.
if [ ! $2 ]
then
        bell="echo -e \a"
else

        bell=$2
fi

# Funkcja wait_between_checks wymusza wstrzymanie wykonania skryptu na okrelon
# liczb sekund a nastpnie wywouje funkcj check_time, sprawdzajc, czy ju
# pora na pobudk. Skrypt jest wybudzany co minut, wic nie obcia stale procesora.

wait_between_checks ()
{
        sleep $seconds
        check_time
}

# Funkcja check_time sprawdza biecy czas (w formacie gg:mm) i porwnuje go z 
# czasem $alarm_time; jeli pasuj, nastpuje wywoanie funkcji budzenia - wakeup.
# W przeciwnym razie funkcja wymusza wstrzymanie skryptu (sleep) przez 
# ponowne wywoanie funkcji wait_between_checks.
check_time ()
{
        current_time=`date +%H:%M`

        if [ "$current_time" = "$alarm_time" ]
        then
                wakeup
        else
                wait_between_checks
        fi

}

# Funkcja wakeup uruchamia dzwonek (albo czynno wskazan w wywoaniu)
# do czasu przerwania wykonania skryptu.

wakeup ()
{
        echo -n "Pobudka! Nacinij Ctrl+C"
        $bell
        sleep 1
        wakeup
}

# Uruchomienie caego tego mechanizmu oczekiwania na moment wyzwolenia alarmu.

wait_between_checks
