$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
 Data Marshalling and Unmarshalling
 DDL Access Protocol Identifiers
 DDL Support
 Device description
 Discovery in SDT
 Discovery strings(see EPI19)
 DMP address array conversions
 DMP Constants
 DMP Message format
 DMP structures
 DMP Transmit Functions
 Double linked lists
8-bit equivalent of DATA_FLAG
if set data is present
void DCID_bva(struct dcxt_s *dcxp,
const struct bv_s *bv)
static char * dcid_lit(uint8_t *dcid,
char *buf)
Convert a UUID (DCID) to a C literal which compiles to a binary array.
Convert to host order
COnvert to network order
All DMP messages relate to property addresses.
Simple demonstration DDL tree print.
DDL parser
struct ddlprop_s * ddlref(struct rootdev_s *root,
struct ddlprop_s *pp,
const ddlchar_t *path)
Trace a DDL property cross reference using xml IDs and the syntax specified in the DDL spec.
static void ddltree(char **bpp)
Print the property tree of the specified device.
default value
Device Description for simple Acacian demo device.
Utilities common to multiple demo programs.
Header for demo_utils.c
Acacian has been built on a number of Linux systems using GCC and Gnu Make.
This demo device consists of an EPI23 (ANSI E1.30-1) standard Device Identifier subdevice (including facility to change the device’s UACN) and a two dimensional array of scalar integer properties labelled as a ‘bargraph’ (probably because this was originally the intented display method).
Simple demonstration device application.
For building a simple device, the property map is a static part of the code of the device itself, and the device has no need for DDL (except to serve it up as opaque files as required by EPI-11.
static int disconnectAll(struct Lchannel_s *Lchan,
uint8_t reason)
void discover(void)
Call openSLP to discover available acn.esta services.
Acacian does not implement discovery itself – this is a separate problem which is well addressed by openSLP [SLP] or other SLP implementations.
SDT messages Join and Channel Parameters include ad-hoc address and expiry information that has belongs in Discovery and has no place in SDT.
Utilities for SLP (Service Location Protocol) as specified in epi19
insert an object at the head of the list
insert an object at the tail of the list
insert an object to the left of itemp
insert an object to the right of itemp
declare a link structure
unlink an object
Convert between DMP property address ranges and Arrays suitable for handling in C/C++
Constants from Device Management Protocol
All DMP messages relate to DMP addresses within a component and so all specify one or more addresses in a standard address format.
Within an SDT wrapper it is possible to send multiple DMP blocks.
DMP (Device Management Protocol) functions and API
Device Management Protocol
void dmp_abortblock(struct dmptcxt_s *tcxt)
Reset the pointers for the block and forget any accumulated data.
void dmp_closeblock(struct dmptcxt_s *tcxt)
Close the accumulated PDU block for the transmit context.
void dmp_closeflush(struct dmptcxt_s *tcxt,
uint8_t *nxtp)
Close the current PDU then close and flush all accumulated blocks.
void dmp_closepdu(struct dmptcxt_s *tcxt,
uint8_t *nxtp)
Close and finalize the previously opened PDU
void dmp_flushpdus(struct dmptcxt_s *tcxt)
Flush (transmit) the transmit context.
Get-Property fail
Get-Property reply
Length of header in DMP
Local component DMP layer structure
Number of property subscriptions to accept
DMP messsage vectors (commands)
int dmp_newblock(struct dmptcxt_s *tcxt,
int *size)
Allocate and open a new DMP PDU block for the given transmit context.
uint8_t *dmp_openpdu(struct dmptcxt_s *tcxt,
uint16_t vecnrange,
struct adspec_s *ads,
int size)
Open a new PDU with the message type and address format given by vecnrange.
DMP (DDL appendix B)
Device Management Protocol (DMP section 13)
Device Management Protocol (EPI-19)
Remote component DMP layer structure
Reason codes (From DMP spec)
int dmp_register(ifMC(struct Lcomponent_s *Lcomp))
Register a local component for DMP access.
void dmp_sdtRx(struct member_s *memb,
const uint8_t *pdus,
int blocksize,
void *ref)
This is a callback function which must be passed to SDT to have Acacian’s DMP code parse and handle incoming DMP.
Set-Property fail
Subscribe accept
Subscribe reject
Synchronization event
void dmp_truncatepdu(struct dmptcxt_s *tcxt,
uint32_t count,
uint8_t *nxtp)
Truncate and close the current PDU at a smaller size/count than specified when it was opened.
Length of vector in DMP
Address, and count and increment if range, are 1 byte each
Address, and count and increment if range, are 2 bytes each
Address, and count and increment if range, are 4 bytes each
Illegal value
Redundant in ACN-2010 (applied to obsolete virtual addresses)
Range address, no property values (e.g.
Range address, single value for all properties in range
Range address, one value per property in range
A single property
Mask to select just the address size from header field
Mask to select just the address type from header field
static void dmpconnect(char **bpp)
Open a DMP connection to the specified device.
DMP address and property handling.
DMP address and property mapping
Contains information required for DMP access to a property.
“illegal” data value supplied
property does not support event generation
requester does not have permission for request
property is not readable by Get-Property
unspecified resource limit
device cannot accept subscriptions (does not generate events)
property does not exist
property is not writeable by Set-Property
unspecified refusal or failure
DMX512 and E1.31 access in DDL descriptions
static void dodiscover()
Initiate SLP discovery.
static void dosubscribe(char **bpp,
bool subs)
Construct and send a subscribe message.
Each list member structure contains two pointers lnk.r and lnk.l pointing to its right and left neighbours.
void drop_member(struct member_s *memb,
uint8_t reason)
Drop a member from both its channels.