build(boards): micropython板卡执行 npm run build:prod

This commit is contained in:
王立帮
2025-06-18 23:43:04 +08:00
parent e42a129714
commit 0d8b8b3170
61 changed files with 867 additions and 124 deletions

View File

@@ -0,0 +1,96 @@
"""
AGS10
Micropython library for the AGS10(TVOC)
=======================================================
@dahanzimin From the Mixly Team
"""
import time
from micropython import const
_AGS10_ADC = const(0x00)
_AGS10_CAL = const(0x01)
_AGS10_RES = const(0x20)
_AGS10_ADD = const(0x21)
class AGS10:
def __init__(self, i2c_bus, address=0x1A, delay=1000):
self._i2c = i2c_bus
self._addr = address
self._voc = None
self._delay = delay
self._star = 0
def _crc8(self, buf, is_byte=False):
'''Perform CRC check on the data'''
crc = 0xff
for byte in buf:
crc ^= byte
for _ in range(8):
if crc & 0x80:
crc = (crc << 1) ^ 0x31
else:
crc = crc << 1
return crc.to_bytes(1, 'little') if is_byte else crc & 0xff
def _wreg(self, reg, buf):
'''Write memory address'''
self._i2c.writeto_mem(self._addr, reg, buf)
time.sleep_ms(20)
def _rreg(self, reg, nbytes=5):
'''Read memory address'''
_buf = self._i2c.readfrom_mem(self._addr, reg, nbytes)
time.sleep_ms(20)
return _buf[:4] if self._crc8(_buf[:4]) == _buf[4] else None
def address(self, addr=None):
_scan = self._i2c.scan()
if addr is None:
if self._addr in _scan:
return self._addr
elif len(_scan) == 1:
self._addr = _scan[0]
return self._addr
else:
return None
else:
if self.address():
if 8<= addr <=119:
_buf = bytes([addr, (~ addr) & 0xff] * 2)
self._wreg(_AGS10_ADD, _buf + self._crc8(_buf, True))
if addr in self._i2c.scan():
self._addr = addr
return True
else:
raise ValueError("Not within the valid range of 8-119")
def calibration(self, zero=1):
'''0: Factory restoration 1:Sensor resistance'''
_buf = b'\x00\x0c'
_buf += b'\x00\x00' if zero else b'\xff\xff'
self._wreg(_AGS10_ADD, _buf + self._crc8(_buf, True))
@property
def getdata(self):
if time.ticks_diff(time.ticks_ms(), self._star) >= self._delay:
self._star = time.ticks_ms()
_buf = self._rreg(_AGS10_ADC)
if (_buf[0] & 0x01) == 0:
self._voc = int.from_bytes(_buf[1:4], 'big')
return self._voc / 1000
def read(self, hcho_mw=30.033 , co2_mv=0.853, co2_base=400):
'''unit ppm'''
self.getdata
_voc = self._voc / 1000 #ppm
return round( _voc, 2), round( _voc / hcho_mw, 2), co2_base + round( _voc / co2_mv, 2)
def tvoc(self):
return self.read()[0]
def hcho(self, tvoc_mw=30.053):
return self.read(hcho_mw=hcho_mw)[1]
def eco2(self, co2_mv=0.853):
return self.read(co2_mv=co2_mv)[2]

View File

