odwdinc / Python-SimConnect

Python interface for MSFS2020 SimConnect.dll
GNU Affero General Public License v3.0
277 stars 105 forks source link

Use asyncio with sync wrapper, stay compatible #98

Open Koseng opened 3 years ago

Koseng commented 3 years ago

Moved to asyncio, including a sync wrapper. So everything should be compatible. Introduced async_get(...) next to get(...).

To call async functions, an event loop is necessary. This is provided by the helper thread in AsyncLoop. With that helper, a sync wrapper can be put on top of the async implementation.

Please test.

I also tried tried an implementation with asyncio Futures to replace the wait and sleep pattern. It is the asyncio way to wait for a callback. But it turned out to be much slower in the sync case, so I returned to the current implementation.

Koseng commented 3 years ago

Example async client test code:

import asyncio
from SimConnect import AircraftRequests, SimConnect

async def main():
        sm = SimConnect()
        aq = AircraftRequests(sm)
        while True:
            results = await asyncio.gather(
                        aq.async_get("RUDDER_DEFLECTION"),
                        aq.async_get("AMBIENT_PRESSURE"),
                        aq.async_get('RADIO_HEIGHT'),
                        aq.async_get("GROUND_ALTITUDE"),
                        aq.async_get("RUDDER_DEFLECTION"),
                        aq.async_get("AMBIENT_PRESSURE"),
                        aq.async_get('RADIO_HEIGHT'),
                        aq.PositionandSpeedData.async_get('PLANE_LATITUDE'),
                        aq.PositionandSpeedData.async_get('PLANE_LONGITUDE'),
                        aq.PositionandSpeedData.async_get('PLANE_ALTITUDE'),
                        aq.FlightInstrumentationData.async_get('KOHLSMAN_SETTING_HG'))
            print(results)
            await asyncio.sleep(0.3)

asyncio.run(main())