| #!/usr/bin/env python |
| # |
| # $Id$ |
| # |
| # From tclock.c, Copyright Howard Jones <[email protected]>, 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 True: |
| 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 True: |
| 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 <[email protected]>, 1994") |
| |
| sradius = max(sradius-4, 8) |
| |
| while True: |
| 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) |