]> git.xolatile.top Git - soikk-clock.git/commitdiff
Created the repository
authorSoikk <76824648+Soikk@users.noreply.github.com>
Thu, 9 Sep 2021 13:57:42 +0000 (15:57 +0200)
committerSoikk <76824648+Soikk@users.noreply.github.com>
Thu, 9 Sep 2021 13:57:42 +0000 (15:57 +0200)
Added clock.c, a README and a license

README.md
clock.c [new file with mode: 0644]

index 37dc282547fcfbae5e7f782733992934370682aa..f233c68e96f4be69384af3617986c861718eeaa2 100644 (file)
--- 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 (file)
index 0000000..0de5470
--- /dev/null
+++ b/clock.c
@@ -0,0 +1,238 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <windows.h>
+
+#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 <T> <D> <B>\n");
+               printf( "<T> (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( "<D> (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( "<B> (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