Tuesday, December 16, 2014

Knr clock.




video
 
Turn your computer into an old fashion clock.

gcc knrclock.c -lm -ncurses -o knrclock

invoke with:

$ ./knrclock

/*
 * aclock - ascii clock for UNIX Console
 *
 * Copyright (c) 2002 Antoni Sawicki <tenox@tenox.tc>
 * Version 1.8 (unix-curses); Dublin, June 2002
 *
 * Compilation: cc aclock-unix-knr.c -o aclock -lcurses -lm
 *
 * this is K&R version modified for old unices (but still with curses)
 *
 */

#include <unistd.h>
#include <curses.h>
#include <math.h>
#include <time.h>

#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif

drw_cir(hand_max, sycen, sxcen, fonthw)
int hand_max; int sycen; int sxcen; int fonthw;
{
    int x,y,r;
    char c;

    for(r=0;r<60;r++){
        x=cos(r*M_PI/180*6)*hand_max*fonthw+sxcen;
        y=sin(r*M_PI/180*6)*hand_max+sycen;
        switch (r) {
            case 0:
            case 5:
            case 10:
            case 15:
            case 20:
            case 25:
            case 30:
            case 35:
            case 40:
            case 45:
            case 50:
            case 55:
                c='o';
                break;
            default:
                c='.';
                break;
        }
        mvaddch(y,x,c);
    }
}

draw_hand(minute, hlenght, c, sxcen, sycen, fonthw)
int minute; int hlenght; char c; int sxcen; int sycen; int fonthw;
{
    int x,y,n;
    float r=(minute-15)*(M_PI/180)*6;

    for(n=1; n<hlenght; n++){
        x=cos(r)*n*fonthw+sxcen;
        y=sin(r)*n+sycen;
        mvaddch(y,x,c);
    }
}


main(){
    char digital_time[15];
    int fonthw = 2;
    int sXmax, sYmax, smax, hand_max, sxcen, sycen;
    long t;
    struct tm *ltime;

    initscr();

    for(;;){
        time(&t);
        ltime=localtime(&t);
        sXmax = COLS;
        sYmax = LINES;

        if(sXmax/2<=sYmax)
            smax=sXmax/2;
        else
            smax=sYmax;

        hand_max = (smax/2)-1;

        sxcen = sXmax/2;
        sycen = sYmax/2;

        erase();
        drw_cir(hand_max, sycen, sxcen, fonthw);

        draw_hand((ltime->tm_hour*5)+(ltime->tm_min/10), 2*hand_max/3, 'h', sxcen, sycen, fonthw);
        draw_hand(ltime->tm_min, hand_max-2, 'm', sxcen, sycen, fonthw);
        draw_hand(ltime->tm_sec, hand_max-1, '.', sxcen, sycen, fonthw);

        mvaddstr(sYmax/4, sxcen-5, ".:ACLOCK:.");
        mvprintw(4*sYmax/5, sxcen-5, "[%02d:%02d:%02d]", ltime->tm_hour, ltime->tm_min, ltime->tm_sec);

        refresh();
        sleep(1);
    }
    endwin();
}

No comments:

Post a Comment