add HMI variant setting
This commit is contained in:
parent
8287f5a685
commit
87c4d9e380
|
|
@ -294,4 +294,11 @@ struct PluginTypeInfo //插件的类型信息
|
|||
QString modelName; //工程模名
|
||||
};
|
||||
|
||||
struct ParamUpdateInfo //参量更新信息
|
||||
{
|
||||
QString sToken;
|
||||
double oldVal;
|
||||
double newVal;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -234,7 +234,7 @@ private:
|
|||
dlg.showDlg(customType);
|
||||
if (dlg.exec() == QDialog::Accepted) {
|
||||
DataSourceType setType = dlg.getCurData();
|
||||
varNameEdit->setText(setType.sPara);
|
||||
varNameEdit->setText(setType.sCode);
|
||||
}
|
||||
});
|
||||
return page;
|
||||
|
|
|
|||
|
|
@ -119,6 +119,7 @@ public:
|
|||
|
||||
void startAcceptData(); //开始接收实时数据
|
||||
void stopAcceptData(QString); //停止接收实时数据
|
||||
void updateParamData(QList<ParamUpdateInfo>); //更新参量
|
||||
|
||||
QMap<int,QList<QPair<MonitorItemState,QString>>>& getMonitorStateMap(){return m_monitorStateMap;}
|
||||
void setMonitorDisplaySetting(QMap<MonitorItemTypeStruct,QMap<MonitorItemStateStruct,MonitorItemDisplayInfo>> map){m_monitorDisplaySetting = map;}
|
||||
|
|
@ -165,7 +166,6 @@ public:
|
|||
QString getLastSave() {return _lastSaveTime;}
|
||||
public Q_SLOTS:
|
||||
void onSignal_ifExits(QUuid id,const QString&,int type,GraphicsFunctionModelItem*); //判断用户输入的名称是否已存在
|
||||
void onTimeOut();
|
||||
void onSignal_GetPointData(QString type,QMap<qint64,double> map);
|
||||
void onSignal_openBayManager();
|
||||
void onDataTimerOut();
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@ public:
|
|||
|
||||
void setParent(DiagramCavas* p) {_parentCavas = p;}
|
||||
QMap<QString,QMap<quint64,double>> getTargetData(QStringList); //获取指定名称的值
|
||||
QMap<QString,int> getParaUpdateState(QStringList); //获取指定参量的更新结果
|
||||
public slots:
|
||||
void onReceiveHttpData(const QString& sType,const QVariant& data);
|
||||
void onReceiveWebsocketData(const QVariant& data);
|
||||
|
|
@ -24,6 +25,7 @@ private:
|
|||
QString removeAfterStreamBySplit(const QString& url); //手动处理websocket的config
|
||||
private:
|
||||
QMap<QString,QMap<quint64,double>> _realTimeData; //实时数据缓存 todo:自动清理
|
||||
QMap<QString,int> _paraUpdateState; //参量更新结果
|
||||
mutable QMutex m_mutex;
|
||||
DiagramCavas* _parentCavas;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -45,7 +45,53 @@ QMap<QString,double> BaseItemPropertyProxy::getMap()
|
|||
return map;
|
||||
}
|
||||
|
||||
void BaseItemPropertyProxy::setMap(QMap<QString,double>)
|
||||
void BaseItemPropertyProxy::setMap(QMap<QString,double> mapSetting)
|
||||
{
|
||||
//todo:接口修改参量
|
||||
int nMode = _pControl->getCurMode();
|
||||
if(nMode == 0) //编辑模式不设置
|
||||
return;
|
||||
QUuid uid = _pItem->getProperty()->uuid();
|
||||
|
||||
QList<ParamUpdateInfo> updateList;
|
||||
auto pPara = _pControl->getMonitorPara();
|
||||
|
||||
const QList<MonitorItemAttributeInfo>& attributeList = pPara.value(uid);
|
||||
|
||||
// 2. 构建sName到MonitorItemAttributeInfo的快速查找表
|
||||
QHash<QString, const MonitorItemAttributeInfo*> nameToAttribute;
|
||||
for (const MonitorItemAttributeInfo& attributeInfo : attributeList) {
|
||||
nameToAttribute[attributeInfo.sName] = &attributeInfo;
|
||||
}
|
||||
|
||||
// 3. 遍历mapSetting进行比较
|
||||
for (auto it = mapSetting.constBegin(); it != mapSetting.constEnd(); ++it) {
|
||||
const QString& targetName = it.key();
|
||||
double settingValue = it.value();
|
||||
|
||||
if (nameToAttribute.contains(targetName)) {
|
||||
const MonitorItemAttributeInfo* attributeInfo = nameToAttribute[targetName];
|
||||
|
||||
if(attributeInfo->nConnectType == 1) //量测情况先不设置值
|
||||
continue;
|
||||
// 4. 获取当前值
|
||||
double currentValue = 0.0;
|
||||
if (!attributeInfo->mapValue.isEmpty()) {
|
||||
auto firstIt = attributeInfo->mapValue.constBegin();
|
||||
currentValue = firstIt.value();
|
||||
}
|
||||
|
||||
// 5. 比较并记录需要更新的项
|
||||
if (qAbs(currentValue - settingValue) > 1e-10) { //记录不同项
|
||||
ParamUpdateInfo updateInfo;
|
||||
updateInfo.sToken = attributeInfo->sConnectPara;
|
||||
updateInfo.oldVal = currentValue;
|
||||
updateInfo.newVal = settingValue;
|
||||
updateList.append(updateInfo);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(!updateList.isEmpty()){
|
||||
_pControl->updateParamData(updateList);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@
|
|||
|
||||
#include "pluginManager.h"
|
||||
#include "graphicsItem/pluginItemFactory.h"
|
||||
#include "extraPropertyManager.h"
|
||||
|
||||
#include "graphicsItem/itemPort.h"
|
||||
#include "designerScene.h"
|
||||
|
|
@ -1691,13 +1692,6 @@ void FixedPortsModel::onSignal_ifExits(QUuid id,const QString& str,int type,Grap
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
void FixedPortsModel::onTimeOut()
|
||||
{
|
||||
_Interface->getPointData("i");
|
||||
_Interface->getPointData("v");
|
||||
}
|
||||
|
||||
void FixedPortsModel::onSignal_GetPointData(QString type,QMap<qint64,double> map)
|
||||
{
|
||||
if(map.size() == 1) //实时数据
|
||||
|
|
@ -1774,7 +1768,48 @@ void FixedPortsModel::onPanelVisibilityChanged(const QString& panelName, bool sh
|
|||
|
||||
void FixedPortsModel::onVariantSet(QString varName,QVariant val)
|
||||
{
|
||||
QMap<QString, ExtraProperty> mapExtra;
|
||||
ExtraPropertyManager* pExtra = getCavas()->getExtraPropertyManager();
|
||||
if(pExtra){
|
||||
mapExtra = pExtra->geAlltProperty();
|
||||
}
|
||||
|
||||
auto monitorData = m_monitorPara; // 假设这是你的成员变量
|
||||
|
||||
for(auto& extra:mapExtra){
|
||||
if(extra.code == varName){
|
||||
QString sConnectPara = extra.connect_para;
|
||||
QString sourceType = extra.sourceType;
|
||||
|
||||
if(sourceType == "property"){ //参量
|
||||
double dOldVal = 0.0; // 默认值
|
||||
|
||||
// 在监控数据中查找匹配的sConnectPara
|
||||
for(auto& uuidListPair : monitorData){
|
||||
for(auto& item : uuidListPair){
|
||||
if(item.sConnectPara == sConnectPara && !item.mapValue.isEmpty()){
|
||||
// 取第一个值
|
||||
if(!item.mapValue.isEmpty()){
|
||||
dOldVal = item.mapValue.constBegin().value();
|
||||
}
|
||||
break; // 找到第一个匹配项就退出
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
QList<ParamUpdateInfo> lst;
|
||||
ParamUpdateInfo info;
|
||||
info.sToken = sConnectPara;
|
||||
info.oldVal = dOldVal;
|
||||
info.newVal = val.toDouble();
|
||||
lst.append(info);
|
||||
updateParamData(lst);
|
||||
}
|
||||
else{ //量测,是否可设置待定
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void FixedPortsModel::onScriptExec(QString script)
|
||||
|
|
@ -2555,19 +2590,40 @@ void FixedPortsModel::updateMonitorDisplay()
|
|||
|
||||
void FixedPortsModel::startAcceptData()
|
||||
{
|
||||
QStringList lstTarget; //待订阅的对象
|
||||
QStringList lstTarget; //待订阅的对象(量测)
|
||||
QStringList lstParamTarget; //待读取的对象(参量,不需要一直读取,httpget)
|
||||
QMap<QString, int> connectTypeMap; //先创建一个sConnectPara到nConnectType的映射
|
||||
for(auto& lst:m_monitorPara){
|
||||
for(auto& para:lst){
|
||||
if(para.bSelected && !para.sConnectPara.isEmpty()){
|
||||
if(!lstTarget.contains(para.sConnectPara))
|
||||
lstTarget.append(para.sConnectPara);
|
||||
if(!para.sConnectPara.isEmpty()){
|
||||
connectTypeMap[para.sConnectPara] = para.nConnectType;
|
||||
if(para.bSelected){ //选中的查询数据
|
||||
if(para.nConnectType == 1){ //量测数据
|
||||
if(!lstTarget.contains(para.sConnectPara))
|
||||
lstTarget.append(para.sConnectPara);
|
||||
}
|
||||
else if(para.nConnectType == 0){ //参量
|
||||
if(!lstParamTarget.contains(para.sConnectPara))
|
||||
lstParamTarget.append(para.sConnectPara);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for(auto& paraRef:m_monitorParaRef){ //如果normalItem中未选择该属性,textItem引用了该属性,追加数据请求
|
||||
if(!lstTarget.contains(paraRef))
|
||||
lstTarget.append(paraRef);
|
||||
for(auto& paraRef : m_monitorParaRef){ //如果normalItem中未选择该属性,textItem引用了该属性,追加数据请求
|
||||
QString sConnectPara = paraRef;
|
||||
if(connectTypeMap.contains(sConnectPara)){
|
||||
int nConnectType = connectTypeMap[sConnectPara];
|
||||
if(nConnectType == 1){ //量测数据
|
||||
if(!lstTarget.contains(sConnectPara))
|
||||
lstTarget.append(sConnectPara);
|
||||
}
|
||||
else if(nConnectType == 0){ //参量
|
||||
if(!lstParamTarget.contains(sConnectPara))
|
||||
lstParamTarget.append(sConnectPara);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
QJsonObject obj; //构建开始请求
|
||||
|
|
@ -2599,6 +2655,32 @@ void FixedPortsModel::startAcceptData()
|
|||
UiCommunicationBus::instance()->insertTempRequest(_pageName,requestLst);
|
||||
_curRequestLst = lstTarget;
|
||||
m_dataTimer->start();
|
||||
|
||||
QString sParaPath = "/component/attribute/get/"; //参数查询地址
|
||||
sParaPath += lstParamTarget.join(",");
|
||||
UiCommunicationBus::instance()->sendHttpRequest(sParaPath,QVariant(),"GET");
|
||||
_curRequestLst.append(lstParamTarget);
|
||||
}
|
||||
|
||||
void FixedPortsModel::updateParamData(QList<ParamUpdateInfo> lst)
|
||||
{
|
||||
QJsonObject obj;
|
||||
QJsonArray arrAttr;
|
||||
|
||||
for(auto& info:lst){
|
||||
QJsonObject objAttr;
|
||||
objAttr["token"] = info.sToken;
|
||||
objAttr["attribute_old_val"] = QString::number(info.oldVal);
|
||||
objAttr["attribute_new_val"] = QString::number(info.newVal);
|
||||
arrAttr.append(objAttr);
|
||||
}
|
||||
|
||||
obj["attributes"] = arrAttr;
|
||||
|
||||
QString sParaPath = "/component/attribute/update"; //参数更新地址
|
||||
QJsonDocument doc(obj);
|
||||
QVariant variant = doc.toVariant();
|
||||
UiCommunicationBus::instance()->sendHttpRequest(sParaPath,variant,"POST");
|
||||
}
|
||||
|
||||
void FixedPortsModel::stopAcceptData(QString page)
|
||||
|
|
|
|||
|
|
@ -132,6 +132,31 @@ void DataAccessor::onReceiveHttpData(const QString& sType,const QVariant& data)
|
|||
}
|
||||
}
|
||||
}
|
||||
else if(sType == "paraQuery"){
|
||||
QJsonObject dataObj = data.toJsonObject();
|
||||
QJsonArray targetArr = dataObj.value("attributes").toArray();
|
||||
for(const QJsonValue& value : targetArr){
|
||||
QJsonObject obj = value.toObject();
|
||||
if(obj.contains("value")){ //包含value,是查询结果
|
||||
QString sToken = obj["token"].toString();
|
||||
QString sValue = obj["value"].toString();
|
||||
int code = obj["code"].toInt();
|
||||
|
||||
QMap<quint64, double> newInnerMap;
|
||||
if(code == 20000){
|
||||
newInnerMap.insert(0,sValue.toDouble()); //参量没有时序,默认1个值
|
||||
QMutexLocker locker(&m_mutex);
|
||||
_realTimeData[sToken].insert(newInnerMap); //插入到数据队列
|
||||
}
|
||||
else{
|
||||
qDebug()<<sToken<<" "<<code<<"receive attr err";
|
||||
}
|
||||
}
|
||||
else{ //update返回值
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(sType == "subscriptionTest"){
|
||||
qDebug()<<"receive null data";
|
||||
}
|
||||
|
|
@ -208,6 +233,19 @@ QMap<QString,QMap<quint64,double>> DataAccessor::getTargetData(QStringList paraL
|
|||
return mapData;
|
||||
}
|
||||
|
||||
QMap<QString,int> DataAccessor::getParaUpdateState(QStringList paraLst)
|
||||
{
|
||||
QMap<QString,int> mapState;
|
||||
|
||||
QMutexLocker locker(&m_mutex);
|
||||
for (const QString& key : paraLst) {
|
||||
if (_paraUpdateState.contains(key)) {
|
||||
mapState.insert(key, _paraUpdateState.value(key));
|
||||
}
|
||||
}
|
||||
return mapState;
|
||||
}
|
||||
|
||||
QString DataAccessor::removeAfterStreamBySplit(const QString& url)
|
||||
{
|
||||
QStringList parts = url.split('/');
|
||||
|
|
|
|||
|
|
@ -50,6 +50,9 @@ void DataProcessor::processJson( const QVariant& data,int conType)
|
|||
if(dataObj.contains("client_id")){ //实时数据相关
|
||||
emit httpProcessed("subscriptions",data);
|
||||
}
|
||||
else if(dataObj.contains("attributes")){
|
||||
emit httpProcessed("paraQuery",data); //参量查询/更新返回值
|
||||
}
|
||||
}
|
||||
else if(conType == 1){
|
||||
if(dataObj.contains("targets")){ //实时数据相关
|
||||
|
|
|
|||
Loading…
Reference in New Issue