Last active
April 25, 2023 23:28
-
-
Save LamberKeep/b6a3815866483f80630433d375e898cd to your computer and use it in GitHub Desktop.
Hexadecimal number to braille pattern conventer. Binary clock. Now on C!
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* @file braille_binary_clock.c | |
* | |
* Hexadecimal number to braille pattern conventer. Binary clock. | |
* | |
* Created: 2023-04-26 | |
* Updated: *never* | |
* | |
* @author Alexey Savin (LamberKeep) | |
*/ | |
#include <stdio.h> | |
#include <wchar.h> | |
#include <locale.h> | |
#include <uchar.h> | |
#include <time.h> | |
#include <unistd.h> | |
/** | |
* Translates 16 or less base to UTF-8 braille pattern character. | |
* | |
* Caution! Don't use a base greater than 16, as well as dozens more than 15. | |
* | |
* List of all braille pattern characters: | |
* https://en.wikibooks.org/wiki/Unicode/Character_reference/2000-2FFF | |
* | |
* @param input the input value that will be converted to a character. | |
* @param base the number system of this value. | |
* @return The Unicode character code. | |
*/ | |
unsigned short hexToBraille(unsigned char input, unsigned char base) { | |
unsigned char intFirst = (unsigned char) input / base; | |
unsigned char intSecond = input % base; | |
unsigned char inputFirst = intFirst; | |
unsigned char inputSecond = intSecond; | |
// FIRST | |
if (intFirst % 2 != 0) { | |
intFirst -= 1; | |
} | |
if (intFirst == 0 || intFirst == 6) { | |
// pass | |
} else if (intFirst < 6) { | |
if (intFirst < 3) { | |
intFirst += 2; | |
} else { | |
intFirst -= 2; | |
} | |
} else { | |
if (intFirst % 4 == 0) { | |
intFirst -= 2; | |
} | |
if (inputFirst > 11) { | |
intFirst -= 2; | |
} | |
intFirst -= 5; | |
} | |
if (inputSecond > 7) { | |
intFirst += 8; | |
} | |
// SECOND | |
if (intSecond >= 8) { | |
intSecond -= 8; | |
} | |
if (intSecond >= 4) { | |
if (intSecond % 2 == 0) { | |
intSecond -= 3; | |
} else { | |
intSecond += 4; | |
} | |
} else if (intSecond % 2 != 0) { | |
intSecond += 7; | |
} | |
if (inputFirst % 2 != 0) { | |
intSecond += 4; | |
} | |
return (((unsigned short) 0x0280 + intSecond) << 4) + intFirst; | |
} | |
int main() { | |
setlocale(LC_CTYPE, ""); | |
while (1) { | |
time_t now = time(NULL); | |
struct tm tm = *localtime(&now); | |
wprintf( | |
L"%lc %lc %lc\n", | |
hexToBraille((unsigned char) tm.tm_hour, (unsigned char) 10), | |
hexToBraille((unsigned char) tm.tm_min, (unsigned char) 10), | |
hexToBraille((unsigned char) tm.tm_sec, (unsigned char) 10) | |
); | |
sleep(1); | |
} | |
return 0; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
@file braille_binary_clock.py | |
Hexadecimal number to braille pattern conventer. Binary clock. | |
Created: 2022-11-17 | |
Updated: 2023-04-26 | |
@author Alexey Savin (LamberKeep) | |
""" | |
def hexToBraille(value: int, base = 16): | |
""" | |
Translates 16 or less base to UTF-8 braille pattern character. | |
Caution! Don't use a base greater than 16, as well as dozens more than 15. | |
List of all braille pattern characters: | |
https://en.wikibooks.org/wiki/Unicode/Character_reference/2000-2FFF | |
@param input the input value that will be converted to a character. | |
@param base the number system of this value. | |
@return The Unicode character code. | |
""" | |
intFirst = value // base | |
intSecond = value % base | |
# FIRST | |
if intFirst % 2 != 0: | |
intFirst -= 1 | |
if intFirst == 0 or intFirst == 6: | |
pass | |
elif intFirst < 6: | |
if intFirst < 3: | |
intFirst += 2 | |
else: | |
intFirst -= 2 | |
else: # intFirst > 6 | |
if intFirst % 4 == 0: | |
intFirst -= 2 | |
if value // base > 11: | |
intFirst -= 2 | |
intFirst -= 5 | |
if value % base > 7: | |
intFirst += 8 | |
# SECOND | |
if intSecond >= 8: | |
intSecond -= 8 | |
if intSecond >= 4: | |
if intSecond % 2 == 0: | |
intSecond -= 3 | |
else: | |
intSecond += 4 | |
elif intSecond % 2 != 0: | |
intSecond += 7 | |
if value // base % 2 != 0: | |
intSecond += 4 | |
return 0x2800 + intSecond * 16 + intFirst | |
def binaryClock(loop = True, print_numbers = False, base = 10, sep=" "): | |
""" | |
Print binary clock as braille pattern characters. | |
@param loop repeat forever. Defaults to True. | |
@param print_numbers print time as numbers. Defaults to False. | |
@param base output number base. Defaults to 10. | |
@param sep string separator. Default: " ". | |
""" | |
import time | |
while True: | |
t = time.localtime(time.time()) | |
if print_numbers: | |
print(t[3], end=sep) | |
print(t[4], end=sep) | |
print(t[5]) | |
print(chr(hexToBraille(t[3], base)), end=sep) | |
print(chr(hexToBraille(t[4], base)), end=sep) | |
print(chr(hexToBraille(t[5], base))) | |
if not loop: | |
break | |
time.sleep(1) | |
def testCharacters(path: str): | |
""" | |
Debug function. | |
Compares the output of a function against a file of all symbols. | |
@param path the path to the file. | |
""" | |
count = 0 | |
passed = 0 | |
print("input\toutput\tresult") | |
for line in open(path).readlines(): | |
items = line.split("\t") | |
correct_item = int(items[0], 16) | |
testing_item = hexToBraille(int(items[2] + items[3], 16)) | |
print(f"{correct_item}\t{testing_item}", end=" ") | |
count += 1 | |
if correct_item == testing_item: | |
print("\tpass") | |
passed += 1 | |
else: | |
print("\tfail") | |
print(f"\npassed: {passed}/{count} ({round(passed/count*100, 1)}%)") | |
def getAllCharacters(base = 16): | |
""" | |
Debug function. | |
Prints all 255 braille pattern character, taking into account the number system. | |
@param base output number base. Defaults to 16. | |
""" | |
for i in range(0, 254): | |
print(f"{i}\t{chr(hexToBraille(i, base))}") | |
if __name__ == "__main__": | |
# Starts binary clock. | |
binaryClock(False, sep=" ") | |
# Print one character. | |
# print(chr(hexToBraille(0xff))) # Returns ⣿ | |
# print(chr(hexToBraille(12, 10))) # Returns ⡠ (in base 10) | |
# Get all characters from range 0-255. | |
# getAllCharacters(16) | |
# getAllCharacters(10) # won't work after 159 (look hexToBraille function description) | |
# Test all characters from characters.txt (debug). | |
# testCharacters("./characters.txt") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
U+2800 ⠀ 0 0 | |
U+2801 ⠁ 8 0 | |
U+2802 ⠂ 4 0 | |
U+2803 ⠃ C 0 | |
U+2804 ⠄ 2 0 | |
U+2805 ⠅ A 0 | |
U+2806 ⠆ 6 0 | |
U+2807 ⠇ E 0 | |
U+2808 ⠈ 0 8 | |
U+2809 ⠉ 8 8 | |
U+280A ⠊ 4 8 | |
U+280B ⠋ C 8 | |
U+280C ⠌ 2 8 | |
U+280D ⠍ A 8 | |
U+280E ⠎ 6 8 | |
U+280F ⠏ E 8 | |
U+2810 ⠐ 0 4 | |
U+2811 ⠑ 8 4 | |
U+2812 ⠒ 4 4 | |
U+2813 ⠓ C 4 | |
U+2814 ⠔ 2 4 | |
U+2815 ⠕ A 4 | |
U+2816 ⠖ 6 4 | |
U+2817 ⠗ E 4 | |
U+2818 ⠘ 0 C | |
U+2819 ⠙ 8 C | |
U+281A ⠚ 4 C | |
U+281B ⠛ C C | |
U+281C ⠜ 2 C | |
U+281D ⠝ A C | |
U+281E ⠞ 6 C | |
U+281F ⠟ E C | |
U+2820 ⠠ 0 2 | |
U+2821 ⠡ 8 2 | |
U+2822 ⠢ 4 2 | |
U+2823 ⠣ C 2 | |
U+2824 ⠤ 2 2 | |
U+2825 ⠥ A 2 | |
U+2826 ⠦ 6 2 | |
U+2827 ⠧ E 2 | |
U+2828 ⠨ 0 A | |
U+2829 ⠩ 8 A | |
U+282A ⠪ 4 A | |
U+282B ⠫ C A | |
U+282C ⠬ 2 A | |
U+282D ⠭ A A | |
U+282E ⠮ 6 A | |
U+282F ⠯ E A | |
U+2830 ⠰ 0 6 | |
U+2831 ⠱ 8 6 | |
U+2832 ⠲ 4 6 | |
U+2833 ⠳ C 6 | |
U+2834 ⠴ 2 6 | |
U+2835 ⠵ A 6 | |
U+2836 ⠶ 6 6 | |
U+2837 ⠷ E 6 | |
U+2838 ⠸ 0 E | |
U+2839 ⠹ 8 E | |
U+283A ⠺ 4 E | |
U+283B ⠻ C E | |
U+283C ⠼ 2 E | |
U+283D ⠽ A E | |
U+283E ⠾ 6 E | |
U+283F ⠿ E E | |
U+2840 ⡀ 1 0 | |
U+2841 ⡁ 9 0 | |
U+2842 ⡂ 5 0 | |
U+2843 ⡃ D 0 | |
U+2844 ⡄ 3 0 | |
U+2845 ⡅ B 0 | |
U+2846 ⡆ 7 0 | |
U+2847 ⡇ F 0 | |
U+2848 ⡈ 1 8 | |
U+2849 ⡉ 9 8 | |
U+284A ⡊ 5 8 | |
U+284B ⡋ D 8 | |
U+284C ⡌ 3 8 | |
U+284D ⡍ B 8 | |
U+284E ⡎ 7 8 | |
U+284F ⡏ F 8 | |
U+2850 ⡐ 1 4 | |
U+2851 ⡑ 9 4 | |
U+2852 ⡒ 5 4 | |
U+2853 ⡓ D 4 | |
U+2854 ⡔ 3 4 | |
U+2855 ⡕ B 4 | |
U+2856 ⡖ 7 4 | |
U+2857 ⡗ F 4 | |
U+2858 ⡘ 1 C | |
U+2859 ⡙ 9 C | |
U+285A ⡚ 5 C | |
U+285B ⡛ D C | |
U+285C ⡜ 3 C | |
U+285D ⡝ B C | |
U+285E ⡞ 7 C | |
U+285F ⡟ F C | |
U+2860 ⡠ 1 2 | |
U+2861 ⡡ 9 2 | |
U+2862 ⡢ 5 2 | |
U+2863 ⡣ D 2 | |
U+2864 ⡤ 3 2 | |
U+2865 ⡥ B 2 | |
U+2866 ⡦ 7 2 | |
U+2867 ⡧ F 2 | |
U+2868 ⡨ 1 A | |
U+2869 ⡩ 9 A | |
U+286A ⡪ 5 A | |
U+286B ⡫ D A | |
U+286C ⡬ 3 A | |
U+286D ⡭ B A | |
U+286E ⡮ 7 A | |
U+286F ⡯ F A | |
U+2870 ⡰ 1 6 | |
U+2871 ⡱ 9 6 | |
U+2872 ⡲ 5 6 | |
U+2873 ⡳ D 6 | |
U+2874 ⡴ 3 6 | |
U+2875 ⡵ B 6 | |
U+2876 ⡶ 7 6 | |
U+2877 ⡷ F 6 | |
U+2878 ⡸ 1 E | |
U+2879 ⡹ 9 E | |
U+287A ⡺ 5 E | |
U+287B ⡻ D E | |
U+287C ⡼ 3 E | |
U+287D ⡽ B E | |
U+287E ⡾ 7 E | |
U+287F ⡿ F E | |
U+2880 ⢀ 0 1 | |
U+2881 ⢁ 8 1 | |
U+2882 ⢂ 4 1 | |
U+2883 ⢃ C 1 | |
U+2884 ⢄ 2 1 | |
U+2885 ⢅ A 1 | |
U+2886 ⢆ 6 1 | |
U+2887 ⢇ E 1 | |
U+2888 ⢈ 0 9 | |
U+2889 ⢉ 8 9 | |
U+288A ⢊ 4 9 | |
U+288B ⢋ C 9 | |
U+288C ⢌ 2 9 | |
U+288D ⢍ A 9 | |
U+288E ⢎ 6 9 | |
U+288F ⢏ E 9 | |
U+2890 ⢐ 0 5 | |
U+2891 ⢑ 8 5 | |
U+2892 ⢒ 4 5 | |
U+2893 ⢓ C 5 | |
U+2894 ⢔ 2 5 | |
U+2895 ⢕ A 5 | |
U+2896 ⢖ 6 5 | |
U+2897 ⢗ E 5 | |
U+2898 ⢘ 0 D | |
U+2899 ⢙ 8 D | |
U+289A ⢚ 4 D | |
U+289B ⢛ C D | |
U+289C ⢜ 2 D | |
U+289D ⢝ A D | |
U+289E ⢞ 6 D | |
U+289F ⢟ E D | |
U+28A0 ⢠ 0 3 | |
U+28A1 ⢡ 8 3 | |
U+28A2 ⢢ 4 3 | |
U+28A3 ⢣ C 3 | |
U+28A4 ⢤ 2 3 | |
U+28A5 ⢥ A 3 | |
U+28A6 ⢦ 6 3 | |
U+28A7 ⢧ E 3 | |
U+28A8 ⢨ 0 B | |
U+28A9 ⢩ 8 B | |
U+28AA ⢪ 4 B | |
U+28AB ⢫ C B | |
U+28AC ⢬ 2 B | |
U+28AD ⢭ A B | |
U+28AE ⢮ 6 B | |
U+28AF ⢯ E B | |
U+28B0 ⢰ 0 7 | |
U+28B1 ⢱ 8 7 | |
U+28B2 ⢲ 4 7 | |
U+28B3 ⢳ C 7 | |
U+28B4 ⢴ 2 7 | |
U+28B5 ⢵ A 7 | |
U+28B6 ⢶ 6 7 | |
U+28B7 ⢷ E 7 | |
U+28B8 ⢸ 0 F | |
U+28B9 ⢹ 8 F | |
U+28BA ⢺ 4 F | |
U+28BB ⢻ C F | |
U+28BC ⢼ 2 F | |
U+28BD ⢽ A F | |
U+28BE ⢾ 6 F | |
U+28BF ⢿ E F | |
U+28C0 ⣀ 1 1 | |
U+28C1 ⣁ 9 1 | |
U+28C2 ⣂ 5 1 | |
U+28C3 ⣃ D 1 | |
U+28C4 ⣄ 3 1 | |
U+28C5 ⣅ B 1 | |
U+28C6 ⣆ 7 1 | |
U+28C7 ⣇ F 1 | |
U+28C8 ⣈ 1 9 | |
U+28C9 ⣉ 9 9 | |
U+28CA ⣊ 5 9 | |
U+28CB ⣋ D 9 | |
U+28CC ⣌ 3 9 | |
U+28CD ⣍ B 9 | |
U+28CE ⣎ 7 9 | |
U+28CF ⣏ F 9 | |
U+28D0 ⣐ 1 5 | |
U+28D1 ⣑ 9 5 | |
U+28D2 ⣒ 5 5 | |
U+28D3 ⣓ D 5 | |
U+28D4 ⣔ 3 5 | |
U+28D5 ⣕ B 5 | |
U+28D6 ⣖ 7 5 | |
U+28D7 ⣗ F 5 | |
U+28D8 ⣘ 1 D | |
U+28D9 ⣙ 9 D | |
U+28DA ⣚ 5 D | |
U+28DB ⣛ D D | |
U+28DC ⣜ 3 D | |
U+28DD ⣝ B D | |
U+28DE ⣞ 7 D | |
U+28DF ⣟ F D | |
U+28E0 ⣠ 1 3 | |
U+28E1 ⣡ 9 3 | |
U+28E2 ⣢ 5 3 | |
U+28E3 ⣣ D 3 | |
U+28E4 ⣤ 3 3 | |
U+28E5 ⣥ B 3 | |
U+28E6 ⣦ 7 3 | |
U+28E7 ⣧ F 3 | |
U+28E8 ⣨ 1 B | |
U+28E9 ⣩ 9 B | |
U+28EA ⣪ 5 B | |
U+28EB ⣫ D B | |
U+28EC ⣬ 3 B | |
U+28ED ⣭ B B | |
U+28EE ⣮ 7 B | |
U+28EF ⣯ F B | |
U+28F0 ⣰ 1 7 | |
U+28F1 ⣱ 9 7 | |
U+28F2 ⣲ 5 7 | |
U+28F3 ⣳ D 7 | |
U+28F4 ⣴ 3 7 | |
U+28F5 ⣵ B 7 | |
U+28F6 ⣶ 7 7 | |
U+28F7 ⣷ F 7 | |
U+28F8 ⣸ 1 F | |
U+28F9 ⣹ 9 F | |
U+28FA ⣺ 5 F | |
U+28FB ⣻ D F | |
U+28FC ⣼ 3 F | |
U+28FD ⣽ B F | |
U+28FE ⣾ 7 F | |
U+28FF ⣿ F F |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment