综合平台编程器项目的远程存储
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 

135 行
3.2 KiB

  1. #include "hmi_control_registry.h"
  2. #include <algorithm>
  3. #include <array>
  4. #include <cstddef>
  5. namespace {
  6. constexpr std::array kControlDescriptors = {
  7. HmiControlDescriptor{HmiControlType::Button,
  8. "button",
  9. "按钮",
  10. "button",
  11. "按钮",
  12. {0, 0, 120, 40},
  13. HmiBindingKind::Bit,
  14. HmiRuntimeValueKind::Bit,
  15. true},
  16. HmiControlDescriptor{HmiControlType::Indicator,
  17. "indicator",
  18. "指示灯",
  19. "indicator",
  20. "指示灯",
  21. {0, 0, 64, 64},
  22. HmiBindingKind::Bit,
  23. HmiRuntimeValueKind::Bit,
  24. true},
  25. HmiControlDescriptor{HmiControlType::NumericDisplay,
  26. "numericDisplay",
  27. "数值显示",
  28. "numeric-display",
  29. "数值显示",
  30. {0, 0, 120, 40},
  31. HmiBindingKind::Word,
  32. HmiRuntimeValueKind::Word,
  33. true},
  34. HmiControlDescriptor{HmiControlType::NumericInput,
  35. "numericInput",
  36. "数值输入",
  37. "numeric-input",
  38. "数值输入",
  39. {0, 0, 120, 40},
  40. HmiBindingKind::Word,
  41. HmiRuntimeValueKind::Word,
  42. true},
  43. HmiControlDescriptor{HmiControlType::Label,
  44. "label",
  45. "文本",
  46. "label",
  47. "文本",
  48. {0, 0, 120, 40},
  49. HmiBindingKind::None,
  50. HmiRuntimeValueKind::None,
  51. false},
  52. HmiControlDescriptor{HmiControlType::PageJump,
  53. "pageJump",
  54. "页面跳转",
  55. "page-jump",
  56. "页面跳转",
  57. {0, 0, 120, 40},
  58. HmiBindingKind::None,
  59. HmiRuntimeValueKind::None,
  60. false},
  61. HmiControlDescriptor{HmiControlType::AlarmList,
  62. "alarmList",
  63. "报警列表",
  64. "alarm-list",
  65. "报警信息",
  66. {0, 0, 360, 180},
  67. HmiBindingKind::None,
  68. HmiRuntimeValueKind::None,
  69. false},
  70. HmiControlDescriptor{HmiControlType::ProgressBar,
  71. "progressBar",
  72. "进度条",
  73. "progress-bar",
  74. "进度",
  75. {0, 0, 240, 36},
  76. HmiBindingKind::Word,
  77. HmiRuntimeValueKind::Word,
  78. true}
  79. };
  80. static_assert(
  81. kControlDescriptors.size()
  82. == static_cast<std::size_t>(HmiControlType::Count),
  83. "每个 HMI 控件类型都必须注册描述");
  84. } // namespace
  85. const HmiControlDescriptor *findHmiControlDescriptor(HmiControlType type)
  86. {
  87. const auto descriptor = std::find_if(
  88. kControlDescriptors.cbegin(),
  89. kControlDescriptors.cend(),
  90. [type](const HmiControlDescriptor &candidate)
  91. {
  92. return candidate.type == type;
  93. });
  94. return descriptor == kControlDescriptors.cend() ? nullptr : &*descriptor;
  95. }
  96. const HmiControlDescriptor *findHmiControlDescriptor(
  97. std::string_view storage_name)
  98. {
  99. const auto descriptor = std::find_if(
  100. kControlDescriptors.cbegin(),
  101. kControlDescriptors.cend(),
  102. [storage_name](const HmiControlDescriptor &candidate)
  103. {
  104. return storage_name == candidate.storageName;
  105. });
  106. return descriptor == kControlDescriptors.cend() ? nullptr : &*descriptor;
  107. }
  108. std::optional<RegisterArea> hmiBindingArea(HmiBindingKind binding_kind)
  109. {
  110. switch (binding_kind)
  111. {
  112. case HmiBindingKind::Bit:
  113. {
  114. return RegisterArea::M;
  115. }
  116. case HmiBindingKind::Word:
  117. {
  118. return RegisterArea::D;
  119. }
  120. case HmiBindingKind::None:
  121. default:
  122. {
  123. return std::nullopt;
  124. }
  125. }
  126. }