PageRenderTime 60ms CodeModel.GetById 32ms RepoModel.GetById 0ms app.codeStats 0ms

/server/app/mainwindow.cpp

https://gitlab.com/midiPlayer/midiPlayer
C++ | 225 lines | 154 code | 44 blank | 27 comment | 7 complexity | 42b29ecadbf1885299d5a85f62c43d44 MD5 | raw file
  1. #include "mainwindow.h"
  2. #include "scenes/keyframe/keyframe.h"
  3. #include <QDebug>
  4. #include <QSetIterator>
  5. #include <QListIterator>
  6. #include "time.h"
  7. #include "math.h"
  8. #include "fusionscene.h"
  9. #include "flashscene.h"
  10. #include "devices/whitedevice.h"
  11. #include <QJsonArray>
  12. #include <QJsonObject>
  13. #include <QCoreApplication>
  14. #include "devices/channeldevicestate.h"
  15. #define SETTINGS_KEY "settings"
  16. #define SETTING_KEY_MAINSCENE_JSON "mainscene"
  17. #define SETTING_KEY_JACKP "jackp"
  18. #define SETTING_KEY_DEVS "devs"
  19. /*
  20. *Hier werden alle Szenen sowie die Klasse JackProcessor zur Kommunikation über jack instanziiert.
  21. */
  22. MainWindow::MainWindow(WebSocketServer* ws) :
  23. WebSocketServerProvider(ws),
  24. wss(ws),
  25. oscc(),
  26. status(),
  27. offsetRequested(true),
  28. settings(),
  29. jackProcessor(wss,getSettings().value(SETTING_KEY_JACKP).toObject(),this),
  30. outDevices(),
  31. timer(this),
  32. getChangesRunning(false),
  33. virtualDevManager(wss,getSettings().value(SETTING_KEY_DEVS).toObject()),
  34. ungroupedDevs(&virtualDevManager),
  35. monitorIO(wss),
  36. beamerEffectHandler(wss),
  37. sceneBuilder(wss,&virtualDevManager,&jackProcessor,&monitorIO,&oscc,&mainScene,&beamerEffectHandler),
  38. olaDeviceProvider(&virtualDevManager),
  39. remoteBeat(wss,&jackProcessor),
  40. mainScene(),
  41. filieIoProv(wss,&mainScene,this),
  42. channelTester(wss,&olaDeviceProvider),
  43. beamerDispatcher(wss,&virtualDevManager),
  44. beamerOutDevice()
  45. {
  46. //availableDevices = Device::loadDevicesFromXml("~/devices.xml");
  47. //needed for settings
  48. QCoreApplication::setOrganizationName("fdg");
  49. QCoreApplication::setOrganizationDomain("fdg-ab.de");
  50. QCoreApplication::setApplicationName("light master");
  51. outDevices.append(&olaDeviceProvider);
  52. outDevices.append(&beamerOutDevice);
  53. connect(wss,SIGNAL(clientClosed()),this,SLOT(save()));
  54. loadScenes(getSettings().value(SETTING_KEY_MAINSCENE_JSON).toObject());
  55. connect(&timer,SIGNAL(timeout()),this,SLOT(trigger()));
  56. timer.setInterval(40);
  57. jackProcessor.init(this);
  58. //save();
  59. // exit(1);
  60. }
  61. //This method is called by jackprocesssor
  62. //if offset is true all lamps will be transmitet not only th changes
  63. void MainWindow::getChanges()
  64. {
  65. QMap<QString, QSharedPointer<DeviceState> > newState;
  66. getChangesRunning = true;
  67. QMap<QString, QSharedPointer<DeviceState> > changes;
  68. newState = mainScene.data()->getDeviceState();
  69. QHash<QString, QSharedPointer<Device> > avDev = ungroupedDevs.getDevices();
  70. foreach (QString deviceId, avDev.keys()) {
  71. if(!newState.contains(deviceId)){//setzte alle unbenutzen Lampen auf 0
  72. newState.insert(deviceId,avDev.value(deviceId).data()->createEmptyState());
  73. }
  74. }
  75. /*
  76. //single device saver:
  77. //replaces 0 by 0.01 to keep the single device always warm
  78. foreach (QString devId, newState.keys()) {
  79. QSharedPointer<DeviceState> newSateDev = newState.value(devId);
  80. if(newSateDev.isNull())
  81. continue;
  82. QSharedPointer<ChannelDeviceState> state = newSateDev.dynamicCast<ChannelDeviceState>();
  83. if(state.isNull())
  84. continue;
  85. if(state.data()->device->getType() == Device::White &&
  86. state.data()->getChannelValue(state.data()->getFirstChannel()) == 0.0 ){
  87. state.data()->setChannel(state.data()->getFirstChannel(),0.01);
  88. }
  89. }*/
  90. //test for changes
  91. changes.clear();
  92. foreach (QString devId, newState.keys()) {
  93. newState.value(devId).data()->publish();
  94. if(offsetRequested || !status.contains(devId) ||
  95. !status.value(devId).data()->equal(newState.value(devId).data())){
  96. if(status.contains(devId))
  97. status.remove(devId);
  98. status.insert(devId,newState.value(devId).data()->clone());
  99. changes.insert(devId,newState.value(devId));
  100. newState.value(devId).data()->publishChanges();
  101. }
  102. }
  103. offsetRequested = false;
  104. foreach (OutputDevice *out,outDevices) {
  105. out->publish(newState,changes);
  106. }
  107. getChangesRunning = false;
  108. }
  109. void MainWindow::loadScenes(QJsonObject data)
  110. {
  111. wss->disconnectAllClients();
  112. timer.stop();
  113. mainScene = QSharedPointer<DiaScene>(new DiaScene(wss,&jackProcessor,&sceneBuilder,&monitorIO, NULL, "main"));
  114. mainScene.data()->loadSerialized(data);
  115. mainScene.data()->start();
  116. timer.start();
  117. }
  118. void MainWindow::trigger()
  119. {
  120. if(getChangesRunning){
  121. qDebug() << "still running!";
  122. return;
  123. }
  124. getChanges();
  125. }
  126. QJsonObject MainWindow::getSettings()
  127. {
  128. QString settingStr = settings.value(SETTINGS_KEY).toString();
  129. QJsonDocument d = QJsonDocument::fromJson(settingStr.toUtf8());
  130. return d.object();
  131. }
  132. QString MainWindow::getRequestType()
  133. {
  134. return "mainwindow";
  135. }
  136. void MainWindow::clientRegistered(QJsonObject, int id)
  137. {
  138. QJsonObject ret;
  139. ret.insert("rootScene",mainScene.data()->providerId);
  140. sendMsg(ret,id,false);
  141. }
  142. void MainWindow::clientMessage(QJsonObject msg, int clientId)
  143. {
  144. if(msg.contains("getSceneTree")){
  145. QJsonObject ret;
  146. ret.insert("sceneTree",getSceneJson(mainScene));
  147. sendMsg(ret,clientId,false);
  148. }
  149. if(msg.contains("save")){
  150. save();
  151. }
  152. }
  153. QJsonObject MainWindow::getSceneJson(QSharedPointer<Scene> scene)
  154. {
  155. QJsonObject sceneJson;
  156. sceneJson.insert("name",scene.data()->getName());
  157. sceneJson.insert("sceneId",scene.data()->getId());
  158. QJsonArray subsJ;
  159. foreach (QSharedPointer<Scene> subScene, scene.data()->getSubScenes()) {
  160. subsJ.append(getSceneJson(subScene));
  161. }
  162. sceneJson.insert("subs",subsJ);
  163. return sceneJson;
  164. }
  165. void MainWindow::save()
  166. {
  167. QJsonObject settingsJson;
  168. settingsJson.insert(SETTING_KEY_MAINSCENE_JSON,mainScene.data()->serialize());
  169. settingsJson.insert(SETTING_KEY_JACKP,jackProcessor.serialize());
  170. settingsJson.insert(SETTING_KEY_DEVS,virtualDevManager.serialize());
  171. QJsonDocument d;
  172. d.setObject(settingsJson);
  173. qDebug() << "SAVED!!!!SAVED!!!!SAVED!!!!SAVED!!!!SAVED!!!!SAVED!!!!SAVED!!!!SAVED!!!!";
  174. //qDebug() << d.toJson();
  175. settings.setValue(SETTINGS_KEY,d.toJson(QJsonDocument::Compact));
  176. //settings.setValue(SETTINGS_KEY,d.toJson());
  177. }
  178. MainWindow::~MainWindow()
  179. {
  180. save();
  181. }