# Cavendish skin uses APIs deprecated in 1.42; keep those warnings out of the error log $wgDeprecationReleaseLimit = "1.41"; $wgEnableSidebarCache = true; $wgParserCacheType = CACHE_DB; OLA Python API: Difference between revisions - wiki.openlighting.org
Personal tools
The Open Lighting Project has moved!

We've launched our new site at www.openlighting.org. This wiki will remain and be updated with more technical information.

OLA Python API: Difference between revisions

From wiki.openlighting.org

Jump to: navigation, search
Doudou (talk | contribs)
No edit summary
 
(8 intermediate revisions by 3 users not shown)
Line 1: Line 1:
== Building the Python Bindings ==
== Building the Python Bindings ==


See [[Building LLA]]  but run ''./configure --enable-python-libs''
You should install readline if you haven't already:


Note that you have to install Swig in order to build the python bindings (sudo apt-get install swig)
<pre>
sudo easy_install readline
</pre>
 
You need the python version of protocol buffers installed.


== Interesting Classes ==
See [[Building OLA]]  but run


; LlaClient
<pre>
: the main connection class
$ ./configure --enable-python-libs
; dmxBuffer
</pre>
: represents a list of DMX channel values
; LlaClientObserver
: base class to handle events
; LlaPlugin
: represents a Plugin
; LlaDevice
: represents a Device


== Sending DMX ==
Check where the modules are going to be installed:
A simple example to send DMX:


<pre>
<pre>
from lla import *
$ grep ^pythondir config.log
import sys
pythondir='/Library/Python/2.5/site-packages'
</pre>
 
Run the usual: make, make check, make install.
 
Check that the modules have been installed correctly in the $pythondir above.


con = LlaClient()
Check that $pythondir appears in sys.path:
if con.start():
  sys.exit()


universe = 0
<pre>
$ python -c "import sys; print sys.path"
</pre>


# create a dmxBuffer for the channel values
If it doesn't add it to $PYTHONPATH:
DMX_LEN = 512
dmx = dmxBuffer(DMX_LEN)
for i in range(0, DMX_LEN):
  dmx[i] = i


con.send_dmx(universe, dmx, DMX_LEN)
<pre>
$ export PYTHONPATH=$PYTHONPATH:/path/to/your/install/dir
</pre>
</pre>


== Receiving DMX ==
You probably want to put this line in your shell .rc file.
 
== Interesting Classes ==
 
; ClientWrapper
: A helper class that connects to the server and creates a new OlaClient
; OlaClient
: The main API
 


Receiving is slightly harder, we need to setup an Observer object to handle the events:
The best documentation is the set of example programs in the python/examples directory.


''' THIS ISN'T WORKING YET ''' [simonn]
== Sending DMX ==
A simple example to send one frame of DMX data:


<pre>
<pre>
from lla import *
import array
import sys
from ola.ClientWrapper import ClientWrapper
 
def DmxSent(state):
  wrapper.Stop()
 
universe = 1
data = array.array('B')
data.append(10)
data.append(50)
data.append(255)
wrapper = ClientWrapper()
client = wrapper.Client()
client.SendDmx(universe, data, DmxSent)
wrapper.Run()
</pre>
 
== Sending Multiple Frames ==


class Observer(LlaClientObserver):
<pre>
  """ Handle the events """
import array
  def new_dmx(self, uni, length, data):
from ola.ClientWrapper import ClientWrapper
    """ Called with new dmx buffer """
    return 0


wrapper = None
loop_count = 0
TICK_INTERVAL = 100  # in ms


# create a new LlaClient
def DmxSent(state):
con = LlaClient()
  if not state.Succeeded():
    wrapper.Stop()


# create an observer object and register
def SendDMXFrame():
ob = Observer()
  # schdule a function call in 100ms
con.set_observer(ob)
  # we do this first in case the frame computation takes a long time.
  wrapper.AddEvent(TICK_INTERVAL, SendDMXFrame)


if con.start():
  # compute frame here
   sys.exit()
  data = array.array('B')
   global loop_count
  data.append(loop_count % 255)
  loop_count += 1
 
  # send
  wrapper.Client().SendDmx(1, data, DmxSent)
                                                                                                                       
 
wrapper = ClientWrapper()
wrapper.AddEvent(TICK_INTERVAL, SendDMXFrame)
wrapper.Run()
</pre>
== Receiving DMX ==
 
Here is some code to receive DMX on universe 1.
 
<pre>
from ola.ClientWrapper import ClientWrapper


con.register_uni(1, LlaClient.REGISTER)
def NewData(data):
  print data


while True:
universe = 1
  con.fd_action(1)


wrapper = ClientWrapper()
client = wrapper.Client()
client.RegisterUniverse(universe, client.REGISTER, NewData)
wrapper.Run()
</pre>
</pre>

Latest revision as of 00:48, 8 June 2011

Building the Python Bindings

You should install readline if you haven't already:

sudo easy_install readline

You need the python version of protocol buffers installed.

See Building OLA but run

$ ./configure --enable-python-libs

Check where the modules are going to be installed:

$ grep ^pythondir config.log
pythondir='/Library/Python/2.5/site-packages'

Run the usual: make, make check, make install.

Check that the modules have been installed correctly in the $pythondir above.

Check that $pythondir appears in sys.path:

$ python -c "import sys; print sys.path"

If it doesn't add it to $PYTHONPATH:

$ export PYTHONPATH=$PYTHONPATH:/path/to/your/install/dir

You probably want to put this line in your shell .rc file.

Interesting Classes

ClientWrapper
A helper class that connects to the server and creates a new OlaClient
OlaClient
The main API


The best documentation is the set of example programs in the python/examples directory.

Sending DMX

A simple example to send one frame of DMX data:

import array
from ola.ClientWrapper import ClientWrapper

def DmxSent(state):
  wrapper.Stop()

universe = 1
data = array.array('B')
data.append(10)
data.append(50)
data.append(255)
wrapper = ClientWrapper()
client = wrapper.Client()
client.SendDmx(universe, data, DmxSent)
wrapper.Run()

Sending Multiple Frames

import array
from ola.ClientWrapper import ClientWrapper

wrapper = None
loop_count = 0
TICK_INTERVAL = 100  # in ms

def DmxSent(state):
  if not state.Succeeded():
    wrapper.Stop()

def SendDMXFrame():
  # schdule a function call in 100ms
  # we do this first in case the frame computation takes a long time.
  wrapper.AddEvent(TICK_INTERVAL, SendDMXFrame)

  # compute frame here
  data = array.array('B')
  global loop_count
  data.append(loop_count % 255)
  loop_count += 1

  # send
  wrapper.Client().SendDmx(1, data, DmxSent)
                                                                                                                        

wrapper = ClientWrapper()
wrapper.AddEvent(TICK_INTERVAL, SendDMXFrame)
wrapper.Run()

Receiving DMX

Here is some code to receive DMX on universe 1.

from ola.ClientWrapper import ClientWrapper

def NewData(data):
  print data

universe = 1

wrapper = ClientWrapper()
client = wrapper.Client()
client.RegisterUniverse(universe, client.REGISTER, NewData)
wrapper.Run()