|
- #include "register_monitor_model.h"
-
- #include <algorithm>
-
- // 根据监控点列表生成按添加顺序排列的地址列表
- const std::vector<RegisterAddress> &RegisterMonitorModel::addresses() const
- {
- // 地址列表是兼容视图,每次访问时从完整监控点列表重新生成
- addresses_.clear();
- addresses_.reserve(points_.size());
- for (const MonitorPoint &point : points_)
- {
- addresses_.push_back(point.address);
- }
- return addresses_;
- }
-
- // 返回当前保存的完整监控点列表
- const std::vector<MonitorPoint> &RegisterMonitorModel::points() const
- {
- return points_;
- }
-
- // 判断相同地址和数据类型的监控点是否已经存在
- bool RegisterMonitorModel::contains(const MonitorPoint &point) const
- {
- // 地址相同但数据类型不同,可以作为不同监控点同时存在
- return std::find_if(
- points_.cbegin(), points_.cend(), [&point](const MonitorPoint &candidate)
- {
- return candidate.address == point.address
- && candidate.dataType == point.dataType;
- }) != points_.cend();
- }
-
- // 校验并添加一个监控点
- bool RegisterMonitorModel::add(const MonitorPoint &point)
- {
- // 添加前一次性检查地址、类型、范围、重复项和数量上限
- if (!point.address.isValid()
- || (point.address.area() == RegisterArea::M
- && point.dataType != RegisterDataType::Int16)
- || (point.address.area() == RegisterArea::D
- && !registerDataTypeAddressIsValid(point.dataType, point.address))
- || contains(point)
- || points_.size() >= kMaximumItemCount)
- {
- return false;
- }
- points_.push_back(point);
- return true;
- }
-
- // 删除指定地址的第一个监控点
- bool RegisterMonitorModel::remove(const RegisterAddress &address)
- {
- const auto position = std::find_if(
- points_.begin(), points_.end(), [&address](const MonitorPoint &point)
- {
- return point.address == address;
- });
- if (position == points_.end())
- {
- return false;
- }
- points_.erase(position);
- return true;
- }
-
- // 删除地址和数据类型都匹配的监控点
- bool RegisterMonitorModel::remove(const MonitorPoint &point)
- {
- const auto position = std::find_if(
- points_.begin(), points_.end(), [&point](const MonitorPoint &candidate)
- {
- return candidate.address == point.address
- && candidate.dataType == point.dataType;
- });
- if (position == points_.end())
- {
- return false;
- }
- points_.erase(position);
- return true;
- }
-
- // 清空当前会话中的全部监控点和地址视图
- void RegisterMonitorModel::clear()
- {
- addresses_.clear();
- points_.clear();
- }
|