New MINOR release 03.04.00 Changes since 03.03.00: BREAKING CHANGES: - fix!: check PV name for illegal characters Only alphanumeric characters (a-z, A-Z and 0-9) and underscores are allowed. This requirement is now enforced, using other characters in PV and module names will result in an exception. This was previously tolerated in many cases but could lead to undefined behaviour. Application developers might need to change their applications and/or logical name mapping files. - fix!: EntityOwner::constant(), Utilities::stripName() etc. These functions were using illegal characters and have been fixed. As a consequence, some framework-generated PV names are changed. In particular, the status PVs for devices which are directly created from a CDD (instead of an alias name) will have different names now. Users might need to adapt their mapping files. Other changes: - feat: add versionInfoProvider - feat: deep input validation (#11558) - feat: UserInputValidator with arrays - feat/fix: StatusAggregator now has always DataValidity::ok - feat/fix: StatusAggregator with messages - feat: PVs with funneled return channel (only control system to application PVs) - feat: set value of StatusWithMessage without writing - feat: StatusWithMessage::writeIfDifferent() etc. - feat: add DOT file generation (#317) - feat: ApplicationFactory in convenience header - fix: setAndWrite() used wrong VersionNumber - fix: workaround for open() not thread safe (#11478) - fix: modify model while visiting (#11012) - fix: shutdown FeedingFanOut with unwritten return channel - fix: UserInputValidator crashes without setErrorFunction() - fix: missing default constructor for PeriodicTrigger - doc: improve conceptual overview - doc: modernise example(s) - chore: formal code cleaning (#316) - chore: enable linter build target - feat(example): add linter target - chore: code cleaning StatusWithMessage - test: add reproduction test for #11105 - test: add tests for UserInputValidator - fix: warning in release builds - fix: add missing spdx header