#!/usr/bin/env python
#
# $Id$
#
# From tclock.c, Copyright Howard Jones <ha.jones@ic.ac.uk>, September 1994.

from math import *
import curses, time

ASPECT = 2.2

def sign(_x):
    if _x < 0: return -1
    return 1

def A2XY(angle, radius):
    return int(round(ASPECT * radius * sin(angle))), int(round(radius * cos(angle)))

def plot(x, y, col):
    stdscr.addch(y, x, col)

# draw a diagonal line using Bresenham's algorithm
def dline(pair, from_x, from_y, x2, y2, ch):
    if curses.has_colors():
        stdscr.attrset(curses.color_pair(pair))

    dx = x2 - from_x
    dy = y2 - from_y

    ax = abs(dx * 2)
    ay = abs(dy * 2)

    sx = sign(dx)
    sy = sign(dy)

    x = from_x
    y = from_y

    if ax > ay:
        d = ay - ax / 2

        while 1:
            plot(x, y, ch)
            if x == x2:
                return

            if d >= 0:
                y += sy
                d -= ax
            x += sx
            d += ay
    else:
        d = ax - ay / 2

        while 1:
            plot(x, y, ch)
            if y == y2:
                return

            if d >= 0:
                x += sx
                d -= ay
            y += sy
            d += ax

def main(win):
    global stdscr
    stdscr = win

    lastbeep = -1
    my_bg = curses.COLOR_BLACK

    stdscr.nodelay(1)
    stdscr.timeout(0)
#    curses.curs_set(0)
    if curses.has_colors():
        curses.init_pair(1, curses.COLOR_RED, my_bg)
        curses.init_pair(2, curses.COLOR_MAGENTA, my_bg)
        curses.init_pair(3, curses.COLOR_GREEN, my_bg)

    cx = (curses.COLS - 1) / 2
    cy = curses.LINES / 2
    ch = min( cy-1, int(cx / ASPECT) - 1)
    mradius = (3 * ch) / 4
    hradius = ch / 2
    sradius = 5 * ch / 6

    for i in range(0, 12):
        sangle = (i + 1) * 2.0 * pi / 12.0
        sdx, sdy = A2XY(sangle, sradius)

        stdscr.addstr(cy - sdy, cx + sdx, "%d" % (i + 1))

    stdscr.addstr(0, 0,
                  "ASCII Clock by Howard Jones <ha.jones@ic.ac.uk>, 1994")

    sradius = max(sradius-4, 8)

    while 1:
        curses.napms(1000)

        tim = time.time()
        t = time.localtime(tim)

        hours = t[3] + t[4] / 60.0
        if hours > 12.0:
            hours -= 12.0

        mangle = t[4] * 2 * pi / 60.0
        mdx, mdy = A2XY(mangle, mradius)

        hangle = hours * 2 * pi / 12.0
        hdx, hdy = A2XY(hangle, hradius)

        sangle = t[5] * 2 * pi / 60.0
        sdx, sdy = A2XY(sangle, sradius)

        dline(3, cx, cy, cx + mdx, cy - mdy, ord('#'))

        stdscr.attrset(curses.A_REVERSE)
        dline(2, cx, cy, cx + hdx, cy - hdy, ord('.'))
        stdscr.attroff(curses.A_REVERSE)

        if curses.has_colors():
            stdscr.attrset(curses.color_pair(1))

        plot(cx + sdx, cy - sdy, ord('O'))

        if curses.has_colors():
            stdscr.attrset(curses.color_pair(0))

        stdscr.addstr(curses.LINES - 2, 0, time.ctime(tim))
        stdscr.refresh()
        if (t[5] % 5) == 0 and t[5] != lastbeep:
            lastbeep = t[5]
            curses.beep()

        ch = stdscr.getch()
        if ch == ord('q'):
            return 0

        plot(cx + sdx, cy - sdy, ord(' '))
        dline(0, cx, cy, cx + hdx, cy - hdy, ord(' '))
        dline(0, cx, cy, cx + mdx, cy - mdy, ord(' '))

curses.wrapper(main)