@@ -0,0 +1,480 @@
#! /usr/bin/env python3
"""RFC 3548: Base16, Base32, Base64 Data Encodings"""
# Modified 04-Oct-1995 by Jack Jansen to use binascii module
# Modified 30-Dec-2003 by Barry Warsaw to add full RFC 3548 support
# Modified 22-May-2007 by Guido van Rossum to use bytes everywhere
import re
import struct
import binascii
__all__ = [
# Legacy interface exports traditional RFC 1521 Base64 encodings
"encode",
"decode",
"encodebytes",
"decodebytes",
# Generalized interface for other encodings
"b64encode",
"b64decode",
"b32encode",
"b32decode",
"b16encode",
"b16decode",
# Standard Base64 encoding
"standard_b64encode",
"standard_b64decode",
# Some common Base64 alternatives. As referenced by RFC 3458, see thread
# starting at:
#
# http://zgp.org/pipermail/p2p-hackers/2001-September/000316.html
"urlsafe_b64encode",
"urlsafe_b64decode",
]
bytes_types = (bytes, bytearray) # Types acceptable as binary data
def _bytes_from_decode_data(s):
if isinstance(s, str):
try:
return s.encode("ascii")
# except UnicodeEncodeError:
except:
raise ValueError("string argument should contain only ASCII characters")
elif isinstance(s, bytes_types):
return s
else:
raise TypeError("argument should be bytes or ASCII string, not %s" % s.__class__.__name__)
def _maketrans(f, t):
"""Re-implement bytes.maketrans() as there is no such function in micropython"""
if len(f) != len(t):
raise ValueError("maketrans arguments must have same length")
translation_table = dict(zip(f, t))
return translation_table
def _translate(input_bytes, trans_table):
"""Re-implement bytes.translate() as there is no such function in micropython"""
result = bytearray()
for byte in input_bytes:
translated_byte = trans_table.get(byte, byte)
result.append(translated_byte)
return bytes(result)
# Base64 encoding/decoding uses binascii
def b64encode(s, altchars=None):
"""Encode a byte string using Base64.
s is the byte string to encode. Optional altchars must be a byte
string of length 2 which specifies an alternative alphabet for the
'+' and '/' characters. This allows an application to
e.g. generate url or filesystem safe Base64 strings.
The encoded byte string is returned.
"""
if not isinstance(s, bytes_types):
raise TypeError("expected bytes, not %s" % s.__class__.__name__)
# Strip off the trailing newline
encoded = binascii.b2a_base64(s)[:-1]
if altchars is not None:
if not isinstance(altchars, bytes_types):
raise TypeError("expected bytes, not %s" % altchars.__class__.__name__)
assert len(altchars) == 2, repr(altchars)
encoded = _translate(encoded, _maketrans(b"+/", altchars))
return encoded
def b64decode(s, altchars=None, validate=False):
"""Decode a Base64 encoded byte string.
s is the byte string to decode. Optional altchars must be a
string of length 2 which specifies the alternative alphabet used
instead of the '+' and '/' characters.
The decoded string is returned. A binascii.Error is raised if s is
incorrectly padded.
If validate is False (the default), non-base64-alphabet characters are
discarded prior to the padding check. If validate is True,
non-base64-alphabet characters in the input result in a binascii.Error.
"""
s = _bytes_from_decode_data(s)
if altchars is not None:
altchars = _bytes_from_decode_data(altchars)
assert len(altchars) == 2, repr(altchars)
s = _translate(s, _maketrans(altchars, b"+/"))
if validate and not re.match(b"^[A-Za-z0-9+/]*=*$", s):
raise binascii.Error("Non-base64 digit found")
return binascii.a2b_base64(s)
def standard_b64encode(s):
"""Encode a byte string using the standard Base64 alphabet.
s is the byte string to encode. The encoded byte string is returned.
"""
return b64encode(s)
def standard_b64decode(s):
"""Decode a byte string encoded with the standard Base64 alphabet.
s is the byte string to decode. The decoded byte string is
returned. binascii.Error is raised if the input is incorrectly
padded or if there are non-alphabet characters present in the
input.
"""
return b64decode(s)
# _urlsafe_encode_translation = _maketrans(b'+/', b'-_')
# _urlsafe_decode_translation = _maketrans(b'-_', b'+/')
def urlsafe_b64encode(s):
"""Encode a byte string using a url-safe Base64 alphabet.
s is the byte string to encode. The encoded byte string is
returned. The alphabet uses '-' instead of '+' and '_' instead of
'/'.
"""
# return b64encode(s).translate(_urlsafe_encode_translation)
return b64encode(s, b"-_").rstrip(b"\n")
def urlsafe_b64decode(s):
"""Decode a byte string encoded with the standard Base64 alphabet.
s is the byte string to decode. The decoded byte string is
returned. binascii.Error is raised if the input is incorrectly
padded or if there are non-alphabet characters present in the
input.
The alphabet uses '-' instead of '+' and '_' instead of '/'.
"""
# s = _bytes_from_decode_data(s)
# s = s.translate(_urlsafe_decode_translation)
# return b64decode(s)
raise NotImplementedError()
# Base32 encoding/decoding must be done in Python
_b32alphabet = {
0: b"A",
9: b"J",
18: b"S",
27: b"3",
1: b"B",
10: b"K",
19: b"T",
28: b"4",
2: b"C",
11: b"L",
20: b"U",
29: b"5",
3: b"D",
12: b"M",
21: b"V",
30: b"6",
4: b"E",
13: b"N",
22: b"W",
31: b"7",
5: b"F",
14: b"O",
23: b"X",
6: b"G",
15: b"P",
24: b"Y",
7: b"H",
16: b"Q",
25: b"Z",
8: b"I",
17: b"R",
26: b"2",
}
_b32tab = [v[0] for k, v in sorted(_b32alphabet.items())]
_b32rev = dict([(v[0], k) for k, v in _b32alphabet.items()])
def b32encode(s):
"""Encode a byte string using Base32.
s is the byte string to encode. The encoded byte string is returned.
"""
if not isinstance(s, bytes_types):
raise TypeError("expected bytes, not %s" % s.__class__.__name__)
quanta, leftover = divmod(len(s), 5)
# Pad the last quantum with zero bits if necessary
if leftover:
s = s + bytes(5 - leftover) # Don't use += !
quanta += 1
encoded = bytearray()
for i in range(quanta):
# c1 and c2 are 16 bits wide, c3 is 8 bits wide. The intent of this
# code is to process the 40 bits in units of 5 bits. So we take the 1
# leftover bit of c1 and tack it onto c2. Then we take the 2 leftover
# bits of c2 and tack them onto c3. The shifts and masks are intended
# to give us values of exactly 5 bits in width.
c1, c2, c3 = struct.unpack("!HHB", s[i * 5 : (i + 1) * 5])
c2 += (c1 & 1) << 16 # 17 bits wide
c3 += (c2 & 3) << 8 # 10 bits wide
encoded += bytes(
[
_b32tab[c1 >> 11], # bits 1 - 5
_b32tab[(c1 >> 6) & 0x1F], # bits 6 - 10
_b32tab[(c1 >> 1) & 0x1F], # bits 11 - 15
_b32tab[c2 >> 12], # bits 16 - 20 (1 - 5)
_b32tab[(c2 >> 7) & 0x1F], # bits 21 - 25 (6 - 10)
_b32tab[(c2 >> 2) & 0x1F], # bits 26 - 30 (11 - 15)
_b32tab[c3 >> 5], # bits 31 - 35 (1 - 5)
_b32tab[c3 & 0x1F], # bits 36 - 40 (1 - 5)
]
)
# Adjust for any leftover partial quanta
if leftover == 1:
encoded = encoded[:-6] + b"======"
elif leftover == 2:
encoded = encoded[:-4] + b"===="
elif leftover == 3:
encoded = encoded[:-3] + b"==="
elif leftover == 4:
encoded = encoded[:-1] + b"="
return bytes(encoded)
def b32decode(s, casefold=False, map01=None):
"""Decode a Base32 encoded byte string.
s is the byte string to decode. Optional casefold is a flag
specifying whether a lowercase alphabet is acceptable as input.
For security purposes, the default is False.
RFC 3548 allows for optional mapping of the digit 0 (zero) to the
letter O (oh), and for optional mapping of the digit 1 (one) to
either the letter I (eye) or letter L (el). The optional argument
map01 when not None, specifies which letter the digit 1 should be
mapped to (when map01 is not None, the digit 0 is always mapped to
the letter O). For security purposes the default is None, so that
0 and 1 are not allowed in the input.
The decoded byte string is returned. binascii.Error is raised if
the input is incorrectly padded or if there are non-alphabet
characters present in the input.
"""
s = _bytes_from_decode_data(s)
quanta, leftover = divmod(len(s), 8)
if leftover:
raise binascii.Error("Incorrect padding")
# Handle section 2.4 zero and one mapping. The flag map01 will be either
# False, or the character to map the digit 1 (one) to. It should be
# either L (el) or I (eye).
if map01 is not None:
map01 = _bytes_from_decode_data(map01)
assert len(map01) == 1, repr(map01)
s = _translate(s, _maketrans(b"01", b"O" + map01))
if casefold:
s = s.upper()
# Strip off pad characters from the right. We need to count the pad
# characters because this will tell us how many null bytes to remove from
# the end of the decoded string.
padchars = s.find(b"=")
if padchars > 0:
padchars = len(s) - padchars
s = s[:-padchars]
else:
padchars = 0
# Now decode the full quanta
parts = []
acc = 0
shift = 35
for c in s:
val = _b32rev.get(c)
if val is None:
raise binascii.Error("Non-base32 digit found")
acc += _b32rev[c] << shift
shift -= 5
if shift < 0:
parts.append(binascii.unhexlify(bytes("%010x" % acc, "ascii")))
acc = 0
shift = 35
# Process the last, partial quanta
last = binascii.unhexlify(bytes("%010x" % acc, "ascii"))
if padchars == 0:
last = b"" # No characters
elif padchars == 1:
last = last[:-1]
elif padchars == 3:
last = last[:-2]
elif padchars == 4:
last = last[:-3]
elif padchars == 6:
last = last[:-4]
else:
raise binascii.Error("Incorrect padding")
parts.append(last)
return b"".join(parts)
# RFC 3548, Base 16 Alphabet specifies uppercase, but hexlify() returns
# lowercase. The RFC also recommends against accepting input case
# insensitively.
def b16encode(s):
"""Encode a byte string using Base16.
s is the byte string to encode. The encoded byte string is returned.
"""
if not isinstance(s, bytes_types):
raise TypeError("expected bytes, not %s" % s.__class__.__name__)
return binascii.hexlify(s).upper()
def b16decode(s, casefold=False):
"""Decode a Base16 encoded byte string.
s is the byte string to decode. Optional casefold is a flag
specifying whether a lowercase alphabet is acceptable as input.
For security purposes, the default is False.
The decoded byte string is returned. binascii.Error is raised if
s were incorrectly padded or if there are non-alphabet characters
present in the string.
"""
s = _bytes_from_decode_data(s)
if casefold:
s = s.upper()
if re.search(b"[^0-9A-F]", s):
raise binascii.Error("Non-base16 digit found")
return binascii.unhexlify(s)
# Legacy interface. This code could be cleaned up since I don't believe
# binascii has any line length limitations. It just doesn't seem worth it
# though. The files should be opened in binary mode.
MAXLINESIZE = 76 # Excluding the CRLF
MAXBINSIZE = (MAXLINESIZE // 4) * 3
def encode(input, output):
"""Encode a file; input and output are binary files."""
while True:
s = input.read(MAXBINSIZE)
if not s:
break
while len(s) < MAXBINSIZE:
ns = input.read(MAXBINSIZE - len(s))
if not ns:
break
s += ns
line = binascii.b2a_base64(s)
output.write(line)
def decode(input, output):
"""Decode a file; input and output are binary files."""
while True:
line = input.readline()
if not line:
break
s = binascii.a2b_base64(line)
output.write(s)
def encodebytes(s):
"""Encode a bytestring into a bytestring containing multiple lines
of base-64 data."""
if not isinstance(s, bytes_types):
raise TypeError("expected bytes, not %s" % s.__class__.__name__)
pieces = []
for i in range(0, len(s), MAXBINSIZE):
chunk = s[i : i + MAXBINSIZE]
pieces.append(binascii.b2a_base64(chunk))
return b"".join(pieces)
def encodestring(s):
"""Legacy alias of encodebytes()."""
import warnings
warnings.warn("encodestring() is a deprecated alias, use encodebytes()", DeprecationWarning, 2)
return encodebytes(s)
def decodebytes(s):
"""Decode a bytestring of base-64 data into a bytestring."""
if not isinstance(s, bytes_types):
raise TypeError("expected bytes, not %s" % s.__class__.__name__)
return binascii.a2b_base64(s)
def decodestring(s):
"""Legacy alias of decodebytes()."""
import warnings
warnings.warn("decodestring() is a deprecated alias, use decodebytes()", DeprecationWarning, 2)
return decodebytes(s)
# Usable as a script...
def main():
"""Small main program"""
import sys, getopt
try:
opts, args = getopt.getopt(sys.argv[1:], "deut")
except getopt.error as msg:
sys.stdout = sys.stderr
print(msg)
print(
"""usage: %s [-d|-e|-u|-t] [file|-]
-d, -u: decode
-e: encode (default)
-t: encode and decode string 'Aladdin:open sesame'"""
% sys.argv[0]
)
sys.exit(2)
func = encode
for o, a in opts:
if o == "-e":
func = encode
if o == "-d":
func = decode
if o == "-u":
func = decode
if o == "-t":
test()
return
if args and args[0] != "-":
with open(args[0], "rb") as f:
func(f, sys.stdout.buffer)
else:
func(sys.stdin.buffer, sys.stdout.buffer)
def test():
s0 = b"Aladdin:open sesame"
print(repr(s0))
s1 = encodebytes(s0)
print(repr(s1))
s2 = decodebytes(s1)
print(repr(s2))
assert s0 == s2
if __name__ == "__main__":
main()

View File

@@ -29,8 +29,6 @@ class CBR817:
def __init__(self, i2c_bus, addr=CBR_ADDRESS, tx_power=3, threshold=5000, noise=256, delay=500, lock=500):
self._device = i2c_bus
self._address = addr
_str_i2c = str(self._device) #唤醒需要SCL管脚给高脉冲
self._scl = Pin(int(_str_i2c[_str_i2c.find('=') + 1 : _str_i2c.find(",")]), Pin.OUT, Pin.OPEN_DRAIN)
self._configure()
self.tx_power(tx_power)
@@ -49,8 +47,10 @@ class CBR817:
def _wake(self):
'''Wake up from low power consumption'''
self._scl.value(0)
time.sleep_us(10)
try:
self._wreg(CBR_SEL_REG, 0xC0)
except :
pass
def threshold(self, value=None):
self._wake()

View File

@@ -9,6 +9,15 @@
"__size__": 1644,
"__name__": "adxl345.py"
},
"ags10": {
"__require__": [
"time",
"micropython"
],
"__file__": true,
"__size__": 3152,
"__name__": "ags10.py"
},
"ahtx0": {
"__require__": [
"utime",
@@ -49,6 +58,20 @@
"__size__": 3703,
"__name__": "baidu_speech.py"
},
"base64": {
"__require__": [
"re",
"struct",
"binascii",
"warnings",
"warnings",
"sys",
"getopt"
],
"__file__": true,
"__size__": 15241,
"__name__": "base64.py"
},
"ble_advertising": {
"__require__": [
"micropython",
@@ -197,7 +220,7 @@
"micropython"
],
"__file__": true,
"__size__": 3913,
"__size__": 3762,
"__name__": "cbr817.py"
},
"cc_g1": {
@@ -473,11 +496,12 @@
"ubinascii",
"matcher",
"network",
"base64",
"urequests",
"ussl"
],
"__file__": true,
"__size__": 11930,
"__size__": 12272,
"__name__": "mixiot.py"
},
"mixpy": {
@@ -731,7 +755,7 @@
"ustruct"
],
"__file__": true,
"__size__": 1791,
"__size__": 2653,
"__name__": "rtctime.py"
},
"sc7a20": {
@@ -890,6 +914,14 @@
"__size__": 1916,
"__name__": "tm1931.py"
},
"tvoc07s": {
"__require__": [
"time"
],
"__file__": true,
"__size__": 1093,
"__name__": "tvoc07s.py"
},
"uart_com": {
"__require__": [],
"__file__": true,
@@ -914,7 +946,7 @@
"framebuf"
],
"__file__": true,
"__size__": 21078,
"__size__": 22364,
"__name__": "uframebuf.py"
},
"umqtt": {

View File

@@ -30,6 +30,15 @@ def wlan_connect(ssid='MYSSID', password='MYPASS', timeout=10):
print('\nnetwork config:', wlan.ifconfig())
return wlan
def image_base64(path="mixly.jpg"):
from base64 import b64encode
if isinstance(path, str):
with open(path, 'rb') as f:
_data = f.read()
return 'data:image/{};base64,'.format(path.split('.')[-1]).encode() + b64encode(_data)
else:
return b'data:image/jpg;base64,' + b64encode(path)
def ntp(url='mixio.mixly.cn'):
import urequests
try:

View File

@@ -7,6 +7,8 @@ import ustruct as struct
# NTP_DELTA (date(2000, 1, 1) - date(1900, 1, 1)).days * 24*60*60
NTP_DELTA = 3155673600
_weekdayname = ("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")
_monthname = (None, "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",)
def ntptime(host="pool.ntp.org", utc=28800):
NTP_QUERY = bytearray(48)
@@ -50,3 +52,18 @@ def strtime(times=None):
return '{0:04d}-{1:02d}-{2:02d} {3:02d}:{4:02d}:{5:02d}'.format(*times)
else:
raise ValueError("Settime needs a type of length 6~8")
def rfc1123_time(times=None, utc=28800):
if times is None:
times = localtime()
if isinstance(times, str):
try:
times = eval(times)
except:
raise ValueError("Clock information format error, use ',' to separate at least 6 numerical values")
if type(times) in (tuple, list):
if 6 <= len(times) <= 8:
times = localtime(mktime(times) - utc)
return '{0}, {1:02d} {2} {3:04d} {4:02d}:{5:02d}:{6:02d} GMT'.format(_weekdayname[times[6]], times[2], _monthname[times[1]], times[0], times[3], times[4], times[5])
else:
raise ValueError("Settime needs a type of length 6~8")

View File

@@ -0,0 +1,39 @@
"""
TVOC
Micropython library for the TVOC(UART)
=======================================================
@dahanzimin From the Mixly Team
"""
import time
class TVOC:
def __init__(self, uart):
self._uart = uart
self._uart.init(baudrate=9600)
self._tvoc = (0, 0 ,0) #TVOC mg/m3, CH2O mg/m3, C02 ppm
self._flag = False
if not self._chip_id():
raise AttributeError("Cannot find a TOVC")
def _rreg(self):
'''Read data'''
if self._uart.any():
eec = 0
buf = self._uart.read(9)
for i in buf[:8]:
eec += i
if (eec & 0xFF) == buf[8] and buf[0] == 0x2C:
self._tvoc=((buf[2] << 8 | buf[3]) * 0.001, (buf[4] << 8 | buf[5]) * 0.001, buf[6] << 8 | buf[7] )
return True
def _chip_id(self):
for _ in range(5):
if self._rreg():
return True
time.sleep(1)
return False
def read(self):
self._rreg()
return self._tvoc

View File

@@ -168,26 +168,53 @@ class FrameBuffer_Base(FrameBuffer):
def write(self):
self.show()
def shift(self, x, y, sync=True):
def shift(self, x, y, rotate=False, sync=True):
"""Shift pixels by x and y"""
super().scroll(x, y)
if x > 0: # Shift Right
for _ in range(x):
for row in range(0, self.height):
last_pixel = super().pixel(self.width - 1, row) if rotate else 0
for col in range(self.width - 1, 0, -1):
super().pixel(col, row, super().pixel(col - 1, row))
super().pixel(0, row, last_pixel)
elif x < 0: # Shift Left
for _ in range(-x):
for row in range(0, self.height):
last_pixel = super().pixel(0, row) if rotate else 0
for col in range(0, self.width - 1):
super().pixel(col, row, super().pixel(col + 1, row))
super().pixel(self.width - 1, row, last_pixel)
if y > 0: # Shift Up
for _ in range(y):
for col in range(0, self.width):
last_pixel = super().pixel(col, self.height - 1) if rotate else 0
for row in range(self.height - 1, 0, -1):
super().pixel(col, row, super().pixel(col, row - 1))
super().pixel(col, 0, last_pixel)
elif y < 0: # Shift Down
for _ in range(-y):
for col in range(0, self.width):
last_pixel = super().pixel(col, 0) if rotate else 0
for row in range(0, self.height - 1):
super().pixel(col, row, super().pixel(col, row + 1))
super().pixel(col, self.height - 1, last_pixel)
if sync: self.show()
def shift_right(self, num, sync=True):
def shift_right(self, num, rotate=False, sync=True):
"""Shift all pixels right"""
self.shift(num, 0, sync)
self.shift(num, 0, rotate, sync)
def shift_left(self, num, sync=True):
def shift_left(self, num, rotate=False, sync=True):
"""Shift all pixels left"""
self.shift(-num, 0, sync)
self.shift(-num, 0, rotate, sync)
def shift_up(self, num, sync=True):
def shift_up(self, num, rotate=False, sync=True):
"""Shift all pixels up"""
self.shift(0, -num, sync)
self.shift(0, -num, rotate, sync)
def shift_down(self, num, sync=True):
def shift_down(self, num, rotate=False, sync=True):
"""Shift all pixels down"""
self.shift(0, num, sync)
self.shift(0, num, rotate, sync)
def map_invert(self, own):
"""Graph invert operation"""
@@ -339,6 +366,11 @@ class FrameBuffer_Uincode(FrameBuffer_Base):
"""Font selection or externally defined font code"""
self._font = Font_Uincode(font_address)
def shift(self, x, y, rotate=False, sync=True):
'''Reshaping Inheritance Methods'''
super().scroll(x, y)
if sync: self.show()
def image(self, path, x=None, y=None, size=None, invert=0, color=0xffff, bold=0, sync=True):
"""Set buffer to value of Python Imaging Library image"""
if type(path) is str :
@@ -385,7 +417,6 @@ class FrameBuffer_Uincode(FrameBuffer_Base):
if sync: self.fill(bg_color, sync=False)
self.set_buffer(data, sync)
else:
yy = y
if size is None:
font_len, font_buffer = self._take_buffer(str(data), space, 1)
size = min((self.width // font_len) if font_len > 0 else 1, self.height // self._font.height)
@@ -393,11 +424,7 @@ class FrameBuffer_Uincode(FrameBuffer_Base):
font_len, font_buffer = self._take_buffer(str(data), space, size)
x = (self.width - font_len + space) // 2 if center else x
y = (self.height - self._font.height * size) // 2 if y is None else y
if sync:
if yy is None:
self.fill(bg_color, sync=False)
else:
self.fill_rect(x - 1, y - 1, font_len + 2, font_buffer[0][1][1] * size + 2, bg_color, sync=False)
if sync: self.fill(bg_color, sync=False)
for buffer in font_buffer: #Display character
self.bitmap(buffer, x, y, size, bold, color)
x = buffer[1][0] * size + x + space