MeasurementNetwork.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. /*
  2. Copyright (c) 2015, 2016 Hubert Denkmair <hubert@denkmair.de>
  3. This file is part of cangaroo.
  4. cangaroo is free software: you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation, either version 2 of the License, or
  7. (at your option) any later version.
  8. cangaroo is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with cangaroo. If not, see <http://www.gnu.org/licenses/>.
  14. */
  15. #include "MeasurementNetwork.h"
  16. #include "MeasurementInterface.h"
  17. #include <core/Backend.h>
  18. MeasurementNetwork::MeasurementNetwork()
  19. {
  20. }
  21. void MeasurementNetwork::cloneFrom(MeasurementNetwork &origin)
  22. {
  23. _name = origin._name;
  24. foreach (MeasurementInterface *omi, origin._interfaces) {
  25. MeasurementInterface *mi = new MeasurementInterface();
  26. mi->cloneFrom(*omi);
  27. _interfaces.append(mi);
  28. }
  29. _canDbs = origin._canDbs;
  30. }
  31. void MeasurementNetwork::addInterface(MeasurementInterface *intf)
  32. {
  33. _interfaces.append(intf);
  34. }
  35. void MeasurementNetwork::removeInterface(MeasurementInterface *intf)
  36. {
  37. _interfaces.removeAll(intf);
  38. }
  39. QList<MeasurementInterface *> MeasurementNetwork::interfaces()
  40. {
  41. return _interfaces;
  42. }
  43. MeasurementInterface *MeasurementNetwork::addCanInterface(CanInterfaceId canif)
  44. {
  45. MeasurementInterface *mi = new MeasurementInterface();
  46. mi->setCanInterface(canif);
  47. addInterface(mi);
  48. return mi;
  49. }
  50. CanInterfaceIdList MeasurementNetwork::getReferencedCanInterfaces()
  51. {
  52. CanInterfaceIdList list;
  53. foreach (MeasurementInterface *mi, _interfaces) {
  54. list << mi->canInterface();
  55. }
  56. return list;
  57. }
  58. void MeasurementNetwork::addCanDb(QSharedPointer<CanDb> candb)
  59. {
  60. _canDbs.append(candb);
  61. }
  62. void MeasurementNetwork::reloadCanDbs(Backend *backend)
  63. {
  64. foreach(pCanDb db, _canDbs)
  65. {
  66. db = backend->loadDbc(db->getPath());
  67. }
  68. }
  69. QString MeasurementNetwork::name() const
  70. {
  71. return _name;
  72. }
  73. void MeasurementNetwork::setName(const QString &name)
  74. {
  75. _name = name;
  76. }
  77. bool MeasurementNetwork::saveXML(Backend &backend, QDomDocument &xml, QDomElement &root)
  78. {
  79. root.setAttribute("name", _name);
  80. QDomElement interfacesNode = xml.createElement("interfaces");
  81. foreach (MeasurementInterface *intf, _interfaces) {
  82. QDomElement intfNode = xml.createElement("interface");
  83. if (!intf->saveXML(backend, xml, intfNode)) {
  84. return false;
  85. }
  86. interfacesNode.appendChild(intfNode);
  87. }
  88. root.appendChild(interfacesNode);
  89. QDomElement candbsNode = xml.createElement("databases");
  90. foreach (pCanDb candb, _canDbs) {
  91. QDomElement dbNode = xml.createElement("database");
  92. if (!candb->saveXML(backend, xml, dbNode)) {
  93. return false;
  94. }
  95. candbsNode.appendChild(dbNode);
  96. }
  97. root.appendChild(candbsNode);
  98. return true;
  99. }
  100. bool MeasurementNetwork::loadXML(Backend &backend, QDomElement el)
  101. {
  102. setName(el.attribute("name", "unnamed network"));
  103. QDomNodeList ifList = el.firstChildElement("interfaces").elementsByTagName("interface");
  104. for (int i=0; i<ifList.length(); i++) {
  105. QDomElement elIntf = ifList.item(i).toElement();
  106. QString driverName = elIntf.attribute("driver");
  107. QString deviceName = elIntf.attribute("name");
  108. CanInterface *intf = backend.getInterfaceByDriverAndName(driverName, deviceName);
  109. if (intf) {
  110. MeasurementInterface *mi = addCanInterface(intf->getId());
  111. mi->loadXML(backend, elIntf);
  112. } else {
  113. log_error(QString("Could not find interface %1/%2, which is referenced in the workspace config file.").arg(driverName, deviceName));
  114. }
  115. }
  116. QDomNodeList dbList = el.firstChildElement("databases").elementsByTagName("database");
  117. for (int i=0; i<dbList.length(); i++) {
  118. QDomElement elDb = dbList.item(i).toElement();
  119. QString filename = elDb.attribute("filename", QString());
  120. if (!filename.isEmpty()) {
  121. addCanDb(backend.loadDbc(filename));
  122. } else {
  123. log_error(QString("Unable to load CanDB: %1").arg(filename));
  124. }
  125. }
  126. return true;
  127. }