From bd12a078c723ecb6bc7455b57b20834dff7e7b33 Mon Sep 17 00:00:00 2001 From: Walkline Wang Date: Thu, 26 Aug 2021 13:47:53 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=9F=A5=E6=89=BE?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E9=80=BB=E8=BE=91=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fontlib.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/fontlib.py b/fontlib.py index 8323ff3..50a7560 100644 --- a/fontlib.py +++ b/fontlib.py @@ -100,11 +100,24 @@ class FontLib(object): elif self.__is_gb2312(unicode): gb2312_index = struct.pack('= 0: + if seek_offset % 2 == 0: + return seek_offset + else: + continue + else: + return False + for offset in range(self.__header.index_table_address, self.__header.ascii_start, 1000): font_file.seek(offset) - char_index_offset = font_file.read(1000).find(gb2312_index) - if char_index_offset >= 0: + char_index_offset = __seek(font_file.read(1000), gb2312_index) + if char_index_offset: char_index_offset += offset break else: -- Gitee From 38c6e804ee56b796763f3dfc8687be62e00185dd Mon Sep 17 00:00:00 2001 From: Walkline Wang Date: Thu, 26 Aug 2021 13:50:02 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20ab=20=E5=B7=A5?= =?UTF-8?q?=E5=85=B7=E6=B5=8B=E8=AF=95=E5=AD=97=E8=8A=82=E7=A0=81=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- abconfig-mpy | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 abconfig-mpy diff --git a/abconfig-mpy b/abconfig-mpy new file mode 100644 index 0000000..91ece2d --- /dev/null +++ b/abconfig-mpy @@ -0,0 +1,5 @@ +client/combined.bin +# client/customize.bin +drivers/ssd1306.py +libs/fontlib.mpy +main.py -- Gitee From d73ea19008dabd0bc678d46b42d1a695b785e0a8 Mon Sep 17 00:00:00 2001 From: Walkline Wang Date: Thu, 26 Aug 2021 13:50:57 +0800 Subject: [PATCH 3/7] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AD=97=E8=8A=82?= =?UTF-8?q?=E7=A0=81=E6=B5=8B=E8=AF=95=E7=9B=B8=E5=85=B3=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs/fontlib.mpy | Bin 0 -> 2074 bytes libs/fontlib.py | 161 +++++++++++++++++++++++++++++++++++++++++++++++ main.py | 89 ++++++++++++++++++++++++++ 3 files changed, 250 insertions(+) create mode 100644 libs/fontlib.mpy create mode 100644 libs/fontlib.py create mode 100644 main.py diff --git a/libs/fontlib.mpy b/libs/fontlib.mpy new file mode 100644 index 0000000000000000000000000000000000000000..025e561affa322b1826989e4b0f254131f6f835c GIT binary patch literal 2074 zcmZuy+fx%)7(cs7NCE`*<`NNgB?zgCLP*mY#HvfcWVp#qgxYSC%|cc~LbD5sRyp9% zYKL*Aed?n#{RcLIw%SLu7yIf=JGJejZ+%jy?OXeugiB((o5|VpUC#N=_x--#8F0`C zrIm!Y9yx{SOxjH8@#Axg@1OA})9HKr5gy)WpHW2$#%jaN&a0+KjRg>MtQTzi^>{>! zCA4hMHC3B4^-P*YO+g#6pcrY(;=ekYsW0)dNn-J^3d|L#&500LQ zjJ6CQ4qeFwDbB$=eha%W=l0P-O5;32^?Z6Rre5*cav{2{((*ETLQ9+a^rGeEruCGj z82WY1@`}@t5+$kWGfC6(3TiTzjj5)VH7xIeWXw?XbV9qPn6Y>Yj5$M%rIp!C0=|X# zqNypFEF=qTV85dbs%(COcn~M5N~5oG`$c@ z=?SSQlu}xH#!MQXuAmW>BeE<rsYA!aXBO|ERn? zAvW#WUFaDZi*~J7~r?qUrE;f|u z4VIb9X67KA#egG7i6>cG0E$=`oiMh;+y&!l7~L?w31cOh2dYGuo}SJCc&l%B4b~&} z1nxN8)7E)VMmYeOq7=|aGM|pkYQun11+Yk(lS2y@Z)5D)c#uBVi8i@YoG`1+X0nS5 zx^^`$pqreHKOLfi@LJv~OE{G0&{c*$9i&>R5KX>8Gj4hPiZYjqsai6Vf@QakIDF|{ z4j4kHQ8THOrkWu%N!kv+={})Ub@4(&N%}3rkGH~0|5joz}G}IDNTDn^Y&%J?; zp+|Y8?-2|YGxy7tzsR_UgjorPa1)p4QckGi(0gA7 zDcFqcMZBFM>c?-0x@C#;2|g&oIDFSLG&o6^s(six=;Z$1lZaroJ0O&$r9T0>mgbNKotR0!k}Sy z%`Rbj@O1?F;~fR)fU1N)o%j~$oVz-o6R(s@b}8G5KPp$1GPo0eQm(9Z;(H~M760&o zLPt9Br*~XU@Ekn~=e^;h1T<#xdo6+(_|XV|-^PSR-o0Sqgq`M_@*+^TW0^1gEoNbXLk= 0: + if seek_offset % 2 == 0: + return seek_offset + else: + continue + else: + return False + + for offset in range(self.__header.index_table_address, self.__header.ascii_start, 1000): + font_file.seek(offset) + + char_index_offset = __seek(font_file.read(1000), gb2312_index) + if char_index_offset: + char_index_offset += offset + break + else: + buffer_list[unicode] = self.__placeholder_buffer + continue + + char_offset = self.__header.gb2312_start + (char_index_offset - self.__header.index_table_address) / 2 * self.__header.data_size + else: + buffer_list[unicode] = self.__placeholder_buffer + continue + + font_file.seek(int(char_offset)) + info_data = font_file.read(self.__header.data_size) + + buffer_list[unicode] = info_data + + gc.collect() + return buffer_list + + def get_characters(self, characters: str): + with open(self.__font_filename, 'rb') as font_file: + unicode_set = set() + for char in characters: + unicode_set.add(ord(char)) + + return self.__get_character_unicode_buffer(font_file, unicode_set) + + @property + def scan_mode(self): + return self.__header.scan_mode + + @property + def byte_order(self): + return self.__header.byte_order + + @property + def data_size(self): + return self.__header.data_size + + @property + def file_size(self): + return self.__header.file_size + + @property + def font_height(self): + return self.__header.font_height + + @property + def characters(self): + return self.__header.characters + + def info(self): + print('\ +HZK Info: {}\n\ + file size : {}\n\ + font height : {}\n\ + data size : {}\n\ + scan mode : {}\n\ + byte order : {}\n\ + characters : {}\n'.format( + self.__font_filename, + self.file_size, + self.font_height, + self.data_size, + FontLib.SCAN_MODE[self.scan_mode], + FontLib.BYTE_ORDER[self.byte_order], + self.characters + )) diff --git a/main.py b/main.py new file mode 100644 index 0000000..1855615 --- /dev/null +++ b/main.py @@ -0,0 +1,89 @@ +""" +The MIT License (MIT) +Copyright © 2021 Walkline Wang (https://walkline.wang) +Gitee: https://gitee.com/walkline/micropython-new-fontlib +""" +from utime import ticks_us, ticks_diff, ticks_cpu +from machine import I2C, Pin +from drivers.ssd1306 import SSD1306_I2C +import framebuf +from libs.fontlib import FontLib + + +class FontLibTest(object): + def __init__(self, oled=None): + self.__fontlib = None + self.__oled = oled + self.__oled_width = None + self.__oled_height = None + + if self.__oled: + self.__oled_width = self.__oled.width + self.__oled_height = self.__oled.height + + def load_font(self, font_file): + start_time = ticks_us() + self.__fontlib = FontLib(font_file) + print('### load font file: {} ms'.format(ticks_diff(ticks_us(), start_time) / 1000)) + self.__fontlib.info() + + def run_test1(self, chars=None): + start_time = ticks_us() + buffer_dict = self.__fontlib.get_characters(chars) + diff_time = ticks_diff(ticks_us(), start_time) / 1000 + print('### get {} chars: {} ms, avg: {} ms'.format(len(chars), diff_time, diff_time / len(chars))) + + format = framebuf.MONO_VLSB + + if self.__fontlib.scan_mode == FontLib.SCAN_MODE_HORIZONTAL: + format = framebuf.MONO_HMSB if self.__fontlib.byte_order == FontLib.BYTE_ORDER_MSB else framebuf.MONO_HLSB + + x = y = 0 + width = height = self.__fontlib.font_height + + start_time = ticks_us() + for char in chars: + if ord(char) == 10: + x = 0 + y += height + continue + + buffer = buffer_dict[ord(char)] + + if x > ((self.__oled_width // width - 1) * width): + x = 0 + y += height + + self.__show(buffer, width, height, x, y, format) + x += width + diff_time = ticks_diff(ticks_us(), start_time) / 1000 + print('### show {} chars: {} ms, avg: {} ms'.format(len(chars), diff_time, diff_time / len(chars))) + + def __show(self, buffer, width, height, x, y, format): + fb = framebuf.FrameBuffer(bytearray(buffer), width, height, format) + oled.blit(fb, x, y) + oled.show() + +chars =\ +'''  问题,到底应该如何实现。 +  既然如此,我们都知道,只要有意义,那么就必须慎重考虑。 +  现在,解决问题的问题,是非常非常重要的。 +  所以,在这种困难的抉择下,本人思来想去,寝食难安。 +  要想清楚,问题,到底是一种怎么样的存在。 +  一般来说,生活中,若问题出现了,我们就不得不考虑它出现了的事实。 +  维龙曾经说过,要成功不需要什么特别的才能,只要把你能做的小事做得好就行了。 +  这似乎解答了我的疑惑。 +  这种事实对本人来说意义重大,相信对这个世界也是有一定意义的。 +''' + + +if __name__ == '__main__': + i2c = I2C(0, scl=Pin(18), sda=Pin(19)) + slave_list = i2c.scan() + + if slave_list: + oled = SSD1306_I2C(128, 64, i2c) + + runner = FontLibTest(oled) + runner.load_font('client/combined.bin') + runner.run_test1(chars) -- Gitee From 7d5b0918456065ce17b584e66df5ea9746b5a5bc Mon Sep 17 00:00:00 2001 From: Walkline Wang Date: Thu, 26 Aug 2021 15:04:55 +0800 Subject: [PATCH 4/7] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fontlib.py | 6 +++--- libs/fontlib.py | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/fontlib.py b/fontlib.py index 50a7560..8385433 100644 --- a/fontlib.py +++ b/fontlib.py @@ -101,7 +101,7 @@ class FontLib(object): gb2312_index = struct.pack('= 0: char_index_offset += offset break else: diff --git a/libs/fontlib.py b/libs/fontlib.py index 4b538a8..a5be34e 100644 --- a/libs/fontlib.py +++ b/libs/fontlib.py @@ -74,7 +74,7 @@ class FontLib(object): gb2312_index = struct.pack('= 0: char_index_offset += offset break else: -- Gitee From bd9c1398ad0ccd66daac024ef025750a09864740 Mon Sep 17 00:00:00 2001 From: Walkline Wang Date: Thu, 26 Aug 2021 15:06:56 +0800 Subject: [PATCH 5/7] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs/fontlib.mpy | Bin 2074 -> 2076 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/libs/fontlib.mpy b/libs/fontlib.mpy index 025e561affa322b1826989e4b0f254131f6f835c..2090a2c1e95d51749bb5ccc9a8ec3ff8b76f2206 100644 GIT binary patch delta 158 zcmV;P0Ac@{5S$ROvIHkEqYyk31%N|CCMq{7O@j?HNG>KMPbWxUCqpexM=1a-0K>9h zOW2dy1SblVfUpz~v^D`mfRhRZI6f(WSIDsx2ydv};?wSlb42L(xdtaM; zlSQ3tQo{xj{w-#VE_IW+SS@VS8^TX)6yYdNP0ik6#u&MMqX&H<@(6T4Z@0>w}d&BPi|l}Qt+(bD8eno5VzHY5vU)eeSXR?AS}`_E=4Df24A^YI_J$Dv1b94> -- Gitee From 18139eef8780ad2ac1ab911038b79dd5f3a5189d Mon Sep 17 00:00:00 2001 From: Walkline Wang Date: Thu, 26 Aug 2021 17:24:29 +0800 Subject: [PATCH 6/7] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=A4=E7=A7=8D?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E6=96=B9=E6=B3=95=EF=BC=8C=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 98 insertions(+), 8 deletions(-) diff --git a/main.py b/main.py index 1855615..bbe664a 100644 --- a/main.py +++ b/main.py @@ -3,7 +3,7 @@ The MIT License (MIT) Copyright © 2021 Walkline Wang (https://walkline.wang) Gitee: https://gitee.com/walkline/micropython-new-fontlib """ -from utime import ticks_us, ticks_diff, ticks_cpu +from utime import ticks_us, ticks_diff, sleep from machine import I2C, Pin from drivers.ssd1306 import SSD1306_I2C import framebuf @@ -13,6 +13,7 @@ from libs.fontlib import FontLib class FontLibTest(object): def __init__(self, oled=None): self.__fontlib = None + self.__buffer_format = None self.__oled = oled self.__oled_width = None self.__oled_height = None @@ -26,23 +27,56 @@ class FontLibTest(object): self.__fontlib = FontLib(font_file) print('### load font file: {} ms'.format(ticks_diff(ticks_us(), start_time) / 1000)) self.__fontlib.info() + self.__buffer_format = self.__get_format() def run_test1(self, chars=None): + if self.__oled is None or chars is None: + return + start_time = ticks_us() buffer_dict = self.__fontlib.get_characters(chars) diff_time = ticks_diff(ticks_us(), start_time) / 1000 print('### get {} chars: {} ms, avg: {} ms'.format(len(chars), diff_time, diff_time / len(chars))) - format = framebuf.MONO_VLSB + x = y = 0 + width = height = self.__fontlib.font_height - if self.__fontlib.scan_mode == FontLib.SCAN_MODE_HORIZONTAL: - format = framebuf.MONO_HMSB if self.__fontlib.byte_order == FontLib.BYTE_ORDER_MSB else framebuf.MONO_HLSB + start_time = ticks_us() + for char in chars: + if ord(char) == 10: + x = 0 + y += height + continue + + buffer = buffer_dict[ord(char)] + + if x > ((self.__oled_width // width - 1) * width): + x = 0 + y += height + + if y > ((self.__oled_height // height - 1) * height): + x = 0 + y = 0 + sleep(1.5) + self.__oled.fill(0) + self.__oled.show() + + self.__show(buffer, width, height, x, y, self.__buffer_format) + x += width + diff_time = ticks_diff(ticks_us(), start_time) / 1000 + print('### show {} chars: {} ms, avg: {} ms'.format(len(chars), diff_time, diff_time / len(chars))) + + def run_test2(self, chars=None): + if self.__oled is None or chars is None: + return x = y = 0 width = height = self.__fontlib.font_height start_time = ticks_us() for char in chars: + buffer_dict = self.__fontlib.get_characters(char) + if ord(char) == 10: x = 0 y += height @@ -54,15 +88,67 @@ class FontLibTest(object): x = 0 y += height - self.__show(buffer, width, height, x, y, format) + if y > ((self.__oled_height // height - 1) * height): + x = 0 + y = 0 + sleep(1.5) + self.__oled.fill(0) + self.__oled.show() + + self.__show(buffer, width, height, x, y, self.__buffer_format) x += width diff_time = ticks_diff(ticks_us(), start_time) / 1000 print('### show {} chars: {} ms, avg: {} ms'.format(len(chars), diff_time, diff_time / len(chars))) - def __show(self, buffer, width, height, x, y, format): + def run_test3(self, chars=None): + if self.__oled is None or chars is None: + return + + start_time = ticks_us() + buffer_dict = self.__fontlib.get_characters(chars) + diff_time = ticks_diff(ticks_us(), start_time) / 1000 + print('### get {} chars: {} ms, avg: {} ms'.format(len(chars), diff_time, diff_time / len(chars))) + + x = y = 0 + width = height = self.__fontlib.font_height + + for char in chars: + if ord(char) == 10: + x = 0 + y += height + continue + + buffer = buffer_dict[ord(char)] + + if x > ((self.__oled_width // width - 1) * width): + x = 0 + y += height + + if y > ((self.__oled_height // height - 1) * height): + self.__oled.show() + sleep(3) + self.__oled.fill(0) + self.__oled.show() + x = y = 0 + + self.__show(buffer, width, height, x, y, self.__buffer_format, False) + x += width + + self.__oled.show() + + def __get_format(self): + format = framebuf.MONO_VLSB + + if self.__fontlib.scan_mode == FontLib.SCAN_MODE_HORIZONTAL: + format = framebuf.MONO_HMSB if self.__fontlib.byte_order == FontLib.BYTE_ORDER_MSB else framebuf.MONO_HLSB + + return format + + def __show(self, buffer, width, height, x, y, format, show=True): fb = framebuf.FrameBuffer(bytearray(buffer), width, height, format) oled.blit(fb, x, y) - oled.show() + if show: oled.show() + chars =\ '''  问题,到底应该如何实现。 @@ -75,6 +161,7 @@ chars =\   这似乎解答了我的疑惑。   这种事实对本人来说意义重大,相信对这个世界也是有一定意义的。 ''' +chars2 = '几凡也习丰井无勿正轧占田它地因网乔乒仿次军她巡寿找批走抗扭估体伯饮即妙到贤忠咏使周兔泡陕' if __name__ == '__main__': @@ -86,4 +173,7 @@ if __name__ == '__main__': runner = FontLibTest(oled) runner.load_font('client/combined.bin') - runner.run_test1(chars) + + runner.run_test1(chars) # 一次性读取所有字符数据然后逐个显示 + # runner.run_test2(chars) # 一次读取并显示一个字符数据 + # runner.run_test3(chars) # 一次读取一屏并显示 -- Gitee From 6c09894f7f2e6db970fcc4a4932d85d1a8d965d8 Mon Sep 17 00:00:00 2001 From: Walkline Wang Date: Thu, 26 Aug 2021 17:34:02 +0800 Subject: [PATCH 7/7] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=AF=B4=E6=98=8E?= =?UTF-8?q?=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 0ff2c51..72c07cf 100644 --- a/README.md +++ b/README.md @@ -182,7 +182,7 @@ o: b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00<\x00B\x00B\x00B\x0 ...@........@... ``` -#### 使用开发板测试 +#### 使用开发板测试 1 推荐使用 [AMPY Batch Tool](https://gitee.com/walkline/a-batch-tool) (`ab`工具) 进行文件上传和调试操作 @@ -212,14 +212,17 @@ Choose a file: 1 >>> ``` -也可以使用相关软件上传如下代码到开发板,运行`fontlib.py`即可 +#### 使用开发板测试 2 + +这是把`fontlib.py`文件中非`MicroPython`代码精简掉,并编译为字节码再运行测试的方法 ```bash -drivers/ssd1306.py -client/combined.bin -fontlib.py +# 上传文件 +$ ab abconfig-mpy ``` +因为上传文件中已经包含了`main.py`,所以直接复位就可以看到效果了 + ### 关于速度 > 以当前字库文件举例: -- Gitee