syndilights/open-lighting-architecture/libartnet-1.1.0/artnet/artnet.h

347 lines
11 KiB
C
Raw Normal View History

2010-10-31 17:32:25 +01:00
/*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* artnet.h
* Interface to libartnet
* Copyright (C) 2004-2007 Simon Newton
*/
#ifndef ARTNET_HEADER_H
#define ARTNET_HEADER_H
#include <stdint.h>
// order is important here for osx
#include <sys/types.h>
#ifndef WIN32
#include <sys/select.h>
#else
#include <Winsock2.h>
typedef unsigned long in_addr_t;
#endif
#include <artnet/common.h>
/* the external storage class is "extern" in UNIX; in MSW it's ugly. */
#ifndef EXTERN
#ifdef MSW
#define EXTERN __declspec(dllexport) extern
#else
#define EXTERN extern
#endif /* MSW */
#endif
#ifdef __cplusplus
extern "C" {
#endif
EXTERN int ARTNET_ADDRESS_NO_CHANGE;
/**
* An enum for setting the behaviour of a port.
* Ports can either input data (DMX -> ArtNet) or
* output (ArtNet -> DMX) data.
*/
typedef enum {
ARTNET_ENABLE_INPUT = 0x40, /**< Enables the input for this port */
ARTNET_ENABLE_OUTPUT = 0x80 /**< Enables the output for this port */
} artnet_port_settings_t;
typedef enum {
ARTNET_PC_NONE = 0x00,
ARTNET_PC_CANCEL = 0x01,
ARTNET_PC_LED_NORMAL = 0x02,
ARTNET_PC_LED_MUTE = 0x03,
ARTNET_PC_LED_LOCATE = 0x04,
ARTNET_PC_RESET = 0x05,
ARTNET_PC_MERGE_LTP_O = 0x10,
ARTNET_PC_MERGE_LTP_1 = 0x11,
ARTNET_PC_MERGE_LTP_2 = 0x12,
ARTNET_PC_MERGE_LTP_3 = 0x13,
ARTNET_PC_MERGE_HTP_0 = 0x50,
ARTNET_PC_MERGE_HTP_1 = 0x51,
ARTNET_PC_MERGE_HTP_2 = 0x52,
ARTNET_PC_MERGE_HTP_3 = 0x53,
ARTNET_PC_CLR_0 = 0x93,
ARTNET_PC_CLR_1 = 0x93,
ARTNET_PC_CLR_2 = 0x93,
ARTNET_PC_CLR_3 = 0x93,
} artnet_port_command_t;
/*
* An enum for the type of data transmitted on a port.
* As far as I know, only DMX-512 is supported
*/
typedef enum {
ARTNET_PORT_DMX = 0x00, /**< Data is DMX-512 */
ARTNET_PORT_MIDI = 0x01, /**< Data is MIDI */
ARTNET_PORT_AVAB = 0x02, /**< Data is Avab */
ARTNET_PORT_CMX = 0x03, /**< Data is Colortran CMX */
ARTNET_PORT_ADB = 0x04, /**< Data is ABD 62.5 */
ARTNET_PORT_ARTNET = 0x05 /**< Data is ArtNet */
} artnet_port_data_code;
// defines the status of the firmware transfer
typedef enum {
ARTNET_FIRMWARE_BLOCKGOOD = 0x00,
ARTNET_FIRMWARE_ALLGOOD = 0x01,
ARTNET_FIRMWARE_FAIL = 0xff,
} artnet_firmware_status_code;
// tod actions
typedef enum {
ARTNET_TOD_FULL = 0x00,
ARTNET_TOD_FLUSH = 0x01,
} artnet_tod_command_code;
/**
* An enum for refering to a particular input or output port.
*/
typedef enum {
ARTNET_INPUT_PORT = 1, /**< The input port */
ARTNET_OUTPUT_PORT, /**< The output port */
} artnet_port_dir_t;
/*
* Enum describing the type of node
*/
typedef enum {
ARTNET_SRV, /**< An ArtNet server (transmitts DMX data) */
ARTNET_NODE, /**< An ArtNet node (dmx reciever) */
ARTNET_MSRV, /**< A Media Server */
ARTNET_ROUTE, /**< No Effect currently */
ARTNET_BACKUP, /**< No Effect currently */
ARTNET_RAW /**< Raw Node - used for diagnostics */
} artnet_node_type;
/*
* Enum for the talk-to-me value
* These values can be &'ed togeather, so for example to set private replies
* and auto replying use :
* (ARTNET_TTM_PRIVATE & ARTNET_TTM_AUTO)
*/
typedef enum {
ARTNET_TTM_DEFAULT = 0xFF, /**< default, ArtPollReplies are broadcast, and nodes won't send a ArtPollReply when conditions change */
ARTNET_TTM_PRIVATE = 0xFE, /**< ArtPollReplies aren't broadcast */
ARTNET_TTM_AUTO = 0xFD /**< ArtPollReplies are send when node conditions chang */
} artnet_ttm_value_t;
/**
* Enums for the application defined handlers
*/
typedef enum {
ARTNET_RECV_HANDLER, /**< Called on reciept of any ArtNet packet */
ARTNET_SEND_HANDLER, /**< Called on transmission of any ArtNet packet */
ARTNET_POLL_HANDLER, /**< Called on reciept of an ArtPoll packet */
ARTNET_REPLY_HANDLER, /**< Called on reciept of an ArtPollReply packet */
ARTNET_DMX_HANDLER, /**< Called on reciept of an ArtDMX packet */
ARTNET_ADDRESS_HANDLER, /**< Called on reciept of an ArtAddress packet */
ARTNET_INPUT_HANDLER, /**< Called on reciept of an ArtInput packet */
ARTNET_TOD_REQUEST_HANDLER, /**< Called on reciept of an ArtTodRequest packet */
ARTNET_TOD_DATA_HANDLER, /**< Called on reciept of an ArtTodData packet */
ARTNET_TOD_CONTROL_HANDLER, /**< Called on reciept of an ArtTodControl packet */
ARTNET_RDM_HANDLER, /**< Called on reciept of an ArtRdm packet */
ARTNET_IPPROG_HANDLER, /**< Called on reciept of an ArtIPProg packet */
ARTNET_FIRMWARE_HANDLER, /**< Called on reciept of an ArtFirmware packet */
ARTNET_FIRMWARE_REPLY_HANDLER, /**< Called on reciept of an ArtFirmwareReply packet */
} artnet_handler_name_t;
/*
* Describes a remote ArtNet node that has been discovered
*/
typedef struct artnet_node_entry_s {
uint8_t ip[ARTNET_IP_SIZE]; /**< The IP address, Network byte ordered*/
int16_t ver; /**< The firmware version */
int16_t sub; /**< The subnet address */
int16_t oem; /**< The OEM value */
uint8_t ubea; /**< The UBEA version */
uint8_t status;
uint8_t etsaman[ARTNET_ESTA_SIZE]; /**< The ESTA Manufacturer code */
uint8_t shortname[ARTNET_SHORT_NAME_LENGTH]; /**< The short node name */
uint8_t longname[ARTNET_LONG_NAME_LENGTH]; /**< The long node name */
uint8_t nodereport[ARTNET_REPORT_LENGTH]; /**< The node report */
int16_t numbports; /**< The number of ports */
uint8_t porttypes[ARTNET_MAX_PORTS]; /**< The type of ports */
uint8_t goodinput[ARTNET_MAX_PORTS];
uint8_t goodoutput[ARTNET_MAX_PORTS];
uint8_t swin[ARTNET_MAX_PORTS];
uint8_t swout[ARTNET_MAX_PORTS];
uint8_t swvideo;
uint8_t swmacro;
uint8_t swremote;
uint8_t style;
uint8_t mac[ARTNET_MAC_SIZE]; /**< The MAC address of the node */
} artnet_node_entry_t;
/** A pointer to an artnet_node_entry_t */
typedef artnet_node_entry_t *artnet_node_entry;
typedef struct {
char short_name[ARTNET_SHORT_NAME_LENGTH];
char long_name[ARTNET_LONG_NAME_LENGTH];
uint8_t subnet;
uint8_t in_ports[ARTNET_MAX_PORTS];
uint8_t out_ports[ARTNET_MAX_PORTS];
} artnet_node_config_t;
/** The local ArtNet node */
typedef void *artnet_node;
/** A list of remote ArtNet nodes */
typedef void *artnet_node_list;
// node control functions
EXTERN artnet_node artnet_new(const char *ip, int verbose);
EXTERN int artnet_setoem(artnet_node vn, uint8_t hi, uint8_t lo);
EXTERN int artnet_setesta(artnet_node vn, char hi, char lo);
EXTERN int artnet_set_bcast_limit(artnet_node vn, int limit);
EXTERN int artnet_start(artnet_node n);
EXTERN int artnet_read(artnet_node n, int timeout);
EXTERN int artnet_stop(artnet_node n);
EXTERN int artnet_destroy(artnet_node n);
int artnet_join(artnet_node vn1, artnet_node vn2);
// handler functions
// these need to be cleaned up into a generic interface
EXTERN int artnet_set_handler(artnet_node vn,
artnet_handler_name_t handler,
int (*fh)(artnet_node n, void *pp, void *d),
void* data);
EXTERN int artnet_set_dmx_handler(artnet_node vn,
int (*fh)(artnet_node n, int port, void *d),
void *data);
EXTERN int artnet_set_program_handler(artnet_node vn,
int (*fh)(artnet_node n, void *d),
void *data);
EXTERN int artnet_set_firmware_handler(artnet_node vn,
int (*fh)(artnet_node n, int ubea, uint16_t *data, int length, void *d),
void *data);
EXTERN int artnet_set_rdm_handler(artnet_node vn,
int (*fh)(artnet_node n, int address, uint8_t *rdm, int length, void *d),
void *data);
EXTERN int artnet_set_rdm_initiate_handler(artnet_node vn,
int (*fh)(artnet_node n, int port, void *d),
void *data);
EXTERN int artnet_set_rdm_tod_handler(artnet_node vn,
int (*fh)(artnet_node n, int port, void *d),
void *data);
// send functions
EXTERN int artnet_send_poll(artnet_node n,
const char *ip,
artnet_ttm_value_t talk_to_me);
EXTERN int artnet_send_poll_reply(artnet_node n);
EXTERN int artnet_send_dmx(artnet_node n,
int port_id,
int16_t length,
const uint8_t *data);
EXTERN int artnet_raw_send_dmx(artnet_node vn,
uint8_t uni,
int16_t length,
const uint8_t *data);
EXTERN int artnet_send_address(artnet_node n,
artnet_node_entry e,
const char *shortName,
const char *longName,
uint8_t inAddr[ARTNET_MAX_PORTS],
uint8_t outAddr[ARTNET_MAX_PORTS],
uint8_t subAddr,
artnet_port_command_t cmd);
EXTERN int artnet_send_input(artnet_node n,
artnet_node_entry e,
uint8_t settings[ARTNET_MAX_PORTS]);
EXTERN int artnet_send_firmware(artnet_node vn,
artnet_node_entry e,
int ubea,
uint16_t *data,
int length,
int (*fh)(artnet_node n, artnet_firmware_status_code code, void *d),
void *user_data);
EXTERN int artnet_send_firmware_reply(artnet_node vn,
artnet_node_entry e,
artnet_firmware_status_code code);
// rdm functions
EXTERN int artnet_send_tod_request(artnet_node vn);
EXTERN int artnet_send_tod_control(artnet_node vn,
uint8_t address,
artnet_tod_command_code action);
EXTERN int artnet_send_tod_data(artnet_node vn, int port);
EXTERN int artnet_send_rdm(artnet_node vn,
uint8_t address,
uint8_t *data,
int length);
EXTERN int artnet_add_rdm_device(artnet_node vn,
int port,
uint8_t uid[ARTNET_RDM_UID_WIDTH]);
EXTERN int artnet_add_rdm_devices(artnet_node vn,
int port,
uint8_t *uid,
int count);
EXTERN int artnet_remove_rdm_device(artnet_node vn,
int port,
uint8_t uid[ARTNET_RDM_UID_WIDTH]);
// recv functions
EXTERN uint8_t *artnet_read_dmx(artnet_node n, int port_id, int *length);
// state changing functions
EXTERN int artnet_set_node_type(artnet_node n, artnet_node_type type);
EXTERN int artnet_set_short_name(artnet_node vn, const char *name);
EXTERN int artnet_set_long_name(artnet_node n, const char *name);
//port manipulation functions
EXTERN int artnet_set_port_type(artnet_node n,
int id,
artnet_port_settings_t settings,
artnet_port_data_code data);
EXTERN int artnet_set_port_addr(artnet_node n,
int id,
artnet_port_dir_t dir,
uint8_t addr);
EXTERN int artnet_set_subnet_addr(artnet_node n, uint8_t subnet);
EXTERN int artnet_get_universe_addr(artnet_node n,
int id,
artnet_port_dir_t dir);
//node list functions
EXTERN artnet_node_list artnet_get_nl(artnet_node n);
EXTERN artnet_node_entry artnet_nl_first(artnet_node_list nl);
EXTERN artnet_node_entry artnet_nl_next(artnet_node_list nl);
EXTERN int artnet_nl_get_length(artnet_node_list nl);
// misc
EXTERN int artnet_dump_config(artnet_node n);
EXTERN int artnet_get_config(artnet_node n, artnet_node_config_t *config);
EXTERN int artnet_get_sd(artnet_node n);
EXTERN int artnet_set_fdset(artnet_node vn, fd_set *fdset);
char *artnet_strerror();
#ifdef __cplusplus
}
#endif
#endif