122 lines
4.5 KiB
Python
122 lines
4.5 KiB
Python
"""
|
|
SOWL_WCH
|
|
|
|
Micropython library for the SOWL_WCH(--V1.0--)
|
|
=======================================================
|
|
@dahanzimin From the Mixly Team
|
|
"""
|
|
import time
|
|
from micropython import const
|
|
|
|
_BOT035_ADDRESS = const(0x13)
|
|
_BOT5_TOUCH = const(0x01)
|
|
_BOT035_PHZ = const(0x05)
|
|
_BOT035_PWM = const(0x09)
|
|
_BOT035_LED = const(0x0D)
|
|
_BOT035_STA = const(0x10)
|
|
_BOT035_RGB = const(0x11)
|
|
_BOT035_KB = const(0x1A)
|
|
_BOT035_MS = const(0xAE)
|
|
_BOT035_STR = const(0x22)
|
|
|
|
class BOT035:
|
|
def __init__(self, i2c_bus):
|
|
self._i2c = i2c_bus
|
|
self._touchs = [self.touch(0), self.touch(1)]
|
|
self.reset()
|
|
|
|
def _wreg(self, reg, val, digit=1):
|
|
'''Write memory address'''
|
|
self._i2c.writeto_mem(_BOT035_ADDRESS, reg, val.to_bytes(digit, 'little'))
|
|
|
|
def _rreg(self, reg, nbytes=1):
|
|
'''Read memory address'''
|
|
self._i2c.writeto(_BOT035_ADDRESS, reg.to_bytes(1, 'little'))
|
|
return int.from_bytes(self._i2c.readfrom(_BOT035_ADDRESS, nbytes), 'little')
|
|
|
|
def _bits(self, offset, mask, value=None, delay=100, reg=_BOT035_STA):
|
|
if value is None:
|
|
return (self._rreg(reg) & mask) >> offset
|
|
else:
|
|
self._wreg(reg, (self._rreg(reg) & (~ mask & 0xFF)) | (value << offset))
|
|
time.sleep_ms(delay)
|
|
|
|
def reset(self):
|
|
self._i2c.writeto_mem(_BOT035_ADDRESS, _BOT035_PHZ, b' N Nddddd\x00\x00\x0c')
|
|
|
|
def touch(self, index, value=None):
|
|
index = max(min(index, 1), 0)
|
|
touch = 4095 - self._rreg(_BOT5_TOUCH + index * 2, 2)
|
|
return touch > value if value else touch
|
|
|
|
def touched(self, index, value=600):
|
|
return self.touch(index, value)
|
|
|
|
def touch_slide(self):
|
|
values = []
|
|
for i in range(20):
|
|
values.append((self.touch(1) - self._touchs[1]) - (self.touch(0) - self._touchs[0]))
|
|
return round(sorted(values)[10] / 10)
|
|
|
|
def usben(self, index=1, duty=None, freq=None):
|
|
if index not in (1, 2, 4, 5):
|
|
raise ValueError("USB port must be a number in (1, 2, 4, 5)")
|
|
if duty is not None:
|
|
self._wreg(_BOT035_PWM + index - (1 if index < 3 else 2), int(max(min(duty, 100), 0)))
|
|
if freq is not None:
|
|
self._wreg(_BOT035_PHZ + (0 if index < 3 else 2) , max(min(freq, 65535), 10), 2)
|
|
if freq is None and duty is None:
|
|
return self._rreg(_BOT035_PWM + index - (1 if index < 3 else 2)), self._rreg(_BOT035_PHZ + (0 if index < 3 else 2), 2)
|
|
|
|
def tft_brightness(self, brightness=None):
|
|
"""PMOS inverting level driver"""
|
|
if brightness is None:
|
|
return 100 - self._rreg(_BOT035_LED)
|
|
else:
|
|
self._wreg(_BOT035_LED, max(min(100 - brightness, 100), 0))
|
|
|
|
def led_pwm(self, index=1, duty=None):
|
|
index = max(min(index, 2), 1)
|
|
if duty is None:
|
|
return self._rreg(_BOT035_LED + index)
|
|
else:
|
|
self._wreg(_BOT035_LED + index, max(min(duty, 100), 0))
|
|
|
|
def tft_reset(self, value=None, delay=50):
|
|
return self._bits(7, 0x80, value, delay)
|
|
|
|
def mcu_reset(self, value=None, delay=10):
|
|
return self._bits(2, 0x04, value, delay)
|
|
|
|
def rgb_sync(self, buffer, n=9):
|
|
self._i2c.writeto_mem(_BOT035_ADDRESS, _BOT035_RGB, buffer if len(buffer) < n else buffer[:n])
|
|
|
|
def hid_keyboard(self, special=0, general=0, release=True):
|
|
self._buf = bytearray(4)
|
|
self._buf[0] = special
|
|
if type(general) in (tuple, list):
|
|
for i in range(len(general)):
|
|
if i > 2: break
|
|
self._buf[i + 1] = general[i]
|
|
else:
|
|
self._buf[1] = general
|
|
self._i2c.writeto_mem(_BOT035_ADDRESS, _BOT035_KB, self._buf)
|
|
if release:
|
|
time.sleep_ms(10)
|
|
self._i2c.writeto_mem(_BOT035_ADDRESS, _BOT035_KB, bytes(4))
|
|
|
|
def hid_keyboard_str(self, string, delay=0):
|
|
for char in str(string):
|
|
self._wreg(_BOT035_STR, ord(char) & 0xFF)
|
|
time.sleep_ms(20 + delay)
|
|
|
|
def hid_keyboard_state(self):
|
|
state = self._rreg(_BOT035_STA)
|
|
return bool(state & 0x10), bool(state & 0x20), bool(state & 0x40)
|
|
|
|
def hid_mouse(self, keys=0, move=(0, 0), wheel=0, release=True):
|
|
self._i2c.writeto_mem(_BOT035_ADDRESS, _BOT035_MS, bytes([keys & 0x0F, move[0] & 0xFF, move[1] & 0xFF, wheel & 0xFF]))
|
|
if release:
|
|
time.sleep_ms(10)
|
|
self._i2c.writeto_mem(_BOT035_ADDRESS, _BOT035_MS, bytes(4))
|