2017-07-09 28 views
0

最近、私はバス運転シミュレータを再生しています。私にはクラッチペダルがないレーシングホイールがあるので、マウスをクラッチ、ブレーキ、ガスでジョイスティックとして動作させる方法を模索しました。私は、vJoyとFreePIE - Programmable Input Emulatorのソリューションを見つけました。私は、三ペダルホイールに2ペダルロジクールホイールを変換する方法の面で解決策をグーグルで始めたので、私は、Pythonに非常に新しいですLogitechのレーシングホイールからPython経由で軸情報を取得

#Title   :OMSI 2 Freepie Mouse (Edited Mjoy vJoy FreePIE python script) 
#Version  :0.1 (2016-03-22) 
#Author  :snp, NEMOROSUS 
#Description :FreePIE python script for OMSI 2 mouse controls such as acceleration, steering and clutch control that is more accurate that the built-in one. 

import time 
from System import Int16 
from ctypes import windll, Structure, c_ulong, byref, CDLL 

class POINT(Structure): 
_fields_ = [("x", c_ulong), ("y", c_ulong)] 

if starting: 
vJoy0_stat = 1 
vJoy[0].x = 0 
vJoy[0].y = 0 
vJoy[0].z = 0 
x = 0 
y = 0 
z = 0 
mouse_x = 0 
mouse_y = 0 
mouse_z = 0 
mouse_x_locked = 0 
mouse_y_locked = 0 
x_m = 0 
y_m = 0 
axis_max = 16448 
screen_x = windll.user32.GetSystemMetrics(0) 
screen_y = windll.user32.GetSystemMetrics(1) 
pt = POINT() 
sequence = 0 
system.setThreadTiming(TimingTypes.HighresSystemTimer) 
system.threadExecutionInterval = 1 

z += mouse.wheel * 10 

# X/Y axis centering 

#if keyboard.getKeyDown(Key.Space): 
#windll.user32.SetCursorPos((screen_x/2),(screen_y/2)) 

# Mjoy vJoy 

# Turn VJoy on/off 

if keyboard.getPressed(Key.K): 
if sequence == 0: 
    vJoy0_stat = 0 
elif sequence == 1: 
    vJoy0_stat = 1 

sequence = sequence + 1 
if sequence > 1: 
    sequence = 0 

if vJoy0_stat == 1: 
windll.user32.GetCursorPos(byref(pt)) 
mouse_x = pt.x 
mouse_y = pt.y 

sensitivity = 28 
x_m = (mouse_x - (screen_x/2)) * sensitivity 
y_m = (mouse_y - (screen_y/2)) * sensitivity/0.66 
x_both = x_m + x 
y_both = y_m + y 
x_keyb_sensitivity = 350 
y_keyb_sensitivity = 350 

if x_m > axis_max: 
    x_m = axis_max 

if x_m < - axis_max: 
    x_m = - axis_max 

if y_m > axis_max: 
    y_m = axis_max 

if y_m < - axis_max: 
    y_m = - axis_max 

if x > axis_max: 
    x = axis_max 

if x < - axis_max: 
    x = - axis_max 

if y > axis_max: 
    y = axis_max 

if y < - axis_max: 
    y = - axis_max 

if z > axis_max: 
    z = axis_max 

if z < - axis_max: 
    z = - axis_max 

if x_both > axis_max: 
    x_both = axis_max 

if x_both < - axis_max: 
    x_both = - axis_max 

if y_both > axis_max: 
    y_both = axis_max 

if y_both < - axis_max: 
    y_both = - axis_max 

vJoy[0].x = x_m + x 
vJoy[0].y = y_m + y 
vJoy[0].z = z 

# Diag 

diagnostics.watch(screen_x) 
diagnostics.watch(screen_y) 
diagnostics.watch(mouse_x) 
diagnostics.watch(mouse_y) 
diagnostics.watch(mouse_x_locked) 
diagnostics.watch(mouse_y_locked) 
diagnostics.watch(vJoy[0].x) 
diagnostics.watch(vJoy[0].y) 
diagnostics.watch(vJoy[0].z) 

:私は、マウスのために完璧に動作例を見つけました。 vJoyを「最終的な」ジョイスティックとして使用するというアイデアを思いつきました。私は車輪からのすべての軸とマウスからのY軸へのフィードを計画しました。これはクラッチとして機能します。

from ctypes import CDLL 

_glfw = CDLL("path_to_FreePIE_installation\\plugins\\lib-mingw-w64\\glfw3.dll") 
joyNum = 0 
isHere = _glfw.glfwJoystickPresent(joyNum) 
diagnostics.watch(isHere) 
joyName = _glfw.glfwGetJoystickName(joyNum) 
diagnostics.watch(joyName) 
#joy = _glfw.glfwGetJoystickAxes(0) 
#joy = _glfw.glfwGetJoystickButtons(0) 
#diagnostics.watch(joy) 

