diff options
Diffstat (limited to 'src/scanout.c')
-rw-r--r-- | src/scanout.c | 94 |
1 files changed, 76 insertions, 18 deletions
diff --git a/src/scanout.c b/src/scanout.c index 53d78c9..53e5948 100644 --- a/src/scanout.c +++ b/src/scanout.c @@ -28,6 +28,21 @@ #include "nanolight.h" +static void set_val(int *dmx, int base_addr, int attr_offset, float value, int sixteenbit) +{ + /* Minus one to convert DMX address to indexing in 'dmx' array */ + int pos = base_addr + attr_offset - 1; + + if ( sixteenbit ) { + int val = value * 65535; + dmx[pos] = (val & 0xff00) >> 8; + dmx[pos+1] = val & 0xff; + } else { + dmx[pos] = value * 255; + } +} + + int scanout_all(struct nanolight *nl) { SoupSession *sess; @@ -42,32 +57,75 @@ int scanout_all(struct nanolight *nl) /* Loop over fixtures and set values */ for ( i=0; i<nl->n_fixtures; i++ ) { + int j; struct fixture *fix = &nl->fixtures[i]; - for ( j=0; j<fix->cls->n_attrs; j++ ) { + struct fixture_class *cls = fix->cls; - /* Minus one to convert DMX address to indexing in 'dmx' array */ - int pos = fix->base_addr + fix->cls->attrs[j].addr_offset - 1; + if ( universe < 0 ) universe = fix->universe; + if ( fix->universe != universe ) { + fprintf(stderr, "Sorry, only one universe for now!\n"); + abort(); + } - if ( universe < 0 ) universe = fix->universe; - if ( fix->universe != universe ) { - fprintf(stderr, "Sorry, only one universe for now!\n"); - abort(); - } + for ( j=0; j<cls->n_magic; j++ ) { + dmx[fix->base_addr + cls->magic_chans[j] - 1] = cls->magic_vals[j]; + } - if ( fix->cls->attrs[j].props & ATTR_STOP ) { + if ( cls->attributes & INTENSITY ) { + set_val(dmx, fix->base_addr, cls->intensity_offset, fix->intensity, + cls->attributes16 & INTENSITY); + } - int v = fix->attr_vals[j]; - assert(!(fix->cls->attrs[j].props & ATTR_16BIT)); - dmx[pos] = fix->cls->attrs[j].stops[v]; + if ( cls->attributes & PANTILT ) { + float pan_val, tilt_val; + pan_val = (fix->pan + 1.0)/2.0; + tilt_val = (fix->tilt + 1.0)/2.0; + set_val(dmx, fix->base_addr, cls->pan_offset, pan_val, + cls->attributes16 & PANTILT); + set_val(dmx, fix->base_addr, cls->tilt_offset, tilt_val, + cls->attributes16 & PANTILT); + } - } else if ( fix->cls->attrs[j].props & ATTR_16BIT ) { - dmx[pos] = (fix->attr_vals[j] & 0xff00) >> 8; - dmx[pos+1] = fix->attr_vals[j] & 0xff; - } else { - dmx[pos] = fix->attr_vals[j]; - } + if ( cls->attributes & COL_CMY ) { + set_val(dmx, fix->base_addr, cls->cyan_offset, fix->cyan, + cls->attributes16 & COL_CMY); + set_val(dmx, fix->base_addr, cls->magenta_offset, fix->magenta, + cls->attributes16 & COL_CMY); + set_val(dmx, fix->base_addr, cls->yellow_offset, fix->yellow, + cls->attributes16 & COL_CMY); } + + if ( cls->attributes & COL_RGB ) { + set_val(dmx, fix->base_addr, cls->red_offset, fix->red, + cls->attributes16 & COL_RGB); + set_val(dmx, fix->base_addr, cls->green_offset, fix->green, + cls->attributes16 & COL_RGB); + set_val(dmx, fix->base_addr, cls->blue_offset, fix->blue, + cls->attributes16 & COL_RGB); + } + + if ( cls->attributes & FOCUS ) { + set_val(dmx, fix->base_addr, cls->focus_offset, fix->focus, + cls->attributes16 & FOCUS); + } + + if ( cls->attributes & ZOOM ) { + set_val(dmx, fix->base_addr, cls->zoom_offset, fix->zoom, + cls->attributes16 & ZOOM); + } + + if ( cls->attributes & FROST ) { + set_val(dmx, fix->base_addr, cls->frost_offset, fix->frost, + cls->attributes16 & FROST); + } + + if ( cls->attributes & IRIS ) { + set_val(dmx, fix->base_addr, cls->iris_offset, fix->iris, + cls->attributes16 & IRIS); + } + + } if ( universe == -1 ) return 0; /* Nothing to do! */ |