Skip to content

Latest commit

 

History

History
293 lines (237 loc) · 17.3 KB

documentation.md

File metadata and controls

293 lines (237 loc) · 17.3 KB

ADM-OSC

Python module

This module implement ADM-OSC Validator, Test and Stress Test

The module contains:

  • protocol definition and implementation (see ADM-OSC message specification)
  • stable parameters (defined in ADM-OSC message specification)
  • Client/Server object (Sender/Receiver) which implement command sending and receiving with full analyze/validation
  • TestClient, used to test how receiver will handle all kind of parameters and parameters value range
  • StressClient, used to send huge amount of data to stress test the receivers

quick examples:

   from adm_osc import OscClientServer

   # create a basic client/server that implement basic ADM-OSC communication with stable parameters 
   # + command monitoring and analyze
   cs = OscClientServer(address='127.0.0.1', out_port=9000, in_port=9001)

   # send some individual parameters  
   cs.send_object_position_azimuth(object_number=1, v=-30.0)
   cs.send_object_position_elevation(object_number=1, v=0.0)
   cs.send_object_position_distance(object_number=1, v=2.0)

   # or pack them
   cs.send_object_polar_position(object_number=1, pos=[-30.0, 0.0, 2.0])

   # in cartesian coordinates
   cs.send_object_cartesian_position(object_number=1, pos=[-5.0, 8.0, 0.0])

   # see below for full list of available functions

   # when receiving an adm osc command its analyze will be printed on the command output window
   #
   # e.g.
   #
   # >> received valid adm message for obj :: 1 :: gain (0.7943282127380371)
   # >> received valid adm message for obj :: 1 :: position aed (20.33701515197754, 0.0, 0.8807612657546997)
   # >> received valid adm message for obj :: 1 :: position xyz (-0.2606865465641022, 0.8273822069168091, 0.0)
   # >>
   # >> ERROR: unrecognized ADM address : "/adm/obj/1/bril" ! unknown command "/bril/"
   # >> ERROR: arguments are malformed for "/adm/obj/1/gain :: (1.4791083335876465,)":
   # >>     argument 0 "1.4791083335876465" out of range ! it should be less or equal than "1.0"     
   

myfile

   from adm_osc import TestClient
   # create a test client, assume default address (local: '127.0.0.1')
   # test client can be used to test how receiver will handle all kind of parameters and parameters value range
   sender = TestClient(out_port=9000)

   # all stable parameters for a specific object
   sender.set_object_stable_parameters_to_minimum(object_number=1)
   sender.set_object_stable_parameters_to_maximum(object_number=1)
   sender.set_object_stable_parameters_to_default(object_number=1)
   sender.set_object_stable_parameters_to_random(object_number=1)

   # all stable parameters for a range of objects
   sender.set_objects_stable_parameters_minimum(objects_range=range(1, 64))
   sender.set_objects_stable_parameters_maximum(objects_range=range(1, 64))
   sender.set_objects_stable_parameters_default(objects_range=range(1, 64))
   sender.set_objects_stable_parameters_random(objects_range=range(1, 64))

   # all stable parameters for all objects
   sender.set_all_objects_stable_parameters_minimum()
   sender.set_all_objects_stable_parameters_maximum()
   sender.set_all_objects_stable_parameters_default()
   sender.set_all_objects_stable_parameters_random()

   # see below for full list of available functions

myfile

  from adm_osc import StressClient
  # create a stress client, assume default address (local: '127.0.0.1')
  # stress client will send huge amount of data to stress test the receivers
  sender = StressClient(out_port=9000)
  # do stress test in cartesian coordinates
  sender.stress_cartesian_position(number_of_objects=67, duration_in_second=10.0, interval_in_milliseconds=10.0)
  # do stress test in polar coordinates
  sender.stress_polar_position(number_of_objects=64, duration_in_second=10.0, interval_in_milliseconds=10.0)

myfile

OscClientServer

