'
' Another HUG demonstration program
'
' November 2009, PvE - GPL
'
' -------------------------------------------------------------------------------------------------------------------------------------

INCLUDE "hug.bac"

CONST OffSet = 10
CONST LedLength = 50
CONST LedWidth = 5
CONST DigitWidth = 2*LedWidth + LedLength

SUB Draw_Led(NUMBER which, NUMBER xcoord, STRING color)

    SELECT which
        CASE 1
            SQUARE(color, OffSet + LedWidth + xcoord, OffSet, LedLength, LedWidth, TRUE)
        CASE 2
            SQUARE(color, OffSet + xcoord, OffSet + LedWidth, LedWidth, LedLength, TRUE)
        CASE 3
            SQUARE(color, OffSet + LedWidth + LedLength + xcoord, OffSet + LedWidth, LedWidth, LedLength, TRUE)
        CASE 4
            SQUARE(color, OffSet + LedWidth + xcoord, OffSet + LedWidth + LedLength, LedLength, LedWidth, TRUE)
        CASE 5
            SQUARE(color, OffSet + xcoord, OffSet + 2*LedWidth + LedLength, LedWidth, LedLength, TRUE)
        CASE 6
            SQUARE(color, OffSet + LedWidth + LedLength + xcoord, OffSet + 2*LedWidth + LedLength, LedWidth, LedLength, TRUE)
        CASE 7
            SQUARE(color, OffSet + LedWidth + xcoord, OffSet + 2*LedWidth + 2*LedLength, LedLength, LedWidth, TRUE)
    END SELECT

END SUB


SUB Draw_One(NUMBER xcoord)

    Draw_Led(1, xcoord, "#FFFFFF")
    Draw_Led(2, xcoord, "#FFFFFF")
    Draw_Led(3, xcoord, "#0000FF")
    Draw_Led(4, xcoord, "#FFFFFF")
    Draw_Led(5, xcoord, "#FFFFFF")
    Draw_Led(6, xcoord, "#0000FF")
    Draw_Led(7, xcoord, "#FFFFFF")

END SUB

SUB Draw_Two(NUMBER xcoord)

    Draw_Led(1, xcoord, "#00FF00")
    Draw_Led(2, xcoord, "#FFFFFF")
    Draw_Led(3, xcoord, "#00FF00")
    Draw_Led(4, xcoord, "#00FF00")
    Draw_Led(5, xcoord, "#00FF00")
    Draw_Led(6, xcoord, "#FFFFFF")
    Draw_Led(7, xcoord, "#00FF00")

END SUB

SUB Draw_Three(NUMBER xcoord)

    Draw_Led(1, xcoord, "#FF0000")
    Draw_Led(2, xcoord, "#FFFFFF")
    Draw_Led(3, xcoord, "#FF0000")
    Draw_Led(4, xcoord, "#FF0000")
    Draw_Led(5, xcoord, "#FFFFFF")
    Draw_Led(6, xcoord, "#FF0000")
    Draw_Led(7, xcoord, "#FF0000")

END SUB

SUB Draw_Four(NUMBER xcoord)

    Draw_Led(1, xcoord, "#FFFFFF")
    Draw_Led(2, xcoord, "#808000")
    Draw_Led(3, xcoord, "#808000")
    Draw_Led(4, xcoord, "#808000")
    Draw_Led(5, xcoord, "#FFFFFF")
    Draw_Led(6, xcoord, "#808000")
    Draw_Led(7, xcoord, "#FFFFFF")

END SUB

SUB Draw_Five(NUMBER xcoord)

    Draw_Led(1, xcoord, "#008080")
    Draw_Led(2, xcoord, "#008080")
    Draw_Led(3, xcoord, "#FFFFFF")
    Draw_Led(4, xcoord, "#008080")
    Draw_Led(5, xcoord, "#FFFFFF")
    Draw_Led(6, xcoord, "#008080")
    Draw_Led(7, xcoord, "#008080")

END SUB

SUB Draw_Six(NUMBER xcoord)

    Draw_Led(1, xcoord, "#FFFFFF")
    Draw_Led(2, xcoord, "#808080")
    Draw_Led(3, xcoord, "#FFFFFF")
    Draw_Led(4, xcoord, "#808080")
    Draw_Led(5, xcoord, "#808080")
    Draw_Led(6, xcoord, "#808080")
    Draw_Led(7, xcoord, "#808080")

END SUB

