
=head1 NAME

clock.pir - LCD clock

=head1 SYNOPSIS

    ./parrot examples/sdl/lcd/clock.pir

=head1 DESCRIPTION

This example demonstrates the SDL::LCD object. It shows a simple clock.

=head1 FUNCTIONS

=over 4

=cut

.include "tm.pasm"
.include "timer.pasm"
.loadlib 'sys_ops'
.loadlib 'math_ops'

=item _main

The main function.

=cut

.sub _main :main
    load_bytecode "SDL/App.pir"
    load_bytecode "SDL/Event.pir"
    load_bytecode "SDL/EventHandler.pir"
    load_bytecode "SDL/LCD.pir"

    # create the SDL application object
    .local pmc app
    app = new ['SDL'; 'App']
    app.'init'( 'height' => 21, 'width' => 94, 'bpp' => 16, 'flags' => 5 )

    .local pmc screen
    screen = app.'surface'()
    set_global 'screen', screen

    # create the LCD
    .local pmc lcd
    lcd = new ['SDL'; 'LCD']
    set_global 'LCD', lcd

    # draw the watch
    drawWatch()

    # create the timer
    $P1 = get_global "drawWatch"
    $P0 = new 'Timer'
    $P0[.PARROT_TIMER_NSEC] = 0.5
    $P0[.PARROT_TIMER_HANDLER] = $P1
    $P0[.PARROT_TIMER_REPEAT] = -1
    $P0[.PARROT_TIMER_RUNNING] = 1
    # store the timer somewhere, it will be
    # collected and destroyed otherwise
    set_global "timer", $P0

    #
    # event loop
    #
    .local pmc eh
    .local pmc loop

    eh   = new ['SDL'; 'EventHandler']
    loop = new ['SDL'; 'Event']
    loop.'init'()
    loop.'process_events'( 0.1, eh )
.end

=item drawWatch

Creates, sets and redraws the LCD display content.

=cut

.sub drawWatch
    # decode the current time
    $I0 = time
    $P0 = decodelocaltime $I0

    # use a dot or a space?
    $N0 -= $I0
    $S2 = ":"
    if $N0 < 0.5 goto USE_DOTS
    $S2 = " "
USE_DOTS:

    # hours
    $I0 = $P0[.TM_HOUR]
    $I0 /= 10
    if $I0 > 0 goto NO_SPACE
    $S0 = ' '
    branch HOUR
NO_SPACE:
    $S0 = $I0
HOUR:
    $I0 = $P0[.TM_HOUR]
    cmod $I0, $I0, 10
    $S1 = $I0
    $S0 = concat $S0, $S1

    # minutes
    $S0 = concat $S0, $S2
    $I0 = $P0[.TM_MIN]
    $I0 /= 10
    $S1 = $I0
    $S0 = concat $S0, $S1
    $I0 = $P0[.TM_MIN]
    cmod $I0, $I0, 10
    $S1 = $I0
    $S0 = concat $S0, $S1

    # seconds
    $S0 = concat $S0, $S2
    $I0 = $P0[.TM_SEC]
    $I0 /= 10
    $S1 = $I0
    $S0 = concat $S0, $S1
    $I0 = $P0[.TM_SEC]
    cmod $I0, $I0, 10
    $S1 = $I0
    $S0 = concat $S0, $S1

    # set the time
    $P0 = get_global "LCD"
    $P0 = $S0

    # redraw the LCD
    $P1 = get_global "screen"
    $P0.'draw'( $P1 )
.end

=back

=head1 AUTHOR

Jens Rieks E<lt>parrot at jensbeimsurfen dot deE<gt> is the author
and maintainer.
Please send patches and suggestions to the Perl 6 Internals mailing list.

=head1 COPYRIGHT

Copyright (C) 2004-2010, Parrot Foundation.

=cut

# Local Variables:
#   mode: pir
#   fill-column: 100
# End:
# vim: expandtab shiftwidth=4 ft=pir:
