From ffae328222bcea811109d3cdfaa158c40963fef4 Mon Sep 17 00:00:00 2001 From: Yogi <yapatel@gatech.edu> Date: Sat, 11 Jul 2015 12:43:36 -0400 Subject: [PATCH] minor cleanup; testing moduels now --- Builds/Linux/Makefile | 138 + .../open-ephys.xcodeproj/project.pbxproj | 292 ++ Builds/VisualStudio2012/open-ephys.vcxproj | 92 +- Builds/VisualStudio2013/open-ephys.vcxproj | 92 +- Source/AccessClass.cpp | 2 +- Source/Processors/Editors/ChannelSelector.h | 0 .../Editors/NetworkEventsEditor.cpp | 272 +- .../Processors/Editors/NetworkEventsEditor.h | 128 +- .../PSTH/PeriStimulusTimeHistogramEditor.cpp | 2782 ++++++++--------- .../PluginManager/PluginManager.cpp | 404 +-- .../Processors/PluginManager/PluginManager.h | 152 +- open-ephys.jucer | 292 +- 12 files changed, 2492 insertions(+), 2154 deletions(-) mode change 100755 => 100644 Source/Processors/Editors/ChannelSelector.h diff --git a/Builds/Linux/Makefile b/Builds/Linux/Makefile index 3506a5e54..b0bb69993 100644 --- a/Builds/Linux/Makefile +++ b/Builds/Linux/Makefile @@ -61,6 +61,8 @@ OBJECTS := \ $(OBJDIR)/AudioNode_3db3557c.o \ $(OBJDIR)/CAR_9a7e50f4.o \ $(OBJDIR)/Channel_5cb2d4d2.o \ + $(OBJDIR)/ChannelMappingEditor_9b145f15.o \ + $(OBJDIR)/ChannelMappingNode_ec0559ea.o \ $(OBJDIR)/EcubeEditor_ba242592.o \ $(OBJDIR)/RHD2000Editor_dbd5a24.o \ $(OBJDIR)/EcubeThread_d0477baf.o \ @@ -103,21 +105,34 @@ OBJECTS := \ $(OBJDIR)/FilterEditor_93e366f5.o \ $(OBJDIR)/FilterNode_d2b4d9ca.o \ $(OBJDIR)/GenericProcessor_3e79932a.o \ + $(OBJDIR)/LfpDisplayCanvas_9bbf9660.o \ + $(OBJDIR)/LfpDisplayEditor_e7c32ff5.o \ + $(OBJDIR)/LfpDisplayNode_fdf2e2ca.o \ $(OBJDIR)/Merger_53fb4e4a.o \ $(OBJDIR)/MergerEditor_e36b0997.o \ $(OBJDIR)/MessageCenter_bd1ba084.o \ $(OBJDIR)/MessageCenterEditor_afaf4851.o \ $(OBJDIR)/ParameterEditor_112258eb.o \ $(OBJDIR)/Parameter_b3e5ac9e.o \ + $(OBJDIR)/PhaseDetector_8a25ed0e.o \ + $(OBJDIR)/PhaseDetectorEditor_eaec855b.o \ $(OBJDIR)/ProcessorGraph_8c3a250a.o \ $(OBJDIR)/PulsePalOutput_f41ce62a.o \ $(OBJDIR)/PulsePalOutputEditor_3d333977.o \ + $(OBJDIR)/RecordControl_ecb8ada4.o \ + $(OBJDIR)/RecordControlEditor_4355fd71.o \ $(OBJDIR)/EngineConfigWindow_4fd44ceb.o \ $(OBJDIR)/HDF5FileFormat_be712135.o \ $(OBJDIR)/HDF5Recording_d14f7b19.o \ $(OBJDIR)/OriginalRecording_d6dc3293.o \ $(OBJDIR)/RecordEngine_97ef83aa.o \ $(OBJDIR)/RecordNode_cc21a82a.o \ + $(OBJDIR)/NetworkEventsEditor_fd22826.o \ + $(OBJDIR)/NetworkEvents_5344c99a.o \ + $(OBJDIR)/PeriStimulusTimeHistogramEditor_6be5bf55.o \ + $(OBJDIR)/PeriStimulusTimeHistogramNode_9631ca2a.o \ + $(OBJDIR)/tictoc_cdca1ed.o \ + $(OBJDIR)/TrialCircularBuffer_4a4cef0c.o \ $(OBJDIR)/ResamplingNode_9825590a.o \ $(OBJDIR)/ResamplingNodeEditor_8b120457.o \ $(OBJDIR)/PulsePal_14932a18.o \ @@ -125,11 +140,19 @@ OBJECTS := \ $(OBJDIR)/ofSerial_c3b0a9e1.o \ $(OBJDIR)/SerialInput_f5b197b8.o \ $(OBJDIR)/SerialInputEditor_46740885.o \ + $(OBJDIR)/SignalGenerator_993274e2.o \ + $(OBJDIR)/SignalGeneratorEditor_b8e0de2f.o \ $(OBJDIR)/SourceNode_de3985ea.o \ $(OBJDIR)/SourceNodeEditor_cdc90937.o \ + $(OBJDIR)/SpikeDetector_50b619e4.o \ + $(OBJDIR)/SpikeDetectorEditor_502139b1.o \ $(OBJDIR)/SpikeDisplayCanvas_2219bd20.o \ $(OBJDIR)/SpikeDisplayEditor_6e1d56b5.o \ $(OBJDIR)/SpikeDisplayNode_be27b98a.o \ + $(OBJDIR)/SpikeSortBoxes_17f37282.o \ + $(OBJDIR)/SpikeSorter_5f160cae.o \ + $(OBJDIR)/SpikeSorterCanvas_f0ead366.o \ + $(OBJDIR)/SpikeSorterEditor_3cee6cfb.o \ $(OBJDIR)/Splitter_889c68aa.o \ $(OBJDIR)/SplitterEditor_93a6dbf7.o \ $(OBJDIR)/Visualizer_2e631df8.o \ @@ -233,6 +256,16 @@ $(OBJDIR)/Channel_5cb2d4d2.o: ../../Source/Processors/Channel/Channel.cpp @echo "Compiling Channel.cpp" @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" +$(OBJDIR)/ChannelMappingEditor_9b145f15.o: ../../Source/Processors/ChannelMappingNode/ChannelMappingEditor.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling ChannelMappingEditor.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/ChannelMappingNode_ec0559ea.o: ../../Source/Processors/ChannelMappingNode/ChannelMappingNode.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling ChannelMappingNode.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + $(OBJDIR)/EcubeEditor_ba242592.o: ../../Source/Processors/DataThreads/EcubeEditor.cpp -@mkdir -p $(OBJDIR) @echo "Compiling EcubeEditor.cpp" @@ -443,6 +476,21 @@ $(OBJDIR)/GenericProcessor_3e79932a.o: ../../Source/Processors/GenericProcessor/ @echo "Compiling GenericProcessor.cpp" @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" +$(OBJDIR)/LfpDisplayCanvas_9bbf9660.o: ../../Source/Processors/LfpDisplayNode/LfpDisplayCanvas.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling LfpDisplayCanvas.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/LfpDisplayEditor_e7c32ff5.o: ../../Source/Processors/LfpDisplayNode/LfpDisplayEditor.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling LfpDisplayEditor.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/LfpDisplayNode_fdf2e2ca.o: ../../Source/Processors/LfpDisplayNode/LfpDisplayNode.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling LfpDisplayNode.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + $(OBJDIR)/Merger_53fb4e4a.o: ../../Source/Processors/Merger/Merger.cpp -@mkdir -p $(OBJDIR) @echo "Compiling Merger.cpp" @@ -473,6 +521,16 @@ $(OBJDIR)/Parameter_b3e5ac9e.o: ../../Source/Processors/Parameter/Parameter.cpp @echo "Compiling Parameter.cpp" @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" +$(OBJDIR)/PhaseDetector_8a25ed0e.o: ../../Source/Processors/PhaseDetector/PhaseDetector.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling PhaseDetector.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/PhaseDetectorEditor_eaec855b.o: ../../Source/Processors/PhaseDetector/PhaseDetectorEditor.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling PhaseDetectorEditor.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + $(OBJDIR)/ProcessorGraph_8c3a250a.o: ../../Source/Processors/ProcessorGraph/ProcessorGraph.cpp -@mkdir -p $(OBJDIR) @echo "Compiling ProcessorGraph.cpp" @@ -488,6 +546,16 @@ $(OBJDIR)/PulsePalOutputEditor_3d333977.o: ../../Source/Processors/PulsePalOutpu @echo "Compiling PulsePalOutputEditor.cpp" @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" +$(OBJDIR)/RecordControl_ecb8ada4.o: ../../Source/Processors/RecordControl/RecordControl.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling RecordControl.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/RecordControlEditor_4355fd71.o: ../../Source/Processors/RecordControl/RecordControlEditor.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling RecordControlEditor.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + $(OBJDIR)/EngineConfigWindow_4fd44ceb.o: ../../Source/Processors/RecordNode/EngineConfigWindow.cpp -@mkdir -p $(OBJDIR) @echo "Compiling EngineConfigWindow.cpp" @@ -518,6 +586,36 @@ $(OBJDIR)/RecordNode_cc21a82a.o: ../../Source/Processors/RecordNode/RecordNode.c @echo "Compiling RecordNode.cpp" @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" +$(OBJDIR)/NetworkEventsEditor_fd22826.o: ../../Source/Processors/Editors/NetworkEventsEditor.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling NetworkEventsEditor.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/NetworkEvents_5344c99a.o: ../../Source/Processors/NetworkEvents/NetworkEvents.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling NetworkEvents.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/PeriStimulusTimeHistogramEditor_6be5bf55.o: ../../Source/Processors/PSTH/PeriStimulusTimeHistogramEditor.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling PeriStimulusTimeHistogramEditor.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/PeriStimulusTimeHistogramNode_9631ca2a.o: ../../Source/Processors/PSTH/PeriStimulusTimeHistogramNode.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling PeriStimulusTimeHistogramNode.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/tictoc_cdca1ed.o: ../../Source/Processors/PSTH/tictoc.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling tictoc.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/TrialCircularBuffer_4a4cef0c.o: ../../Source/Processors/PSTH/TrialCircularBuffer.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling TrialCircularBuffer.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + $(OBJDIR)/ResamplingNode_9825590a.o: ../../Source/Processors/ResamplingNode/ResamplingNode.cpp -@mkdir -p $(OBJDIR) @echo "Compiling ResamplingNode.cpp" @@ -553,6 +651,16 @@ $(OBJDIR)/SerialInputEditor_46740885.o: ../../Source/Processors/SerialInput/Seri @echo "Compiling SerialInputEditor.cpp" @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" +$(OBJDIR)/SignalGenerator_993274e2.o: ../../Source/Processors/SignalGenerator/SignalGenerator.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling SignalGenerator.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/SignalGeneratorEditor_b8e0de2f.o: ../../Source/Processors/SignalGenerator/SignalGeneratorEditor.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling SignalGeneratorEditor.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + $(OBJDIR)/SourceNode_de3985ea.o: ../../Source/Processors/SourceNode/SourceNode.cpp -@mkdir -p $(OBJDIR) @echo "Compiling SourceNode.cpp" @@ -563,6 +671,16 @@ $(OBJDIR)/SourceNodeEditor_cdc90937.o: ../../Source/Processors/SourceNode/Source @echo "Compiling SourceNodeEditor.cpp" @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" +$(OBJDIR)/SpikeDetector_50b619e4.o: ../../Source/Processors/SpikeDetector/SpikeDetector.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling SpikeDetector.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/SpikeDetectorEditor_502139b1.o: ../../Source/Processors/SpikeDetector/SpikeDetectorEditor.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling SpikeDetectorEditor.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + $(OBJDIR)/SpikeDisplayCanvas_2219bd20.o: ../../Source/Processors/SpikeDisplayNode/SpikeDisplayCanvas.cpp -@mkdir -p $(OBJDIR) @echo "Compiling SpikeDisplayCanvas.cpp" @@ -578,6 +696,26 @@ $(OBJDIR)/SpikeDisplayNode_be27b98a.o: ../../Source/Processors/SpikeDisplayNode/ @echo "Compiling SpikeDisplayNode.cpp" @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" +$(OBJDIR)/SpikeSortBoxes_17f37282.o: ../../Source/Processors/SpikeSorter/SpikeSortBoxes.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling SpikeSortBoxes.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/SpikeSorter_5f160cae.o: ../../Source/Processors/SpikeSorter/SpikeSorter.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling SpikeSorter.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/SpikeSorterCanvas_f0ead366.o: ../../Source/Processors/SpikeSorter/SpikeSorterCanvas.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling SpikeSorterCanvas.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + +$(OBJDIR)/SpikeSorterEditor_3cee6cfb.o: ../../Source/Processors/SpikeSorter/SpikeSorterEditor.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling SpikeSorterEditor.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + $(OBJDIR)/Splitter_889c68aa.o: ../../Source/Processors/Splitter/Splitter.cpp -@mkdir -p $(OBJDIR) @echo "Compiling Splitter.cpp" diff --git a/Builds/MacOSX/open-ephys.xcodeproj/project.pbxproj b/Builds/MacOSX/open-ephys.xcodeproj/project.pbxproj index 1f936993d..4da647831 100644 --- a/Builds/MacOSX/open-ephys.xcodeproj/project.pbxproj +++ b/Builds/MacOSX/open-ephys.xcodeproj/project.pbxproj @@ -22,42 +22,89 @@ 2D2BDB63CBD0BED07FF9E44B = {isa = PBXBuildFile; fileRef = BBE1DB78E35135B41537DCB5; }; 4FA2949D3023FC2E377AFFB6 = {isa = PBXBuildFile; fileRef = 61317B5191E05925F232E18C; }; CFBB591627F730A6C98ECA25 = {isa = PBXBuildFile; fileRef = 71086F59DD72696364603E33; }; + F08929D23989E83088DD8914 = {isa = PBXBuildFile; fileRef = 12648B73338F2CF28CED2614; }; 14BDAEA656AAFA60334CC55C = {isa = PBXBuildFile; fileRef = 420B0E95F1300ABFDC125DBF; }; + 0ADE6EC5E6FCAC79C9EDA534 = {isa = PBXBuildFile; fileRef = DB4FF7675E5C98CF62DA8A2E; }; C853FCE2F6C91B3643322CF0 = {isa = PBXBuildFile; fileRef = 9F577889CB6C54A2F7B1CA80; }; + 02AAF08AB7A31598784F5EAF = {isa = PBXBuildFile; fileRef = 7B42B28FDB2E3AC67EF296F8; }; 0AE243437B40602D35435C32 = {isa = PBXBuildFile; fileRef = B04D87ED6AA4897B6CD3CCF6; }; + 425B09B8D50623B880FD03D6 = {isa = PBXBuildFile; fileRef = E79259F2164D16553A69B458; }; 07A712AC1BFF4BBB74914575 = {isa = PBXBuildFile; fileRef = D39560BC785A81E49F6C502D; }; + D761F014D76825DEFE0A7582 = {isa = PBXBuildFile; fileRef = FCA5573BA018F7E8106B89FF; }; 9A7123033870A3CDE76FA585 = {isa = PBXBuildFile; fileRef = 8A651860B4EAFA5E94DEF3C7; }; + 475D50099CCF446232FFA63F = {isa = PBXBuildFile; fileRef = E70C1EC37D445DE1D9C85749; }; 8352817FEDC7542D3E65B49A = {isa = PBXBuildFile; fileRef = DA4EAC64A750D0C3DEE83C5D; }; + 5D49C3544A04DDC85CAB84FA = {isa = PBXBuildFile; fileRef = C15024C101ECE85FDDCD770D; }; 44DB81313BDDF1ECB6AD33FE = {isa = PBXBuildFile; fileRef = 1F22CC8D992B8B49D57DDB3F; }; + 7598258C53F4559D2A4CD163 = {isa = PBXBuildFile; fileRef = 19B08AF9187EC45ECDE87602; }; 2BBDCC829E8525DF770E7E6A = {isa = PBXBuildFile; fileRef = C8EC33D17178B382027313A7; }; + 657FB45DCB77956EF22CC8B6 = {isa = PBXBuildFile; fileRef = A81E114BF75E0CEF0C7D1318; }; C45009DBCD71E9E234BFCE97 = {isa = PBXBuildFile; fileRef = FA8CC6FD54A9F20DA755F2EA; }; + DE86EB9584E75F21AA2D1404 = {isa = PBXBuildFile; fileRef = 74BAC33D6BC1D961F04DCC72; }; + E6038800731F7C747D181A51 = {isa = PBXBuildFile; fileRef = D0105584D551FED59203CC84; }; + 083570D49B258B065C833FA1 = {isa = PBXBuildFile; fileRef = E3F5E0DDF9859755B10B074D; }; + FFCA1C44C024BCA1878F49FE = {isa = PBXBuildFile; fileRef = 25CEC111DFEC71FA6828257F; }; + D9AAEFDB36BEA981610B7411 = {isa = PBXBuildFile; fileRef = 589657244185109F68A6B5A2; }; C9678AAD3560E89CCE8FA529 = {isa = PBXBuildFile; fileRef = 80A19F69D9B205BCC0ABA293; }; + A59D1B2CCCFC73B99A92D419 = {isa = PBXBuildFile; fileRef = C7D36423459E79F3F462A421; }; B88BCF2522AD283DDC0B4F16 = {isa = PBXBuildFile; fileRef = FAFA97C9B7C7635298E274DB; }; + 713D95F96082E2FDDBEC45F0 = {isa = PBXBuildFile; fileRef = FD9EE3CDFCEE08859781DA65; }; 5C597B1A42C8CB3940CBDDA9 = {isa = PBXBuildFile; fileRef = AFBAE04615D379A18B133090; }; + C9530E58B7BB7AC2808A6B8A = {isa = PBXBuildFile; fileRef = A166A3013C7AF1BCCA050367; }; 89FCE8890946693CD5FC4A70 = {isa = PBXBuildFile; fileRef = 235A8987D99A191D07208D2F; }; + 4CF2416B5F9F31B41476EE46 = {isa = PBXBuildFile; fileRef = 14F594C425F332F455A16D35; }; C9AC286A46B3A1318F298DEF = {isa = PBXBuildFile; fileRef = ECB5A75A81B90327F58CBD9E; }; + 81E21B307A9CA5FD375BCCA6 = {isa = PBXBuildFile; fileRef = 80EEDD40F49120ADBE9DCBDF; }; DA836EC803E4FF4EDEBE6386 = {isa = PBXBuildFile; fileRef = 2D2BAC4320470CF68743F58E; }; + A4987DAB8931FA89CEA8E642 = {isa = PBXBuildFile; fileRef = FA2F04BA4E146ABF649BBE89; }; 702C9BFCE865CB6C6B8BFB0D = {isa = PBXBuildFile; fileRef = 5DB3B3197F8C1E5EE159D6FC; }; + B1C1C2C756BF23F73DA954DA = {isa = PBXBuildFile; fileRef = 8A989F74B1957BCB3B9BA398; }; 739573501D1D440A72C5C2E5 = {isa = PBXBuildFile; fileRef = A3FB0EA0264580F6B00D993B; }; + CA3C661A0DAE3DFA3E54C4C0 = {isa = PBXBuildFile; fileRef = 23A6BA852B71DAAF3F709428; }; FAE745870674A07A65690433 = {isa = PBXBuildFile; fileRef = 788F8B7719B70465762B634B; }; + 58C57FE9863EA52A46672FD9 = {isa = PBXBuildFile; fileRef = F09FD6D9CA4997216ADBF54F; }; 24CC7E9A7E87F762D4AB0467 = {isa = PBXBuildFile; fileRef = 92602D7166325C7232B85EDD; }; + 1621D0850A6D6773B7F4853B = {isa = PBXBuildFile; fileRef = 0287B009511521BEAAE8A52C; }; 9252537C12447F047243DEE9 = {isa = PBXBuildFile; fileRef = 041038F6E67FE0409D8ECC74; }; + 4A1D97D9259792EC2F11B51D = {isa = PBXBuildFile; fileRef = AAF5C27D2EEDD254A3652717; }; B081F3F4FA6D8C35E2EEE778 = {isa = PBXBuildFile; fileRef = CB5C14E82DE06F767EAD62F9; }; + EA98DF90C4BD1AEF0514ECC9 = {isa = PBXBuildFile; fileRef = 0A6D08BC1B5ACA62F35AF5CD; }; 7398C5E00B9093F78C697706 = {isa = PBXBuildFile; fileRef = 777D9B0FE3C110ADA980BD09; }; + A8B7936CD511AB1B5CB7FA20 = {isa = PBXBuildFile; fileRef = 87C0534EAC82E887E1D354C3; }; 2416F9D9E4D89A706514FC25 = {isa = PBXBuildFile; fileRef = E5FA033C407367AE0793258B; }; + 43718CB43C116FA711E64A0D = {isa = PBXBuildFile; fileRef = D1C27DAA2DDCEF188DDC8C5E; }; 66507CA290B4730FE77B7ABC = {isa = PBXBuildFile; fileRef = D60B35D4E32DAE001056D4D5; }; + 231E09046298BE46F20233A6 = {isa = PBXBuildFile; fileRef = 56D5BE8BFA1F07F5EFF1DFE8; }; 031957790B288A3ABED26A87 = {isa = PBXBuildFile; fileRef = 4B58436E2B47FC6BB349129F; }; + 7FAB7BAD8902C9B2CAFE74AB = {isa = PBXBuildFile; fileRef = E8D51D470C9955D7D03D5469; }; + CC3D1CCE752AD112D4307B05 = {isa = PBXBuildFile; fileRef = 1322A008F022AF76593EAA9A; }; 07868E8D0C1A0BB3A94E87AB = {isa = PBXBuildFile; fileRef = F603678D95461916B9D971AA; }; + E935CA53565964A58490681C = {isa = PBXBuildFile; fileRef = DAB201178DC7489D24FEA3F4; }; 2B90821075BA2DF4565644D4 = {isa = PBXBuildFile; fileRef = BCB5B6CEF112FC911B90E6E2; }; + EDDA68015D1F6EBBA460438A = {isa = PBXBuildFile; fileRef = 3D782D1796455167CE41CCAB; }; E18FD0CB21E95A6E81286611 = {isa = PBXBuildFile; fileRef = 5E5098D437FC0612291567AC; }; + BA442DC5447F41A262EA93C6 = {isa = PBXBuildFile; fileRef = 7814050BBF14AF7D45872768; }; AD938EF313A6AC879CA4BED7 = {isa = PBXBuildFile; fileRef = 52070E1171C046E4949ADFE5; }; + 3D3D8841F1BEE97CB0BFB4B9 = {isa = PBXBuildFile; fileRef = 154D5631EEFF8883BD385EB7; }; 56C42E2DD0B4905488948796 = {isa = PBXBuildFile; fileRef = 388D5CAFAE66CCCB8ADA594C; }; + B71515B75F424ADEE2FD9AEB = {isa = PBXBuildFile; fileRef = BA3C61B41A55C23959AA57A3; }; + E7D895CBB979E2D43B7DE83E = {isa = PBXBuildFile; fileRef = F345254DE7F499036FB17995; }; DC1D91C883B609DBEF7A4235 = {isa = PBXBuildFile; fileRef = 78A1CE918B3E7ADD87DA4350; }; + 4152D4ED72BBAD132EB3D9D5 = {isa = PBXBuildFile; fileRef = 5CF96A7BBD6C4DE4D059E4A4; }; + BD9944FE296F401D8ED449DC = {isa = PBXBuildFile; fileRef = 98EFA5304D160AD9225E38B4; }; 8ED8249C48B1BB53F617A789 = {isa = PBXBuildFile; fileRef = 40F90FEFBD575E8A67DF68EB; }; + ADFC97D23FC8AE1EA2E414DD = {isa = PBXBuildFile; fileRef = 677CC8DA903C77D8ECBAE26D; }; AD588F05EDFE59FD48A3F9B8 = {isa = PBXBuildFile; fileRef = 9C736D7B85CCD9EC40C5D0AF; }; + FDADC8A751512464A863A260 = {isa = PBXBuildFile; fileRef = 442F01DC974E1EAC57450906; }; 6C0A7B0D658E39227319148F = {isa = PBXBuildFile; fileRef = FAD15233FFB64C1608A60250; }; + A9256A89B0A67E926C10D569 = {isa = PBXBuildFile; fileRef = C1B540E49C0EBA03ACDBBDFB; }; 469E1EF233BCD61F44687C0F = {isa = PBXBuildFile; fileRef = E122ECCE167A03BDF2D282FE; }; + 98883CE5BC919B825C775CA3 = {isa = PBXBuildFile; fileRef = 8B0B1D01BA8A37EC6058E518; }; + 3980BA0A56ACF1709E7465EA = {isa = PBXBuildFile; fileRef = BD6FDA7B037CF3535431BFC8; }; 411543734DA2029A3030D903 = {isa = PBXBuildFile; fileRef = 20BB146B925C4D4AD43BA479; }; + 7BADBB3781106EEFA7C954E7 = {isa = PBXBuildFile; fileRef = B207877BD3DC2A555E51ADD8; }; + 025EA6C7BC2F9956FF5AA7A1 = {isa = PBXBuildFile; fileRef = 54B7796F6DCF5531789CCF43; }; + DA7D3940DC6ABC67803D505F = {isa = PBXBuildFile; fileRef = 3846F3FA0FC28CE322073E94; }; 52AE3F7AEED81BA9ED5C4830 = {isa = PBXBuildFile; fileRef = E216D095C98F850A5FB6FB0F; }; 50C545252FEF7B6F9D82092D = {isa = PBXBuildFile; fileRef = 70F06DBCA3948BCC1062E36F; }; 029C3B11BE586DA100895A60 = {isa = PBXBuildFile; fileRef = 28CCF04CCC028BAE0AEE5840; }; @@ -69,61 +116,160 @@ AA16BE5A6BBD024C8FCFCDA8 = {isa = PBXBuildFile; fileRef = CAA3B9396EA62166234DAEF1; }; 46511E0CF49A1F753F2EC949 = {isa = PBXBuildFile; fileRef = B23E6EBB5F99CF7FC72FAC4E; }; 44D7379F739C19C7B78B95F5 = {isa = PBXBuildFile; fileRef = C5C843AC83A36BE87E3F97F8; }; + 6BBA2047EED8D1918CD25253 = {isa = PBXBuildFile; fileRef = 9410421AB1CD18F754FD4A9E; }; F4808CE43E77C8EC285A39DC = {isa = PBXBuildFile; fileRef = 2592795DB135E0F2C04406F3; }; + 29160C7519A2730BB9DA6296 = {isa = PBXBuildFile; fileRef = 10AC8A3D981DAE425D24F9F1; }; D1F0765F1497D5228ABCA63C = {isa = PBXBuildFile; fileRef = F6BE430A8D1C6240286ED75B; }; + 12E152732DE8BB21A2BACACA = {isa = PBXBuildFile; fileRef = 51BB55D1CE1667CD340E8358; }; C0925B26A0267FE011445FCB = {isa = PBXBuildFile; fileRef = C54F63E163E9F8DE60EEA1EE; }; + 5C00155E151C8AF4C3C08FFF = {isa = PBXBuildFile; fileRef = 1C567FD773309E8CE216EC9A; }; 4976529FC367F5F6A0D04370 = {isa = PBXBuildFile; fileRef = A76B04F4829C862D4B8F66B3; }; + 3F6A34906F13DE5E65F9F785 = {isa = PBXBuildFile; fileRef = 1A05C5AF5447448AAF869508; }; 68EBB4CEB08BD3DEAC450B95 = {isa = PBXBuildFile; fileRef = 34834859523571912C55AC94; }; + 53942219C91A015CCEF6F751 = {isa = PBXBuildFile; fileRef = D5DC73F860143308ADF769C1; }; 24800AF87AD21CE652552EDE = {isa = PBXBuildFile; fileRef = 56F810EF10E01535A417B671; }; + 7D393CD459AD73307B4B26A2 = {isa = PBXBuildFile; fileRef = BF8C15407347975836BFA88F; }; 0203D029CE7420984F737E51 = {isa = PBXBuildFile; fileRef = 414969AEF838522C9FE1B807; }; + C7645118F58597FDEBF06577 = {isa = PBXBuildFile; fileRef = 5EA566ED87CC02EA6DF1993B; }; 3BAE3A1FD0834E798B8602BF = {isa = PBXBuildFile; fileRef = 9AA19ECEFE2B49832ECEED2F; }; + 84D5E875E6E036CF685CF1FC = {isa = PBXBuildFile; fileRef = 70651FEF347D8DE167B68EB8; }; B49852F77C0C392C159A1914 = {isa = PBXBuildFile; fileRef = C5654EAA7B65445CF1340983; }; + F1CFB5BF336DF4A46A570280 = {isa = PBXBuildFile; fileRef = 012F05BBF926C8F39AC7871B; }; + 9F431DA23C92CA0F8E3A2A28 = {isa = PBXBuildFile; fileRef = D9BF6DA66C22FFF5C4D41991; }; + 1F2F913B1C3DABC8850016C5 = {isa = PBXBuildFile; fileRef = CD657DBBDB4550C800F05D22; }; + BFFD23BD72ECEC9E54936061 = {isa = PBXBuildFile; fileRef = 88C69F0563A99BD2F7BF5FBB; }; + 86971F608005DD3B71FF8676 = {isa = PBXBuildFile; fileRef = E04512D01D2F6FE00C336CAD; }; + FA882EEE408CBBDC7BD90F14 = {isa = PBXBuildFile; fileRef = 1C64C490BD7FE9E57D6C682D; }; + 160F0B19B8A49AA1B26FAFC6 = {isa = PBXBuildFile; fileRef = B2F72769CF14BD7F882E9542; }; 6D00BABD3FE1AA0EAA267C1C = {isa = PBXBuildFile; fileRef = 07B84F46CF90D04BB6B673C5; }; + 6B56E0463FF3D580F0C84407 = {isa = PBXBuildFile; fileRef = CA50A6F43BD78D01A8BE974B; }; AD371C6F383F03EF392B6581 = {isa = PBXBuildFile; fileRef = BAA5B3AD1A27F8C4D37A6869; }; + 4DF3A59A371DE10E4FFFF642 = {isa = PBXBuildFile; fileRef = 8C639E4F97B7D6070028623A; }; 4EF2825142BBAA76FD55FE26 = {isa = PBXBuildFile; fileRef = BC1543B1F822FEEDCB9AC26D; }; + CDB3C038ABFCB6A8EAA27D79 = {isa = PBXBuildFile; fileRef = 8F058EA775325F9C5650944E; }; 3B05807D08271664EEC4977C = {isa = PBXBuildFile; fileRef = AEFC8A0A9A35F50E59FDE678; }; + 27A764088D184F9898FC8B4F = {isa = PBXBuildFile; fileRef = 9EB2B238943CCC32B587881C; }; F2586A2DCEF44961AEA247E8 = {isa = PBXBuildFile; fileRef = 934B37E2BECD69E6E27051F6; }; + 9354508D753345076D5C79E6 = {isa = PBXBuildFile; fileRef = 362898B655ABFFA23A69BBFA; }; 3E7939ABAA984EE8BFC8CEDD = {isa = PBXBuildFile; fileRef = 4F5D51C5F8174E3824EF8B42; }; + CD6ACBFB0637B64B9CA1A91F = {isa = PBXBuildFile; fileRef = 811BCA5BE226C5188BC5E9B9; }; + C9F9AE4CB2009DFFD7D7A67F = {isa = PBXBuildFile; fileRef = 4F10D1D2F5ED2E7F9A997D4C; }; + C69A92478301D81D75E1A0EC = {isa = PBXBuildFile; fileRef = 35BB20110BAC6346AA605BF9; }; + C59D4B35ABCF3BE6D0A0665E = {isa = PBXBuildFile; fileRef = 3FE8C41480F07050CC21635F; }; + BD5128D0C727A7CCA76C9A41 = {isa = PBXBuildFile; fileRef = 31FB49244DF85E2ACCFBDF2B; }; BAC379C03C2E7995F2393EF5 = {isa = PBXBuildFile; fileRef = 4CB63EE1552BBFDEB1DADB0A; }; + 326F93591218D713F4230961 = {isa = PBXBuildFile; fileRef = B695B24906116ADEFC9D9B5C; }; 82160D8346428EC9F641FAD6 = {isa = PBXBuildFile; fileRef = 183701B0661B6FE784C6A75F; }; + 39F3181320E5E0E35EC37564 = {isa = PBXBuildFile; fileRef = E1A51630F1C6E392EBEDD469; }; 15C43033BAB27663B4226539 = {isa = PBXBuildFile; fileRef = DE0EA2212323DEFEBA3D078F; }; + 2EEBA7B6BB147046137789E7 = {isa = PBXBuildFile; fileRef = 623684E73A6005C7BB2717A6; }; + BD091BDB684BB28E0F953B8B = {isa = PBXBuildFile; fileRef = E849E3966302E7D4D06712F5; }; + 798FA335EA66F747EFB48247 = {isa = PBXBuildFile; fileRef = E0AB41DFF4A382B93658F53E; }; + 395F1886484CA576C63B7112 = {isa = PBXBuildFile; fileRef = 56242BB33B53F133914517BD; }; + 3BE6379EA4361C00A9D90E9A = {isa = PBXBuildFile; fileRef = F379BA0589FB65817B721314; }; E1247DDF1C88D99691499E52 = {isa = PBXBuildFile; fileRef = 7DB22AC6407EEA88F3FFA16D; }; + 960C8D7486F047112BD4468B = {isa = PBXBuildFile; fileRef = 398BF0B03B719107E6093F98; }; 0E036CEA1285F9B162A07356 = {isa = PBXBuildFile; fileRef = F552E7A463C6207BC3E74C06; }; + 250BE9DED2B1E3F6799D4F68 = {isa = PBXBuildFile; fileRef = 449B26D1265BB91B331EFF84; }; A4A2DF3FA65BAB4322FE5E74 = {isa = PBXBuildFile; fileRef = 36332333DBF8363163F454E6; }; + B607347408D47E361FE18387 = {isa = PBXBuildFile; fileRef = 8A07B5B6D56277A222AC0E90; }; 0A8D8C2D02858F0F08356EA9 = {isa = PBXBuildFile; fileRef = E39CC410838072043E3C30DC; }; + D4995270E6CB321A9F344EB1 = {isa = PBXBuildFile; fileRef = 9B1962D340B217B19B077F2A; }; AEDA8F23648EABF79215B566 = {isa = PBXBuildFile; fileRef = F716728550EBD8FA7B9CA7EF; }; + D909F61CF9323366A2143DB2 = {isa = PBXBuildFile; fileRef = 25B79E00075CCF59F0A4A7D7; }; B806F023DF817BB2D59FEEFD = {isa = PBXBuildFile; fileRef = 949422DF0532222450E95926; }; + 1419982AA3FEFD48742EC391 = {isa = PBXBuildFile; fileRef = B657AEAFB3404A5CB270C413; }; + BEACD5086C04D68470944B72 = {isa = PBXBuildFile; fileRef = A77E8538ED93AAADC9FE2646; }; + 11EB9F8EA8987709E851DBED = {isa = PBXBuildFile; fileRef = 84BED3AADBD3FAB6EFEC323E; }; + 96BFF19817240A0D9062A1A2 = {isa = PBXBuildFile; fileRef = DF95F463F806B844A3D6AF59; }; + 24348B377D1E9699AAB08681 = {isa = PBXBuildFile; fileRef = 60494102600DD1F7AABCD309; }; + B8E8A7F22DCE37B735E65C43 = {isa = PBXBuildFile; fileRef = 0D29270F94FE7878DDF891AA; }; + 9FD92FEF340DC46C56216FC5 = {isa = PBXBuildFile; fileRef = 239AD53591DA0B5B4796A3DF; }; + 093F0BA37D6C91C7E92AB658 = {isa = PBXBuildFile; fileRef = 25B9B8D5E54B9C547197E414; }; + 3B0E6D1750C7ABA614451522 = {isa = PBXBuildFile; fileRef = 6DA5EDE1BF0E8D396EAE23FC; }; + 620CF6292EFB911F15916EA6 = {isa = PBXBuildFile; fileRef = 547C76794FAC1BC349163509; }; + CCFF38BDBD01CB3623B68A97 = {isa = PBXBuildFile; fileRef = CCE779E203974113A80D6D85; }; + 7B50AD44D4F9610CE4A43414 = {isa = PBXBuildFile; fileRef = FB827FEEA15A274E5F7577DB; }; + A41078823B3B4B995770C39E = {isa = PBXBuildFile; fileRef = 76D8904379362E11CA4EA11D; }; 69B5045877D4C674E8A4967F = {isa = PBXBuildFile; fileRef = E102C308B0722DFFFEFF2415; }; + 8F7C39DA5FA94D2D64F0BA60 = {isa = PBXBuildFile; fileRef = B574136FEE7957F7439CB346; }; 97105BCBC5B1BE4E86D48899 = {isa = PBXBuildFile; fileRef = 55DFE30C901793E56A7E3A22; }; + 4B750243729919C7EE437E98 = {isa = PBXBuildFile; fileRef = 1785D37A95AF0D67F69F29B6; }; 790911EDF00A4BF77327D99A = {isa = PBXBuildFile; fileRef = 48E12736F471C43C959AD15C; }; + 042EAAFCEB9F67456BCEC978 = {isa = PBXBuildFile; fileRef = 79C32CA8069962F5DE48F633; }; DDDFAE2042D8AD20CC78CE3C = {isa = PBXBuildFile; fileRef = 3753B3B311AE0A9F4CC5AD40; }; + 6B168D6AA36555A28CFC0901 = {isa = PBXBuildFile; fileRef = 758BC480F153DEA79304366B; }; + BCAB66E96F54F6CB32E4FA62 = {isa = PBXBuildFile; fileRef = DEF465116BB906FD116DA5EB; }; 582C224AA50C9395810C8E27 = {isa = PBXBuildFile; fileRef = 308F614D30DCB9AE3767C928; }; + C8659D1D456E717F4E5650FE = {isa = PBXBuildFile; fileRef = 92CB21BEE17D1DD03106AD87; }; 846EF153B423E09BC5BFDAFD = {isa = PBXBuildFile; fileRef = 4C01F867D43DF7B1D98B887E; }; + 3831D26FCA910C6B23CB36FE = {isa = PBXBuildFile; fileRef = 12F73B770FFDEA8696710E86; }; 66308BBB808DBB920AB3CBAB = {isa = PBXBuildFile; fileRef = 6D38B76951D31D96F1B71E0F; }; + 3D5543BA75736B1294050795 = {isa = PBXBuildFile; fileRef = 27FB12D08303BEC9CD15E317; }; + 1D0D651813C4A1DCBE811242 = {isa = PBXBuildFile; fileRef = 748F08ACA463113F570C51AC; }; + E3585CC45E8167A48E97785B = {isa = PBXBuildFile; fileRef = D50EA137CEA9654AA8AB3D4C; }; + BFAC940E5771516A92281F96 = {isa = PBXBuildFile; fileRef = 0915EBE101DD5974F692755B; }; + A49A84A265633FAE079081E7 = {isa = PBXBuildFile; fileRef = 38E1C53CF5BB38247BCAA909; }; 7B69E73AF79BB2B10BAA559C = {isa = PBXBuildFile; fileRef = 242B80832B3C8FF4F3CC18F1; }; + 30D2FF80A059C4F2F2641452 = {isa = PBXBuildFile; fileRef = A7BF9312D81FF5DCEAB8AC47; }; 74A14124A3B0C5FB13583B57 = {isa = PBXBuildFile; fileRef = 326F8386BCD4E4189D0CC00F; }; + BABD91F2DC4EDF91E155CC42 = {isa = PBXBuildFile; fileRef = B5D805B691B1C38D959F6B54; }; + 6D8A9AC5ECC0F2D26304849E = {isa = PBXBuildFile; fileRef = 89CDE7ED25D0EB7452486E85; }; + 730BD9F465C846CE50DFFC0F = {isa = PBXBuildFile; fileRef = 13A33B5CF55BDF7BDC9D1D0C; }; + AFC645928D103D9FA51481CA = {isa = PBXBuildFile; fileRef = D0F10367EBD3945780342A37; }; + DEC3BE6E103F30FF5260BA2A = {isa = PBXBuildFile; fileRef = 811A8689009F6FBEE2168F96; }; 84BB28DDFF317D243DDC7FA2 = {isa = PBXBuildFile; fileRef = AAC6EC29963717E95428D7D2; }; + DC1505106186A011077FC0B4 = {isa = PBXBuildFile; fileRef = C2CB484954A536E782B4A8E7; }; A14CA9089A09267E95C93E1D = {isa = PBXBuildFile; fileRef = 2F0C721AB2973FAD23C7F47B; }; + 9DE3E3BA75AAA0872C7F2A25 = {isa = PBXBuildFile; fileRef = 34CF4D00D785338941AB9590; }; DED0D08EFA1EFF4F1D4D3BEF = {isa = PBXBuildFile; fileRef = AC9E30922A14330704FB2573; }; + 33433C097E276713BAA2266D = {isa = PBXBuildFile; fileRef = AE1FC768C646A0EFEC3E3A11; }; + 9635A954DB8FDD6E19B977C3 = {isa = PBXBuildFile; fileRef = 92F51CF12E0C21F38D5E61E8; }; + 8D37FF507C77CC8EA831C5AE = {isa = PBXBuildFile; fileRef = FBF2BF7B97C2FF8557CF39E6; }; + B9718533E5255AEC3F6C7B2F = {isa = PBXBuildFile; fileRef = D45EF9812FBC284BCB7EEB7C; }; + 5C54E5C528ECD500842038EB = {isa = PBXBuildFile; fileRef = 78400C0FB79F6B0D1A27A6D4; }; + 58EC9F834448B334410385EB = {isa = PBXBuildFile; fileRef = 6DF620BE87EA9F7F25A1144A; }; + 5842C5403AF4A2A6BD87F83B = {isa = PBXBuildFile; fileRef = B66B8CFF619CBF2D66F031E3; }; + 027A01C5025DEA9DAFF605D3 = {isa = PBXBuildFile; fileRef = F46365D8E42099148B843C95; }; + 145E3116F63B7BCBDB30EC96 = {isa = PBXBuildFile; fileRef = F753A8E9CE0C51998066EA07; }; 4910924155F31E96B9BAD050 = {isa = PBXBuildFile; fileRef = B9068FF0373FA8321C33C42C; }; + FE0BEC4F57D0EA019EF6D24A = {isa = PBXBuildFile; fileRef = E1E9FAB63BD90C10F2BEF74C; }; 66DE280C28A69B2002C40A86 = {isa = PBXBuildFile; fileRef = 607CC2BFCB0622B3348FA1AD; }; + B1CFD7C1DD7724CD38FA1FEC = {isa = PBXBuildFile; fileRef = 385F66531BAB16BA754E901E; }; 5BF488044E143A2727CE2BDB = {isa = PBXBuildFile; fileRef = 0646A83E4EE738EE5D914DA6; }; 1B620FC17AAECA4C5DE741E2 = {isa = PBXBuildFile; fileRef = 66463AB11EA4D6341C32F27E; }; + E4DFAFCE9800EE2C9F8A8AAF = {isa = PBXBuildFile; fileRef = FFFBDB9A00240D797751FEE6; }; 19BB86C918F89D1377F8A0E1 = {isa = PBXBuildFile; fileRef = 5894D40A0E8FA6E9B3EBF9D9; }; + 284D8B7D3CDE3742B3468855 = {isa = PBXBuildFile; fileRef = ADCB42E4C5641007A4B78025; }; + AE270975F90CC92C27F80B05 = {isa = PBXBuildFile; fileRef = 215E1BD79B5870D5356810F0; }; 89223664B6CB2A912E36B091 = {isa = PBXBuildFile; fileRef = F115ED75E977A54AAF036B2C; }; + 39914728A9B138EB9A04CF34 = {isa = PBXBuildFile; fileRef = AE3D7946F13CE32AE41DD1B7; }; 8F39AD3F7938EFE82D06E89F = {isa = PBXBuildFile; fileRef = AF28CAB9C7531EF7422602E1; }; + 32E4965D513877EDAC11E9E4 = {isa = PBXBuildFile; fileRef = A186E03EC7A6A7E657F38300; }; BA608CEFC85F7AB9E30E0EB3 = {isa = PBXBuildFile; fileRef = F960CC94B136201BDA148EEA; }; + 8EB38EF63AACA70DFEC4CF94 = {isa = PBXBuildFile; fileRef = C59B01C8DB5B3B4773032E12; }; D499273B65D901D0A101CAAA = {isa = PBXBuildFile; fileRef = E5C1D021C0FD6FAD082C5D75; }; + 14133143519D06FC6F4C88C6 = {isa = PBXBuildFile; fileRef = BA422CC894B825834A0C5479; }; 95AE939ADE096394CCD2526F = {isa = PBXBuildFile; fileRef = 9F3B3184EC6D42CEA35D6ED8; }; + 6DC53D380636F5A30B52BAC8 = {isa = PBXBuildFile; fileRef = E93BE115650B1CB80EACB841; }; E85DA5FC9A162F129ABA7113 = {isa = PBXBuildFile; fileRef = 0987F7E90136D0E08A606A22; }; + B37D32878D75EDCD4400826A = {isa = PBXBuildFile; fileRef = 48F6281AB92B232E5187D00C; }; 6A13D8F42A330E2C410B43E3 = {isa = PBXBuildFile; fileRef = 7E875E681E18D693D5ADB2FB; }; + 736608BBA6321E460BDBBBC8 = {isa = PBXBuildFile; fileRef = 57FBA8BC3104D3AF41FBECD8; }; 13F1111511DD01E843E631CA = {isa = PBXBuildFile; fileRef = 79C91DDF3BC3F15D0338E504; }; + D4EC5BCFAB683EA0A4473AA6 = {isa = PBXBuildFile; fileRef = 105B1452DF6CE1D80D69A9D1; }; 9A80E3D1D1758A31D2169497 = {isa = PBXBuildFile; fileRef = 3774BBCA6CB133D9A854CF71; }; + 715C8221533FB1B9DD03F721 = {isa = PBXBuildFile; fileRef = 19148DBA36B94FA639DF3A72; }; F4397EAE00E0B9F96C8B6C07 = {isa = PBXBuildFile; fileRef = 17E13CCDA0C82F92EAB05BE6; }; + 12088E12BCA721D0832B39FD = {isa = PBXBuildFile; fileRef = D2696B30CBEAD7CE72510AFA; }; 09673DA3B4D6EA61DEFC0C46 = {isa = PBXBuildFile; fileRef = 47A3942AC30A3212C01F1CAF; }; + 968E9B7C2E1974474E51F26E = {isa = PBXBuildFile; fileRef = 7D9374931D760ADC65DCBFC6; }; 58D3FF3B1F462634167BDFB5 = {isa = PBXBuildFile; fileRef = 610E487E060C42B52FD5AAC9; }; + 6DA67142BD5D41B90A19121B = {isa = PBXBuildFile; fileRef = 0FE8ACC50ED8E7FFC9E6B9B4; }; 3162B66BC8118715AAA527D7 = {isa = PBXBuildFile; fileRef = D2A3B4CDD296B4CEC6902FD7; }; + 4300909A1BAF9464663A9CF3 = {isa = PBXBuildFile; fileRef = 3FC794735FA8DDA39A62224B; }; 004E78BC139419671A9EA137 = {isa = PBXBuildFile; fileRef = E08E877C3A6283CF5C803957; }; + 63181788D187F9A15BBE03D9 = {isa = PBXBuildFile; fileRef = BB26BA9CFAE8C836251E8EAF; }; 6306AA945375749C4FE834E6 = {isa = PBXBuildFile; fileRef = 2C89EC72FF6A7118EF459DC3; }; AD7D05519200FB0EE1C7617A = {isa = PBXBuildFile; fileRef = A512C5B237A77EF6FB8E11A0; }; C2475E008FEB33B3EA7B6C7F = {isa = PBXBuildFile; fileRef = DF3C9A1DD67E879E4E0A2727; }; @@ -2945,42 +3091,89 @@ 4FA2949D3023FC2E377AFFB6, ); runOnlyForDeploymentPostprocessing = 0; }; 0C1B429379FBBA77A635B49A = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( CFBB591627F730A6C98ECA25, + F08929D23989E83088DD8914, 14BDAEA656AAFA60334CC55C, + 0ADE6EC5E6FCAC79C9EDA534, C853FCE2F6C91B3643322CF0, + 02AAF08AB7A31598784F5EAF, 0AE243437B40602D35435C32, + 425B09B8D50623B880FD03D6, 07A712AC1BFF4BBB74914575, + D761F014D76825DEFE0A7582, 9A7123033870A3CDE76FA585, + 475D50099CCF446232FFA63F, 8352817FEDC7542D3E65B49A, + 5D49C3544A04DDC85CAB84FA, 44DB81313BDDF1ECB6AD33FE, + 7598258C53F4559D2A4CD163, 2BBDCC829E8525DF770E7E6A, + 657FB45DCB77956EF22CC8B6, C45009DBCD71E9E234BFCE97, + DE86EB9584E75F21AA2D1404, + E6038800731F7C747D181A51, + 083570D49B258B065C833FA1, + FFCA1C44C024BCA1878F49FE, + D9AAEFDB36BEA981610B7411, C9678AAD3560E89CCE8FA529, + A59D1B2CCCFC73B99A92D419, B88BCF2522AD283DDC0B4F16, + 713D95F96082E2FDDBEC45F0, 5C597B1A42C8CB3940CBDDA9, + C9530E58B7BB7AC2808A6B8A, 89FCE8890946693CD5FC4A70, + 4CF2416B5F9F31B41476EE46, C9AC286A46B3A1318F298DEF, + 81E21B307A9CA5FD375BCCA6, DA836EC803E4FF4EDEBE6386, + A4987DAB8931FA89CEA8E642, 702C9BFCE865CB6C6B8BFB0D, + B1C1C2C756BF23F73DA954DA, 739573501D1D440A72C5C2E5, + CA3C661A0DAE3DFA3E54C4C0, FAE745870674A07A65690433, + 58C57FE9863EA52A46672FD9, 24CC7E9A7E87F762D4AB0467, + 1621D0850A6D6773B7F4853B, 9252537C12447F047243DEE9, + 4A1D97D9259792EC2F11B51D, B081F3F4FA6D8C35E2EEE778, + EA98DF90C4BD1AEF0514ECC9, 7398C5E00B9093F78C697706, + A8B7936CD511AB1B5CB7FA20, 2416F9D9E4D89A706514FC25, + 43718CB43C116FA711E64A0D, 66507CA290B4730FE77B7ABC, + 231E09046298BE46F20233A6, 031957790B288A3ABED26A87, + 7FAB7BAD8902C9B2CAFE74AB, + CC3D1CCE752AD112D4307B05, 07868E8D0C1A0BB3A94E87AB, + E935CA53565964A58490681C, 2B90821075BA2DF4565644D4, + EDDA68015D1F6EBBA460438A, E18FD0CB21E95A6E81286611, + BA442DC5447F41A262EA93C6, AD938EF313A6AC879CA4BED7, + 3D3D8841F1BEE97CB0BFB4B9, 56C42E2DD0B4905488948796, + B71515B75F424ADEE2FD9AEB, + E7D895CBB979E2D43B7DE83E, DC1D91C883B609DBEF7A4235, + 4152D4ED72BBAD132EB3D9D5, + BD9944FE296F401D8ED449DC, 8ED8249C48B1BB53F617A789, + ADFC97D23FC8AE1EA2E414DD, AD588F05EDFE59FD48A3F9B8, + FDADC8A751512464A863A260, 6C0A7B0D658E39227319148F, + A9256A89B0A67E926C10D569, 469E1EF233BCD61F44687C0F, + 98883CE5BC919B825C775CA3, + 3980BA0A56ACF1709E7465EA, 411543734DA2029A3030D903, + 7BADBB3781106EEFA7C954E7, + 025EA6C7BC2F9956FF5AA7A1, + DA7D3940DC6ABC67803D505F, 52AE3F7AEED81BA9ED5C4830, 50C545252FEF7B6F9D82092D, 029C3B11BE586DA100895A60, @@ -2992,61 +3185,160 @@ AA16BE5A6BBD024C8FCFCDA8, 46511E0CF49A1F753F2EC949, 44D7379F739C19C7B78B95F5, + 6BBA2047EED8D1918CD25253, F4808CE43E77C8EC285A39DC, + 29160C7519A2730BB9DA6296, D1F0765F1497D5228ABCA63C, + 12E152732DE8BB21A2BACACA, C0925B26A0267FE011445FCB, + 5C00155E151C8AF4C3C08FFF, 4976529FC367F5F6A0D04370, + 3F6A34906F13DE5E65F9F785, 68EBB4CEB08BD3DEAC450B95, + 53942219C91A015CCEF6F751, 24800AF87AD21CE652552EDE, + 7D393CD459AD73307B4B26A2, 0203D029CE7420984F737E51, + C7645118F58597FDEBF06577, 3BAE3A1FD0834E798B8602BF, + 84D5E875E6E036CF685CF1FC, B49852F77C0C392C159A1914, + F1CFB5BF336DF4A46A570280, + 9F431DA23C92CA0F8E3A2A28, + 1F2F913B1C3DABC8850016C5, + BFFD23BD72ECEC9E54936061, + 86971F608005DD3B71FF8676, + FA882EEE408CBBDC7BD90F14, + 160F0B19B8A49AA1B26FAFC6, 6D00BABD3FE1AA0EAA267C1C, + 6B56E0463FF3D580F0C84407, AD371C6F383F03EF392B6581, + 4DF3A59A371DE10E4FFFF642, 4EF2825142BBAA76FD55FE26, + CDB3C038ABFCB6A8EAA27D79, 3B05807D08271664EEC4977C, + 27A764088D184F9898FC8B4F, F2586A2DCEF44961AEA247E8, + 9354508D753345076D5C79E6, 3E7939ABAA984EE8BFC8CEDD, + CD6ACBFB0637B64B9CA1A91F, + C9F9AE4CB2009DFFD7D7A67F, + C69A92478301D81D75E1A0EC, + C59D4B35ABCF3BE6D0A0665E, + BD5128D0C727A7CCA76C9A41, BAC379C03C2E7995F2393EF5, + 326F93591218D713F4230961, 82160D8346428EC9F641FAD6, + 39F3181320E5E0E35EC37564, 15C43033BAB27663B4226539, + 2EEBA7B6BB147046137789E7, + BD091BDB684BB28E0F953B8B, + 798FA335EA66F747EFB48247, + 395F1886484CA576C63B7112, + 3BE6379EA4361C00A9D90E9A, E1247DDF1C88D99691499E52, + 960C8D7486F047112BD4468B, 0E036CEA1285F9B162A07356, + 250BE9DED2B1E3F6799D4F68, A4A2DF3FA65BAB4322FE5E74, + B607347408D47E361FE18387, 0A8D8C2D02858F0F08356EA9, + D4995270E6CB321A9F344EB1, AEDA8F23648EABF79215B566, + D909F61CF9323366A2143DB2, B806F023DF817BB2D59FEEFD, + 1419982AA3FEFD48742EC391, + BEACD5086C04D68470944B72, + 11EB9F8EA8987709E851DBED, + 96BFF19817240A0D9062A1A2, + 24348B377D1E9699AAB08681, + B8E8A7F22DCE37B735E65C43, + 9FD92FEF340DC46C56216FC5, + 093F0BA37D6C91C7E92AB658, + 3B0E6D1750C7ABA614451522, + 620CF6292EFB911F15916EA6, + CCFF38BDBD01CB3623B68A97, + 7B50AD44D4F9610CE4A43414, + A41078823B3B4B995770C39E, 69B5045877D4C674E8A4967F, + 8F7C39DA5FA94D2D64F0BA60, 97105BCBC5B1BE4E86D48899, + 4B750243729919C7EE437E98, 790911EDF00A4BF77327D99A, + 042EAAFCEB9F67456BCEC978, DDDFAE2042D8AD20CC78CE3C, + 6B168D6AA36555A28CFC0901, + BCAB66E96F54F6CB32E4FA62, 582C224AA50C9395810C8E27, + C8659D1D456E717F4E5650FE, 846EF153B423E09BC5BFDAFD, + 3831D26FCA910C6B23CB36FE, 66308BBB808DBB920AB3CBAB, + 3D5543BA75736B1294050795, + 1D0D651813C4A1DCBE811242, + E3585CC45E8167A48E97785B, + BFAC940E5771516A92281F96, + A49A84A265633FAE079081E7, 7B69E73AF79BB2B10BAA559C, + 30D2FF80A059C4F2F2641452, 74A14124A3B0C5FB13583B57, + BABD91F2DC4EDF91E155CC42, + 6D8A9AC5ECC0F2D26304849E, + 730BD9F465C846CE50DFFC0F, + AFC645928D103D9FA51481CA, + DEC3BE6E103F30FF5260BA2A, 84BB28DDFF317D243DDC7FA2, + DC1505106186A011077FC0B4, A14CA9089A09267E95C93E1D, + 9DE3E3BA75AAA0872C7F2A25, DED0D08EFA1EFF4F1D4D3BEF, + 33433C097E276713BAA2266D, + 9635A954DB8FDD6E19B977C3, + 8D37FF507C77CC8EA831C5AE, + B9718533E5255AEC3F6C7B2F, + 5C54E5C528ECD500842038EB, + 58EC9F834448B334410385EB, + 5842C5403AF4A2A6BD87F83B, + 027A01C5025DEA9DAFF605D3, + 145E3116F63B7BCBDB30EC96, 4910924155F31E96B9BAD050, + FE0BEC4F57D0EA019EF6D24A, 66DE280C28A69B2002C40A86, + B1CFD7C1DD7724CD38FA1FEC, 5BF488044E143A2727CE2BDB, 1B620FC17AAECA4C5DE741E2, + E4DFAFCE9800EE2C9F8A8AAF, 19BB86C918F89D1377F8A0E1, + 284D8B7D3CDE3742B3468855, + AE270975F90CC92C27F80B05, 89223664B6CB2A912E36B091, + 39914728A9B138EB9A04CF34, 8F39AD3F7938EFE82D06E89F, + 32E4965D513877EDAC11E9E4, BA608CEFC85F7AB9E30E0EB3, + 8EB38EF63AACA70DFEC4CF94, D499273B65D901D0A101CAAA, + 14133143519D06FC6F4C88C6, 95AE939ADE096394CCD2526F, + 6DC53D380636F5A30B52BAC8, E85DA5FC9A162F129ABA7113, + B37D32878D75EDCD4400826A, 6A13D8F42A330E2C410B43E3, + 736608BBA6321E460BDBBBC8, 13F1111511DD01E843E631CA, + D4EC5BCFAB683EA0A4473AA6, 9A80E3D1D1758A31D2169497, + 715C8221533FB1B9DD03F721, F4397EAE00E0B9F96C8B6C07, + 12088E12BCA721D0832B39FD, 09673DA3B4D6EA61DEFC0C46, + 968E9B7C2E1974474E51F26E, 58D3FF3B1F462634167BDFB5, + 6DA67142BD5D41B90A19121B, 3162B66BC8118715AAA527D7, + 4300909A1BAF9464663A9CF3, 004E78BC139419671A9EA137, + 63181788D187F9A15BBE03D9, 6306AA945375749C4FE834E6, AD7D05519200FB0EE1C7617A, C2475E008FEB33B3EA7B6C7F, diff --git a/Builds/VisualStudio2012/open-ephys.vcxproj b/Builds/VisualStudio2012/open-ephys.vcxproj index 456289a78..6e274b466 100644 --- a/Builds/VisualStudio2012/open-ephys.vcxproj +++ b/Builds/VisualStudio2012/open-ephys.vcxproj @@ -279,12 +279,8 @@ <ClCompile Include="..\..\Source\Processors\AudioNode\AudioNode.cpp"/> <ClCompile Include="..\..\Source\Processors\CAR\CAR.cpp"/> <ClCompile Include="..\..\Source\Processors\Channel\Channel.cpp"/> - <ClCompile Include="..\..\Source\Processors\ChannelMappingNode\ChannelMappingEditor.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> - <ClCompile Include="..\..\Source\Processors\ChannelMappingNode\ChannelMappingNode.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> + <ClCompile Include="..\..\Source\Processors\ChannelMappingNode\ChannelMappingEditor.cpp"/> + <ClCompile Include="..\..\Source\Processors\ChannelMappingNode\ChannelMappingNode.cpp"/> <ClCompile Include="..\..\Source\Processors\DataThreads\EcubeEditor.cpp"/> <ClCompile Include="..\..\Source\Processors\DataThreads\RHD2000Editor.cpp"/> <ClCompile Include="..\..\Source\Processors\DataThreads\EcubeThread.cpp"/> @@ -327,60 +323,34 @@ <ClCompile Include="..\..\Source\Processors\FilterNode\FilterEditor.cpp"/> <ClCompile Include="..\..\Source\Processors\FilterNode\FilterNode.cpp"/> <ClCompile Include="..\..\Source\Processors\GenericProcessor\GenericProcessor.cpp"/> - <ClCompile Include="..\..\Source\Processors\LfpDisplayNode\LfpDisplayCanvas.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> - <ClCompile Include="..\..\Source\Processors\LfpDisplayNode\LfpDisplayEditor.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> - <ClCompile Include="..\..\Source\Processors\LfpDisplayNode\LfpDisplayNode.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> + <ClCompile Include="..\..\Source\Processors\LfpDisplayNode\LfpDisplayCanvas.cpp"/> + <ClCompile Include="..\..\Source\Processors\LfpDisplayNode\LfpDisplayEditor.cpp"/> + <ClCompile Include="..\..\Source\Processors\LfpDisplayNode\LfpDisplayNode.cpp"/> <ClCompile Include="..\..\Source\Processors\Merger\Merger.cpp"/> <ClCompile Include="..\..\Source\Processors\Merger\MergerEditor.cpp"/> <ClCompile Include="..\..\Source\Processors\MessageCenter\MessageCenter.cpp"/> <ClCompile Include="..\..\Source\Processors\MessageCenter\MessageCenterEditor.cpp"/> <ClCompile Include="..\..\Source\Processors\Parameter\ParameterEditor.cpp"/> <ClCompile Include="..\..\Source\Processors\Parameter\Parameter.cpp"/> - <ClCompile Include="..\..\Source\Processors\PhaseDetector\PhaseDetector.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> - <ClCompile Include="..\..\Source\Processors\PhaseDetector\PhaseDetectorEditor.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> + <ClCompile Include="..\..\Source\Processors\PhaseDetector\PhaseDetector.cpp"/> + <ClCompile Include="..\..\Source\Processors\PhaseDetector\PhaseDetectorEditor.cpp"/> <ClCompile Include="..\..\Source\Processors\ProcessorGraph\ProcessorGraph.cpp"/> <ClCompile Include="..\..\Source\Processors\PulsePalOutput\PulsePalOutput.cpp"/> <ClCompile Include="..\..\Source\Processors\PulsePalOutput\PulsePalOutputEditor.cpp"/> - <ClCompile Include="..\..\Source\Processors\RecordControl\RecordControl.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> - <ClCompile Include="..\..\Source\Processors\RecordControl\RecordControlEditor.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> + <ClCompile Include="..\..\Source\Processors\RecordControl\RecordControl.cpp"/> + <ClCompile Include="..\..\Source\Processors\RecordControl\RecordControlEditor.cpp"/> <ClCompile Include="..\..\Source\Processors\RecordNode\EngineConfigWindow.cpp"/> <ClCompile Include="..\..\Source\Processors\RecordNode\HDF5FileFormat.cpp"/> <ClCompile Include="..\..\Source\Processors\RecordNode\HDF5Recording.cpp"/> <ClCompile Include="..\..\Source\Processors\RecordNode\OriginalRecording.cpp"/> <ClCompile Include="..\..\Source\Processors\RecordNode\RecordEngine.cpp"/> <ClCompile Include="..\..\Source\Processors\RecordNode\RecordNode.cpp"/> - <ClCompile Include="..\..\Source\Processors\Editors\NetworkEventsEditor.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> - <ClCompile Include="..\..\Source\Processors\NetworkEvents\NetworkEvents.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> - <ClCompile Include="..\..\Source\Processors\PSTH\PeriStimulusTimeHistogramEditor.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> - <ClCompile Include="..\..\Source\Processors\PSTH\PeriStimulusTimeHistogramNode.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> - <ClCompile Include="..\..\Source\Processors\PSTH\tictoc.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> - <ClCompile Include="..\..\Source\Processors\PSTH\TrialCircularBuffer.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> + <ClCompile Include="..\..\Source\Processors\Editors\NetworkEventsEditor.cpp"/> + <ClCompile Include="..\..\Source\Processors\NetworkEvents\NetworkEvents.cpp"/> + <ClCompile Include="..\..\Source\Processors\PSTH\PeriStimulusTimeHistogramEditor.cpp"/> + <ClCompile Include="..\..\Source\Processors\PSTH\PeriStimulusTimeHistogramNode.cpp"/> + <ClCompile Include="..\..\Source\Processors\PSTH\tictoc.cpp"/> + <ClCompile Include="..\..\Source\Processors\PSTH\TrialCircularBuffer.cpp"/> <ClCompile Include="..\..\Source\Processors\ResamplingNode\ResamplingNode.cpp"/> <ClCompile Include="..\..\Source\Processors\ResamplingNode\ResamplingNodeEditor.cpp"/> <ClCompile Include="..\..\Source\Processors\Serial\PulsePal.cpp"/> @@ -388,35 +358,19 @@ <ClCompile Include="..\..\Source\Processors\Serial\ofSerial.cpp"/> <ClCompile Include="..\..\Source\Processors\SerialInput\SerialInput.cpp"/> <ClCompile Include="..\..\Source\Processors\SerialInput\SerialInputEditor.cpp"/> - <ClCompile Include="..\..\Source\Processors\SignalGenerator\SignalGenerator.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> - <ClCompile Include="..\..\Source\Processors\SignalGenerator\SignalGeneratorEditor.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> + <ClCompile Include="..\..\Source\Processors\SignalGenerator\SignalGenerator.cpp"/> + <ClCompile Include="..\..\Source\Processors\SignalGenerator\SignalGeneratorEditor.cpp"/> <ClCompile Include="..\..\Source\Processors\SourceNode\SourceNode.cpp"/> <ClCompile Include="..\..\Source\Processors\SourceNode\SourceNodeEditor.cpp"/> - <ClCompile Include="..\..\Source\Processors\SpikeDetector\SpikeDetector.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> - <ClCompile Include="..\..\Source\Processors\SpikeDetector\SpikeDetectorEditor.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> + <ClCompile Include="..\..\Source\Processors\SpikeDetector\SpikeDetector.cpp"/> + <ClCompile Include="..\..\Source\Processors\SpikeDetector\SpikeDetectorEditor.cpp"/> <ClCompile Include="..\..\Source\Processors\SpikeDisplayNode\SpikeDisplayCanvas.cpp"/> <ClCompile Include="..\..\Source\Processors\SpikeDisplayNode\SpikeDisplayEditor.cpp"/> <ClCompile Include="..\..\Source\Processors\SpikeDisplayNode\SpikeDisplayNode.cpp"/> - <ClCompile Include="..\..\Source\Processors\SpikeSorter\SpikeSortBoxes.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> - <ClCompile Include="..\..\Source\Processors\SpikeSorter\SpikeSorter.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> - <ClCompile Include="..\..\Source\Processors\SpikeSorter\SpikeSorterCanvas.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> - <ClCompile Include="..\..\Source\Processors\SpikeSorter\SpikeSorterEditor.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> + <ClCompile Include="..\..\Source\Processors\SpikeSorter\SpikeSortBoxes.cpp"/> + <ClCompile Include="..\..\Source\Processors\SpikeSorter\SpikeSorter.cpp"/> + <ClCompile Include="..\..\Source\Processors\SpikeSorter\SpikeSorterCanvas.cpp"/> + <ClCompile Include="..\..\Source\Processors\SpikeSorter\SpikeSorterEditor.cpp"/> <ClCompile Include="..\..\Source\Processors\Splitter\Splitter.cpp"/> <ClCompile Include="..\..\Source\Processors\Splitter\SplitterEditor.cpp"/> <ClCompile Include="..\..\Source\Processors\Visualization\Visualizer.cpp"/> diff --git a/Builds/VisualStudio2013/open-ephys.vcxproj b/Builds/VisualStudio2013/open-ephys.vcxproj index ce96b5578..ce05f1be7 100644 --- a/Builds/VisualStudio2013/open-ephys.vcxproj +++ b/Builds/VisualStudio2013/open-ephys.vcxproj @@ -283,12 +283,8 @@ <ClCompile Include="..\..\Source\Processors\AudioNode\AudioNode.cpp"/> <ClCompile Include="..\..\Source\Processors\CAR\CAR.cpp"/> <ClCompile Include="..\..\Source\Processors\Channel\Channel.cpp"/> - <ClCompile Include="..\..\Source\Processors\ChannelMappingNode\ChannelMappingEditor.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> - <ClCompile Include="..\..\Source\Processors\ChannelMappingNode\ChannelMappingNode.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> + <ClCompile Include="..\..\Source\Processors\ChannelMappingNode\ChannelMappingEditor.cpp"/> + <ClCompile Include="..\..\Source\Processors\ChannelMappingNode\ChannelMappingNode.cpp"/> <ClCompile Include="..\..\Source\Processors\DataThreads\EcubeEditor.cpp"/> <ClCompile Include="..\..\Source\Processors\DataThreads\RHD2000Editor.cpp"/> <ClCompile Include="..\..\Source\Processors\DataThreads\EcubeThread.cpp"/> @@ -331,60 +327,34 @@ <ClCompile Include="..\..\Source\Processors\FilterNode\FilterEditor.cpp"/> <ClCompile Include="..\..\Source\Processors\FilterNode\FilterNode.cpp"/> <ClCompile Include="..\..\Source\Processors\GenericProcessor\GenericProcessor.cpp"/> - <ClCompile Include="..\..\Source\Processors\LfpDisplayNode\LfpDisplayCanvas.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> - <ClCompile Include="..\..\Source\Processors\LfpDisplayNode\LfpDisplayEditor.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> - <ClCompile Include="..\..\Source\Processors\LfpDisplayNode\LfpDisplayNode.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> + <ClCompile Include="..\..\Source\Processors\LfpDisplayNode\LfpDisplayCanvas.cpp"/> + <ClCompile Include="..\..\Source\Processors\LfpDisplayNode\LfpDisplayEditor.cpp"/> + <ClCompile Include="..\..\Source\Processors\LfpDisplayNode\LfpDisplayNode.cpp"/> <ClCompile Include="..\..\Source\Processors\Merger\Merger.cpp"/> <ClCompile Include="..\..\Source\Processors\Merger\MergerEditor.cpp"/> <ClCompile Include="..\..\Source\Processors\MessageCenter\MessageCenter.cpp"/> <ClCompile Include="..\..\Source\Processors\MessageCenter\MessageCenterEditor.cpp"/> <ClCompile Include="..\..\Source\Processors\Parameter\ParameterEditor.cpp"/> <ClCompile Include="..\..\Source\Processors\Parameter\Parameter.cpp"/> - <ClCompile Include="..\..\Source\Processors\PhaseDetector\PhaseDetector.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> - <ClCompile Include="..\..\Source\Processors\PhaseDetector\PhaseDetectorEditor.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> + <ClCompile Include="..\..\Source\Processors\PhaseDetector\PhaseDetector.cpp"/> + <ClCompile Include="..\..\Source\Processors\PhaseDetector\PhaseDetectorEditor.cpp"/> <ClCompile Include="..\..\Source\Processors\ProcessorGraph\ProcessorGraph.cpp"/> <ClCompile Include="..\..\Source\Processors\PulsePalOutput\PulsePalOutput.cpp"/> <ClCompile Include="..\..\Source\Processors\PulsePalOutput\PulsePalOutputEditor.cpp"/> - <ClCompile Include="..\..\Source\Processors\RecordControl\RecordControl.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> - <ClCompile Include="..\..\Source\Processors\RecordControl\RecordControlEditor.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> + <ClCompile Include="..\..\Source\Processors\RecordControl\RecordControl.cpp"/> + <ClCompile Include="..\..\Source\Processors\RecordControl\RecordControlEditor.cpp"/> <ClCompile Include="..\..\Source\Processors\RecordNode\EngineConfigWindow.cpp"/> <ClCompile Include="..\..\Source\Processors\RecordNode\HDF5FileFormat.cpp"/> <ClCompile Include="..\..\Source\Processors\RecordNode\HDF5Recording.cpp"/> <ClCompile Include="..\..\Source\Processors\RecordNode\OriginalRecording.cpp"/> <ClCompile Include="..\..\Source\Processors\RecordNode\RecordEngine.cpp"/> <ClCompile Include="..\..\Source\Processors\RecordNode\RecordNode.cpp"/> - <ClCompile Include="..\..\Source\Processors\Editors\NetworkEventsEditor.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> - <ClCompile Include="..\..\Source\Processors\NetworkEvents\NetworkEvents.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> - <ClCompile Include="..\..\Source\Processors\PSTH\PeriStimulusTimeHistogramEditor.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> - <ClCompile Include="..\..\Source\Processors\PSTH\PeriStimulusTimeHistogramNode.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> - <ClCompile Include="..\..\Source\Processors\PSTH\tictoc.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> - <ClCompile Include="..\..\Source\Processors\PSTH\TrialCircularBuffer.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> + <ClCompile Include="..\..\Source\Processors\Editors\NetworkEventsEditor.cpp"/> + <ClCompile Include="..\..\Source\Processors\NetworkEvents\NetworkEvents.cpp"/> + <ClCompile Include="..\..\Source\Processors\PSTH\PeriStimulusTimeHistogramEditor.cpp"/> + <ClCompile Include="..\..\Source\Processors\PSTH\PeriStimulusTimeHistogramNode.cpp"/> + <ClCompile Include="..\..\Source\Processors\PSTH\tictoc.cpp"/> + <ClCompile Include="..\..\Source\Processors\PSTH\TrialCircularBuffer.cpp"/> <ClCompile Include="..\..\Source\Processors\ResamplingNode\ResamplingNode.cpp"/> <ClCompile Include="..\..\Source\Processors\ResamplingNode\ResamplingNodeEditor.cpp"/> <ClCompile Include="..\..\Source\Processors\Serial\PulsePal.cpp"/> @@ -392,35 +362,19 @@ <ClCompile Include="..\..\Source\Processors\Serial\ofSerial.cpp"/> <ClCompile Include="..\..\Source\Processors\SerialInput\SerialInput.cpp"/> <ClCompile Include="..\..\Source\Processors\SerialInput\SerialInputEditor.cpp"/> - <ClCompile Include="..\..\Source\Processors\SignalGenerator\SignalGenerator.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> - <ClCompile Include="..\..\Source\Processors\SignalGenerator\SignalGeneratorEditor.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> + <ClCompile Include="..\..\Source\Processors\SignalGenerator\SignalGenerator.cpp"/> + <ClCompile Include="..\..\Source\Processors\SignalGenerator\SignalGeneratorEditor.cpp"/> <ClCompile Include="..\..\Source\Processors\SourceNode\SourceNode.cpp"/> <ClCompile Include="..\..\Source\Processors\SourceNode\SourceNodeEditor.cpp"/> - <ClCompile Include="..\..\Source\Processors\SpikeDetector\SpikeDetector.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> - <ClCompile Include="..\..\Source\Processors\SpikeDetector\SpikeDetectorEditor.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> + <ClCompile Include="..\..\Source\Processors\SpikeDetector\SpikeDetector.cpp"/> + <ClCompile Include="..\..\Source\Processors\SpikeDetector\SpikeDetectorEditor.cpp"/> <ClCompile Include="..\..\Source\Processors\SpikeDisplayNode\SpikeDisplayCanvas.cpp"/> <ClCompile Include="..\..\Source\Processors\SpikeDisplayNode\SpikeDisplayEditor.cpp"/> <ClCompile Include="..\..\Source\Processors\SpikeDisplayNode\SpikeDisplayNode.cpp"/> - <ClCompile Include="..\..\Source\Processors\SpikeSorter\SpikeSortBoxes.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> - <ClCompile Include="..\..\Source\Processors\SpikeSorter\SpikeSorter.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> - <ClCompile Include="..\..\Source\Processors\SpikeSorter\SpikeSorterCanvas.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> - <ClCompile Include="..\..\Source\Processors\SpikeSorter\SpikeSorterEditor.cpp"> - <ExcludedFromBuild>true</ExcludedFromBuild> - </ClCompile> + <ClCompile Include="..\..\Source\Processors\SpikeSorter\SpikeSortBoxes.cpp"/> + <ClCompile Include="..\..\Source\Processors\SpikeSorter\SpikeSorter.cpp"/> + <ClCompile Include="..\..\Source\Processors\SpikeSorter\SpikeSorterCanvas.cpp"/> + <ClCompile Include="..\..\Source\Processors\SpikeSorter\SpikeSorterEditor.cpp"/> <ClCompile Include="..\..\Source\Processors\Splitter\Splitter.cpp"/> <ClCompile Include="..\..\Source\Processors\Splitter\SplitterEditor.cpp"/> <ClCompile Include="..\..\Source\Processors\Visualization\Visualizer.cpp"/> diff --git a/Source/AccessClass.cpp b/Source/AccessClass.cpp index 216f9c82a..da66f8a0e 100644 --- a/Source/AccessClass.cpp +++ b/Source/AccessClass.cpp @@ -122,4 +122,4 @@ ActionBroadcaster* getBroadcaster() return bc.get(); } -} \ No newline at end of file +} diff --git a/Source/Processors/Editors/ChannelSelector.h b/Source/Processors/Editors/ChannelSelector.h old mode 100755 new mode 100644 diff --git a/Source/Processors/Editors/NetworkEventsEditor.cpp b/Source/Processors/Editors/NetworkEventsEditor.cpp index bc9f5fb6a..a017995f8 100644 --- a/Source/Processors/Editors/NetworkEventsEditor.cpp +++ b/Source/Processors/Editors/NetworkEventsEditor.cpp @@ -1,136 +1,136 @@ -/* - ------------------------------------------------------------------ - - This file is part of the Open Ephys GUI - Copyright (C) 2013 Open Ephys - - ------------------------------------------------------------------ - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. - -*/ - -#include "NetworkEventsEditor.h" -#include "../NetworkEvents/NetworkEvents.h" - -#include <stdio.h> - -NetworkEventsEditor::NetworkEventsEditor(GenericProcessor* parentNode, bool useDefaultParameterEditors=true) - : GenericEditor(parentNode, useDefaultParameterEditors) - -{ - desiredWidth = 180; - - urlLabel = new Label("Port", "Port:"); - urlLabel->setBounds(20,80,140,25); - addAndMakeVisible(urlLabel); - NetworkEvents *p= (NetworkEvents *)getProcessor(); - - restartConnection = new UtilityButton("Restart Connection",Font("Default", 15, Font::plain)); - restartConnection->setBounds(20,45,150,18); - restartConnection->addListener(this); - addAndMakeVisible(restartConnection); - - - /* - trialSimulation = new UtilityButton("Trial",Font("Default", 15, Font::plain)); - trialSimulation->setBounds(20,25,80,18); - trialSimulation->addListener(this); - addAndMakeVisible(trialSimulation); - - - startRecord = new UtilityButton("Start Record",Font("Default", 15, Font::plain)); - startRecord->setBounds(20,55,100,18); - startRecord->addListener(this); - addAndMakeVisible(startRecord); - */ - - labelPort = new Label("Port", String(p->urlport)); - labelPort->setBounds(70,85,80,18); - labelPort->setFont(Font("Default", 15, Font::plain)); - labelPort->setColour(Label::textColourId, Colours::white); - - - -// NetworkEvents *processor = (NetworkEvents*) getProcessor(); - - //if (processor->threadRunning) - labelPort->setColour(Label::backgroundColourId, Colours::grey); -// else -// labelPort->setColour(Label::backgroundColourId, Colours::red); - - - labelPort->setEditable(true); - labelPort->addListener(this); - addAndMakeVisible(labelPort); - - setEnabledState(false); - -} - - - -void NetworkEventsEditor::buttonEvent(Button* button) -{ - NetworkEvents *processor = (NetworkEvents*) getProcessor(); - if (button == restartConnection) - { - NetworkEvents *p= (NetworkEvents *)getProcessor(); - p->setNewListeningPort(p->urlport); - } - /* - if (button == trialSimulation) - { - processor->simulateSingleTrial(); - - } else if (button == startRecord) - { - if (startRecord->getLabel() == "Start Record") - { - processor->simulateStartRecord(); - startRecord->setLabel("Stop Record"); - } else if (startRecord->getLabel() == "Stop Record") - { - processor->simulateStopRecord(); - startRecord->setLabel("Start Record"); - } - } - */ - -} - -void NetworkEventsEditor::setLabelColor(juce::Colour color) -{ - labelPort->setColour(Label::backgroundColourId, color); -} - - -void NetworkEventsEditor::labelTextChanged(juce::Label *label) -{ - if (label == labelPort) - { - Value val = label->getTextValue(); - - NetworkEvents *p= (NetworkEvents *)getProcessor(); - p->setNewListeningPort(val.getValue()); - } -} - - -NetworkEventsEditor::~NetworkEventsEditor() -{ - -} - - +/* + ------------------------------------------------------------------ + + This file is part of the Open Ephys GUI + Copyright (C) 2013 Open Ephys + + ------------------------------------------------------------------ + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + +*/ + +#include "NetworkEventsEditor.h" +#include "../NetworkEvents/NetworkEvents.h" + +#include <stdio.h> + +NetworkEventsEditor::NetworkEventsEditor(GenericProcessor* parentNode, bool useDefaultParameterEditors=true) + : GenericEditor(parentNode, useDefaultParameterEditors) + +{ + desiredWidth = 180; + + urlLabel = new Label("Port", "Port:"); + urlLabel->setBounds(20,80,140,25); + addAndMakeVisible(urlLabel); + NetworkEvents *p= (NetworkEvents *)getProcessor(); + + restartConnection = new UtilityButton("Restart Connection",Font("Default", 15, Font::plain)); + restartConnection->setBounds(20,45,150,18); + restartConnection->addListener(this); + addAndMakeVisible(restartConnection); + + + /* + trialSimulation = new UtilityButton("Trial",Font("Default", 15, Font::plain)); + trialSimulation->setBounds(20,25,80,18); + trialSimulation->addListener(this); + addAndMakeVisible(trialSimulation); + + + startRecord = new UtilityButton("Start Record",Font("Default", 15, Font::plain)); + startRecord->setBounds(20,55,100,18); + startRecord->addListener(this); + addAndMakeVisible(startRecord); + */ + + labelPort = new Label("Port", String(p->urlport)); + labelPort->setBounds(70,85,80,18); + labelPort->setFont(Font("Default", 15, Font::plain)); + labelPort->setColour(Label::textColourId, Colours::white); + + + +// NetworkEvents *processor = (NetworkEvents*) getProcessor(); + + //if (processor->threadRunning) + labelPort->setColour(Label::backgroundColourId, Colours::grey); +// else +// labelPort->setColour(Label::backgroundColourId, Colours::red); + + + labelPort->setEditable(true); + labelPort->addListener(this); + addAndMakeVisible(labelPort); + + setEnabledState(false); + +} + + + +void NetworkEventsEditor::buttonEvent(Button* button) +{ + NetworkEvents *processor = (NetworkEvents*) getProcessor(); + if (button == restartConnection) + { + NetworkEvents *p= (NetworkEvents *)getProcessor(); + p->setNewListeningPort(p->urlport); + } + /* + if (button == trialSimulation) + { + processor->simulateSingleTrial(); + + } else if (button == startRecord) + { + if (startRecord->getLabel() == "Start Record") + { + processor->simulateStartRecord(); + startRecord->setLabel("Stop Record"); + } else if (startRecord->getLabel() == "Stop Record") + { + processor->simulateStopRecord(); + startRecord->setLabel("Start Record"); + } + } + */ + +} + +void NetworkEventsEditor::setLabelColor(juce::Colour color) +{ + labelPort->setColour(Label::backgroundColourId, color); +} + + +void NetworkEventsEditor::labelTextChanged(juce::Label *label) +{ + if (label == labelPort) + { + Value val = label->getTextValue(); + + NetworkEvents *p= (NetworkEvents *)getProcessor(); + p->setNewListeningPort(val.getValue()); + } +} + + +NetworkEventsEditor::~NetworkEventsEditor() +{ + +} + + diff --git a/Source/Processors/Editors/NetworkEventsEditor.h b/Source/Processors/Editors/NetworkEventsEditor.h index cf69b266b..a27e3414c 100644 --- a/Source/Processors/Editors/NetworkEventsEditor.h +++ b/Source/Processors/Editors/NetworkEventsEditor.h @@ -1,64 +1,64 @@ -/* - ------------------------------------------------------------------ - - This file is part of the Open Ephys GUI - Copyright (C) 2013 Open Ephys - - ------------------------------------------------------------------ - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. - -*/ - - -#ifndef __NETWORKEVENTSEDITOR_H_D6EC8B49__ -#define __NETWORKEVENTSEDITOR_H_D6EC8B49__ - -#include "../../../JuceLibraryCode/JuceHeader.h" -#include "GenericEditor.h" - -class NetworkEvents; - - -/** - - User interface for the "FileReader" source node. - - @see SourceNode, FileReaderThread - -*/ - -class NetworkEventsEditor : public GenericEditor,public Label::Listener -{ -public: - NetworkEventsEditor(GenericProcessor* parentNode, bool useDefaultParameterEditors); - virtual ~NetworkEventsEditor(); - - void buttonEvent(Button* button); - void labelTextChanged(juce::Label *); - void setLabelColor(juce::Colour color); -private: - - ScopedPointer<UtilityButton> restartConnection; - ScopedPointer<Label> urlLabel; - ScopedPointer<Label> labelPort; - - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(NetworkEventsEditor); - -}; - - - -#endif // __NETWORKEVENTSEDITOR_H_D6EC8B49__ +/* + ------------------------------------------------------------------ + + This file is part of the Open Ephys GUI + Copyright (C) 2013 Open Ephys + + ------------------------------------------------------------------ + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + +*/ + + +#ifndef __NETWORKEVENTSEDITOR_H_D6EC8B49__ +#define __NETWORKEVENTSEDITOR_H_D6EC8B49__ + +#include "../../../JuceLibraryCode/JuceHeader.h" +#include "GenericEditor.h" + +class NetworkEvents; + + +/** + + User interface for the "FileReader" source node. + + @see SourceNode, FileReaderThread + +*/ + +class NetworkEventsEditor : public GenericEditor,public Label::Listener +{ +public: + NetworkEventsEditor(GenericProcessor* parentNode, bool useDefaultParameterEditors); + virtual ~NetworkEventsEditor(); + + void buttonEvent(Button* button); + void labelTextChanged(juce::Label *); + void setLabelColor(juce::Colour color); +private: + + ScopedPointer<UtilityButton> restartConnection; + ScopedPointer<Label> urlLabel; + ScopedPointer<Label> labelPort; + + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(NetworkEventsEditor); + +}; + + + +#endif // __NETWORKEVENTSEDITOR_H_D6EC8B49__ diff --git a/Source/Processors/PSTH/PeriStimulusTimeHistogramEditor.cpp b/Source/Processors/PSTH/PeriStimulusTimeHistogramEditor.cpp index 5700a9d1d..753ec8e0e 100644 --- a/Source/Processors/PSTH/PeriStimulusTimeHistogramEditor.cpp +++ b/Source/Processors/PSTH/PeriStimulusTimeHistogramEditor.cpp @@ -1,1391 +1,1391 @@ -/* ------------------------------------------------------------------- - -This file is part of the Open Ephys GUI -Copyright (C) 2015 Open Ephys - ------------------------------------------------------------------- - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see <http://www.gnu.org/licenses/>. - -*/ - -#include "PeriStimulusTimeHistogramEditor.h" -#include "../../UI/EditorViewport.h" -#include "../PSTH/TrialCircularBuffer.h" -#include "../PSTH/tictoc.h" -#include <stdio.h> - - -#ifndef max -#define max( a, b ) ( ((a) > (b)) ? (a) : (b) ) -#endif - - -#ifndef min -#define min( a, b ) ( ((a) < (b)) ? (a) : (b) ) -#endif - -//FileSearchPathListComponent::paintListBoxItem -PeriStimulusTimeHistogramEditor::PeriStimulusTimeHistogramEditor(GenericProcessor* parentNode, bool useDefaultParameterEditors=true) - : VisualizerEditor(parentNode, useDefaultParameterEditors) ,periStimulusTimeHistogramCanvas(nullptr) -{ - showSortedUnits = true; - showLFP = true; - showCompactView = false; - showSmooth = true; - showRasters = false; - showAutoRescale = true; - showMatchRange = false; - TTLchannelTrialAlignment = -1; - smoothingMS = 10; - - - tabText = "PSTH"; - desiredWidth = 300; - - - saveOptions = new UtilityButton("Save Options",Font("Default", 15, Font::plain)); - saveOptions->addListener(this); - saveOptions->setColour(Label::textColourId, Colours::white); - saveOptions->setBounds(180,30,100,20); - addAndMakeVisible(saveOptions); - - - clearDisplay = new UtilityButton("Clear all",Font("Default", 15, Font::plain)); - clearDisplay->addListener(this); - clearDisplay->setColour(Label::textColourId, Colours::white); - clearDisplay->setBounds(180,60,90,20); - addAndMakeVisible(clearDisplay); - - - visualizationOptions = new UtilityButton("Visualization Options",Font("Default", 15, Font::plain)); - visualizationOptions->addListener(this); - visualizationOptions->setColour(Label::textColourId, Colours::white); - visualizationOptions->setBounds(10,30,160,20); - addAndMakeVisible(visualizationOptions); - - hardwareTrigger = new Label("hardwareTrigger","TTL Trial Alignment:"); - hardwareTrigger->setFont(Font("Default", 14, Font::plain)); - hardwareTrigger->setEditable(false); - hardwareTrigger->setJustificationType(Justification::centredLeft); - hardwareTrigger->setBounds(10,90,120,20); - addAndMakeVisible(hardwareTrigger); - - hardwareTrialAlignment = new ComboBox("Hardware Trial Alignment"); - hardwareTrialAlignment->setEditableText(false); - hardwareTrialAlignment->setJustificationType(Justification::centredLeft); - hardwareTrialAlignment->addListener(this); - hardwareTrialAlignment->setBounds(130,90,70,20); - hardwareTrialAlignment->addItem("Not set",1); - for (int k=0; k<8; k++) - { - hardwareTrialAlignment->addItem("TTL "+String(k+1),k+2); - } - if (TTLchannelTrialAlignment == -1) - hardwareTrialAlignment->setSelectedId(1, sendNotification); - else - hardwareTrialAlignment->setSelectedId(TTLchannelTrialAlignment+2, sendNotification); - - addAndMakeVisible(hardwareTrialAlignment); - - -} - - - -void PeriStimulusTimeHistogramEditor::saveVisualizerParameters(XmlElement* xml) -{ - - XmlElement* xmlNode = xml->createNewChildElement("PSTH_EDITOR"); - xmlNode->setAttribute("showSortedUnits",showSortedUnits); - - xmlNode->setAttribute("showLFP",showLFP); - xmlNode->setAttribute("showCompactView",showCompactView); - xmlNode->setAttribute("showSmooth",showSmooth); - xmlNode->setAttribute("showAutoRescale",showAutoRescale); - xmlNode->setAttribute("showRasters",showRasters); - xmlNode->setAttribute("showMatchRange",showMatchRange); - xmlNode->setAttribute("TTLchannelTrialAlignment",TTLchannelTrialAlignment); - xmlNode->setAttribute("smoothingMS",smoothingMS); -} - -void PeriStimulusTimeHistogramEditor::loadVisualizerParameters(XmlElement* xml) -{ - forEachXmlChildElement(*xml, xmlNode) - { - if (xmlNode->hasTagName("PSTH_EDITOR")) - { - - showLFP = xmlNode->getBoolAttribute("showLFP"); - showCompactView = xmlNode->getBoolAttribute("showCompactView"); - showSmooth = xmlNode->getBoolAttribute("showSmooth"); - showAutoRescale = xmlNode->getBoolAttribute("showAutoRescale"); - showRasters= xmlNode->getBoolAttribute("showRasters",false); - showMatchRange = xmlNode->getBoolAttribute("showMatchRange"); - TTLchannelTrialAlignment = xmlNode->getIntAttribute("TTLchannelTrialAlignment"); - smoothingMS = xmlNode->getIntAttribute("smoothingMS"); - - if (periStimulusTimeHistogramCanvas != nullptr) - { - periStimulusTimeHistogramCanvas->setLFPvisibility(showLFP); - periStimulusTimeHistogramCanvas->setSpikesVisibility(showSortedUnits); - periStimulusTimeHistogramCanvas->setCompactView(showCompactView); - periStimulusTimeHistogramCanvas->setAutoRescale(showAutoRescale); - periStimulusTimeHistogramCanvas->setMatchRange(showMatchRange); - periStimulusTimeHistogramCanvas->setSmoothing(smoothingMS,true); - periStimulusTimeHistogramCanvas->setRasterMode(showRasters); - } - } - } -} - - -void PeriStimulusTimeHistogramEditor::comboBoxChanged(ComboBox* comboBox) -{ - - if (comboBox == hardwareTrialAlignment) - { - std::cout << "Setting hardware trigger alignment channel to " << comboBox->getSelectedId()-2 << std::endl; - PeriStimulusTimeHistogramNode* processor = (PeriStimulusTimeHistogramNode*) getProcessor(); - processor->setHardwareTriggerAlignmentChannel(comboBox->getSelectedId()-2); - } -} - -void PeriStimulusTimeHistogramEditor::visualizationMenu() -{ - PeriStimulusTimeHistogramNode* processor = (PeriStimulusTimeHistogramNode*) getProcessor(); - - PopupMenu m; - m.addItem(1,"Sorted Units",true, showSortedUnits); - m.addItem(2,"LFP",true, showLFP); - m.addItem(3,"Compact View",true, showCompactView); - - PopupMenu smoothingSubMenu; - int SmoothingFactors[8] = {0,1,2,5,10,20,50,100}; - for (int k=0; k<8; k++) - { - String s; - if (SmoothingFactors[k] == 0) - s = "No Smoothing"; - else - s = String(SmoothingFactors[k]) + " ms"; - - smoothingSubMenu.addItem(40+k,s,true, smoothingMS == SmoothingFactors[k]); - } - - PopupMenu rangeTimeMenu,preRangeTimeMenu,postRangeTimeMenu; - double rangeTimes[4] = {0.5,1,1.5,2}; - TrialCircularBufferParams params = processor->trialCircularBuffer->getParams(); - - for (int k=0; k<4; k++) - { - String s = String(rangeTimes[k],1) + " sec"; - if (processor->trialCircularBuffer == nullptr) - { - preRangeTimeMenu.addItem(50+k,s,true, false); - postRangeTimeMenu.addItem(60+k,s,true, false); - } - else - { - preRangeTimeMenu.addItem(50+k,s,true, fabs(params.preSec - rangeTimes[k])<0.01); - postRangeTimeMenu.addItem(60+k,s,true, fabs(params.postSec - rangeTimes[k])<0.01); - } - } - rangeTimeMenu.addSubMenu("pre trial", preRangeTimeMenu,true); - rangeTimeMenu.addSubMenu("post trial", postRangeTimeMenu,true); - - m.addSubMenu("Smooth Curves", smoothingSubMenu); - m.addItem(7,"Raster mode",true, showRasters); - - m.addSubMenu("Range", rangeTimeMenu,true); - m.addItem(5,"Auto Rescale",true, showAutoRescale); - m.addItem(6,"Match range",true, showMatchRange); - m.addItem(8,"Bar Graph",false, false); - m.addItem(9,"2D Heat map",false, false); - const int result = m.show(); - switch (result) - { - case 1: - showSortedUnits=!showSortedUnits; - periStimulusTimeHistogramCanvas->setSpikesVisibility(showSortedUnits); - break; - case 2: - showLFP=!showLFP; - periStimulusTimeHistogramCanvas->setLFPvisibility(showLFP); - break; - case 3: - showCompactView=!showCompactView; - periStimulusTimeHistogramCanvas->setCompactView(showCompactView); - break; - case 5: - showAutoRescale=!showAutoRescale; - periStimulusTimeHistogramCanvas->setAutoRescale(showAutoRescale); - break; - case 6: - showMatchRange=!showMatchRange; - periStimulusTimeHistogramCanvas->setMatchRange(showMatchRange); - break; - case 7: - showRasters = !showRasters; - periStimulusTimeHistogramCanvas->setRasterMode(showRasters); - break; - } - if (result >= 40 && result <= 47) - { - smoothingMS = SmoothingFactors[result-40]; - periStimulusTimeHistogramCanvas->setSmoothing(SmoothingFactors[result-40],result-40>0); - } - else if (result >= 50 && result <= 54) - { - // this will require killing - double newPreSec = rangeTimes[result-50]; - processor->modifyTimeRange(newPreSec,params.postSec); - } - else if (result >= 60 && result <= 64) - { - double newPostSec = rangeTimes[result-60]; - processor->modifyTimeRange(params.preSec,newPostSec); - } -} - -void PeriStimulusTimeHistogramEditor::buttonEvent(Button* button) -{ - VisualizerEditor::buttonEvent(button); - if (periStimulusTimeHistogramCanvas == nullptr) - return; - - PeriStimulusTimeHistogramNode* processor = (PeriStimulusTimeHistogramNode*) getProcessor(); - - if (button == clearDisplay) - { - if (processor->trialCircularBuffer != nullptr) - { - processor->trialCircularBuffer->clearAll(); - repaint(); - } - } - else if (button == visualizationOptions) - { - visualizationMenu(); - } - else if (button == saveOptions) - { - - PopupMenu m; - - - /* m.addItem(1,"TTL",true, processor->saveTTLs); - m.addItem(2,"Network Events",true, processor->saveNetworkEvents); - m.addItem(7,"Network Events [when recording is off]",true, processor->saveNetworkEventsWhenNotRecording); - m.addItem(3,"Eye Tracking",true, processor->saveEyeTracking);*/ - - //m.addItem(4,"Sorted Spikes: TS only ",true, processor->spikeSavingMode == 1); - m.addItem(5,"Sorted Spikes: TS+waveform",true, processor->spikeSavingMode == 2); - m.addItem(6,"All Spikes: TS+waveform",true, processor->spikeSavingMode == 3); - - const int result = m.show(); - - if (result == 1) - { - processor->saveTTLs = !processor->saveTTLs; - } - else if (result == 2) - { - processor->saveNetworkEvents = !processor->saveNetworkEvents; - } - else if (result == 3) - { - processor->saveEyeTracking = !processor->saveEyeTracking; - } - else if (result == 4) - { - if (processor->spikeSavingMode == 1) - processor->spikeSavingMode = 0; - else - processor->spikeSavingMode = 1; - } - else if (result == 5) - { - if (processor->spikeSavingMode == 2) - processor->spikeSavingMode = 0; - else - processor->spikeSavingMode = 2; - } - else if (result == 6) - { - if (processor->spikeSavingMode == 3) - processor->spikeSavingMode = 0; - else - processor->spikeSavingMode = 3; - } - else if (result == 7) - { - processor->saveNetworkEventsWhenNotRecording = !processor->saveNetworkEventsWhenNotRecording; - } - - } /*else if (button == visibleConditions) - { - - - if ( processor->trialCircularBuffer != nullptr) - { - processor->trialCircularBuffer ->lockConditions(); - PopupMenu m; - - for (int i = 0; i < processor->trialCircularBuffer->conditions.size(); i++) - { - { - - String name = processor->trialCircularBuffer->conditions[i].name; - m.addItem(i+1, name,true,processor->trialCircularBuffer->conditions[i].visible); - } - } - - const int result = m.show(); - - if (result > 0) - { - // update the visibility for all channels and units. - PeriStimulusTimeHistogramNode* processor = (PeriStimulusTimeHistogramNode*) getProcessor(); - processor->toggleConditionVisibility(result-1); - if (periStimulusTimeHistogramCanvas != nullptr) - { - periStimulusTimeHistogramCanvas->update(); - } - - } - processor->trialCircularBuffer ->unlockConditions(); - } - - }*/ - - - -} - - -Visualizer* PeriStimulusTimeHistogramEditor::createNewCanvas() -{ - PeriStimulusTimeHistogramNode* processor = (PeriStimulusTimeHistogramNode*) getProcessor(); - periStimulusTimeHistogramCanvas = new PeriStimulusTimeHistogramCanvas(processor); - //ActionListener* listener = (ActionListener*) periStimulusTimeHistogramCanvas; - //getUIComponent()->registerAnimatedComponent(listener); - return periStimulusTimeHistogramCanvas; -} - -void PeriStimulusTimeHistogramEditor::updateCanvas() -{ - if (periStimulusTimeHistogramCanvas != nullptr) - { - periStimulusTimeHistogramCanvas->updateNeeded = true; - } -} - -PeriStimulusTimeHistogramEditor::~PeriStimulusTimeHistogramEditor() -{ - - -} - - - - - - - -/********************************/ -#ifndef MAX -#define MAX(x,y)((x)>(y))?(x):(y) -#endif - -#ifndef MIN -#define MIN(x,y)((x)<(y))?(x):(y) -#endif - - -PeriStimulusTimeHistogramCanvas::PeriStimulusTimeHistogramCanvas(PeriStimulusTimeHistogramNode* n) : - processor(n) -{ - screenWidth = screenHeight = 0; - conditionWidth = 200; - - inFocusedMode = false; - showLFP = true; - showSpikes = true; - matchRange = false; - smoothPlots = true; - autoRescale = true; - compactView = false; - rasterMode = false; - gaussianStandardDeviationMS = 10; - viewport = new Viewport(); - psthDisplay = new PeriStimulusTimeHistogramDisplay(n, viewport, this); - viewport->setViewedComponent(psthDisplay, false); - viewport->setScrollBarsShown(true, true); - addAndMakeVisible(viewport); - - - visualizationButton = new UtilityButton("Visualization Options",Font("Default", 15, Font::plain)); - visualizationButton->addListener(this); - addAndMakeVisible(visualizationButton); - - clearAllButton = new UtilityButton("Clear all",Font("Default", 15, Font::plain)); - clearAllButton->addListener(this); - addAndMakeVisible(clearAllButton); - - conditionsViewport = new Viewport(); - conditionsList = new ConditionList(n, conditionsViewport, this); - conditionsViewport->setViewedComponent(conditionsList, false); - conditionsViewport->setScrollBarsShown(true, true); - addAndMakeVisible(conditionsViewport); - - zoomButton = new UtilityButton("Zoom",Font("Default", 15, Font::plain)); - zoomButton->addListener(this); - zoomButton->setColour(Label::textColourId, Colours::white); - addAndMakeVisible(zoomButton); - panButton = new UtilityButton("Pan",Font("Default", 15, Font::plain)); - panButton->addListener(this); - panButton->setColour(Label::textColourId, Colours::white); - panButton->setToggleState(true, dontSendNotification); - - addAndMakeVisible(panButton); - resetAxesButton = new UtilityButton("Reset Axes",Font("Default", 15, Font::plain)); - resetAxesButton->addListener(this); - resetAxesButton->setColour(Label::textColourId, Colours::white); - addAndMakeVisible(resetAxesButton); - - - resized(); - update(); - -} - - -PeriStimulusTimeHistogramCanvas::~PeriStimulusTimeHistogramCanvas() -{ - -} - -void PeriStimulusTimeHistogramCanvas::beginAnimation() -{ - - std::cout << "PeriStimulusTimeHistogramCanvas starting animation." << std::endl; - startCallbacks(); - -} - -void PeriStimulusTimeHistogramCanvas::buttonClicked(Button* button) -{ - if (button == visualizationButton) - { - PeriStimulusTimeHistogramEditor* ed = (PeriStimulusTimeHistogramEditor*) processor->getEditor(); - ed->visualizationMenu(); - } - else if (button == clearAllButton) - { - processor->trialCircularBuffer->clearAll(); - } - else if (button == zoomButton) - { - zoomButton->setToggleState(true, dontSendNotification); - panButton->setToggleState(false, dontSendNotification); - for (int k=0; k<psthDisplay->psthPlots.size(); k++) - { - psthDisplay->psthPlots[k]->setMode(ZOOM); - } - } - else if (button == panButton) - { - zoomButton->setToggleState(false, dontSendNotification); - panButton->setToggleState(true, dontSendNotification); - for (int k=0; k<psthDisplay->psthPlots.size(); k++) - { - psthDisplay->psthPlots[k]->setMode(PAN); - } - } - else if (button == resetAxesButton) - { - for (int k=0; k<psthDisplay->psthPlots.size(); k++) - { - psthDisplay->psthPlots[k]->resetAxes(); - } - } -} - -void PeriStimulusTimeHistogramCanvas::endAnimation() -{ - std::cout << "PeriStimulusTimeHistogramCanvas ending animation." << std::endl; - - stopCallbacks(); -} - -void PeriStimulusTimeHistogramCanvas::setRasterMode(bool rasterModeActive) -{ - rasterMode = rasterModeActive; - update(); -} - -void PeriStimulusTimeHistogramCanvas::setLFPvisibility(bool visible) -{ - showLFP = visible; - update(); -} - -void PeriStimulusTimeHistogramCanvas::setSpikesVisibility(bool visible) -{ - showSpikes = visible; - update(); -} - -void PeriStimulusTimeHistogramCanvas::setSmoothing(float _gaussianStandardDeviationMS, bool smooth_enabled) -{ - gaussianStandardDeviationMS=_gaussianStandardDeviationMS; - for (int k=0; k< psthDisplay->psthPlots.size(); k++) - { - if (smooth_enabled) - { - psthDisplay->psthPlots[k]->buildSmoothKernel(gaussianStandardDeviationMS); - psthDisplay->psthPlots[k]->setSmoothState(true); - } - else - { - psthDisplay->psthPlots[k]->setSmoothState(false); - } - psthDisplay->psthPlots[k]->repaint(); - } - -} - -void PeriStimulusTimeHistogramCanvas::setSmoothPSTH(bool smooth) -{ - smoothPlots = smooth; - for (int k=0; k< psthDisplay->psthPlots.size(); k++) - { - psthDisplay->psthPlots[k]->setSmoothState(smoothPlots); - psthDisplay->psthPlots[k]->repaint(); - } - -} - -void PeriStimulusTimeHistogramCanvas::setCompactView(bool compact) -{ - compactView = compact; - update(); -} - -void PeriStimulusTimeHistogramCanvas::setMatchRange(bool on) -{ - matchRange = on; - //update(); -} - -bool PeriStimulusTimeHistogramCanvas::getMatchRange() -{ - return matchRange; -} - -void PeriStimulusTimeHistogramCanvas::setAutoRescale(bool state) -{ - autoRescale = state; - for (int k=0; k< psthDisplay->psthPlots.size(); k++) - { - psthDisplay->psthPlots[k]->setAutoRescale(autoRescale); - psthDisplay->psthPlots[k]->repaint(); - } -} - -void PeriStimulusTimeHistogramCanvas::setRange(double xmin, double xmax, double ymin, double ymax, xyPlotTypes plotType) -{ - - for (int k=0; k< psthDisplay->psthPlots.size(); k++) - { - if (psthDisplay->psthPlots[k]->getPlotType() == plotType) - { - psthDisplay->psthPlots[k]->setXRange(xmin,xmax); - psthDisplay->psthPlots[k]->setYRange(ymin,ymax); - } - else - { - psthDisplay->psthPlots[k]->setXRange(xmin,xmax); - } - } -} - - -void PeriStimulusTimeHistogramCanvas::refreshState() -{ - update(); - resized(); -} - - -void PeriStimulusTimeHistogramCanvas::update() -{ - //std::cout << "Updating SpikeDisplayCanvas" << std::endl; - // clear all XY plots and create new ones... - // delete all existing plots. - // lock psth - bool inPanMode = panButton->getToggleState(); - - heightPerElectrodePix = 300; - widthPerUnit = 300; - int maxUnitsPerRow = (screenWidth-conditionWidth)/ widthPerUnit; - updateNeeded = false; - for (int k = 0; k < psthDisplay->psthPlots.size(); k++) - { - delete psthDisplay->psthPlots[k]; - } - psthDisplay->psthPlots.clear(); - if (processor->trialCircularBuffer == nullptr) - return; - - const ScopedLock myScopedLock(processor->trialCircularBuffer->psthMutex); - - //processor->trialCircularBuffer->lockPSTH(); - numElectrodes = processor->trialCircularBuffer->getNumElectrodes(); - int maxUnitsPerElectrode = 0; - int row = 0; - int plotCounter = 0; - numCols = 0; - numRows = 0; - int plotID = 0; - for (int e = 0; e < numElectrodes; e++) - { - int offset = 0; - bool plottedSomething = false; - int electrodeID = processor->trialCircularBuffer->getElectrodeID(e); - String electrodeName = processor->trialCircularBuffer->getElectrodeName(e); - - if (showLFP) - { - std::vector<int> channels = processor->trialCircularBuffer->getElectrodeChannels(e); - offset = channels.size(); - for (int u=0; u<channels.size(); u++) - { - GenericPlot* newplot; - if (compactView) - { - String plotName = electrodeName+" Ch:"+String(1+u); - newplot = new GenericPlot(plotName,psthDisplay,++plotID,LFP_PLOT,processor->trialCircularBuffer, - electrodeID, - channels[u], - plotCounter,row,rasterMode,inPanMode); - - plotCounter++; - numCols++; - numCols = min(maxUnitsPerRow,numCols); - - if (plotCounter >= maxUnitsPerRow) - { - plotCounter = 0; - row++; - } - } - else - { - String plotName = electrodeName+":Ch "+String(1+u); - newplot = new GenericPlot(plotName,psthDisplay,++plotID,LFP_PLOT,processor->trialCircularBuffer, - electrodeID, - channels[u], - u,row,rasterMode,inPanMode); - numCols = max(numCols,u); - - } - newplot->setSmoothState(smoothPlots); - newplot->setAutoRescale(autoRescale); - newplot->buildSmoothKernel(gaussianStandardDeviationMS); - psthDisplay->psthPlots.push_back(newplot); - psthDisplay->addAndMakeVisible(newplot); - plottedSomething = true; - } - - } - - if (showSpikes) - { - int numUnits = processor->trialCircularBuffer->getNumUnitsInElectrode(e); - maxUnitsPerElectrode = MAX(maxUnitsPerElectrode,numUnits); - if (numUnits > 0) - { - for (int u=0; u<numUnits; u++) - { - GenericPlot* newplot; - if (compactView) - { - String plotName = electrodeName+" Unit:"+String(processor->trialCircularBuffer->getUnitID(e,u)); - newplot = new GenericPlot(plotName,psthDisplay,++plotID,SPIKE_PLOT,processor->trialCircularBuffer, - electrodeID, - processor->trialCircularBuffer->getUnitID(e,u), - plotCounter,row,rasterMode,inPanMode); - plotCounter++; - numCols++; - numCols = min(maxUnitsPerRow,numCols); - - if (plotCounter >= maxUnitsPerRow) - { - plotCounter = 0; - row++; - } - } - else - { - String plotName = electrodeName+" Unit:"+String(processor->trialCircularBuffer->getUnitID(e,u)); - newplot = new GenericPlot(plotName,psthDisplay,++plotID,SPIKE_PLOT,processor->trialCircularBuffer, - electrodeID, - processor->trialCircularBuffer->getUnitID(e,u), - offset+u,row,rasterMode,inPanMode); - numCols = max(numCols,offset+u); - } - newplot->setSmoothState(smoothPlots); - newplot->setAutoRescale(autoRescale); - newplot->buildSmoothKernel(gaussianStandardDeviationMS); - - psthDisplay->psthPlots.push_back(newplot); - psthDisplay->addAndMakeVisible(newplot); - } - plottedSomething = true; - } - } - if (!compactView && plottedSomething) - row++; - } - if (compactView) - { - numRows = row+1;//MAX(1,row); - } - else - { - numRows = row; - numCols = numCols+1; - } - - if (maxUnitsPerElectrode == 0 && !showLFP) - { - // nothing to be drawn... - //processor->trialCircularBuffer->unlockPSTH(); - return; - } - - psthDisplay->resized(); - psthDisplay->repaint(); - psthDisplay->refresh(); - resized(); - repaint(); - - //processor->trialCircularBuffer->unlockPSTH(); - conditionsList->updateConditionButtons(); -} - - -void PeriStimulusTimeHistogramCanvas::resized() -{ - screenWidth = getWidth(); - screenHeight = getHeight(); - - int scrollBarThickness = viewport->getScrollBarThickness(); - - viewport->setBounds(0,30,getWidth()-conditionWidth,getHeight()-30); - int totalHeight = numRows * heightPerElectrodePix; - int totalWidth = numCols * widthPerUnit; - psthDisplay->setBounds(0,0,totalWidth, totalHeight); - - int numConditions = 0; - if (processor->trialCircularBuffer != nullptr) - { - numConditions = processor->trialCircularBuffer->getNumConditions(); - } - - conditionsViewport->setBounds(getWidth()-conditionWidth,30,conditionWidth,getHeight()); - conditionsList->setBounds(0,0,conditionWidth, 50+20*numConditions); - - visualizationButton->setBounds(20,5,150,20); - clearAllButton->setBounds(200,5,150,20); - - zoomButton->setBounds(360,5,60,20); - panButton->setBounds(440,5,60,20); - resetAxesButton->setBounds(510,5,150,20); - -} - -void PeriStimulusTimeHistogramCanvas::paint(Graphics& g) -{ - if (updateNeeded) - update(); - g.fillAll(Colours::grey); - -} - -void PeriStimulusTimeHistogramCanvas::refresh() -{ - repaint(); - psthDisplay->refresh(); -} - -/***********************************************/ - -PeriStimulusTimeHistogramDisplay::PeriStimulusTimeHistogramDisplay(PeriStimulusTimeHistogramNode* n, Viewport* p, PeriStimulusTimeHistogramCanvas* c) : - processor(n), viewport(p), canvas(c) -{ - - font = Font("Default", 15, Font::plain); -} - -PeriStimulusTimeHistogramDisplay::~PeriStimulusTimeHistogramDisplay() -{ - for (int k = 0; k < psthPlots.size(); k++) - { - delete(psthPlots[k]); - } - psthPlots.clear(); -} - -void PeriStimulusTimeHistogramDisplay::refresh() -{ - for (int k = 0; k < psthPlots.size(); k++) - { - psthPlots[k]->repaint(); - } - -} - -void PeriStimulusTimeHistogramDisplay::paint(Graphics& g) -{ - g.setColour(Colours::white); - g.drawRect(0,0,getWidth(),getHeight()); - /* - font = Font("Default", 15, Font::plain); - - g.setFont(font); - - g.drawText("Test",10,0,200,20,Justification::left,false); - */ -} - -void PeriStimulusTimeHistogramDisplay::setAutoRescale(bool state) -{ - // draw n by m grid - PeriStimulusTimeHistogramEditor* ed = (PeriStimulusTimeHistogramEditor*) processor->getEditor(); - ed->showAutoRescale = state; - - for (int k=0; k<psthPlots.size(); k++) - { - psthPlots[k]->setAutoRescale(state); - } - -} - -void PeriStimulusTimeHistogramDisplay::resized() -{ - // draw n by m grid - for (int k=0; k<psthPlots.size(); k++) - { - if (psthPlots[k]->isFullScreen()) - { - int newSize = MIN(canvas->screenWidth,canvas->screenHeight); - setBounds(0,0,newSize,newSize); - psthPlots[k]->setBounds(0,0,newSize-30,newSize-30); - - } - else - { - psthPlots[k]->setBounds(psthPlots[k]->getRow() * canvas->widthPerUnit, - psthPlots[k]->getCol() * canvas->heightPerElectrodePix, - canvas->widthPerUnit, - canvas->heightPerElectrodePix); - } - - } -} - -void PeriStimulusTimeHistogramDisplay::focusOnPlot(int plotID) -{ - int plotIndex = -1; - for (int i=0; i<psthPlots.size(); i++) - { - if (psthPlots[i]->getPlotID() == plotID) - { - plotIndex = i; - break; - } - - } - if (plotIndex == -1) - return; - if (psthPlots[plotIndex]->isFullScreen()) - { - - psthPlots[plotIndex]->toggleFullScreen(false); - psthPlots[plotIndex]->setBounds(psthPlots[plotIndex]->getRow() * canvas->widthPerUnit, - psthPlots[plotIndex]->getCol() * canvas->heightPerElectrodePix, - canvas->widthPerUnit, - canvas->heightPerElectrodePix); - // hide all other plots. - for (int k=0; k<psthPlots.size(); k++) - { - psthPlots[k]->setVisible(true); - psthPlots[k]->repaint(); - } - - } - else - { - // hide all other plots. - for (int k=0; k<psthPlots.size(); k++) - { - if (psthPlots[k]->getPlotID() != plotID) - psthPlots[k]->setVisible(false); - } - psthPlots[plotIndex]->toggleFullScreen(true); - // make sure its rectangular...? - int newSize = MIN(canvas->screenWidth,canvas->screenHeight); - setBounds(0,0,newSize,newSize); - psthPlots[plotIndex]->setBounds(0,0,newSize-30,newSize-30); - psthPlots[plotIndex]->repaint(); - } - -} - -/***********************************/ -ConditionList::ConditionList(PeriStimulusTimeHistogramNode* n, Viewport* p, PeriStimulusTimeHistogramCanvas* c) : - processor(n), viewport(p), canvas(c) -{ - - titleButton = new ColorButton("CONDITIONS LIST", Font("Default", 24, Font::plain)); - titleButton->setBounds(0,0, 200,25); - titleButton->addListener(this); - addAndMakeVisible(titleButton); - - allButton = new ColorButton("All", Font("Default", 20, Font::plain)); - allButton->setBounds(0,25,100,20); - allButton->addListener(this); - addAndMakeVisible(allButton); - - noneButton = new ColorButton("None", Font("Default", 20, Font::plain)); - noneButton->setBounds(100,25,100,20); - noneButton->addListener(this); - addAndMakeVisible(noneButton); - - updateConditionButtons(); - -} - - -void ConditionList::updateConditionButtons() -{ - if (processor->trialCircularBuffer != nullptr) - { - const ScopedLock myScopedLock(processor->trialCircularBuffer->psthMutex); - //processor->trialCircularBuffer->lockConditions(); - conditionButtons.clear(); - for (int k=0; k<processor->trialCircularBuffer->getNumConditions(); k++) - { - Condition cond = processor->trialCircularBuffer->getCondition(k); - ColorButton* conditionButton = new ColorButton(cond.name, Font("Default", 20, Font::plain)); - conditionButton->setBounds(0,50+k*20,200,20); - conditionButton->setColors(Colours::white, - juce::Colour::fromRGB(cond.colorRGB[0], - cond.colorRGB[1], - cond.colorRGB[2])); - conditionButton->setEnabledState(cond.visible); - conditionButton->setUserDefinedData(cond.conditionID); - conditionButton->setShowEnabled(true); - conditionButton->addListener(this); - addAndMakeVisible(conditionButton); - conditionButtons.add(conditionButton); - } - - //processor->trialCircularBuffer->unlockConditions(); - } -} - -ConditionList::~ConditionList() -{ - - for (int i = 0; i < conditionButtons.size(); i++) - { - removeChildComponent(conditionButtons[i]); - } -} - -void ConditionList::paint(Graphics& g) -{ - g.fillAll(juce::Colours::grey); - //g.drawText -} - -void ConditionList::buttonClicked(Button* btn) -{ - ColorButton* cbtn = (ColorButton*)btn; - // also inform trial circular buffer about visibility change. - if (btn == titleButton) - { - int x = 5; - } - else if (btn == noneButton) - { - if (processor->trialCircularBuffer != nullptr) - { - //processor->trialCircularBuffer->lockConditions(); - const ScopedLock myScopedLock(processor->trialCircularBuffer->psthMutex); - for (int k=0; k<processor->trialCircularBuffer->getNumConditions(); k++) - { - processor->trialCircularBuffer->modifyConditionVisibility(k,false); - conditionButtons[k]->setEnabledState(false); - } - //processor->trialCircularBuffer->unlockConditions(); - } - - } - else if (btn == allButton) - { - if (processor->trialCircularBuffer != nullptr) - { - const ScopedLock myScopedLock(processor->trialCircularBuffer->psthMutex); - //processor->trialCircularBuffer->lockConditions(); - for (int k=0; k<processor->trialCircularBuffer->getNumConditions(); k++) - { - processor->trialCircularBuffer->modifyConditionVisibility(k,true); - conditionButtons[k]->setEnabledState(true); - } - //processor->trialCircularBuffer->unlockConditions(); - } - - } - else - { - // probably a condition button - int conditionID = cbtn->getUserDefinedData(); - cbtn->setEnabledState(!cbtn->getEnabledState()); - processor->trialCircularBuffer->modifyConditionVisibilityusingConditionID(conditionID, cbtn->getEnabledState()); - } - - repaint(); -} - - -/*************************************************************************/ -// Generic plot replaces XYPlot class, with better class organization and code encapsulation. -// All low level plotting of curves is handled by MatlabLikePlot object (including zooming / panning / ...) -// All raster plots will be handled by another class (?) -// - -GenericPlot::GenericPlot(String name,PeriStimulusTimeHistogramDisplay* dsp, int plotID_, xyPlotTypes plotType_, - TrialCircularBuffer* tcb_, int electrodeID_, int subID_, int row_, int col_, bool rasterMode_, bool panM) : tcb(tcb_), electrodeID(electrodeID_), plotID(plotID_), - plotType(plotType_), subID(subID_), row(row_), col(col_), rasterMode(rasterMode_),display(dsp),plotName(name),inPanMode(panM) -{ - fullScreenMode = false; - mlp = new MatlabLikePlot(); - mlp->setControlButtonsVisibile(false); - TrialCircularBufferParams params = tcb->getParams(); - - if (inPanMode) - mlp->setMode(DrawComponentMode::PAN); - else - mlp->setMode(DrawComponentMode::ZOOM); - - if (rasterMode) - { - mlp->setImageMode(true); - mlp->setAutoRescale(false); - } - else - mlp->setImageMode(false); - - - addAndMakeVisible(mlp); - - mlp->setTitle(plotName); - if (plotType == SPIKE_PLOT) - { - //mlp->setTitle("Unit "+String(electrodeID)+":"+String(subID)); - mlp->setFiringRateMode(true); - mlp->setBorderColor(tcb->getUnitColor(electrodeID, subID)); - int uniqueIntervalID = tcb->getUnitUniqueInterval(electrodeID, subID); - mlp->setActivateButtonVisiblilty(true, uniqueIntervalID); - mlp->setRangeLimit(-params.preSec,params.postSec+params.maxTrialTimeSeconds,0,1e3); - } - else if (plotType == LFP_PLOT) - { - // mlp->setTitle("Ch "+String(electrodeID)+":"+String(subID)); - mlp->setBorderColor(juce::Colours::white); - mlp->setRangeLimit(-params.preSec,params.postSec+params.maxTrialTimeSeconds,-1e3,1e3); - } - - guassianStandardDeviationMS = 5; // default smoothing - buildSmoothKernel(guassianStandardDeviationMS); - - smoothPlot = plotType == SPIKE_PLOT; // don't smooth LFPs - fullScreenMode = false; -} - -xyPlotTypes GenericPlot::getPlotType() -{ - return plotType; -} - -void GenericPlot::resized() -{ - int w = getWidth(); - int h = getHeight(); - mlp->setBounds(0,0,w,h); -} - -void GenericPlot::paintSpikeRaster(Graphics& g) -{ - //tictoc.Tic(16); - int numTrialTypes = tcb->getNumTrialTypesInUnit(electrodeID, subID); - if (numTrialTypes > 0) - { - int numTrials = tcb->getNumTrialsInUnit(electrodeID, subID); - mlp->setAuxiliaryString(String(numTrials) + " trials"); - - float xmin,xmax,ymin,ymax,maxValue; - mlp->getRange(xmin,xmax,ymin,ymax); - juce::Image rasterImage = tcb->getTrialsAverageUnitResponseAsJuceImage(electrodeID, subID,guassianStandardDeviationMS,xmin,xmax,ymin, ymax, maxValue); - mlp->drawImage(rasterImage,maxValue); - } - //tictoc.Toc(17); -} - -void GenericPlot::paintSpikes(Graphics& g) -{ - //tictoc.Tic(15); - std::vector<XYline> lines = tcb->getUnitConditionCurves(electrodeID, subID); - int numTrials = tcb->getNumTrialsInUnit(electrodeID, subID); - mlp->setAuxiliaryString(String(numTrials) + " trials"); - - mlp->clearplot(); - for (int k=0; k<lines.size(); k++) - { - if (smoothPlot) - { - lines[k].smooth(smoothKernel); - } - mlp->plotxy(lines[k]); - } - //tictoc.Toc(15); -} - -void GenericPlot::paintLFPraster(Graphics& g) -{ - //tictoc.Tic(14); - int numTrialTypes = tcb->getNumTrialTypesInChannel(electrodeID, subID); - if (numTrialTypes > 0) - { - int numTrials = tcb->getNumTrialsInChannel(electrodeID, subID); - mlp->setAuxiliaryString(String(numTrials) + " trials"); - - float xmin,xmax,ymin,ymax,maxValue; - mlp->getRange(xmin,xmax,ymin,ymax); - juce::Image rasterImage = tcb->getTrialsAverageChannelResponseAsJuceImage(electrodeID, subID,guassianStandardDeviationMS,xmin,xmax,ymin, ymax, maxValue); - mlp->drawImage(rasterImage,maxValue); - } - //tictoc.Toc(14); -} - -void GenericPlot::paintLFP(Graphics& g) -{ - //tictoc.Tic(13); - std::vector<XYline> lines = tcb->getElectrodeConditionCurves(electrodeID, subID); - mlp->clearplot(); - - int numTrials = tcb->getNumTrialsInChannel(electrodeID, subID); - mlp->setAuxiliaryString(String(numTrials) + " trials"); - - for (int k=0; k<lines.size(); k++) - { - if (smoothPlot) - { - lines[k].smooth(smoothKernel); - } - mlp->plotxy(lines[k]); - } - //tictoc.Toc(13); -} - -void GenericPlot::paint(Graphics& g) -{ - //printf("Entering GenericPlot::paint\n"); - //tictoc.Tic(12); - if (mlp->eventsAvail()) - { - String lastEvent = mlp->getLastEvent(); - handleEventFromMatlabLikePlot(lastEvent); - } - - if (plotType == SPIKE_PLOT) - { - if (rasterMode) - paintSpikeRaster(g); - else - paintSpikes(g); - } - else if (plotType == LFP_PLOT) - { - if (rasterMode) - paintLFPraster(g); - else - paintLFP(g); - } - //printf("Exitting GenericPlot::paint\n"); - //tictoc.Toc(12); -} - - -void GenericPlot::setSmoothState(bool state) -{ - smoothPlot = state; -} - -void GenericPlot::setAutoRescale(bool state) -{ - autoRescale = state; - mlp->setAutoRescale(state); -} - -void GenericPlot::setXRange(double xmin, double xmax) -{ - float curr_minx,curr_miny,curr_maxx,curr_maxy; - mlp->getRange(curr_minx,curr_maxx,curr_miny,curr_maxy); - mlp->setRange(xmin,xmax,curr_miny,curr_maxy,false); -} - -void GenericPlot::setYRange(double ymin,double ymax) -{ - float curr_minx,curr_miny,curr_maxx,curr_maxy; - mlp->getRange(curr_minx,curr_maxx,curr_miny,curr_maxy); - mlp->setRange(curr_minx,curr_maxx, ymin,ymax,false); -} - - -void GenericPlot::setMode(DrawComponentMode mode) -{ - mlp->setMode(mode); -} - -void GenericPlot::resetAxes() -{ - TrialCircularBufferParams params = tcb->getParams(); - if (plotType == SPIKE_PLOT) - { - std::vector<XYline> lines = tcb->getUnitConditionCurves(electrodeID, subID); - double trial_xmin, trial_xmax; - tcb->getUnitConditionRange(electrodeID, subID, trial_xmin, trial_xmax); - - float xmin=0,xmax=0; - double ymin=0,ymax=0; - float highestY=0; - for (int k=0; k<lines.size(); k++) - { - lines[k].getYRange(xmin,xmax,ymin,ymax); - highestY = MAX(highestY, ymax); - } - mlp->setRange(trial_xmin, trial_xmax,0,highestY,false); - - } - else if (plotType == LFP_PLOT) - { - double trial_xmin, trial_xmax; - tcb->getElectrodeConditionRange(electrodeID, subID, trial_xmin, trial_xmax); - - std::vector<XYline> lines = tcb->getElectrodeConditionCurves(electrodeID, subID); - float xmin,xmax; - double ymin,ymax; - float highestY=-1e10,lowestY=1e10; - for (int k=0; k<lines.size(); k++) - { - lines[k].getYRange(xmin,xmax,ymin,ymax); - highestY = MAX(highestY, ymax); - lowestY = MIN(lowestY, ymin); - } - - mlp->setRange(trial_xmin, trial_xmax,lowestY,highestY,false); - } -} - -void GenericPlot::buildSmoothKernel(float gaussianStandardDeviationMS_) -{ - guassianStandardDeviationMS = gaussianStandardDeviationMS_; - // assume each bin correponds to one millisecond. - // build the gaussian kernel - int numKernelBins = 2*(int)(guassianStandardDeviationMS*3.5)+1; // +- 3.5 standard deviations. - int zeroIndex = (numKernelBins-1)/2; - smoothKernel.resize(numKernelBins); - float sumZ = 0; - for (int k=0; k<numKernelBins; k++) - { - float z = float(k-zeroIndex); - smoothKernel[k] = exp(- (z*z)/(2*guassianStandardDeviationMS*guassianStandardDeviationMS)); - sumZ+=smoothKernel[k]; - } - // normalize kernel - for (int k=0; k<numKernelBins; k++) - { - smoothKernel[k] /= sumZ; - } -} - -void GenericPlot::handleEventFromMatlabLikePlot(String event) -{ - std::vector<String> command = StringTS(event).splitString(' '); - //addEvent("NewRange "+String(xmin)+" "+String(xmax)+" "+String(ymin)+" "+String(ymax)); - if (command[0] == "DblkClickRight") - { - - if (plotType == SPIKE_PLOT) - { - tcb->clearUnitStatistics(electrodeID, subID); - } - else if (plotType == LFP_PLOT) - { - tcb->clearChanneltatistics(electrodeID, subID); - } - - } - else if (command[0] == "DblkClickLeft") - { - // full screen toggle - display->focusOnPlot(plotID); - } - else if (command[0] == "StartInterval") - { - - - int uniqueIntervalID = tcb->setUnitUniqueInterval(electrodeID, subID,true); - mlp->setActivateButtonVisiblilty(true, uniqueIntervalID); - // post this as a network message as well - StringTS s("UnitIntervalStart "+String(electrodeID)+" "+String(subID)+" "+String(uniqueIntervalID)); - display->processor->handleNetworkMessage(s); - } - else if (command[0] == "StopInterval") - { - int uniqueIntervalID = tcb->setUnitUniqueInterval(electrodeID, subID,false); - mlp->setActivateButtonVisiblilty(true, -1); - // post this as a network message as well - StringTS s("UnitIntervalStop "+String(electrodeID)+" "+String(subID) + " "+String(uniqueIntervalID)); - display->processor->handleNetworkMessage(s); - } - else if (command[0] == "NewRange") - { - if (display->canvas->getMatchRange()) - { - double xmin = command[1].getDoubleValue(); - double xmax = command[2].getDoubleValue(); - double ymin = command[3].getDoubleValue(); - double ymax = command[4].getDoubleValue(); - display->canvas->setRange(xmin,xmax,ymin,ymax,plotType); - } - } -} +/* +------------------------------------------------------------------ + +This file is part of the Open Ephys GUI +Copyright (C) 2015 Open Ephys + +------------------------------------------------------------------ + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see <http://www.gnu.org/licenses/>. + +*/ + +#include "PeriStimulusTimeHistogramEditor.h" +#include "../../UI/EditorViewport.h" +#include "../PSTH/TrialCircularBuffer.h" +#include "../PSTH/tictoc.h" +#include <stdio.h> + + +#ifndef max +#define max( a, b ) ( ((a) > (b)) ? (a) : (b) ) +#endif + + +#ifndef min +#define min( a, b ) ( ((a) < (b)) ? (a) : (b) ) +#endif + +//FileSearchPathListComponent::paintListBoxItem +PeriStimulusTimeHistogramEditor::PeriStimulusTimeHistogramEditor(GenericProcessor* parentNode, bool useDefaultParameterEditors=true) + : VisualizerEditor(parentNode, useDefaultParameterEditors) ,periStimulusTimeHistogramCanvas(nullptr) +{ + showSortedUnits = true; + showLFP = true; + showCompactView = false; + showSmooth = true; + showRasters = false; + showAutoRescale = true; + showMatchRange = false; + TTLchannelTrialAlignment = -1; + smoothingMS = 10; + + + tabText = "PSTH"; + desiredWidth = 300; + + + saveOptions = new UtilityButton("Save Options",Font("Default", 15, Font::plain)); + saveOptions->addListener(this); + saveOptions->setColour(Label::textColourId, Colours::white); + saveOptions->setBounds(180,30,100,20); + addAndMakeVisible(saveOptions); + + + clearDisplay = new UtilityButton("Clear all",Font("Default", 15, Font::plain)); + clearDisplay->addListener(this); + clearDisplay->setColour(Label::textColourId, Colours::white); + clearDisplay->setBounds(180,60,90,20); + addAndMakeVisible(clearDisplay); + + + visualizationOptions = new UtilityButton("Visualization Options",Font("Default", 15, Font::plain)); + visualizationOptions->addListener(this); + visualizationOptions->setColour(Label::textColourId, Colours::white); + visualizationOptions->setBounds(10,30,160,20); + addAndMakeVisible(visualizationOptions); + + hardwareTrigger = new Label("hardwareTrigger","TTL Trial Alignment:"); + hardwareTrigger->setFont(Font("Default", 14, Font::plain)); + hardwareTrigger->setEditable(false); + hardwareTrigger->setJustificationType(Justification::centredLeft); + hardwareTrigger->setBounds(10,90,120,20); + addAndMakeVisible(hardwareTrigger); + + hardwareTrialAlignment = new ComboBox("Hardware Trial Alignment"); + hardwareTrialAlignment->setEditableText(false); + hardwareTrialAlignment->setJustificationType(Justification::centredLeft); + hardwareTrialAlignment->addListener(this); + hardwareTrialAlignment->setBounds(130,90,70,20); + hardwareTrialAlignment->addItem("Not set",1); + for (int k=0; k<8; k++) + { + hardwareTrialAlignment->addItem("TTL "+String(k+1),k+2); + } + if (TTLchannelTrialAlignment == -1) + hardwareTrialAlignment->setSelectedId(1, sendNotification); + else + hardwareTrialAlignment->setSelectedId(TTLchannelTrialAlignment+2, sendNotification); + + addAndMakeVisible(hardwareTrialAlignment); + + +} + + + +void PeriStimulusTimeHistogramEditor::saveVisualizerParameters(XmlElement* xml) +{ + + XmlElement* xmlNode = xml->createNewChildElement("PSTH_EDITOR"); + xmlNode->setAttribute("showSortedUnits",showSortedUnits); + + xmlNode->setAttribute("showLFP",showLFP); + xmlNode->setAttribute("showCompactView",showCompactView); + xmlNode->setAttribute("showSmooth",showSmooth); + xmlNode->setAttribute("showAutoRescale",showAutoRescale); + xmlNode->setAttribute("showRasters",showRasters); + xmlNode->setAttribute("showMatchRange",showMatchRange); + xmlNode->setAttribute("TTLchannelTrialAlignment",TTLchannelTrialAlignment); + xmlNode->setAttribute("smoothingMS",smoothingMS); +} + +void PeriStimulusTimeHistogramEditor::loadVisualizerParameters(XmlElement* xml) +{ + forEachXmlChildElement(*xml, xmlNode) + { + if (xmlNode->hasTagName("PSTH_EDITOR")) + { + + showLFP = xmlNode->getBoolAttribute("showLFP"); + showCompactView = xmlNode->getBoolAttribute("showCompactView"); + showSmooth = xmlNode->getBoolAttribute("showSmooth"); + showAutoRescale = xmlNode->getBoolAttribute("showAutoRescale"); + showRasters= xmlNode->getBoolAttribute("showRasters",false); + showMatchRange = xmlNode->getBoolAttribute("showMatchRange"); + TTLchannelTrialAlignment = xmlNode->getIntAttribute("TTLchannelTrialAlignment"); + smoothingMS = xmlNode->getIntAttribute("smoothingMS"); + + if (periStimulusTimeHistogramCanvas != nullptr) + { + periStimulusTimeHistogramCanvas->setLFPvisibility(showLFP); + periStimulusTimeHistogramCanvas->setSpikesVisibility(showSortedUnits); + periStimulusTimeHistogramCanvas->setCompactView(showCompactView); + periStimulusTimeHistogramCanvas->setAutoRescale(showAutoRescale); + periStimulusTimeHistogramCanvas->setMatchRange(showMatchRange); + periStimulusTimeHistogramCanvas->setSmoothing(smoothingMS,true); + periStimulusTimeHistogramCanvas->setRasterMode(showRasters); + } + } + } +} + + +void PeriStimulusTimeHistogramEditor::comboBoxChanged(ComboBox* comboBox) +{ + + if (comboBox == hardwareTrialAlignment) + { + std::cout << "Setting hardware trigger alignment channel to " << comboBox->getSelectedId()-2 << std::endl; + PeriStimulusTimeHistogramNode* processor = (PeriStimulusTimeHistogramNode*) getProcessor(); + processor->setHardwareTriggerAlignmentChannel(comboBox->getSelectedId()-2); + } +} + +void PeriStimulusTimeHistogramEditor::visualizationMenu() +{ + PeriStimulusTimeHistogramNode* processor = (PeriStimulusTimeHistogramNode*) getProcessor(); + + PopupMenu m; + m.addItem(1,"Sorted Units",true, showSortedUnits); + m.addItem(2,"LFP",true, showLFP); + m.addItem(3,"Compact View",true, showCompactView); + + PopupMenu smoothingSubMenu; + int SmoothingFactors[8] = {0,1,2,5,10,20,50,100}; + for (int k=0; k<8; k++) + { + String s; + if (SmoothingFactors[k] == 0) + s = "No Smoothing"; + else + s = String(SmoothingFactors[k]) + " ms"; + + smoothingSubMenu.addItem(40+k,s,true, smoothingMS == SmoothingFactors[k]); + } + + PopupMenu rangeTimeMenu,preRangeTimeMenu,postRangeTimeMenu; + double rangeTimes[4] = {0.5,1,1.5,2}; + TrialCircularBufferParams params = processor->trialCircularBuffer->getParams(); + + for (int k=0; k<4; k++) + { + String s = String(rangeTimes[k],1) + " sec"; + if (processor->trialCircularBuffer == nullptr) + { + preRangeTimeMenu.addItem(50+k,s,true, false); + postRangeTimeMenu.addItem(60+k,s,true, false); + } + else + { + preRangeTimeMenu.addItem(50+k,s,true, fabs(params.preSec - rangeTimes[k])<0.01); + postRangeTimeMenu.addItem(60+k,s,true, fabs(params.postSec - rangeTimes[k])<0.01); + } + } + rangeTimeMenu.addSubMenu("pre trial", preRangeTimeMenu,true); + rangeTimeMenu.addSubMenu("post trial", postRangeTimeMenu,true); + + m.addSubMenu("Smooth Curves", smoothingSubMenu); + m.addItem(7,"Raster mode",true, showRasters); + + m.addSubMenu("Range", rangeTimeMenu,true); + m.addItem(5,"Auto Rescale",true, showAutoRescale); + m.addItem(6,"Match range",true, showMatchRange); + m.addItem(8,"Bar Graph",false, false); + m.addItem(9,"2D Heat map",false, false); + const int result = m.show(); + switch (result) + { + case 1: + showSortedUnits=!showSortedUnits; + periStimulusTimeHistogramCanvas->setSpikesVisibility(showSortedUnits); + break; + case 2: + showLFP=!showLFP; + periStimulusTimeHistogramCanvas->setLFPvisibility(showLFP); + break; + case 3: + showCompactView=!showCompactView; + periStimulusTimeHistogramCanvas->setCompactView(showCompactView); + break; + case 5: + showAutoRescale=!showAutoRescale; + periStimulusTimeHistogramCanvas->setAutoRescale(showAutoRescale); + break; + case 6: + showMatchRange=!showMatchRange; + periStimulusTimeHistogramCanvas->setMatchRange(showMatchRange); + break; + case 7: + showRasters = !showRasters; + periStimulusTimeHistogramCanvas->setRasterMode(showRasters); + break; + } + if (result >= 40 && result <= 47) + { + smoothingMS = SmoothingFactors[result-40]; + periStimulusTimeHistogramCanvas->setSmoothing(SmoothingFactors[result-40],result-40>0); + } + else if (result >= 50 && result <= 54) + { + // this will require killing + double newPreSec = rangeTimes[result-50]; + processor->modifyTimeRange(newPreSec,params.postSec); + } + else if (result >= 60 && result <= 64) + { + double newPostSec = rangeTimes[result-60]; + processor->modifyTimeRange(params.preSec,newPostSec); + } +} + +void PeriStimulusTimeHistogramEditor::buttonEvent(Button* button) +{ + VisualizerEditor::buttonEvent(button); + if (periStimulusTimeHistogramCanvas == nullptr) + return; + + PeriStimulusTimeHistogramNode* processor = (PeriStimulusTimeHistogramNode*) getProcessor(); + + if (button == clearDisplay) + { + if (processor->trialCircularBuffer != nullptr) + { + processor->trialCircularBuffer->clearAll(); + repaint(); + } + } + else if (button == visualizationOptions) + { + visualizationMenu(); + } + else if (button == saveOptions) + { + + PopupMenu m; + + + /* m.addItem(1,"TTL",true, processor->saveTTLs); + m.addItem(2,"Network Events",true, processor->saveNetworkEvents); + m.addItem(7,"Network Events [when recording is off]",true, processor->saveNetworkEventsWhenNotRecording); + m.addItem(3,"Eye Tracking",true, processor->saveEyeTracking);*/ + + //m.addItem(4,"Sorted Spikes: TS only ",true, processor->spikeSavingMode == 1); + m.addItem(5,"Sorted Spikes: TS+waveform",true, processor->spikeSavingMode == 2); + m.addItem(6,"All Spikes: TS+waveform",true, processor->spikeSavingMode == 3); + + const int result = m.show(); + + if (result == 1) + { + processor->saveTTLs = !processor->saveTTLs; + } + else if (result == 2) + { + processor->saveNetworkEvents = !processor->saveNetworkEvents; + } + else if (result == 3) + { + processor->saveEyeTracking = !processor->saveEyeTracking; + } + else if (result == 4) + { + if (processor->spikeSavingMode == 1) + processor->spikeSavingMode = 0; + else + processor->spikeSavingMode = 1; + } + else if (result == 5) + { + if (processor->spikeSavingMode == 2) + processor->spikeSavingMode = 0; + else + processor->spikeSavingMode = 2; + } + else if (result == 6) + { + if (processor->spikeSavingMode == 3) + processor->spikeSavingMode = 0; + else + processor->spikeSavingMode = 3; + } + else if (result == 7) + { + processor->saveNetworkEventsWhenNotRecording = !processor->saveNetworkEventsWhenNotRecording; + } + + } /*else if (button == visibleConditions) + { + + + if ( processor->trialCircularBuffer != nullptr) + { + processor->trialCircularBuffer ->lockConditions(); + PopupMenu m; + + for (int i = 0; i < processor->trialCircularBuffer->conditions.size(); i++) + { + { + + String name = processor->trialCircularBuffer->conditions[i].name; + m.addItem(i+1, name,true,processor->trialCircularBuffer->conditions[i].visible); + } + } + + const int result = m.show(); + + if (result > 0) + { + // update the visibility for all channels and units. + PeriStimulusTimeHistogramNode* processor = (PeriStimulusTimeHistogramNode*) getProcessor(); + processor->toggleConditionVisibility(result-1); + if (periStimulusTimeHistogramCanvas != nullptr) + { + periStimulusTimeHistogramCanvas->update(); + } + + } + processor->trialCircularBuffer ->unlockConditions(); + } + + }*/ + + + +} + + +Visualizer* PeriStimulusTimeHistogramEditor::createNewCanvas() +{ + PeriStimulusTimeHistogramNode* processor = (PeriStimulusTimeHistogramNode*) getProcessor(); + periStimulusTimeHistogramCanvas = new PeriStimulusTimeHistogramCanvas(processor); + //ActionListener* listener = (ActionListener*) periStimulusTimeHistogramCanvas; + //getUIComponent()->registerAnimatedComponent(listener); + return periStimulusTimeHistogramCanvas; +} + +void PeriStimulusTimeHistogramEditor::updateCanvas() +{ + if (periStimulusTimeHistogramCanvas != nullptr) + { + periStimulusTimeHistogramCanvas->updateNeeded = true; + } +} + +PeriStimulusTimeHistogramEditor::~PeriStimulusTimeHistogramEditor() +{ + + +} + + + + + + + +/********************************/ +#ifndef MAX +#define MAX(x,y)((x)>(y))?(x):(y) +#endif + +#ifndef MIN +#define MIN(x,y)((x)<(y))?(x):(y) +#endif + + +PeriStimulusTimeHistogramCanvas::PeriStimulusTimeHistogramCanvas(PeriStimulusTimeHistogramNode* n) : + processor(n) +{ + screenWidth = screenHeight = 0; + conditionWidth = 200; + + inFocusedMode = false; + showLFP = true; + showSpikes = true; + matchRange = false; + smoothPlots = true; + autoRescale = true; + compactView = false; + rasterMode = false; + gaussianStandardDeviationMS = 10; + viewport = new Viewport(); + psthDisplay = new PeriStimulusTimeHistogramDisplay(n, viewport, this); + viewport->setViewedComponent(psthDisplay, false); + viewport->setScrollBarsShown(true, true); + addAndMakeVisible(viewport); + + + visualizationButton = new UtilityButton("Visualization Options",Font("Default", 15, Font::plain)); + visualizationButton->addListener(this); + addAndMakeVisible(visualizationButton); + + clearAllButton = new UtilityButton("Clear all",Font("Default", 15, Font::plain)); + clearAllButton->addListener(this); + addAndMakeVisible(clearAllButton); + + conditionsViewport = new Viewport(); + conditionsList = new ConditionList(n, conditionsViewport, this); + conditionsViewport->setViewedComponent(conditionsList, false); + conditionsViewport->setScrollBarsShown(true, true); + addAndMakeVisible(conditionsViewport); + + zoomButton = new UtilityButton("Zoom",Font("Default", 15, Font::plain)); + zoomButton->addListener(this); + zoomButton->setColour(Label::textColourId, Colours::white); + addAndMakeVisible(zoomButton); + panButton = new UtilityButton("Pan",Font("Default", 15, Font::plain)); + panButton->addListener(this); + panButton->setColour(Label::textColourId, Colours::white); + panButton->setToggleState(true, dontSendNotification); + + addAndMakeVisible(panButton); + resetAxesButton = new UtilityButton("Reset Axes",Font("Default", 15, Font::plain)); + resetAxesButton->addListener(this); + resetAxesButton->setColour(Label::textColourId, Colours::white); + addAndMakeVisible(resetAxesButton); + + + resized(); + update(); + +} + + +PeriStimulusTimeHistogramCanvas::~PeriStimulusTimeHistogramCanvas() +{ + +} + +void PeriStimulusTimeHistogramCanvas::beginAnimation() +{ + + std::cout << "PeriStimulusTimeHistogramCanvas starting animation." << std::endl; + startCallbacks(); + +} + +void PeriStimulusTimeHistogramCanvas::buttonClicked(Button* button) +{ + if (button == visualizationButton) + { + PeriStimulusTimeHistogramEditor* ed = (PeriStimulusTimeHistogramEditor*) processor->getEditor(); + ed->visualizationMenu(); + } + else if (button == clearAllButton) + { + processor->trialCircularBuffer->clearAll(); + } + else if (button == zoomButton) + { + zoomButton->setToggleState(true, dontSendNotification); + panButton->setToggleState(false, dontSendNotification); + for (int k=0; k<psthDisplay->psthPlots.size(); k++) + { + psthDisplay->psthPlots[k]->setMode(ZOOM); + } + } + else if (button == panButton) + { + zoomButton->setToggleState(false, dontSendNotification); + panButton->setToggleState(true, dontSendNotification); + for (int k=0; k<psthDisplay->psthPlots.size(); k++) + { + psthDisplay->psthPlots[k]->setMode(PAN); + } + } + else if (button == resetAxesButton) + { + for (int k=0; k<psthDisplay->psthPlots.size(); k++) + { + psthDisplay->psthPlots[k]->resetAxes(); + } + } +} + +void PeriStimulusTimeHistogramCanvas::endAnimation() +{ + std::cout << "PeriStimulusTimeHistogramCanvas ending animation." << std::endl; + + stopCallbacks(); +} + +void PeriStimulusTimeHistogramCanvas::setRasterMode(bool rasterModeActive) +{ + rasterMode = rasterModeActive; + update(); +} + +void PeriStimulusTimeHistogramCanvas::setLFPvisibility(bool visible) +{ + showLFP = visible; + update(); +} + +void PeriStimulusTimeHistogramCanvas::setSpikesVisibility(bool visible) +{ + showSpikes = visible; + update(); +} + +void PeriStimulusTimeHistogramCanvas::setSmoothing(float _gaussianStandardDeviationMS, bool smooth_enabled) +{ + gaussianStandardDeviationMS=_gaussianStandardDeviationMS; + for (int k=0; k< psthDisplay->psthPlots.size(); k++) + { + if (smooth_enabled) + { + psthDisplay->psthPlots[k]->buildSmoothKernel(gaussianStandardDeviationMS); + psthDisplay->psthPlots[k]->setSmoothState(true); + } + else + { + psthDisplay->psthPlots[k]->setSmoothState(false); + } + psthDisplay->psthPlots[k]->repaint(); + } + +} + +void PeriStimulusTimeHistogramCanvas::setSmoothPSTH(bool smooth) +{ + smoothPlots = smooth; + for (int k=0; k< psthDisplay->psthPlots.size(); k++) + { + psthDisplay->psthPlots[k]->setSmoothState(smoothPlots); + psthDisplay->psthPlots[k]->repaint(); + } + +} + +void PeriStimulusTimeHistogramCanvas::setCompactView(bool compact) +{ + compactView = compact; + update(); +} + +void PeriStimulusTimeHistogramCanvas::setMatchRange(bool on) +{ + matchRange = on; + //update(); +} + +bool PeriStimulusTimeHistogramCanvas::getMatchRange() +{ + return matchRange; +} + +void PeriStimulusTimeHistogramCanvas::setAutoRescale(bool state) +{ + autoRescale = state; + for (int k=0; k< psthDisplay->psthPlots.size(); k++) + { + psthDisplay->psthPlots[k]->setAutoRescale(autoRescale); + psthDisplay->psthPlots[k]->repaint(); + } +} + +void PeriStimulusTimeHistogramCanvas::setRange(double xmin, double xmax, double ymin, double ymax, xyPlotTypes plotType) +{ + + for (int k=0; k< psthDisplay->psthPlots.size(); k++) + { + if (psthDisplay->psthPlots[k]->getPlotType() == plotType) + { + psthDisplay->psthPlots[k]->setXRange(xmin,xmax); + psthDisplay->psthPlots[k]->setYRange(ymin,ymax); + } + else + { + psthDisplay->psthPlots[k]->setXRange(xmin,xmax); + } + } +} + + +void PeriStimulusTimeHistogramCanvas::refreshState() +{ + update(); + resized(); +} + + +void PeriStimulusTimeHistogramCanvas::update() +{ + //std::cout << "Updating SpikeDisplayCanvas" << std::endl; + // clear all XY plots and create new ones... + // delete all existing plots. + // lock psth + bool inPanMode = panButton->getToggleState(); + + heightPerElectrodePix = 300; + widthPerUnit = 300; + int maxUnitsPerRow = (screenWidth-conditionWidth)/ widthPerUnit; + updateNeeded = false; + for (int k = 0; k < psthDisplay->psthPlots.size(); k++) + { + delete psthDisplay->psthPlots[k]; + } + psthDisplay->psthPlots.clear(); + if (processor->trialCircularBuffer == nullptr) + return; + + const ScopedLock myScopedLock(processor->trialCircularBuffer->psthMutex); + + //processor->trialCircularBuffer->lockPSTH(); + numElectrodes = processor->trialCircularBuffer->getNumElectrodes(); + int maxUnitsPerElectrode = 0; + int row = 0; + int plotCounter = 0; + numCols = 0; + numRows = 0; + int plotID = 0; + for (int e = 0; e < numElectrodes; e++) + { + int offset = 0; + bool plottedSomething = false; + int electrodeID = processor->trialCircularBuffer->getElectrodeID(e); + String electrodeName = processor->trialCircularBuffer->getElectrodeName(e); + + if (showLFP) + { + std::vector<int> channels = processor->trialCircularBuffer->getElectrodeChannels(e); + offset = channels.size(); + for (int u=0; u<channels.size(); u++) + { + GenericPlot* newplot; + if (compactView) + { + String plotName = electrodeName+" Ch:"+String(1+u); + newplot = new GenericPlot(plotName,psthDisplay,++plotID,LFP_PLOT,processor->trialCircularBuffer, + electrodeID, + channels[u], + plotCounter,row,rasterMode,inPanMode); + + plotCounter++; + numCols++; + numCols = min(maxUnitsPerRow,numCols); + + if (plotCounter >= maxUnitsPerRow) + { + plotCounter = 0; + row++; + } + } + else + { + String plotName = electrodeName+":Ch "+String(1+u); + newplot = new GenericPlot(plotName,psthDisplay,++plotID,LFP_PLOT,processor->trialCircularBuffer, + electrodeID, + channels[u], + u,row,rasterMode,inPanMode); + numCols = max(numCols,u); + + } + newplot->setSmoothState(smoothPlots); + newplot->setAutoRescale(autoRescale); + newplot->buildSmoothKernel(gaussianStandardDeviationMS); + psthDisplay->psthPlots.push_back(newplot); + psthDisplay->addAndMakeVisible(newplot); + plottedSomething = true; + } + + } + + if (showSpikes) + { + int numUnits = processor->trialCircularBuffer->getNumUnitsInElectrode(e); + maxUnitsPerElectrode = MAX(maxUnitsPerElectrode,numUnits); + if (numUnits > 0) + { + for (int u=0; u<numUnits; u++) + { + GenericPlot* newplot; + if (compactView) + { + String plotName = electrodeName+" Unit:"+String(processor->trialCircularBuffer->getUnitID(e,u)); + newplot = new GenericPlot(plotName,psthDisplay,++plotID,SPIKE_PLOT,processor->trialCircularBuffer, + electrodeID, + processor->trialCircularBuffer->getUnitID(e,u), + plotCounter,row,rasterMode,inPanMode); + plotCounter++; + numCols++; + numCols = min(maxUnitsPerRow,numCols); + + if (plotCounter >= maxUnitsPerRow) + { + plotCounter = 0; + row++; + } + } + else + { + String plotName = electrodeName+" Unit:"+String(processor->trialCircularBuffer->getUnitID(e,u)); + newplot = new GenericPlot(plotName,psthDisplay,++plotID,SPIKE_PLOT,processor->trialCircularBuffer, + electrodeID, + processor->trialCircularBuffer->getUnitID(e,u), + offset+u,row,rasterMode,inPanMode); + numCols = max(numCols,offset+u); + } + newplot->setSmoothState(smoothPlots); + newplot->setAutoRescale(autoRescale); + newplot->buildSmoothKernel(gaussianStandardDeviationMS); + + psthDisplay->psthPlots.push_back(newplot); + psthDisplay->addAndMakeVisible(newplot); + } + plottedSomething = true; + } + } + if (!compactView && plottedSomething) + row++; + } + if (compactView) + { + numRows = row+1;//MAX(1,row); + } + else + { + numRows = row; + numCols = numCols+1; + } + + if (maxUnitsPerElectrode == 0 && !showLFP) + { + // nothing to be drawn... + //processor->trialCircularBuffer->unlockPSTH(); + return; + } + + psthDisplay->resized(); + psthDisplay->repaint(); + psthDisplay->refresh(); + resized(); + repaint(); + + //processor->trialCircularBuffer->unlockPSTH(); + conditionsList->updateConditionButtons(); +} + + +void PeriStimulusTimeHistogramCanvas::resized() +{ + screenWidth = getWidth(); + screenHeight = getHeight(); + + int scrollBarThickness = viewport->getScrollBarThickness(); + + viewport->setBounds(0,30,getWidth()-conditionWidth,getHeight()-30); + int totalHeight = numRows * heightPerElectrodePix; + int totalWidth = numCols * widthPerUnit; + psthDisplay->setBounds(0,0,totalWidth, totalHeight); + + int numConditions = 0; + if (processor->trialCircularBuffer != nullptr) + { + numConditions = processor->trialCircularBuffer->getNumConditions(); + } + + conditionsViewport->setBounds(getWidth()-conditionWidth,30,conditionWidth,getHeight()); + conditionsList->setBounds(0,0,conditionWidth, 50+20*numConditions); + + visualizationButton->setBounds(20,5,150,20); + clearAllButton->setBounds(200,5,150,20); + + zoomButton->setBounds(360,5,60,20); + panButton->setBounds(440,5,60,20); + resetAxesButton->setBounds(510,5,150,20); + +} + +void PeriStimulusTimeHistogramCanvas::paint(Graphics& g) +{ + if (updateNeeded) + update(); + g.fillAll(Colours::grey); + +} + +void PeriStimulusTimeHistogramCanvas::refresh() +{ + repaint(); + psthDisplay->refresh(); +} + +/***********************************************/ + +PeriStimulusTimeHistogramDisplay::PeriStimulusTimeHistogramDisplay(PeriStimulusTimeHistogramNode* n, Viewport* p, PeriStimulusTimeHistogramCanvas* c) : + processor(n), viewport(p), canvas(c) +{ + + font = Font("Default", 15, Font::plain); +} + +PeriStimulusTimeHistogramDisplay::~PeriStimulusTimeHistogramDisplay() +{ + for (int k = 0; k < psthPlots.size(); k++) + { + delete(psthPlots[k]); + } + psthPlots.clear(); +} + +void PeriStimulusTimeHistogramDisplay::refresh() +{ + for (int k = 0; k < psthPlots.size(); k++) + { + psthPlots[k]->repaint(); + } + +} + +void PeriStimulusTimeHistogramDisplay::paint(Graphics& g) +{ + g.setColour(Colours::white); + g.drawRect(0,0,getWidth(),getHeight()); + /* + font = Font("Default", 15, Font::plain); + + g.setFont(font); + + g.drawText("Test",10,0,200,20,Justification::left,false); + */ +} + +void PeriStimulusTimeHistogramDisplay::setAutoRescale(bool state) +{ + // draw n by m grid + PeriStimulusTimeHistogramEditor* ed = (PeriStimulusTimeHistogramEditor*) processor->getEditor(); + ed->showAutoRescale = state; + + for (int k=0; k<psthPlots.size(); k++) + { + psthPlots[k]->setAutoRescale(state); + } + +} + +void PeriStimulusTimeHistogramDisplay::resized() +{ + // draw n by m grid + for (int k=0; k<psthPlots.size(); k++) + { + if (psthPlots[k]->isFullScreen()) + { + int newSize = MIN(canvas->screenWidth,canvas->screenHeight); + setBounds(0,0,newSize,newSize); + psthPlots[k]->setBounds(0,0,newSize-30,newSize-30); + + } + else + { + psthPlots[k]->setBounds(psthPlots[k]->getRow() * canvas->widthPerUnit, + psthPlots[k]->getCol() * canvas->heightPerElectrodePix, + canvas->widthPerUnit, + canvas->heightPerElectrodePix); + } + + } +} + +void PeriStimulusTimeHistogramDisplay::focusOnPlot(int plotID) +{ + int plotIndex = -1; + for (int i=0; i<psthPlots.size(); i++) + { + if (psthPlots[i]->getPlotID() == plotID) + { + plotIndex = i; + break; + } + + } + if (plotIndex == -1) + return; + if (psthPlots[plotIndex]->isFullScreen()) + { + + psthPlots[plotIndex]->toggleFullScreen(false); + psthPlots[plotIndex]->setBounds(psthPlots[plotIndex]->getRow() * canvas->widthPerUnit, + psthPlots[plotIndex]->getCol() * canvas->heightPerElectrodePix, + canvas->widthPerUnit, + canvas->heightPerElectrodePix); + // hide all other plots. + for (int k=0; k<psthPlots.size(); k++) + { + psthPlots[k]->setVisible(true); + psthPlots[k]->repaint(); + } + + } + else + { + // hide all other plots. + for (int k=0; k<psthPlots.size(); k++) + { + if (psthPlots[k]->getPlotID() != plotID) + psthPlots[k]->setVisible(false); + } + psthPlots[plotIndex]->toggleFullScreen(true); + // make sure its rectangular...? + int newSize = MIN(canvas->screenWidth,canvas->screenHeight); + setBounds(0,0,newSize,newSize); + psthPlots[plotIndex]->setBounds(0,0,newSize-30,newSize-30); + psthPlots[plotIndex]->repaint(); + } + +} + +/***********************************/ +ConditionList::ConditionList(PeriStimulusTimeHistogramNode* n, Viewport* p, PeriStimulusTimeHistogramCanvas* c) : + processor(n), viewport(p), canvas(c) +{ + + titleButton = new ColorButton("CONDITIONS LIST", Font("Default", 24, Font::plain)); + titleButton->setBounds(0,0, 200,25); + titleButton->addListener(this); + addAndMakeVisible(titleButton); + + allButton = new ColorButton("All", Font("Default", 20, Font::plain)); + allButton->setBounds(0,25,100,20); + allButton->addListener(this); + addAndMakeVisible(allButton); + + noneButton = new ColorButton("None", Font("Default", 20, Font::plain)); + noneButton->setBounds(100,25,100,20); + noneButton->addListener(this); + addAndMakeVisible(noneButton); + + updateConditionButtons(); + +} + + +void ConditionList::updateConditionButtons() +{ + if (processor->trialCircularBuffer != nullptr) + { + const ScopedLock myScopedLock(processor->trialCircularBuffer->psthMutex); + //processor->trialCircularBuffer->lockConditions(); + conditionButtons.clear(); + for (int k=0; k<processor->trialCircularBuffer->getNumConditions(); k++) + { + Condition cond = processor->trialCircularBuffer->getCondition(k); + ColorButton* conditionButton = new ColorButton(cond.name, Font("Default", 20, Font::plain)); + conditionButton->setBounds(0,50+k*20,200,20); + conditionButton->setColors(Colours::white, + juce::Colour::fromRGB(cond.colorRGB[0], + cond.colorRGB[1], + cond.colorRGB[2])); + conditionButton->setEnabledState(cond.visible); + conditionButton->setUserDefinedData(cond.conditionID); + conditionButton->setShowEnabled(true); + conditionButton->addListener(this); + addAndMakeVisible(conditionButton); + conditionButtons.add(conditionButton); + } + + //processor->trialCircularBuffer->unlockConditions(); + } +} + +ConditionList::~ConditionList() +{ + + for (int i = 0; i < conditionButtons.size(); i++) + { + removeChildComponent(conditionButtons[i]); + } +} + +void ConditionList::paint(Graphics& g) +{ + g.fillAll(juce::Colours::grey); + //g.drawText +} + +void ConditionList::buttonClicked(Button* btn) +{ + ColorButton* cbtn = (ColorButton*)btn; + // also inform trial circular buffer about visibility change. + if (btn == titleButton) + { + int x = 5; + } + else if (btn == noneButton) + { + if (processor->trialCircularBuffer != nullptr) + { + //processor->trialCircularBuffer->lockConditions(); + const ScopedLock myScopedLock(processor->trialCircularBuffer->psthMutex); + for (int k=0; k<processor->trialCircularBuffer->getNumConditions(); k++) + { + processor->trialCircularBuffer->modifyConditionVisibility(k,false); + conditionButtons[k]->setEnabledState(false); + } + //processor->trialCircularBuffer->unlockConditions(); + } + + } + else if (btn == allButton) + { + if (processor->trialCircularBuffer != nullptr) + { + const ScopedLock myScopedLock(processor->trialCircularBuffer->psthMutex); + //processor->trialCircularBuffer->lockConditions(); + for (int k=0; k<processor->trialCircularBuffer->getNumConditions(); k++) + { + processor->trialCircularBuffer->modifyConditionVisibility(k,true); + conditionButtons[k]->setEnabledState(true); + } + //processor->trialCircularBuffer->unlockConditions(); + } + + } + else + { + // probably a condition button + int conditionID = cbtn->getUserDefinedData(); + cbtn->setEnabledState(!cbtn->getEnabledState()); + processor->trialCircularBuffer->modifyConditionVisibilityusingConditionID(conditionID, cbtn->getEnabledState()); + } + + repaint(); +} + + +/*************************************************************************/ +// Generic plot replaces XYPlot class, with better class organization and code encapsulation. +// All low level plotting of curves is handled by MatlabLikePlot object (including zooming / panning / ...) +// All raster plots will be handled by another class (?) +// + +GenericPlot::GenericPlot(String name,PeriStimulusTimeHistogramDisplay* dsp, int plotID_, xyPlotTypes plotType_, + TrialCircularBuffer* tcb_, int electrodeID_, int subID_, int row_, int col_, bool rasterMode_, bool panM) : tcb(tcb_), electrodeID(electrodeID_), plotID(plotID_), + plotType(plotType_), subID(subID_), row(row_), col(col_), rasterMode(rasterMode_),display(dsp),plotName(name),inPanMode(panM) +{ + fullScreenMode = false; + mlp = new MatlabLikePlot(); + mlp->setControlButtonsVisibile(false); + TrialCircularBufferParams params = tcb->getParams(); + + if (inPanMode) + mlp->setMode(DrawComponentMode::PAN); + else + mlp->setMode(DrawComponentMode::ZOOM); + + if (rasterMode) + { + mlp->setImageMode(true); + mlp->setAutoRescale(false); + } + else + mlp->setImageMode(false); + + + addAndMakeVisible(mlp); + + mlp->setTitle(plotName); + if (plotType == SPIKE_PLOT) + { + //mlp->setTitle("Unit "+String(electrodeID)+":"+String(subID)); + mlp->setFiringRateMode(true); + mlp->setBorderColor(tcb->getUnitColor(electrodeID, subID)); + int uniqueIntervalID = tcb->getUnitUniqueInterval(electrodeID, subID); + mlp->setActivateButtonVisiblilty(true, uniqueIntervalID); + mlp->setRangeLimit(-params.preSec,params.postSec+params.maxTrialTimeSeconds,0,1e3); + } + else if (plotType == LFP_PLOT) + { + // mlp->setTitle("Ch "+String(electrodeID)+":"+String(subID)); + mlp->setBorderColor(juce::Colours::white); + mlp->setRangeLimit(-params.preSec,params.postSec+params.maxTrialTimeSeconds,-1e3,1e3); + } + + guassianStandardDeviationMS = 5; // default smoothing + buildSmoothKernel(guassianStandardDeviationMS); + + smoothPlot = plotType == SPIKE_PLOT; // don't smooth LFPs + fullScreenMode = false; +} + +xyPlotTypes GenericPlot::getPlotType() +{ + return plotType; +} + +void GenericPlot::resized() +{ + int w = getWidth(); + int h = getHeight(); + mlp->setBounds(0,0,w,h); +} + +void GenericPlot::paintSpikeRaster(Graphics& g) +{ + //tictoc.Tic(16); + int numTrialTypes = tcb->getNumTrialTypesInUnit(electrodeID, subID); + if (numTrialTypes > 0) + { + int numTrials = tcb->getNumTrialsInUnit(electrodeID, subID); + mlp->setAuxiliaryString(String(numTrials) + " trials"); + + float xmin,xmax,ymin,ymax,maxValue; + mlp->getRange(xmin,xmax,ymin,ymax); + juce::Image rasterImage = tcb->getTrialsAverageUnitResponseAsJuceImage(electrodeID, subID,guassianStandardDeviationMS,xmin,xmax,ymin, ymax, maxValue); + mlp->drawImage(rasterImage,maxValue); + } + //tictoc.Toc(17); +} + +void GenericPlot::paintSpikes(Graphics& g) +{ + //tictoc.Tic(15); + std::vector<XYline> lines = tcb->getUnitConditionCurves(electrodeID, subID); + int numTrials = tcb->getNumTrialsInUnit(electrodeID, subID); + mlp->setAuxiliaryString(String(numTrials) + " trials"); + + mlp->clearplot(); + for (int k=0; k<lines.size(); k++) + { + if (smoothPlot) + { + lines[k].smooth(smoothKernel); + } + mlp->plotxy(lines[k]); + } + //tictoc.Toc(15); +} + +void GenericPlot::paintLFPraster(Graphics& g) +{ + //tictoc.Tic(14); + int numTrialTypes = tcb->getNumTrialTypesInChannel(electrodeID, subID); + if (numTrialTypes > 0) + { + int numTrials = tcb->getNumTrialsInChannel(electrodeID, subID); + mlp->setAuxiliaryString(String(numTrials) + " trials"); + + float xmin,xmax,ymin,ymax,maxValue; + mlp->getRange(xmin,xmax,ymin,ymax); + juce::Image rasterImage = tcb->getTrialsAverageChannelResponseAsJuceImage(electrodeID, subID,guassianStandardDeviationMS,xmin,xmax,ymin, ymax, maxValue); + mlp->drawImage(rasterImage,maxValue); + } + //tictoc.Toc(14); +} + +void GenericPlot::paintLFP(Graphics& g) +{ + //tictoc.Tic(13); + std::vector<XYline> lines = tcb->getElectrodeConditionCurves(electrodeID, subID); + mlp->clearplot(); + + int numTrials = tcb->getNumTrialsInChannel(electrodeID, subID); + mlp->setAuxiliaryString(String(numTrials) + " trials"); + + for (int k=0; k<lines.size(); k++) + { + if (smoothPlot) + { + lines[k].smooth(smoothKernel); + } + mlp->plotxy(lines[k]); + } + //tictoc.Toc(13); +} + +void GenericPlot::paint(Graphics& g) +{ + //printf("Entering GenericPlot::paint\n"); + //tictoc.Tic(12); + if (mlp->eventsAvail()) + { + String lastEvent = mlp->getLastEvent(); + handleEventFromMatlabLikePlot(lastEvent); + } + + if (plotType == SPIKE_PLOT) + { + if (rasterMode) + paintSpikeRaster(g); + else + paintSpikes(g); + } + else if (plotType == LFP_PLOT) + { + if (rasterMode) + paintLFPraster(g); + else + paintLFP(g); + } + //printf("Exitting GenericPlot::paint\n"); + //tictoc.Toc(12); +} + + +void GenericPlot::setSmoothState(bool state) +{ + smoothPlot = state; +} + +void GenericPlot::setAutoRescale(bool state) +{ + autoRescale = state; + mlp->setAutoRescale(state); +} + +void GenericPlot::setXRange(double xmin, double xmax) +{ + float curr_minx,curr_miny,curr_maxx,curr_maxy; + mlp->getRange(curr_minx,curr_maxx,curr_miny,curr_maxy); + mlp->setRange(xmin,xmax,curr_miny,curr_maxy,false); +} + +void GenericPlot::setYRange(double ymin,double ymax) +{ + float curr_minx,curr_miny,curr_maxx,curr_maxy; + mlp->getRange(curr_minx,curr_maxx,curr_miny,curr_maxy); + mlp->setRange(curr_minx,curr_maxx, ymin,ymax,false); +} + + +void GenericPlot::setMode(DrawComponentMode mode) +{ + mlp->setMode(mode); +} + +void GenericPlot::resetAxes() +{ + TrialCircularBufferParams params = tcb->getParams(); + if (plotType == SPIKE_PLOT) + { + std::vector<XYline> lines = tcb->getUnitConditionCurves(electrodeID, subID); + double trial_xmin, trial_xmax; + tcb->getUnitConditionRange(electrodeID, subID, trial_xmin, trial_xmax); + + float xmin=0,xmax=0; + double ymin=0,ymax=0; + float highestY=0; + for (int k=0; k<lines.size(); k++) + { + lines[k].getYRange(xmin,xmax,ymin,ymax); + highestY = MAX(highestY, ymax); + } + mlp->setRange(trial_xmin, trial_xmax,0,highestY,false); + + } + else if (plotType == LFP_PLOT) + { + double trial_xmin, trial_xmax; + tcb->getElectrodeConditionRange(electrodeID, subID, trial_xmin, trial_xmax); + + std::vector<XYline> lines = tcb->getElectrodeConditionCurves(electrodeID, subID); + float xmin,xmax; + double ymin,ymax; + float highestY=-1e10,lowestY=1e10; + for (int k=0; k<lines.size(); k++) + { + lines[k].getYRange(xmin,xmax,ymin,ymax); + highestY = MAX(highestY, ymax); + lowestY = MIN(lowestY, ymin); + } + + mlp->setRange(trial_xmin, trial_xmax,lowestY,highestY,false); + } +} + +void GenericPlot::buildSmoothKernel(float gaussianStandardDeviationMS_) +{ + guassianStandardDeviationMS = gaussianStandardDeviationMS_; + // assume each bin correponds to one millisecond. + // build the gaussian kernel + int numKernelBins = 2*(int)(guassianStandardDeviationMS*3.5)+1; // +- 3.5 standard deviations. + int zeroIndex = (numKernelBins-1)/2; + smoothKernel.resize(numKernelBins); + float sumZ = 0; + for (int k=0; k<numKernelBins; k++) + { + float z = float(k-zeroIndex); + smoothKernel[k] = exp(- (z*z)/(2*guassianStandardDeviationMS*guassianStandardDeviationMS)); + sumZ+=smoothKernel[k]; + } + // normalize kernel + for (int k=0; k<numKernelBins; k++) + { + smoothKernel[k] /= sumZ; + } +} + +void GenericPlot::handleEventFromMatlabLikePlot(String event) +{ + std::vector<String> command = StringTS(event).splitString(' '); + //addEvent("NewRange "+String(xmin)+" "+String(xmax)+" "+String(ymin)+" "+String(ymax)); + if (command[0] == "DblkClickRight") + { + + if (plotType == SPIKE_PLOT) + { + tcb->clearUnitStatistics(electrodeID, subID); + } + else if (plotType == LFP_PLOT) + { + tcb->clearChanneltatistics(electrodeID, subID); + } + + } + else if (command[0] == "DblkClickLeft") + { + // full screen toggle + display->focusOnPlot(plotID); + } + else if (command[0] == "StartInterval") + { + + + int uniqueIntervalID = tcb->setUnitUniqueInterval(electrodeID, subID,true); + mlp->setActivateButtonVisiblilty(true, uniqueIntervalID); + // post this as a network message as well + StringTS s("UnitIntervalStart "+String(electrodeID)+" "+String(subID)+" "+String(uniqueIntervalID)); + display->processor->handleNetworkMessage(s); + } + else if (command[0] == "StopInterval") + { + int uniqueIntervalID = tcb->setUnitUniqueInterval(electrodeID, subID,false); + mlp->setActivateButtonVisiblilty(true, -1); + // post this as a network message as well + StringTS s("UnitIntervalStop "+String(electrodeID)+" "+String(subID) + " "+String(uniqueIntervalID)); + display->processor->handleNetworkMessage(s); + } + else if (command[0] == "NewRange") + { + if (display->canvas->getMatchRange()) + { + double xmin = command[1].getDoubleValue(); + double xmax = command[2].getDoubleValue(); + double ymin = command[3].getDoubleValue(); + double ymax = command[4].getDoubleValue(); + display->canvas->setRange(xmin,xmax,ymin,ymax,plotType); + } + } +} diff --git a/Source/Processors/PluginManager/PluginManager.cpp b/Source/Processors/PluginManager/PluginManager.cpp index 89e0e5734..302b83ebb 100644 --- a/Source/Processors/PluginManager/PluginManager.cpp +++ b/Source/Processors/PluginManager/PluginManager.cpp @@ -1,202 +1,202 @@ -/* - ------------------------------------------------------------------ - - This file is part of the Open Ephys GUI - Copyright (C) 2013 Open Ephys - - ------------------------------------------------------------------ - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. - - */ - -#include <iostream> -#include <stdio.h> -#ifdef WIN32 -//simple hack to avoid to much conditionals -#define dlclose(h) FreeLibrary(h) -#else -#include <dlfcn.h> -#include <execinfo.h> -#endif - -#include "PluginManager.h" -#include "../../UI/ProcessorList.h" - - -#ifdef WIN32 -//And this one because Windows doesn't provide an error-to-string anything -static const char* dlerror(void) -{ - static char buf[32]; - DWORD ret = GetLastError(); - if (!ret) return NULL; - sprintf(buf, "DLL Error 0x%x",ret); - return buf; -} -#define ERROR_MSG(fmt,...) do{fprintf(stderr,"%s:%d:",__FILE__,__LINE__); fprintf(stderr,fmt,__VA_ARGS__);} while(0) -#else -#define ERROR_MSG(fmt,args...) do{fprintf(stderr,"%s:%d:",__FILE__,__LINE__); fprintf(stderr,fmt,## args);} while(0) -#endif - -/* - Takes the user-specified plugin and begins - dynamic loading process. We want to ensure that - no step is exectured without a checkpoint - because dynamic loading calls for rellocation of RAM - and works inside the same POSIX thread as the GUI. - */ - -PluginManager::Plugin::Plugin() { -} - -PluginManager::Plugin::~Plugin() { -} - -/* - Allows user to select custom-compiled processor for - loading into the GUI. - */ -PluginManager::Plugin *PluginManager::Manager::loadPlugin(const String& pluginLoc) { - /* - Load in the selected processor. This takes the - dynamic object (.so) and copies it into RAM - Dynamic linker requires a C-style string, so we - we have to convert first. - */ - const char* processorLocCString = static_cast<const char*>(pluginLoc.toUTF8()); - -#ifndef WIN32 - // Clear errors - dlerror(); - - /* - Changing this to resolve all variables immediately upon loading. - This will provide for quicker testing of the custom - processor stability and to ensure that it doesn't crash due - to memory mishaps. - */ - void *handle = 0; - handle = dlopen(processorLocCString,RTLD_GLOBAL|RTLD_NOW); -#else - HINSTANCE handle; - handle = LoadLibrary(processorLocCString); -#endif - - if (!handle) { - printf("%s\n", dlerror()); - dlclose(handle); - return 0; - } - dlerror(); - - /* - Now that the processor is loaded up, let's look for the required - functions. Apparently ISO C++ forbids against casting object - pointer -> function pointer but it's safe here. - */ - Plugin *(*createFunc)() = 0; -#ifdef WIN32 - createFunc =(Plugin *(*)()) GetProcAddress(handle,"OpenEphysPlugin"); -#else - createFunc = (Plugin *(*)())(dlsym(handle,"OpenEphysPlugin")); -#endif - if (!createFunc) { - ERROR_MSG("%s\n",dlerror()); - dlclose(handle); - return 0; - } - dlerror(); - - /* - Call the casted function pointer - to call the processor constructor. - */ - Plugin *processor = 0; - processor = createFunc(); - if (!processor) { - ERROR_MSG("Invalid processor architecture\n"); - dlclose(handle); - return 0; - } - dlerror(); - - processor->processorHandle = handle; - insertListPlugin(processor); - return processor; -} - -void PluginManager::Manager::unloadPlugin(PluginManager::Plugin *processor) { - if (!processor) { - ERROR_MSG("PluginManager::unloadPlugin: Invalid processor\n"); - return; - } -#ifdef WIN32 - HINSTANCE handle; -#else - void *handle = 0; -#endif - handle = processor->processorHandle; - dlclose(handle); - removeListPlugin(processor); -} - -void PluginManager::Manager::insertListPlugin(PluginManager::Plugin *processor) { - std::cout << "Size of list before is: " << pluginList.size() << std::endl; - if(!processor) { - ERROR_MSG("PluginManager::insertListPlugin: Invalid processor.\n"); - return; - } - pluginList.push_back(processor); - std::cout << "Size of list after is: " << pluginList.size() << std::endl; -} - -void PluginManager::Manager::removeListPlugin(PluginManager::Plugin *processor) { - std::cout << "Size of list before is: " << pluginList.size() << std::endl; - if(!processor) { - ERROR_MSG("PluginManager::removeListPlugin: Invalid processor.\n"); - return; - } - pluginList.remove(processor); - std::cout << "Size of list after is: " << pluginList.size() << std::endl; -} - -void PluginManager::Manager::removeAllPlugins() { -#ifdef WIN32 - HINSTANCE handle; -#else - void *handle; -#endif - for(std::list<PluginManager::Plugin *>::iterator i = pluginList.begin(); i != pluginList.end(); i = pluginList.begin()) { - std::cout << "Size of list before all is: " << pluginList.size() << std::endl; - handle = (*i)->processorHandle; - removeListPlugin(*i); - delete *i; - dlclose(handle); - std::cout << "Size of list after all is: " << pluginList.size() << std::endl; - } -} - -PluginManager::Manager *PluginManager::Manager::instance = 0; -PluginManager::Manager *PluginManager::Manager::getInstance() { - if (instance) { - return instance; - } - - if (!instance) { - static Manager manager; - instance = &manager; - } - return instance; -} +/* + ------------------------------------------------------------------ + + This file is part of the Open Ephys GUI + Copyright (C) 2013 Open Ephys + + ------------------------------------------------------------------ + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + + */ + +#include <iostream> +#include <stdio.h> +#ifdef WIN32 +//simple hack to avoid to much conditionals +#define dlclose(h) FreeLibrary(h) +#else +#include <dlfcn.h> +#include <execinfo.h> +#endif + +#include "PluginManager.h" +#include "../../UI/ProcessorList.h" + + +#ifdef WIN32 +//And this one because Windows doesn't provide an error-to-string anything +static const char* dlerror(void) +{ + static char buf[32]; + DWORD ret = GetLastError(); + if (!ret) return NULL; + sprintf(buf, "DLL Error 0x%x",ret); + return buf; +} +#define ERROR_MSG(fmt,...) do{fprintf(stderr,"%s:%d:",__FILE__,__LINE__); fprintf(stderr,fmt,__VA_ARGS__);} while(0) +#else +#define ERROR_MSG(fmt,args...) do{fprintf(stderr,"%s:%d:",__FILE__,__LINE__); fprintf(stderr,fmt,## args);} while(0) +#endif + +/* + Takes the user-specified plugin and begins + dynamic loading process. We want to ensure that + no step is exectured without a checkpoint + because dynamic loading calls for rellocation of RAM + and works inside the same POSIX thread as the GUI. + */ + +PluginManager::Plugin::Plugin() { +} + +PluginManager::Plugin::~Plugin() { +} + +/* + Allows user to select custom-compiled processor for + loading into the GUI. + */ +PluginManager::Plugin *PluginManager::Manager::loadPlugin(const String& pluginLoc) { + /* + Load in the selected processor. This takes the + dynamic object (.so) and copies it into RAM + Dynamic linker requires a C-style string, so we + we have to convert first. + */ + const char* processorLocCString = static_cast<const char*>(pluginLoc.toUTF8()); + +#ifndef WIN32 + // Clear errors + dlerror(); + + /* + Changing this to resolve all variables immediately upon loading. + This will provide for quicker testing of the custom + processor stability and to ensure that it doesn't crash due + to memory mishaps. + */ + void *handle = 0; + handle = dlopen(processorLocCString,RTLD_GLOBAL|RTLD_NOW); +#else + HINSTANCE handle; + handle = LoadLibrary(processorLocCString); +#endif + + if (!handle) { + printf("%s\n", dlerror()); + dlclose(handle); + return 0; + } + dlerror(); + + /* + Now that the processor is loaded up, let's look for the required + functions. Apparently ISO C++ forbids against casting object + pointer -> function pointer but it's safe here. + */ + Plugin *(*createFunc)() = 0; +#ifdef WIN32 + createFunc =(Plugin *(*)()) GetProcAddress(handle,"OpenEphysPlugin"); +#else + createFunc = (Plugin *(*)())(dlsym(handle,"OpenEphysPlugin")); +#endif + if (!createFunc) { + ERROR_MSG("%s\n",dlerror()); + dlclose(handle); + return 0; + } + dlerror(); + + /* + Call the casted function pointer + to call the processor constructor. + */ + Plugin *processor = 0; + processor = createFunc(); + if (!processor) { + ERROR_MSG("Invalid processor architecture\n"); + dlclose(handle); + return 0; + } + dlerror(); + + processor->processorHandle = handle; + insertListPlugin(processor); + return processor; +} + +void PluginManager::Manager::unloadPlugin(PluginManager::Plugin *processor) { + if (!processor) { + ERROR_MSG("PluginManager::unloadPlugin: Invalid processor\n"); + return; + } +#ifdef WIN32 + HINSTANCE handle; +#else + void *handle = 0; +#endif + handle = processor->processorHandle; + dlclose(handle); + removeListPlugin(processor); +} + +void PluginManager::Manager::insertListPlugin(PluginManager::Plugin *processor) { + std::cout << "Size of list before is: " << pluginList.size() << std::endl; + if(!processor) { + ERROR_MSG("PluginManager::insertListPlugin: Invalid processor.\n"); + return; + } + pluginList.push_back(processor); + std::cout << "Size of list after is: " << pluginList.size() << std::endl; +} + +void PluginManager::Manager::removeListPlugin(PluginManager::Plugin *processor) { + std::cout << "Size of list before is: " << pluginList.size() << std::endl; + if(!processor) { + ERROR_MSG("PluginManager::removeListPlugin: Invalid processor.\n"); + return; + } + pluginList.remove(processor); + std::cout << "Size of list after is: " << pluginList.size() << std::endl; +} + +void PluginManager::Manager::removeAllPlugins() { +#ifdef WIN32 + HINSTANCE handle; +#else + void *handle; +#endif + for(std::list<PluginManager::Plugin *>::iterator i = pluginList.begin(); i != pluginList.end(); i = pluginList.begin()) { + std::cout << "Size of list before all is: " << pluginList.size() << std::endl; + handle = (*i)->processorHandle; + removeListPlugin(*i); + delete *i; + dlclose(handle); + std::cout << "Size of list after all is: " << pluginList.size() << std::endl; + } +} + +PluginManager::Manager *PluginManager::Manager::instance = 0; +PluginManager::Manager *PluginManager::Manager::getInstance() { + if (instance) { + return instance; + } + + if (!instance) { + static Manager manager; + instance = &manager; + } + return instance; +} diff --git a/Source/Processors/PluginManager/PluginManager.h b/Source/Processors/PluginManager/PluginManager.h index dfc02cc97..08a9ffa58 100644 --- a/Source/Processors/PluginManager/PluginManager.h +++ b/Source/Processors/PluginManager/PluginManager.h @@ -1,76 +1,76 @@ -/* - ------------------------------------------------------------------ - - This file is part of the Open Ephys GUI - Copyright (C) 2013 Open Ephys - - ------------------------------------------------------------------ - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. - - */ - -#ifndef __PLUGINMGR__ -#define __PLUGINMGR__ - -#ifdef WIN32 -#include <Windows.h> -#endif -#include <list> -#include <string> -#include <sys/types.h> -#include "../../../JuceLibraryCode/JuceHeader.h" - -namespace PluginManager { - - class Plugin; - - class Manager { - friend class Plugin; - - public: - static Manager *getInstance(void); - Plugin *loadPlugin(const String&); - void unloadPlugin(Plugin *); - void removeAllPlugins(); - - private: - Manager(void) {}; - ~Manager(void) {}; - Manager(const Manager &) {}; - Manager &operator=(const Manager &) {return *getInstance();}; - - void insertListPlugin(PluginManager::Plugin *); - void removeListPlugin(PluginManager::Plugin *); - std::list<PluginManager::Plugin *> pluginList; - static Manager *instance; - }; - - class Plugin { - friend class Manager; - - public: - Plugin(); - virtual ~Plugin(); - void unload(); - - private: -#ifdef WIN32 - HINSTANCE processorHandle; -#else - void *processorHandle; -#endif - }; -}; -#endif +/* + ------------------------------------------------------------------ + + This file is part of the Open Ephys GUI + Copyright (C) 2013 Open Ephys + + ------------------------------------------------------------------ + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + + */ + +#ifndef __PLUGINMGR__ +#define __PLUGINMGR__ + +#ifdef WIN32 +#include <Windows.h> +#endif +#include <list> +#include <string> +#include <sys/types.h> +#include "../../../JuceLibraryCode/JuceHeader.h" + +namespace PluginManager { + + class Plugin; + + class Manager { + friend class Plugin; + + public: + static Manager *getInstance(void); + Plugin *loadPlugin(const String&); + void unloadPlugin(Plugin *); + void removeAllPlugins(); + + private: + Manager(void) {}; + ~Manager(void) {}; + Manager(const Manager &) {}; + Manager &operator=(const Manager &) {return *getInstance();}; + + void insertListPlugin(PluginManager::Plugin *); + void removeListPlugin(PluginManager::Plugin *); + std::list<PluginManager::Plugin *> pluginList; + static Manager *instance; + }; + + class Plugin { + friend class Manager; + + public: + Plugin(); + virtual ~Plugin(); + void unload(); + + private: +#ifdef WIN32 + HINSTANCE processorHandle; +#else + void *processorHandle; +#endif + }; +}; +#endif diff --git a/open-ephys.jucer b/open-ephys.jucer index e446bed77..0425b90eb 100644 --- a/open-ephys.jucer +++ b/open-ephys.jucer @@ -275,31 +275,31 @@ <GROUP id="ZMfWAFj" name="Source"> <FILE id="QyaTEa" name="CoreServices.cpp" compile="1" resource="0" file="Source/CoreServices.cpp"/> - <FILE id="BH11mU" name="CoreServices.h" compile="0" resource="0" file="Source/CoreServices.h"/> + <FILE id="BH11mU" name="CoreServices.h" compile="1" resource="0" file="Source/CoreServices.h"/> <FILE id="AXFRUPT" name="AccessClass.cpp" compile="1" resource="0" file="Source/AccessClass.cpp"/> - <FILE id="2ViPrE" name="AccessClass.h" compile="0" resource="0" file="Source/AccessClass.h"/> + <FILE id="2ViPrE" name="AccessClass.h" compile="1" resource="0" file="Source/AccessClass.h"/> <GROUP id="leJrZDi" name="Network"> <FILE id="mOOc0R" name="PracticalSocket.cpp" compile="1" resource="0" file="Source/Network/PracticalSocket.cpp"/> - <FILE id="5XGl6EX" name="PracticalSocket.h" compile="0" resource="0" + <FILE id="5XGl6EX" name="PracticalSocket.h" compile="1" resource="0" file="Source/Network/PracticalSocket.h"/> </GROUP> <GROUP id="gRFzu0" name="Audio"> <FILE id="2vKx2R" name="AudioComponent.cpp" compile="1" resource="0" file="Source/Audio/AudioComponent.cpp"/> - <FILE id="lyiexes" name="AudioComponent.h" compile="0" resource="0" + <FILE id="lyiexes" name="AudioComponent.h" compile="1" resource="0" file="Source/Audio/AudioComponent.h"/> </GROUP> <GROUP id="yQmqZWk" name="Processors"> <GROUP id="{419E358E-7049-BF7C-21D8-840285A12731}" name="PluginManager"> <FILE id="a5xlEQ" name="PluginManager.cpp" compile="1" resource="0" file="Source/Processors/PluginManager/PluginManager.cpp"/> - <FILE id="I8EBWd" name="PluginManager.h" compile="0" resource="0" file="Source/Processors/PluginManager/PluginManager.h"/> + <FILE id="I8EBWd" name="PluginManager.h" compile="1" resource="0" file="Source/Processors/PluginManager/PluginManager.h"/> </GROUP> <GROUP id="{6E059BEC-4A8F-BCDA-1F91-9B22C6CBF2E4}" name="Rectifier"> <FILE id="oMFsRh" name="Rectifier.cpp" compile="1" resource="0" file="Source/Processors/Rectifier/Rectifier.cpp"/> - <FILE id="NdIO5Q" name="Rectifier.h" compile="0" resource="0" file="Source/Processors/Rectifier/Rectifier.h"/> + <FILE id="NdIO5Q" name="Rectifier.h" compile="1" resource="0" file="Source/Processors/Rectifier/Rectifier.h"/> </GROUP> <GROUP id="{447899E6-3974-53D0-5588-79643E8F5CA3}" name="ArduinoOutput"> <FILE id="Ucs5gf" name="ArduinoOutput.cpp" compile="0" resource="0" @@ -312,107 +312,107 @@ </GROUP> <GROUP id="{1932782D-9D00-9B76-92DC-94E7D42BF0D2}" name="AudioNode"> <FILE id="TV4cOO" name="AudioEditor.cpp" compile="1" resource="0" file="Source/Processors/AudioNode/AudioEditor.cpp"/> - <FILE id="erBMrA" name="AudioEditor.h" compile="0" resource="0" file="Source/Processors/AudioNode/AudioEditor.h"/> + <FILE id="erBMrA" name="AudioEditor.h" compile="1" resource="0" file="Source/Processors/AudioNode/AudioEditor.h"/> <FILE id="jClaJf" name="AudioNode.cpp" compile="1" resource="0" file="Source/Processors/AudioNode/AudioNode.cpp"/> - <FILE id="LHkdoG" name="AudioNode.h" compile="0" resource="0" file="Source/Processors/AudioNode/AudioNode.h"/> + <FILE id="LHkdoG" name="AudioNode.h" compile="1" resource="0" file="Source/Processors/AudioNode/AudioNode.h"/> </GROUP> <GROUP id="{524D893D-A1F5-2C0F-5BB3-5E5C4D8C697D}" name="CAR"> <FILE id="Tt1aBa" name="CAR.cpp" compile="1" resource="0" file="Source/Processors/CAR/CAR.cpp"/> - <FILE id="JRBOqc" name="CAR.h" compile="0" resource="0" file="Source/Processors/CAR/CAR.h"/> + <FILE id="JRBOqc" name="CAR.h" compile="1" resource="0" file="Source/Processors/CAR/CAR.h"/> </GROUP> <GROUP id="{46016F19-8F25-F540-AA1C-D6E87E8D7D31}" name="Channel"> <FILE id="X3I3e9" name="Channel.cpp" compile="1" resource="0" file="Source/Processors/Channel/Channel.cpp"/> - <FILE id="IEZGF3" name="Channel.h" compile="0" resource="0" file="Source/Processors/Channel/Channel.h"/> + <FILE id="IEZGF3" name="Channel.h" compile="1" resource="0" file="Source/Processors/Channel/Channel.h"/> </GROUP> <GROUP id="{CC57D5E1-9093-9454-4B03-5908715DFBD8}" name="ChannelMappingNode"> - <FILE id="UhpW2V" name="ChannelMappingEditor.cpp" compile="0" resource="0" + <FILE id="UhpW2V" name="ChannelMappingEditor.cpp" compile="1" resource="0" file="Source/Processors/ChannelMappingNode/ChannelMappingEditor.cpp"/> - <FILE id="kq8tJl" name="ChannelMappingEditor.h" compile="0" resource="0" + <FILE id="kq8tJl" name="ChannelMappingEditor.h" compile="1" resource="0" file="Source/Processors/ChannelMappingNode/ChannelMappingEditor.h"/> - <FILE id="gRCztM" name="ChannelMappingNode.cpp" compile="0" resource="0" + <FILE id="gRCztM" name="ChannelMappingNode.cpp" compile="1" resource="0" file="Source/Processors/ChannelMappingNode/ChannelMappingNode.cpp"/> - <FILE id="blwGma" name="ChannelMappingNode.h" compile="0" resource="0" + <FILE id="blwGma" name="ChannelMappingNode.h" compile="1" resource="0" file="Source/Processors/ChannelMappingNode/ChannelMappingNode.h"/> </GROUP> <GROUP id="ZgsuWxi" name="DataThreads"> <FILE id="gHzlwP" name="EcubeEditor.cpp" compile="1" resource="0" file="Source/Processors/DataThreads/EcubeEditor.cpp"/> - <FILE id="Bi0une" name="EcubeEditor.h" compile="0" resource="0" file="Source/Processors/DataThreads/EcubeEditor.h"/> + <FILE id="Bi0une" name="EcubeEditor.h" compile="1" resource="0" file="Source/Processors/DataThreads/EcubeEditor.h"/> <FILE id="ZBPSXE" name="RHD2000Editor.cpp" compile="1" resource="0" file="Source/Processors/DataThreads/RHD2000Editor.cpp"/> - <FILE id="TnZlGU" name="RHD2000Editor.h" compile="0" resource="0" file="Source/Processors/DataThreads/RHD2000Editor.h"/> + <FILE id="TnZlGU" name="RHD2000Editor.h" compile="1" resource="0" file="Source/Processors/DataThreads/RHD2000Editor.h"/> <FILE id="mbMbly" name="EcubeThread.cpp" compile="1" resource="0" file="Source/Processors/DataThreads/EcubeThread.cpp"/> - <FILE id="lKsc0T" name="EcubeThread.h" compile="0" resource="0" file="Source/Processors/DataThreads/EcubeThread.h"/> + <FILE id="lKsc0T" name="EcubeThread.h" compile="1" resource="0" file="Source/Processors/DataThreads/EcubeThread.h"/> <GROUP id="LcWQtrg" name="rhythm-api"> <FILE id="hyM1EYD" name="okFrontPanelDLL.cpp" compile="1" resource="0" file="Source/Processors/DataThreads/rhythm-api/okFrontPanelDLL.cpp"/> - <FILE id="umVgAPM" name="okFrontPanelDLL.h" compile="0" resource="0" + <FILE id="umVgAPM" name="okFrontPanelDLL.h" compile="1" resource="0" file="Source/Processors/DataThreads/rhythm-api/okFrontPanelDLL.h"/> <FILE id="xNtaB1Q" name="rhd2000datablock.cpp" compile="1" resource="0" file="Source/Processors/DataThreads/rhythm-api/rhd2000datablock.cpp"/> - <FILE id="Wg7Wpit" name="rhd2000datablock.h" compile="0" resource="0" + <FILE id="Wg7Wpit" name="rhd2000datablock.h" compile="1" resource="0" file="Source/Processors/DataThreads/rhythm-api/rhd2000datablock.h"/> <FILE id="zVeQUvs" name="rhd2000evalboard.cpp" compile="1" resource="0" file="Source/Processors/DataThreads/rhythm-api/rhd2000evalboard.cpp"/> - <FILE id="0Kf2dKC" name="rhd2000evalboard.h" compile="0" resource="0" + <FILE id="0Kf2dKC" name="rhd2000evalboard.h" compile="1" resource="0" file="Source/Processors/DataThreads/rhythm-api/rhd2000evalboard.h"/> <FILE id="QL3qRCG" name="rhd2000registers.cpp" compile="1" resource="0" file="Source/Processors/DataThreads/rhythm-api/rhd2000registers.cpp"/> - <FILE id="VSCEdYf" name="rhd2000registers.h" compile="0" resource="0" + <FILE id="VSCEdYf" name="rhd2000registers.h" compile="1" resource="0" file="Source/Processors/DataThreads/rhythm-api/rhd2000registers.h"/> </GROUP> <FILE id="g24kpza" name="RHD2000Thread.cpp" compile="1" resource="0" file="Source/Processors/DataThreads/RHD2000Thread.cpp"/> - <FILE id="BbYdtBN" name="RHD2000Thread.h" compile="0" resource="0" + <FILE id="BbYdtBN" name="RHD2000Thread.h" compile="1" resource="0" file="Source/Processors/DataThreads/RHD2000Thread.h"/> <FILE id="Qfe0ygk" name="DataBuffer.cpp" compile="1" resource="0" file="Source/Processors/DataThreads/DataBuffer.cpp"/> - <FILE id="VCRMcQP" name="DataBuffer.h" compile="0" resource="0" file="Source/Processors/DataThreads/DataBuffer.h"/> + <FILE id="VCRMcQP" name="DataBuffer.h" compile="1" resource="0" file="Source/Processors/DataThreads/DataBuffer.h"/> <FILE id="9JbVKlA" name="DataThread.cpp" compile="1" resource="0" file="Source/Processors/DataThreads/DataThread.cpp"/> - <FILE id="McgNvuR" name="DataThread.h" compile="0" resource="0" file="Source/Processors/DataThreads/DataThread.h"/> + <FILE id="McgNvuR" name="DataThread.h" compile="1" resource="0" file="Source/Processors/DataThreads/DataThread.h"/> </GROUP> <GROUP id="{BCF99568-D3A2-7CA2-E809-815D22183EA4}" name="Dsp"> <FILE id="PHlcin" name="Bessel.cpp" compile="1" resource="0" file="Source/Processors/Dsp/Bessel.cpp"/> - <FILE id="YXAcyZ" name="Bessel.h" compile="0" resource="0" file="Source/Processors/Dsp/Bessel.h"/> + <FILE id="YXAcyZ" name="Bessel.h" compile="1" resource="0" file="Source/Processors/Dsp/Bessel.h"/> <FILE id="nOEja0" name="Biquad.cpp" compile="1" resource="0" file="Source/Processors/Dsp/Biquad.cpp"/> - <FILE id="DxX7XS" name="Biquad.h" compile="0" resource="0" file="Source/Processors/Dsp/Biquad.h"/> + <FILE id="DxX7XS" name="Biquad.h" compile="1" resource="0" file="Source/Processors/Dsp/Biquad.h"/> <FILE id="VQ44sd" name="Butterworth.cpp" compile="1" resource="0" file="Source/Processors/Dsp/Butterworth.cpp"/> - <FILE id="NVAymk" name="Butterworth.h" compile="0" resource="0" file="Source/Processors/Dsp/Butterworth.h"/> + <FILE id="NVAymk" name="Butterworth.h" compile="1" resource="0" file="Source/Processors/Dsp/Butterworth.h"/> <FILE id="FkrTqV" name="Cascade.cpp" compile="1" resource="0" file="Source/Processors/Dsp/Cascade.cpp"/> - <FILE id="pj0T3e" name="Cascade.h" compile="0" resource="0" file="Source/Processors/Dsp/Cascade.h"/> + <FILE id="pj0T3e" name="Cascade.h" compile="1" resource="0" file="Source/Processors/Dsp/Cascade.h"/> <FILE id="ggju8m" name="ChebyshevI.cpp" compile="1" resource="0" file="Source/Processors/Dsp/ChebyshevI.cpp"/> - <FILE id="EGxTwj" name="ChebyshevI.h" compile="0" resource="0" file="Source/Processors/Dsp/ChebyshevI.h"/> + <FILE id="EGxTwj" name="ChebyshevI.h" compile="1" resource="0" file="Source/Processors/Dsp/ChebyshevI.h"/> <FILE id="nWSeZF" name="ChebyshevII.cpp" compile="1" resource="0" file="Source/Processors/Dsp/ChebyshevII.cpp"/> - <FILE id="HS65B6" name="ChebyshevII.h" compile="0" resource="0" file="Source/Processors/Dsp/ChebyshevII.h"/> - <FILE id="jumO5X" name="Common.h" compile="0" resource="0" file="Source/Processors/Dsp/Common.h"/> + <FILE id="HS65B6" name="ChebyshevII.h" compile="1" resource="0" file="Source/Processors/Dsp/ChebyshevII.h"/> + <FILE id="jumO5X" name="Common.h" compile="1" resource="0" file="Source/Processors/Dsp/Common.h"/> <FILE id="E1ZdBg" name="Custom.cpp" compile="1" resource="0" file="Source/Processors/Dsp/Custom.cpp"/> - <FILE id="JAxvZH" name="Custom.h" compile="0" resource="0" file="Source/Processors/Dsp/Custom.h"/> + <FILE id="JAxvZH" name="Custom.h" compile="1" resource="0" file="Source/Processors/Dsp/Custom.h"/> <FILE id="BynrL2" name="Design.cpp" compile="1" resource="0" file="Source/Processors/Dsp/Design.cpp"/> - <FILE id="tINM97" name="Design.h" compile="0" resource="0" file="Source/Processors/Dsp/Design.h"/> + <FILE id="tINM97" name="Design.h" compile="1" resource="0" file="Source/Processors/Dsp/Design.h"/> <FILE id="gikZHr" name="Documentation.cpp" compile="1" resource="0" file="Source/Processors/Dsp/Documentation.cpp"/> - <FILE id="nwwW9u" name="Dsp.h" compile="0" resource="0" file="Source/Processors/Dsp/Dsp.h"/> + <FILE id="nwwW9u" name="Dsp.h" compile="1" resource="0" file="Source/Processors/Dsp/Dsp.h"/> <FILE id="VMtjos" name="Elliptic.cpp" compile="1" resource="0" file="Source/Processors/Dsp/Elliptic.cpp"/> - <FILE id="xlw76X" name="Elliptic.h" compile="0" resource="0" file="Source/Processors/Dsp/Elliptic.h"/> + <FILE id="xlw76X" name="Elliptic.h" compile="1" resource="0" file="Source/Processors/Dsp/Elliptic.h"/> <FILE id="SSUdH3" name="Filter.cpp" compile="1" resource="0" file="Source/Processors/Dsp/Filter.cpp"/> - <FILE id="jMEqrr" name="Filter.h" compile="0" resource="0" file="Source/Processors/Dsp/Filter.h"/> - <FILE id="gORopa" name="Layout.h" compile="0" resource="0" file="Source/Processors/Dsp/Layout.h"/> + <FILE id="jMEqrr" name="Filter.h" compile="1" resource="0" file="Source/Processors/Dsp/Filter.h"/> + <FILE id="gORopa" name="Layout.h" compile="1" resource="0" file="Source/Processors/Dsp/Layout.h"/> <FILE id="KFWbTw" name="Legendre.cpp" compile="1" resource="0" file="Source/Processors/Dsp/Legendre.cpp"/> - <FILE id="QukTBD" name="Legendre.h" compile="0" resource="0" file="Source/Processors/Dsp/Legendre.h"/> - <FILE id="yjHeg0" name="MathSupplement.h" compile="0" resource="0" + <FILE id="QukTBD" name="Legendre.h" compile="1" resource="0" file="Source/Processors/Dsp/Legendre.h"/> + <FILE id="yjHeg0" name="MathSupplement.h" compile="1" resource="0" file="Source/Processors/Dsp/MathSupplement.h"/> <FILE id="lSjPpg" name="Param.cpp" compile="1" resource="0" file="Source/Processors/Dsp/Param.cpp"/> - <FILE id="GbSbST" name="Params.h" compile="0" resource="0" file="Source/Processors/Dsp/Params.h"/> + <FILE id="GbSbST" name="Params.h" compile="1" resource="0" file="Source/Processors/Dsp/Params.h"/> <FILE id="iTSDrw" name="PoleFilter.cpp" compile="1" resource="0" file="Source/Processors/Dsp/PoleFilter.cpp"/> - <FILE id="c45usH" name="PoleFilter.h" compile="0" resource="0" file="Source/Processors/Dsp/PoleFilter.h"/> + <FILE id="c45usH" name="PoleFilter.h" compile="1" resource="0" file="Source/Processors/Dsp/PoleFilter.h"/> <FILE id="UEmTDD" name="RBJ.cpp" compile="1" resource="0" file="Source/Processors/Dsp/RBJ.cpp"/> - <FILE id="PjXcyh" name="RBJ.h" compile="0" resource="0" file="Source/Processors/Dsp/RBJ.h"/> + <FILE id="PjXcyh" name="RBJ.h" compile="1" resource="0" file="Source/Processors/Dsp/RBJ.h"/> <FILE id="n1FzuK" name="RootFinder.cpp" compile="1" resource="0" file="Source/Processors/Dsp/RootFinder.cpp"/> - <FILE id="aDg7vK" name="RootFinder.h" compile="0" resource="0" file="Source/Processors/Dsp/RootFinder.h"/> - <FILE id="DE0lE3" name="SmoothedFilter.h" compile="0" resource="0" + <FILE id="aDg7vK" name="RootFinder.h" compile="1" resource="0" file="Source/Processors/Dsp/RootFinder.h"/> + <FILE id="DE0lE3" name="SmoothedFilter.h" compile="1" resource="0" file="Source/Processors/Dsp/SmoothedFilter.h"/> <FILE id="SPcR5B" name="State.cpp" compile="1" resource="0" file="Source/Processors/Dsp/State.cpp"/> - <FILE id="D1k4f9" name="State.h" compile="0" resource="0" file="Source/Processors/Dsp/State.h"/> - <FILE id="BBxUBy" name="Types.h" compile="0" resource="0" file="Source/Processors/Dsp/Types.h"/> - <FILE id="qXPdAz" name="Utilities.h" compile="0" resource="0" file="Source/Processors/Dsp/Utilities.h"/> + <FILE id="D1k4f9" name="State.h" compile="1" resource="0" file="Source/Processors/Dsp/State.h"/> + <FILE id="BBxUBy" name="Types.h" compile="1" resource="0" file="Source/Processors/Dsp/Types.h"/> + <FILE id="qXPdAz" name="Utilities.h" compile="1" resource="0" file="Source/Processors/Dsp/Utilities.h"/> </GROUP> <GROUP id="AqvwO6w" name="Editors"> <FILE id="F68NQ3" name="ChannelSelector.cpp" compile="1" resource="0" @@ -436,312 +436,312 @@ <GROUP id="{5884418B-6740-1CC4-EC34-721D3F3038AE}" name="EventDetector"> <FILE id="GzQXNv" name="EventDetector.cpp" compile="1" resource="0" file="Source/Processors/EventDetector/EventDetector.cpp"/> - <FILE id="cB7MXO" name="EventDetector.h" compile="0" resource="0" file="Source/Processors/EventDetector/EventDetector.h"/> + <FILE id="cB7MXO" name="EventDetector.h" compile="1" resource="0" file="Source/Processors/EventDetector/EventDetector.h"/> </GROUP> <GROUP id="{0F7938FB-ACA3-29CA-58CE-2F0C8B5B0033}" name="EventNode"> <FILE id="FWXJPq" name="EventNode.cpp" compile="1" resource="0" file="Source/Processors/EventNode/EventNode.cpp"/> - <FILE id="muOEC8" name="EventNode.h" compile="0" resource="0" file="Source/Processors/EventNode/EventNode.h"/> + <FILE id="muOEC8" name="EventNode.h" compile="1" resource="0" file="Source/Processors/EventNode/EventNode.h"/> <FILE id="Kwuq6Z" name="EventNodeEditor.cpp" compile="1" resource="0" file="Source/Processors/EventNode/EventNodeEditor.cpp"/> - <FILE id="LUVId3" name="EventNodeEditor.h" compile="0" resource="0" + <FILE id="LUVId3" name="EventNodeEditor.h" compile="1" resource="0" file="Source/Processors/EventNode/EventNodeEditor.h"/> </GROUP> <GROUP id="{27CF9A8D-7C31-9AA9-6DCA-6C719E127923}" name="FileReader"> <FILE id="i8d55i" name="KwikFileSource.cpp" compile="1" resource="0" file="Source/Processors/FileReader/KwikFileSource.cpp"/> - <FILE id="MXFbiF" name="KwikFileSource.h" compile="0" resource="0" + <FILE id="MXFbiF" name="KwikFileSource.h" compile="1" resource="0" file="Source/Processors/FileReader/KwikFileSource.h"/> <FILE id="O6lxmJ" name="FileSource.cpp" compile="1" resource="0" file="Source/Processors/FileReader/FileSource.cpp"/> - <FILE id="CHKZ6y" name="FileSource.h" compile="0" resource="0" file="Source/Processors/FileReader/FileSource.h"/> + <FILE id="CHKZ6y" name="FileSource.h" compile="1" resource="0" file="Source/Processors/FileReader/FileSource.h"/> <FILE id="Pg9JfX" name="FileReader.cpp" compile="1" resource="0" file="Source/Processors/FileReader/FileReader.cpp"/> - <FILE id="SuAWvs" name="FileReader.h" compile="0" resource="0" file="Source/Processors/FileReader/FileReader.h"/> + <FILE id="SuAWvs" name="FileReader.h" compile="1" resource="0" file="Source/Processors/FileReader/FileReader.h"/> <FILE id="Z58rr6" name="FileReaderEditor.cpp" compile="1" resource="0" file="Source/Processors/FileReader/FileReaderEditor.cpp"/> - <FILE id="Ocpu1k" name="FileReaderEditor.h" compile="0" resource="0" + <FILE id="Ocpu1k" name="FileReaderEditor.h" compile="1" resource="0" file="Source/Processors/FileReader/FileReaderEditor.h"/> </GROUP> <GROUP id="{986528D4-813B-6CCB-4564-5A15140EB912}" name="FilterNode"> <FILE id="yBlgAF" name="FilterEditor.cpp" compile="1" resource="0" file="Source/Processors/FilterNode/FilterEditor.cpp"/> - <FILE id="sBtXDo" name="FilterEditor.h" compile="0" resource="0" file="Source/Processors/FilterNode/FilterEditor.h"/> + <FILE id="sBtXDo" name="FilterEditor.h" compile="1" resource="0" file="Source/Processors/FilterNode/FilterEditor.h"/> <FILE id="usXu7Q" name="FilterNode.cpp" compile="1" resource="0" file="Source/Processors/FilterNode/FilterNode.cpp"/> - <FILE id="qnkW8d" name="FilterNode.h" compile="0" resource="0" file="Source/Processors/FilterNode/FilterNode.h"/> + <FILE id="qnkW8d" name="FilterNode.h" compile="1" resource="0" file="Source/Processors/FilterNode/FilterNode.h"/> </GROUP> <GROUP id="{95FA3CAF-7BFA-AFF7-4480-EADCCA5FBA66}" name="GenericProcessor"> <FILE id="l24v5k" name="GenericProcessor.cpp" compile="1" resource="0" file="Source/Processors/GenericProcessor/GenericProcessor.cpp"/> - <FILE id="jSfKFd" name="GenericProcessor.h" compile="0" resource="0" + <FILE id="jSfKFd" name="GenericProcessor.h" compile="1" resource="0" file="Source/Processors/GenericProcessor/GenericProcessor.h"/> </GROUP> <GROUP id="{B8EDEED3-180D-9198-31A8-D1E42439462C}" name="LfpDisplayNode"> - <FILE id="jKpYbZ" name="LfpDisplayCanvas.cpp" compile="0" resource="0" + <FILE id="jKpYbZ" name="LfpDisplayCanvas.cpp" compile="1" resource="0" file="Source/Processors/LfpDisplayNode/LfpDisplayCanvas.cpp"/> - <FILE id="wDsfeN" name="LfpDisplayCanvas.h" compile="0" resource="0" + <FILE id="wDsfeN" name="LfpDisplayCanvas.h" compile="1" resource="0" file="Source/Processors/LfpDisplayNode/LfpDisplayCanvas.h"/> - <FILE id="tWxSDp" name="LfpDisplayEditor.cpp" compile="0" resource="0" + <FILE id="tWxSDp" name="LfpDisplayEditor.cpp" compile="1" resource="0" file="Source/Processors/LfpDisplayNode/LfpDisplayEditor.cpp"/> - <FILE id="Nkg6ww" name="LfpDisplayEditor.h" compile="0" resource="0" + <FILE id="Nkg6ww" name="LfpDisplayEditor.h" compile="1" resource="0" file="Source/Processors/LfpDisplayNode/LfpDisplayEditor.h"/> - <FILE id="x9mO0H" name="LfpDisplayNode.cpp" compile="0" resource="0" + <FILE id="x9mO0H" name="LfpDisplayNode.cpp" compile="1" resource="0" file="Source/Processors/LfpDisplayNode/LfpDisplayNode.cpp"/> - <FILE id="rKu45v" name="LfpDisplayNode.h" compile="0" resource="0" + <FILE id="rKu45v" name="LfpDisplayNode.h" compile="1" resource="0" file="Source/Processors/LfpDisplayNode/LfpDisplayNode.h"/> </GROUP> <GROUP id="{4B40CAAE-49C7-509A-B7E7-0C7EF011FBA1}" name="Merger"> <FILE id="gZxAmt" name="Merger.cpp" compile="1" resource="0" file="Source/Processors/Merger/Merger.cpp"/> - <FILE id="w8qwHK" name="Merger.h" compile="0" resource="0" file="Source/Processors/Merger/Merger.h"/> + <FILE id="w8qwHK" name="Merger.h" compile="1" resource="0" file="Source/Processors/Merger/Merger.h"/> <FILE id="YIzAwj" name="MergerEditor.cpp" compile="1" resource="0" file="Source/Processors/Merger/MergerEditor.cpp"/> - <FILE id="yquxy4" name="MergerEditor.h" compile="0" resource="0" file="Source/Processors/Merger/MergerEditor.h"/> + <FILE id="yquxy4" name="MergerEditor.h" compile="1" resource="0" file="Source/Processors/Merger/MergerEditor.h"/> </GROUP> <GROUP id="{6E21A406-000C-7894-28D6-2B45D07A304B}" name="MessageCenter"> <FILE id="gnNHUQ" name="MessageCenter.cpp" compile="1" resource="0" file="Source/Processors/MessageCenter/MessageCenter.cpp"/> - <FILE id="vn2uwZ" name="MessageCenter.h" compile="0" resource="0" file="Source/Processors/MessageCenter/MessageCenter.h"/> + <FILE id="vn2uwZ" name="MessageCenter.h" compile="1" resource="0" file="Source/Processors/MessageCenter/MessageCenter.h"/> <FILE id="xGnJo5" name="MessageCenterEditor.cpp" compile="1" resource="0" file="Source/Processors/MessageCenter/MessageCenterEditor.cpp"/> - <FILE id="r1V0KZ" name="MessageCenterEditor.h" compile="0" resource="0" + <FILE id="r1V0KZ" name="MessageCenterEditor.h" compile="1" resource="0" file="Source/Processors/MessageCenter/MessageCenterEditor.h"/> </GROUP> <GROUP id="{86B5AC2A-0A78-6D0E-C5FE-6758DDD096DB}" name="Parameter"> <FILE id="yyyDtp" name="ParameterEditor.cpp" compile="1" resource="0" file="Source/Processors/Parameter/ParameterEditor.cpp"/> - <FILE id="t3vpkl" name="ParameterEditor.h" compile="0" resource="0" + <FILE id="t3vpkl" name="ParameterEditor.h" compile="1" resource="0" file="Source/Processors/Parameter/ParameterEditor.h"/> <FILE id="P4fc98" name="Parameter.cpp" compile="1" resource="0" file="Source/Processors/Parameter/Parameter.cpp"/> - <FILE id="QdTalD" name="Parameter.h" compile="0" resource="0" file="Source/Processors/Parameter/Parameter.h"/> + <FILE id="QdTalD" name="Parameter.h" compile="1" resource="0" file="Source/Processors/Parameter/Parameter.h"/> </GROUP> <GROUP id="{0FB1D636-E24B-00AB-3123-3C8B78796B4A}" name="PhaseDetector"> - <FILE id="l7SGiM" name="PhaseDetector.cpp" compile="0" resource="0" + <FILE id="l7SGiM" name="PhaseDetector.cpp" compile="1" resource="0" file="Source/Processors/PhaseDetector/PhaseDetector.cpp"/> - <FILE id="eKMXut" name="PhaseDetector.h" compile="0" resource="0" file="Source/Processors/PhaseDetector/PhaseDetector.h"/> - <FILE id="T9hV0k" name="PhaseDetectorEditor.cpp" compile="0" resource="0" + <FILE id="eKMXut" name="PhaseDetector.h" compile="1" resource="0" file="Source/Processors/PhaseDetector/PhaseDetector.h"/> + <FILE id="T9hV0k" name="PhaseDetectorEditor.cpp" compile="1" resource="0" file="Source/Processors/PhaseDetector/PhaseDetectorEditor.cpp"/> - <FILE id="d4b1Wv" name="PhaseDetectorEditor.h" compile="0" resource="0" + <FILE id="d4b1Wv" name="PhaseDetectorEditor.h" compile="1" resource="0" file="Source/Processors/PhaseDetector/PhaseDetectorEditor.h"/> </GROUP> <GROUP id="{FDEB8810-D49F-8E7C-17A7-685370EF966F}" name="ProcessorGraph"> <FILE id="qil3t5" name="ProcessorGraph.cpp" compile="1" resource="0" file="Source/Processors/ProcessorGraph/ProcessorGraph.cpp"/> - <FILE id="cwGSmb" name="ProcessorGraph.h" compile="0" resource="0" + <FILE id="cwGSmb" name="ProcessorGraph.h" compile="1" resource="0" file="Source/Processors/ProcessorGraph/ProcessorGraph.h"/> </GROUP> <GROUP id="{B89E3035-1523-BBAA-12A9-AA81313B7E8F}" name="PulsePalOutput"> <FILE id="LEaT0R" name="PulsePalOutput.cpp" compile="1" resource="0" file="Source/Processors/PulsePalOutput/PulsePalOutput.cpp"/> - <FILE id="BwbX8M" name="PulsePalOutput.h" compile="0" resource="0" + <FILE id="BwbX8M" name="PulsePalOutput.h" compile="1" resource="0" file="Source/Processors/PulsePalOutput/PulsePalOutput.h"/> <FILE id="U4ISc3" name="PulsePalOutputEditor.cpp" compile="1" resource="0" file="Source/Processors/PulsePalOutput/PulsePalOutputEditor.cpp"/> - <FILE id="ugyMou" name="PulsePalOutputEditor.h" compile="0" resource="0" + <FILE id="ugyMou" name="PulsePalOutputEditor.h" compile="1" resource="0" file="Source/Processors/PulsePalOutput/PulsePalOutputEditor.h"/> </GROUP> <GROUP id="{75D455A6-2354-C8A4-0F0F-EE14C166944C}" name="RecordControl"> - <FILE id="NfBdVb" name="RecordControl.cpp" compile="0" resource="0" + <FILE id="NfBdVb" name="RecordControl.cpp" compile="1" resource="0" file="Source/Processors/RecordControl/RecordControl.cpp"/> - <FILE id="URvuJK" name="RecordControl.h" compile="0" resource="0" file="Source/Processors/RecordControl/RecordControl.h"/> - <FILE id="sovXVI" name="RecordControlEditor.cpp" compile="0" resource="0" + <FILE id="URvuJK" name="RecordControl.h" compile="1" resource="0" file="Source/Processors/RecordControl/RecordControl.h"/> + <FILE id="sovXVI" name="RecordControlEditor.cpp" compile="1" resource="0" file="Source/Processors/RecordControl/RecordControlEditor.cpp"/> - <FILE id="CKRdQf" name="RecordControlEditor.h" compile="0" resource="0" + <FILE id="CKRdQf" name="RecordControlEditor.h" compile="1" resource="0" file="Source/Processors/RecordControl/RecordControlEditor.h"/> </GROUP> <GROUP id="{72D807AC-44A0-1F7A-8699-22225876FE9A}" name="RecordNode"> <FILE id="deQ9TU" name="EngineConfigWindow.cpp" compile="1" resource="0" file="Source/Processors/RecordNode/EngineConfigWindow.cpp"/> - <FILE id="iSAT0P" name="EngineConfigWindow.h" compile="0" resource="0" + <FILE id="iSAT0P" name="EngineConfigWindow.h" compile="1" resource="0" file="Source/Processors/RecordNode/EngineConfigWindow.h"/> <FILE id="gZdszH" name="HDF5FileFormat.cpp" compile="1" resource="0" file="Source/Processors/RecordNode/HDF5FileFormat.cpp"/> - <FILE id="EF7IbH" name="HDF5FileFormat.h" compile="0" resource="0" + <FILE id="EF7IbH" name="HDF5FileFormat.h" compile="1" resource="0" file="Source/Processors/RecordNode/HDF5FileFormat.h"/> <FILE id="dpOVsD" name="HDF5Recording.cpp" compile="1" resource="0" file="Source/Processors/RecordNode/HDF5Recording.cpp"/> - <FILE id="DJgCzN" name="HDF5Recording.h" compile="0" resource="0" file="Source/Processors/RecordNode/HDF5Recording.h"/> + <FILE id="DJgCzN" name="HDF5Recording.h" compile="1" resource="0" file="Source/Processors/RecordNode/HDF5Recording.h"/> <FILE id="dpsAhU" name="OriginalRecording.cpp" compile="1" resource="0" file="Source/Processors/RecordNode/OriginalRecording.cpp"/> - <FILE id="okexpc" name="OriginalRecording.h" compile="0" resource="0" + <FILE id="okexpc" name="OriginalRecording.h" compile="1" resource="0" file="Source/Processors/RecordNode/OriginalRecording.h"/> <FILE id="UU77gU" name="RecordEngine.cpp" compile="1" resource="0" file="Source/Processors/RecordNode/RecordEngine.cpp"/> - <FILE id="NSKXGp" name="RecordEngine.h" compile="0" resource="0" file="Source/Processors/RecordNode/RecordEngine.h"/> + <FILE id="NSKXGp" name="RecordEngine.h" compile="1" resource="0" file="Source/Processors/RecordNode/RecordEngine.h"/> <FILE id="ccpPpJ" name="RecordNode.cpp" compile="1" resource="0" file="Source/Processors/RecordNode/RecordNode.cpp"/> - <FILE id="R9n30e" name="RecordNode.h" compile="0" resource="0" file="Source/Processors/RecordNode/RecordNode.h"/> + <FILE id="R9n30e" name="RecordNode.h" compile="1" resource="0" file="Source/Processors/RecordNode/RecordNode.h"/> </GROUP> <GROUP id="{F022773C-7EE5-9281-45A6-78C55997C4EC}" name="NetworkEvents"> - <FILE id="crJWqD" name="NetworkEventsEditor.cpp" compile="0" resource="0" + <FILE id="crJWqD" name="NetworkEventsEditor.cpp" compile="1" resource="0" file="Source/Processors/Editors/NetworkEventsEditor.cpp"/> - <FILE id="i3MpZ5" name="NetworkEventsEditor.h" compile="0" resource="0" + <FILE id="i3MpZ5" name="NetworkEventsEditor.h" compile="1" resource="0" file="Source/Processors/Editors/NetworkEventsEditor.h"/> - <FILE id="wW0nOT" name="NetworkEvents.cpp" compile="0" resource="0" + <FILE id="wW0nOT" name="NetworkEvents.cpp" compile="1" resource="0" file="Source/Processors/NetworkEvents/NetworkEvents.cpp"/> - <FILE id="LxIosv" name="NetworkEvents.h" compile="0" resource="0" file="Source/Processors/NetworkEvents/NetworkEvents.h"/> + <FILE id="LxIosv" name="NetworkEvents.h" compile="1" resource="0" file="Source/Processors/NetworkEvents/NetworkEvents.h"/> </GROUP> <GROUP id="{273A4CD9-60CE-A6A3-13E9-8BCAF573E024}" name="PSTH"> - <FILE id="Y6TRvD" name="PeriStimulusTimeHistogramEditor.cpp" compile="0" + <FILE id="Y6TRvD" name="PeriStimulusTimeHistogramEditor.cpp" compile="1" resource="0" file="Source/Processors/PSTH/PeriStimulusTimeHistogramEditor.cpp"/> - <FILE id="Z4mUYg" name="PeriStimulusTimeHistogramEditor.h" compile="0" + <FILE id="Z4mUYg" name="PeriStimulusTimeHistogramEditor.h" compile="1" resource="0" file="Source/Processors/PSTH/PeriStimulusTimeHistogramEditor.h"/> - <FILE id="QpvGnH" name="PeriStimulusTimeHistogramNode.cpp" compile="0" + <FILE id="QpvGnH" name="PeriStimulusTimeHistogramNode.cpp" compile="1" resource="0" file="Source/Processors/PSTH/PeriStimulusTimeHistogramNode.cpp"/> - <FILE id="zptezx" name="PeriStimulusTimeHistogramNode.h" compile="0" + <FILE id="zptezx" name="PeriStimulusTimeHistogramNode.h" compile="1" resource="0" file="Source/Processors/PSTH/PeriStimulusTimeHistogramNode.h"/> - <FILE id="t5D2ke" name="tictoc.cpp" compile="0" resource="0" file="Source/Processors/PSTH/tictoc.cpp"/> - <FILE id="Jshr7Y" name="tictoc.h" compile="0" resource="0" file="Source/Processors/PSTH/tictoc.h"/> - <FILE id="hcemDS" name="TrialCircularBuffer.cpp" compile="0" resource="0" + <FILE id="t5D2ke" name="tictoc.cpp" compile="1" resource="0" file="Source/Processors/PSTH/tictoc.cpp"/> + <FILE id="Jshr7Y" name="tictoc.h" compile="1" resource="0" file="Source/Processors/PSTH/tictoc.h"/> + <FILE id="hcemDS" name="TrialCircularBuffer.cpp" compile="1" resource="0" file="Source/Processors/PSTH/TrialCircularBuffer.cpp"/> - <FILE id="fDpocU" name="TrialCircularBuffer.h" compile="0" resource="0" + <FILE id="fDpocU" name="TrialCircularBuffer.h" compile="1" resource="0" file="Source/Processors/PSTH/TrialCircularBuffer.h"/> </GROUP> <GROUP id="{C6F1F354-C97E-128E-9C4E-2376E039F233}" name="ResamplingNode"> <FILE id="yIwQ4b" name="ResamplingNode.cpp" compile="1" resource="0" file="Source/Processors/ResamplingNode/ResamplingNode.cpp"/> - <FILE id="h1zDlH" name="ResamplingNode.h" compile="0" resource="0" + <FILE id="h1zDlH" name="ResamplingNode.h" compile="1" resource="0" file="Source/Processors/ResamplingNode/ResamplingNode.h"/> <FILE id="LByZh0" name="ResamplingNodeEditor.cpp" compile="1" resource="0" file="Source/Processors/ResamplingNode/ResamplingNodeEditor.cpp"/> - <FILE id="UFlCtp" name="ResamplingNodeEditor.h" compile="0" resource="0" + <FILE id="UFlCtp" name="ResamplingNodeEditor.h" compile="1" resource="0" file="Source/Processors/ResamplingNode/ResamplingNodeEditor.h"/> </GROUP> <GROUP id="gFSbZKw" name="Serial"> <FILE id="PHwlqi" name="PulsePal.cpp" compile="1" resource="0" file="Source/Processors/Serial/PulsePal.cpp"/> - <FILE id="R4XRyB" name="PulsePal.h" compile="0" resource="0" file="Source/Processors/Serial/PulsePal.h"/> + <FILE id="R4XRyB" name="PulsePal.h" compile="1" resource="0" file="Source/Processors/Serial/PulsePal.h"/> <FILE id="3t2ez3c" name="ofArduino.cpp" compile="1" resource="0" file="Source/Processors/Serial/ofArduino.cpp"/> - <FILE id="bXASAoT" name="ofArduino.h" compile="0" resource="0" file="Source/Processors/Serial/ofArduino.h"/> - <FILE id="hNTT1i1" name="ofConstants.h" compile="0" resource="0" file="Source/Processors/Serial/ofConstants.h"/> + <FILE id="bXASAoT" name="ofArduino.h" compile="1" resource="0" file="Source/Processors/Serial/ofArduino.h"/> + <FILE id="hNTT1i1" name="ofConstants.h" compile="1" resource="0" file="Source/Processors/Serial/ofConstants.h"/> <FILE id="F97Ylmz" name="ofSerial.cpp" compile="1" resource="0" file="Source/Processors/Serial/ofSerial.cpp"/> - <FILE id="wV1xn3Z" name="ofSerial.h" compile="0" resource="0" file="Source/Processors/Serial/ofSerial.h"/> + <FILE id="wV1xn3Z" name="ofSerial.h" compile="1" resource="0" file="Source/Processors/Serial/ofSerial.h"/> </GROUP> <GROUP id="{C5E76874-E767-D4E0-D8B6-F61DBB446F13}" name="SerialInput"> <FILE id="dWXqU4" name="SerialInput.cpp" compile="1" resource="0" file="Source/Processors/SerialInput/SerialInput.cpp"/> - <FILE id="EReMRm" name="SerialInput.h" compile="0" resource="0" file="Source/Processors/SerialInput/SerialInput.h"/> + <FILE id="EReMRm" name="SerialInput.h" compile="1" resource="0" file="Source/Processors/SerialInput/SerialInput.h"/> <FILE id="Q0XOjv" name="SerialInputEditor.cpp" compile="1" resource="0" file="Source/Processors/SerialInput/SerialInputEditor.cpp"/> - <FILE id="s0Nf1X" name="SerialInputEditor.h" compile="0" resource="0" + <FILE id="s0Nf1X" name="SerialInputEditor.h" compile="1" resource="0" file="Source/Processors/SerialInput/SerialInputEditor.h"/> </GROUP> <GROUP id="{8E9594A3-D2B2-EAA3-9596-89923D59830A}" name="SignalGenerator"> - <FILE id="mywzvE" name="SignalGenerator.cpp" compile="0" resource="0" + <FILE id="mywzvE" name="SignalGenerator.cpp" compile="1" resource="0" file="Source/Processors/SignalGenerator/SignalGenerator.cpp"/> - <FILE id="iaP3u1" name="SignalGenerator.h" compile="0" resource="0" + <FILE id="iaP3u1" name="SignalGenerator.h" compile="1" resource="0" file="Source/Processors/SignalGenerator/SignalGenerator.h"/> - <FILE id="xZoFAy" name="SignalGeneratorEditor.cpp" compile="0" resource="0" + <FILE id="xZoFAy" name="SignalGeneratorEditor.cpp" compile="1" resource="0" file="Source/Processors/SignalGenerator/SignalGeneratorEditor.cpp"/> - <FILE id="svgwwG" name="SignalGeneratorEditor.h" compile="0" resource="0" + <FILE id="svgwwG" name="SignalGeneratorEditor.h" compile="1" resource="0" file="Source/Processors/SignalGenerator/SignalGeneratorEditor.h"/> </GROUP> <GROUP id="{58E5BDC1-3523-0E4D-2402-72726098BA07}" name="SourceNode"> <FILE id="bcB5hN" name="SourceNode.cpp" compile="1" resource="0" file="Source/Processors/SourceNode/SourceNode.cpp"/> - <FILE id="Dyas33" name="SourceNode.h" compile="0" resource="0" file="Source/Processors/SourceNode/SourceNode.h"/> + <FILE id="Dyas33" name="SourceNode.h" compile="1" resource="0" file="Source/Processors/SourceNode/SourceNode.h"/> <FILE id="KQM0Ls" name="SourceNodeEditor.cpp" compile="1" resource="0" file="Source/Processors/SourceNode/SourceNodeEditor.cpp"/> - <FILE id="EWFh9x" name="SourceNodeEditor.h" compile="0" resource="0" + <FILE id="EWFh9x" name="SourceNodeEditor.h" compile="1" resource="0" file="Source/Processors/SourceNode/SourceNodeEditor.h"/> </GROUP> <GROUP id="{B1C68941-4E97-FD8E-00E8-70B1225B3EBD}" name="SpikeDetector"> - <FILE id="LZxTYj" name="SpikeDetector.cpp" compile="0" resource="0" + <FILE id="LZxTYj" name="SpikeDetector.cpp" compile="1" resource="0" file="Source/Processors/SpikeDetector/SpikeDetector.cpp"/> - <FILE id="A4LRql" name="SpikeDetector.h" compile="0" resource="0" file="Source/Processors/SpikeDetector/SpikeDetector.h"/> - <FILE id="dJHC68" name="SpikeDetectorEditor.cpp" compile="0" resource="0" + <FILE id="A4LRql" name="SpikeDetector.h" compile="1" resource="0" file="Source/Processors/SpikeDetector/SpikeDetector.h"/> + <FILE id="dJHC68" name="SpikeDetectorEditor.cpp" compile="1" resource="0" file="Source/Processors/SpikeDetector/SpikeDetectorEditor.cpp"/> - <FILE id="ek762r" name="SpikeDetectorEditor.h" compile="0" resource="0" + <FILE id="ek762r" name="SpikeDetectorEditor.h" compile="1" resource="0" file="Source/Processors/SpikeDetector/SpikeDetectorEditor.h"/> </GROUP> <GROUP id="{3C98FCA3-673A-3E34-ABC6-D506EF05DDD4}" name="SpikeDisplayNode"> <FILE id="Ak6yJU" name="SpikeDisplayCanvas.cpp" compile="1" resource="0" file="Source/Processors/SpikeDisplayNode/SpikeDisplayCanvas.cpp"/> - <FILE id="Ivm1WE" name="SpikeDisplayCanvas.h" compile="0" resource="0" + <FILE id="Ivm1WE" name="SpikeDisplayCanvas.h" compile="1" resource="0" file="Source/Processors/SpikeDisplayNode/SpikeDisplayCanvas.h"/> <FILE id="tzcDUJ" name="SpikeDisplayEditor.cpp" compile="1" resource="0" file="Source/Processors/SpikeDisplayNode/SpikeDisplayEditor.cpp"/> - <FILE id="qpnGQ2" name="SpikeDisplayEditor.h" compile="0" resource="0" + <FILE id="qpnGQ2" name="SpikeDisplayEditor.h" compile="1" resource="0" file="Source/Processors/SpikeDisplayNode/SpikeDisplayEditor.h"/> <FILE id="Osx5Vs" name="SpikeDisplayNode.cpp" compile="1" resource="0" file="Source/Processors/SpikeDisplayNode/SpikeDisplayNode.cpp"/> - <FILE id="EYFdq6" name="SpikeDisplayNode.h" compile="0" resource="0" + <FILE id="EYFdq6" name="SpikeDisplayNode.h" compile="1" resource="0" file="Source/Processors/SpikeDisplayNode/SpikeDisplayNode.h"/> </GROUP> <GROUP id="{B65E315B-E451-52BB-C46B-DFC8CFE52512}" name="SpikeSorter"> - <FILE id="IDfGJU" name="SpikeSortBoxes.cpp" compile="0" resource="0" + <FILE id="IDfGJU" name="SpikeSortBoxes.cpp" compile="1" resource="0" file="Source/Processors/SpikeSorter/SpikeSortBoxes.cpp"/> - <FILE id="oKqHU5" name="SpikeSortBoxes.h" compile="0" resource="0" + <FILE id="oKqHU5" name="SpikeSortBoxes.h" compile="1" resource="0" file="Source/Processors/SpikeSorter/SpikeSortBoxes.h"/> - <FILE id="ZvsSnb" name="SpikeSorter.cpp" compile="0" resource="0" file="Source/Processors/SpikeSorter/SpikeSorter.cpp"/> - <FILE id="iWFZ8N" name="SpikeSorter.h" compile="0" resource="0" file="Source/Processors/SpikeSorter/SpikeSorter.h"/> - <FILE id="AAjUyt" name="SpikeSorterCanvas.cpp" compile="0" resource="0" + <FILE id="ZvsSnb" name="SpikeSorter.cpp" compile="1" resource="0" file="Source/Processors/SpikeSorter/SpikeSorter.cpp"/> + <FILE id="iWFZ8N" name="SpikeSorter.h" compile="1" resource="0" file="Source/Processors/SpikeSorter/SpikeSorter.h"/> + <FILE id="AAjUyt" name="SpikeSorterCanvas.cpp" compile="1" resource="0" file="Source/Processors/SpikeSorter/SpikeSorterCanvas.cpp"/> - <FILE id="vSwtHQ" name="SpikeSorterCanvas.h" compile="0" resource="0" + <FILE id="vSwtHQ" name="SpikeSorterCanvas.h" compile="1" resource="0" file="Source/Processors/SpikeSorter/SpikeSorterCanvas.h"/> - <FILE id="eRXHEt" name="SpikeSorterEditor.cpp" compile="0" resource="0" + <FILE id="eRXHEt" name="SpikeSorterEditor.cpp" compile="1" resource="0" file="Source/Processors/SpikeSorter/SpikeSorterEditor.cpp"/> - <FILE id="seDqmg" name="SpikeSorterEditor.h" compile="0" resource="0" + <FILE id="seDqmg" name="SpikeSorterEditor.h" compile="1" resource="0" file="Source/Processors/SpikeSorter/SpikeSorterEditor.h"/> </GROUP> <GROUP id="{393F8FA9-FA27-4F2D-8252-9AB2CAA871DA}" name="Splitter"> <FILE id="xbkXa2" name="Splitter.cpp" compile="1" resource="0" file="Source/Processors/Splitter/Splitter.cpp"/> - <FILE id="kFiAO3" name="Splitter.h" compile="0" resource="0" file="Source/Processors/Splitter/Splitter.h"/> + <FILE id="kFiAO3" name="Splitter.h" compile="1" resource="0" file="Source/Processors/Splitter/Splitter.h"/> <FILE id="mY47Gn" name="SplitterEditor.cpp" compile="1" resource="0" file="Source/Processors/Splitter/SplitterEditor.cpp"/> - <FILE id="KyMfuL" name="SplitterEditor.h" compile="0" resource="0" + <FILE id="KyMfuL" name="SplitterEditor.h" compile="1" resource="0" file="Source/Processors/Splitter/SplitterEditor.h"/> </GROUP> <GROUP id="W4eqkOy" name="Visualization"> <FILE id="Akiup9" name="Visualizer.cpp" compile="1" resource="0" file="Source/Processors/Visualization/Visualizer.cpp"/> <FILE id="ETLsfY" name="DataWindow.cpp" compile="1" resource="0" file="Source/Processors/Visualization/DataWindow.cpp"/> - <FILE id="qDfeYR" name="DataWindow.h" compile="0" resource="0" file="Source/Processors/Visualization/DataWindow.h"/> + <FILE id="qDfeYR" name="DataWindow.h" compile="1" resource="0" file="Source/Processors/Visualization/DataWindow.h"/> <FILE id="tuQVXY" name="SpikeObject.cpp" compile="1" resource="0" file="Source/Processors/Visualization/SpikeObject.cpp"/> - <FILE id="KyhGmE" name="SpikeObject.h" compile="0" resource="0" file="Source/Processors/Visualization/SpikeObject.h"/> - <FILE id="MsSuwS" name="Visualizer.h" compile="0" resource="0" file="Source/Processors/Visualization/Visualizer.h"/> + <FILE id="KyhGmE" name="SpikeObject.h" compile="1" resource="0" file="Source/Processors/Visualization/SpikeObject.h"/> + <FILE id="MsSuwS" name="Visualizer.h" compile="1" resource="0" file="Source/Processors/Visualization/Visualizer.h"/> <FILE id="KQJVIp" name="MatlabLikePlot.cpp" compile="1" resource="0" file="Source/Processors/Visualization/MatlabLikePlot.cpp"/> - <FILE id="EH2pAq" name="MatlabLikePlot.h" compile="0" resource="0" + <FILE id="EH2pAq" name="MatlabLikePlot.h" compile="1" resource="0" file="Source/Processors/Visualization/MatlabLikePlot.h"/> </GROUP> </GROUP> <GROUP id="RNGb1yR" name="UI"> <FILE id="PBkkUW" name="EcubeDialogComponent.cpp" compile="1" resource="0" file="Source/UI/EcubeDialogComponent.cpp"/> - <FILE id="MFmxar" name="EcubeDialogComponent.h" compile="0" resource="0" + <FILE id="MFmxar" name="EcubeDialogComponent.h" compile="1" resource="0" file="Source/UI/EcubeDialogComponent.h"/> <FILE id="gXswXJ" name="CustomArrowButton.cpp" compile="1" resource="0" file="Source/UI/CustomArrowButton.cpp"/> - <FILE id="ECOEoc" name="CustomArrowButton.h" compile="0" resource="0" + <FILE id="ECOEoc" name="CustomArrowButton.h" compile="1" resource="0" file="Source/UI/CustomArrowButton.h"/> <FILE id="aHMWGl" name="GraphViewer.cpp" compile="1" resource="0" file="Source/UI/GraphViewer.cpp"/> - <FILE id="EOJ8RU" name="GraphViewer.h" compile="0" resource="0" file="Source/UI/GraphViewer.h"/> + <FILE id="EOJ8RU" name="GraphViewer.h" compile="1" resource="0" file="Source/UI/GraphViewer.h"/> <FILE id="sWZ22HN" name="EditorViewportButtons.cpp" compile="1" resource="0" file="Source/UI/EditorViewportButtons.cpp"/> - <FILE id="WwXnCHj" name="EditorViewportButtons.h" compile="0" resource="0" + <FILE id="WwXnCHj" name="EditorViewportButtons.h" compile="1" resource="0" file="Source/UI/EditorViewportButtons.h"/> <FILE id="lPimHJv" name="SignalChainManager.cpp" compile="1" resource="0" file="Source/UI/SignalChainManager.cpp"/> - <FILE id="0PVPDKZ" name="SignalChainManager.h" compile="0" resource="0" + <FILE id="0PVPDKZ" name="SignalChainManager.h" compile="1" resource="0" file="Source/UI/SignalChainManager.h"/> <FILE id="WgUx2Vj" name="EditorViewport.cpp" compile="1" resource="0" file="Source/UI/EditorViewport.cpp"/> - <FILE id="8npqLFq" name="EditorViewport.h" compile="0" resource="0" + <FILE id="8npqLFq" name="EditorViewport.h" compile="1" resource="0" file="Source/UI/EditorViewport.h"/> <FILE id="Rn2yUfU" name="ProcessorList.cpp" compile="1" resource="0" file="Source/UI/ProcessorList.cpp"/> - <FILE id="lOTMfMY" name="ProcessorList.h" compile="0" resource="0" + <FILE id="lOTMfMY" name="ProcessorList.h" compile="1" resource="0" file="Source/UI/ProcessorList.h"/> <FILE id="sxXKhY" name="CustomLookAndFeel.cpp" compile="1" resource="0" file="Source/UI/CustomLookAndFeel.cpp"/> - <FILE id="VLEIXYc" name="CustomLookAndFeel.h" compile="0" resource="0" + <FILE id="VLEIXYc" name="CustomLookAndFeel.h" compile="1" resource="0" file="Source/UI/CustomLookAndFeel.h"/> <FILE id="MuFSLOI" name="InfoLabel.cpp" compile="1" resource="0" file="Source/UI/InfoLabel.cpp"/> - <FILE id="aCcIvXz" name="InfoLabel.h" compile="0" resource="0" file="Source/UI/InfoLabel.h"/> + <FILE id="aCcIvXz" name="InfoLabel.h" compile="1" resource="0" file="Source/UI/InfoLabel.h"/> <FILE id="bWElQSS" name="DataViewport.cpp" compile="1" resource="0" file="Source/UI/DataViewport.cpp"/> - <FILE id="mMoQ3ls" name="DataViewport.h" compile="0" resource="0" file="Source/UI/DataViewport.h"/> + <FILE id="mMoQ3ls" name="DataViewport.h" compile="1" resource="0" file="Source/UI/DataViewport.h"/> <FILE id="we1JIPz" name="ControlPanel.cpp" compile="1" resource="0" file="Source/UI/ControlPanel.cpp"/> - <FILE id="rCft9Ec" name="ControlPanel.h" compile="0" resource="0" file="Source/UI/ControlPanel.h"/> + <FILE id="rCft9Ec" name="ControlPanel.h" compile="1" resource="0" file="Source/UI/ControlPanel.h"/> <FILE id="Ih10hsN" name="UIComponent.cpp" compile="1" resource="0" file="Source/UI/UIComponent.cpp"/> - <FILE id="BMY9oVw" name="UIComponent.h" compile="0" resource="0" file="Source/UI/UIComponent.h"/> + <FILE id="BMY9oVw" name="UIComponent.h" compile="1" resource="0" file="Source/UI/UIComponent.h"/> </GROUP> <FILE id="YFtK48" name="MainWindow.cpp" compile="1" resource="0" file="Source/MainWindow.cpp"/> - <FILE id="JiA1GET" name="MainWindow.h" compile="0" resource="0" file="Source/MainWindow.h"/> + <FILE id="JiA1GET" name="MainWindow.h" compile="1" resource="0" file="Source/MainWindow.h"/> <FILE id="z41Hy7g" name="Main.cpp" compile="1" resource="0" file="Source/Main.cpp"/> </GROUP> </MAINGROUP> -- GitLab