私はthis documentationthis documentationからアイデアを取った:だから、解決策を検索した後、私はPythonコードのこの作品を追加しました。彼らは、joyNumは0から15の間でなければならないと言っています。私は0から15まで、そして16から17までのすべての数字を試しました。毎回、isHereは0ですが、ホイールを私の3つのUSBポートラップトップ。私は同じ結果を得て3つすべてにそれをつけようとしました。 _glfw.glfwGetJoystickName(joyNum)も毎回私に0を与えています。誰かがこれをデバッグするのを助けることができますか?私はなぜそれがホイールを見つけることができないのか分かりません。今は問題なくゲームをプレイできるので、ドライバーにとって問題はありません。ホイールは正常に動作しています。

私は_glfw.glfwGetJoystickAxes(0)または_glfw.glfwGetJoystickButtons(0)を呼び出そう - FreePIEがクラッシュし、私はVS2010でそれをデバッグするとき、例外メッセージは、次のとおりです。「保護されたメモリを読み書きしようとしました。これは、多くの場合、他のメモリが破損していることを示しています。。」

EDIT:今

from ctypes import CDLL, POINTER, c_float, c_int 

glfw = CDLL("path_to_FreePIE_installation\\plugins\\lib-mingw-w64\\glfw3.dll") 
joyNum = 0 
isHere = _glfw.glfwJoystickPresent(joyNum) 
diagnostics.watch(isHere) 
joyName = _glfw.glfwGetJoystickName(joyNum) 
diagnostics.watch(joyName) 
cnt = c_int(0) 
_glfw.glfwGetJoystickAxes.restype = POINTER(c_float) 
joy = _glfw.glfwGetJoystickAxes(0, byref(cnt)) 
diagnostics.watch(joy) 
axes = [joy[i].value for i in range(cnt)] 
diagnostics.watch(cnt) 
diagnostics.watch(axes) 

スクリプトがまったく実行されていないと、私は次のエラーを参照してください。私はanother documentationを詳しく見ていたし、私はこの1つで追加されたコードを置き換え

FreePIEのコンソールで:

range()期待された整数の終わりの引数は、c_longを持っています。 この行でエラーが発生します。 axes = [joy [i] .value in i(cnt)]

私は混乱します。 Here軸の値を取得する方法の例を示しました。これは、自分のサイトからの抜粋です:あなたがここに見ることができるように

def glfwGetJoystickAxes(joy): 
count = c_int(0) 
_glfw.glfwGetJoystickAxes.restype = POINTER(c_float) 
c_axes = _glfw.glfwGetJoystickAxes(joy, byref(count)) 
axes = [c_axes[i].value for i in range(count)] 

、カウントはタイプc_intのであり、彼らはrange()にそれを与えると、彼らはそれが動作するはずです。あるいは、私のコードスニペットのjoy [i] .valueがc_long型であり、その場合ですか?

ご協力いただきますようお願い申し上げます。ありがとう!

EDIT2:このような状況に陥ることがあり、誰のために

、。説明したようにglfw 1.4.0

  • if starting: 
        # ... 
        _glfw.glfwInit() # this is VERY important! 
        joyNum = 1 # not 0, because the mouse appears to be joystick No 0 
        # ... 
    if vJoy0_stat == 1: # the main loop 
        # ... 
        isHere = _glfw.glfwJoystickPresent(joyNum) 
        diagnostics.watch(isHere) 
        if isHere == 1: 
         cnt = c_int(0) # must be of type c_int! 
         _glfw.glfwGetJoystickAxes.restype = POINTER(c_float) # VERY important! 
         joy = _glfw.glfwGetJoystickAxes(joyNum, byref(cnt)) 
         diagnostics.watch(joy[0]) # this appears to be the steering axe 
         diagnostics.watch(joy[1]) # this appears to be the two pedals combined in one axe 
        # from here I will do sth like: 
        windll.user32.GetCursorPos(byref(pt)) 
        mouse_y = pt.y 
        y_m = (mouse_y - (screen_y/2)) * sensitivity/0.66 
        vJoy[0].x = joy[0] 
        vJoy[0].y = joy[1] 
        vJoy[0].z = y_m 
    
  • 答えて

    0

    なく、あなたの問題への解決策が、::

    1. のpythonモジュールはGLFWのために利用可能であるこれは私のために仕事をしたコードであり、 documentationでは、glfwJoystickPresentを使用する前にglfwInitを呼び出してGLFWを初期化する必要があります。多分助けてくれるでしょう

    +0

    ありがとうございました! :) あなたは私の命を救いました!これは近い将来に私がおそらく考えていないものです。少なくとも今のところ、それは私の問題の解決策であるようです。私はisHere = _glfw.glfwJoystickPresent(joyNum)の前に_glfw.glfwInit()を追加しました。今isHere = 1とjoyName =を9桁の数字に変換します。この最後のことは私には奇妙に思えます。私はそれが文字列名であることを期待しました。とにかく、私は今、軸を取得しようとします。どうもありがとう! – user2177283

    +0

    それはあなたを助けてくれてうれしいです。しかし、私はあなたのDLLバインディングを使用する代わりにPythonモジュールを使用することをお勧めします。必要に応じて改善提案することもできます –

    関連する問題