DALI software release notes
Version 2.1
2024-07-04 (Latest)
New Feature:
The optional variable "Current bus unit configuration" of memory bank 0 with the address 0x1B has been added. This also includes a new vendor configuration parameter for initialization.
Fix:
Added missing device type 52 (Diagnostics & Maintenance) in Query (next) device type.
The query of the extended version number of the device extensions (device types 49, 51 and 52) has been corrected.
Mechanism for determining and updating the "Number of last accessible memory bank" in memory bank 0 address 0x02 has been adapted. The addition and/or removal of manufacturer-specific memory banks is now taken into account.
The Memory Bank 0 variables "102 version number of all integrated control gear" and "103 version number of all integrated control devices" are now set according to the configured stack mode (control gear, control device) and are no longer generally initialized with 2.0.
Mechanism for sending extended commands with the DALI stack configured as a control device has been revised. The modules DT6 (LED), DT7 (Switching), DT8 (Color) are affected.
Correction to the storage mechanism
Version 2.0
2023-10-16
New Feature:
Writing a cell in a manufacturer-specific memory bank triggers the reaction DALILIB_REACT_INTERNAL_CTRL_GEAR_MEMORY_CELL_CHANGED for control gears
Writing a cell in a manufacturer-specific memory bank triggers the reaction DALILIB_REACT_INTERNAL_CTRL_DEVICE_MEMORY_CELL_CHANGED for control devices
Control Gear: DT8 RGBWAF-only added
Service and debug functions added
a) Stop and start the Dali receiver
b) Hardware error detection during transmission
(transmitter and/or receiver level converter defective)c) Send 8-bit test frame (without Api)
d) Function for returning the version and build number.
e) Build number newly introduced in LL-Driver
Fix:
Cumulative time error during transmission (interferes with 102.6.4) corrected
The TERMINATE command triggers a save operation if a persistent variable has changed during initialized mode.
(Part 102 Sequence 7.1)Racecondition in RecieveQueue handling removed.
Interrupt-enable/disable callbacks removed. No longer necessary due to resolution of the race condition.
Version 1.11
2023-03-24
New Feature:
Define DEBUG_LOG was introduced in order to be able to switch logging on and off separately from the DEBUG version
Configuration parameter deactivateAutomaticSavePersistent has been introduced. If this is set, saving the persistent variables is only triggered by an internal action.
If the stack has reset the persistent variables to default values, the application is now notified by a reaction.
New reaction added to enable a distinction between Init and Reset when resetting the persistent variables to default values
OperatingMode 0x80 - 0xFF is now permitted by the stack
The calculation of the target level has been revised. When the value is changed, the application is notified via a newly introduced reaction
New configuration parameters have been introduced:
- to specify the offset between the start of the stack and the current time
- to use a random value for calculating the random seedRepeated dimming now uses the actual (high resolution) light level as the start level instead of using the rounded ActualLevel.
The internal actions "DALILIB_ACT_INTERNAL_CTRL_GEAR_EXEC_DAPC" and "DALILIB_ACT_INTERNAL_CTRL_GEAR_EXEC_DAPC_RAW_VALUE" trigger a process that corresponds to that of an external incoming DAPC command and uses the existing settings (fading) during the transition.
Any number of custom Membanks can be created. The number of Membanks is still limited by MAXMEMBANKS
MAXMEMBANKS has been moved from "defines.h" to "libdali.h" and thus to the user-configurable area
For custom memory banks, addresses 1 and 2 can now be written to via `WRITE MEMORY LOCATION`.
In the gear_calc_actual_level() function, the calculation of the stepValues has been revised in order to increase the resolution when dimming.
New enumeration added that allows the application to differentiate between total and partial lamp failure when setting and querying the lamp failure status.
Make memory bank 1 available as a user memory bank in GEARS if DALI Part 251 DiiA extension is deactivated
Proprietary frames between 9 and 12 bits are now also reported to the application. These can also occur with responses from poorly programmed gears that should actually generate a collision. This allows the application to help itself.
SET OPERATING MODE now triggers a DALILIB_CTRL_GEAR_REACTION with the reaction code DALILIB_REACT_INTERNAL_CTRL_GEAR_SET_OPERATING_MODE
Function for deleting (reference) manufacturer-specific memory banks implemented
SET OPERATING MODE now triggers a DALILIB_CTRL_DEVICE_REACTION with the reaction code DALILIB_REACT_INTERNAL_CTRL_DEVICE_SET_OPERATING_MODE
Fix:
The reaction DALILIB_REACT_INTERNAL_CTRL_GEAR_DEFAULT_PERS_MEMORY now contains data in the struct gearReact
The IDENTIFY DEFICE command is executed according to specification, DALI_CTRL_DEVICE_IDENTIFY_DEVICE_TIME_MAX has been increased to 10s. The stack informs the application about a newly introduced reaction when the Identify device status changes.
The Identify device is reset for commands (except queries)
Send-Twice commands preceded by the ENABLE DEVICE TYPE command are executed.
The QUERY MANUFACTURER SPECIFIC MODE command is answered with Yes if the stack is running in a manufacturer-specific mode.
When the dimming curve is changed, the corresponding bit in the operatingMode variable is set or deleted.
When dimming using the dimming rate, overflow or underflow is avoided.
The stack configured as gear responds to the QUERY GEAR PRESENT command with Yes if the short address is MASK.
When dimming, the targetLevel is set directly to 0.
The Send Twice timeout has been reduced to 99 ms.
An underflow occurred in gear_calc_actual_level() during the calculation of stepValue; the calculation is now performed as a 64-bit integer.
Dimming processes are completed after the dimming time has elapsed
If targetLevel is 0, the actualLevel is set to 0 at the end of the dimming process
If the stepTime is low, the dimming process is only ended after the dimming step has been executed
After a system failure, the actualLevel is retained
When the first UP/DOWN command is executed, the first step is executed before the dimming process begins
When calculating the diffLevel in gear_calc_dimmrate(), the carryover is taken into account for UP/DOWN sequences
When UP and DOWN commands are received, the stack aborts the current dimming process
When calculating the stepTime of a dimming organ, a division by zero could occur; this is now tested and the division is avoided.
The DAPC(MASK) command retains limitError
With the UP command, the stack sets limitError if acutalLevel is already at maxLevel or minLevel or if the limits are exceeded when calculating the targetLevel
With a PowerOn, the stack sets the targetLevel with a check of the limits, so that limitError is also set if necessary
With DAPC sequences, the dimming process was calculated incorrectly so that there was no level change during dimming; now the dimming process is calculated correctly.
When executing the GO TO SCENE command (actualLevel equals targetLevel), no dimming process is triggered in this case
The stack only changes the actualLevel when the RECALL MIN LEVEL and RECALL MAX LEVEL commands are executed.
During the Identify device process, the stack set the actual light level to different brightnesses depending on the initializationState; now the stack always switches between off and 100 %.
When the Identify device process is ended, the actual light level is set when the process is ended
When executing the commands DAPC, SET POWER ON LEVEL and DTR0 (and other instructions), the stack terminates the Identify device process
The RECALL MIN LEVEL and RECALL MAX LEVEL commands set the actual light level to PHM or 100 %, regardless of the initializationState, if initializationState is not equal to DISABLED
During a dimming process, the new actualLevel is only set if the targetLevel has not yet been reached
In gear_init_after_power_cycle(), the targetLevel is only set together with the actualLevel after the power-on time has expired
The stack can differentiate between total lamp failure and partial lamp failure and communicate the respective status to it - the stack then sets the variables lampFailure and lampOn accordingly
The dimming times of fastFadeTime were taken from Table 1 in IEC 62386-207:2009, now the stack can use the dimming times from Table 1 in IEC 62386-207:2018, switchable to compile time via newly introduced define.
If the startTimeOffset was greater than the currentTime, the start time for the power-on procedure for gears and for the power cycle notification for application controllers was calculated incorrectly; now the start time is calculated correctly with wrap-around.
If a system failure occurs during the power-on time, the stack aborts the power-on procedure
IAR compiler warnings have been corrected
If minLevel and targetLevel were set to 1, the stack set the targetLevel to 0 when the STEP DOWN command was executed; now the targetLevel remains at 1 in this case.
When executing the GO TO SCENE (MASK) command, the stack sets powerCycleSeen to FALSE if sceneLevel is equal to MASK
If the DAPC (MASK) command is processed during the power-on procedure, the stack aborts this process.
The first dimming step of a dimming process was carried out 10ms after the start, even if the stepTime was significantly smaller; now a status frame is requested by the low-level driver in 2ms at the start of the dimming process, so that the first dimming step is carried out after 2ms if the stepTime is low.
With high-resolution dimming, the newly calculated light level was passed on to the application each time the timingHelper was called; now the stack only passes on the newly calculated light level to the application if the light level has changed.
Internal actions are executed during bus power down or system failure.
When initializing a stack instance, active instances are taken into account and the corresponding values in their memory bank 0 are updated
Keil compiler warnings have been corrected
If MEM_BANK1_EXTENSION is activated, 0x08 (V2.0) is reported for DT50 for QUERY_EXTENDED_VERSION_NUMBER
Defaults for MEM_BANK1 corrected
A go to scene message triggers the new internal reaction "DALILIB_REACT_INTERNAL_CTRL_GEAR_GO_TO_SCENE".
The scene index is written in reactValue.
Get scene internal action returns a percentage value. The raw value is still available via gearReact.reactRawValue.
All events now always contain the event dates
The reaction code of light sensors is no longer set to Unknown if the first bit of the input value is set.
The event filter for light sensors affects the report timer events and not just events that are triggered by value changes.
"QUERY LIGHT SOURCE TYPE" from Part102 - 11.5.19 corrected. Previously, the device type was output instead of the light source type.
The ProbitLab test 102.6.4 (fade to zero) could fail due to the internal time measurement for the API. (fixed)
LL-Driver gets version 1.12
Version 1.10
2022-05-31
New Feature:
Define DEBUG_LOG was introduced in order to be able to switch logging on and off separately from the DEBUG version
Configuration parameter deactivateAutomaticSavePersistent has been introduced. If set, saving the persistent variables is only triggered by an internal action.
If the stack has reset the persistent variables to default values, the application is now notified by a reaction.
New reaction added to enable a distinction between Init and Reset when resetting the persistent variables to default values
OperatingMode 0x80 - 0xFF is now permitted by the stack
The calculation of the target level in the stack has been revised. When the value is changed, the application is notified via a newly introduced reaction
New configuration parameter to specify the offset between the start of the stack and the current time.
Repeated dimming now uses the actual (high resolution) light level as the start level instead of using the rounded ActualLevel.
configuration parameter was introduced in order to be able to use a real random value for the calculation of the random seed.
In the gear_calc_actual_level() function, the calculation of the stepValues has been revised in order to increase the resolution when dimming.
Enumeration added, which allows the application to differentiate between total and partial lamp failure when setting and querying the lamp failure status.
Fix:
The reaction DALILIB_REACT_INTERNAL_CTRL_GEAR_DEFAULT_PERS_MEMORY was incorrect and now contains the expected data in the struct gearReact
The IDENTIFY DEFICE command is now executed according to specification, DALI_CTRL_DEVICE_IDENTIFY_DEVICE_TIME_MAX has been increased to 10s. The stack informs the application about a newly introduced reaction when the Identify device status changes.
Identify device is now reset for commands (except queries)
Send-Twice commands with the preceding ENABLE DEVICE TYPE command have been discarded and are now executed.
The QUERY MANUFACTURER SPECIFIC MODE command was ignored and is now answered with Yes if the stack is running in a manufacturer-specific mode.
The LED command QUERY OPERATING MODE was answered incorrectly - the active dimming curve was ignored; now the corresponding bit in the operatingMode variable is set or deleted when the dimming curve is changed.
When dimming using the dimming rate, an arithmetic overflow or underflow could occur; this is now tested and the overflow or underflow is avoided.
The stack configured as gear did not respond to the QUERY GEAR PRESENT command if the short address was MASK. Now the request is always answered with yes.
When dimming to level 0, the targetLevel was first set to minLevel and only after dimming to 0. Now the targetLevel is set directly to 0.
The Send Twice timeout has been set to 99 ms.
An underflow occurred in gear_calc_actual_level() during the calculation of stepValue; the calculation is now performed as a 64-bit integer.
Dimming processes sometimes ended too early, now the dimming process is completed exactly after the dimming time has elapsed.
With targetLevel equal to 0, the actualLevel was already set to 0 during the dimming process; now the actualLevel is only set to 0 at the end of the dimming process.
With a low stepTime, it could happen that the dimming process was ended before the last dimming step was executed; now the dimming process is only ended after the dimming step has been executed.
After a system failure, the actualLevel was set to zero, now the actualLevel is retained.
When the first UP/DOWN command was executed, the first step before the start of the dimming process was ignored; now this step is executed.
When calculating the diffLevel in gear_calc_dimmrate(), the carryover was ingorized so that too few dimming steps were performed for UP/DOWN sequences; now the carryover is taken into account for UP/DOWN sequences.
The current dimming process was not aborted when UP and DOWN commands were received; now the stack aborts the current dimming process.
When calculating the stepTime of a dimming organ, a division by zero could occur; this is now tested and the division is avoided.
With the DAPC(MASK) command, imitError was set to FALSE, now limitError is retained.
With the UP command, limitError was not set if maxLevel was exceeded during execution. Similarly, limitError was not set for the DOWN command if minLevel was undershot during execution. Now the stack sets limitError if acutalLevel is already at maxLevel or minLevel or if the limits are exceeded when calculating the targetLevel.
With a PowerOn the targetLevel was set directly without checking the limits, now the stack sets the targetLevel with checking the limits, so that limitError is also set if necessary.
With DAPC sequences, the dimming process was calculated incorrectly so that there was no level change during dimming; now the dimming process is calculated correctly.
When executing the GO TO SCENE command, a dimming process was triggered although actualLevel was equal to targetLevel, now no dimming process is triggered in this case.
During the Identify device process the actualLevel was changed, now the stack only changes the actualLevel when the RECALL MIN LEVEL and RECALL MAX LEVEL commands are executed.
During the Identify device process, the stack set the actual light level to different brightness levels depending on the initializationState, now the stack always switches between Off and 100%.
When the Identify device process was terminated, the actual light level was only set if the timer had expired; now it is always set when the process is terminated.
When executing the commands DAPC, SET POWER ON LEVEL and DTR0 (and further instructions) the stack did not finish the Identify device process, now the stack finishes the process.
The RECALL MIN LEVEL and RECALL MAX LEVEL commands always set the actual light level to the same level regardless of the initializationState; now the two commands set the actual light level to PHM or 100% if the initializationState is not equal to DISABLED.
During a dimming process in which the targetLevel had already been reached, the new actualLevel was not recalculated but was still set; now the new actualLevel is only set if the targetLevel has not yet been reached.
In gear_init_after_power_cycle() the targetLevel was already set depending on the powerOnLevel, now the targetLevel is only set together with the actualLevel after the power-on time has expired.
The stack did not differentiate between total lamp failure and partial lamp failure, now the application can communicate the respective status to the stack and the stack sets the variables lampFailure and lampOn accordingly.
The dimming times of fastFadeTime were taken from Table 1 in IEC 62386-207:2009, now the stack can use the dimming times from Table 1 in IEC 62386-207:2018, switchable to compile time via newly introduced define.
If the startTimeOffset was greater than the currentTime, the start time for the power-on procedure for gears and for the power cycle notification for application controllers was calculated incorrectly; now the start time is calculated correctly with wrap-around.
If a system failure occurred during the power-on time, the power-on procedure was not aborted, now the stack aborts the power-on procedure when a system failure is detected.
IAR compiler warnings have been corrected
If minLevel and targetLevel were set to 1, the stack set the targetLevel to 0 when the STEP DOWN command was executed; now the targetLevel remains at 1 in this case.
When executing the GO TO SCENE (MASK) command, powerCycleSeen was not reset, now the stack sets powerCycleSeen to FALSE even if sceneLevel is equal to MASK.
If the DAPC (MASK) command was processed during the power-on procedure, the power-on procedure continued to run unchanged; now the stack aborts the power-on procedure when processing the DAPC (MASK) command.
The first dimming step of a dimming process was carried out 10ms after the start, even if the stepTime was significantly smaller; now a status frame is requested by the low-level driver in 2ms at the start of the dimming process, so that the first dimming step is carried out after 2ms if the stepTime is low.
With high-resolution dimming, the newly calculated light level was passed on to the application each time the timingHelper was called; now the stack only passes on the newly calculated light level to the application if the light level has changed.
Internal actions were discarded during bus power down or system failure, now internal actions are also executed during bus power down or system failure.
If several instances of the stack were started on a bus unit, these were not taken into account during initialization; now, when a stack instance is initialized, instances that are already active are taken into account and the corresponding values in their memory bank 0 are updated.
Keil compiler warnings have been corrected
Version 1.9
2021-10-21
New Feature:
New internal actions have been introduced that enable the stack's operating variables to be read or changed
New configuration parameter has been introduced to set the delay of saving persistent data between 0-29 seconds
The callback functions fAppLoadModuleMem and fAppSaveModuleMem now also pass the pointer to the stack instance and the version of the memory block as parameters
Fix:
The save persistent memory mechanism is now also triggered when the RESET command is processed
Action DALILIB_REACT_INTERNAL_CTRL_DEVICE_DEFAULT_PERS_MEMORY is now also implemented for memory blocks
Before the memory blocks are saved, a check is made to ensure that the device is configured accordingly and is actually using this block
Version 1.8
2021-08-06
New Feature:
New mechanism for saving persistent data has been introduced. Persistent data is now saved separately in modules. New callback functions fAppLoadModuleMem and fAppSaveModuleMem are available for this purpose and the internal data structure has been adapted. A new configuration parameter savePersistentModules has been introduced to activate the new mechanism for saving persistent data. The previous mechanism can still be used
Fix:
The behavior when sending test frames has been corrected
When a bus collision is received, any existing collision is now reported to the application as completed before the new collision is reported
The waiting time of the power cycle notification is now set to a value between 1300 and 4900 ms with continuous uniform distribution
Version 1.7
2021-06-24
New Feature:
The C++ keyword "using" has been replaced by isUsed in the structure dali_instance_t
Fix:
A time parameter has been added to the interface to the low-level driver in order to be able to determine the timeouts of Send Twice frames according to the standard
The newly introduced time parameter of the frame is now used to calculate the timeout
The timeout of Send Twice Frames has been increased to 102ms
The command SEND TESTFRAME is now processed and test frames are sent accordingly
Writable cells can now also be written to in memory bank 201
The processing of the DIRECT WRITE MEMORY command has been corrected
When the QUERY CONTENT DTR2 and DTR2:DTR1 commands are processed, the writeEnableState is no longer reset
When processing the VERIFY SHORT ADDRESS command, the short address mask is now applied and the command is discarded if necessary
When processing the ENABLE INSTANCE command, the system now checks whether the stack is configured as an application controller in order to skip further processing if necessary
Instance commands are now discarded from the stack according to Part 103 Amendment 1 if it is configured as an application controller
Commands reserved in the standard are now correctly recognized and discarded
Version 1.6
2021-05-20
Fix:
The InitializationState is now also reset after the initialization time has elapsed if it is set to WITHDRAWN
The INITIALIZE command no longer overwrites the InitializationState if it is set to WITHDRAWN
The incrementing of DTR0 when executing the WRITE MEMORY CELL or READ MEMORY CELL commands has been corrected and is now carried out according to standard
Version 1.5
2021-05-10
New Feature:
Saving persistent data when changing the value of persistent variables is now triggered 29 seconds after the first value change
Fix:
The overflow of the time counter was faulty and has been corrected
The time counter for the demo runtime was incorrect and has been corrected
When executing the RESET command, the initializationState is no longer reset by default
The number of the memory bank of the D4i extension Part 351 has been corrected to 201
Version 1.4
2021-03-31
New Feature:
D4i extensions can now be switched on or off at compile time
New actions for setting the light level with raw values have been added
Fix:
The return value of fAppSend is now evaluated and R_DALILIB_BUSY is returned to the application in the event of an error
Send Twice frame check has been adjusted, new timeout DALI_SEND_TWICE_TIMEOUT has been introduced
When the value of a persistent variable is changed, the persistent data is now saved immediately
The creation of the frame for the POWER NOTIFICATION event was incorrect and has been corrected according to the standard
Group-addressed commands are now also executed when the group is set
The incrementing of DTR0 when executing the WRITE MEMORY CELL or READ MEMORY CELL commands has been corrected and is now carried out according to standard
Version 1.3
2021-03-08
New Feature:
D4i extensions (parts 250, 251, 252, 253 and 351) are supported by the stack
New configuration parameter savePersistentOnInit added. When the persistent memory is reinitialized, it is saved directly depending on savePersistentOnInit
New internal gear and device action for requesting a buffer with the default data of the persistent memory has been introduced
Fix:
Commands with instance addressing "Device" are now accepted and processed
Forward frames are no longer sent in quiescent mode
If the stack is waiting for a W response but receives a command, the application is now notified of the missing response
The QUERY INSTANCE TYPE command is now only answered by the stack if it is configured as an input device
Warnings generated by -Wextra compiler flag have been fixed
The target level of gears is now also set to 0 without fading when a DAPC 0 command is received
The buffer for the callback functions fPAppSaveMem and fPAppLoadMem has been increased to 512 bytes and the parameter nSize has been increased from uint8_t to uint16_t
The callback functions fPAppSaveMem and fPAppLoadMem now pass the total size of the buffer to the application
The stack now only responds to the QUERY FEATURE TYPE command if it is configured as an input device
IAR compiler warnings have been corrected
Version 1.2
2020-07-15
New Feature:
Actions for communication with DT8 Gears have been added
C++ directive has been added to libdali.h
Collisions on the DALI bus are reported to the application
Source files have been moved to new subdirectory "src" and header files to new subdirectory "inc"
Doxygen source files added to new subdirectory "dali_lib_documentation"
Sending and receiving of proprietary frames with a length of 40 - 64 bits has been implemented
Manufacturer-specific memory banks can now be created by the application
Actions for setting the gear variables powerOnLevel, systemFailureLevel, lastLightLevel, targetLevel and lastActiveLevel have been added
Allowing actions during a DALI bus system failure is now configurable
Actions for device commands READ NEXT MEMORY CELL, WRITE NEXT MEMORY CELL, QUERY MISSING SHORT ADDRESS, QUERY CONTENT DTR0, QUERY CONTENT DTR1, QUERY CONTENT DTR2 and QUERY QUIESCENT MODE have been added
Actions for communication with light sensor and occupancy sensor devices have been added
Fix:
Responses to QUERY NEXT DEVICE TYPE and QUERY MISSING SHORT ADDRESS actions are now forwarded to the application
Responses to commands GEAR_CMD_DTR2, GEAR_CMD_QUERY_CONTENT_DTR0, GEAR_CMD_QUERY_CONTENT_DTR1 and GEAR_CMD_QUERY_CONTENT_DTR2 are now evaluated correctly.
Command sequences of the actions DALILIB_ACT_CTRL_GEAR_WRITE_MEMORY_CELL, DALILIB_ACT_CTRL_GEAR_LED_SELECT_DIMMING_CURVE and DALILIB_ACT_CTRL_GEAR_LED_SET_FAST_FADE_TIME were faulty and have been adapted to the DALI standard.
Warnings generated by -Wextra compiler flag have been fixed
Received events with schema "Device/Instance" are now correctly forwarded to the application