[x] Understand and Specify how to handle Channel Function Control
see docs/GDTF.md
[x] Implement Channel Function data structures (including serialization)
[x] Server-side Tests for Channel Function Data Structures
[x] Fatal Errors in GDTF parsing are returned via REST and should be displayed to the user
[x] Report Bugs or Issues in GDTF I uncover
[x] Issue about Builder producing ChannelFunctions with non-unique DMX end point. Related: standard does not specify this precisely. Mention my algorithm as suggestion for validity. Maybe disallow the special case where for a certain Mode Master Group multiple ChannelFunctions start at the same DMX value but always must exist the same amount of times.
[x] Issue about hard to understand DMX Values (What is "Byte Mirroring"? Why aren't there more examples?) Suggest renaming to "Shifting with periodic filling of low values" vs Multiplicative Mapping
[x] Forbid using as Mode Master Channel Functions which control a geometry that is referenced by at least two Geometry References if the channel function referencing it as Mode Master is not controlling the same geometry. In other words: A channel function which controls a top level geometry referenced by at least one GeometryReference is only allowed to be a Mode Master if either: There is exactly one Geometry Reference OR the Mode Master controls the same geometry as the depending channel
[x] Build UI for Channel Functions
[x] Home Screen: Split between Fixture Selection (left) and Channel Function sliders (right)
[x] Channel Function sliders display DMX value
[x] Channel Functions in same DMXChannel track and exclude each other
[x] Channel Function Dependencies enable/disable dependent ChannelFunctions
[x] Info on controlled geometry and attribute
[x] clearly show which Channel Functions are hot or frozen
[x] Info on why Channel Function is hot/frozen
e.g. disabled - channel_function_x has to be 12 to 42 to enable this channel function but is 90
e.g. excluded - channel is 90 but channel function only goes from 12 to 42
[x] should use click-on-slider to include
should we use click-on-slider to set mode master to appropriate value? No.
[x] ChannelFunctions should be sorted by Features, FeatureGroups and those should be sorted by importance (Dimmer, PanTilt, Color, ..., Control, RawDmx)
[x] Show Channel Number for Raw DMX ChF
[x] Server-Side State for each Fixture
[x] Design API for Fixture State (initial/update? or KISS?)
[x] Implement Fixture State API server-side
[x] Implement Fixture State API client-side
[x] When you add a new fixture type, it sometimes doesn't show up in the list without a reload
[x] When you add a fixture, it sometimes doesn't show up in the fixture list on the main page
[x] Label Number on the left of ChannelFunction slider isn't visible
[x] UI: outOfRange values of sliders render a slider handle far out to the right or left
[x] Some simple Cypress Test
[x] Remove hardcoded Broadcast IP Address for sending ArtNet. How can we do this as simple as possible?
[x] Performance when moving sliders is really bad - why? (Frontend/Backend? Which process slows it down so much?) There seems to be some Queue that builds up somewhere, as lag gets worse the longer you drag on a slider.
[x] What happens if we patch beyond 512 channels in a universe?
The ArtNet thread crashes and doesn't start up again. Fixed by try/catch with logging and restart every 2 seconds.
[x] Better Default FID and Universe/Address (wasn't there an issue for this?)
[x] Better validate Patch (should not be possible to patch beyond channel 512 for example)
[x] Add cyclic dependency to Fixture State Test
Dropped ToDos:
Refactor Channel Function Initialization (I deem it good enough for a release...)
Sometimes, some ChannelFunctions are disabled without a displayed reason. This seems to need at least two types of fixture, but I can't reproduce beyond that. (couldn't reproduce)
A warnings field in the GdtfWrapper should contain non-fatal warnings about the file. In fact, I think we currently throw for a lot of cases where we could just ignore that specific part of the file. Guideline: Parse as much as possible, while not arbitrarily choosing to perform undefined behavior. (I don't want to refactor the initialization) (moved to #61)
progress on branch
feature/gdtf-channel-functions
ToDo:
docs/GDTF.md
Dropped ToDos: