pydualsense 깃허브 페이지에 들어가 보니 업데이트가 된 모양이다.
기존 코드를 유지해도 되어 보이나, 좋은 것이 있으니까 바꾼게 아닐까? 라는 생각으로 코드를 갈아엎었다.
설명으로는 블루투스도 지원하는 것 같은데...
잘 모르겠으니 일단 유선으로 연결해야 할 것 같다.
from pydualsense import *
from time import *
dualsense = pydualsense()
dualsense.init()
dualsense.light.setColorI(150, 50, 255)
DpadBoolean = [False, False, False, False]
ShapeBoolean = [False, False, False, False]
LnRBoolean = [False, False, False, False]
FunctionBoolean = [False, False, False, False]
L2R2Intarr = [0, 0]
JoystickIntarr = [0, 0, 0, 0]
def BooleanToVal(FunctionBoolean, Mode):
TempInt = 0
for i in range(len(FunctionBoolean)):
TempInt += (2**i) * FunctionBoolean[i]
if (Mode == "int"):
return TempInt
elif (Mode == "char"):
return chr(TempInt)
else:
return None
def InputDualsense():
DpadBoolean[0] = dualsense.state.DpadUp
DpadBoolean[1] = dualsense.state.DpadRight
DpadBoolean[2] = dualsense.state.DpadDown
DpadBoolean[3] = dualsense.state.DpadLeft
ShapeBoolean[0] = dualsense.state.triangle
ShapeBoolean[1] = dualsense.state.circle
ShapeBoolean[2] = dualsense.state.cross
ShapeBoolean[3] = dualsense.state.square
LnRBoolean[0] = dualsense.state.L1
LnRBoolean[1] = dualsense.state.L3
LnRBoolean[2] = dualsense.state.R1
LnRBoolean[3] = dualsense.state.R3
FunctionBoolean[0] = dualsense.state.ps
FunctionBoolean[1] = dualsense.state.touchBtn
FunctionBoolean[2] = dualsense.state.share
FunctionBoolean[3] = dualsense.state.options
L2R2Intarr[0] = dualsense.state.L2
L2R2Intarr[1] = dualsense.state.R2
JoystickIntarr[0] = dualsense.state.LX
JoystickIntarr[1] = dualsense.state.LY
JoystickIntarr[2] = dualsense.state.RX
JoystickIntarr[3] = dualsense.state.RY
while True:
InputDualsense()
print()
print("Dpad : ", DpadBoolean)
print("Shape : ", ShapeBoolean)
print("L, R button : ", LnRBoolean)
print("Function : ", FunctionBoolean)
print("L2, R2 : ", L2R2Intarr)
print("Joystick : ", JoystickIntarr)
print()
sleep(0.1)
dualsense.close()
콘솔 출력을 보기 좋게 이뿌게 만드니 아예 보이질 않아서...
0.1초 간격으로 출력하는데, 실제로 사용할 때는 없앨 예정이다.
이제 문자열로 만들어서 시리얼로 보낼 일만 남았는데,
시리얼통신은 미래의 나에게 부탁하고 문자열로 만들어주는 함수를 쓸것이다.
char = 1byte = 8bit
니까 8개의 bool값 또는 0~255의 수를 저장할 수 있다.
그러니 내가 쓴 코드를 생각하여 4개의 크기가 4인 boolean, 6개의 1byte int를 받아서,
8byte 문자열을 반환하는 함수를 만들어야 한다.
def BooleanToVal(FunctionBoolean, FunctionMode):
TempInt = 0
for i in range(len(FunctionBoolean)):
TempInt += (2**i) * FunctionBoolean[i]
if (FunctionMode == "int"):
return TempInt
elif (FunctionMode == "char"):
return chr(TempInt)
def DataToStr(FunctionBoolean_1, FunctionBoolean_2, FunctionBoolean_3, FunctionBoolean_4, FunctionByte_1, FunctionByte_2, FunctionByte_3, FunctionByte_4, FunctionByte_5, FunctionByte_6):
TempStr = ""
TempStr += BooleanToVal(FunctionBoolean_1 + FunctionBoolean_2, "char")
TempStr += BooleanToVal(FunctionBoolean_3 + FunctionBoolean_4, "char")
TempStr += chr(FunctionByte_1)
TempStr += chr(FunctionByte_2)
TempStr += chr(FunctionByte_3)
TempStr += chr(FunctionByte_4)
TempStr += chr(FunctionByte_5)
TempStr += chr(FunctionByte_6)
흠... 아주 보기 안좋다...
반복 줄이고 변수를 리스트로 묶으면 좋지 않을까!?!
def BooleanToVal(FunctionBoolean, FunctionMode):
TempInt = 0
for i in range(len(FunctionBoolean)):
TempInt += (2**i) * FunctionBoolean[i]
if (FunctionMode == "int"):
return TempInt
elif (FunctionMode == "char"):
return chr(TempInt)
def DataToStr(FunctionBooleanList, FunctionByteList):
TempStr = ""
for i in [0, 2]:
TempStr += BooleanToVal(FunctionBooleanList[i] + FunctionBooleanList[i + 1], "char")
for i in range(6):
TempStr += chr(FunctionByteList[i])
음 훨씬 보기 좋다.
이 함수를 이용해서 문자열을 프린트하는 코드를 쓰면!
from pydualsense import *
from time import *
dualsense = pydualsense()
dualsense.init()
dualsense.light.setColorI(150, 50, 255)
DpadBoolean = [False, False, False, False]
ShapeBoolean = [False, False, False, False]
LnRBoolean = [False, False, False, False]
FunctionBoolean = [False, False, False, False]
L2R2Intarr = [0, 0]
JoystickIntarr = [0, 0, 0, 0]
def BooleanToVal(FunctionBoolean, FunctionMode):
TempInt = 0
for i in range(len(FunctionBoolean)):
TempInt += (2**i) * FunctionBoolean[i]
if (FunctionMode == "int"):
return TempInt
elif (FunctionMode == "char"):
return chr(TempInt)
def DataToStr(FunctionBooleanList, FunctionByteList):
TempStr = ""
for i in [0, 2]:
TempStr += BooleanToVal(FunctionBooleanList[i] + FunctionBooleanList[i + 1], "char")
for i in range(6):
TempStr += chr(FunctionByteList[i])
return TempStr
def InputDualsense():
DpadBoolean[0] = dualsense.state.DpadUp
DpadBoolean[1] = dualsense.state.DpadRight
DpadBoolean[2] = dualsense.state.DpadDown
DpadBoolean[3] = dualsense.state.DpadLeft
ShapeBoolean[0] = dualsense.state.triangle
ShapeBoolean[1] = dualsense.state.circle
ShapeBoolean[2] = dualsense.state.cross
ShapeBoolean[3] = dualsense.state.square
LnRBoolean[0] = dualsense.state.L1
LnRBoolean[1] = dualsense.state.L3
LnRBoolean[2] = dualsense.state.R1
LnRBoolean[3] = dualsense.state.R3
FunctionBoolean[0] = dualsense.state.ps
FunctionBoolean[1] = dualsense.state.touchBtn
FunctionBoolean[2] = dualsense.state.share
FunctionBoolean[3] = dualsense.state.options
L2R2Intarr[0] = dualsense.state.L2
L2R2Intarr[1] = dualsense.state.R2
JoystickIntarr[0] = dualsense.state.LX
JoystickIntarr[1] = dualsense.state.LY
JoystickIntarr[2] = dualsense.state.RX
JoystickIntarr[3] = dualsense.state.RY
while True:
InputDualsense()
print()
print("Dpad : ", DpadBoolean)
print("Shape : ", ShapeBoolean)
print("L, R button : ", LnRBoolean)
print("Function : ", FunctionBoolean)
print("L2, R2 : ", L2R2Intarr)
print("Joystick : ", JoystickIntarr)
print()
print(list(map(ord, DataToStr([DpadBoolean, ShapeBoolean, LnRBoolean, FunctionBoolean], [L2R2Intarr[0], L2R2Intarr[1], JoystickIntarr[0] + 127, JoystickIntarr[1] + 127, JoystickIntarr[2] + 127, JoystickIntarr[3] + 127]))))
print()
print(BooleanToVal(DpadBoolean, "int"), end=' ')
print(BooleanToVal(ShapeBoolean, "int"), end=' ')
print(BooleanToVal(LnRBoolean, "int"), end=' ')
print(BooleanToVal(FunctionBoolean, "int"))
sleep(0.1)
dualsense.close()
조금 더럽긴 하지만 마땅히 고칠 부분은 보이지 않으니 넘어가도록 하자.
저 기다란 프린트문을 시리얼 출력으로만 바꾸면 파이썬 코드는 끝난다.
전 코드와 달라진건 딱히 없지만... 코드도 더 깨끗해지고 속도도 빨라진 것 같기도 하고...
무엇보다 직관적으로 변해서 아주 좋다~!
'아두이노 > Dualsense' 카테고리의 다른 글
듀얼센스 신호 변환기 3.0 : 하드웨어, 소프트웨어 최적화 계획 (0) | 2023.02.14 |
---|---|
듀얼센스 신호 변환기 2.1 : 파이썬 pydualsense로 듀얼센스 값 받고 아두이노로 보내기 (0) | 2022.11.14 |
듀얼센스 신호 변환기 2.0 : 새로운시작 (2) | 2022.11.13 |
듀얼센스 신호 변환기 1.1 : ESP32-nRF24L01 연결 (0) | 2022.09.19 |
듀얼센스 신호 변환기 feat. ESP32, nRF24L01 - 1.0 : 듀얼센스-ESP32 연결 (0) | 2022.09.18 |