From 2d82c9eb933ee3f145830b624282f77f71da5992 Mon Sep 17 00:00:00 2001 From: Soikk <76824648+Soikk@users.noreply.github.com> Date: Thu, 9 Sep 2021 15:57:42 +0200 Subject: [PATCH] Created the repository Added clock.c, a README and a license --- README.md | 3 + clock.c | 238 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 241 insertions(+) create mode 100644 clock.c diff --git a/README.md b/README.md index 37dc282..f233c68 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,5 @@ # clock A simple console clock for Windows + Created Wednesday, ‎September ‎8, ‎2021, ‏‎5:48:36 PM + Finished Thursday, ‎September ‎9, ‎2021, ‏‎3:54:58 PM + Support for other OSs not added yet \ No newline at end of file diff --git a/clock.c b/clock.c new file mode 100644 index 0000000..0de5470 --- /dev/null +++ b/clock.c @@ -0,0 +1,238 @@ +#include +#include +#include +#include + +#define PADDING 1 +#define BLOCK 219 // █ +#define SPACE 32 // ' ' +#define BLOCK_WIDTH 2 +#define NUM_WIDTH 3 +#define NUM_HEIGHT 5 +#define COLON_WIDTH 3 +#define COLON_HEIGHT 5 + + +int _debug, _numbers, _colons, _date, _date_length, _width, _height; + +int numbers[10][5][3] = { + { + {BLOCK, BLOCK, BLOCK}, // 0 + {BLOCK, SPACE, BLOCK}, + {BLOCK, SPACE, BLOCK}, + {BLOCK, SPACE, BLOCK}, + {BLOCK, BLOCK, BLOCK} + }, + { + {SPACE, SPACE, BLOCK}, // 1 + {SPACE, SPACE, BLOCK}, + {SPACE, SPACE, BLOCK}, + {SPACE, SPACE, BLOCK}, + {SPACE, SPACE, BLOCK} + }, + { + {BLOCK, BLOCK, BLOCK}, // 2 + {SPACE, SPACE, BLOCK}, + {BLOCK, BLOCK, BLOCK}, + {BLOCK, SPACE, SPACE}, + {BLOCK, BLOCK, BLOCK} + }, + { + {BLOCK, BLOCK, BLOCK}, // 3 + {SPACE, SPACE, BLOCK}, + {BLOCK, BLOCK, BLOCK}, + {SPACE, SPACE, BLOCK}, + {BLOCK, BLOCK, BLOCK} + }, + { + {BLOCK, SPACE, BLOCK}, // 4 + {BLOCK, SPACE, BLOCK}, + {BLOCK, BLOCK, BLOCK}, + {SPACE, SPACE, BLOCK}, + {SPACE, SPACE, BLOCK} + }, + { + {BLOCK, BLOCK, BLOCK}, // 5 + {BLOCK, SPACE, SPACE}, + {BLOCK, BLOCK, BLOCK}, + {SPACE, SPACE, BLOCK}, + {BLOCK, BLOCK, BLOCK} + }, + { + {BLOCK, BLOCK, BLOCK}, // 6 + {BLOCK, SPACE, SPACE}, + {BLOCK, BLOCK, BLOCK}, + {BLOCK, SPACE, BLOCK}, + {BLOCK, BLOCK, BLOCK} + }, + { + {BLOCK, BLOCK, BLOCK}, // 7 + {SPACE, SPACE, BLOCK}, + {SPACE, SPACE, BLOCK}, + {SPACE, SPACE, BLOCK}, + {SPACE, SPACE, BLOCK} + }, + { + {BLOCK, BLOCK, BLOCK}, // 8 + {BLOCK, SPACE, BLOCK}, + {BLOCK, BLOCK, BLOCK}, + {BLOCK, SPACE, BLOCK}, + {BLOCK, BLOCK, BLOCK} + }, + { + {BLOCK, BLOCK, BLOCK}, // 9 + {BLOCK, SPACE, BLOCK}, + {BLOCK, BLOCK, BLOCK}, + {SPACE, SPACE, BLOCK}, + {BLOCK, BLOCK, BLOCK} + } +}; + +int colon[5] = { SPACE, BLOCK, SPACE, BLOCK, SPACE }; + + +void setConsoleSize(int width, int height){ + HANDLE windowHandle = GetStdHandle(STD_OUTPUT_HANDLE); + COORD coord = {.X = width, .Y = height}; + SMALL_RECT windowSize = {0 , 0 , width-1, height-1}; + SetConsoleScreenBufferSize(windowHandle, coord); + SetConsoleWindowInfo(windowHandle, TRUE, &windowSize); +} + +void cursorVisible(int q){ + HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE); + CONSOLE_CURSOR_INFO info; + info.dwSize = 25; + if(q == 1){ + info.bVisible = TRUE; + }else if(q == 0){ + info.bVisible = FALSE; + } + SetConsoleCursorInfo(consoleHandle, &info); +} + +void gotoxy(int x, int y){ + COORD coord = {.X = x, .Y = y}; + SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); +} + +void printBlock(int c){ + putchar(c); + putchar(c); +} + +void drawTime(struct tm *time){ + int date[_numbers], c = 0; + if(_numbers/2 >= 1){ + date[c++] = time->tm_sec%10; + date[c++] = time->tm_sec/10; + } + if(_numbers/2 >= 2){ + date[c++] = time->tm_min%10; + date[c++] = time->tm_min/10; + } + if(_numbers/2 >= 3){ + date[c++] = time->tm_hour%10; + date[c++] = time->tm_hour/10; + } + + + for(int i = 0; i < 5; i++){ + c = _colons; + putchar('\n'); + printBlock(SPACE); + for(int j = 0; j < _numbers; j++){ + for(int k = 0; k < 3; k++){ + printBlock(numbers[date[_numbers-j-1]][i][k]); + } + printBlock(SPACE); + if(c > 0){ + if(((j+1)%2 == 0) && (j < 5)){ + printBlock(colon[i]); + printBlock(SPACE); + c--; + } + } + } + } + + putchar('\n'); + if(_date > 0){ + putchar('\n'); + for(int i = 0; i < _width/2 - _date_length/2 - _date_length%2; i++){ + putchar(SPACE); + } + if(_date >= 1) + printf("%02d", time->tm_mday); + if(_date >= 2) + printf("/%02d", time->tm_mon); + if(_date >= 3) + printf("/%d", time->tm_year+1900); + } +} + +int main(int argc, char **argv){ + + if(argc < 3){ + setConsoleSize(120, 30); + printf("Usage: clock.exe \n"); + printf( " (time)\n" + "\tIf T is below 0 it will be set to 0\n" + "\tIf T is above 3 it will be set to 3\n" + "\t\t-T = 0: display nothing\n" + "\t\t-T = 1: display seconds\n" + "\t\t-T = 2: above + minutes\n" + "\t\t-T = 3: above + hours\n"); + printf( " (date)\n" + "\tIf D is below 0 it will be set to 0\n" + "\tIf D is above 3 it will be set to 3\n" + "\t\t-D = 0: display nothing\n" + "\t\t-D = 1: display day\n" + "\t\t-D = 2: above + month\n" + "\t\t-D = 3: above + year\n"); + printf( " (debug - optional)\n\n" + "\tB doesnt need to be set\n" + "\tIf B is below 0 it will be set to 0\n" + "\tIf B is above 1 it will be set to 1\n" + "\t\t-B = 0: display nothing\n" + "\t\t-B = 1: turn on debugging mode"); + return 0; + } + if(argc == 4){ + _debug = atoi(argv[3]); + } + + _numbers = atoi(argv[1])*2; + _colons = (_numbers/2) - 1; + _date = atoi(argv[2]); + _date_length = (_date > 0)*(_date*2 + (_date == 3)*2 + (_date-1)); + _width = (_numbers*NUM_WIDTH + _colons*COLON_WIDTH + (_numbers/2)*PADDING + 2*PADDING)*BLOCK_WIDTH; + _height = NUM_HEIGHT + (_date > 0)*2 + 2*PADDING; + + if(_debug > 0){ + setConsoleSize(120, 30); + printf( "nums: %d\n" + "colons: %d\n" + "date: %d\n" + "width: %d\n" + "height: %d\n", + _numbers, _colons, _date, _width, _height); + return 0; + } + + system("@ECHO OFF"); + system("cls"); + SetConsoleTitle("CLOCK"); + setConsoleSize(_width, _height); + time_t rawtime; + + while(1){ + cursorVisible(0); + time(&rawtime); + struct tm *curr_time = localtime(&rawtime); + gotoxy(0, 0); + drawTime(curr_time); + } + + return 0; +} \ No newline at end of file -- 2.39.5