初始化提交
This commit is contained in:
115
boards/default_src/micropython/origin/build/lib/ps2.py
Normal file
115
boards/default_src/micropython/origin/build/lib/ps2.py
Normal file
@@ -0,0 +1,115 @@
|
||||
"""
|
||||
PS2Controller
|
||||
|
||||
MicroPython library for the PS2Controller
|
||||
=======================================================
|
||||
|
||||
#Perform upgrade repair 20220819
|
||||
|
||||
dahanzimin From the Mixly Team
|
||||
"""
|
||||
|
||||
import time
|
||||
from machine import Pin
|
||||
from micropython import const
|
||||
|
||||
PSB_SELECT = const(0x0001)
|
||||
PSB_L3 = const(0x0002)
|
||||
PSB_R3 = const(0x0004)
|
||||
PSB_START = const(0x0008)
|
||||
PSB_PAD_UP = const(0x0010)
|
||||
PSB_PAD_RIGHT = const(0x0020)
|
||||
PSB_PAD_DOWN = const(0x0040)
|
||||
PSB_PAD_LEFT = const(0x0080)
|
||||
PSB_L2 = const(0x0100)
|
||||
PSB_R2 = const(0x0200)
|
||||
PSB_L1 = const(0x0400)
|
||||
PSB_R1 = const(0x0800)
|
||||
PSB_GREEN = const(0x1000)
|
||||
PSB_RED = const(0x2000)
|
||||
PSB_BLUE = const(0x4000)
|
||||
PSB_PINK = const(0x8000)
|
||||
PSB_TRIANGLE = const(0x1000)
|
||||
PSB_CIRCLE = const(0x2000)
|
||||
PSB_CROSS = const(0x4000)
|
||||
PSB_SQUARE = const(0x8000)
|
||||
|
||||
PSS_RX = const(0)
|
||||
PSS_RY = const(1)
|
||||
PSS_LX = const(2)
|
||||
PSS_LY = const(3)
|
||||
|
||||
class PS2Controller:
|
||||
def __init__(self,clk_pin,do_pin,di_pin,cs_pin,mode=1,timeout=1000): #mode: 0 red; 1 green
|
||||
self.di =Pin(di_pin,Pin.IN)
|
||||
self.do =Pin(do_pin,Pin.OUT)
|
||||
self.cs =Pin(cs_pin,Pin.OUT)
|
||||
self.clk=Pin(clk_pin,Pin.OUT)
|
||||
|
||||
self.buttons=0
|
||||
self.last_buttons=0
|
||||
self.rods=(128,128,128,128)
|
||||
self.motor1=0
|
||||
self.motor2=0
|
||||
|
||||
timestamp = time.ticks_ms()
|
||||
while not (self._cmds([0x01,0x42])[1] in [0x41,0x73,0x79,0xF3]):
|
||||
if time.ticks_diff(time.ticks_ms(), timestamp) > timeout:
|
||||
raise AttributeError("Cannot find a PS2Controller",self._cmds([0x01,0x42])[1])
|
||||
|
||||
self._cmds([0x01,0x43,0x00,0x01,0x00]) # 进入配置模式
|
||||
time.sleep_ms(10)
|
||||
self._cmds([0x01,0x44,0x00,mode,0x03,0x00,0x00,0x00,0x00]) # “红绿灯”配置模式
|
||||
time.sleep_ms(10)
|
||||
self._cmds([0x01,0x4D,0x00,0x00,0x01]) # 开启震动模式
|
||||
time.sleep_ms(10)
|
||||
self._cmds([0x01,0x43,0x00,0x00,0x5A,0x5A,0x5A,0x5A,0x5A]) # 完成并保存配置
|
||||
time.sleep_ms(10)
|
||||
|
||||
def _cmd(self,cmd):
|
||||
'''Single byte command sending and receiving'''
|
||||
ret = 0
|
||||
for i in range(8):
|
||||
if cmd & 1 << i:
|
||||
self.do.value(1)
|
||||
else:
|
||||
self.do.value(0)
|
||||
self.clk.value(0)
|
||||
time.sleep_us(10)
|
||||
if self.di.value():
|
||||
ret |= 1 << i
|
||||
self.clk.value(1)
|
||||
self.do.value(1)
|
||||
time.sleep_us(10)
|
||||
return ret
|
||||
|
||||
def _cmds(self,cmds):
|
||||
'''Multi byte command sending and receiving'''
|
||||
self.cs.value(0)
|
||||
buffer=bytearray(9)
|
||||
for i, cmd in enumerate(cmds):
|
||||
buffer[i]=self._cmd(cmd)
|
||||
self.cs.value(1)
|
||||
time.sleep_ms(10)
|
||||
return buffer
|
||||
|
||||
def keydata(self):
|
||||
"""Read the value of the key"""
|
||||
_buffer=self._cmds([0X01, 0X42, 0X00, self.motor1, self.motor2, 0X00, 0X00, 0X00, 0X00])
|
||||
if _buffer[2]==0x5A:
|
||||
handkey=(_buffer[4]<<8)| _buffer[3]
|
||||
self.buttons=-handkey-1 & 0xffff
|
||||
self.rods=(_buffer[5],_buffer[6],_buffer[7],_buffer[8])
|
||||
return self.buttons,self.rods
|
||||
|
||||
def vibration(self,motor1=0,motor2=0):
|
||||
"""Vibration settings"""
|
||||
self.motor1=motor1 #motor1:小电机,只有震和不振
|
||||
self.motor2=0 if motor2<1 else motor2*0xBF//100+0X40 #motor2:大电机,范围0x40-0xff,映射0-100
|
||||
self._cmds([0X01, 0X42, 0X00, self.motor1, self.motor2, 0X00, 0X00, 0X00, 0X00])
|
||||
|
||||
def button(self,psb):
|
||||
return (self.keydata()[0] & psb) > 0
|
||||
|
||||
def analog(self,pss):
|
||||
return self.keydata()[1][pss]
|
||||
Reference in New Issue
Block a user