class StressClient(TestClient):

  #                              _                           _
  #    __ _  ___ _ __   ___ _ __(_) ___   ___  ___ _ __   __| |
  #   / _` |/ _ \ '_ \ / _ \ '__| |/ __| / __|/ _ \ '_ \ / _` |
  #  | (_| |  __/ | | |  __/ |  | | (__  \__ \  __/ | | | (_| |
  #   \__, |\___|_| |_|\___|_|  |_|\___| |___/\___|_| |_|\__,_|
  #   |___/
  def send_object_value(self, object_number: Union[int, float, str], param: Union[Parameter, PackedParameters], v: Union[float, tuple, list]):
  def send_object_value_min(self, object_number: Union[int, float, str], param: Union[Parameter, PackedParameters]):
  def send_object_value_max(self, object_number: Union[int, float, str], param: Union[Parameter, PackedParameters]):
  def send_object_value_default(self, object_number: Union[int, float, str], param: Union[Parameter, PackedParameters]):
  def send_object_value_random(self, object_number: Union[int, float, str], param: Union[Parameter, PackedParameters]):

  #                   _ _   _                                  _
  #   _ __   ___  ___(_) |_(_) ___  _ __    ___  ___ _ __   __| |
  #  | '_ \ / _ \/ __| | __| |/ _ \| '_ \  / __|/ _ \ '_ \ / _` |
  #  | |_) | (_) \__ \ | |_| | (_) | | | | \__ \  __/ | | | (_| |
  #  | .__/ \___/|___/_|\__|_|\___/|_| |_| |___/\___|_| |_|\__,_|
  #  |_|
  def send_object_position_x(self, object_number: Union[int, float, str], v: float) -> None:
  def send_object_position_y(self, object_number: Union[int, float, str], v: float) -> None:
  def send_object_position_z(self, object_number: Union[int, float, str], v: float) -> None:
  def send_object_cartesian_position(self, object_number: Union[int, float, str], pos: Union[float, tuple, list]) -> None:
  def send_object_position_azimuth(self, object_number: Union[int, float, str], v: float) -> None:
  def send_object_position_elevation(self, object_number: Union[int, float, str], v: float) -> None:
  def send_object_position_distance(self, object_number: Union[int, float, str], v: float) -> None:
  def send_object_polar_position(self, object_number: Union[int, float, str], pos: Union[float, tuple, list]) -> None:

  #               _                            _
  #    __ _  __ _(_)_ __    ___  ___ _ __   __| |
  #   / _` |/ _` | | '_ \  / __|/ _ \ '_ \ / _` |
  #  | (_| | (_| | | | | | \__ \  __/ | | | (_| |
  #   \__, |\__,_|_|_| |_| |___/\___|_| |_|\__,_|
  #   |___/
  def send_object_gain(self, object_number: Union[int, float, str], v: float) -> None:

  #                              _
  #    __ _  ___ _ __   ___ _ __(_) ___    __ _ _   _  ___ _ __ _   _
  #   / _` |/ _ \ '_ \ / _ \ '__| |/ __|  / _` | | | |/ _ \ '__| | | |
  #  | (_| |  __/ | | |  __/ |  | | (__  | (_| | |_| |  __/ |  | |_| |
  #   \__, |\___|_| |_|\___|_|  |_|\___|  \__, |\__,_|\___|_|   \__, |
  #   |___/                                  |_|                |___/
  def query_object_value(self, object_number: Union[int, float, str], param: Union[Parameter, PackedParameters]):

  #                   _ _   _
  #   _ __   ___  ___(_) |_(_) ___  _ __     __ _ _   _  ___ _ __ _   _
  #  | '_ \ / _ \/ __| | __| |/ _ \| '_ \   / _` | | | |/ _ \ '__| | | |
  #  | |_) | (_) \__ \ | |_| | (_) | | | | | (_| | |_| |  __/ |  | |_| |
  #  | .__/ \___/|___/_|\__|_|\___/|_| |_|  \__, |\__,_|\___|_|   \__, |
  #  |_|                                       |_|                |___/
  def query_object_polar_position(self, object_number: Union[int, float, str]):
  def query_object_cartesian_position(self, object_number: Union[int, float, str]):

  #               _
  #    __ _  __ _(_)_ __     __ _ _   _  ___ _ __ _   _
  #   / _` |/ _` | | '_ \   / _` | | | |/ _ \ '__| | | |
  #  | (_| | (_| | | | | | | (_| | |_| |  __/ |  | |_| |
  #   \__, |\__,_|_|_| |_|  \__, |\__,_|\___|_|   \__, |
  #   |___/                    |_|                |___/
  def query_object_gain(self, object_number: Union[int, float, str]):

  #         _ _         _     _           _
  #    __ _| | |   ___ | |__ (_) ___  ___| |_    __ _ _   _  ___ _ __ _   _
  #   / _` | | |  / _ \| '_ \| |/ _ \/ __| __|  / _` | | | |/ _ \ '__| | | |
  #  | (_| | | | | (_) | |_) | |  __/ (__| |_  | (_| | |_| |  __/ |  | |_| |
  #   \__,_|_|_|  \___/|_.__// |\___|\___|\__|  \__, |\__,_|\___|_|   \__, |
  #                        |__/                    |_|                |___/
  def query_all_objects_value(self, param: Union[Parameter, PackedParameters]):
  def query_all_polar_positions(self):
  def query_all_cartesian_positions(self):
  

TestClient

class OscClientServer(SimpleUDPClient):

  #   _            _      __                  _             _              _     _           _
  #  | |_ ___  ___| |_   / _| ___  _ __   ___(_)_ __   __ _| | ___    ___ | |__ (_) ___  ___| |_
  #  | __/ _ \/ __| __| | |_ / _ \| '__| / __| | '_ \ / _` | |/ _ \  / _ \| '_ \| |/ _ \/ __| __|
  #  | ||  __/\__ \ |_  |  _| (_) | |    \__ \ | | | | (_| | |  __/ | (_) | |_) | |  __/ (__| |_
  #   \__\___||___/\__| |_|  \___/|_|    |___/_|_| |_|\__, |_|\___|  \___/|_.__// |\___|\___|\__|
  #                                                   |___/                   |__/
  def set_object_stable_parameters_to_minimum(self, object_number: Union[int, float, str] = default_object):
  def set_object_stable_parameters_to_maximum(self, object_number: Union[int, float, str] = default_object):
  def set_object_stable_parameters_to_default(self, object_number: Union[int, float, str] = default_object):
  def set_object_stable_parameters_to_random(self, object_number: Union[int, float, str] = default_object):
  
  def set_object_position_azimuth_minimum(self, object_number: Union[int, float, str] = default_object):
  def set_object_position_azimuth_maximum(self, object_number: Union[int, float, str] = default_object):
  def set_object_position_azimuth_default(self, object_number: Union[int, float, str] = default_object):
  def set_object_position_azimuth_random(self, object_number: Union[int, float, str] = default_object):
  
  def set_object_position_elevation_minimum(self, object_number: Union[int, float, str] = default_object):
  def set_object_position_elevation_maximum(self, object_number: Union[int, float, str] = default_object):
  def set_object_position_elevation_default(self, object_number: Union[int, float, str] = default_object):
  def set_object_position_elevation_random(self, object_number: Union[int, float, str] = default_object):
  
  def set_object_position_distance_minimum(self, object_number: Union[int, float, str] = default_object):
  def set_object_position_distance_maximum(self, object_number: Union[int, float, str] = default_object):
  def set_object_position_distance_default(self, object_number: Union[int, float, str] = default_object):
  def set_object_position_distance_random(self, object_number: Union[int, float, str] = default_object):
  
  def set_object_polar_position_minimum(self, object_number: Union[int, float, str] = default_object):
  def set_object_polar_position_maximum(self, object_number: Union[int, float, str] = default_object):
  def set_object_polar_position_default(self, object_number: Union[int, float, str] = default_object):
  def set_object_polar_position_random(self, object_number: Union[int, float, str] = default_object):
  
  def set_object_position_x_minimum(self, object_number: Union[int, float, str] = default_object):
  def set_object_position_x_maximum(self, object_number: Union[int, float, str] = default_object):
  def set_object_position_x_default(self, object_number: Union[int, float, str] = default_object):
  def set_object_position_x_random(self, object_number: Union[int, float, str] = default_object):
  
  def set_object_position_y_minimum(self, object_number: Union[int, float, str] = default_object):
  def set_object_position_y_maximum(self, object_number: Union[int, float, str] = default_object):
  def set_object_position_y_default(self, object_number: Union[int, float, str] = default_object):
  def set_object_position_y_random(self, object_number: Union[int, float, str] = default_object):
  
  def set_object_position_z_minimum(self, object_number: Union[int, float, str] = default_object):
  def set_object_position_z_maximum(self, object_number: Union[int, float, str] = default_object):
  def set_object_position_z_default(self, object_number: Union[int, float, str] = default_object):
  def set_object_position_z_random(self, object_number: Union[int, float, str] = default_object):
  
  def set_object_cartesian_position_minimum(self, object_number: Union[int, float, str] = default_object):
  def set_object_cartesian_position_maximum(self, object_number: Union[int, float, str] = default_object):
  def set_object_cartesian_position_default(self, object_number: Union[int, float, str] = default_object):
  def set_object_cartesian_position_random(self, object_number: Union[int, float, str] = default_object):
  
  def set_object_gain_minimum(self, object_number: Union[int, float, str] = default_object):
  def set_object_gain_maximum(self, object_number: Union[int, float, str] = default_object):
  def set_object_gain_default(self, object_number: Union[int, float, str] = default_object):
  def set_object_gain_random(self, object_number: Union[int, float, str] = default_object):

  #   _            _      __                              _ _   _       _              _     _           _
  #  | |_ ___  ___| |_   / _| ___  _ __   _ __ ___  _   _| | |_(_)_ __ | | ___    ___ | |__ (_) ___  ___| |_ ___
  #  | __/ _ \/ __| __| | |_ / _ \| '__| | '_ ` _ \| | | | | __| | '_ \| |/ _ \  / _ \| '_ \| |/ _ \/ __| __/ __|
  #  | ||  __/\__ \ |_  |  _| (_) | |    | | | | | | |_| | | |_| | |_) | |  __/ | (_) | |_) | |  __/ (__| |_\__ \
  #   \__\___||___/\__| |_|  \___/|_|    |_| |_| |_|\__,_|_|\__|_| .__/|_|\___|  \___/|_.__// |\___|\___|\__|___/
  #                                                              |_|                      |__/
  def set_objects_stable_parameters_minimum(self, objects_range: range = range(1)):
  def set_objects_stable_parameters_maximum(self, objects_range: range = range(1)):
  def set_objects_stable_parameters_default(self, objects_range: range = range(1)):
  def set_objects_stable_parameters_random(self, objects_range: range = range(1)):
  
  def set_objects_polar_position_minimum(self, objects_range: range = range(1)):
  def set_objects_polar_position_maximum(self, objects_range: range = range(1)):
  def set_objects_polar_position_default(self, objects_range: range = range(1)):
  def set_objects_polar_position_random(self, objects_range: range = range(1)):
  
  def set_objects_cartesian_position_minimum(self, objects_range: range = range(1)):
  def set_objects_cartesian_position_maximum(self, objects_range: range = range(1)):
  def set_objects_cartesian_position_default(self, objects_range: range = range(1)):
  def set_objects_cartesian_position_random(self, objects_range: range = range(1)):
  
  def set_objects_gain_minimum(self, objects_range: range = range(1)):
  def set_objects_gain_maximum(self, objects_range: range = range(1)):
  def set_objects_gain_default(self, objects_range: range = range(1)):
  def set_objects_gain_random(self, objects_range: range = range(1)):
  
  #   _            _        _    _ _         _     _           _
  #  | |_ ___  ___| |_     / \  | | |   ___ | |__ (_) ___  ___| |_ ___
  #  | __/ _ \/ __| __|   / _ \ | | |  / _ \| '_ \| |/ _ \/ __| __/ __|
  #  | ||  __/\__ \ |_   / ___ \| | | | (_) | |_) | |  __/ (__| |_\__ \
  #   \__\___||___/\__| /_/   \_\_|_|  \___/|_.__// |\___|\___|\__|___/
  #                                             |__/
  def set_all_objects_stable_parameters_minimum(self):
  def set_all_objects_stable_parameters_maximum(self):
  def set_all_objects_stable_parameters_default(self):
  def set_all_objects_stable_parameters_random(self):
  
  def set_all_objects_polar_position_minimum(self):
  def set_all_objects_polar_position_maximum(self):
  def set_all_objects_polar_position_default(self):
  def set_all_objects_polar_position_random(self):
  
  def set_all_objects_cartesian_position_minimum(self):
  def set_all_objects_cartesian_position_maximum(self):
  def set_all_objects_cartesian_position_default(self):
  
  def set_all_objects_gain_minimum(self):
  def set_all_objects_gain_maximum(self):
  def set_all_objects_gain_default(self):
  

StressClient

class StressClient(TestClient):

  def stress_polar_position(self, number_of_objects: int = 1, duration_in_second: float = 10.0, interval_in_milliseconds: float = 10.0):
  def stress_cartesian_position(self, number_of_objects: int = 1, duration_in_second: float = 10.0, interval_in_milliseconds: float = 10.0):
  def stress_all(self, number_of_objects: int = 1, duration_in_second: float = 10.0, interval_in_milliseconds: float = 10.0):