Last active
June 22, 2023 17:30
-
-
Save gwbischof/32c2de9e8e5521752d442cef3365d9b4 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import requests | |
import json | |
from ophyd import Component as Cpt | |
from ophyd import Device, Signal | |
from ophyd.sim import NullStatus | |
class UnrealClient(): | |
""" | |
Client for Unreal Engine Remote Control API. | |
Parameters | |
---------- | |
server_address: string, optional | |
The address of the Unreal Remote Control http server. | |
Defaults to the Unreal Remote Control Plugin's default host and port. | |
""" | |
def __init__(self, server_address='http://localhost:30010'): | |
self.server_address = server_address | |
def get_presets(self): | |
result = requests.get(f'{self.server_address}/remote/presets') | |
result_dict = json.loads(result.content) | |
return [preset['Name'] for preset in result_dict['Presets']] | |
def get_properties(self, preset_name): | |
result = requests.get(f'{self.server_address}/remote/preset/{preset_name}') | |
properties = json.loads(result.content)['Preset']['Groups'][0]['ExposedProperties'] | |
return [prop['DisplayName'] for prop in properties] | |
def get_functions(self): | |
result = requests.get(f'{self.server_address}/remote/assets') | |
return json.loads(result.content) | |
def get_all_properties(self): | |
presets = self.get_presets() | |
exposed_properties = {preset_name: self.get_properties(preset_name) for preset_name in presets} | |
return exposed_properties | |
def get_value(self, preset_name, property_name): | |
result = requests.get(f'{self.server_address}/remote/preset/{preset_name}/property/{property_name}') | |
value = json.loads(result.content)['PropertyValues'][0]['PropertyValue'] | |
return value | |
def set_value(self, preset_name, property_name, value): | |
HEADERS = {'Content-type': 'application/json'} | |
result = requests.put(f'{self.server_address}/remote/preset/{preset_name}/property/{property_name}', | |
headers=HEADERS, | |
data=json.dumps({"PropertyValue": value, | |
"GenerateTransaction": 1})) | |
return result | |
class UnrealSignal(Signal): | |
""" | |
Ophyd Signal to interface with Unreal Engine. | |
Parameters | |
---------- | |
preset_name: string | |
The name of the Unreal Remote Control Preset. | |
A Preset is like a group of Properties. | |
name: string | |
The name of the Unreal property | |
server_address: string, optional | |
The address of the Unreal Remote Control http server | |
Defaults to the Unreal Remote Control Plugin's default host and port. | |
""" | |
def __init__(self, *args, preset_name, server_address='http://localhost:30010', **kwargs): | |
super().__init__(*args, **kwargs) | |
self._client = UnrealClient(server_address) | |
self._preset_name = preset_name | |
def set(self, value, *arg, **kwargs): | |
self._readback = value | |
self._client.set_value(self._preset_name, self.name, value) | |
return NullStatus() | |
def get(self, **kwargs): | |
return self._client.get_value(self._preset_name, self.name) | |
def put(self, *args, **kwargs): | |
self.set(*args, **kwargs).wait() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment