clock_pg5.c 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #include <stdio.h>
  2. #include <time.h>
  3. #include <unistd.h> // для sleep()
  4. #include <signal.h> // для обработки сигналов
  5. #include <stdlib.h> // для exit()
  6. #include "pseudographic_font_5.h"
  7. // Флаг для корректного завершения
  8. volatile sig_atomic_t keep_running = 1;
  9. // Обработчик сигнала SIGINT (Ctrl+C)
  10. void handle_sigint(int sig) {
  11. keep_running = 0; // Устанавливаем флаг для выхода из цикла
  12. }
  13. // Функция для вывода псевдографического времени
  14. void print_pseudographic_time(int hours, int mins, int secs) {
  15. // Проверяем валидность времени
  16. if (hours < 0 || hours > 23 || mins < 0 || mins > 59 || secs < 0 || secs > 59) {
  17. printf("\033[H"); // Возврат в начало
  18. printf("\033[1mInvalid time: %02d:%02d:%02d\033[0m\n", hours, mins, secs);
  19. fflush(stdout);
  20. return;
  21. }
  22. // Преобразуем время в строку формата "ЧЧ:ММ:СС"
  23. char time_str[9];
  24. snprintf(time_str, 9, "%02d:%02d:%02d", hours, mins, secs);
  25. // Получаем псевдографические символы для каждой цифры и разделителя
  26. const char** chars[8];
  27. for (int i = 0; i < 8; i++) {
  28. chars[i] = get_pseudographic_char_5(time_str[i]);
  29. }
  30. // Перемещаем курсор в верхний левый угол (без очистки экрана)
  31. printf("\033[H");
  32. // Выводим пять строк псевдографики
  33. for (int row = 0; row < 5; row++) {
  34. for (int i = 0; i < 8; i++) {
  35. if (i == 2 || i == 5) {
  36. // Жирный серый для разделителя (:)
  37. printf("\033[1m\033[90m%s\033[0m", chars[i][row]);
  38. } else {
  39. // Жирный белый для цифр
  40. printf("\033[1m\033[37m%s\033[0m", chars[i][row]);
  41. }
  42. }
  43. printf("\n");
  44. }
  45. fflush(stdout);
  46. }
  47. int main(int argc, char *argv[]) {
  48. // Устанавливаем обработчик сигнала SIGINT
  49. signal(SIGINT, handle_sigint);
  50. // Скрываем курсор
  51. printf("\033[?25l");
  52. fflush(stdout);
  53. // Выводим пять пустых строк для резервирования места
  54. printf("\n\n\n\n\n");
  55. while (keep_running) {
  56. time_t rawtime;
  57. struct tm *timeinfo;
  58. // Получаем текущее время
  59. if (time(&rawtime) == (time_t)-1) {
  60. printf("\033[H\033[1mFailed to get time\033[0m\n");
  61. fflush(stdout);
  62. sleep(1);
  63. continue;
  64. }
  65. timeinfo = localtime(&rawtime);
  66. if (timeinfo == NULL) {
  67. printf("\033[H\033[1mFailed to parse time\033[0m\n");
  68. fflush(stdout);
  69. sleep(1);
  70. continue;
  71. }
  72. // Выводим псевдографическое время
  73. print_pseudographic_time(timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);
  74. sleep(1); // Спим одну секунду
  75. }
  76. // Показываем курсор и очищаем экран перед выходом
  77. printf("\033[2J\033[H\033[?25h");
  78. fflush(stdout);
  79. return 0;
  80. }
  81. // gcc clock_pg5.c -o clock_pg5