S__41869344


S__41869343




・raspi にて PS3controller を UDP で M5StickC へ
 接続するためのpythonプログラムです。
プログラムの概要
1. PS3controller をbluetoothで、paspiに接続
2.それをRCWCのフォーマットに変換
3.その後、UDPにてM5StickCに送る


#!/usr/bin/python3
import struct
import socket #UDP送信
import time #待機時間用
from contextlib import closing #with用
host = '192.168.4.1' # IPアドレス(変更する!)
port = 10000 # ポート番号
device_path = "/dev/input/js0"

# unsigned long, short, unsigned char, unsigned char
EVENT_FORMAT = "LhBB";
EVENT_SIZE = struct.calcsize(EVENT_FORMAT)

ps3_RCWC = {0:0x0020,1:0x0040,2:0x0010,3:0x0100,4:0x0200,5:0x0800,6:0x0400,7:0x1000,8:0x000c,9:0x0003,10:0,11:0,12:0,13:0x0001,14:0x0002,15:0x0008,16:0x0004}

data = bytearray([0,0,0,0,0,0,0,0,0,0])

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #ソケットの設定
skip_flg = 0
ct = 0
btime = 0 #前回の時間
bval = 0
ds3_time = 0
ds3_val = 0

with closing(sock): #プログラム終了時にソケットを自動的に閉じる      
 with open(device_path, "rb") as device:
  print("Program Start")
  event = device.read(EVENT_SIZE)
  while event:
    btime=ds3_time
    bval=ds3_val
    (ds3_time, ds3_val, ds3_type, ds3_num) = struct.unpack(EVENT_FORMAT, event)
    print(" ")
    print( "{0}, {1}, {2}, {3}".format( ds3_time, ds3_val, ds3_type, ds3_num ) )
    print("COUNT=",ct)
    ct=ct+1

    if ds3_val == 0:
        ct=0
    if (ds3_type == 2 and ds3_val !=0):
        #if ds3_time-btime < 20:
        if abs(abs(ds3_val)-abs(bval))<1000:
            event = device.read(EVENT_SIZE)
            continue
    
    if (ds3_type == 129 or ds3_type == 130):
         event = device.read(EVENT_SIZE)
         continue        

    if ct > 100:
        event = device.read(EVENT_SIZE)
        continue
    

    val=0
    if ds3_type == 1: #ボタン圧下判定
        skip_flg = 0
        if ds3_num in ps3_RCWC:
          val = ps3_RCWC[ds3_num] #対応ボタンデータ取得
          if ds3_val == 0:
             data[0]=0
             data[1]=0
          else:
             data[0]=int(val // 256)
             data[1]=int(val % 256)
          
    elif ds3_type ==2: #ジョイスティック判定
        skip_flg = 0
        if ds3_val == 0: #中点の時
            val = 128
            data[2]=(val)
            data[3]=(val)
            data[4]=(val)
            data[5]=(val)
        else:
          if ds3_num == 1:  #左側 上下
            if ds3_val < 0: # 上側方向
                val = 128 + abs(int((ds3_val/256)))
            else:           # 下側方向
                val = 128 - int((ds3_val / 256))
            data[3] = (val & 0xff)

          elif ds3_num == 0: #左側 左右
            if ds3_val < 0:  # 左側方向
                val = 128 + int((ds3_val/256))
            else:            # 右側方向
                val = 2 * int((ds3_val / 256))                 
            data[2] = (val & 0xff)

          elif ds3_num == 3: #右側 左右
            if ds3_val < 0:  # 左側方向
                val = 128 + int((ds3_val/256))
            else:            # 右側方向
                val = 2 * int((ds3_val / 256))          
            data[4] = (val & 0xff)
          elif ds3_num == 4: #右側 上下
            if ds3_val < 0:  # 上側方向
                val = 128 + abs(int((ds3_val/256)))
            else:            # 下側方向
                val = 128 - int((ds3_val / 256))
            data[5] = (val & 0xff)
          else:
            skip_flg = 1
            val = 128
            data[2]=(val)
            data[3]=(val)
            data[4]=(val)
            data[5]=(val)
            
        print("analog val=",int(val),ds3_val)
                  
#    elif (ds3_type == 129 or ds3_type == 130):
#        skip_flg=1
    else:
        skip_flg=1    
            
#    print("val=",hex(val),val)   
#    for i in range(10):
#      hex_str = format(data[i],'02x')
#      print(hex_str," ",end="")
#    print(" ")

#UDP send    
    if skip_flg == 0:
        print("send: ", data) #送信した文字列を送信側に表示
        print(" ") 
        sock.sendto(data, (host, port)) #ソケットにUDP送信
#    time.sleep(0.5)
    event = device.read(EVENT_SIZE)