SUB Draw_Seven(NUMBER xcoord)

    Draw_Led(1, xcoord, "#CCCC00")
    Draw_Led(2, xcoord, "#FFFFFF")
    Draw_Led(3, xcoord, "#CCCC00")
    Draw_Led(4, xcoord, "#FFFFFF")
    Draw_Led(5, xcoord, "#FFFFFF")
    Draw_Led(6, xcoord, "#CCCC00")
    Draw_Led(7, xcoord, "#FFFFFF")

END SUB

SUB Draw_Eight(NUMBER xcoord)

    Draw_Led(1, xcoord, "#FF00FF")
    Draw_Led(2, xcoord, "#FF00FF")
    Draw_Led(3, xcoord, "#FF00FF")
    Draw_Led(4, xcoord, "#FF00FF")
    Draw_Led(5, xcoord, "#FF00FF")
    Draw_Led(6, xcoord, "#FF00FF")
    Draw_Led(7, xcoord, "#FF00FF")

END SUB

SUB Draw_Nine(NUMBER xcoord)

    Draw_Led(1, xcoord, "#000000")
    Draw_Led(2, xcoord, "#000000")
    Draw_Led(3, xcoord, "#000000")
    Draw_Led(4, xcoord, "#000000")
    Draw_Led(5, xcoord, "#FFFFFF")
    Draw_Led(6, xcoord, "#000000")
    Draw_Led(7, xcoord, "#000000")

END SUB

SUB Draw_Zero(NUMBER xcoord)

    Draw_Led(1, xcoord, "#00FFFF")
    Draw_Led(2, xcoord, "#00FFFF")
    Draw_Led(3, xcoord, "#00FFFF")
    Draw_Led(4, xcoord, "#FFFFFF")
    Draw_Led(5, xcoord, "#00FFFF")
    Draw_Led(6, xcoord, "#00FFFF")
    Draw_Led(7, xcoord, "#00FFFF")

END SUB

FUNCTION Update_Time

    LOCAL hour$, minute$, second$, curtime$
    LOCAL digit

    hour$ = STR$(HOUR(NOW))
    IF LEN(hour$) < 2 THEN
        hour$ = CONCAT$("0", hour$)
    END IF

    minute$ = STR$(MINUTE(NOW))
    IF LEN(minute$) < 2 THEN
        minute$ = CONCAT$("0", minute$)
    END IF

    second$ = STR$(SECOND(NOW))
    IF LEN(second$) < 2 THEN
        second$ = CONCAT$("0", second$)
    END IF

    curtime$ = CONCAT$(hour$, minute$, second$)

    FOR digit = 0 TO LEN(curtime$) - 1    

        SELECT MID$(curtime$, digit + 1, 1)
            CASE "0"
                Draw_Zero(DigitWidth*digit + OffSet*digit)
            CASE "1"
                Draw_One(DigitWidth*digit + OffSet*digit)
            CASE "2"
                Draw_Two(DigitWidth*digit + OffSet*digit)
            CASE "3"
                Draw_Three(DigitWidth*digit + OffSet*digit)
            CASE "4"
                Draw_Four(DigitWidth*digit + OffSet*digit)
            CASE "5"
                Draw_Five(DigitWidth*digit + OffSet*digit)
            CASE "6"
                Draw_Six(DigitWidth*digit + OffSet*digit)
            CASE "7"
                Draw_Seven(DigitWidth*digit + OffSet*digit)
            CASE "8"
                Draw_Eight(DigitWidth*digit + OffSet*digit)
            CASE "9"
                Draw_Nine(DigitWidth*digit + OffSet*digit)
        END SELECT
    NEXT

    OUT(CONCAT$(MONTH$(NOW), " ", STR$(DAY(NOW)), ", ",  STR$(YEAR(NOW))), "#000000", "#FFFFFF", 3*OffSet + 2*DigitWidth, 2*OffSet + 2*LedLength + 3*LedWidth)

    RETURN TRUE

END FUNCTION

' -------------------------------------------------------------------------------------------------------------------------------------

' We're using canvas so no widget scaling
HUGOPTIONS("NOSCALING")

' Define GUI
app = WINDOW("Digital clock", 7*OffSet + 6*DigitWidth + 20, 2*OffSet + 2*LedLength + 3*LedWidth + 40)

frame = FRAME(7*OffSet + 6*DigitWidth + 10, 2*OffSet + 2*LedLength + 3*LedWidth + 30)
ATTACH (app, frame, 5, 5)

canvas = CANVAS(7*OffSet + 6*DigitWidth, 2*OffSet + 2*LedLength + 3*LedWidth + 20)
ATTACH (app, canvas, 10, 10)

' Setup timeout in GTK mainloop
TIMEOUT (1000, Update_Time)

' Draw time already
Update_Time

' Endless GTK mainloop
DISPLAY