00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "MonitorArea.h"
00025 #include "Debug.h"
00026 #include "Utilities.h"
00027 #include "GlobalVariables.h"
00028 #include "SpikeStreamMainWindow.h"
00029
00030
00031 #include <qwidget.h>
00032 #include <qlayout.h>
00033 #include <qapplication.h>
00034 #include <qmessagebox.h>
00035
00036 #include <mysql++.h>
00037 using namespace mysqlpp;
00038
00039
00040
00041 MonitorArea::MonitorArea(DBInterface *netDBInter, SimulationManager* simMan, QWidget *parent) : QDockArea(Qt::Vertical, QDockArea::Normal, parent, "Monitor Docking Area"){
00042
00043 simulationMode = true;
00044
00045
00046 networkDBInterface = netDBInter;
00047 simulationManager = simMan;
00048 spikeStrApp = SpikeStreamMainWindow::spikeStreamApplication;
00049
00050
00051 endPos = 0;
00052
00053
00054 firstTimeUndock = true;
00055
00056
00057 monitorWindowArray = new MonitorWindow*[MAX_NUMBER_MONITOR_WINDOWS];
00058 for(int i=0; i < MAX_NUMBER_MONITOR_WINDOWS; ++i){
00059 monitorWindowArray[i] = new MonitorWindow(simulationManager, this);
00060 monitorWindowArray[i]->hide();
00061 }
00062 }
00063
00064
00065
00066 MonitorArea::MonitorArea(ArchiveManager *archMan, QWidget *parent) : QDockArea(Qt::Vertical, QDockArea::Normal, parent, "Monitor Docking Area"){
00067
00068 simulationMode = false;
00069
00070
00071 archiveManager = archMan;
00072 spikeStrApp = SpikeStreamMainWindow::spikeStreamApplication;
00073
00074
00075 endPos = 0;
00076
00077
00078 firstTimeUndock = true;
00079
00080
00081 monitorWindowArray = new MonitorWindow*[MAX_NUMBER_MONITOR_WINDOWS];
00082 for(int i=0; i< MAX_NUMBER_MONITOR_WINDOWS; ++i){
00083 monitorWindowArray[i] = new MonitorWindow(this);
00084 monitorWindowArray[i]->hide();
00085 }
00086 }
00087
00088
00089
00090 MonitorArea::~MonitorArea(){
00091 #ifdef MEMORY_DEBUG
00092 cout<<"DESTROYING MONITOR AREA"<<endl;
00093 #endif//MEMORY_DEBUG
00094
00095
00096
00097
00098
00099
00100
00101 delete [] monitorWindowArray;
00102 }
00103
00104
00105
00106
00107
00108
00109
00110
00111 void MonitorArea::addMonitorWindow(NeuronGroup neuronGrp){
00112
00113 if(endPos >= MAX_NUMBER_MONITOR_WINDOWS){
00114 cerr<<"MonitorArea: MAXIMUM NUMBER OF MONITOR WINDOWS HAS BEEN EXCEEDED. CANNOT ADD ANY MORE WINDOWS"<<endl;
00115 return;
00116 }
00117
00118
00119 if(networkMonitorMap.count(neuronGrp.neuronGrpID) > 0){
00120 cerr<<"MonitorArea: NETWORK MONITOR ALREADY EXISTS FOR THIS NEURON GROUP!"<<endl;
00121 return;
00122 }
00123
00124
00125 if(simulationMode){
00126 networkMonitorMap[neuronGrp.neuronGrpID] = new NetworkMonitor(neuronGrp, networkDBInterface, monitorWindowArray[endPos]);
00127 monitorWindowArray[endPos]->setCaption(neuronGrp.name + " [" + QString::number(neuronGrp.neuronGrpID) + "]");
00128 monitorWindowArray[endPos]->setNeuronGrpID(neuronGrp.neuronGrpID);
00129 monitorWindowArray[endPos]->setWidget(networkMonitorMap[neuronGrp.neuronGrpID]);
00130 }
00131 else{
00132 networkMonitorMap[neuronGrp.neuronGrpID] = new NetworkMonitor(neuronGrp, monitorWindowArray[endPos]);
00133 monitorWindowArray[endPos]->setCaption(neuronGrp.name + " [" + QString::number(neuronGrp.neuronGrpID) + "]");
00134 monitorWindowArray[endPos]->setWidget(networkMonitorMap[neuronGrp.neuronGrpID]);
00135 monitorWindowArray[endPos]->show();
00136 }
00137
00138
00139 ++endPos;
00140 }
00141
00142
00143
00144
00145
00146 void MonitorArea::connectToManager(){
00147 if(simulationMode)
00148 simulationManager->setNetworkMonitors(networkMonitorMap);
00149 else
00150 archiveManager->setNetworkMonitors(networkMonitorMap);
00151 }
00152
00153
00154
00155 void MonitorArea::dockMonitorWindows(){
00156 for(int i=0; i<endPos; ++i){
00157 if(!monitorWindowArray[i]->isHidden() && (monitorWindowArray[i]->place() == QDockWindow::OutsideDock))
00158 monitorWindowArray[i]->dock();
00159 }
00160 }
00161
00162
00163
00164 void MonitorArea::hideMonitorWindows(){
00165 for(int i=0; i<endPos; ++i){
00166 monitorWindowArray[i]->hide();
00167 }
00168 }
00169
00170
00171
00172
00173 void MonitorArea::loadSimulation(){
00174
00175 try{
00176 Query query = networkDBInterface->getQuery();
00177 query.reset();
00178 query<<"SELECT NeuronGrpID, Name, Width, Length FROM NeuronGroups";
00179 Result result = query.store();
00180 for(Result::iterator iter = result.begin(); iter != result.end(); ++iter){
00181 Row neurGrpRow(*iter);
00182
00183
00184 NeuronGroup neuronGrp;
00185 neuronGrp.width = Utilities::getUInt((std::string)neurGrpRow["Width"]);
00186 neuronGrp.length = Utilities::getUInt((std::string)neurGrpRow["Length"]);
00187 neuronGrp.neuronGrpID = Utilities::getUInt((std::string)neurGrpRow["NeuronGrpID"]);
00188 neuronGrp.name = (std::string)neurGrpRow["Name"];
00189
00190
00191 addMonitorWindow(neuronGrp);
00192 }
00193 }
00194 catch (const BadQuery& er) {
00195 cerr<<"MonitorArea: MYSQL QUERY EXCEPTION \""<<er.what()<<"\""<<endl;
00196 QString errorString = "Bad query loading neuron group: \"";
00197 errorString += er.what();
00198 errorString += "\"";
00199 QMessageBox::critical( 0, "Neuron Group Error", errorString);
00200 }
00201 catch (const Exception& er) {
00202 cerr<<"MonitorArea: MYSQL EXCEPTION \""<<er.what()<<"\""<<endl;
00203 QString errorString = "Exception thrown loading neuron group: \"";
00204 errorString += er.what();
00205 errorString += "\"";
00206 QMessageBox::critical( 0, "Neuron Group Error", errorString);
00207 }
00208 catch(std::exception& er){
00209 cerr<<"MonitorArea: STD EXCEPTION \""<<er.what()<<"\""<<endl;
00210 QString errorString = "Exception thrown loading neuron group: \"";
00211 errorString += er.what();
00212 errorString += "\"";
00213 QMessageBox::critical( 0, "Neuron Group Error", errorString);
00214 }
00215 }
00216
00217
00218
00219 void MonitorArea::resetMonitorWindows(){
00220
00221 hideMonitorWindows();
00222
00223
00224 endPos = 0;
00225
00226
00227 for(map<unsigned int, NetworkMonitor*>::iterator iter = networkMonitorMap.begin(); iter != networkMonitorMap.end(); ++iter)
00228 delete iter->second;
00229 networkMonitorMap.clear();
00230 }
00231
00232
00233
00234 void MonitorArea::rewindNetworkMonitors(){
00235 for(map<unsigned int, NetworkMonitor*>::iterator iter = networkMonitorMap.begin(); iter != networkMonitorMap.end(); ++iter)
00236 iter->second->reset();
00237 }
00238
00239
00240
00241 void MonitorArea::showAllMonitorWindows(bool monitorNeurons){
00242 for(int i=0; i<endPos; ++i){
00243 monitorWindowArray[i]->setMonitorType(monitorNeurons);
00244 monitorWindowArray[i]->show();
00245 }
00246 }
00247
00248
00249
00250
00251
00252 void MonitorArea::showMonitorWindow(unsigned int neurGrpID, bool monitorNeurons){
00253 for(int i=0; i<endPos; ++i){
00254 if(monitorWindowArray[i]->getNeuronGrpID() == neurGrpID){
00255 monitorWindowArray[i]->setMonitorType(monitorNeurons);
00256 monitorWindowArray[i]->show();
00257 return;
00258 }
00259 }
00260 }
00261
00262
00263
00264
00265
00266 void MonitorArea::undockMonitorWindows(){
00267 int deskTopWidth = QApplication::desktop()->width();
00268 int deskTopHeight = QApplication::desktop()->height();
00269 int numWindowsInSpace = deskTopWidth / 100;
00270 int currentXPos = 0;
00271 int currentYPos = 0;
00272
00273 for(int i=0; i<endPos; ++i){
00274 if(!monitorWindowArray[i]->isHidden()){
00275 monitorWindowArray[i]->undock();
00276
00277
00278
00279 if(firstTimeUndock && i < numWindowsInSpace ){
00280 monitorWindowArray[i]->move(currentXPos, currentYPos);
00281 currentXPos += 200;
00282 if(currentXPos >= (deskTopWidth - 150)){
00283 currentXPos = 0;
00284 currentYPos += 200;
00285 }
00286 }
00287 else if(firstTimeUndock){
00288 monitorWindowArray[i]->move(deskTopWidth - 210, deskTopHeight - 200 - i * 10);
00289 }
00290 }
00291 }
00292 firstTimeUndock = false;
00293 }
00294
00295