盛思掌控板的固件中的mpython.py的优化库,大幅提高了尤其是图像处理和oled的效率。此文档只展示已优化的部分,其余部分请见mpython.py帮助文档
提示:适用于盛思掌控板的devlib已编译版本在位置debug调试版本和release发行版
本库提供了对掌控板按钮和触摸键的功能操作,包括检测按钮和触摸键是否被按下,以及为按钮和触摸键添加事件等。
有两个按钮对象button_a(button_A)和button_b(button_B),分别对应A和B按钮。这两个按钮对象由Button类创建,均继承machine.Pin。
class devlib.Button(pinname)按键类。
pinname:引脚编号。
Button.is_pressed() -> bool 返回按键是否被按住。True表示被按住,False表示未被按住。
Button.event_pressed: Callable(pin)按键被按下时触发的事件。此值可被修改,但应是一个具有一个输入参数的可调用对象。默认值为空函数。
pin:按键对应引脚的machine.Pin对象。
Button.event_released: Callable(pin)按键被释放时触发的事件。此值可被修改,但应是一个具有一个输入参数的可调用对象。默认值为空函数。
pin:按键对应引脚的machine.Pin对象。
Button.schedule_event: bool 是否将按键事件(即Button.event_pressed和Button.event_released)放在micropython.schedule内运行。放在micropython.schedule内运行意味着将按键事件安排在ISR(中断处理程序)之外运行,在按键事件运行时仍能检测中断触发信号,但容易导致按钮事件的重复触发。默认值为False。
自行查找。
有六个触摸键对象touchpad_p(touchpad_P)、touchpad_y(touchpad_Y)、touchpad_t(touchpad_T)、touchpad_h(touchpad_H)、touchpad_o(touchpad_O)和touchpad_n(touchpad_N),分别对应触摸键P、Y、T、H、O和N。这六个触摸键对象由Touch类创建,均继承machine.TouchPad。
class devlib.Touch(pin)触摸键类。
pin:需要被初始化为触摸键的引脚对象。
Touch.is_pressed() -> bool 返回触摸键是否被按住。True表示被按住,False表示未被按住。
Touch.value: Literal[0,1] 触摸键是否被按住的值。1表示被按住,0表示未被按住。
Touch.event_pressed: Callable(value)触摸键被按下时触发的事件。此值可被修改,但应是一个具有一个输入参数的可调用对象。默认值为空函数。
value:触摸键是否被按住的值。1表示被按住,0表示未被按住。
Touch.event_released: Callable(value)触摸键被释放时触发的事件。此值可被修改,但应是一个具有一个输入参数的可调用对象。默认值为空函数。
value:触摸键是否被按住的值。1表示被按住,0表示未被按住。
Touch.schedule_event: bool 是否将触摸键事件(即Touch.event_pressed和Touch.event_released)放在micropython.schedule内运行。放在micropython.schedule内运行意味着将触摸键事件安排在ISR(中断处理程序)之外运行,在触摸键事件运行时仍能检测中断触发信号,但容易导致触摸键事件的重复触发。默认值为False。
Touch.read() -> int读取触摸键的电平。当触摸时,是很小的数字(通常在20以内);当没有触摸时,是较大的数字(通常大于1000)。
Touch.config(value)设置触摸键的阈值。
value:整数阈值。当触摸键的电平小于阈值时,认为触摸键被按下。默认值为500。
其余的自行查找。
oled对象为重写过的来自mpython的ssd1106.SSD1106_I2C的衍生类,继承ssd1106.SSD1106_I2C和FrameBuffer的方法。相较于mpython拥有更好的性能表现和更丰富的玩法。
oled.DispChar(s,x,y,mode=Colormode.normal,out=Outmode.stop,*,maximum_x=128,space=1,newlinecode=True,return_x=0,return_addy=16,ellipsis="...",end="",buffer=None)显示文本。采用 Google Noto Sans CJK 开源无衬线字体字体。字体高度16像素点,支持英文,简体中文繁体中文,日文和韩文语言。
s:需要显示的文本x、y:文本的起始坐标(即文本的左上角坐标)mode:文本显示模式。默认为Colormode.normal。有这几种模式:Colormode.normal:正常显示。Colormode.reverse:反色显示。Colormode.nobg:正常显示,但是背景透明。Colormode.reverse_nobg:反转显示,并且背景透明。Colormode.xor:自动对每个字符切换显示模式。在字符显示前,如果字符显示的位置为黑,则使用Colormode.normal模式;否则使用Colormode.reverse模式。每个字符都按照上述逻辑自动切换显示模式。Colormode.xor_nobg:类似于Colormode.xor模式,但是每个字的背景都是透明的。Colormode.noshow:不显示字符,但仍会计数。当仅需获取统计数据而不显示文本时,这个参数十分有用。Colormode.black:将字符替换成等宽等高的黑色色块来显示。Colormode.white:将字符替换成等宽等高的白色色块来显示。Colormode.xor_fill:自动把每个字符转换成特定颜色的等宽等高色块来显示。在色块显示前,如果色块显示的位置为黑,则色块为黑,否则为白。Colormode.xor_fill_reverse:类似于Colormode.xor_fill模式,但是逻辑相反:如果色块显示的位置为黑,则色块为白,否则为黑。
out:文本超过x坐标最大值 (maximum_x) 时(本段称作超出范围)的处理方式。默认为Outmode.stop。有这几种模式:Outmode.keepon:继续绘制文本。Outmode.stop(推荐):停止显示。在文本超出范围时,该模式会让文字完整的显示在范围内。相比显示效果一模一样的Colormode.keepon更省时Outmode.stop2:停止显示,但更具有预见性。在文本超出范围时,该模式会让文字完全只显示在范围内Outmode.autoreturn(推荐):自动换行。当文本将要超出范围时,将剩余的文本安排到新的一行继续显示。这种模式更具有预见性,会使文本完全只显示在范围内。Outmode.autoreturn2:自动换行,与Outmode.autoreturn类似,但没有预见性,即文本可能会超出范围。Outmode.ellipsis(推荐):自动省略。当文本将要超出范围时,将剩余的文本用省略号代替,能确保文本不会超出范围。
maximum_x:文本的x坐标最大值。默认为128(即ssd1106屏幕宽度)。space:字符间距,默认为1newlinecode:是否启用换行符\n作为换行符。默认为True。如果为False,则换行符\n将被当做普通字符一样显示(通常为空)。return_x:新行文本的x坐标。当一段文本被安排到新的一行时,此参数决定了这段文本的初始x坐标。默认为0。return_addy:换行时文本增加的y坐标。当一段文本被安排到新的一行时,此参数决定了这段文本增加的y坐标。默认为16(即默认字体的高度)。ellipsis:省略值。当文本将要超出范围并且指定了out=Colormode.ellipsis时,剩余的文本将被此参数的值代替。默认为...(三个小数点) 。end:结束符。在文本显示结束时,将会接着显示此参数给定的值。默认为空字符串("")。当out=Outmode.ellipsis时,此参数给定的字符串不会被省略,而是会显示在省略号后面。buffer:自定义缓冲区。若指定了其值为FrameBuffer及其衍生类,则将会将文字绘制在指定的缓冲区上而不是oled。
返回一个由两个元组组成的元组:((w,h),(chars,returns))
w:文本的总宽度h:文本的总高度chars:文本的可用总字符数returns:文本的换行次数(若没有换行则为0)
end:需要显示thisisalongnamefile.txt,但是只希望自动省略文件名不省略后缀名时,可以指定s="thisisalongnamefile",out=Outmode.ellipsis,end=".txt"。最终会显示为thisisalongnam....txt。此时若将thisisalongnamefile替换成short,那么 最终会显示为short.txt。return_x:需要显示一段文字,能自动换行,但是希望这段文本只在右半边显示,那么可以指定out=Outmode.autoreturn,return_x=64。maxinum_x与buffer:需要将一段文字显示在FrameBuffer缓冲区buf内,但是buf的宽度只有72,那么可以指定maximum_x=72,buffer=buf。
oled.DispChar_font(font,s,x,y,mode=Colormode.normal,out=Outmode.stop,*,maximum_x=128,space=1,newlinecode=True,return_x=0,return_addy=16,ellipsis="...",end="",buffer=None)自定义字体显示。用户可根据自己需求,在将 otf 、 ttf 标准字体文件通过Python脚本 font-to-py.py 转为输出含字体Bitmap的python源码,放入掌控板文件系统中,并使用import导入调用。
font:字体对象。通过Python脚本 font-to-py.py 转为输出含字体Bitmap的python源码,放入掌控板文件系统中,并使用import导入调用。s:需要显示的文本x、y:文本的起始坐标(即文本的左上角坐标)mode:文本显示模式。默认为Colormode.normal。有这几种模式:Colormode.normal:正常显示。Colormode.reverse:反色显示。Colormode.nobg:正常显示,但是背景透明。Colormode.reverse_nobg:反转显示,并且背景透明。Colormode.xor:自动对每个字符切换显示模式。在字符显示前,如果字符显示的位置为黑,则使用Colormode.normal模式;否则使用Colormode.reverse模式。每个字符都按照上述逻辑自动切换显示模式。Colormode.xor_nobg:类似于Colormode.xor模式,但是每个字的背景都是透明的。Colormode.noshow:不显示字符,但仍会计数。当仅需获取统计数据而不显示文本时,这个参数十分有用。Colormode.black:将字符替换成等宽等高的黑色色块来显示。Colormode.white:将字符替换成等宽等高的白色色块来显示。Colormode.xor_fill:自动把每个字符转换成特定颜色的等宽等高色块来显示。在色块显示前,如果色块显示的位置为黑,则色块为黑,否则为白。Colormode.xor_fill_reverse:类似于Colormode.xor_fill模式,但是逻辑相反:如果色块显示的位置为黑,则色块为白,否则为黑。
out:文本超过x坐标最大值 (maximum_x) 时(本段称作超出范围)的处理方式。默认为Outmode.stop。有这几种模式:Outmode.keepon:继续绘制文本。Outmode.stop(推荐):停止显示。在文本超出范围时,该模式会让文字完整的显示在范围内。相比显示效果一模一样的Colormode.keepon更省时Outmode.stop2:停止显示,但更具有预见性。在文本超出范围时,该模式会让文字完全只显示在范围内Outmode.autoreturn(推荐):自动换行。当文本将要超出范围时,将剩余的文本安排到新的一行继续显示。这种模式更具有预见性,会使文本完全只显示在范围内。Outmode.autoreturn2:自动换行,与Outmode.autoreturn类似,但没有预见性,即文本可能会超出范围。Outmode.ellipsis(推荐):自动省略。当文本将要超出范围时,将剩余的文本用省略号代替,能确保文本不会超出范围。
maximum_x:文本的x坐标最大值。默认为128(即ssd1106屏幕宽度)。space:字符间距,默认为1newlinecode:是否启用换行符\n作为换行符。默认为True。如果为False,则换行符\n将被当做普通字符一样显示(通常为空)。return_x:新行文本的x坐标。当一段文本被安排到新的一行时,此参数决定了这段文本的初始x坐标。默认为0。return_addy:换行时文本增加的y坐标。当一段文本被安排到新的一行时,此参数决定了这段文本增加的y坐标。默认为16(即默认字体的高度)。ellipsis:省略值。当文本将要超出范围并且指定了out=Colormode.ellipsis时,剩余的文本将被此参数的值代替。默认为...(三个小数点) 。end:结束符。在文本显示结束时,将会接着显示此参数给定的值。默认为空字符串("")。当out=Outmode.ellipsis时,此参数给定的字符串不会被省略,而是会显示在省略号后面。buffer:自定义缓冲区。若指定了其值为FrameBuffer及其衍生类,则将会将文字绘制在指定的缓冲区上而不是oled。
返回一个由两个元组组成的元组:((w,h),(chars,returns))
w:文本的总宽度h:文本的总高度chars:文本的可用总字符数returns:文本的换行次数(若没有换行则为0)
oled._reverse(buf:bytearray) 工具函数,已经过原生代码优化。将buf中的所有内容反转。不返回值。在需要反色时非常有用。
buf:需要反转的缓冲区。
oled.show()刷新OLED内容(将缓冲区的内容发送至OLED显示)。
oled.contrast(value)设置OLED亮度。
value:亮度值。范围为0-255。
oled.invert(n)是否反转显示。反转对之后的每一次显示都有效。
n:是否反转显示的值。1为反转,0为不反转。
oled.poweron()
开启OLED电源。
oled.poweroff()关闭OLED电源。
oled.init_display()初始化(重新初始化)OLED显示。
oled.fill(c)使用指定颜色填充整个缓冲区。
c:颜色值
oled.pixel(x,y[,c]) -> int | None获取或设定指定像素点的颜色值。
x、y:像素点的坐标c:如果指定了此值,那么将指定像素的颜色设为此值并返回None(即无返回值);如果未指定,则返回指定像素的颜色值。
oled.hline(x,y,w,c)从指定坐标开始绘制指定长度的水平线。
x、y:水平线的起始坐标w:水平线的长度。将会从起始坐标的右侧(x+)延伸w个像素形成水平线。若此值为负,则不绘制。c:颜色值
oled.vline(x,y,h,c)从指定坐标开始绘制指定长度的垂直线。
x、y:垂直线的起始坐标h:垂直线的长度。将会从起始坐标的下方(y+)延伸h个像素形成垂直线。若此值为负,则不绘制。c:颜色值
oled.line(x1,y1,x2,y2,c)在两个坐标之间绘制一条直线。
x1、y1:直线的起始坐标x2、y2:直线的结束坐标c:颜色值
oled.rect(x,y,w,h,c)绘制一个空心矩形。
x、y:矩形的起始坐标w:矩形的宽度h:矩形的高度c:颜色值
oled.fill_rect(x,y,w,h,c)绘制一个实心矩形。
x、y:矩形的起始坐标w:矩形的宽度h:矩形的高度c:颜色值
oled.circle(x,y,r,c)绘制一个空心圆。
x、y:圆的中心坐标r:圆的半径c:颜色值
oled.fill_circle(x,y,r,c)绘制一个实心圆。
x、y:圆的中心坐标r:圆的半径c:颜色值
oled.quarter_circle(x,y,r,code,c)
oled.drawCircleHelper(x,y,r,code,c)按照二进制数绘制一些同心的四分之一圆。
-
x、y:圆的中心坐标 -
r:圆的半径 -
code:二进制数,用于指定需要的四分之一圆。例如,0b1010将会绘制一个右上部分和左下部分的四分之一圆。具体值参照表:二进制数 圆的部位 0b0001(1)左上部分(第一象限) 0b0010(2)右上部分(第二象限) 0b0100(4)右下部分(第三象限) 0b1000(8)左下部分(第四象限) 0b0011(3)右上部分和左上部分 0b1001(9)左下部分和左上部分 . . . . . . . . . . . . 0b1111(15)整个圆(包含四个部分) 注:数为普通的
int类型值,且只取二进制后四位进行指定。 -
c:颜色值
oled.round_rect(x,y,w,h,r,c)
oled.RoundRect(x,y,w,h,r,c)绘制一个弧角矩形。
x、y:弧角矩形的左上角坐标w:弧角矩形的宽度h:弧角矩形的高度r:弧角半径c:颜色值
oled.triangle(x0,y0,x1,y1,x2,y2,c)绘制一个空心三角形。
x0、y0:第一个顶点的坐标x1、y1:第二个顶点的坐标x2、y2:第三个顶点的坐标c:颜色值
oled.fill_triangle(x0,y0,x1,y1,x2,y2,c)绘制一个实心三角形。
x0、y0:第一个顶点的坐标x1、y1:第二个顶点的坐标x2、y2:第三个顶点的坐标c:颜色值
oled.bitmap(x,y,bitmap,w,h,X)
oled.Bitmap(x,y,bitmap,w,h,X)在指定的位置显示一个图像。
x、y:图像的左上角坐标bitmap:图像数据。类型为bytearray,内容格式为framebuf.MONO_HLSB。w:图像的宽度h:图像的高度X:无效变量。这个变量的值不影响显示效果。建议值为1。
oled.blit(fbuf,x,y[,key]) 在给定的坐标将一个FrameBuffer的内容覆盖在当前缓冲区上。
fbuf:需要覆盖的FrameBuffer缓冲区。x、y:覆盖的左上角坐标。key:若指定了此值,那么此颜色值将会被替换为透明色(即不绘制此颜色值的像素)。
oled.text(s,x,y[,c])在给定的坐标显示内置字体的文本。文本的背景是透明的。所有字符的尺寸均为8x8像素。
s:文本内容。x、y:文本的左上角坐标。c:文本的颜色值。若指定了此值,那么文本将会用此颜色值显示,否则使用默认颜色值(即白色)。
oled.scroll(xstep,ystep)沿指定的步长移动缓冲区上的内容。
xstep:沿x轴移动的步长。若此值为正,则向右(x+)移动;若此值为负,则向左(x-)移动;若此值为0,则不移动。ystep:沿y轴移动的步长。若此值为正,则向下(y+)移动;若此值为负,则向上(y-)移动;若此值为0,则不移动。
可能会留下之前的颜色足迹。
内嵌参数为初始化时所调用的一些特殊参数,这些参数在初始化后就会无效。若需更改,请在本库的源代码中修改。
devlib.overclock: bool #line 15 是否开启I2C总线超频,默认为True。开启超频后,I2C总线频率将从标准频率400KHz提升至1250KHz,能够更快地与内外设进行通信,但可能会降低I2C总线的稳定性。若连接了P19和P20引脚的I2C外设在超频时无法正常工作,则应关闭超频。
devlib.font_address: int #line 42 字体分区的起始地址,默认为0x400000。字体分区决定了oled.DispChar时调用的字体。
devlib.maximum_fontbitmaplen: int #line 43 字体图像的最大字节大小,默认为64,用于oled.DispChar的缓冲优化。该值由统计得出。