Jump to content
The simFlight Network Forums

Recommended Posts

Posted

Hi all,

After a "short" break of 20 years, my interest in flight siming has gotten re-sparked. My ancient (2011) laptop is not up to running the latest and greatest, but it was a powerful machine when new and is more than capable of running FSX at max settings.  I've even bought a copy of the excellent Aerosoft A320 add-on.

As a developer, and original author of the Java FSUIPC sdk, I decided to have a look at what has been going on since 2003 🙂

I'm now mainly a Python developer having dropped Java behind many moons ago. I was pleased to see a python SDK for FSUIPC so I bought myself a license to have a poke about.

I quickly realised I wanted to try and build some real hardware as I tried this in the past - I even have the rotary encoders.

I got a Raspberry Pi Pico reading an encoder and pretending to be a joystick. USB was out of my league in 2003.

This all works nicely, except when setting a rotary control (SPD or HDG). My option seems to be to call a lua script to increment or decrement the appropriate control based on an emulated button push. The response from the panel is quite slow - I've found a few other forum posts from the past where people have had similar issues.

I have now modified my Pico code to send delta's (as a Dial control) based on the speed of rotation and I'm using Python to set the HDG bug via one L:VAR. It responds really nicely.

My question is: Is this the way to go - i.e create python app to react to the joystick dial events and write to LVARS ? or am I over thinking things

I haven't yet looked at the comms event handling in lua

Cheers

Mark

 

Posted
14 minutes ago, markB139 said:

My question is: Is this the way to go - i.e create python app to react to the joystick dial events and write to LVARS ? or am I over thinking things

I haven't yet looked at the comms event handling in lua

If the joystick is recognised as a HID joystick type device by FSUIPC, you can use FSUIPCs assignment facilities. Otherwise, it would need a lua script using the com library.

But if its working using Python and you are happy with this then probably no reason to switch to Lua.

Cheers,

John

Posted

Hi,

Yes, my Pico is being recognised as a HID device.

In case anybody in the future reads this:

I've just tried an experiment that seems to work quite well. 

I open my HID device (please ignore the ID's they aren't official - just for my testing) and can watch for data coming in

handle, rd, rdf, wr, initreport = com.openhid(0xcafe, 0x4004)
event.com(handle, 100, 0, "test_com")

I then use a lua struct library (not sure I actually need to do this) and call one of two functions (taken and modified from the Linda aerosoft a320 code) depending on the sign of the delta

function test_com(hand, datastr, len)
  local a,b,c,d,e,f,g,h,i,j,k,l, delta = struct.unpack('bbbbbbbbbbbbb', datastr)
  if delta > 0 then
    AB_HDG_plus(delta)
  end
  if delta < 0 then
    AB_HDG_minus(-delta)
  end
end

 This works reasonably well in that the heading changes quite quickly to my rotation of the encoder with very little lag.

I like this solution as it requires fewer bits of code to maintain.

cheers

Mark

Posted
15 hours ago, markB139 said:

Yes, my Pico is being recognised as a HID device.

Yes, I know - but I was wondering if it was a joystick type HID device. If so, it would be registered in the FSUIPC4.log file under the joysticl scan section, and would be available for direct assignment via the UI as that is always the easiest methpd to assign. But I guess it isn't.

15 hours ago, markB139 said:

I like this solution as it requires fewer bits of code to maintain.

👍

Cheers,

John

Posted
2 hours ago, John Dowson said:

Yes, I know - but I was wondering if it was a joystick type HID device. If so, it would be registered in the FSUIPC4.log file under the joysticl scan section, and would be available for direct assignment via the UI as that is always the easiest methpd to assign. But I guess it isn't.

👍

Cheers,

John

In the FSUIPC.log I get

      453 Product= Pico Controller
      453    Manufacturer= MarkB
      453    Serial Number= 888888
      453    Vendor=CAFE, Product=4004 (Version 1.0)
      453    GUIDs returned for product: VID_CAFE&PID_4004:
      453       GUID= {4026DA40-CB00-11ED-8001-444553540000}
      453       Details: Btns=32, POVs=(0, 0, 0, 0), Cal=x00000000, Max=R127,U127,V127,X127,Y127,Z127
      453 -------------------------------------------------------------------
      500 Device acquired for use:
      500    Joystick ID = 0 (Registry okay)
      500    0=TinyUSB Device HID
      500    0.GUID={4026DA40-CB00-11ED-8001-444553540000}

I'm still learning about how USB HID report descriptors work. I think I set mine up as a desktop gamepad (type 0x04)

Today I've wired up a couple of buttons to my breadboard. I can assign the buttons using the FSUIPC UI. I now need to buy more buttons 🙂

 

Cheers

Mark

Posted

Ok, then you can assign to it directly and don't need to use the lua com library, which is always the easy path...

8 minutes ago, markB139 said:

Today I've wired up a couple of buttons to my breadboard. I can assign the buttons using the FSUIPC UI. I now need to buy more buttons 🙂

👍

Cheers,

John

Posted
On 3/30/2023 at 11:53 AM, markB139 said:

In the FSUIPC.log I get

      453 Product= Pico Controller
      453    Manufacturer= MarkB
      453    Serial Number= 888888
      453    Vendor=CAFE, Product=4004 (Version 1.0)
      453    GUIDs returned for product: VID_CAFE&PID_4004:
      453       GUID= {4026DA40-CB00-11ED-8001-444553540000}
      453       Details: Btns=32, POVs=(0, 0, 0, 0), Cal=x00000000, Max=R127,U127,V127,X127,Y127,Z127
      453 -------------------------------------------------------------------
      500 Device acquired for use:
      500    Joystick ID = 0 (Registry okay)
      500    0=TinyUSB Device HID
      500    0.GUID={4026DA40-CB00-11ED-8001-444553540000}

I'm still learning about how USB HID report descriptors work. I think I set mine up as a desktop gamepad (type 0x04)

Today I've wired up a couple of buttons to my breadboard. I can assign the buttons using the FSUIPC UI. I now need to buy more buttons 🙂

 

Cheers

Mark

As an update. Reading and reacting to button pushes and the change in rotary encoder are working nicely. I'm now trying to send data back to the HID device. I'm using

-- send 51 (ascii 3) to report 1
written = com.writefeature(handle, {1,51}, 2)
ipc.log("written="..written)

However, I get 0 bytes written and I see no activity in wireshark. I do see the data in wireshark for readreport and readfeature.

I can send the feature report in a Python script using the pywinusb hid library and I can see the traffic.

Is there anyway to get any Windows API error codes logged ?

 

cheers

Mark

 

 

Posted
1 hour ago, markB139 said:

As an update. Reading and reacting to button pushes and the change in rotary encoder are working nicely. I'm now trying to send data back to the HID device. I'm using

-- send 51 (ascii 3) to report 1
written = com.writefeature(handle, {1,51}, 2)
ipc.log("written="..written)

However, I get 0 bytes written and I see no activity in wireshark. I do see the data in wireshark for readreport and readfeature.

I can send the feature report in a Python script using the pywinusb hid library and I can see the traffic.

Is there anyway to get any Windows API error codes logged ?

 

cheers

Mark

 

 

Ah ha, think my understanding of lua needs work 🙂

This has just worked

-- send ascii for 3 to feature 1
binstr = string.char(0x01, 0x33)
ipc.log("binstr "..binstr)
written = com.writefeature(handle, binstr, 2)

 

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use. Guidelines Privacy Policy We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.