#include "hmi_control_registry.h" #include #include #include namespace { constexpr std::array kControlDescriptors = { HmiControlDescriptor{HmiControlType::Button, "button", "按钮", "button", "按钮", {0, 0, 120, 40}, HmiBindingKind::Bit, HmiRuntimeValueKind::Bit, true}, HmiControlDescriptor{HmiControlType::Indicator, "indicator", "指示灯", "indicator", "指示灯", {0, 0, 64, 64}, HmiBindingKind::Bit, HmiRuntimeValueKind::Bit, true}, HmiControlDescriptor{HmiControlType::NumericDisplay, "numericDisplay", "数值显示", "numeric-display", "数值显示", {0, 0, 120, 40}, HmiBindingKind::Word, HmiRuntimeValueKind::Word, true}, HmiControlDescriptor{HmiControlType::NumericInput, "numericInput", "数值输入", "numeric-input", "数值输入", {0, 0, 120, 40}, HmiBindingKind::Word, HmiRuntimeValueKind::Word, true}, HmiControlDescriptor{HmiControlType::Label, "label", "文本", "label", "文本", {0, 0, 120, 40}, HmiBindingKind::None, HmiRuntimeValueKind::None, false}, HmiControlDescriptor{HmiControlType::PageJump, "pageJump", "页面跳转", "page-jump", "页面跳转", {0, 0, 120, 40}, HmiBindingKind::None, HmiRuntimeValueKind::None, false}, HmiControlDescriptor{HmiControlType::AlarmList, "alarmList", "报警列表", "alarm-list", "报警信息", {0, 0, 360, 180}, HmiBindingKind::None, HmiRuntimeValueKind::None, false}, HmiControlDescriptor{HmiControlType::ProgressBar, "progressBar", "进度条", "progress-bar", "进度", {0, 0, 240, 36}, HmiBindingKind::Word, HmiRuntimeValueKind::Word, true} }; static_assert( kControlDescriptors.size() == static_cast(HmiControlType::Count), "每个 HMI 控件类型都必须注册描述"); } // namespace const HmiControlDescriptor *findHmiControlDescriptor(HmiControlType type) { const auto descriptor = std::find_if( kControlDescriptors.cbegin(), kControlDescriptors.cend(), [type](const HmiControlDescriptor &candidate) { return candidate.type == type; }); return descriptor == kControlDescriptors.cend() ? nullptr : &*descriptor; } const HmiControlDescriptor *findHmiControlDescriptor( std::string_view storage_name) { const auto descriptor = std::find_if( kControlDescriptors.cbegin(), kControlDescriptors.cend(), [storage_name](const HmiControlDescriptor &candidate) { return storage_name == candidate.storageName; }); return descriptor == kControlDescriptors.cend() ? nullptr : &*descriptor; } std::optional hmiBindingArea(HmiBindingKind binding_kind) { switch (binding_kind) { case HmiBindingKind::Bit: { return RegisterArea::M; } case HmiBindingKind::Word: { return RegisterArea::D; } case HmiBindingKind::None: default: { return std::nullopt; } } }