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.

Difference between revisions of "Using OLA with Xcode"

From wiki.openlighting.org

Jump to: navigation, search
(Example code)
 
(8 intermediate revisions by 5 users not shown)
Line 1: Line 1:
You can use OLA to implement your application in Objective-C++, a bridge between Objective-C and C++. This page explains how to integrate OLA client into your program. The content of this page is based on [http://linux-lighting.googlecode.com/files/OLA%200.6.0.dmg OLA 0.6.0 Universal Mac Binaries]
+
You can use OLA to implement your application in Objective-C++, a bridge between Objective-C and C++. This page explains how to integrate OLA client into your program.  
 +
 
 +
See also: http://www.bennigraf.de/wp-content/uploads/2012/11/writing-scola.pdf
 +
 
  
 
==What you'll need==
 
==What you'll need==
 
* Xcode
 
* Xcode
* [http://linux-lighting.googlecode.com/files/OLA%200.6.0.dmg OLA 0.6.0 Universal Mac Binaries] installed
+
* [http://www.openlighting.org/ola/mac-install/ OLA for Mac OS X] installed
 +
 
 +
== Create a new Project ==
 +
# File -> New Project, from the right under Mac OS X, select 'Application', then in the left panel choose 'Cocoa Application'
 +
# Once the main window pops up, right click the 'main.m' file and select rename. Change the name to 'main.mm' (required for Objective-C++ extensions)
  
 
==Configure your project==
 
==Configure your project==
 
# Select menu: "Project" -> "Edit Project Settings". All settings below are referred in a "Build" tab
 
# Select menu: "Project" -> "Edit Project Settings". All settings below are referred in a "Build" tab
# Set "Architectures" to 32-bit Universal
+
# Under 'Search Paths', set "Header Search Paths" to /usr/local/include (Source) or /opt/local/include (MacPorts) , depending on how you installed OLA.
# Set "Header Search Paths" to  
 
/usr/local/include
 
  
==Add dylib==
+
==Add the required libraries==
# In your project tree, right-click on a group that contain frameworks (e.g. "External Frameworks and Libraries", "Fromeworks/Linked Frameworks"), select "Add" -> "Existing Frameworks"
+
# In your project tree, right-click on a group that contain frameworks (e.g. "External Frameworks and Libraries", "Frameworks/Linked Frameworks"), select "Add" -> "Existing Frameworks"
 
# Select following frameworks:
 
# Select following frameworks:
 
#* libprotobuf.dylib
 
#* libprotobuf.dylib
Line 19: Line 24:
  
 
==Example code==
 
==Example code==
The following code sends value 255 to channel 0 in universe 0. First, it creates a client from a SimpleClient object. Then, it creates a DMX data array and pack the array to a buffer. In the end, it sends the buffer to a server.  
+
The following code sends value 255 to channel 0 in universe 0. First, it creates a client from a SimpleClient object. Then, it creates a DMX buffer and sets channel 0 to 255. Finally it sends the buffer to a server.  
  
  #import <Foundation/Foundation.h>
+
  #import <Cocoa/Cocoa.h>  
#include <errno.h>
 
 
  #import <ola/DmxBuffer.h>
 
  #import <ola/DmxBuffer.h>
 
  #import <ola/SimpleClient.h>
 
  #import <ola/SimpleClient.h>
+
 
// define type for DMX message
+
  int main(int argc, char *argv[]) {
typedef unsigned char dmx_t ;
+
  ola::SimpleClient simpleClient;
+
  if (!simpleClient.Setup()) {
// maximum number of channels
+
    NSLog(@"Client setup failed");
int MAXCHANNELS=512;
+
    return -1;
+
  }
  int main (int argc, const char * argv[]) {
+
 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
+
  ola::OlaClient *client = simpleClient.GetClient();
+
 
    // get a client
+
  ola::DmxBuffer buffer;
ola::SimpleClient simpleClient;
+
  buffer.Blackout();
if (!simpleClient.Setup()) {
+
  buffer.SetChannel(0, 255);
NSLog(@"Client setup failed %s", strerror(errno));
+
 
return -1;
+
  unsigned int universe = 0;
}
+
  if (!client->SendDmx(universe, buffer)) {
+
    NSLog(@"Sending DMX failed");
ola::OlaClient *client = simpleClient.GetClient();
+
  }
+
  return 0;
+
  // you could also run the main app here
// prepare data
+
  return NSApplicationMain(argc,  (const char **) argv);
int channel = 0;
 
dmx_t *dmx = (dmx_t *)calloc(MAXCHANNELS + 10, sizeof(dmx_t));
 
dmx[channel] = 255;
 
ola::DmxBuffer buffer(dmx, MAXCHANNELS);
 
 
 
// send DMX message
 
int universe = 0;
 
if (!client->SendDmx(universe, buffer)) {
 
NSLog(@"Sending DMX failed %s", strerror(errno));
 
}
 
 
    [pool drain];
 
    return 0;
 
 
  }
 
  }
  
Notice that DMX API is changed since the last documented [http://opendmx.net/index.php/OLA_Client_API client API]. You can find more information by browsing the source file of [http://linux-lighting.googlecode.com/files/ola-examples-0.6.0.tar.gz DMX example]. For me, the src/ola-client.cpp is quite useful.
+
You can find more information by browsing the source file of [http://linux-lighting.googlecode.com/files/ola-examples-0.6.0.tar.gz DMX example]. For me, the src/ola-client.cpp is quite useful.
  
 
Here is another example that create OlaServer and communicate with a pipe socket.
 
Here is another example that create OlaServer and communicate with a pipe socket.
Line 85: Line 75:
 
   
 
   
 
  // create a server  
 
  // create a server  
 +
ola::network::SelectServer server;
 +
 +
// create a select server
 
  ola::network::SelectServer server;
 
  ola::network::SelectServer server;
 
 
 
 
Line 95: Line 88:
 
  }
 
  }
 
 
 
 
  // add socket to server
+
  // add socket to select server
 
  server.AddSocket(socket, true);
 
  server.AddSocket(socket, true);
 
 
 
 
 +
// create server daemon
 +
        // *** see: olad/Olad.cpp for more detail ***
 +
 
     // get a client
 
     // get a client
 
  ola::OlaClient client(socket);
 
  ola::OlaClient client(socket);

Latest revision as of 10:49, 20 December 2014

You can use OLA to implement your application in Objective-C++, a bridge between Objective-C and C++. This page explains how to integrate OLA client into your program.

See also: http://www.bennigraf.de/wp-content/uploads/2012/11/writing-scola.pdf


What you'll need

Create a new Project

  1. File -> New Project, from the right under Mac OS X, select 'Application', then in the left panel choose 'Cocoa Application'
  2. Once the main window pops up, right click the 'main.m' file and select rename. Change the name to 'main.mm' (required for Objective-C++ extensions)

Configure your project

  1. Select menu: "Project" -> "Edit Project Settings". All settings below are referred in a "Build" tab
  2. Under 'Search Paths', set "Header Search Paths" to /usr/local/include (Source) or /opt/local/include (MacPorts) , depending on how you installed OLA.

Add the required libraries

  1. In your project tree, right-click on a group that contain frameworks (e.g. "External Frameworks and Libraries", "Frameworks/Linked Frameworks"), select "Add" -> "Existing Frameworks"
  2. Select following frameworks:
    • libprotobuf.dylib
    • libola.dylib
    • libolacommon.dylib

Example code

The following code sends value 255 to channel 0 in universe 0. First, it creates a client from a SimpleClient object. Then, it creates a DMX buffer and sets channel 0 to 255. Finally it sends the buffer to a server.

#import <Cocoa/Cocoa.h> 
#import <ola/DmxBuffer.h>
#import <ola/SimpleClient.h>
 
int main(int argc, char *argv[]) {
 ola::SimpleClient simpleClient;
 if (!simpleClient.Setup()) {
   NSLog(@"Client setup failed");
   return -1;
 }
 
 ola::OlaClient *client = simpleClient.GetClient();
 
 ola::DmxBuffer buffer;
 buffer.Blackout();
 buffer.SetChannel(0, 255);
 
 unsigned int universe = 0;
 if (!client->SendDmx(universe, buffer)) {
   NSLog(@"Sending DMX failed");
 }
 return 0;
 // you could also run the main app here
 return NSApplicationMain(argc,  (const char **) argv);
}

You can find more information by browsing the source file of DMX example. For me, the src/ola-client.cpp is quite useful.

Here is another example that create OlaServer and communicate with a pipe socket.

#import <Foundation/Foundation.h>
#include <errno.h>
#import <ola/DmxBuffer.h>
#import <ola/OlaClient.h>
#import <ola/network/SelectServer.h>
#import <ola/network/Socket.h>

using ola::network::PipeSocket;

// define type for DMX message
typedef unsigned char dmx_t ;

// maximum number of channels
int MAXCHANNELS=512;

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

	// create a server 
	ola::network::SelectServer server;
	
	// create a select server 
	ola::network::SelectServer server;
	
	// create pipe socket
	PipeSocket *socket = new PipeSocket();
	if (!socket->Init())
	{
		NSLog(@"Cannot create pipe socket");
		return -1;
	}
	
	// add socket to select server
	server.AddSocket(socket, true);
	
	// create server daemon
       // *** see: olad/Olad.cpp for more detail ***

    // get a client
	ola::OlaClient client(socket);
	if (!client.Setup()) {
		NSLog(@"Client setup failed %s", strerror(errno));
		return -1;
	}
	
	// prepare data
	int channel = 0;
	dmx_t *dmx = (dmx_t *)calloc(MAXCHANNELS + 10, sizeof(dmx_t));
	dmx[channel] = 255;
	ola::DmxBuffer buffer(dmx, MAXCHANNELS);

	
	// send DMX message
	int universe = 0;
	if (!client.SendDmx(universe, buffer)) {
		NSLog(@"Sending DMX failed %s", strerror(errno));
	}
	
	// cleanup
	free(dmx);
	
    [pool drain];
    return 0;
}