综合平台编程器项目的远程存储
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 

93 строки
2.7 KiB

  1. #include "register_monitor_model.h"
  2. #include <algorithm>
  3. // 根据监控点列表生成按添加顺序排列的地址列表
  4. const std::vector<RegisterAddress> &RegisterMonitorModel::addresses() const
  5. {
  6. // 地址列表是兼容视图,每次访问时从完整监控点列表重新生成
  7. addresses_.clear();
  8. addresses_.reserve(points_.size());
  9. for (const MonitorPoint &point : points_)
  10. {
  11. addresses_.push_back(point.address);
  12. }
  13. return addresses_;
  14. }
  15. // 返回当前保存的完整监控点列表
  16. const std::vector<MonitorPoint> &RegisterMonitorModel::points() const
  17. {
  18. return points_;
  19. }
  20. // 判断相同地址和数据类型的监控点是否已经存在
  21. bool RegisterMonitorModel::contains(const MonitorPoint &point) const
  22. {
  23. // 地址相同但数据类型不同,可以作为不同监控点同时存在
  24. return std::find_if(
  25. points_.cbegin(), points_.cend(), [&point](const MonitorPoint &candidate)
  26. {
  27. return candidate.address == point.address
  28. && candidate.dataType == point.dataType;
  29. }) != points_.cend();
  30. }
  31. // 校验并添加一个监控点
  32. bool RegisterMonitorModel::add(const MonitorPoint &point)
  33. {
  34. // 添加前一次性检查地址、类型、范围、重复项和数量上限
  35. if (!point.address.isValid()
  36. || (point.address.area() == RegisterArea::M
  37. && point.dataType != RegisterDataType::Int16)
  38. || (point.address.area() == RegisterArea::D
  39. && !registerDataTypeAddressIsValid(point.dataType, point.address))
  40. || contains(point)
  41. || points_.size() >= kMaximumItemCount)
  42. {
  43. return false;
  44. }
  45. points_.push_back(point);
  46. return true;
  47. }
  48. // 删除指定地址的第一个监控点
  49. bool RegisterMonitorModel::remove(const RegisterAddress &address)
  50. {
  51. const auto position = std::find_if(
  52. points_.begin(), points_.end(), [&address](const MonitorPoint &point)
  53. {
  54. return point.address == address;
  55. });
  56. if (position == points_.end())
  57. {
  58. return false;
  59. }
  60. points_.erase(position);
  61. return true;
  62. }
  63. // 删除地址和数据类型都匹配的监控点
  64. bool RegisterMonitorModel::remove(const MonitorPoint &point)
  65. {
  66. const auto position = std::find_if(
  67. points_.begin(), points_.end(), [&point](const MonitorPoint &candidate)
  68. {
  69. return candidate.address == point.address
  70. && candidate.dataType == point.dataType;
  71. });
  72. if (position == points_.end())
  73. {
  74. return false;
  75. }
  76. points_.erase(position);
  77. return true;
  78. }
  79. // 清空当前会话中的全部监控点和地址视图
  80. void RegisterMonitorModel::clear()
  81. {
  82. addresses_.clear();
  83. points_.clear();
  84. }