From 6cd2d6ee26d05f9b2af4206466981d15ba795db7 Mon Sep 17 00:00:00 2001 From: jvoigts <jvoigts@mit.edu> Date: Wed, 19 Jun 2013 17:04:22 -0400 Subject: [PATCH] Initial commit Lfp Trig. Avg Scaffold no functionality, just cloned the Lfp display --- Builds/Linux/Makefile | 18 + .../open-ephys.xcodeproj/project.pbxproj | 36 +- Builds/VisualStudio2010/open-ephys.vcxproj | 6 + .../open-ephys.vcxproj.filters | 18 + Builds/VisualStudio2012/open-ephys.vcxproj | 6 + .../open-ephys.vcxproj.filters | 18 + JuceLibraryCode/BinaryData.cpp | 244 ++-- .../Editors/LfpTriggeredAverageEditor.cpp | 65 + .../Editors/LfpTriggeredAverageEditor.h | 63 + Source/Processors/LfpTriggeredAverageNode.cpp | 325 +++++ Source/Processors/LfpTriggeredAverageNode.h | 109 ++ Source/Processors/ProcessorGraph.cpp | 7 + .../LfpTriggeredAverageCanvas.cpp | 1165 +++++++++++++++++ .../Visualization/LfpTriggeredAverageCanvas.h | 294 +++++ Source/UI/ProcessorList.cpp | 1 + open-ephys.jucer | 12 + 16 files changed, 2256 insertions(+), 131 deletions(-) create mode 100755 Source/Processors/Editors/LfpTriggeredAverageEditor.cpp create mode 100755 Source/Processors/Editors/LfpTriggeredAverageEditor.h create mode 100755 Source/Processors/LfpTriggeredAverageNode.cpp create mode 100755 Source/Processors/LfpTriggeredAverageNode.h create mode 100755 Source/Processors/Visualization/LfpTriggeredAverageCanvas.cpp create mode 100755 Source/Processors/Visualization/LfpTriggeredAverageCanvas.h diff --git a/Builds/Linux/Makefile b/Builds/Linux/Makefile index 2ed899ec5..91537484f 100644 --- a/Builds/Linux/Makefile +++ b/Builds/Linux/Makefile @@ -63,6 +63,7 @@ OBJECTS := \ $(OBJDIR)/RootFinder_239a995f.o \ $(OBJDIR)/State_22979684.o \ $(OBJDIR)/AudioComponent_521bd9c9.o \ + $(OBJDIR)/LfpTriggeredAverageNode_ff52d7b9.o \ $(OBJDIR)/FileReader_18023b0e.o \ $(OBJDIR)/ChannelMappingNode_d9219b9c.o \ $(OBJDIR)/PulsePalOutput_9f4ef492.o \ @@ -83,6 +84,7 @@ OBJECTS := \ $(OBJDIR)/RecordControl_3e1c6062.o \ $(OBJDIR)/Merger_2f90542e.o \ $(OBJDIR)/Splitter_6e27a57b.o \ + $(OBJDIR)/LfpTriggeredAverageCanvas_50148944.o \ $(OBJDIR)/SpikeObject_24e8c655.o \ $(OBJDIR)/SpikeDisplayCanvas_b208ff6e.o \ $(OBJDIR)/DataWindow_83ce6754.o \ @@ -91,6 +93,7 @@ OBJECTS := \ $(OBJDIR)/SpikeDetector_300d85e7.o \ $(OBJDIR)/AudioNode_94606ff3.o \ $(OBJDIR)/EventNode_95c842b7.o \ + $(OBJDIR)/LfpTriggeredAverageEditor_101d75b.o \ $(OBJDIR)/ChannelMappingEditor_dd803b0.o \ $(OBJDIR)/FileReaderEditor_16fd7744.o \ $(OBJDIR)/PhaseDetectorEditor_f53aa520.o \ @@ -281,6 +284,11 @@ $(OBJDIR)/AudioComponent_521bd9c9.o: ../../Source/Audio/AudioComponent.cpp @echo "Compiling AudioComponent.cpp" @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" +$(OBJDIR)/LfpTriggeredAverageNode_ff52d7b9.o: ../../Source/Processors/LfpTriggeredAverageNode.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling LfpTriggeredAverageNode.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + $(OBJDIR)/FileReader_18023b0e.o: ../../Source/Processors/FileReader.cpp -@mkdir -p $(OBJDIR) @echo "Compiling FileReader.cpp" @@ -381,6 +389,11 @@ $(OBJDIR)/Splitter_6e27a57b.o: ../../Source/Processors/Utilities/Splitter.cpp @echo "Compiling Splitter.cpp" @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" +$(OBJDIR)/LfpTriggeredAverageCanvas_50148944.o: ../../Source/Processors/Visualization/LfpTriggeredAverageCanvas.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling LfpTriggeredAverageCanvas.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + $(OBJDIR)/SpikeObject_24e8c655.o: ../../Source/Processors/Visualization/SpikeObject.cpp -@mkdir -p $(OBJDIR) @echo "Compiling SpikeObject.cpp" @@ -421,6 +434,11 @@ $(OBJDIR)/EventNode_95c842b7.o: ../../Source/Processors/EventNode.cpp @echo "Compiling EventNode.cpp" @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" +$(OBJDIR)/LfpTriggeredAverageEditor_101d75b.o: ../../Source/Processors/Editors/LfpTriggeredAverageEditor.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling LfpTriggeredAverageEditor.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + $(OBJDIR)/ChannelMappingEditor_dd803b0.o: ../../Source/Processors/Editors/ChannelMappingEditor.cpp -@mkdir -p $(OBJDIR) @echo "Compiling ChannelMappingEditor.cpp" diff --git a/Builds/MacOSX/open-ephys.xcodeproj/project.pbxproj b/Builds/MacOSX/open-ephys.xcodeproj/project.pbxproj index f82948712..2ab804390 100644 --- a/Builds/MacOSX/open-ephys.xcodeproj/project.pbxproj +++ b/Builds/MacOSX/open-ephys.xcodeproj/project.pbxproj @@ -41,6 +41,7 @@ AE06672D2CBF8F64465B2126 = { isa = PBXBuildFile; fileRef = 3F69480D6145C77992FA59BA; }; 69630D3ECA4D6014EE3734CD = { isa = PBXBuildFile; fileRef = C1CB526B75E406851FA918C6; }; 0AE243437B40602D35435C32 = { isa = PBXBuildFile; fileRef = B04D87ED6AA4897B6CD3CCF6; }; + A2969F0562F47DEF11181DF0 = { isa = PBXBuildFile; fileRef = FD30B010D9F45E5ACC7A7096; }; F25EC78DCCC9CCEE805AE011 = { isa = PBXBuildFile; fileRef = 9215DC26F511C58DEE009209; }; EA6A1BDDF81818D516B93DD6 = { isa = PBXBuildFile; fileRef = 5654BDD4FBFF01AC3F17FA0D; }; 7077270005BA819E3D5654B5 = { isa = PBXBuildFile; fileRef = DBB295F412798131D3F04045; }; @@ -61,6 +62,7 @@ E4DA638CDD4DD574A6CD843E = { isa = PBXBuildFile; fileRef = 258938780F93A7CF41366F26; }; 2B4A80DCF867DC025C21966B = { isa = PBXBuildFile; fileRef = 4867923F31CC3EDC9B1A5BE5; }; D0E9E20F9D8FDA700BB6D820 = { isa = PBXBuildFile; fileRef = 2C4730CAFED4F6292B575318; }; + 7A74EFD7EF20C9D185DBD9FA = { isa = PBXBuildFile; fileRef = 2AC957BA2C6BE4A7678FCA50; }; 19BB86C918F89D1377F8A0E1 = { isa = PBXBuildFile; fileRef = 5894D40A0E8FA6E9B3EBF9D9; }; EE56A6BBBFA4A27A4BCF7279 = { isa = PBXBuildFile; fileRef = A7D4C9E3ED3763847C087F46; }; 1B620FC17AAECA4C5DE741E2 = { isa = PBXBuildFile; fileRef = 66463AB11EA4D6341C32F27E; }; @@ -69,6 +71,7 @@ ED8CB527B27C67E9E4DA027C = { isa = PBXBuildFile; fileRef = BC3B7E4E25505D9044BFACC7; }; DE758AF46844DF951655966C = { isa = PBXBuildFile; fileRef = B27F558F42AC78F0E564B5AF; }; 80E5365461A5A7A32C48C563 = { isa = PBXBuildFile; fileRef = F94DD42C7BBF81C101D3F605; }; + DD77A0AB68C932F294B753C2 = { isa = PBXBuildFile; fileRef = 7B7819A5759B54D91E334447; }; 52E0D9DC7F5C4703257D8BEB = { isa = PBXBuildFile; fileRef = B083B1375828610D55F12CF3; }; EA46BA3970E958013FF85690 = { isa = PBXBuildFile; fileRef = 4B0097003751A59A11FA8C5B; }; 88B896EB9793E0C44410D981 = { isa = PBXBuildFile; fileRef = 75B1E4EFCDA9A506CFEDB09F; }; @@ -280,6 +283,7 @@ 215B159836CE40810964B773 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Uuid.h"; path = "../../JuceLibraryCode/modules/juce_core/misc/juce_Uuid.h"; sourceTree = "SOURCE_ROOT"; }; 215E1BD79B5870D5356810F0 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Visualizer.h; path = ../../Source/Processors/Visualization/Visualizer.h; sourceTree = "SOURCE_ROOT"; }; 217032322A2570ABAC47194C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Image.h"; path = "../../JuceLibraryCode/modules/juce_graphics/images/juce_Image.h"; sourceTree = "SOURCE_ROOT"; }; + 2196ED9DD4262C60135E77F5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = LfpTriggeredAverageEditor.h; path = ../../Source/Processors/Editors/LfpTriggeredAverageEditor.h; sourceTree = "SOURCE_ROOT"; }; 21A0260D2DB039B81DF4970C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileSearchPath.cpp"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_FileSearchPath.cpp"; sourceTree = "SOURCE_ROOT"; }; 21C11A58CAA0F9E86AA204EC = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Slider.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Slider.h"; sourceTree = "SOURCE_ROOT"; }; 21D3C1095D2B5A834D998B74 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_OpenSL.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_android_OpenSL.cpp"; sourceTree = "SOURCE_ROOT"; }; @@ -319,6 +323,7 @@ 29FD7B383C5DDACAA7B8DFD3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = MergerEditor.cpp; path = ../../Source/Processors/Editors/MergerEditor.cpp; sourceTree = "SOURCE_ROOT"; }; 2A3230DEAAC86A9090950703 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Path.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_Path.cpp"; sourceTree = "SOURCE_ROOT"; }; 2AB1CC4252DB09507ED31482 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Application.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/application/juce_Application.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2AC957BA2C6BE4A7678FCA50 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = LfpTriggeredAverageCanvas.cpp; path = ../../Source/Processors/Visualization/LfpTriggeredAverageCanvas.cpp; sourceTree = "SOURCE_ROOT"; }; 2AE12F85965B8BE4A0E12F67 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PropertiesFile.h"; path = "../../JuceLibraryCode/modules/juce_data_structures/app_properties/juce_PropertiesFile.h"; sourceTree = "SOURCE_ROOT"; }; 2B134713E91426120A994CB7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Random.cpp"; path = "../../JuceLibraryCode/modules/juce_core/maths/juce_Random.cpp"; sourceTree = "SOURCE_ROOT"; }; 2B19F2DE42A91F56C2380F9A = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Expression.cpp"; path = "../../JuceLibraryCode/modules/juce_core/maths/juce_Expression.cpp"; sourceTree = "SOURCE_ROOT"; }; @@ -407,6 +412,7 @@ 3FFD5E5D5C1D8B48DBBB9D18 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Result.cpp"; path = "../../JuceLibraryCode/modules/juce_core/misc/juce_Result.cpp"; sourceTree = "SOURCE_ROOT"; }; 402BC572EE3E8EC418946CE0 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioTransportSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioTransportSource.h"; sourceTree = "SOURCE_ROOT"; }; 405298E6CE1C80EC7CC43A87 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileTreeComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 4061311AF3F3487DD3995871 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = LfpTriggeredAverageNode.h; path = ../../Source/Processors/LfpTriggeredAverageNode.h; sourceTree = "SOURCE_ROOT"; }; 40C22F3CD61DDB9C7B3DCCA6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_KeyListener.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyListener.h"; sourceTree = "SOURCE_ROOT"; }; 4133FE7830C52BBA035D82B8 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TimeSliceThread.cpp"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_TimeSliceThread.cpp"; sourceTree = "SOURCE_ROOT"; }; 414D8E6E4EE98E66C2583A50 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TextPropertyComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; @@ -669,6 +675,7 @@ 7ACB1CB66D69738904358F43 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Design.h; path = ../../Source/Dsp/Design.h; sourceTree = "SOURCE_ROOT"; }; 7B42B28FDB2E3AC67EF296F8 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PracticalSocket.h; path = ../../Source/Network/PracticalSocket.h; sourceTree = "SOURCE_ROOT"; }; 7B674BB1DA11A4E58EA71624 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_EdgeTable.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_EdgeTable.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7B7819A5759B54D91E334447 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = LfpTriggeredAverageEditor.cpp; path = ../../Source/Processors/Editors/LfpTriggeredAverageEditor.cpp; sourceTree = "SOURCE_ROOT"; }; 7BCE1C09508E1B9CFC79C185 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CaretComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; 7BD2C39F13FDE202141C4B41 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = MessageCenter.cpp; path = ../../Source/UI/MessageCenter.cpp; sourceTree = "SOURCE_ROOT"; }; 7BE7EBBCC4DCF760A1AA697E = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DirectoryContentsList.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h"; sourceTree = "SOURCE_ROOT"; }; @@ -788,6 +795,7 @@ 92E07CA13571893873565AC7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SplashScreen.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_SplashScreen.cpp"; sourceTree = "SOURCE_ROOT"; }; 92E3405CB31ACFE3F80BBAD4 = { isa = PBXFileReference; lastKnownFileType = image.png; name = OpenEphysBoardLogoBlack.png; path = ../../Resources/Images/Icons/OpenEphysBoardLogoBlack.png; sourceTree = "SOURCE_ROOT"; }; 92EC6BB8A8C4C5A61F43C233 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ToggleButton.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToggleButton.h"; sourceTree = "SOURCE_ROOT"; }; + 932577DC3232F4576A87F063 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = LfpTriggeredAverageCanvas.h; path = ../../Source/Processors/Visualization/LfpTriggeredAverageCanvas.h; sourceTree = "SOURCE_ROOT"; }; 9360657FDE33FA37D80075D1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_InterprocessConnection.cpp"; path = "../../JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnection.cpp"; sourceTree = "SOURCE_ROOT"; }; 9380932BED279F91B8C1C04B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Rectangle.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_Rectangle.h"; sourceTree = "SOURCE_ROOT"; }; 93EFC1AA800FC5DA2F04A213 = { isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons_neutral-04.png"; path = "../../Resources/Images/Icons/RadioButtons_neutral-04.png"; sourceTree = "SOURCE_ROOT"; }; @@ -1189,40 +1197,40 @@ ECCE033FF2ACE42188FA4A7F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TemporaryFile.h"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_TemporaryFile.h"; sourceTree = "SOURCE_ROOT"; }; ECE3BE71EB6B9CF1CE869BBE = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BubbleComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/misc/juce_BubbleComponent.h"; sourceTree = "SOURCE_ROOT"; }; ED86166920362E9D2BE2CB26 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SVGParser.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_SVGParser.cpp"; sourceTree = "SOURCE_ROOT"; }; + ED887A521EEB8F3EBA7DDB31 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioIODeviceType.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h"; sourceTree = "SOURCE_ROOT"; }; EDA209B0E7D124EA581023AD = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioFormatManager.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatManager.h"; sourceTree = "SOURCE_ROOT"; }; EDAC82BD742A54182E8DF2FE = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RelativeCoordinatePositioner.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h"; sourceTree = "SOURCE_ROOT"; }; EE0336B43A39FD585DF638EE = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ResizableEdgeComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; EE2C669B127D00C86B1B8CA8 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Registry.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_win32_Registry.cpp"; sourceTree = "SOURCE_ROOT"; }; EE4DD055D31F7D9DC718DBD8 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComponentMovementWatcher.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h"; sourceTree = "SOURCE_ROOT"; }; EEA51B7EF1CF19028C6672E0 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DocumentWindow.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_DocumentWindow.cpp"; sourceTree = "SOURCE_ROOT"; }; - EEFC66D2DF5FD66B4D83B22F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Component.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.h"; sourceTree = "SOURCE_ROOT"; }; - EF059B26886B32000BCF8CFF = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MouseInputSource.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInputSource.h"; sourceTree = "SOURCE_ROOT"; }; EF3F9AA8D70E1D4D55F13182 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioThumbnail.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp"; sourceTree = "SOURCE_ROOT"; }; + EF4A6E0E1232071252ACCD7B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RelativeParallelogram.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h"; sourceTree = "SOURCE_ROOT"; }; EF610B2A17D9B1C0D24DCE67 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_android_JNIHelpers.h"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_android_JNIHelpers.h"; sourceTree = "SOURCE_ROOT"; }; + EF7B66764093D950724EFE70 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGLShaderProgram.h"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLShaderProgram.h"; sourceTree = "SOURCE_ROOT"; }; + EF8488936B3D3E9178C9099C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PulsePalOutput.h; path = ../../Source/Processors/PulsePalOutput.h; sourceTree = "SOURCE_ROOT"; }; F09FD6D9CA4997216ADBF54F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = DataBuffer.h; path = ../../Source/Processors/DataThreads/DataBuffer.h; sourceTree = "SOURCE_ROOT"; }; F0F3834D46EA8FC8ADB206DB = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AbstractFifo.cpp"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.cpp"; sourceTree = "SOURCE_ROOT"; }; F17DF27524262A21A3EC932D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PluginListComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; F1A3975235880CAC1D5757F4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MP3AudioFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; F230A4C0186379F9EB0B0F74 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ReferenceNode.h; path = ../../Source/Processors/ReferenceNode.h; sourceTree = "SOURCE_ROOT"; }; - F28414731D9EE1F75D7B7043 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.h"; sourceTree = "SOURCE_ROOT"; }; - F2F11D7C596DAE5579610CCC = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_AudioCDReader.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDReader.cpp"; sourceTree = "SOURCE_ROOT"; }; - F2FDC07162CAEDE524F09CFC = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = OpenGLCanvas.cpp; path = ../../Source/Processors/Visualization/OpenGLCanvas.cpp; sourceTree = "SOURCE_ROOT"; }; F5A00ACFA3D76168F22F1205 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; 99E1BC08B886CFDD2CCFD462 = { isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "open-ephys.app"; sourceTree = "BUILT_PRODUCTS_DIR"; }; EBD8622EAEF10558809888B7 = { isa = PBXFileReference; lastKnownFileType = image.png; name = "RadioButtons_selected_over-01.png"; path = "../../Resources/Images/Icons/RadioButtons_selected_over-01.png"; sourceTree = "SOURCE_ROOT"; }; EC95A2CF4B33EA37DA5FC1AC = { isa = PBXFileReference; lastKnownFileType = file.ttf; name = nordic.ttf; path = ../../Resources/Fonts/nordic.ttf; sourceTree = "SOURCE_ROOT"; }; - ED887A521EEB8F3EBA7DDB31 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioIODeviceType.h"; path = "../../JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h"; sourceTree = "SOURCE_ROOT"; }; - EF4A6E0E1232071252ACCD7B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RelativeParallelogram.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h"; sourceTree = "SOURCE_ROOT"; }; - EF7B66764093D950724EFE70 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OpenGLShaderProgram.h"; path = "../../JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLShaderProgram.h"; sourceTree = "SOURCE_ROOT"; }; - EF8488936B3D3E9178C9099C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PulsePalOutput.h; path = ../../Source/Processors/PulsePalOutput.h; sourceTree = "SOURCE_ROOT"; }; + EEFC66D2DF5FD66B4D83B22F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Component.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.h"; sourceTree = "SOURCE_ROOT"; }; + EF059B26886B32000BCF8CFF = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MouseInputSource.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInputSource.h"; sourceTree = "SOURCE_ROOT"; }; EFC21F3CD0EB87D67E044E06 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MenuBarComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarComponent.h"; sourceTree = "SOURCE_ROOT"; }; F0CA3600E09054D7DB3B0067 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SmoothedFilter.h; path = ../../Source/Dsp/SmoothedFilter.h; sourceTree = "SOURCE_ROOT"; }; F0D9A28C206D7A8BA7089D29 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_KeyMappingEditorComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.h"; sourceTree = "SOURCE_ROOT"; }; F1099BFF0BC1656A23D62E84 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ScrollBar.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ScrollBar.cpp"; sourceTree = "SOURCE_ROOT"; }; F10FB240E10A5742CE366A91 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TabbedButtonBar.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedButtonBar.h"; sourceTree = "SOURCE_ROOT"; }; F1DBAE92084D9D90234AC436 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioSourcePlayer.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp"; sourceTree = "SOURCE_ROOT"; }; + F28414731D9EE1F75D7B7043 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.h"; sourceTree = "SOURCE_ROOT"; }; F2A500BA3500C4A9D5792A54 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawableImage.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableImage.h"; sourceTree = "SOURCE_ROOT"; }; F2EDB88302B8A9356F43B834 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Primes.h"; path = "../../JuceLibraryCode/modules/juce_cryptography/encryption/juce_Primes.h"; sourceTree = "SOURCE_ROOT"; }; + F2F11D7C596DAE5579610CCC = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_AudioCDReader.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDReader.cpp"; sourceTree = "SOURCE_ROOT"; }; + F2FDC07162CAEDE524F09CFC = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = OpenGLCanvas.cpp; path = ../../Source/Processors/Visualization/OpenGLCanvas.cpp; sourceTree = "SOURCE_ROOT"; }; F3D0224E4247BCB06A9E4DDF = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_KeyPressMappingSet.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp"; sourceTree = "SOURCE_ROOT"; }; F3F48717927A4E24F7373C09 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_NamedValueSet.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_NamedValueSet.h"; sourceTree = "SOURCE_ROOT"; }; F463A19E6EFEB2837582B117 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_audio_processors.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.h"; sourceTree = "SOURCE_ROOT"; }; @@ -1254,6 +1262,7 @@ FC080F7DF94ABCB7EA09224A = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Colour.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/colour/juce_Colour.cpp"; sourceTree = "SOURCE_ROOT"; }; FC85D30C66E7A4E4A6CA29AE = { isa = PBXFileReference; lastKnownFileType = file.otf; name = "cpmono_bold.otf"; path = "../../Resources/Fonts/cpmono_bold.otf"; sourceTree = "SOURCE_ROOT"; }; FC887C6CD74FE33F8BA784A6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MergerEditor.h; path = ../../Source/Processors/Editors/MergerEditor.h; sourceTree = "SOURCE_ROOT"; }; + FD30B010D9F45E5ACC7A7096 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = LfpTriggeredAverageNode.cpp; path = ../../Source/Processors/LfpTriggeredAverageNode.cpp; sourceTree = "SOURCE_ROOT"; }; FD3A6BD3A8898E137DF257B9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativeParallelogram.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.cpp"; sourceTree = "SOURCE_ROOT"; }; FD770E73FD462E9C9F6DBFB2 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PositionableAudioSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_PositionableAudioSource.h"; sourceTree = "SOURCE_ROOT"; }; FD88DA941838FC91D222DF35 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RecentlyOpenedFilesList.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.h"; sourceTree = "SOURCE_ROOT"; }; @@ -1400,6 +1409,8 @@ 2C4730CAFED4F6292B575318, B1082A8A306A1947F5B0E5FC ); name = Utilities; sourceTree = "<group>"; }; C4B85C0286AC2510730355E3 = { isa = PBXGroup; children = ( + 2AC957BA2C6BE4A7678FCA50, + 932577DC3232F4576A87F063, 5894D40A0E8FA6E9B3EBF9D9, ADCB42E4C5641007A4B78025, A7D4C9E3ED3763847C087F46, @@ -1412,6 +1423,8 @@ F2FDC07162CAEDE524F09CFC, DA4A6BD7079F2BC73B5035F3 ); name = Visualization; sourceTree = "<group>"; }; 9F16043BF599BCE0C02A00A5 = { isa = PBXGroup; children = ( + 7B7819A5759B54D91E334447, + 2196ED9DD4262C60135E77F5, B083B1375828610D55F12CF3, E442E1FA7B58BFF6F1D8CBD8, 4B0097003751A59A11FA8C5B, @@ -1488,6 +1501,8 @@ 92602D7166325C7232B85EDD, 0287B009511521BEAAE8A52C ); name = DataThreads; sourceTree = "<group>"; }; 83A3E005DDFCC55F277EEDA5 = { isa = PBXGroup; children = ( + FD30B010D9F45E5ACC7A7096, + 4061311AF3F3487DD3995871, 9215DC26F511C58DEE009209, FB071D0659E5F1CC630D765A, 5654BDD4FBFF01AC3F17FA0D, @@ -2734,6 +2749,7 @@ AE06672D2CBF8F64465B2126, 69630D3ECA4D6014EE3734CD, 0AE243437B40602D35435C32, + A2969F0562F47DEF11181DF0, F25EC78DCCC9CCEE805AE011, EA6A1BDDF81818D516B93DD6, 7077270005BA819E3D5654B5, @@ -2754,6 +2770,7 @@ E4DA638CDD4DD574A6CD843E, 2B4A80DCF867DC025C21966B, D0E9E20F9D8FDA700BB6D820, + 7A74EFD7EF20C9D185DBD9FA, 19BB86C918F89D1377F8A0E1, EE56A6BBBFA4A27A4BCF7279, 1B620FC17AAECA4C5DE741E2, @@ -2762,6 +2779,7 @@ ED8CB527B27C67E9E4DA027C, DE758AF46844DF951655966C, 80E5365461A5A7A32C48C563, + DD77A0AB68C932F294B753C2, 52E0D9DC7F5C4703257D8BEB, EA46BA3970E958013FF85690, 88B896EB9793E0C44410D981, diff --git a/Builds/VisualStudio2010/open-ephys.vcxproj b/Builds/VisualStudio2010/open-ephys.vcxproj index eb4b9eded..f2007e432 100644 --- a/Builds/VisualStudio2010/open-ephys.vcxproj +++ b/Builds/VisualStudio2010/open-ephys.vcxproj @@ -147,6 +147,7 @@ <ClCompile Include="..\..\Source\Dsp\RootFinder.cpp"/> <ClCompile Include="..\..\Source\Dsp\State.cpp"/> <ClCompile Include="..\..\Source\Audio\AudioComponent.cpp"/> + <ClCompile Include="..\..\Source\Processors\LfpTriggeredAverageNode.cpp"/> <ClCompile Include="..\..\Source\Processors\FileReader.cpp"/> <ClCompile Include="..\..\Source\Processors\ChannelMappingNode.cpp"/> <ClCompile Include="..\..\Source\Processors\PulsePalOutput.cpp"/> @@ -167,6 +168,7 @@ <ClCompile Include="..\..\Source\Processors\Utilities\RecordControl.cpp"/> <ClCompile Include="..\..\Source\Processors\Utilities\Merger.cpp"/> <ClCompile Include="..\..\Source\Processors\Utilities\Splitter.cpp"/> + <ClCompile Include="..\..\Source\Processors\Visualization\LfpTriggeredAverageCanvas.cpp"/> <ClCompile Include="..\..\Source\Processors\Visualization\SpikeObject.cpp"/> <ClCompile Include="..\..\Source\Processors\Visualization\SpikeDisplayCanvas.cpp"/> <ClCompile Include="..\..\Source\Processors\Visualization\DataWindow.cpp"/> @@ -175,6 +177,7 @@ <ClCompile Include="..\..\Source\Processors\SpikeDetector.cpp"/> <ClCompile Include="..\..\Source\Processors\AudioNode.cpp"/> <ClCompile Include="..\..\Source\Processors\EventNode.cpp"/> + <ClCompile Include="..\..\Source\Processors\Editors\LfpTriggeredAverageEditor.cpp"/> <ClCompile Include="..\..\Source\Processors\Editors\ChannelMappingEditor.cpp"/> <ClCompile Include="..\..\Source\Processors\Editors\FileReaderEditor.cpp"/> <ClCompile Include="..\..\Source\Processors\Editors\PhaseDetectorEditor.cpp"/> @@ -1329,6 +1332,7 @@ <ClInclude Include="..\..\Source\Dsp\Types.h"/> <ClInclude Include="..\..\Source\Dsp\Utilities.h"/> <ClInclude Include="..\..\Source\Audio\AudioComponent.h"/> + <ClInclude Include="..\..\Source\Processors\LfpTriggeredAverageNode.h"/> <ClInclude Include="..\..\Source\Processors\FileReader.h"/> <ClInclude Include="..\..\Source\Processors\ChannelMappingNode.h"/> <ClInclude Include="..\..\Source\Processors\PulsePalOutput.h"/> @@ -1350,6 +1354,7 @@ <ClInclude Include="..\..\Source\Processors\Utilities\RecordControl.h"/> <ClInclude Include="..\..\Source\Processors\Utilities\Merger.h"/> <ClInclude Include="..\..\Source\Processors\Utilities\Splitter.h"/> + <ClInclude Include="..\..\Source\Processors\Visualization\LfpTriggeredAverageCanvas.h"/> <ClInclude Include="..\..\Source\Processors\Visualization\SpikeObject.h"/> <ClInclude Include="..\..\Source\Processors\Visualization\SpikeDisplayCanvas.h"/> <ClInclude Include="..\..\Source\Processors\Visualization\Visualizer.h"/> @@ -1359,6 +1364,7 @@ <ClInclude Include="..\..\Source\Processors\SpikeDetector.h"/> <ClInclude Include="..\..\Source\Processors\AudioNode.h"/> <ClInclude Include="..\..\Source\Processors\EventNode.h"/> + <ClInclude Include="..\..\Source\Processors\Editors\LfpTriggeredAverageEditor.h"/> <ClInclude Include="..\..\Source\Processors\Editors\ChannelMappingEditor.h"/> <ClInclude Include="..\..\Source\Processors\Editors\FileReaderEditor.h"/> <ClInclude Include="..\..\Source\Processors\Editors\PhaseDetectorEditor.h"/> diff --git a/Builds/VisualStudio2010/open-ephys.vcxproj.filters b/Builds/VisualStudio2010/open-ephys.vcxproj.filters index d3b246777..eb4fd3085 100644 --- a/Builds/VisualStudio2010/open-ephys.vcxproj.filters +++ b/Builds/VisualStudio2010/open-ephys.vcxproj.filters @@ -415,6 +415,9 @@ <ClCompile Include="..\..\Source\Audio\AudioComponent.cpp"> <Filter>open-ephys\Source\Audio</Filter> </ClCompile> + <ClCompile Include="..\..\Source\Processors\LfpTriggeredAverageNode.cpp"> + <Filter>open-ephys\Source\Processors</Filter> + </ClCompile> <ClCompile Include="..\..\Source\Processors\FileReader.cpp"> <Filter>open-ephys\Source\Processors</Filter> </ClCompile> @@ -475,6 +478,9 @@ <ClCompile Include="..\..\Source\Processors\Utilities\Splitter.cpp"> <Filter>open-ephys\Source\Processors\Utilities</Filter> </ClCompile> + <ClCompile Include="..\..\Source\Processors\Visualization\LfpTriggeredAverageCanvas.cpp"> + <Filter>open-ephys\Source\Processors\Visualization</Filter> + </ClCompile> <ClCompile Include="..\..\Source\Processors\Visualization\SpikeObject.cpp"> <Filter>open-ephys\Source\Processors\Visualization</Filter> </ClCompile> @@ -499,6 +505,9 @@ <ClCompile Include="..\..\Source\Processors\EventNode.cpp"> <Filter>open-ephys\Source\Processors</Filter> </ClCompile> + <ClCompile Include="..\..\Source\Processors\Editors\LfpTriggeredAverageEditor.cpp"> + <Filter>open-ephys\Source\Processors\Editors</Filter> + </ClCompile> <ClCompile Include="..\..\Source\Processors\Editors\ChannelMappingEditor.cpp"> <Filter>open-ephys\Source\Processors\Editors</Filter> </ClCompile> @@ -1920,6 +1929,9 @@ <ClInclude Include="..\..\Source\Audio\AudioComponent.h"> <Filter>open-ephys\Source\Audio</Filter> </ClInclude> + <ClInclude Include="..\..\Source\Processors\LfpTriggeredAverageNode.h"> + <Filter>open-ephys\Source\Processors</Filter> + </ClInclude> <ClInclude Include="..\..\Source\Processors\FileReader.h"> <Filter>open-ephys\Source\Processors</Filter> </ClInclude> @@ -1983,6 +1995,9 @@ <ClInclude Include="..\..\Source\Processors\Utilities\Splitter.h"> <Filter>open-ephys\Source\Processors\Utilities</Filter> </ClInclude> + <ClInclude Include="..\..\Source\Processors\Visualization\LfpTriggeredAverageCanvas.h"> + <Filter>open-ephys\Source\Processors\Visualization</Filter> + </ClInclude> <ClInclude Include="..\..\Source\Processors\Visualization\SpikeObject.h"> <Filter>open-ephys\Source\Processors\Visualization</Filter> </ClInclude> @@ -2010,6 +2025,9 @@ <ClInclude Include="..\..\Source\Processors\EventNode.h"> <Filter>open-ephys\Source\Processors</Filter> </ClInclude> + <ClInclude Include="..\..\Source\Processors\Editors\LfpTriggeredAverageEditor.h"> + <Filter>open-ephys\Source\Processors\Editors</Filter> + </ClInclude> <ClInclude Include="..\..\Source\Processors\Editors\ChannelMappingEditor.h"> <Filter>open-ephys\Source\Processors\Editors</Filter> </ClInclude> diff --git a/Builds/VisualStudio2012/open-ephys.vcxproj b/Builds/VisualStudio2012/open-ephys.vcxproj index ecb819029..35644804d 100644 --- a/Builds/VisualStudio2012/open-ephys.vcxproj +++ b/Builds/VisualStudio2012/open-ephys.vcxproj @@ -163,6 +163,7 @@ <ClCompile Include="..\..\Source\Dsp\RootFinder.cpp"/> <ClCompile Include="..\..\Source\Dsp\State.cpp"/> <ClCompile Include="..\..\Source\Audio\AudioComponent.cpp"/> + <ClCompile Include="..\..\Source\Processors\LfpTriggeredAverageNode.cpp"/> <ClCompile Include="..\..\Source\Processors\FileReader.cpp"/> <ClCompile Include="..\..\Source\Processors\ChannelMappingNode.cpp"/> <ClCompile Include="..\..\Source\Processors\PulsePalOutput.cpp"/> @@ -183,6 +184,7 @@ <ClCompile Include="..\..\Source\Processors\Utilities\RecordControl.cpp"/> <ClCompile Include="..\..\Source\Processors\Utilities\Merger.cpp"/> <ClCompile Include="..\..\Source\Processors\Utilities\Splitter.cpp"/> + <ClCompile Include="..\..\Source\Processors\Visualization\LfpTriggeredAverageCanvas.cpp"/> <ClCompile Include="..\..\Source\Processors\Visualization\SpikeObject.cpp"/> <ClCompile Include="..\..\Source\Processors\Visualization\SpikeDisplayCanvas.cpp"/> <ClCompile Include="..\..\Source\Processors\Visualization\DataWindow.cpp"/> @@ -191,6 +193,7 @@ <ClCompile Include="..\..\Source\Processors\SpikeDetector.cpp"/> <ClCompile Include="..\..\Source\Processors\AudioNode.cpp"/> <ClCompile Include="..\..\Source\Processors\EventNode.cpp"/> + <ClCompile Include="..\..\Source\Processors\Editors\LfpTriggeredAverageEditor.cpp"/> <ClCompile Include="..\..\Source\Processors\Editors\ChannelMappingEditor.cpp"/> <ClCompile Include="..\..\Source\Processors\Editors\FileReaderEditor.cpp"/> <ClCompile Include="..\..\Source\Processors\Editors\PhaseDetectorEditor.cpp"/> @@ -1345,6 +1348,7 @@ <ClInclude Include="..\..\Source\Dsp\Types.h"/> <ClInclude Include="..\..\Source\Dsp\Utilities.h"/> <ClInclude Include="..\..\Source\Audio\AudioComponent.h"/> + <ClInclude Include="..\..\Source\Processors\LfpTriggeredAverageNode.h"/> <ClInclude Include="..\..\Source\Processors\FileReader.h"/> <ClInclude Include="..\..\Source\Processors\ChannelMappingNode.h"/> <ClInclude Include="..\..\Source\Processors\PulsePalOutput.h"/> @@ -1366,6 +1370,7 @@ <ClInclude Include="..\..\Source\Processors\Utilities\RecordControl.h"/> <ClInclude Include="..\..\Source\Processors\Utilities\Merger.h"/> <ClInclude Include="..\..\Source\Processors\Utilities\Splitter.h"/> + <ClInclude Include="..\..\Source\Processors\Visualization\LfpTriggeredAverageCanvas.h"/> <ClInclude Include="..\..\Source\Processors\Visualization\SpikeObject.h"/> <ClInclude Include="..\..\Source\Processors\Visualization\SpikeDisplayCanvas.h"/> <ClInclude Include="..\..\Source\Processors\Visualization\Visualizer.h"/> @@ -1375,6 +1380,7 @@ <ClInclude Include="..\..\Source\Processors\SpikeDetector.h"/> <ClInclude Include="..\..\Source\Processors\AudioNode.h"/> <ClInclude Include="..\..\Source\Processors\EventNode.h"/> + <ClInclude Include="..\..\Source\Processors\Editors\LfpTriggeredAverageEditor.h"/> <ClInclude Include="..\..\Source\Processors\Editors\ChannelMappingEditor.h"/> <ClInclude Include="..\..\Source\Processors\Editors\FileReaderEditor.h"/> <ClInclude Include="..\..\Source\Processors\Editors\PhaseDetectorEditor.h"/> diff --git a/Builds/VisualStudio2012/open-ephys.vcxproj.filters b/Builds/VisualStudio2012/open-ephys.vcxproj.filters index d3b246777..eb4fd3085 100644 --- a/Builds/VisualStudio2012/open-ephys.vcxproj.filters +++ b/Builds/VisualStudio2012/open-ephys.vcxproj.filters @@ -415,6 +415,9 @@ <ClCompile Include="..\..\Source\Audio\AudioComponent.cpp"> <Filter>open-ephys\Source\Audio</Filter> </ClCompile> + <ClCompile Include="..\..\Source\Processors\LfpTriggeredAverageNode.cpp"> + <Filter>open-ephys\Source\Processors</Filter> + </ClCompile> <ClCompile Include="..\..\Source\Processors\FileReader.cpp"> <Filter>open-ephys\Source\Processors</Filter> </ClCompile> @@ -475,6 +478,9 @@ <ClCompile Include="..\..\Source\Processors\Utilities\Splitter.cpp"> <Filter>open-ephys\Source\Processors\Utilities</Filter> </ClCompile> + <ClCompile Include="..\..\Source\Processors\Visualization\LfpTriggeredAverageCanvas.cpp"> + <Filter>open-ephys\Source\Processors\Visualization</Filter> + </ClCompile> <ClCompile Include="..\..\Source\Processors\Visualization\SpikeObject.cpp"> <Filter>open-ephys\Source\Processors\Visualization</Filter> </ClCompile> @@ -499,6 +505,9 @@ <ClCompile Include="..\..\Source\Processors\EventNode.cpp"> <Filter>open-ephys\Source\Processors</Filter> </ClCompile> + <ClCompile Include="..\..\Source\Processors\Editors\LfpTriggeredAverageEditor.cpp"> + <Filter>open-ephys\Source\Processors\Editors</Filter> + </ClCompile> <ClCompile Include="..\..\Source\Processors\Editors\ChannelMappingEditor.cpp"> <Filter>open-ephys\Source\Processors\Editors</Filter> </ClCompile> @@ -1920,6 +1929,9 @@ <ClInclude Include="..\..\Source\Audio\AudioComponent.h"> <Filter>open-ephys\Source\Audio</Filter> </ClInclude> + <ClInclude Include="..\..\Source\Processors\LfpTriggeredAverageNode.h"> + <Filter>open-ephys\Source\Processors</Filter> + </ClInclude> <ClInclude Include="..\..\Source\Processors\FileReader.h"> <Filter>open-ephys\Source\Processors</Filter> </ClInclude> @@ -1983,6 +1995,9 @@ <ClInclude Include="..\..\Source\Processors\Utilities\Splitter.h"> <Filter>open-ephys\Source\Processors\Utilities</Filter> </ClInclude> + <ClInclude Include="..\..\Source\Processors\Visualization\LfpTriggeredAverageCanvas.h"> + <Filter>open-ephys\Source\Processors\Visualization</Filter> + </ClInclude> <ClInclude Include="..\..\Source\Processors\Visualization\SpikeObject.h"> <Filter>open-ephys\Source\Processors\Visualization</Filter> </ClInclude> @@ -2010,6 +2025,9 @@ <ClInclude Include="..\..\Source\Processors\EventNode.h"> <Filter>open-ephys\Source\Processors</Filter> </ClInclude> + <ClInclude Include="..\..\Source\Processors\Editors\LfpTriggeredAverageEditor.h"> + <Filter>open-ephys\Source\Processors\Editors</Filter> + </ClInclude> <ClInclude Include="..\..\Source\Processors\Editors\ChannelMappingEditor.h"> <Filter>open-ephys\Source\Processors\Editors</Filter> </ClInclude> diff --git a/JuceLibraryCode/BinaryData.cpp b/JuceLibraryCode/BinaryData.cpp index 6c225d9e3..b2387ecd8 100644 --- a/JuceLibraryCode/BinaryData.cpp +++ b/JuceLibraryCode/BinaryData.cpp @@ -8,7 +8,7 @@ namespace BinaryData { //================== cpmono-black-serialized ================== -static const unsigned char temp_77517bbb[] = +static const unsigned char temp_8b870a76[] = { 120,156,237,157,127,156,149,85,181,255,71,65,64,12,10,47,132,9,130,81,152,63,80,233,226,197,66,158,103,176,240,66,23,47,136,93,12,186,24,196,211,65,177,51,228,185,151,210,11,134,66,141,97,160,32,40,5,57,6,130,130,160,99,16,36,8,231,57,6,66,98,160,24, 212,24,228,143,33,212,41,16,20,196,194,160,190,251,253,89,207,179,103,200,31,13,126,49,61,190,248,99,102,125,94,103,255,90,251,199,179,247,218,107,175,189,246,231,47,249,207,111,140,252,198,144,111,117,62,191,164,164,100,240,228,207,149,158,90,242,55, 135,142,41,89,184,160,105,233,200,50,7,75,102,111,106,20,102,1,35,103,117,41,100,245,123,10,8,138,202,58,116,184,43,56,99,112,251,66,22,16,54,253,82,144,221,176,126,103,232,1,65,81,217,105,133,167,2,151,199,13,217,19,170,162,176,124,199,173,113,150,95, @@ -229,10 +229,10 @@ static const unsigned char temp_77517bbb[] = 33,16,98,208,66,64,165,133,0,168,139,0,116,17,81,213,69,164,165,35,200,236,208,187,111,169,2,12,170,46,2,72,31,2,160,188,148,147,168,140,108,213,204,0,29,214,114,202,236,65,226,103,102,120,232,129,212,29,171,247,93,105,234,14,91,227,94,138,253,11,117, 39,245,137,109,181,198,15,39,160,102,201,43,166,238,224,78,3,234,14,168,158,218,3,104,152,0,24,38,68,213,48,33,173,29,159,199,233,48,177,155,126,42,15,0,3,176,29,101,254,118,116,116,191,107,163,251,200,205,65,174,242,37,255,15,41,157,224,99,0,0 }; -const char* cpmonoblackserialized = (const char*) temp_77517bbb; +const char* cpmonoblackserialized = (const char*) temp_8b870a76; //================== cpmono-bold-serialized ================== -static const unsigned char temp_62a06903[] = +static const unsigned char temp_87096e8[] = { 120,156,237,157,15,156,87,69,185,255,65,8,20,47,36,94,76,19,83,219,46,94,52,77,10,131,90,247,28,212,48,45,188,24,118,53,236,210,213,56,125,81,185,223,37,206,109,11,46,118,81,40,188,32,38,136,134,129,173,173,130,65,144,171,16,40,202,126,207,33,8,10,131, 194,160,182,32,44,8,107,11,68,3,177,48,200,223,188,63,207,57,243,101,213,250,129,47,42,191,190,120,189,246,181,207,231,245,157,63,231,153,153,103,102,158,153,121,230,153,15,124,228,223,62,61,226,211,215,124,174,87,223,54,109,218,12,153,114,81,191,211, 219,188,228,80,219,54,243,231,117,234,55,162,214,193,54,247,173,239,16,22,1,35,26,122,167,69,253,158,3,130,162,218,150,69,227,130,117,55,188,35,45,2,174,222,53,57,40,158,210,242,124,232,1,65,81,237,236,145,165,192,229,113,115,241,198,110,35,194,9,219, @@ -466,10 +466,10 @@ static const unsigned char temp_62a06903[] = 51,181,25,217,171,205,216,211,1,112,175,76,109,134,99,37,218,12,170,54,3,48,217,40,132,199,124,136,58,145,7,18,72,11,71,57,175,81,45,31,86,203,0,116,100,204,109,66,15,50,39,17,131,66,15,180,131,130,86,170,29,20,118,124,144,10,58,153,164,3,85,87,26,1, 62,84,1,80,61,172,2,144,220,0,108,87,189,201,228,134,196,146,27,228,18,64,246,48,21,21,94,58,34,238,127,63,113,63,124,163,148,171,141,54,255,15,230,92,172,169,0,0 }; -const char* cpmonoboldserialized = (const char*) temp_62a06903; +const char* cpmonoboldserialized = (const char*) temp_87096e8; //================== cpmono-extralight-serialized ================== -static const unsigned char temp_b510c8a2[] = +static const unsigned char temp_893e36c7[] = { 120,156,237,157,127,188,149,69,181,255,81,16,232,24,24,10,65,129,98,20,132,133,129,97,218,69,246,3,26,126,177,139,23,193,210,176,75,87,227,113,195,133,246,38,118,151,130,164,48,40,16,195,4,81,143,74,29,5,193,32,240,158,194,64,65,206,126,54,129,160,32, 40,4,122,8,130,4,33,143,65,160,32,42,134,117,231,253,89,207,51,251,80,118,191,71,47,254,216,190,248,99,191,230,243,218,243,107,61,107,214,172,89,51,179,102,230,11,253,254,237,155,195,191,121,245,119,186,156,95,175,94,189,129,83,46,234,113,102,189,191, 57,116,66,189,249,243,202,122,12,207,58,88,111,230,198,134,65,6,48,124,70,215,66,70,255,39,128,168,48,123,227,164,73,221,207,26,216,185,144,1,180,157,176,39,149,25,50,184,97,15,15,136,10,179,77,71,126,53,229,202,248,65,230,236,195,19,130,9,123,110,137, @@ -713,10 +713,10 @@ static const unsigned char temp_b510c8a2[] = 120,66,120,32,139,155,40,15,180,126,150,157,113,154,128,107,216,179,37,108,220,194,47,233,224,13,93,89,4,92,176,15,24,56,101,167,173,159,113,105,17,195,62,33,235,103,186,197,72,130,4,64,144,72,42,65,34,47,226,66,97,18,36,138,143,5,233,108,1,8,128,236, 48,253,183,227,242,255,46,202,255,177,211,99,142,61,245,254,7,170,167,234,165,0,0 }; -const char* cpmonoextralightserialized = (const char*) temp_b510c8a2; +const char* cpmonoextralightserialized = (const char*) temp_893e36c7; //================== cpmono-light-serialized ================== -static const unsigned char temp_72729244[] = +static const unsigned char temp_86a820ff[] = { 120,156,237,157,127,160,149,69,181,247,81,16,12,195,196,32,40,8,184,167,80,41,20,13,195,222,19,207,6,12,47,118,233,98,120,47,132,69,65,60,110,12,218,155,216,93,186,16,118,17,168,99,7,161,32,48,76,13,131,192,32,168,83,120,161,64,206,126,54,129,135,4,65, 65,168,99,32,40,4,117,18,2,130,208,11,65,189,243,249,174,231,153,125,200,122,47,250,226,143,109,252,115,230,123,246,252,90,207,204,154,53,107,102,214,172,249,208,71,255,245,115,163,62,55,228,63,175,190,174,65,131,6,131,167,95,223,163,67,131,191,56,116, 94,131,37,139,155,246,24,149,117,176,193,188,173,141,83,25,192,168,185,93,11,25,253,158,0,162,194,236,202,118,23,4,147,251,189,183,144,1,236,107,245,88,144,41,12,58,191,135,7,68,133,217,41,149,149,129,43,99,98,102,204,246,137,169,138,253,223,136,50,252, @@ -973,10 +973,10 @@ static const unsigned char temp_72729244[] = 195,60,113,76,68,82,189,98,69,94,234,75,40,9,179,212,163,142,0,200,180,129,55,79,61,208,165,32,162,60,208,222,215,218,99,87,216,222,23,55,12,225,138,77,27,99,207,194,67,59,175,52,141,128,61,47,211,39,127,99,123,95,139,154,253,81,123,95,132,58,191,0,136, 145,0,48,18,73,197,72,228,133,93,40,76,140,68,241,98,164,228,70,35,4,64,118,152,254,203,57,254,127,13,249,255,236,201,49,215,60,13,254,47,224,111,82,132,0,0 }; -const char* cpmonolightserialized = (const char*) temp_72729244; +const char* cpmonolightserialized = (const char*) temp_86a820ff; //================== cpmono-plain-serialized ================== -static const unsigned char temp_7b72b510[] = +static const unsigned char temp_8fa843cb[] = { 120,156,237,157,127,188,86,69,181,255,143,130,96,40,36,6,98,65,104,39,33,44,8,10,67,67,246,62,80,120,177,240,106,88,16,118,241,66,108,31,20,122,14,185,187,20,132,93,68,12,67,161,48,48,76,234,212,65,84,16,244,24,4,10,194,179,31,2,193,64,240,30,131,194, 32,44,8,12,131,192,48,72,184,144,119,222,159,181,247,28,200,238,247,162,95,127,61,198,31,231,181,62,231,153,31,123,205,204,154,153,53,51,107,214,124,242,51,255,250,229,225,95,30,248,181,78,23,150,149,149,13,152,252,137,138,115,203,94,114,232,164,178, 185,115,26,85,12,175,116,176,108,198,250,6,97,30,48,188,186,115,49,175,223,51,64,80,84,233,146,5,155,187,127,160,152,7,76,29,248,64,144,239,52,237,112,232,1,65,81,101,121,249,221,129,203,99,108,126,212,200,145,225,248,93,223,77,242,252,50,126,87,211, @@ -1230,10 +1230,10 @@ static const unsigned char temp_7b72b510[] = 0,27,91,68,213,198,22,105,225,40,227,53,170,180,27,162,231,22,196,138,108,12,220,164,29,120,160,235,41,4,121,160,125,43,154,68,251,86,204,159,72,5,47,118,73,58,120,227,78,42,194,244,187,14,10,64,101,123,97,160,204,66,144,14,162,74,110,72,156,118,156, 171,5,200,30,166,162,220,75,39,196,253,141,19,247,215,110,148,114,252,151,253,15,5,44,29,103,0,0 }; -const char* cpmonoplainserialized = (const char*) temp_7b72b510; +const char* cpmonoplainserialized = (const char*) temp_8fa843cb; //================== BebasNeue.otf ================== -static const unsigned char temp_7b880677[] = +static const unsigned char temp_fe42b2f2[] = { 79,84,84,79,0,11,0,128,0,3,0,48,67,70,70,32,57,136,64,140,0,0,39,76,0,0,70,154,71,80,79,83,223,12,110,56,0,0,116,248,0,0,73,16,71,83,85,66,114,203,114,178,0,0,116,0,0,0,0,246,79,83,47,50,102,169,27,20,0,0,1,32,0,0,0,96,99,109,97,112,211,17,247,228,0, 0,35,232,0,0,3,68,104,101,97,100,243,84,238,113,0,0,0,188,0,0,0,54,104,104,101,97,6,215,3,186,0,0,0,244,0,0,0,36,104,109,116,120,67,128,39,22,0,0,109,232,0,0,6,24,109,97,120,112,1,134,80,0,0,0,1,24,0,0,0,6,110,97,109,101,230,56,31,140,0,0,1,128,0,0,34, 101,112,111,115,116,255,184,0,50,0,0,39,44,0,0,0,32,0,1,0,0,0,1,0,131,131,184,68,27,95,15,60,245,0,3,3,232,0,0,0,0,200,111,85,40,0,0,0,0,200,111,85,40,255,119,255,60,3,232,3,130,0,0,0,3,0,2,0,0,0,0,0,0,0,1,0,0,2,188,254,212,0,185,3,232,255,119,255,119, @@ -1843,10 +1843,10 @@ static const unsigned char temp_7b880677[] = 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,10,0,3,0,10,0,3,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,24,0,22,0,24,0,22,0,24,0,22,0,24,0,4,0,11,0,4,0,11,0,4,0,11,0,23,0,25,0,23,0,25,0,23,0,25,0,23,0,25,0,23,0,25,0,23,0,25,0,5,0,12,0,6,0,13,0,6,0,19, 0,21,0,19,0,21,0,19,0,21,0,15,0,17,0,3,0,10,0,22,0,24,0,4,0,11,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,24,0,4,0,11,0,5,0,12,0,5,0,12,0,5,0,12,0,6,0,13,0,0 }; -const char* BebasNeue_otf = (const char*) temp_7b880677; +const char* BebasNeue_otf = (const char*) temp_fe42b2f2; //================== cpmono_bold.otf ================== -static const unsigned char temp_8e883f13[] = +static const unsigned char temp_4d49b8ce[] = { 79,84,84,79,0,10,0,128,0,3,0,32,67,70,70,32,35,187,57,254,0,0,10,112,0,0,84,205,71,83,85,66,106,18,122,98,0,0,98,20,0,0,5,216,79,83,47,50,104,215,98,101,0,0,1,16,0,0,0,96,99,109,97,112,38,198,129,33,0,0,5,56,0,0,5,24,104,101,97,100,237,187,124,213,0, 0,0,172,0,0,0,54,104,104,101,97,6,229,0,115,0,0,0,228,0,0,0,36,104,109,116,120,58,11,56,208,0,0,95,64,0,0,2,212,109,97,120,112,1,105,80,0,0,0,1,8,0,0,0,6,110,97,109,101,226,66,147,104,0,0,1,112,0,0,3,198,112,111,115,116,255,181,0,161,0,0,10,80,0,0,0, 32,0,1,0,0,0,1,0,0,64,149,238,152,95,15,60,245,0,3,3,232,0,0,0,0,198,13,28,168,0,0,0,0,198,13,28,168,255,7,255,16,3,131,3,149,0,0,0,3,0,2,0,0,0,0,0,0,0,1,0,0,3,144,254,224,0,200,2,138,255,7,255,7,3,131,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,80,0,1,105, @@ -2190,10 +2190,10 @@ static const unsigned char temp_8e883f13[] = 0,2,0,21,0,4,0,12,0,0,0,14,0,19,0,9,0,21,0,23,0,15,0,28,0,28,0,18,0,36,0,51,0,19,0,53,0,54,0,35,0,57,0,60,0,37,0,63,0,66,0,41,0,71,0,72,0,45,0,82,0,82,0,47,0,92,0,92,0,48,0,99,0,99,0,49,0,103,0,106,0,50,0,140,0,162,0,54,0,165,0,168,0,77,0,179,0,184,0, 81,0,208,0,209,0,87,0,214,0,214,0,89,0,224,1,6,0,90,1,8,1,8,0,129,1,13,1,13,0,130,0,1,0,26,0,3,0,13,0,20,0,24,0,25,0,26,0,27,0,52,0,55,0,56,0,61,0,62,0,67,0,68,0,69,0,70,0,134,0,135,0,136,0,137,0,138,0,139,0,163,0,164,0,169,1,7,0,0 }; -const char* cpmono_bold_otf = (const char*) temp_8e883f13; +const char* cpmono_bold_otf = (const char*) temp_4d49b8ce; //================== cpmono_extra_light.otf ================== -static const unsigned char temp_8172799f[] = +static const unsigned char temp_2742a784[] = { 79,84,84,79,0,10,0,128,0,3,0,32,67,70,70,32,248,217,201,134,0,0,10,164,0,0,78,103,71,83,85,66,106,18,122,98,0,0,91,224,0,0,5,216,79,83,47,50,104,210,98,59,0,0,1,16,0,0,0,96,99,109,97,112,38,198,129,33,0,0,5,108,0,0,5,24,104,101,97,100,237,187,115,86, 0,0,0,172,0,0,0,54,104,104,101,97,6,229,0,179,0,0,0,228,0,0,0,36,104,109,116,120,81,57,79,54,0,0,89,12,0,0,2,212,109,97,120,112,1,105,80,0,0,0,1,8,0,0,0,6,110,97,109,101,101,109,217,12,0,0,1,112,0,0,3,252,112,111,115,116,255,181,0,161,0,0,10,132,0,0, 0,32,0,1,0,0,0,1,0,0,97,176,60,66,95,15,60,245,0,3,3,232,0,0,0,0,198,13,23,248,0,0,0,0,198,13,23,248,255,71,255,16,3,67,3,118,0,0,0,3,0,2,0,0,0,0,0,0,0,1,0,0,3,144,254,224,0,200,2,138,255,71,255,71,3,67,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,80,0,1, @@ -2518,10 +2518,10 @@ static const unsigned char temp_8172799f[] = 0,55,0,61,0,62,0,70,0,2,0,21,0,4,0,12,0,0,0,14,0,19,0,9,0,21,0,23,0,15,0,28,0,28,0,18,0,36,0,51,0,19,0,53,0,54,0,35,0,57,0,60,0,37,0,63,0,66,0,41,0,71,0,72,0,45,0,82,0,82,0,47,0,92,0,92,0,48,0,99,0,99,0,49,0,103,0,106,0,50,0,140,0,162,0,54,0,165,0,168, 0,77,0,179,0,184,0,81,0,208,0,209,0,87,0,214,0,214,0,89,0,224,1,6,0,90,1,8,1,8,0,129,1,13,1,13,0,130,0,1,0,26,0,3,0,13,0,20,0,24,0,25,0,26,0,27,0,52,0,55,0,56,0,61,0,62,0,67,0,68,0,69,0,70,0,134,0,135,0,136,0,137,0,138,0,139,0,163,0,164,0,169,1,7,0,0 }; -const char* cpmono_extra_light_otf = (const char*) temp_8172799f; +const char* cpmono_extra_light_otf = (const char*) temp_2742a784; //================== cpmono_light.otf ================== -static const unsigned char temp_9ff5f6ce[] = +static const unsigned char temp_b963b473[] = { 79,84,84,79,0,10,0,128,0,3,0,32,67,70,70,32,64,226,171,159,0,0,10,124,0,0,81,133,71,83,85,66,106,18,122,98,0,0,94,216,0,0,5,216,79,83,47,50,104,211,98,73,0,0,1,16,0,0,0,96,99,109,97,112,38,198,129,33,0,0,5,68,0,0,5,24,104,101,97,100,237,187,127,116,0, 0,0,172,0,0,0,54,104,104,101,97,6,229,0,158,0,0,0,228,0,0,0,36,104,109,116,120,73,105,71,167,0,0,92,4,0,0,2,212,109,97,120,112,1,105,80,0,0,0,1,8,0,0,0,6,110,97,109,101,106,76,91,179,0,0,1,112,0,0,3,209,112,111,115,116,255,181,0,161,0,0,10,92,0,0,0,32, 0,1,0,0,0,1,0,0,215,127,97,71,95,15,60,245,0,3,3,232,0,0,0,0,198,13,30,2,0,0,0,0,198,13,30,2,255,50,255,16,3,88,3,128,0,0,0,3,0,2,0,0,0,0,0,0,0,1,0,0,3,144,254,224,0,200,2,138,255,50,255,50,3,88,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,80,0,1,105,0,0, @@ -2856,10 +2856,10 @@ static const unsigned char temp_9ff5f6ce[] = 0,4,0,12,0,0,0,14,0,19,0,9,0,21,0,23,0,15,0,28,0,28,0,18,0,36,0,51,0,19,0,53,0,54,0,35,0,57,0,60,0,37,0,63,0,66,0,41,0,71,0,72,0,45,0,82,0,82,0,47,0,92,0,92,0,48,0,99,0,99,0,49,0,103,0,106,0,50,0,140,0,162,0,54,0,165,0,168,0,77,0,179,0,184,0,81,0,208, 0,209,0,87,0,214,0,214,0,89,0,224,1,6,0,90,1,8,1,8,0,129,1,13,1,13,0,130,0,1,0,26,0,3,0,13,0,20,0,24,0,25,0,26,0,27,0,52,0,55,0,56,0,61,0,62,0,67,0,68,0,69,0,70,0,134,0,135,0,136,0,137,0,138,0,139,0,163,0,164,0,169,1,7,0,0 }; -const char* cpmono_light_otf = (const char*) temp_9ff5f6ce; +const char* cpmono_light_otf = (const char*) temp_b963b473; //================== cpmono_plain.otf ================== -static const unsigned char temp_eca62182[] = +static const unsigned char temp_613df27[] = { 79,84,84,79,0,10,0,128,0,3,0,32,67,70,70,32,153,52,71,27,0,0,10,124,0,0,81,49,71,83,85,66,106,18,122,98,0,0,94,132,0,0,5,216,79,83,47,50,104,213,98,87,0,0,1,16,0,0,0,96,99,109,97,112,38,198,129,33,0,0,5,68,0,0,5,24,104,101,97,100,237,186,121,35,0,0,0, 172,0,0,0,54,104,104,101,97,6,228,0,137,0,0,0,228,0,0,0,36,104,109,116,120,65,179,64,52,0,0,91,176,0,0,2,212,109,97,120,112,1,105,80,0,0,0,1,8,0,0,0,6,110,97,109,101,95,80,74,175,0,0,1,112,0,0,3,209,112,111,115,116,255,181,0,161,0,0,10,92,0,0,0,32,0, 1,0,0,0,1,0,0,76,64,104,233,95,15,60,245,0,3,3,232,0,0,0,0,198,13,26,212,0,0,0,0,198,13,26,212,255,28,255,16,3,109,3,139,0,0,0,3,0,2,0,0,0,0,0,0,0,1,0,0,3,144,254,224,0,200,2,138,255,28,255,29,3,109,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,80,0,1,105, @@ -3193,10 +3193,10 @@ static const unsigned char temp_eca62182[] = 0,50,0,140,0,162,0,54,0,165,0,168,0,77,0,179,0,184,0,81,0,208,0,209,0,87,0,214,0,214,0,89,0,224,1,6,0,90,1,8,1,8,0,129,1,13,1,13,0,130,0,1,0,26,0,3,0,13,0,20,0,24,0,25,0,26,0,27,0,52,0,55,0,56,0,61,0,62,0,67,0,68,0,69,0,70,0,134,0,135,0,136,0,137,0,138, 0,139,0,163,0,164,0,169,1,7,0,0 }; -const char* cpmono_plain_otf = (const char*) temp_eca62182; +const char* cpmono_plain_otf = (const char*) temp_613df27; //================== miso-bold.ttf ================== -static const unsigned char temp_7dfa977e[] = +static const unsigned char temp_b543f9[] = { 0,1,0,0,0,17,1,0,0,4,0,16,76,84,83,72,237,157,221,60,0,0,5,108,0,0,0,227,79,83,47,50,81,16,250,27,0,0,1,152,0,0,0,86,86,68,77,88,108,156,116,37,0,0,231,220,0,0,5,224,99,109,97,112,117,108,128,122,0,0,26,212,0,0,6,164,99,118,116,32,0,20,0,0,0,0,34,224, 0,0,0,2,102,112,103,109,50,77,115,102,0,0,33,120,0,0,1,98,103,108,121,102,122,237,74,59,0,0,34,228,0,0,184,220,104,100,109,120,139,147,218,195,0,0,6,80,0,0,20,132,104,101,97,100,230,15,38,231,0,0,1,28,0,0,0,54,104,104,101,97,6,202,7,163,0,0,1,84,0,0, 0,36,104,109,116,120,82,131,27,122,0,0,1,240,0,0,3,124,107,101,114,110,23,5,21,255,0,0,221,128,0,0,4,68,108,111,99,97,100,35,145,228,0,0,219,192,0,0,1,192,109,97,120,112,2,241,2,157,0,0,1,120,0,0,0,32,110,97,109,101,215,203,101,65,0,0,225,196,0,0,3,225, @@ -3880,10 +3880,10 @@ static const unsigned char temp_7dfa977e[] = 255,203,0,239,0,212,255,203,0,240,0,213,255,203,0,241,0,214,255,202,0,242,0,215,255,202,0,243,0,216,255,202,0,244,0,217,255,202,0,245,0,218,255,202,0,246,0,218,255,201,0,247,0,219,255,201,0,248,0,220,255,201,0,249,0,221,255,201,0,250,0,222,255,201,0, 251,0,223,255,200,0,252,0,224,255,200,0,253,0,225,255,200,0,254,0,226,255,200,0,255,0,226,255,199,0,0 }; -const char* misobold_ttf = (const char*) temp_7dfa977e; +const char* misobold_ttf = (const char*) temp_b543f9; //================== miso-light.ttf ================== -static const unsigned char temp_9ecc78ad[] = +static const unsigned char temp_73675b92[] = { 0,1,0,0,0,17,1,0,0,4,0,16,76,84,83,72,109,206,108,252,0,0,5,108,0,0,0,227,79,83,47,50,79,98,250,86,0,0,1,152,0,0,0,86,86,68,77,88,108,201,116,87,0,0,229,68,0,0,5,224,99,109,97,112,117,108,128,122,0,0,26,212,0,0,6,164,99,118,116,32,0,20,0,0,0,0,34,224, 0,0,0,2,102,112,103,109,50,77,115,102,0,0,33,120,0,0,1,98,103,108,121,102,9,54,37,173,0,0,34,228,0,0,182,56,104,100,109,120,120,118,213,147,0,0,6,80,0,0,20,132,104,101,97,100,230,13,38,194,0,0,1,28,0,0,0,54,104,104,101,97,6,201,7,195,0,0,1,84,0,0,0,36, 104,109,116,120,82,124,51,141,0,0,1,240,0,0,3,124,107,101,114,110,23,5,21,255,0,0,218,220,0,0,4,68,108,111,99,97,249,219,39,62,0,0,217,28,0,0,1,192,109,97,120,112,2,241,2,188,0,0,1,120,0,0,0,32,110,97,109,101,174,204,29,32,0,0,223,32,0,0,3,240,112,111, @@ -4549,10 +4549,10 @@ static const unsigned char temp_9ecc78ad[] = 203,0,243,0,216,255,203,0,244,0,217,255,203,0,245,0,218,255,202,0,246,0,218,255,202,0,247,0,219,255,202,0,248,0,220,255,202,0,249,0,221,255,201,0,250,0,222,255,201,0,251,0,223,255,201,0,252,0,224,255,201,0,253,0,225,255,201,0,254,0,226,255,200,0,255, 0,226,255,200,0,0 }; -const char* misolight_ttf = (const char*) temp_9ecc78ad; +const char* misolight_ttf = (const char*) temp_73675b92; //================== miso-regular.ttf ================== -static const unsigned char temp_bfd04473[] = +static const unsigned char temp_d93e0218[] = { 0,1,0,0,0,17,1,0,0,4,0,16,76,84,83,72,96,206,125,196,0,0,5,108,0,0,0,227,79,83,47,50,79,197,250,61,0,0,1,152,0,0,0,86,86,68,77,88,108,201,116,86,0,0,225,224,0,0,5,224,99,109,97,112,117,108,128,122,0,0,26,212,0,0,6,164,99,118,116,32,0,20,0,0,0,0,34,224, 0,0,0,2,102,112,103,109,50,77,115,102,0,0,33,120,0,0,1,98,103,108,121,102,144,118,127,194,0,0,34,228,0,0,179,20,104,100,109,120,123,104,215,146,0,0,6,80,0,0,20,132,104,101,97,100,230,14,38,213,0,0,1,28,0,0,0,54,104,104,101,97,6,189,7,195,0,0,1,84,0,0, 0,36,104,109,116,120,82,124,40,229,0,0,1,240,0,0,3,124,107,101,114,110,23,5,21,255,0,0,215,184,0,0,4,68,108,111,99,97,156,38,200,236,0,0,213,248,0,0,1,192,109,97,120,112,2,241,2,186,0,0,1,120,0,0,0,32,110,97,109,101,65,189,188,90,0,0,219,252,0,0,3,174, @@ -5216,10 +5216,10 @@ static const unsigned char temp_bfd04473[] = 0,206,255,208,0,236,0,207,255,207,0,237,0,207,255,207,0,238,0,208,255,207,0,239,0,209,255,207,0,240,0,210,255,207,0,241,0,211,255,206,0,242,0,212,255,206,0,243,0,213,255,206,0,244,0,214,255,206,0,245,0,214,255,206,0,246,0,215,255,205,0,247,0,216,255, 205,0,248,0,217,255,205,0,249,0,218,255,205,0,250,0,219,255,205,0,251,0,220,255,204,0,252,0,220,255,204,0,253,0,221,255,204,0,254,0,222,255,204,0,255,0,223,255,203,0,0 }; -const char* misoregular_ttf = (const char*) temp_bfd04473; +const char* misoregular_ttf = (const char*) temp_d93e0218; //================== miso-serialized ================== -static const unsigned char temp_263ed5c5[] = +static const unsigned char temp_e5004f80[] = { 120,156,236,221,11,252,253,197,180,63,254,79,244,237,170,139,164,123,73,55,116,165,146,240,221,239,175,168,148,75,95,145,144,16,187,143,67,246,231,155,173,155,131,82,169,164,72,233,34,149,110,18,37,183,82,74,159,253,222,137,238,36,33,169,164,66,116,145, 20,161,19,254,243,124,205,222,31,250,31,231,156,56,156,195,227,119,122,60,62,205,250,238,247,204,154,153,53,51,107,214,90,179,102,205,139,223,188,219,174,19,19,19,231,156,250,226,57,171,78,252,161,64,243,77,28,59,103,195,102,222,228,163,70,233,163,71, 233,252,163,116,214,40,93,96,148,46,56,74,23,26,165,11,143,210,69,70,233,162,163,244,49,163,116,177,81,186,248,40,93,98,148,46,57,74,31,59,74,151,26,165,143,27,165,75,143,210,199,143,210,101,70,233,178,163,116,185,81,186,252,40,93,97,148,174,56,74,87, @@ -6270,10 +6270,10 @@ static const unsigned char temp_263ed5c5[] = 219,114,86,91,239,25,109,89,219,189,161,215,207,60,247,238,205,109,203,166,45,119,111,203,250,157,123,151,118,230,189,119,251,157,251,182,245,247,109,219,239,219,214,223,183,212,95,163,80,149,125,75,61,229,188,222,155,243,251,188,182,254,188,182,254, 188,182,254,188,82,223,122,206,43,245,149,251,181,245,246,107,235,237,215,214,219,175,212,91,173,244,183,95,169,167,124,91,91,239,109,109,189,203,123,251,166,252,89,91,222,212,150,255,15,63,201,76,247,0,0 }; -const char* misoserialized = (const char*) temp_263ed5c5; +const char* misoserialized = (const char*) temp_e5004f80; //================== nordic.ttf ================== -static const unsigned char temp_bcaa94b9[] = +static const unsigned char temp_740cb21e[] = { 0,1,0,0,0,14,0,128,0,3,0,96,79,83,47,50,123,137,164,77,0,0,1,136,0,0,0,86,99,109,97,112,54,197,178,209,0,0,31,240,0,0,1,202,99,118,116,32,15,192,16,0,0,0,26,184,0,0,2,0,102,112,103,109,1,82,156,24,0,0,28,184,0,0,0,179,103,97,115,112,0,23,0,6,0,0,26,168, 0,0,0,16,103,108,121,102,108,103,13,174,0,0,40,168,0,0,51,44,104,101,97,100,98,133,67,155,0,0,0,236,0,0,0,54,104,104,101,97,6,68,3,192,0,0,1,36,0,0,0,36,104,109,116,120,180,81,19,127,0,0,37,52,0,0,3,116,108,111,99,97,0,33,207,92,0,0,33,188,0,0,3,120, 109,97,120,112,24,248,0,170,0,0,1,72,0,0,0,32,110,97,109,101,185,229,179,231,0,0,1,224,0,0,24,198,112,111,115,116,255,163,0,48,0,0,1,104,0,0,0,32,112,114,101,112,15,37,62,165,0,0,29,108,0,0,2,130,0,1,0,0,0,5,0,0,166,84,57,97,95,15,60,245,0,1,4,0,0,0, @@ -6514,10 +6514,10 @@ static const unsigned char temp_bcaa94b9[] = 6,7,6,39,53,54,55,51,22,23,185,30,74,27,4,1,23,86,22,3,204,31,74,27,4,2,22,86,22,4,2,126,88,56,12,28,214,22,3,3,22,86,88,56,12,28,214,22,3,3,22,0,0,0,2,0,50,1,226,1,133,2,237,0,10,0,21,0,3,0,48,49,19,6,7,6,39,53,54,55,51,22,31,1,6,7,6,39,53,54,55,51, 22,23,185,30,74,27,4,1,23,86,22,3,204,31,74,27,4,2,22,86,22,4,2,126,88,56,12,28,214,22,3,3,22,86,88,56,12,28,214,22,3,3,22,0,0,0,0 }; -const char* nordic_ttf = (const char*) temp_bcaa94b9; +const char* nordic_ttf = (const char*) temp_740cb21e; //================== ostrich.ttf ================== -static const unsigned char temp_189d4f30[] = +static const unsigned char temp_4d7ede6b[] = { 0,1,0,0,0,16,1,0,0,4,0,0,70,70,84,77,91,245,3,49,0,0,1,12,0,0,0,28,71,68,69,70,0,172,0,3,0,0,1,40,0,0,0,32,79,83,47,50,147,188,109,12,0,0,1,72,0,0,0,96,99,109,97,112,43,226,86,187,0,0,1,168,0,0,1,162,99,118,116,32,13,119,11,140,0,0,3,76,0,0,0,34,102, 112,103,109,15,180,47,167,0,0,3,112,0,0,2,101,103,97,115,112,0,0,0,16,0,0,5,216,0,0,0,8,103,108,121,102,143,7,37,77,0,0,5,224,0,0,69,164,104,101,97,100,248,105,156,174,0,0,75,132,0,0,0,54,104,104,101,97,11,58,5,41,0,0,75,188,0,0,0,36,104,109,116,120, 102,145,6,220,0,0,75,224,0,0,1,252,108,111,99,97,36,35,54,72,0,0,77,220,0,0,1,0,109,97,120,112,1,156,1,252,0,0,78,220,0,0,0,32,110,97,109,101,44,100,71,147,0,0,78,252,0,0,2,6,112,111,115,116,68,107,181,125,0,0,81,4,0,0,1,187,112,114,101,112,2,242,181, @@ -6769,10 +6769,10 @@ static const unsigned char temp_189d4f30[] = 32,69,176,3,43,68,176,12,32,69,186,0,11,127,255,0,2,43,177,3,70,118,43,68,176,13,32,69,178,12,9,2,43,177,3,70,118,43,68,176,14,32,69,178,13,8,2,43,177,3,70,118,43,68,176,15,32,69,186,0,14,1,56,0,2,43,177,3,70,118,43,68,176,16,32,69,178,15,7,2,43,177, 3,70,118,43,68,89,176,20,43,0,0,0,0 }; -const char* ostrich_ttf = (const char*) temp_189d4f30; +const char* ostrich_ttf = (const char*) temp_4d7ede6b; //================== silkscreen-serialized ================== -static const unsigned char temp_4c9cd71c[] = +static const unsigned char temp_acccd897[] = { 120,156,237,155,7,148,20,69,16,134,215,156,48,39,80,84,204,57,160,120,162,48,123,42,98,206,120,230,132,99,171,200,238,170,140,162,24,49,97,206,57,231,128,57,158,1,238,206,132,1,195,153,21,207,128,17,179,232,138,138,9,39,117,119,245,116,207,78,47,252, 199,221,170,188,199,123,205,78,239,215,213,85,213,85,93,53,203,128,65,133,193,158,59,132,177,82,46,151,235,217,165,95,125,143,220,20,127,52,131,255,55,87,95,42,246,26,57,185,175,63,26,94,8,6,254,227,150,66,145,77,204,139,65,240,200,45,142,27,59,62,239, 63,31,93,8,6,19,242,125,90,252,217,195,28,49,8,30,185,108,70,56,113,38,56,113,102,56,113,22,56,113,86,56,113,54,56,113,118,56,113,14,56,113,78,56,113,46,56,177,11,156,56,55,156,56,15,156,56,47,156,56,31,156,56,63,156,184,0,156,184,32,156,184,16,156,184, @@ -6807,10 +6807,10 @@ static const unsigned char temp_4c9cd71c[] = 2,78,156,0,39,126,9,39,126,5,39,126,13,39,126,3,39,126,11,39,126,7,39,126,15,39,254,0,39,78,132,19,127,132,19,127,130,19,203,112,226,207,112,226,36,56,241,23,56,241,87,56,241,55,56,113,50,156,248,59,156,248,7,156,248,39,156,248,23,156,248,55,156,56,5, 78,12,128,255,0,255,66,227,172,0,0 }; -const char* silkscreenserialized = (const char*) temp_4c9cd71c; +const char* silkscreenserialized = (const char*) temp_acccd897; //================== silkscreen.ttf ================== -static const unsigned char temp_2de8efad[] = +static const unsigned char temp_283d292[] = { 0,1,0,0,0,15,0,48,0,3,0,192,79,83,47,50,121,166,129,146,0,0,64,208,0,0,0,78,80,67,76,84,173,52,110,22,0,0,65,32,0,0,0,54,99,109,97,112,198,58,142,190,0,0,61,32,0,0,2,4,99,118,116,32,7,83,8,77,0,0,64,172,0,0,0,36,102,112,103,109,152,92,220,162,0,0,3,224, 0,0,0,100,103,108,121,102,48,157,174,66,0,0,4,152,0,0,54,18,104,100,109,120,137,166,202,30,0,0,65,88,0,0,6,72,104,101,97,100,213,88,95,61,0,0,0,252,0,0,0,54,104,104,101,97,2,213,6,14,0,0,1,52,0,0,0,36,104,109,116,120,44,25,4,90,0,0,63,36,0,0,1,136,108, 111,99,97,0,10,37,204,0,0,58,172,0,0,1,140,109,97,120,112,1,9,0,219,0,0,1,88,0,0,0,32,110,97,109,101,63,98,60,192,0,0,1,120,0,0,2,103,112,111,115,116,9,71,9,62,0,0,60,56,0,0,0,230,112,114,101,112,5,176,112,7,0,0,4,68,0,0,0,83,0,1,0,0,0,1,0,0,124,56,31, @@ -7017,10 +7017,10 @@ static const unsigned char temp_2de8efad[] = 14,16,19,16,16,16,16,14,14,16,16,8,16,16,14,19,19,16,16,16,16,16,14,16,19,19,19,19,14,11,14,11,14,16,11,16,16,16,16,14,14,16,16,8,16,16,14,19,19,16,16,16,16,16,14,16,19,19,19,19,14,14,8,14,16,24,20,12,0,11,11,9,14,20,17,20,17,9,11,11,20,20,9,14,6,14, 17,14,17,17,17,17,17,17,17,17,6,9,14,14,14,17,20,17,17,17,17,14,14,17,17,9,17,17,14,20,20,17,17,17,17,17,14,17,20,20,20,20,14,11,14,11,14,17,11,17,17,17,17,14,14,17,17,9,17,17,14,20,20,17,17,17,17,17,14,17,20,20,20,20,14,14,9,14,17,0,0 }; -const char* silkscreen_ttf = (const char*) temp_2de8efad; +const char* silkscreen_ttf = (const char*) temp_283d292; //================== ArduinoIcon.png ================== -static const unsigned char temp_dd579bb9[] = +static const unsigned char temp_8327c99e[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,6,47,0,0,4,111,8,6,0,0,0,96,133,119,144,0,0,0,9,112,72,89,115,0,0,46,35,0,0,46,35,1,120,165,63,118,0,0,10,79,105,67,67,80,80,104,111,116,111,115,104,111,112,32,73,67,67,32,112,114,111,102,105,108,101, 0,0,120,218,157,83,103,84,83,233,22,61,247,222,244,66,75,136,128,148,75,111,82,21,8,32,82,66,139,128,20,145,38,42,33,9,16,74,136,33,161,217,21,81,193,17,69,69,4,27,200,160,136,3,142,142,128,140,21,81,44,12,138,10,216,7,228,33,162,142,131,163,136,138, 202,251,225,123,163,107,214,188,247,230,205,254,181,215,62,231,172,243,157,179,207,7,192,8,12,150,72,51,81,53,128,12,169,66,30,17,224,131,199,196,198,225,228,46,64,129,10,36,112,0,16,8,179,100,33,115,253,35,1,0,248,126,60,60,43,34,192,7,190,0,1,120,211, @@ -7809,10 +7809,10 @@ static const unsigned char temp_dd579bb9[] = 223,255,212,213,121,32,27,7,166,188,232,223,182,138,0,0,0,0,0,32,99,109,205,214,129,253,183,63,255,249,207,94,222,126,236,75,57,185,187,67,8,23,75,2,0,0,0,0,32,163,252,123,8,225,191,255,169,171,243,68,54,14,206,157,23,76,13,33,108,19,3,0,0,0,0,64,198, 248,117,8,97,92,182,22,23,33,184,243,130,147,190,148,147,59,46,132,48,51,132,240,223,165,1,0,0,0,0,16,73,39,66,8,91,255,212,213,249,84,182,15,244,255,63,0,215,70,173,194,31,62,235,52,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; -const char* ArduinoIcon_png = (const char*) temp_dd579bb9; +const char* ArduinoIcon_png = (const char*) temp_8327c99e; //================== OpenEphysBoardLogoBlack.png ================== -static const unsigned char temp_ef366d73[] = +static const unsigned char temp_c05febd8[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,7,115,0,0,5,27,8,6,0,0,0,52,231,138,245,0,0,0,9,112,72,89,115,0,0,46,35,0,0,46,35,1,120,165,63,118,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101, 97,100,121,113,201,101,60,0,0,140,165,73,68,65,84,120,218,236,221,209,149,19,71,162,199,225,54,231,30,29,233,9,54,2,228,8,152,141,96,180,17,120,110,4,200,17,236,108,4,30,71,176,16,129,69,4,59,68,176,34,2,102,34,176,136,224,194,147,116,244,194,173,178, 122,188,44,6,3,51,211,221,127,73,223,119,78,185,13,6,117,119,169,103,95,126,91,213,223,189,127,255,190,33,195,104,60,121,84,14,39,237,47,103,31,252,167,217,71,127,116,90,198,99,51,6,0,0,0,0,0,192,87,122,83,198,234,163,223,91,126,226,223,175,182,155,245, @@ -8286,10 +8286,10 @@ static const unsigned char temp_ef366d73[] = 38,188,253,43,192,21,222,214,75,152,155,65,10,120,183,225,238,40,149,248,181,93,188,0,0,0,0,0,0,228,118,87,109,194,218,69,42,243,248,20,220,54,79,152,91,152,116,76,115,188,135,119,148,74,245,197,215,187,226,247,220,209,11,0,0,0,0,0,192,215,196,99,144, 23,247,124,127,177,243,253,237,215,183,235,213,242,218,144,149,227,255,1,23,88,237,144,160,48,169,201,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; -const char* OpenEphysBoardLogoBlack_png = (const char*) temp_ef366d73; +const char* OpenEphysBoardLogoBlack_png = (const char*) temp_c05febd8; //================== OpenEphysBoardLogoGray.png ================== -static const unsigned char temp_76e84745[] = +static const unsigned char temp_2b12e840[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,7,115,0,0,5,27,8,6,0,0,0,52,231,138,245,0,0,0,9,112,72,89,115,0,0,46,35,0,0,46,35,1,120,165,63,118,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101, 97,100,121,113,201,101,60,0,0,139,144,73,68,65,84,120,218,236,221,223,117,220,198,193,198,97,68,39,247,100,7,98,42,16,115,133,75,174,43,16,191,10,180,174,192,76,5,166,43,8,85,129,86,21,132,170,32,171,203,185,50,89,65,168,14,168,10,242,13,188,160,163, 40,148,197,63,11,224,197,238,243,156,51,134,100,75,11,96,22,204,205,47,51,248,211,191,255,253,239,134,12,165,148,195,122,56,238,127,187,248,226,63,45,190,250,163,71,117,188,52,99,0,0,0,0,0,0,60,208,167,58,110,190,250,119,235,123,126,125,213,182,237,173, @@ -8760,10 +8760,10 @@ static const unsigned char temp_76e84745[] = 194,221,105,190,210,239,85,241,2,0,0,0,0,0,80,218,125,179,13,107,55,249,90,167,187,224,182,127,194,220,202,228,109,154,211,57,188,211,124,53,127,249,253,190,244,103,206,232,5,0,0,0,0,0,224,107,210,54,200,155,7,254,124,179,247,231,187,223,223,133,16,110, 12,89,61,254,7,181,146,230,16,82,63,166,171,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; -const char* OpenEphysBoardLogoGray_png = (const char*) temp_76e84745; +const char* OpenEphysBoardLogoGray_png = (const char*) temp_2b12e840; //================== RadioButtons-01.png ================== -static const unsigned char temp_bcea9320[] = +static const unsigned char temp_81774685[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,32,0,0,0,19,8,6,0,0,0,241,148,15,247,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97, 100,121,113,201,101,60,0,0,2,191,73,68,65,84,120,218,196,150,219,78,19,81,20,134,255,61,199,118,128,136,209,132,150,27,98,226,133,70,99,104,69,206,82,18,9,166,49,122,161,9,23,92,250,4,190,129,190,130,207,161,55,106,76,19,37,86,40,162,40,109,154,84,4, 34,98,5,76,228,2,16,122,156,233,28,92,211,169,74,109,109,13,69,88,201,206,236,116,239,174,245,173,127,173,189,103,24,200,60,30,207,29,122,4,104,180,226,144,141,81,240,123,62,255,197,187,221,221,189,80,20,229,80,131,71,34,83,16,36,73,12,140,94,13,226, @@ -8777,10 +8777,10 @@ static const unsigned char temp_bcea9320[] = 139,193,13,163,246,157,221,112,9,202,148,32,17,195,47,19,116,2,18,208,41,176,105,214,127,97,252,42,65,58,157,174,251,62,248,31,166,235,142,2,247,227,241,216,176,215,219,78,23,198,225,66,100,179,25,231,142,164,143,146,97,122,12,31,197,55,193,15,1,6,0, 156,20,41,102,255,70,71,224,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; -const char* RadioButtons01_png = (const char*) temp_bcea9320; +const char* RadioButtons01_png = (const char*) temp_81774685; //================== RadioButtons-02.png ================== -static const unsigned char temp_bcf8aaa1[] = +static const unsigned char temp_81855e06[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,31,0,0,0,19,8,6,0,0,0,104,108,214,66,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97, 100,121,113,201,101,60,0,0,2,197,73,68,65,84,120,218,196,150,107,79,19,65,20,134,223,153,157,221,110,11,36,152,20,104,52,154,144,160,40,69,32,164,40,136,52,38,24,141,31,252,79,254,31,191,154,104,248,224,133,86,80,145,134,91,32,70,32,202,69,46,134,91, 111,123,233,94,60,179,106,44,180,24,109,19,152,228,100,119,178,115,206,115,230,61,115,38,203,98,177,216,43,156,211,16,137,129,219,247,70,70,146,103,14,78,165,198,33,20,69,129,22,10,157,57,92,114,133,34,8,174,105,167,46,98,140,228,81,200,132,15,159,230, @@ -8794,10 +8794,10 @@ static const unsigned char temp_bcf8aaa1[] = 11,27,40,149,78,239,65,201,21,129,236,150,85,243,77,37,93,83,233,37,76,125,252,132,11,205,13,216,219,207,83,89,124,42,135,255,215,254,175,75,246,147,9,20,10,192,254,126,241,159,47,156,95,178,215,183,243,90,135,228,138,98,177,128,157,237,237,51,135,75, 46,163,63,153,39,231,245,39,243,67,128,1,0,60,21,103,165,70,150,193,96,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; -const char* RadioButtons02_png = (const char*) temp_bcf8aaa1; +const char* RadioButtons02_png = (const char*) temp_81855e06; //================== RadioButtons-03.png ================== -static const unsigned char temp_bd06c222[] = +static const unsigned char temp_81937587[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,31,0,0,0,19,8,6,0,0,0,104,108,214,66,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97, 100,121,113,201,101,60,0,0,2,77,73,68,65,84,120,218,196,150,219,110,211,64,16,134,255,61,196,109,66,165,86,106,47,242,32,173,8,23,69,240,16,136,103,225,142,151,42,92,34,40,32,113,1,151,160,34,78,82,213,67,148,66,147,56,118,236,181,119,205,76,156,162, 172,157,22,25,161,116,164,141,226,221,153,249,230,228,149,69,183,219,125,129,91,18,189,187,119,247,193,254,254,253,149,131,15,15,95,65,43,165,16,172,173,173,28,206,92,173,52,193,131,160,118,40,37,32,4,45,126,16,75,172,11,192,209,42,230,171,49,92,51,92, @@ -8809,10 +8809,10 @@ static const unsigned char temp_bd06c222[] = 253,155,136,179,130,202,88,194,31,61,126,114,163,110,191,63,32,93,202,60,245,225,204,45,203,158,54,203,60,163,88,191,255,56,193,206,246,75,186,44,236,245,21,162,183,228,232,243,49,205,71,74,109,170,102,254,143,101,103,57,59,51,56,120,254,14,66,220,208, 30,190,255,169,31,214,214,111,160,121,217,155,103,254,63,132,185,58,142,35,244,207,207,87,14,103,174,160,47,153,167,183,245,37,243,91,128,1,0,11,149,65,182,96,70,58,8,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; -const char* RadioButtons03_png = (const char*) temp_bd06c222; +const char* RadioButtons03_png = (const char*) temp_81937587; //================== RadioButtons-04.png ================== -static const unsigned char temp_bd14d9a3[] = +static const unsigned char temp_81a18d08[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,31,0,0,0,19,8,6,0,0,0,104,108,214,66,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97, 100,121,113,201,101,60,0,0,2,165,73,68,65,84,120,218,196,150,237,79,211,80,24,197,207,109,111,1,157,74,50,144,76,226,198,139,128,2,66,162,66,136,31,48,42,248,217,232,95,228,127,102,2,74,130,38,203,192,12,84,134,1,231,88,145,142,194,218,117,107,215,23, 159,219,161,216,161,198,200,132,155,52,109,239,189,233,239,60,231,60,109,202,18,137,196,75,156,211,224,83,211,51,15,103,103,31,156,57,120,113,113,1,92,150,101,180,181,183,159,57,92,112,185,204,9,222,214,118,98,145,177,227,235,32,248,15,112,46,224,146, @@ -8825,10 +8825,10 @@ static const unsigned char temp_bd14d9a3[] = 83,92,187,240,93,35,132,215,5,220,9,154,224,30,184,235,122,161,255,167,29,66,196,171,165,45,164,51,219,152,156,184,142,241,241,41,112,101,8,165,210,14,89,236,208,155,19,245,79,112,27,182,219,118,203,190,92,66,196,194,98,14,233,244,39,18,208,143,106,213, 167,134,182,195,202,209,74,219,255,52,42,21,134,61,109,61,188,246,253,224,196,7,233,200,246,214,86,254,183,67,112,185,101,85,176,171,170,103,14,23,92,70,127,50,47,206,235,79,230,155,0,3,0,91,7,91,249,23,102,61,167,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; -const char* RadioButtons04_png = (const char*) temp_bd14d9a3; +const char* RadioButtons04_png = (const char*) temp_81a18d08; //================== RadioButtons-05.png ================== -static const unsigned char temp_bd22f124[] = +static const unsigned char temp_81afa489[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,30,0,0,0,19,8,6,0,0,0,135,174,189,124,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,10,79,105,67,67,80,80,104,111,116,111,115,104,111,112,32,73,67,67,32,112,114,111,102,105,108,101,0, 0,120,218,157,83,103,84,83,233,22,61,247,222,244,66,75,136,128,148,75,111,82,21,8,32,82,66,139,128,20,145,38,42,33,9,16,74,136,33,161,217,21,81,193,17,69,69,4,27,200,160,136,3,142,142,128,140,21,81,44,12,138,10,216,7,228,33,162,142,131,163,136,138,202, 251,225,123,163,107,214,188,247,230,205,254,181,215,62,231,172,243,157,179,207,7,192,8,12,150,72,51,81,53,128,12,169,66,30,17,224,131,199,196,198,225,228,46,64,129,10,36,112,0,16,8,179,100,33,115,253,35,1,0,248,126,60,60,43,34,192,7,190,0,1,120,211,11, @@ -8880,10 +8880,10 @@ static const unsigned char temp_bd22f124[] = 162,63,207,207,191,252,78,47,76,49,6,14,15,19,62,191,243,5,198,88,140,57,95,51,207,205,73,170,147,228,66,176,16,240,240,225,99,176,159,49,24,68,52,91,17,113,60,230,203,175,118,209,74,32,4,164,153,37,207,237,84,135,186,200,254,53,213,207,44,73,224,94, 237,224,164,117,254,119,192,197,96,131,206,243,127,62,241,255,97,121,158,163,163,104,72,171,217,188,84,112,20,13,17,213,106,245,211,23,241,3,249,115,0,245,214,95,36,216,96,243,208,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; -const char* RadioButtons05_png = (const char*) temp_bd22f124; +const char* RadioButtons05_png = (const char*) temp_81afa489; //================== RadioButtons_neutral-01.png ================== -static const unsigned char temp_fbf03e98[] = +static const unsigned char temp_cd19bcfd[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,32,0,0,0,19,8,6,0,0,0,241,148,15,247,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97, 100,121,113,201,101,60,0,0,2,103,73,68,65,84,120,218,196,86,221,75,83,97,28,126,206,217,217,161,177,205,64,177,121,154,125,96,132,23,125,144,36,117,219,77,222,108,115,36,74,11,22,140,210,182,187,162,174,130,46,250,83,6,121,83,162,99,69,69,17,164,77,152, 168,67,48,203,106,141,105,160,172,109,110,147,181,185,243,181,211,123,142,37,68,251,10,199,250,193,15,94,206,251,62,239,243,252,62,248,157,151,82,20,5,28,199,221,49,27,141,55,201,218,140,22,27,67,200,31,234,245,250,251,54,199,32,123,200,194,181,148,252, @@ -8896,10 +8896,10 @@ static const unsigned char temp_fbf03e98[] = 209,58,51,61,253,79,231,101,53,3,162,36,255,136,126,90,197,177,158,19,45,255,25,169,101,99,120,129,127,176,188,242,62,176,83,42,193,108,110,237,123,68,18,69,80,191,94,68,151,140,6,131,75,71,211,7,90,157,133,159,2,12,0,238,13,9,71,19,58,158,165,0,0,0, 0,73,69,78,68,174,66,96,130,0,0 }; -const char* RadioButtons_neutral01_png = (const char*) temp_fbf03e98; +const char* RadioButtons_neutral01_png = (const char*) temp_cd19bcfd; //================== RadioButtons_neutral-02.png ================== -static const unsigned char temp_fbfe5619[] = +static const unsigned char temp_cd27d47e[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,31,0,0,0,19,8,6,0,0,0,104,108,214,66,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97, 100,121,113,201,101,60,0,0,2,54,73,68,65,84,120,218,196,150,207,79,19,65,20,199,191,187,157,182,86,131,166,254,72,69,19,13,141,137,49,30,12,218,131,225,102,106,140,129,112,52,210,150,67,19,53,130,240,223,104,188,123,210,196,171,98,148,6,127,20,104,145, 32,28,48,129,130,201,66,65,91,160,148,110,161,178,219,157,226,204,28,56,176,187,13,182,164,125,201,203,190,153,247,94,62,243,230,205,76,86,186,226,247,43,104,146,144,182,54,255,229,59,119,239,53,28,252,57,246,9,196,225,112,192,229,118,55,28,206,185,68, @@ -8911,10 +8911,10 @@ static const unsigned char temp_fbfe5619[] = 158,112,24,14,246,30,124,249,26,199,204,244,76,213,60,81,121,133,87,94,7,156,75,60,62,42,212,235,245,34,111,113,126,44,225,188,114,42,122,174,29,201,123,157,205,102,14,29,75,69,207,217,150,233,53,246,188,30,225,92,98,148,203,88,77,47,55,28,206,185,68, 85,11,175,152,54,229,79,230,159,0,3,0,178,38,58,166,235,164,14,20,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; -const char* RadioButtons_neutral02_png = (const char*) temp_fbfe5619; +const char* RadioButtons_neutral02_png = (const char*) temp_cd27d47e; //================== RadioButtons_neutral-03.png ================== -static const unsigned char temp_fc0c6d9a[] = +static const unsigned char temp_cd35ebff[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,31,0,0,0,19,8,6,0,0,0,104,108,214,66,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97, 100,121,113,201,101,60,0,0,1,165,73,68,65,84,120,218,196,150,109,75,194,80,20,199,207,220,221,172,12,21,122,130,40,76,139,94,7,245,162,122,19,73,244,213,194,143,209,75,251,0,69,169,212,103,136,232,77,132,154,104,69,234,210,72,216,195,189,235,222,13,133, 218,217,70,19,244,63,198,6,255,115,206,111,231,222,187,187,73,91,185,92,13,166,36,146,205,230,50,199,39,167,19,7,223,150,111,128,200,178,12,106,60,62,113,184,224,146,88,44,6,241,41,192,5,215,129,43,138,226,49,91,141,58,88,166,25,88,192,182,25,100,54, @@ -8924,10 +8924,10 @@ static const unsigned char temp_fc0c6d9a[] = 66,33,48,174,82,42,65,235,237,3,239,156,137,206,35,192,219,29,13,170,181,122,104,220,211,115,21,173,47,184,132,58,115,254,127,184,200,185,40,22,35,239,237,212,153,115,190,98,141,8,115,62,174,4,151,136,143,71,179,241,50,113,184,224,146,126,191,119,206, 207,169,252,201,252,8,48,0,227,76,197,247,89,122,10,69,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; -const char* RadioButtons_neutral03_png = (const char*) temp_fc0c6d9a; +const char* RadioButtons_neutral03_png = (const char*) temp_cd35ebff; //================== RadioButtons_neutral-04.png ================== -static const unsigned char temp_fc1a851b[] = +static const unsigned char temp_cd440380[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,31,0,0,0,19,8,6,0,0,0,104,108,214,66,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97, 100,121,113,201,101,60,0,0,2,27,73,68,65,84,120,218,196,150,109,79,211,80,24,134,239,182,167,29,219,50,100,176,110,200,48,203,22,127,5,209,15,4,162,63,68,72,36,209,175,26,241,215,248,7,28,159,36,129,69,92,228,69,167,113,250,9,156,16,141,14,98,125,9,91, 11,117,93,123,138,61,167,209,4,219,17,18,203,246,36,39,79,211,59,231,190,158,231,188,52,21,174,150,74,159,48,160,32,197,98,169,48,61,123,163,239,224,181,202,10,136,36,73,80,98,177,190,195,25,151,136,162,136,216,0,224,140,203,225,178,44,7,196,159,223, @@ -8939,10 +8939,10 @@ static const unsigned char temp_fc1a851b[] = 106,149,103,195,180,60,111,59,212,159,113,9,229,123,110,93,200,247,251,217,218,211,158,26,229,123,78,233,185,14,87,212,193,184,132,221,229,253,47,159,251,14,103,92,162,235,237,71,222,24,200,159,204,111,1,6,0,203,214,249,255,62,204,159,178,0,0,0,0,73, 69,78,68,174,66,96,130,0,0 }; -const char* RadioButtons_neutral04_png = (const char*) temp_fc1a851b; +const char* RadioButtons_neutral04_png = (const char*) temp_cd440380; //================== RadioButtons_neutral-05.png ================== -static const unsigned char temp_fc289c9c[] = +static const unsigned char temp_cd521b01[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,30,0,0,0,19,8,6,0,0,0,135,174,189,124,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,10,79,105,67,67,80,80,104,111,116,111,115,104,111,112,32,73,67,67,32,112,114,111,102,105,108,101,0, 0,120,218,157,83,103,84,83,233,22,61,247,222,244,66,75,136,128,148,75,111,82,21,8,32,82,66,139,128,20,145,38,42,33,9,16,74,136,33,161,217,21,81,193,17,69,69,4,27,200,160,136,3,142,142,128,140,21,81,44,12,138,10,216,7,228,33,162,142,131,163,136,138,202, 251,225,123,163,107,214,188,247,230,205,254,181,215,62,231,172,243,157,179,207,7,192,8,12,150,72,51,81,53,128,12,169,66,30,17,224,131,199,196,198,225,228,46,64,129,10,36,112,0,16,8,179,100,33,115,253,35,1,0,248,126,60,60,43,34,192,7,190,0,1,120,211,11, @@ -8993,10 +8993,10 @@ static const unsigned char temp_fc289c9c[] = 229,42,213,143,142,62,250,227,151,203,24,65,139,24,130,192,255,173,248,237,236,204,95,123,50,69,12,90,68,234,14,193,191,10,17,65,135,229,50,139,153,249,134,130,195,114,25,157,207,187,183,242,121,183,225,63,144,239,3,0,218,200,55,245,184,64,106,163,0, 0,0,0,73,69,78,68,174,66,96,130,0,0 }; -const char* RadioButtons_neutral05_png = (const char*) temp_fc289c9c; +const char* RadioButtons_neutral05_png = (const char*) temp_cd521b01; //================== RadioButtons_selected-01.png ================== -static const unsigned char temp_789007d8[] = +static const unsigned char temp_cc965613[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,32,0,0,0,19,8,6,0,0,0,241,148,15,247,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97, 100,121,113,201,101,60,0,0,2,134,73,68,65,84,120,218,196,86,75,104,19,81,20,61,47,153,76,147,104,90,146,214,106,68,65,116,81,116,99,43,72,109,87,21,139,65,171,82,161,152,44,20,233,39,70,10,69,219,69,161,16,138,96,65,186,112,227,82,139,248,87,106,53,169, 46,20,252,130,138,40,45,88,41,46,130,198,66,193,79,98,205,111,38,49,153,207,115,146,148,34,152,31,166,140,15,238,48,188,251,206,187,231,157,185,239,222,33,148,82,88,173,214,147,235,170,140,221,162,76,77,80,121,48,74,240,83,134,10,118,104,120,231,6,118, @@ -9009,10 +9009,10 @@ static const unsigned char temp_789007d8[] = 201,56,82,41,9,166,77,13,152,187,228,46,9,35,137,52,171,0,207,211,101,41,173,252,195,9,229,57,81,242,122,81,82,20,72,73,50,247,52,160,67,163,73,84,189,25,101,114,32,250,75,112,79,250,5,79,108,173,1,171,85,110,138,73,65,6,89,252,35,106,169,54,232,28,74, 103,210,171,173,194,111,1,6,0,169,191,241,34,56,210,107,35,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; -const char* RadioButtons_selected01_png = (const char*) temp_789007d8; +const char* RadioButtons_selected01_png = (const char*) temp_cc965613; //================== RadioButtons_selected-02.png ================== -static const unsigned char temp_789e1f59[] = +static const unsigned char temp_cca46d94[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,31,0,0,0,19,8,6,0,0,0,104,108,214,66,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97, 100,121,113,201,101,60,0,0,2,102,73,68,65,84,120,218,196,150,77,104,19,65,20,199,255,187,153,181,201,134,212,24,42,126,32,86,15,133,10,69,26,40,162,17,84,68,41,10,18,84,90,171,205,69,37,135,74,241,82,240,3,188,120,241,100,241,224,199,69,17,60,104,75, 43,22,105,197,70,35,226,71,139,7,17,63,138,20,139,208,18,164,24,107,178,105,178,155,110,146,221,117,102,11,10,238,166,132,180,164,11,111,118,118,222,188,249,241,248,207,155,89,210,88,183,121,18,203,244,144,237,155,106,106,187,154,86,85,28,220,253,62, @@ -9025,10 +9025,10 @@ static const unsigned char temp_789e1f59[] = 177,168,3,67,121,209,135,31,212,156,94,31,213,57,81,82,12,227,146,130,166,67,150,141,37,57,175,101,249,119,201,115,25,215,212,92,206,26,21,191,88,76,205,213,188,142,47,169,202,223,106,140,75,98,178,113,47,38,107,203,242,39,243,71,128,1,0,163,90,231,150, 52,232,169,252,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; -const char* RadioButtons_selected02_png = (const char*) temp_789e1f59; +const char* RadioButtons_selected02_png = (const char*) temp_cca46d94; //================== RadioButtons_selected-03.png ================== -static const unsigned char temp_78ac36da[] = +static const unsigned char temp_ccb28515[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,31,0,0,0,19,8,6,0,0,0,104,108,214,66,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97, 100,121,113,201,101,60,0,0,1,190,73,68,65,84,120,218,196,150,189,79,194,80,20,197,207,43,79,144,26,163,68,6,29,140,50,24,29,77,208,196,56,56,184,57,27,157,116,112,116,246,223,80,255,5,227,226,234,224,199,164,51,241,35,58,56,104,116,129,176,16,48,10,161, 69,90,222,135,125,69,166,190,130,96,130,55,13,29,238,61,231,215,155,243,82,74,230,103,82,89,252,83,209,165,233,228,212,222,66,162,239,224,131,251,79,80,18,33,136,154,70,223,225,138,75,13,239,39,22,239,63,92,113,155,155,15,146,64,243,170,48,140,34,27, @@ -9038,10 +9038,10 @@ static const unsigned char temp_78ac36da[] = 133,212,250,251,240,134,191,185,236,26,30,27,107,26,174,31,92,181,157,187,187,60,209,250,43,46,229,76,162,246,213,61,220,204,102,80,127,56,237,56,55,116,123,140,90,61,232,175,184,148,113,1,219,238,30,14,187,134,199,163,195,158,223,237,138,235,103,110, 247,176,249,95,203,207,220,105,8,60,85,250,255,175,166,184,52,111,203,227,188,205,255,229,75,230,91,128,1,0,165,175,191,223,100,163,205,167,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; -const char* RadioButtons_selected03_png = (const char*) temp_78ac36da; +const char* RadioButtons_selected03_png = (const char*) temp_ccb28515; //================== RadioButtons_selected-04.png ================== -static const unsigned char temp_78ba4e5b[] = +static const unsigned char temp_ccc09c96[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,31,0,0,0,19,8,6,0,0,0,104,108,214,66,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97, 100,121,113,201,101,60,0,0,2,100,73,68,65,84,120,218,196,150,77,104,211,96,24,199,255,111,154,102,205,92,221,186,85,17,71,173,58,198,188,232,6,14,84,148,162,172,226,7,76,70,65,119,216,209,195,64,60,41,130,99,87,15,122,24,168,7,5,79,83,97,8,165,155,122, 17,199,16,25,58,61,104,81,118,152,173,171,19,183,22,109,221,154,146,164,31,107,154,248,38,21,81,147,94,180,235,2,239,75,194,147,252,127,255,231,125,222,143,144,174,246,29,159,177,78,23,187,127,187,219,123,177,219,85,115,240,200,155,52,88,98,35,224,234, @@ -9054,10 +9054,10 @@ static const unsigned char temp_78ba4e5b[] = 225,201,103,241,213,66,95,231,178,74,73,133,44,107,107,178,127,71,158,62,174,24,211,185,70,205,229,156,86,243,131,197,168,121,161,168,98,54,83,251,83,77,231,146,206,157,219,70,215,235,79,230,135,0,3,0,71,200,242,251,63,187,157,122,0,0,0,0,73,69,78,68, 174,66,96,130,0,0 }; -const char* RadioButtons_selected04_png = (const char*) temp_78ba4e5b; +const char* RadioButtons_selected04_png = (const char*) temp_ccc09c96; //================== RadioButtons_selected-05.png ================== -static const unsigned char temp_78c865dc[] = +static const unsigned char temp_ccceb417[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,30,0,0,0,19,8,6,0,0,0,135,174,189,124,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,10,79,105,67,67,80,80,104,111,116,111,115,104,111,112,32,73,67,67,32,112,114,111,102,105,108,101,0, 0,120,218,157,83,103,84,83,233,22,61,247,222,244,66,75,136,128,148,75,111,82,21,8,32,82,66,139,128,20,145,38,42,33,9,16,74,136,33,161,217,21,81,193,17,69,69,4,27,200,160,136,3,142,142,128,140,21,81,44,12,138,10,216,7,228,33,162,142,131,163,136,138,202, 251,225,123,163,107,214,188,247,230,205,254,181,215,62,231,172,243,157,179,207,7,192,8,12,150,72,51,81,53,128,12,169,66,30,17,224,131,199,196,198,225,228,46,64,129,10,36,112,0,16,8,179,100,33,115,253,35,1,0,248,126,60,60,43,34,192,7,190,0,1,120,211,11, @@ -9108,10 +9108,10 @@ static const unsigned char temp_78c865dc[] = 67,47,42,109,196,133,131,158,216,185,173,106,221,105,147,89,82,137,21,26,39,18,154,254,235,201,213,60,226,64,151,202,198,52,99,235,6,155,222,129,127,54,50,165,90,172,177,249,59,150,208,89,45,165,141,110,69,109,250,195,137,253,157,172,168,141,30,48,99, 15,3,166,34,209,235,207,0,161,143,20,90,35,156,236,45,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; -const char* RadioButtons_selected05_png = (const char*) temp_78c865dc; +const char* RadioButtons_selected05_png = (const char*) temp_ccceb417; //================== RadioButtons_selected_over-01.png ================== -static const unsigned char temp_a1a89ec7[] = +static const unsigned char temp_6010fd6c[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,32,0,0,0,19,8,6,0,0,0,241,148,15,247,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97, 100,121,113,201,101,60,0,0,2,239,73,68,65,84,120,218,196,86,93,72,20,81,20,254,238,236,236,56,179,174,43,91,130,187,130,136,97,81,22,244,3,105,8,134,105,168,245,32,229,147,15,10,25,37,173,81,212,67,15,86,15,65,68,244,212,83,62,244,24,65,68,166,32,18, 132,63,69,17,82,61,20,171,65,81,216,139,144,238,34,106,59,59,251,51,51,247,118,103,86,130,220,137,149,86,182,129,195,12,115,206,61,223,119,190,57,247,204,37,140,49,4,131,193,75,213,91,188,251,240,31,46,145,131,223,80,138,164,129,211,117,85,82,169,34, @@ -9125,10 +9125,10 @@ static const unsigned char temp_a1a89ec7[] = 210,200,69,104,11,12,70,130,75,111,58,47,213,51,4,0,45,145,231,72,227,242,106,99,67,8,38,77,148,214,236,194,252,232,29,104,81,10,211,2,167,127,95,102,242,166,180,21,136,199,55,103,184,171,35,195,246,76,128,201,96,234,185,135,164,97,114,5,210,38,85,167, 34,110,212,151,24,155,244,143,219,120,49,86,15,144,64,32,112,130,63,143,52,87,40,40,47,236,113,0,95,227,156,192,218,137,168,105,171,226,238,226,127,38,185,208,39,162,95,2,12,0,137,200,31,90,212,72,119,82,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; -const char* RadioButtons_selected_over01_png = (const char*) temp_a1a89ec7; +const char* RadioButtons_selected_over01_png = (const char*) temp_6010fd6c; //================== RadioButtons_selected_over-02.png ================== -static const unsigned char temp_a1b6b648[] = +static const unsigned char temp_601f14ed[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,31,0,0,0,19,8,6,0,0,0,104,108,214,66,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97, 100,121,113,201,101,60,0,0,2,216,73,68,65,84,120,218,196,149,79,72,84,65,28,199,191,51,239,237,190,221,183,184,166,22,145,84,70,137,97,90,33,107,218,22,129,18,17,29,162,67,66,209,255,78,117,137,14,29,11,138,200,110,17,116,232,84,80,116,8,73,41,188,164, 93,182,63,104,148,34,149,186,176,22,37,122,200,63,152,171,187,179,239,173,251,254,52,111,246,80,235,110,82,107,232,240,230,49,204,252,230,247,249,205,124,103,126,67,130,91,202,31,96,153,138,188,110,165,255,116,83,213,234,37,7,183,14,142,67,46,81,101, @@ -9142,10 +9142,10 @@ static const unsigned char temp_a1b6b648[] = 152,175,120,22,147,161,155,152,126,23,130,33,206,65,238,121,14,87,54,121,150,74,104,139,72,214,60,247,176,246,86,140,116,182,65,45,41,130,30,157,134,153,180,97,25,88,240,254,59,92,217,48,45,48,246,31,94,138,152,141,217,169,169,116,251,47,220,57,92,161, 57,211,236,37,127,82,133,230,201,148,133,254,25,186,228,112,135,43,143,50,251,225,40,51,177,28,229,167,0,3,0,110,188,26,228,110,165,221,163,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; -const char* RadioButtons_selected_over02_png = (const char*) temp_a1b6b648; +const char* RadioButtons_selected_over02_png = (const char*) temp_601f14ed; //================== RadioButtons_selected_over-03.png ================== -static const unsigned char temp_a1c4cdc9[] = +static const unsigned char temp_602d2c6e[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,31,0,0,0,19,8,6,0,0,0,104,108,214,66,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97, 100,121,113,201,101,60,0,0,2,101,73,68,65,84,120,218,196,150,61,143,211,64,16,134,223,89,111,226,195,7,220,33,78,66,128,34,16,80,5,209,32,1,66,162,165,161,166,160,65,80,208,242,51,248,13,84,72,92,139,104,168,40,40,174,58,10,26,78,66,87,33,133,143,0,34, 137,20,146,216,107,39,142,215,203,172,147,226,108,135,128,41,114,43,37,78,188,51,243,236,188,51,187,54,221,108,94,122,142,67,26,178,177,117,252,193,221,203,167,86,14,126,185,223,129,60,233,73,220,56,99,86,14,223,249,36,33,133,67,112,143,136,242,44,21, @@ -9158,10 +9158,10 @@ static const unsigned char temp_a1c4cdc9[] = 233,51,62,35,150,31,110,188,153,144,140,121,129,186,80,115,61,175,185,138,254,243,233,48,250,71,191,5,102,89,205,39,124,122,125,24,138,149,63,82,45,87,182,149,217,110,43,125,40,111,50,191,5,24,0,98,67,27,130,54,13,67,66,0,0,0,0,73,69,78,68,174,66,96, 130,0,0 }; -const char* RadioButtons_selected_over03_png = (const char*) temp_a1c4cdc9; +const char* RadioButtons_selected_over03_png = (const char*) temp_602d2c6e; //================== RadioButtons_selected_over-04.png ================== -static const unsigned char temp_a1d2e54a[] = +static const unsigned char temp_603b43ef[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,31,0,0,0,19,8,6,0,0,0,104,108,214,66,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97, 100,121,113,201,101,60,0,0,2,211,73,68,65,84,120,218,196,150,205,75,20,97,28,199,191,207,204,179,186,179,187,90,90,184,100,25,26,43,149,122,176,64,74,33,37,148,204,50,12,234,84,135,110,65,151,110,29,252,51,58,132,208,169,46,5,33,228,91,210,139,96,16, 145,93,180,178,14,97,104,33,42,235,186,235,174,59,179,187,243,246,60,61,179,43,184,57,219,69,86,125,96,102,96,158,121,158,207,247,247,250,12,105,109,8,61,193,62,13,90,115,184,252,206,205,198,224,158,131,7,127,132,65,15,249,40,206,85,243,61,135,79,46, @@ -9175,10 +9175,10 @@ static const unsigned char temp_a1d2e54a[] = 109,113,164,210,69,236,159,73,142,228,203,87,66,196,56,202,58,175,192,79,85,68,23,8,212,117,6,61,143,227,112,169,37,154,133,166,237,66,243,222,224,248,250,98,12,114,73,174,166,109,131,131,153,121,49,183,55,99,174,165,119,249,84,35,238,30,144,141,185, 110,50,204,38,164,61,63,82,29,46,93,212,248,211,69,205,222,151,63,153,191,2,12,0,199,181,70,142,38,155,205,86,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; -const char* RadioButtons_selected_over04_png = (const char*) temp_a1d2e54a; +const char* RadioButtons_selected_over04_png = (const char*) temp_603b43ef; //================== RadioButtons_selected_over-05.png ================== -static const unsigned char temp_a1e0fccb[] = +static const unsigned char temp_60495b70[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,30,0,0,0,19,8,6,0,0,0,135,174,189,124,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,156,24,0,0,10,79,105,67,67,80,80,104,111,116,111,115,104,111,112,32,73,67,67,32,112,114,111,102,105,108,101,0, 0,120,218,157,83,103,84,83,233,22,61,247,222,244,66,75,136,128,148,75,111,82,21,8,32,82,66,139,128,20,145,38,42,33,9,16,74,136,33,161,217,21,81,193,17,69,69,4,27,200,160,136,3,142,142,128,140,21,81,44,12,138,10,216,7,228,33,162,142,131,163,136,138,202, 251,225,123,163,107,214,188,247,230,205,254,181,215,62,231,172,243,157,179,207,7,192,8,12,150,72,51,81,53,128,12,169,66,30,17,224,131,199,196,198,225,228,46,64,129,10,36,112,0,16,8,179,100,33,115,253,35,1,0,248,126,60,60,43,34,192,7,190,0,1,120,211,11, @@ -9231,10 +9231,10 @@ static const unsigned char temp_a1e0fccb[] = 210,38,160,217,252,135,89,141,144,218,222,213,127,69,126,47,211,166,159,227,102,123,180,167,147,214,1,202,239,5,92,241,228,72,133,253,94,128,218,110,134,159,111,55,205,200,111,32,127,13,0,111,180,58,50,205,148,146,75,0,0,0,0,73,69,78,68,174,66,96,130, 0,0 }; -const char* RadioButtons_selected_over05_png = (const char*) temp_a1e0fccb; +const char* RadioButtons_selected_over05_png = (const char*) temp_60495b70; //================== noise_wave.png ================== -static const unsigned char temp_2ada9d3c[] = +static const unsigned char temp_8b0a9eb7[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,4,101,0,0,2,30,8,6,0,0,0,18,223,178,102,0,0,0,9,112,72,89,115,0,0,23,18,0,0,23,18,1,103,159,210,82,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101, 97,100,121,113,201,101,60,0,0,76,229,73,68,65,84,120,218,236,221,235,149,21,55,214,48,96,13,203,255,221,95,4,212,68,64,59,2,202,17,24,71,48,77,4,47,142,192,77,4,120,34,160,39,2,112,4,20,17,24,34,112,57,2,67,4,243,181,56,167,135,6,250,114,46,117,145,180, 159,103,173,90,96,3,125,78,237,146,84,210,46,149,244,143,4,0,0,0,172,229,228,242,56,189,60,186,237,113,155,225,242,248,112,121,188,19,50,0,0,0,128,253,229,36,204,217,229,241,242,242,248,243,242,248,239,1,199,155,203,227,60,109,146,57,0,0,0,0,220,225, @@ -9516,10 +9516,10 @@ static const unsigned char temp_2ada9d3c[] = 73,212,228,227,97,186,249,117,163,15,151,199,251,203,99,220,30,131,176,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 176,175,255,47,192,0,205,180,140,11,223,168,97,120,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; -const char* noise_wave_png = (const char*) temp_2ada9d3c; +const char* noise_wave_png = (const char*) temp_8b0a9eb7; //================== saw_wave.png ================== -static const unsigned char temp_fad5260d[] = +static const unsigned char temp_247d4a48[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,4,180,0,0,2,143,8,6,0,0,0,116,54,147,247,0,0,0,9,112,72,89,115,0,0,23,18,0,0,23,18,1,103,159,210,82,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101, 97,100,121,113,201,101,60,0,0,41,190,73,68,65,84,120,218,236,221,141,149,212,102,186,174,225,103,38,129,211,206,64,206,0,71,176,69,6,56,130,45,34,216,16,1,69,4,248,68,208,58,17,152,12,90,19,1,236,8,80,6,144,129,143,100,53,174,6,131,145,212,245,163,159, 235,90,235,93,94,158,25,51,174,183,170,87,21,55,42,125,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,151,242, @@ -9661,10 +9661,10 @@ static const unsigned char temp_fad5260d[] = 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,231,254,191,0,3,0,11,98,146,161,132,82,43,233,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; -const char* saw_wave_png = (const char*) temp_fad5260d; +const char* saw_wave_png = (const char*) temp_247d4a48; //================== sine_wave.png ================== -static const unsigned char temp_eb0332c3[] = +static const unsigned char temp_f65f95e8[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,4,180,0,0,2,171,8,6,0,0,0,232,11,212,215,0,0,0,9,112,72,89,115,0,0,23,18,0,0,23,18,1,103,159,210,82,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101, 97,100,121,113,201,101,60,0,0,49,204,73,68,65,84,120,218,236,221,175,151,36,199,149,40,224,24,205,3,122,200,13,197,156,203,196,92,102,102,78,49,9,109,137,237,178,52,123,102,229,191,96,211,232,157,69,101,182,176,198,200,107,84,18,178,141,170,133,158,88, 143,153,30,170,22,211,67,51,98,54,242,203,112,85,107,122,52,61,221,153,89,249,43,50,191,239,156,123,122,108,31,219,163,232,200,31,113,51,238,141,15,2,0,0,0,0,36,228,3,67,0,0,0,0,64,74,36,180,0,0,0,0,72,138,132,22,0,0,0,0,73,145,208,2,0,0,0,32,41,18,90, @@ -9837,10 +9837,10 @@ static const unsigned char temp_eb0332c3[] = 104,1,0,0,0,144,20,9,45,0,0,0,0,146,34,161,5,0,0,0,64,82,36,180,0,0,0,0,72,138,132,22,0,0,0,0,73,145,208,2,0,0,0,32,41,18,90,0,0,0,0,36,69,66,11,0,0,0,128,164,72,104,1,0,0,0,144,20,9,45,0,0,0,0,146,242,255,5,24,0,142,248,78,14,98,33,228,71,0,0,0,0,73, 69,78,68,174,66,96,130,0,0 }; -const char* sine_wave_png = (const char*) temp_eb0332c3; +const char* sine_wave_png = (const char*) temp_f65f95e8; //================== square_wave.png ================== -static const unsigned char temp_727226f3[] = +static const unsigned char temp_184254d8[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,4,164,0,0,2,171,8,6,0,0,0,207,165,85,63,0,0,0,9,112,72,89,115,0,0,23,18,0,0,23,18,1,103,159,210,82,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101, 97,100,121,113,201,101,60,0,0,23,205,73,68,65,84,120,218,236,221,63,146,148,199,1,198,225,214,138,64,153,55,116,230,225,4,94,157,128,209,9,88,78,160,37,115,6,156,0,113,2,164,208,17,67,228,114,36,136,28,50,202,156,105,201,148,121,148,217,25,206,164,204, 221,254,190,45,244,7,73,32,161,151,233,238,231,169,234,98,237,64,59,221,223,4,83,191,237,238,41,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -9911,10 +9911,10 @@ static const unsigned char temp_727226f3[] = 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,14,253,79,128,1,0,153,2,27,8,33,213,49,244,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; -const char* square_wave_png = (const char*) temp_727226f3; +const char* square_wave_png = (const char*) temp_184254d8; //================== triangle_wave.png ================== -static const unsigned char temp_3825ab28[] = +static const unsigned char temp_aaa1f3cd[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,4,172,0,0,2,113,8,6,0,0,0,111,215,42,130,0,0,0,9,112,72,89,115,0,0,23,18,0,0,23,18,1,103,159,210,82,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101, 97,100,121,113,201,101,60,0,0,32,173,73,68,65,84,120,218,236,221,251,145,85,199,122,198,225,214,113,2,100,224,9,129,12,204,201,128,16,94,101,64,8,100,160,16,80,6,132,128,28,1,114,4,216,17,72,25,224,189,197,12,12,48,151,125,89,151,175,187,159,167,170, 171,252,199,41,219,181,46,189,250,251,157,13,180,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -10023,10 +10023,10 @@ static const unsigned char temp_3825ab28[] = 253,85,213,43,183,1,0,0,0,128,31,189,110,95,226,209,150,161,42,46,59,0,0,0,0,207,121,117,88,239,219,122,161,234,248,107,174,184,204,0,0,0,0,156,235,248,247,73,165,125,137,87,215,254,171,130,199,72,245,166,125,249,203,222,1,88,193,47,46,1,0,0,48,161,151, 183,235,230,176,254,235,153,255,236,127,31,214,223,135,245,231,97,253,225,210,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,244,239,255,5,24,0,2,125,7,137,153,101,243,194,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; -const char* triangle_wave_png = (const char*) temp_3825ab28; +const char* triangle_wave_png = (const char*) temp_aaa1f3cd; //================== wifi.png ================== -static const unsigned char temp_4168e213[] = +static const unsigned char temp_2a5bce[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,1,64,0,0,0,247,8,6,0,0,0,108,40,141,211,0,0,0,9,112,72,89,115,0,0,46,35,0,0,46,35,1,120,165,63,118,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101, 97,100,121,113,201,101,60,0,0,12,225,73,68,65,84,120,218,236,221,139,117,27,199,21,128,225,81,5,102,7,70,7,70,7,130,43,8,58,8,84,65,144,10,12,87,0,167,2,56,21,192,169,128,84,5,164,42,32,93,1,169,10,28,236,209,64,130,104,62,0,98,95,51,247,251,207,185, 135,142,148,248,132,187,51,255,222,59,51,187,55,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,109,242,206,37,64,75,92,236,98,250,196,159,79,243,223,157,202,205,46,30,30,253,217,67,254,115,128,0,209,57,123,121,77,114,52, @@ -10076,10 +10076,10 @@ static const unsigned char temp_4168e213[] = 242,3,16,82,130,228,7,32,164,4,201,15,64,72,9,146,31,128,144,18,36,63,0,33,37,72,126,0,66,74,144,252,0,132,148,32,249,1,8,41,65,242,3,16,82,130,228,7,32,164,4,201,15,64,72,9,146,31,128,144,18,36,63,0,33,37,72,126,0,66,74,144,252,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,45,252,95,128,1,0,166,155,18,218,219,72,225,153,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; -const char* wifi_png = (const char*) temp_4168e213; +const char* wifi_png = (const char*) temp_2a5bce; //================== SourceDrop.png ================== -static const unsigned char temp_77043408[] = +static const unsigned char temp_d7343583[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,154,0,0,2,209,8,6,0,0,0,163,255,186,145,0,0,0,9,112,72,89,115,0,0,46,35,0,0,46,35,1,120,165,63,118,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101, 97,100,121,113,201,101,60,0,0,24,15,73,68,65,84,120,218,236,157,49,118,219,58,155,64,225,252,234,199,59,120,76,55,93,244,78,154,233,66,173,192,206,10,34,55,108,99,175,64,210,10,226,180,106,44,175,32,206,10,68,151,83,228,68,89,65,152,106,202,167,233,166, 203,224,139,32,255,50,4,82,36,69,144,50,113,239,57,140,98,218,164,36,232,234,3,64,2,31,206,212,137,144,36,201,185,126,24,234,45,214,219,95,122,139,244,38,251,190,206,231,243,105,195,207,181,52,207,211,36,35,253,58,211,6,95,163,188,190,101,133,67,178, @@ -10169,10 +10169,10 @@ static const unsigned char temp_77043408[] = 26,164,75,209,72,34,211,28,63,74,138,38,66,201,96,214,123,31,215,202,78,82,52,153,53,99,58,3,113,133,118,4,84,67,196,90,153,246,239,131,61,5,46,8,209,140,108,43,83,16,183,166,173,177,173,50,183,237,162,119,53,170,131,166,73,95,128,80,217,182,35,165,183, 255,53,143,89,151,98,217,252,191,0,3,0,92,224,0,25,78,103,130,40,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; -const char* SourceDrop_png = (const char*) temp_77043408; +const char* SourceDrop_png = (const char*) temp_d7343583; //================== DefaultDataSource.png ================== -static const unsigned char temp_1f71843e[] = +static const unsigned char temp_f39ef263[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,14,0,0,2,14,8,6,0,0,0,208,187,133,57,0,0,0,9,112,72,89,115,0,0,46,35,0,0,46,35,1,120,165,63,118,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97, 100,121,113,201,101,60,0,0,54,204,73,68,65,84,120,218,236,221,219,113,27,71,211,198,241,33,234,187,55,51,240,58,2,193,55,46,251,74,171,8,76,69,32,40,2,137,17,144,140,64,100,4,130,34,16,20,129,86,87,118,249,198,80,4,239,58,3,58,131,15,35,244,90,16,5,146, 56,236,244,116,207,252,127,85,44,218,239,129,0,22,187,179,207,246,156,78,2,0,247,254,248,243,175,118,227,95,167,171,159,211,141,127,255,65,254,179,109,78,31,248,239,182,185,93,253,44,31,248,239,63,221,249,247,165,252,127,190,252,127,127,251,245,151,37, @@ -10371,10 +10371,10 @@ static const unsigned char temp_1f71843e[] = 124,222,248,247,158,65,139,0,193,1,192,126,193,98,168,90,68,177,106,209,200,63,55,193,126,229,98,168,20,12,255,252,175,252,243,80,45,88,50,72,17,32,56,0,200,27,52,54,181,59,252,95,159,110,249,207,134,39,255,135,220,74,24,248,166,114,64,133,0,40,207,255, 11,48,0,82,9,189,51,228,54,205,183,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; -const char* DefaultDataSource_png = (const char*) temp_1f71843e; +const char* DefaultDataSource_png = (const char*) temp_f39ef263; //================== FileReaderIcon.png ================== -static const unsigned char temp_745ce456[] = +static const unsigned char temp_5169b051[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,43,0,0,2,165,8,6,0,0,0,10,20,172,128,0,0,0,9,112,72,89,115,0,0,46,35,0,0,46,35,1,120,165,63,118,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97, 100,121,113,201,101,60,0,0,13,207,73,68,65,84,120,218,236,221,193,109,219,102,24,199,97,167,224,189,217,160,26,33,39,130,60,69,222,32,27,68,217,160,157,64,244,6,217,32,242,4,237,6,97,78,36,120,202,8,234,6,206,4,233,171,194,45,138,130,110,42,231,179,244, 138,126,30,224,3,115,50,132,191,232,234,87,17,65,94,12,227,244,245,234,219,250,171,60,62,37,122,45,159,227,220,101,121,45,109,83,223,93,1,192,194,188,248,159,177,2,23,27,113,113,190,216,69,220,2,98,5,96,9,17,183,143,243,123,162,215,178,207,242,90,34, @@ -10420,10 +10420,10 @@ static const unsigned char temp_745ce456[] = 127,254,79,195,56,173,205,12,0,100,141,149,205,253,1,0,120,20,143,129,0,0,177,2,0,32,86,0,0,177,2,0,32,86,0,0,196,10,0,32,86,0,0,196,10,0,32,86,0,0,196,10,0,128,88,1,0,196,10,0,128,88,1,0,196,10,0,128,88,1,0,16,43,0,128,88,1,0,16,43,0,128,88,1,0,16,43, 0,0,98,5,0,16,43,0,0,167,240,135,0,3,0,22,72,102,252,69,115,49,232,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; -const char* FileReaderIcon_png = (const char*) temp_745ce456; +const char* FileReaderIcon_png = (const char*) temp_5169b051; //================== IntanIcon.png ================== -static const unsigned char temp_18972d[] = +static const unsigned char temp_b74fa52[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,88,0,0,2,88,8,6,0,0,0,190,102,152,220,0,0,0,9,112,72,89,115,0,0,46,35,0,0,46,35,1,120,165,63,118,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101, 97,100,121,113,201,101,60,0,0,63,109,73,68,65,84,120,218,236,221,219,117,219,198,162,6,96,56,43,239,155,187,130,208,21,88,126,201,74,158,76,87,96,185,2,83,21,88,170,64,82,5,146,43,16,93,129,229,10,68,63,37,43,47,86,42,48,83,193,81,42,216,7,99,13,19,154, 230,5,131,27,1,242,251,214,194,102,182,197,203,112,0,2,63,102,6,131,39,89,71,252,246,251,31,71,249,67,88,134,249,242,44,95,6,241,79,71,11,255,13,0,240,144,47,247,11,255,253,103,190,204,194,191,253,250,203,207,247,93,40,224,147,29,7,170,227,124,121,145, @@ -10654,10 +10654,10 @@ static const unsigned char temp_18972d[] = 105,213,2,0,154,55,203,151,219,124,121,95,245,202,192,206,6,172,21,97,107,148,47,175,178,199,150,45,115,105,1,0,85,133,57,172,66,144,250,152,47,211,54,67,85,39,2,214,154,192,53,140,97,235,167,236,223,22,174,97,166,181,11,0,248,215,44,46,243,255,254,43, 134,170,217,174,2,213,178,255,23,96,0,208,173,232,3,246,227,153,225,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; -const char* IntanIcon_png = (const char*) temp_18972d; +const char* IntanIcon_png = (const char*) temp_b74fa52; //================== muteoff.png ================== -static const unsigned char temp_bf129135[] = +static const unsigned char temp_ca6ef45a[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,165,0,0,0,119,8,6,0,0,0,98,221,128,254,0,0,0,9,112,72,89,115,0,0,46,35,0,0,46,35,1,120,165,63,118,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101, 97,100,121,113,201,101,60,0,0,7,127,73,68,65,84,120,218,236,93,237,141,219,56,16,157,13,238,255,169,131,232,42,136,58,136,174,130,115,42,136,182,3,167,130,213,85,160,77,5,74,7,218,171,64,238,64,78,5,187,169,192,123,21,236,217,128,140,91,24,182,197,33, 135,228,144,126,15,32,2,36,182,98,146,79,111,190,248,65,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,23,119,24,2,49,52,251,246,215,190,21,251,182,221,183,239,251,246,130,97,1,98,224,64,194,105,223,222,78,218,110,223,86,24,30,64,11,33,223,183,10,195,4,132,194,106, @@ -10688,10 +10688,10 @@ static const unsigned char temp_bf129135[] = 182,24,66,64,147,106,154,30,135,13,0,193,84,19,102,16,80,165,154,3,134,10,8,141,134,174,87,64,96,182,129,104,196,220,157,81,72,16,210,2,119,24,2,81,172,102,34,110,136,127,239,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,153,224,63,1,6,0,199,74,112, 188,78,34,32,245,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; -const char* muteoff_png = (const char*) temp_bf129135; +const char* muteoff_png = (const char*) temp_ca6ef45a; //================== muteon.png ================== -static const unsigned char temp_a3695c2f[] = +static const unsigned char temp_cd11806a[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,165,0,0,0,119,8,6,0,0,0,98,221,128,254,0,0,0,9,112,72,89,115,0,0,46,35,0,0,46,35,1,120,165,63,118,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101, 97,100,121,113,201,101,60,0,0,5,175,73,68,65,84,120,218,236,157,225,113,219,54,20,128,41,95,7,144,39,40,51,65,153,9,66,79,80,101,130,72,19,84,158,32,242,4,106,38,176,55,80,58,129,212,9,228,78,32,101,2,187,19,176,192,9,185,178,172,34,63,146,32,240,32, 126,223,29,207,254,33,203,226,227,167,247,0,16,0,179,12,0,0,0,0,0,0,0,0,0,32,46,19,66,224,135,170,170,230,230,199,175,230,152,154,227,217,28,95,38,147,201,145,200,64,12,25,167,230,216,87,255,231,197,28,51,34,4,90,132,172,83,16,41,8,37,228,204,101,195, @@ -10716,10 +10716,10 @@ static const unsigned char temp_a3695c2f[] = 38,65,91,214,228,14,14,168,202,154,60,228,30,130,203,121,233,105,25,123,202,54,196,20,179,57,87,115,131,144,221,96,31,27,191,114,218,182,163,21,113,215,246,185,227,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,112,61,252,35,192,0,171,7,136,102,133,179,227,147,0,0,0, 0,73,69,78,68,174,66,96,130,0,0 }; -const char* muteon_png = (const char*) temp_a3695c2f; +const char* muteon_png = (const char*) temp_cd11806a; //================== MergerA-01.png ================== -static const unsigned char temp_7677e5e[] = +static const unsigned char temp_1b9d0d19[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,69,0,0,1,169,8,6,0,0,0,131,16,66,165,0,0,0,9,112,72,89,115,0,0,46,35,0,0,46,35,1,120,165,63,118,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97, 100,121,113,201,101,60,0,0,21,118,73,68,65,84,120,218,236,221,189,111,93,71,122,7,224,33,205,133,100,55,75,195,69,108,96,131,28,117,74,82,136,238,210,36,190,238,220,45,221,109,170,92,117,73,181,218,46,157,168,191,64,18,130,0,219,241,170,76,37,186,220, 138,87,221,22,73,72,45,16,239,166,226,81,103,87,146,58,17,145,172,204,240,156,107,82,50,181,226,199,189,119,230,156,243,60,192,64,194,98,23,246,190,188,31,63,190,243,158,153,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -10797,10 +10797,10 @@ static const unsigned char temp_7677e5e[] = 248,195,31,30,43,12,66,17,148,105,26,154,109,180,127,89,116,32,18,138,24,98,32,26,159,252,207,126,241,139,191,60,90,127,252,246,219,240,242,229,255,41,18,66,17,148,97,18,215,111,98,24,186,179,204,71,246,189,163,25,108,32,154,249,139,79,63,13,127,253, 55,127,27,254,251,191,254,83,48,66,40,130,124,82,39,232,183,113,253,99,12,67,15,114,28,238,248,255,2,12,0,160,41,104,168,212,59,220,159,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; -const char* MergerA01_png = (const char*) temp_7677e5e; +const char* MergerA01_png = (const char*) temp_1b9d0d19; //================== MergerA-02.png ================== -static const unsigned char temp_77595df[] = +static const unsigned char temp_1bab249a[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,69,0,0,1,169,8,6,0,0,0,131,16,66,165,0,0,0,9,112,72,89,115,0,0,46,35,0,0,46,35,1,120,165,63,118,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97, 100,121,113,201,101,60,0,0,21,221,73,68,65,84,120,218,236,221,207,143,220,229,125,192,241,199,6,20,145,3,24,113,104,14,84,76,14,68,42,145,98,71,109,165,68,106,203,112,171,0,41,246,49,39,236,219,70,171,85,234,191,0,175,170,168,205,41,187,26,141,58,55, 102,149,246,18,21,177,72,148,156,130,191,62,1,39,198,28,210,10,34,49,78,140,212,139,221,129,74,56,17,152,246,251,236,124,7,111,28,227,95,187,51,207,243,253,62,175,151,52,26,43,34,96,127,118,215,251,222,231,121,190,223,239,145,0,29,55,24,142,94,174,223, @@ -10880,10 +10880,10 @@ static const unsigned char temp_77595df[] = 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,7,243,255,2,12,0,244,180,87,201,128,90,137,162,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; -const char* MergerA02_png = (const char*) temp_77595df; +const char* MergerA02_png = (const char*) temp_1bab249a; //================== MergerB-01.png ================== -static const unsigned char temp_6f48ab3d[] = +static const unsigned char temp_837e39f8[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,69,0,0,1,169,8,6,0,0,0,131,16,66,165,0,0,0,9,112,72,89,115,0,0,46,35,0,0,46,35,1,120,165,63,118,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97, 100,121,113,201,101,60,0,0,22,71,73,68,65,84,120,218,236,221,193,110,92,215,125,192,225,35,195,64,150,97,158,160,147,39,16,253,4,30,111,219,2,161,159,32,163,29,1,130,144,252,4,146,94,160,148,58,24,100,18,47,56,68,187,106,211,74,6,28,103,149,112,180,106, 187,210,72,221,217,5,60,130,232,165,108,102,99,67,128,1,245,156,185,119,68,202,162,109,82,26,206,57,247,222,239,67,47,168,4,110,98,255,69,101,126,60,231,220,123,67,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -10964,10 +10964,10 @@ static const unsigned char temp_6f48ab3d[] = 90,156,33,18,68,136,34,40,194,36,100,60,119,36,138,232,108,24,185,195,12,81,4,197,154,214,113,52,21,69,112,201,254,254,31,254,241,240,179,63,125,218,55,9,68,17,20,109,30,214,248,42,17,81,68,23,221,138,215,77,99,64,20,65,99,164,67,217,31,94,246,182,218, 187,230,76,199,92,248,185,69,0,100,51,13,107,124,50,182,40,66,16,1,80,154,73,200,240,14,53,81,132,32,2,160,4,199,117,12,221,205,117,247,217,255,11,48,0,4,145,141,135,126,85,212,174,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; -const char* MergerB01_png = (const char*) temp_6f48ab3d; +const char* MergerB01_png = (const char*) temp_837e39f8; //================== MergerB-02.png ================== -static const unsigned char temp_6f56c2be[] = +static const unsigned char temp_838c5179[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,69,0,0,1,169,8,6,0,0,0,131,16,66,165,0,0,0,9,112,72,89,115,0,0,46,35,0,0,46,35,1,120,165,63,118,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97, 100,121,113,201,101,60,0,0,18,109,73,68,65,84,120,218,236,221,253,109,28,199,25,192,225,161,97,88,127,90,174,192,231,10,76,87,224,77,5,145,42,48,85,129,237,10,44,86,16,177,2,31,43,200,165,2,175,42,200,169,2,173,42,200,249,207,0,1,156,27,237,94,72,43, 148,248,117,119,243,238,204,243,0,7,25,65,128,216,175,201,240,199,249,216,253,60,65,253,126,221,126,206,140,129,154,125,254,228,137,33,48,87,203,237,231,242,63,255,254,119,95,252,251,200,191,11,4,17,0,71,182,153,98,232,98,27,67,67,152,95,46,252,123,65, @@ -11034,10 +11034,10 @@ static const unsigned char temp_6f56c2be[] = 0,0,68,17,0,128,40,2,0,16,69,0,0,162,8,0,64,20,1,0,136,34,0,0,81,4,0,32,138,0,0,68,17,0,128,40,2,0,16,69,0,0,162,8,0,64,20,1,0,136,34,0,0,81,4,0,32,138,0,0,68,17,0,128,40,2,0,16,69,0,0,162,8,0,64,20,1,0,136,34,0,0,81,4,0,32,138,0,0,68,17,0,128,40,2,0, 16,69,0,0,162,8,0,64,20,1,0,136,34,0,0,81,4,0,32,138,0,0,68,17,0,128,40,2,0,16,69,0,0,181,248,175,0,3,0,94,88,236,111,126,120,246,51,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; -const char* MergerB02_png = (const char*) temp_6f56c2be; +const char* MergerB02_png = (const char*) temp_838c5179; //================== PipelineA-01.png ================== -static const unsigned char temp_a2c576c6[] = +static const unsigned char temp_7fd242c1[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,49,0,0,1,169,8,6,0,0,0,124,178,103,71,0,0,0,9,112,72,89,115,0,0,46,35,0,0,46,35,1,120,165,63,118,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101, 97,100,121,113,201,101,60,0,0,20,161,73,68,65,84,120,218,236,221,77,118,220,198,213,6,224,82,236,121,232,89,102,129,87,96,122,5,106,175,192,202,10,212,90,129,153,21,136,90,1,165,21,176,51,250,134,162,71,223,80,240,10,68,205,50,19,178,2,209,179,204,148, 174,3,180,217,110,145,84,55,8,116,85,1,207,115,78,29,57,63,199,150,47,33,246,203,91,183,80,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,22,190,81,2,128,193,124,92,175,39,235,245,239,245,250,175,114,0,0,165,248,220,173,79,235, @@ -11112,10 +11112,10 @@ static const unsigned char temp_a2c576c6[] = 0,132,24,40,73,28,224,125,17,12,242,2,8,49,80,88,128,137,91,72,6,121,1,132,24,40,138,147,72,0,66,12,20,25,96,174,148,1,64,136,129,210,2,204,74,25,0,132,24,40,201,107,1,6,96,222,188,39,134,18,197,240,242,66,25,0,230,77,39,6,1,6,0,33,6,4,24,0,132,24,16, 96,0,16,98,16,96,0,152,154,111,149,128,204,57,70,13,192,157,116,98,16,96,0,40,210,255,4,24,0,27,12,93,110,21,245,184,159,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; -const char* PipelineA01_png = (const char*) temp_a2c576c6; +const char* PipelineA01_png = (const char*) temp_7fd242c1; //================== PipelineA-02.png ================== -static const unsigned char temp_a2d38e47[] = +static const unsigned char temp_7fe05a42[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,49,0,0,1,169,8,6,0,0,0,124,178,103,71,0,0,0,9,112,72,89,115,0,0,46,35,0,0,46,35,1,120,165,63,118,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101, 97,100,121,113,201,101,60,0,0,25,18,73,68,65,84,120,218,236,221,191,114,28,199,157,192,241,214,149,67,178,12,101,167,75,52,10,200,84,36,93,133,2,18,97,121,14,233,42,83,145,228,72,96,157,157,185,78,160,99,203,36,66,251,2,146,137,47,228,224,94,64,240,19, 104,20,1,133,132,208,19,104,239,9,4,63,1,111,154,59,123,128,36,252,217,157,253,51,221,51,159,79,213,214,74,182,69,139,63,146,139,47,122,122,166,67,8,225,173,151,87,74,175,91,183,111,191,125,93,254,207,15,71,199,39,247,2,0,92,225,189,230,11,7,36,225,206, @@ -11207,10 +11207,10 @@ static const unsigned char temp_a2d38e47[] = 25,5,136,24,128,212,157,133,243,243,140,198,198,1,34,6,32,117,49,88,28,9,0,34,6,32,27,85,152,172,186,28,26,5,136,24,128,28,148,77,188,156,26,5,136,24,128,212,77,143,4,40,237,119,1,17,3,144,131,24,44,251,110,145,6,17,3,144,139,170,137,151,202,40,64,196, 0,228,160,12,142,4,0,17,3,144,137,24,44,142,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,210,240,127,2,12,0,195,72,32,13,219,83,201,41,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; -const char* PipelineA02_png = (const char*) temp_a2d38e47; +const char* PipelineA02_png = (const char*) temp_7fe05a42; //================== PipelineB-01.png ================== -static const unsigned char temp_aa6a3a5[] = +static const unsigned char temp_e7b36fa0[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,49,0,0,1,169,8,6,0,0,0,124,178,103,71,0,0,0,9,112,72,89,115,0,0,46,35,0,0,46,35,1,120,165,63,118,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101, 97,100,121,113,201,101,60,0,0,23,202,73,68,65,84,120,218,236,221,191,111,164,199,125,192,225,177,99,56,141,4,159,75,167,241,186,184,107,69,157,1,130,108,196,85,107,5,208,165,58,5,72,34,30,98,215,186,75,109,231,142,165,227,66,199,198,46,245,242,47,16, 13,196,85,18,248,149,155,93,108,99,10,112,106,189,174,148,146,130,221,43,239,104,223,21,87,247,131,183,187,220,221,153,217,247,121,128,5,37,69,145,229,239,209,224,231,102,230,125,39,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200, @@ -11297,10 +11297,10 @@ static const unsigned char temp_aa6a3a5[] = 175,127,249,203,162,231,100,4,12,0,223,240,55,237,231,137,49,144,218,31,254,240,73,248,235,95,255,18,14,14,14,5,12,0,34,134,178,252,239,159,254,20,254,239,243,207,195,221,31,223,13,223,253,238,223,206,254,114,124,140,250,196,116,0,120,145,47,125,124, 114,250,220,190,115,231,203,255,250,239,255,249,114,52,158,28,251,159,39,0,47,243,255,2,12,0,38,140,193,224,172,166,247,238,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; -const char* PipelineB01_png = (const char*) temp_aa6a3a5; +const char* PipelineB01_png = (const char*) temp_e7b36fa0; //================== PipelineB-02.png ================== -static const unsigned char temp_ab4bb26[] = +static const unsigned char temp_e7c18721[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,49,0,0,1,169,8,6,0,0,0,124,178,103,71,0,0,0,9,112,72,89,115,0,0,46,35,0,0,46,35,1,120,165,63,118,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101, 97,100,121,113,201,101,60,0,0,20,155,73,68,65,84,120,218,236,221,189,122,28,71,118,6,224,162,54,217,141,4,101,155,169,121,5,132,50,103,28,101,206,22,190,130,29,101,206,12,103,206,22,186,2,72,87,192,209,21,16,190,2,54,51,103,4,51,109,132,118,182,142,72, 101,206,184,93,238,30,99,22,4,64,204,95,119,157,238,247,125,158,122,160,213,15,151,60,232,25,124,83,117,170,234,89,74,233,83,130,242,124,108,199,247,237,184,86,10,0,238,243,76,136,161,240,32,243,67,59,174,148,2,0,33,134,136,114,144,89,41,3,0,66,12,130, @@ -11375,7 +11375,7 @@ static const unsigned char temp_ab4bb26[] = 228,45,210,23,73,191,11,0,16,36,196,184,18,0,0,8,21,98,242,146,209,66,105,1,128,8,33,38,247,187,92,38,253,46,0,64,144,16,227,74,0,0,32,84,136,201,253,46,103,202,7,0,68,9,49,185,223,229,84,217,0,128,8,33,102,125,37,64,165,92,0,64,132,16,179,238,119,1, 0,8,17,98,114,191,203,66,105,0,128,40,33,198,149,0,0,64,24,174,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,202,241,119,1,6,0,159,157,76,71,98,187,78,10,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; -const char* PipelineB02_png = (const char*) temp_ab4bb26; +const char* PipelineB02_png = (const char*) temp_e7c18721; const char* getNamedResource (const char*, int&) throw(); diff --git a/Source/Processors/Editors/LfpTriggeredAverageEditor.cpp b/Source/Processors/Editors/LfpTriggeredAverageEditor.cpp new file mode 100755 index 000000000..4ca5c6678 --- /dev/null +++ b/Source/Processors/Editors/LfpTriggeredAverageEditor.cpp @@ -0,0 +1,65 @@ +/* + ------------------------------------------------------------------ + + 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 "LfpTriggeredAverageEditor.h" + + +LfpTrigAvgEditor::LfpTrigAvgEditor(GenericProcessor* parentNode, bool useDefaultParameterEditors=true) + : VisualizerEditor(parentNode, useDefaultParameterEditors) + +{ + + tabText = "LFP"; + desiredWidth = 180; + +} + +LfpTrigAvgEditor::~LfpTrigAvgEditor() +{ +} + + +Visualizer* LfpTrigAvgEditor::createNewCanvas() +{ + + LfpTrigAvgNode* processor = (LfpTrigAvgNode*) getProcessor(); + return new LfpTrigAvgCanvas(processor); + +} + +void LfpTrigAvgEditor::buttonCallback(Button* button) +{ + + int gId = button->getRadioGroupId(); + + if (gId > 0) + { + if (canvas != 0) + { + canvas->setParameter(gId-1, button->getName().getFloatValue()); + } + + } + +} + diff --git a/Source/Processors/Editors/LfpTriggeredAverageEditor.h b/Source/Processors/Editors/LfpTriggeredAverageEditor.h new file mode 100755 index 000000000..172c7196c --- /dev/null +++ b/Source/Processors/Editors/LfpTriggeredAverageEditor.h @@ -0,0 +1,63 @@ +/* + ------------------------------------------------------------------ + + 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 __LFPTRIGAVGEDITOR_H_3438800D__ +#define __LFPTRIGAVGEDITOR_H_3438800D__ + +#include "../../../JuceLibraryCode/JuceHeader.h" +#include "GenericEditor.h" +#include "../../UI/UIComponent.h" +#include "../../UI/DataViewport.h" +#include "../Visualization/DataWindow.h" +#include "../LfpTriggeredAverageNode.h" +#include "../Visualization/LfpTriggeredAverageCanvas.h" +#include "VisualizerEditor.h" + +class Visualizer; + +/** + + User interface for the LfpDisplayNode sink. + + @see LfpDisplayNode, LfpDisplayCanvas + +*/ + +class LfpTrigAvgEditor : public VisualizerEditor +{ +public: + LfpTrigAvgEditor(GenericProcessor*, bool useDefaultParameterEditors); + ~LfpTrigAvgEditor(); + + void buttonCallback(Button* button); + + Visualizer* createNewCanvas(); + +private: + + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(LfpTrigAvgEditor); + +}; + +#endif // __LFPTRIGAVGEDITOR_H_3438800D__ diff --git a/Source/Processors/LfpTriggeredAverageNode.cpp b/Source/Processors/LfpTriggeredAverageNode.cpp new file mode 100755 index 000000000..654f7b210 --- /dev/null +++ b/Source/Processors/LfpTriggeredAverageNode.cpp @@ -0,0 +1,325 @@ +/* + ------------------------------------------------------------------ + + 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 "LfpTriggeredAverageNode.h" +#include "Visualization/LfpTriggeredAverageCanvas.h" +#include <stdio.h> + +LfpTrigAvgNode::LfpTrigAvgNode() + : GenericProcessor("LFP Trig. Avg."), + displayBufferIndex(0), displayGain(1), bufferLength(5.0f), + abstractFifo(100), ttlState(0) +{ + std::cout << " LfpTrigAvgNodeConstructor" << std::endl; + displayBuffer = new AudioSampleBuffer(8, 100); + eventBuffer = new MidiBuffer(); + + arrayOfOnes = new float[5000]; + + for (int n = 0; n < 5000; n++) + { + arrayOfOnes[n] = 1; + } + +} + +LfpTrigAvgNode::~LfpTrigAvgNode() +{ + +} + +AudioProcessorEditor* LfpTrigAvgNode::createEditor() +{ + + editor = new LfpTrigAvgEditor(this, true); + return editor; + +} + +void LfpTrigAvgNode::updateSettings() +{ + std::cout << "Setting num inputs on LfpTrigAvgNode to " << getNumInputs() << std::endl; +} + +bool LfpTrigAvgNode::resizeBuffer() +{ + int nSamples = (int) getSampleRate()*bufferLength; + int nInputs = getNumInputs(); + + std::cout << "Resizing buffer. Samples: " << nSamples << ", Inputs: " << nInputs << std::endl; + + if (nSamples > 0 && nInputs > 0) + { + abstractFifo.setTotalSize(nSamples); + displayBuffer->setSize(nInputs+1, nSamples); // add an extra channel for TTLs + return true; + } + else + { + return false; + } + +} + +bool LfpTrigAvgNode::enable() +{ + + if (resizeBuffer()) + { + LfpTrigAvgEditor* editor = (LfpTrigAvgEditor*) getEditor(); + editor->enable(); + return true; + } + else + { + return false; + } + +} + +bool LfpTrigAvgNode::disable() +{ + LfpTrigAvgEditor* editor = (LfpTrigAvgEditor*) getEditor(); + editor->disable(); + return true; +} + +void LfpTrigAvgNode::setParameter(int parameterIndex, float newValue) +{ + editor->updateParameterButtons(parameterIndex); + //Sets Parameter in parameters array for processor + Parameter* parameterPointer=parameters.getRawDataPointer(); + parameterPointer=parameterPointer+parameterIndex; + parameterPointer->setValue(newValue, currentChannel); + + //std::cout << "Saving Parameter from " << currentChannel << ", channel "; + + LfpTrigAvgEditor* ed = (LfpTrigAvgEditor*) getEditor(); + if (ed->canvas != 0) + ed->canvas->setParameter(parameterIndex, newValue); +} + +void LfpTrigAvgNode::handleEvent(int eventType, MidiMessage& event, int sampleNum) +{ + if (eventType == TTL) + { + const uint8* dataptr = event.getRawData(); + + // int eventNodeId = *(dataptr+1); + int eventId = *(dataptr+2); + int eventChannel = *(dataptr+3); + int eventTime = event.getTimeStamp(); + + int samplesLeft = totalSamples - eventTime; + + // std::cout << "Received event from " << eventNodeId << ", channel " + // << eventChannel << ", with ID " << eventId << std::endl; + // + int bufferIndex = (displayBufferIndex + eventTime);// % displayBuffer->getNumSamples(); + + if (eventId == 1) + { + ttlState |= (1L << eventChannel); + } + else + { + ttlState &= ~(1L << eventChannel); + } + + if (samplesLeft + bufferIndex < displayBuffer->getNumSamples()) + { + + // std::cout << bufferIndex << " " << samplesLeft << " " << ttlState << std::endl; + + displayBuffer->copyFrom(displayBuffer->getNumChannels()-1, // destChannel + bufferIndex, // destStartSample + arrayOfOnes, // source + samplesLeft, // numSamples + float(ttlState)); // gain + } + else + { + + int block2Size = (samplesLeft + bufferIndex) % displayBuffer->getNumSamples(); + int block1Size = samplesLeft - block2Size; + + //std::cout << "OVERFLOW." << std::endl; + + //std::cout << bufferIndex << " " << block1Size << " " << ttlState << std::endl; + + displayBuffer->copyFrom(displayBuffer->getNumChannels()-1, // destChannel + bufferIndex, // destStartSample + arrayOfOnes, // source + block1Size, // numSamples + float(ttlState)); // gain + + //std::cout << 0 << " " << block2Size << " " << ttlState << std::endl; + + displayBuffer->copyFrom(displayBuffer->getNumChannels()-1, // destChannel + 0, // destStartSample + arrayOfOnes, // source + block2Size, // numSamples + float(ttlState)); // gain + + + } + + + // std::cout << "ttlState: " << ttlState << std::endl; + + // std::cout << "Received event from " << eventNodeId << + // " on channel " << eventChannel << + // " with value " << eventId << + // " at timestamp " << event.getTimeStamp() << std::endl; + + + } + else if (eventType == TIMESTAMP) + { + + const uint8* dataptr = event.getRawData(); + + // int eventNodeId = *(dataptr+1); + // int eventId = *(dataptr+2); + // int eventChannel = *(dataptr+3); + + // update the timestamp for the current buffer: + memcpy(&bufferTimestamp, dataptr+4, 4); + + + + // double timeInSeconds = double(ts)/Time::getHighResolutionTicksPerSecond(); + // //int64 timestamp = ts[0] << 32 + + // // ts[1] << 16 + + // // ts[2] << 8 + + // // ts[3]; + // //memcpy(ts, dataptr+4, 1); + + // std::cout << "Time in seconds is " << timeInSeconds << std::endl; + + // // std::cout << "Received event from " << eventNodeId << + // // " on channel " << eventChannel << + // // " with value " << eventId << + // // " for time: " << ts << std::endl; + } +} + +void LfpTrigAvgNode::initializeEventChannel() +{ + if (displayBufferIndex + totalSamples < displayBuffer->getNumSamples()) + { + + // std::cout << getNumInputs()+1 << " " << displayBufferIndex << " " << totalSamples << " " << ttlState << std::endl; + // + displayBuffer->copyFrom(displayBuffer->getNumChannels()-1, // destChannel + displayBufferIndex, // destStartSample + arrayOfOnes, // source + totalSamples, // numSamples + float(ttlState)); // gain + } + else + { + + int block2Size = (displayBufferIndex + totalSamples) % displayBuffer->getNumSamples(); + int block1Size = totalSamples - block2Size; + + // std::cout << "OVERFLOW." << std::endl; + + // std::cout << bufferIndex << " " << block1Size << " " << ttlState << std::endl; + + displayBuffer->copyFrom(displayBuffer->getNumChannels()-1, // destChannel + displayBufferIndex, // destStartSample + arrayOfOnes, // source + block1Size, // numSamples + float(ttlState)); // gain + // std::cout << 0 << " " << block2Size << " " << ttlState << std::endl; + + displayBuffer->copyFrom(displayBuffer->getNumChannels()-1, // destChannel + 0, // destStartSample + arrayOfOnes, // source + block2Size, // numSamples + float(ttlState)); // gain + + + } +} + +void LfpTrigAvgNode::process(AudioSampleBuffer& buffer, MidiBuffer& events, int& nSamples) +{ + // 1. place any new samples into the displayBuffer + //std::cout << "Display node sample count: " << nSamples << std::endl; ///buffer.getNumSamples() << std::endl; + + totalSamples = nSamples; + displayBufferIndexEvents = displayBufferIndex; + + initializeEventChannel(); + + checkForEvents(events); // update timestamp, see if we got any TTL events + + int samplesLeft = displayBuffer->getNumSamples() - displayBufferIndex; + + if (nSamples < samplesLeft) + { + + for (int chan = 0; chan < buffer.getNumChannels(); chan++) + { + displayBuffer->copyFrom(chan, // destChannel + displayBufferIndex, // destStartSample + buffer, // source + chan, // source channel + 0, // source start sample + nSamples); // numSamples + + } + displayBufferIndex += (nSamples); + + } + else + { + + int extraSamples = nSamples - samplesLeft; + + for (int chan = 0; chan < buffer.getNumChannels(); chan++) + { + displayBuffer->copyFrom(chan, // destChannel + displayBufferIndex, // destStartSample + buffer, // source + chan, // source channel + 0, // source start sample + samplesLeft); // numSamples + + displayBuffer->copyFrom(chan, + 0, + buffer, + chan, + samplesLeft, + extraSamples); + } + + displayBufferIndex = extraSamples; + } + + + +} + diff --git a/Source/Processors/LfpTriggeredAverageNode.h b/Source/Processors/LfpTriggeredAverageNode.h new file mode 100755 index 000000000..6673dce13 --- /dev/null +++ b/Source/Processors/LfpTriggeredAverageNode.h @@ -0,0 +1,109 @@ +/* + ------------------------------------------------------------------ + + 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 __LFPTRIGAVGNODE_H_D969A379__ +#define __LFPTRIGAVGNODE_H_D969A379__ + +#include "../../JuceLibraryCode/JuceHeader.h" +#include "Editors/LfpTriggeredAverageEditor.h" +#include "Editors/VisualizerEditor.h" +#include "GenericProcessor.h" + +class DataViewport; + +/** + + Holds data in a displayBuffer to be used by the LfpDisplayCanvas + for rendering continuous data streams. + + @see GenericProcessor, LfpTrigAvgEditor, LfpDisplayCanvas + +*/ + +class LfpTrigAvgNode : public GenericProcessor + +{ +public: + + LfpTrigAvgNode(); + ~LfpTrigAvgNode(); + + AudioProcessorEditor* createEditor(); + + bool isSink() + { + return true; + } + + void process(AudioSampleBuffer& buffer, MidiBuffer& midiMessages, int& nSamples); + + void setParameter(int, float); + + void updateSettings(); + + bool enable(); + bool disable(); + + void handleEvent(int, MidiMessage&, int); + + AudioSampleBuffer* getDisplayBufferAddress() + { + return displayBuffer; + } + int getDisplayBufferIndex() + { + return displayBufferIndex; + } + +private: + + void initializeEventChannel(); + + ScopedPointer<AudioSampleBuffer> displayBuffer; + ScopedPointer<MidiBuffer> eventBuffer; + + int displayBufferIndex; + int displayBufferIndexEvents; + + float displayGain; // + float bufferLength; // s + + AbstractFifo abstractFifo; + + int64 bufferTimestamp; + int ttlState; + float* arrayOfOnes; + int totalSamples; + + //Time timer; + + bool resizeBuffer(); + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(LfpTrigAvgNode); + +}; + + + + +#endif // __LFPTRIGAVGNODE_H_D969A379__ diff --git a/Source/Processors/ProcessorGraph.cpp b/Source/Processors/ProcessorGraph.cpp index 1af9de78f..72efab8a0 100644 --- a/Source/Processors/ProcessorGraph.cpp +++ b/Source/Processors/ProcessorGraph.cpp @@ -27,6 +27,7 @@ #include "AudioNode.h" #include "LfpDisplayNode.h" +#include "LfpTriggeredAverageNode.h" #include "SpikeDisplayNode.h" #include "EventNode.h" #include "FilterNode.h" @@ -557,6 +558,12 @@ GenericProcessor* ProcessorGraph::createProcessorFromDescription(String& descrip // processor->setDataViewport(getDataViewport()); //processor->setUIComponent(UI); } + else if (subProcessorType.equalsIgnoreCase("LFP Trig. Avg.")) + { + std::cout << "Creating an LfpTrigAvgNode." << std::endl; + processor = new LfpTrigAvgNode(); + } + else if (subProcessorType.equalsIgnoreCase("Spike Viewer")) { std::cout << "Creating an SpikeDisplayNode." << std::endl; diff --git a/Source/Processors/Visualization/LfpTriggeredAverageCanvas.cpp b/Source/Processors/Visualization/LfpTriggeredAverageCanvas.cpp new file mode 100755 index 000000000..34fe1aa0c --- /dev/null +++ b/Source/Processors/Visualization/LfpTriggeredAverageCanvas.cpp @@ -0,0 +1,1165 @@ +/* + ------------------------------------------------------------------ + + 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 "LfpTriggeredAverageCanvas.h" + +#include <math.h> + +LfpTrigAvgCanvas::LfpTrigAvgCanvas(LfpTrigAvgNode* processor_) : + screenBufferIndex(0), timebase(1.0f), displayGain(1.0f), timeOffset(0.0f), + processor(processor_), + displayBufferIndex(0) +{ + + nChans = processor->getNumInputs(); + sampleRate = processor->getSampleRate(); + std::cout << "Setting num inputs on LfpTrigAvgCanvas to " << nChans << std::endl; + + displayBuffer = processor->getDisplayBufferAddress(); + displayBufferSize = displayBuffer->getNumSamples(); + std::cout << "Setting displayBufferSize on LfpTrigAvgCanvas to " << displayBufferSize << std::endl; + + screenBuffer = new AudioSampleBuffer(MAX_N_CHAN, MAX_N_SAMP); + screenBuffer->clear(); + + viewport = new Viewport(); + display = new LfpTrigAvgDisplay(this, viewport); + timescale = new LfpTrigAvgTimescale(this); + + timescale->setTimebase(timebase); + + viewport->setViewedComponent(display, false); + viewport->setScrollBarsShown(true, false); + + scrollBarThickness = viewport->getScrollBarThickness(); + + + //viewport->getVerticalScrollBar()->addListener(this->scrollBarMoved(viewport->getVerticalScrollBar(), 1.0)); + + + + addAndMakeVisible(viewport); + addAndMakeVisible(timescale); + + voltageRanges.add("50"); + voltageRanges.add("100"); + voltageRanges.add("500"); + voltageRanges.add("1000"); + voltageRanges.add("2000"); + voltageRanges.add("5000"); + + timebases.add("0.2"); + timebases.add("0.5"); + timebases.add("1.0"); + timebases.add("2.0"); + timebases.add("5.0"); + timebases.add("10.0"); + + + spreads.add("10"); + spreads.add("20"); + spreads.add("30"); + spreads.add("40"); + spreads.add("50"); + spreads.add("60"); + + + rangeSelection = new ComboBox("Voltage range"); + rangeSelection->addItemList(voltageRanges, 1); + rangeSelection->setSelectedId(4,false); + rangeSelection->addListener(this); + addAndMakeVisible(rangeSelection); + + timebaseSelection = new ComboBox("Timebase"); + timebaseSelection->addItemList(timebases, 1); + timebaseSelection->setSelectedId(3,false); + timebaseSelection->addListener(this); + addAndMakeVisible(timebaseSelection); + + + spreadSelection = new ComboBox("Spread"); + spreadSelection->addItemList(spreads, 1); + spreadSelection->setSelectedId(5,false); + spreadSelection->addListener(this); + addAndMakeVisible(spreadSelection); + + + display->setNumChannels(nChans); + display->setRange(1000.0f); + + // add event display-specific controls (currently just an enable/disable button) + for (int i = 0; i < 8; i++) + { + + + LfpTrigAvgEventInterface* eventOptions = new LfpTrigAvgEventInterface(display, this, i); + LfpTrigAvgEventInterfaces.add(eventOptions); + addAndMakeVisible(eventOptions); + eventOptions->setBounds(500+(floor(i/2)*20), getHeight()-20-(i%2)*20, 40, 20); + + display->setEventDisplayState(i,true); + + } + + +} + +LfpTrigAvgCanvas::~LfpTrigAvgCanvas() +{ + + deleteAndZero(screenBuffer); +} + +void LfpTrigAvgCanvas::resized() +{ + + timescale->setBounds(leftmargin,0,getWidth()-scrollBarThickness-leftmargin,30); + viewport->setBounds(0,30,getWidth(),getHeight()-90); + + display->setBounds(0,0,getWidth()-scrollBarThickness, getChannelHeight()*nChans); + + rangeSelection->setBounds(5,getHeight()-30,100,25); + timebaseSelection->setBounds(175,getHeight()-30,100,25); + spreadSelection->setBounds(345,getHeight()-30,100,25); + + for (int i = 0; i < 8; i++) + { + LfpTrigAvgEventInterfaces[i]->setBounds(500+(floor(i/2)*20), getHeight()-40+(i%2)*20, 40, 20); // arrange event channel buttons in two rows + LfpTrigAvgEventInterfaces[i]->repaint(); + } + + + // std::cout << "Canvas thinks LfpTrigAvgDisplay should be this high: " + // << LfpTrigAvgDisplay->getTotalHeight() << std::endl; + +} + +void LfpTrigAvgCanvas::beginAnimation() +{ + std::cout << "Beginning animation." << std::endl; + + displayBufferSize = displayBuffer->getNumSamples(); + + screenBufferIndex = 0; + + startCallbacks(); +} + +void LfpTrigAvgCanvas::endAnimation() +{ + std::cout << "Ending animation." << std::endl; + + stopCallbacks(); +} + +void LfpTrigAvgCanvas::update() +{ + nChans = jmax(processor->getNumInputs(),1); + sampleRate = processor->getSampleRate(); + + std::cout << "Setting num inputs on LfpTrigAvgCanvas to " << nChans << std::endl; + + refreshScreenBuffer(); + + display->setNumChannels(nChans); + + // update channel names + for (int i = 0; i < processor->getNumInputs(); i++) + { + + String chName = processor->channels[i]->getName(); + + //std::cout << chName << std::endl; + + display->channelInfo[i]->setName(chName); + + } + + display->setBounds(0,0,getWidth()-scrollBarThickness*2, display->getTotalHeight()); + +} + +void LfpTrigAvgCanvas::comboBoxChanged(ComboBox* cb) +{ + + if (cb == timebaseSelection) + { + timebase = timebases[cb->getSelectedId()-1].getFloatValue(); + } + else if (cb == rangeSelection) + { + display->setRange(voltageRanges[cb->getSelectedId()-1].getFloatValue()); + //std::cout << "Setting range to " << voltageRanges[cb->getSelectedId()-1].getFloatValue() << std::endl; + } + else if (cb == spreadSelection) + { + //spread = spreads[cb->getSelectedId()-1].getFloatValue(); + display->setChannelHeight(spreads[cb->getSelectedId()-1].getIntValue()); + //display->resized(); + resized(); + //std::cout << "Setting spread to " << spreads[cb->getSelectedId()-1].getFloatValue() << std::endl; + } + + timescale->setTimebase(timebase); +} + + + + +int LfpTrigAvgCanvas::getChannelHeight() +{ + return spreads[spreadSelection->getSelectedId()-1].getIntValue(); + +} + + +void LfpTrigAvgCanvas::setParameter(int param, float val) +{ + // if (param == 0) + // { + // timebase = val; + // refreshScreenBuffer(); + // } + // else + // { + // displayGain = val; //* 0.0001f; + // } + + // repaint(); +} + +void LfpTrigAvgCanvas::refreshState() +{ + // called when the component's tab becomes visible again + displayBufferIndex = processor->getDisplayBufferIndex(); + screenBufferIndex = 0; + +} + +void LfpTrigAvgCanvas::refreshScreenBuffer() +{ + + screenBufferIndex = 0; + + screenBuffer->clear(); + + // int w = display->getWidth(); + // //std::cout << "Refreshing buffer size to " << w << "pixels." << std::endl; + + // for (int i = 0; i < w; i++) + // { + // float x = float(i); + + // for (int n = 0; n < nChans; n++) + // { + // waves[n][i*2] = x; + // waves[n][i*2+1] = 0.5f; // line in center of display + // } + // } + +} + +void LfpTrigAvgCanvas::updateScreenBuffer() +{ + + + // copy new samples from the displayBuffer into the screenBuffer (waves) + int maxSamples = display->getWidth() - leftmargin; + + if (screenBufferIndex >= maxSamples) // wrap around if we reached right edge before + screenBufferIndex = 0; + + lastScreenBufferIndex = screenBufferIndex; + + int index = processor->getDisplayBufferIndex(); + + int nSamples = index - displayBufferIndex; // N new samples to be addeddisplayBufferIndex + + if (nSamples < 0) // buffer has reset to 0 + { + nSamples = (displayBufferSize - displayBufferIndex) + index; + } + + float ratio = sampleRate * timebase / float(getWidth() - leftmargin - scrollBarThickness); + + // this number is crucial: converting from samples to values (in px) for the screen buffer + int valuesNeeded = (int) float(nSamples) / ratio; + + + if (screenBufferIndex + valuesNeeded > maxSamples) // crop number of samples to fit cavas width + { + valuesNeeded = maxSamples - screenBufferIndex; + } + + float subSampleOffset = 0.0; + + displayBufferIndex = displayBufferIndex % displayBufferSize; // make sure we're not overshooting + int nextPos = (displayBufferIndex + 1) % displayBufferSize; // position next to displayBufferIndex in display buffer to copy from + + if (valuesNeeded > 0 && valuesNeeded < 1000) + { + + for (int i = 0; i < valuesNeeded; i++) // also fill one extra sample for line drawing interpolation to match across draws + { + float gain = 1.0; + float alpha = (float) subSampleOffset; + float invAlpha = 1.0f - alpha; + + screenBuffer->clear(screenBufferIndex, 1); + + for (int channel = 0; channel <= nChans; channel++) // pull one extra channel for event display + { + + screenBuffer->addFrom(channel, // destChannel + screenBufferIndex, // destStartSample + displayBuffer->getSampleData(channel, displayBufferIndex), // source + 1, // numSamples + invAlpha*gain); // gain + + screenBuffer->addFrom(channel, // destChannel + screenBufferIndex, // destStartSample + displayBuffer->getSampleData(channel, nextPos), // source + 1, // numSamples + alpha*gain); // gain + + + } + + subSampleOffset += ratio; + + while (subSampleOffset >= 1.0) + { + if (++displayBufferIndex > displayBufferSize) + displayBufferIndex = 0; + + nextPos = (displayBufferIndex + 1) % displayBufferSize; + subSampleOffset -= 1.0; + } + + screenBufferIndex++; + + } + + + } + else + { + //std::cout << "Skip." << std::endl; + } +} + +float LfpTrigAvgCanvas::getXCoord(int chan, int samp) +{ + return samp; +} + +int LfpTrigAvgCanvas::getNumChannels() +{ + return nChans; +} + +float LfpTrigAvgCanvas::getYCoord(int chan, int samp) +{ + return *screenBuffer->getSampleData(chan, samp); +} + +void LfpTrigAvgCanvas::paint(Graphics& g) +{ + + //std::cout << "Painting" << std::endl; + g.setColour(Colour(0,18,43)); //background color + g.fillRect(0, 0, getWidth(), getHeight()); + + g.setGradientFill(ColourGradient(Colour(50,50,50),0,0, + Colour(25,25,25),0,30, + false)); + + g.fillRect(0, 0, getWidth()-scrollBarThickness, 30); + + g.setColour(Colours::black); + + g.drawLine(0,30,getWidth()-scrollBarThickness,30); + + g.setColour(Colour(25,25,60)); // timing grid color + + int w = getWidth()-scrollBarThickness-leftmargin; + + for (int i = 0; i < 10; i++) + { + if (i == 5 || i == 0) + g.drawLine(w/10*i+leftmargin,0,w/10*i+leftmargin,getHeight()-60,3.0f); + else + g.drawLine(w/10*i+leftmargin,0,w/10*i+leftmargin,getHeight()-60,1.0f); + } + + g.drawLine(0,getHeight()-60,getWidth(),getHeight()-60,3.0f); + + g.setFont(Font("Default", 16, Font::plain)); + + g.setColour(Colour(100,100,100)); + + g.drawText("Voltage range (uV)",5,getHeight()-55,300,20,Justification::left, false); + g.drawText("Timebase (s)",175,getHeight()-55,300,20,Justification::left, false); + g.drawText("Spread (px)",345,getHeight()-55,300,20,Justification::left, false); + + g.drawText("Event display",500,getHeight()-55,300,20,Justification::left, false); + + + +} + +void LfpTrigAvgCanvas::refresh() +{ + updateScreenBuffer(); + + display->refresh(); // redraws only the new part of the screen buffer + + //getPeer()->performAnyPendingRepaintsNow(); + +} + +void LfpTrigAvgCanvas::saveVisualizerParameters(XmlElement* xml) +{ + + XmlElement* xmlNode = xml->createNewChildElement("LfpTrigAvgDisplay"); + + + xmlNode->setAttribute("Range",rangeSelection->getSelectedId()); + xmlNode->setAttribute("Timebase",timebaseSelection->getSelectedId()); + xmlNode->setAttribute("Spread",spreadSelection->getSelectedId()); + + int eventButtonState = 0; + + for (int i = 0; i < 8; i++) + { + if (display->eventDisplayEnabled[i]) + { + eventButtonState += (1 << i); + } + } + + xmlNode->setAttribute("EventButtonState", eventButtonState); + + xmlNode->setAttribute("ScrollX",viewport->getViewPositionX()); + xmlNode->setAttribute("ScrollY",viewport->getViewPositionY()); +} + + +void LfpTrigAvgCanvas::loadVisualizerParameters(XmlElement* xml) +{ + forEachXmlChildElement(*xml, xmlNode) + { + if (xmlNode->hasTagName("LfpTrigAvgDisplay")) + { + rangeSelection->setSelectedId(xmlNode->getIntAttribute("Range")); + timebaseSelection->setSelectedId(xmlNode->getIntAttribute("Timebase")); + spreadSelection->setSelectedId(xmlNode->getIntAttribute("Spread")); + + viewport->setViewPosition(xmlNode->getIntAttribute("ScrollX"), + xmlNode->getIntAttribute("ScrollY")); + + int eventButtonState = xmlNode->getIntAttribute("eventButtonState"); + + for (int i = 0; i < 8; i++) + { + display->eventDisplayEnabled[i] = (eventButtonState >> i) & 1; + + LfpTrigAvgEventInterfaces[i]->checkEnabledState(); + } + } + } + +} + + +// ------------------------------------------------------------- + +LfpTrigAvgTimescale::LfpTrigAvgTimescale(LfpTrigAvgCanvas* c) : canvas(c) +{ + + font = Font("Default", 16, Font::plain); +} + +LfpTrigAvgTimescale::~LfpTrigAvgTimescale() +{ + +} + +void LfpTrigAvgTimescale::paint(Graphics& g) +{ + + + + g.setFont(font); + + g.setColour(Colour(100,100,100)); + + g.drawText("ms:",5,0,100,getHeight(),Justification::left, false); + + for (int i = 1; i < 10; i++) + { + if (i == 5) + g.drawLine(getWidth()/10*i,0,getWidth()/10*i,getHeight(),3.0f); + else + g.drawLine(getWidth()/10*i,0,getWidth()/10*i,getHeight(),1.0f); + + g.drawText(labels[i-1],getWidth()/10*i+3,0,100,getHeight(),Justification::left, false); + } + +} + +void LfpTrigAvgTimescale::setTimebase(float t) +{ + timebase = t; + + labels.clear(); + + for (float i = 1.0f; i < 10.0; i++) + { + String labelString = String(timebase/10.0f*1000.0f*i); + + labels.add(labelString.substring(0,4)); + } + + repaint(); + +} + + +// --------------------------------------------------------------- + +LfpTrigAvgDisplay::LfpTrigAvgDisplay(LfpTrigAvgCanvas* c, Viewport* v) : + canvas(c), viewport(v), range(1000.0f) +{ + + totalHeight = 0; + + addMouseListener(this, true); + + // hue cycle + //for (int i = 0; i < 15; i++) + //{ + // channelColours.add(Colour(float(sin((3.14/2)*(float(i)/15))),float(1.0),float(1),float(1.0))); + //} + + //hand-built palette + channelColours.add(Colour(224,185,36)); + channelColours.add(Colour(214,210,182)); + channelColours.add(Colour(243,119,33)); + channelColours.add(Colour(186,157,168)); + channelColours.add(Colour(237,37,36)); + channelColours.add(Colour(179,122,79)); + channelColours.add(Colour(217,46,171)); + channelColours.add(Colour(217, 139,196)); + channelColours.add(Colour(101,31,255)); + channelColours.add(Colour(141,111,181)); + channelColours.add(Colour(48,117,255)); + channelColours.add(Colour(184,198,224)); + channelColours.add(Colour(116,227,156)); + channelColours.add(Colour(150,158,155)); + channelColours.add(Colour(82,173,0)); + channelColours.add(Colour(125,99,32)); + +} + +LfpTrigAvgDisplay::~LfpTrigAvgDisplay() +{ + deleteAllChildren(); +} + + +int LfpTrigAvgDisplay::getNumChannels() +{ + return numChans; +} + +void LfpTrigAvgDisplay::setNumChannels(int numChannels) +{ + numChans = numChannels; + + deleteAllChildren(); + + channels.clear(); + channelInfo.clear(); + + totalHeight = 0; + + for (int i = 0; i < numChans; i++) + { + + //std::cout << "Adding new channel display." << std::endl; + + LfpTrigAvgChannelDisplay* lfpChan = new LfpTrigAvgChannelDisplay(canvas, this, i); + + lfpChan->setColour(channelColours[i % channelColours.size()]); + lfpChan->setRange(range); + lfpChan->setChannelHeight(canvas->getChannelHeight()); + + addAndMakeVisible(lfpChan); + + channels.add(lfpChan); + + LfpTrigAvgChannelDisplayInfo* lfpInfo = new LfpTrigAvgChannelDisplayInfo(canvas, this, i); + + lfpInfo->setColour(channelColours[i % channelColours.size()]); + lfpInfo->setRange(range); + lfpInfo->setChannelHeight(canvas->getChannelHeight()); + + addAndMakeVisible(lfpInfo); + + channelInfo.add(lfpInfo); + + totalHeight += lfpChan->getChannelHeight(); + + } + +} + +int LfpTrigAvgDisplay::getTotalHeight() +{ + return totalHeight; +} + +void LfpTrigAvgDisplay::resized() +{ + + int totalHeight = 0; + + for (int i = 0; i < channels.size(); i++) + { + + LfpTrigAvgChannelDisplay* disp = channels[i]; + + disp->setBounds(canvas->leftmargin, + totalHeight-disp->getChannelOverlap()/2, + getWidth(), + disp->getChannelHeight()+disp->getChannelOverlap()); + + LfpTrigAvgChannelDisplayInfo* info = channelInfo[i]; + + info->setBounds(0, + totalHeight-disp->getChannelOverlap()/2, + canvas->leftmargin, + disp->getChannelHeight()+disp->getChannelOverlap()); + + totalHeight += disp->getChannelHeight(); + + } + + canvas->fullredraw = true; //issue full redraw + + // std::cout << "Total height: " << totalHeight << std::endl; + +} + +void LfpTrigAvgDisplay::paint(Graphics& g) +{ + +} + +void LfpTrigAvgDisplay::refresh() +{ + + + int topBorder = viewport->getViewPositionY(); + int bottomBorder = viewport->getViewHeight() + topBorder; + + // ensure that only visible channels are redrawn + for (int i = 0; i < numChans; i++) + { + + int componentTop = channels[i]->getY(); + int componentBottom = channels[i]->getHeight() + componentTop; + + if ((topBorder <= componentBottom && bottomBorder >= componentTop)) + { + if (canvas->fullredraw) + { + channels[i]->fullredraw = true; + channels[i]->repaint(); + channelInfo[i]->repaint(); + + } + else + { + channels[i]->repaint(canvas->lastScreenBufferIndex-2, 0, (canvas->screenBufferIndex-canvas->lastScreenBufferIndex)+3, getChildComponent(i)->getHeight()); //repaint only the updated portion + // we redraw from -2 to +1 relative to the real redraw window, the -2 makes sure that the lines join nicely, and the +1 draws the vertical update line + } + //std::cout << i << std::endl; + } + + } + + canvas->fullredraw = false; +} + +void LfpTrigAvgDisplay::setRange(float r) +{ + range = r; + + for (int i = 0; i < numChans; i++) + { + channels[i]->setRange(range); + } +} + +int LfpTrigAvgDisplay::getRange() +{ + return channels[0]->getRange(); +} + + +void LfpTrigAvgDisplay::setChannelHeight(int r) +{ + + for (int i = 0; i < numChans; i++) + { + channels[i]->setChannelHeight(r); + channelInfo[i]->setChannelHeight(r); + } + + resized(); + +} + +int LfpTrigAvgDisplay::getChannelHeight() +{ + return channels[0]->getChannelHeight(); +} + + + +void LfpTrigAvgDisplay::mouseWheelMove(const MouseEvent& e, const MouseWheelDetails& wheel) +{ + + //std::cout << "Mouse wheel " << e.mods.isCommandDown() << " " << wheel.deltaY << std::endl; + + if (e.mods.isCommandDown()) // CTRL + scroll wheel -> change channel spacing + { + // + // this should also scroll to keep the selected channel at a constant y! + // + int h = getChannelHeight(); + if (wheel.deltaY>0) + { + setChannelHeight(h+1); + } + else + { + if (h>5) + setChannelHeight(h-1); + } + } + else + { + if (e.mods.isShiftDown()) // SHIFT + scroll wheel -> change channel range + { + int h= getRange(); + if (wheel.deltaY>0) + { + setRange(h+10); + } + else + { + if (h>11) + setRange(h-10); + } + + } + else // just scroll + { + // passes the event up to the viewport so the screen scrolls + if (viewport != nullptr && e.eventComponent == this) // passes only if it's not a listening event + viewport->mouseWheelMove(e.getEventRelativeTo(canvas), wheel); + + } + } + + canvas->fullredraw = true;//issue full redraw + + refresh(); + +} + + +void LfpTrigAvgDisplay::mouseDown(const MouseEvent& event) +{ + //int y = event.getMouseDownY(); //relative to each channel pos + MouseEvent canvasevent = event.getEventRelativeTo(viewport); + int y = canvasevent.getMouseDownY() + viewport->getViewPositionY(); // need to account for scrolling + + int dist=0; + int mindist=10000; + int closest=5; + for (int n = 0; n < numChans; n++) // select closest instead of relying ot eventComponent + { + channels[n]->deselect(); + + int cpos=(channels[n]->getY() + (channels[n]->getHeight()/2)); + dist=int(abs(y - cpos)); + + //std::cout << "Mouse down at " << y << " pos is "<< cpos << "n:" << n << " dist " << dist << std::endl; + + if (dist<mindist) + { + mindist=dist-1; + closest=n; + } + } + + //LfpTrigAvgChannelDisplay* lcd = (LfpTrigAvgChannelDisplay*) event.eventComponent; + //lcd->select(); + + channels[closest]->select(); + + canvas->fullredraw = true;//issue full redraw + + refresh(); + +} + + +bool LfpTrigAvgDisplay::setEventDisplayState(int ch, bool state) +{ + eventDisplayEnabled[ch] = state; + return eventDisplayEnabled[ch]; +} + + +bool LfpTrigAvgDisplay::getEventDisplayState(int ch) +{ + return eventDisplayEnabled[ch]; +} + + +// ------------------------------------------------------------------ + +LfpTrigAvgChannelDisplay::LfpTrigAvgChannelDisplay(LfpTrigAvgCanvas* c, LfpTrigAvgDisplay* d, int channelNumber) : + canvas(c), display(d), isSelected(false), chan(channelNumber), channelHeight(40), channelOverlap(300), range(1000.0f) +{ + + + name = String(channelNumber+1); // default is to make the channelNumber the name + + + channelHeightFloat = (float) channelHeight; + + channelFont = Font("Default", channelHeight*0.6, Font::plain); + + lineColour = Colour(255,255,255); + +} + +LfpTrigAvgChannelDisplay::~LfpTrigAvgChannelDisplay() +{ + +} + +void LfpTrigAvgChannelDisplay::paint(Graphics& g) +{ + + //g.fillAll(Colours::grey); + + g.setColour(Colours::yellow); // draw most recent drawn sample position + g.drawLine(canvas->screenBufferIndex+1, 0, canvas->screenBufferIndex+1, getHeight()); + + + + + //g.setColour(Colours::red); // draw oldest drawn sample position + //g.drawLine(canvas->lastScreenBufferIndex, 0, canvas->lastScreenBufferIndex, getHeight()-channelOverlap); + + int center = getHeight()/2; + + if (isSelected) + { + + g.setColour(Colours::lightgrey); + g.fillRect(0,center-channelHeight/2,10,channelHeight); + g.drawLine(0,center+channelHeight/2,getWidth(),center+channelHeight/2); + g.drawLine(0,center-channelHeight/2,getWidth(),center-channelHeight/2); + + g.setColour(Colour(25,25,25)); + g.drawLine(0,center+channelHeight/4,10,center+channelHeight/4); + g.drawLine(0,center-channelHeight/4,10,center-channelHeight/4); + + } + + + g.setColour(Colour(40,40,40)); + g.drawLine(0, getHeight()/2, getWidth(), getHeight()/2); + + int stepSize = 1; + int from = 0; // for vertical line drawing in the LFP data + int to = 0; + + //for (int i = 0; i < getWidth()-stepSize; i += stepSize) // redraw entire display + int ifrom = canvas->lastScreenBufferIndex - 3; // need to start drawing a bit before the actual redraw windowfor the interpolated line to join correctly + + if (ifrom < 0) + ifrom = 0; + + int ito = canvas->screenBufferIndex - 1; + + if (fullredraw) + { + ifrom = 0; //canvas->leftmargin; + ito = getWidth()-stepSize; + fullredraw = false; + } + + for (int i = ifrom; i < ito ; i += stepSize) // redraw only changed portion + { + + // draw event markers + int rawEventState = canvas->getYCoord(canvas->getNumChannels(), i);// get last channel+1 in buffer (represents events) + for (int ev_ch = 0; ev_ch < 8 ; ev_ch++) // for all event channels + { + if (display->getEventDisplayState(ev_ch)) // check if plotting for this channel is enabled + { + if (rawEventState & (1 << ev_ch)) // events are representet by a bit code, so we have to extract the individual bits with a mask + { + g.setColour(display->channelColours[ev_ch*2]); // get color from lfp color scheme + g.setOpacity(0.35f); + g.drawLine(i, center-channelHeight/2 , i, center+channelHeight/2); + } + } + } + + //std::cout << "e " << canvas->getYCoord(canvas->getNumChannels()-1, i) << std::endl; + + g.setColour(lineColour); + g.setOpacity(1); + + // drawLine makes for ok anti-aliased plots, but is pretty slow + g.drawLine(i, + (canvas->getYCoord(chan, i)/range*channelHeightFloat)+getHeight()/2, + i+stepSize, + (canvas->getYCoord(chan, i+stepSize)/range*channelHeightFloat)+getHeight()/2); + + if (false) // switched back to line drawing now that we only draw partial updates + { + + // // pixel wise line plot has no anti-aliasing, but runs much faster + double a = (canvas->getYCoord(chan, i)/range*channelHeightFloat)+getHeight()/2; + double b = (canvas->getYCoord(chan, i+stepSize)/range*channelHeightFloat)+getHeight()/2; + + if (a<b) + { + from = (a); + to = (b); + } + else + { + from = (b); + to = (a); + } + + if ((to-from) < 40) // if there is too much vertical range in one pixel, don't draw the full line for speed reasons + { + for (int j = from; j <= to; j += 1) + { + g.setPixel(i,j); + } + } + else if ((to-from) < 100) + { + for (int j = from; j <= to; j += 2) + { + g.setPixel(i,j); + } + } + else + { + g.setPixel(i,to); + g.setPixel(i,from); + } + + } + + } + + // g.setColour(lineColour.withAlpha(0.7f)); // alpha on seems to decrease draw speed + // g.setFont(channelFont); + // g.setFont(channelHeightFloat*0.6); + + // g.drawText(String(chan+1), 10, center-channelHeight/2, 200, channelHeight, Justification::left, false); + + +} + + + + + + +void LfpTrigAvgChannelDisplay::setRange(float r) +{ + range = r; + + //std::cout << "Range: " << r << std::endl; +} + +int LfpTrigAvgChannelDisplay::getRange() +{ + return range; +} + + +void LfpTrigAvgChannelDisplay::select() +{ + isSelected = true; +} + +void LfpTrigAvgChannelDisplay::deselect() +{ + isSelected = false; +} + +void LfpTrigAvgChannelDisplay::setColour(Colour c) +{ + lineColour = c; +} + + +void LfpTrigAvgChannelDisplay::setChannelHeight(int c) +{ + channelHeight = c; + channelHeightFloat = (float) channelHeight; + //channelOverlap = channelHeight / 2; //clips data too early, + channelOverlap = channelHeight *5; +} + +int LfpTrigAvgChannelDisplay::getChannelHeight() +{ + + return channelHeight; +} + +void LfpTrigAvgChannelDisplay::setChannelOverlap(int overlap) +{ + channelOverlap = overlap; +} + + +int LfpTrigAvgChannelDisplay::getChannelOverlap() +{ + return channelOverlap; +} + +void LfpTrigAvgChannelDisplay::setName(String name_) +{ + name = name_; +} + +// ------------------------------- + +LfpTrigAvgChannelDisplayInfo::LfpTrigAvgChannelDisplayInfo(LfpTrigAvgCanvas* canvas_, LfpTrigAvgDisplay* display_, int ch) + : LfpTrigAvgChannelDisplay(canvas_, display_, ch) +{ + +} + +void LfpTrigAvgChannelDisplayInfo::paint(Graphics& g) +{ + + + int center = getHeight()/2; + + g.setColour(lineColour); + + g.setFont(channelFont); + g.setFont(channelHeightFloat*0.3); + + g.drawText(name, 10, center-channelHeight/2, 200, channelHeight, Justification::left, false); + +} + + + +// Event display Options -------------------------------------------------------------------- + +LfpTrigAvgEventInterface::LfpTrigAvgEventInterface(LfpTrigAvgDisplay* display_, LfpTrigAvgCanvas* canvas_, int chNum): + isEnabled(true), display(display_), canvas(canvas_) +{ + + channelNumber = chNum; + + chButton = new UtilityButton(String(channelNumber+1), Font("Small Text", 13, Font::plain)); + chButton->setRadius(5.0f); + chButton->setBounds(4,4,14,14); + chButton->setEnabledState(true); + chButton->setCorners(true, false, true, false); + //chButton.color = display->channelColours[channelNumber*2]; + chButton->addListener(this); + addAndMakeVisible(chButton); + + + checkEnabledState(); + +} + +LfpTrigAvgEventInterface::~LfpTrigAvgEventInterface() +{ + +} + +void LfpTrigAvgEventInterface::checkEnabledState() +{ + isEnabled = display->getEventDisplayState(channelNumber); + + //repaint(); +} + +void LfpTrigAvgEventInterface::buttonClicked(Button* button) +{ + checkEnabledState(); + if (isEnabled) + { + display->setEventDisplayState(channelNumber, false); + } + else + { + display->setEventDisplayState(channelNumber, true); + } + + repaint(); + +} + + +void LfpTrigAvgEventInterface::paint(Graphics& g) +{ + + checkEnabledState(); + + if (isEnabled) + { + g.setColour(display->channelColours[channelNumber*2]); + g.fillRoundedRectangle(2,2,18,18,5.0f); + } + + + //g.drawText(String(channelNumber), 8, 2, 200, 15, Justification::left, false); + +} diff --git a/Source/Processors/Visualization/LfpTriggeredAverageCanvas.h b/Source/Processors/Visualization/LfpTriggeredAverageCanvas.h new file mode 100755 index 000000000..982a6cf98 --- /dev/null +++ b/Source/Processors/Visualization/LfpTriggeredAverageCanvas.h @@ -0,0 +1,294 @@ +/* + ------------------------------------------------------------------ + + 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 __LFPTRIGAVGCAVCAS_H_B711873A__ +#define __LFPTRIGAVGCAVCAS_H_B711873A__ + +#include "../../../JuceLibraryCode/JuceHeader.h" +#include "../LfpTriggeredAverageNode.h" +#include "Visualizer.h" + +class LfpTrigAvgNode; + +class LfpTrigAvgTimescale; +class LfpTrigAvgDisplay; +class LfpTrigAvgChannelDisplay; +class LfpTrigAvgChannelDisplayInfo; +class LfpTrigAvgEventInterface; + +/** + + Displays multiple channels of continuous data. + + @see LfpTrigAvgNode, LfpTrigAvgDisplayEditor + +*/ + +class LfpTrigAvgCanvas : public Visualizer, + public ComboBox::Listener + +{ +public: + LfpTrigAvgCanvas(LfpTrigAvgNode* n); + ~LfpTrigAvgCanvas(); + + void beginAnimation(); + void endAnimation(); + + void refreshState(); + + void update(); + + void setParameter(int, float); + void setParameter(int, int, int, float) {} + + void paint(Graphics& g); + + void refresh(); + + void resized(); + + int getChannelHeight(); + + int getNumChannels(); + + float getXCoord(int chan, int samp); + float getYCoord(int chan, int samp); + + int screenBufferIndex; + int lastScreenBufferIndex; + + void comboBoxChanged(ComboBox* cb); + + void saveVisualizerParameters(XmlElement* xml); + + void loadVisualizerParameters(XmlElement* xml); + + //void scrollBarMoved(ScrollBar *scrollBarThatHasMoved, double newRangeStart); + + bool fullredraw; // used to indicate that a full redraw is required. is set false after each full redraw, there is a similar switch for ach ch display; + static const int leftmargin=50; // left margin for lfp plots (so the ch number text doesnt overlap) + +private: + + float sampleRate; + float timebase; + float displayGain; + float timeOffset; + //int spread ; // vertical spacing between channels + + static const int MAX_N_CHAN = 256; // maximum number of channels + static const int MAX_N_SAMP = 5000; // maximum display size in pixels + //float waves[MAX_N_CHAN][MAX_N_SAMP*2]; // we need an x and y point for each sample + + LfpTrigAvgNode* processor; + AudioSampleBuffer* displayBuffer; + AudioSampleBuffer* screenBuffer; + MidiBuffer* eventBuffer; + + ScopedPointer<LfpTrigAvgTimescale> timescale; + ScopedPointer<LfpTrigAvgDisplay> display; + ScopedPointer<Viewport> viewport; + + ScopedPointer<ComboBox> timebaseSelection; + ScopedPointer<ComboBox> rangeSelection; + ScopedPointer<ComboBox> spreadSelection; + + StringArray voltageRanges; + StringArray timebases; + StringArray spreads; // option for vertical spacing between channels + + OwnedArray<LfpTrigAvgEventInterface> LfpTrigAvgEventInterfaces; + + void refreshScreenBuffer(); + void updateScreenBuffer(); + + int displayBufferIndex; + int displayBufferSize; + + int scrollBarThickness; + + int nChans; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(LfpTrigAvgCanvas); + +}; + +class LfpTrigAvgTimescale : public Component +{ +public: + LfpTrigAvgTimescale(LfpTrigAvgCanvas*); + ~LfpTrigAvgTimescale(); + + void paint(Graphics& g); + + void setTimebase(float t); + +private: + + LfpTrigAvgCanvas* canvas; + + float timebase; + + Font font; + + StringArray labels; + +}; + +class LfpTrigAvgDisplay : public Component +{ +public: + LfpTrigAvgDisplay(LfpTrigAvgCanvas*, Viewport*); + ~LfpTrigAvgDisplay(); + + void setNumChannels(int numChannels); + int getNumChannels(); + + int getTotalHeight(); + + void paint(Graphics& g); + + void refresh(); + + void resized(); + + void mouseDown(const MouseEvent& event); + void mouseWheelMove(const MouseEvent& event, const MouseWheelDetails& wheel) ; + + + void setRange(float range); + int getRange(); + + void setChannelHeight(int r); + int getChannelHeight(); + + + bool setEventDisplayState(int ch, bool state); + bool getEventDisplayState(int ch); + + + Array<Colour> channelColours; + + Array<LfpTrigAvgChannelDisplay*> channels; + Array<LfpTrigAvgChannelDisplayInfo*> channelInfo; + + bool eventDisplayEnabled[8]; + +private: + int numChans; + + int totalHeight; + + LfpTrigAvgCanvas* canvas; + Viewport* viewport; + + float range; + +}; + +class LfpTrigAvgChannelDisplay : public Component +{ +public: + LfpTrigAvgChannelDisplay(LfpTrigAvgCanvas*, LfpTrigAvgDisplay*, int channelNumber); + ~LfpTrigAvgChannelDisplay(); + + void paint(Graphics& g); + + void select(); + void deselect(); + + void setName(String); + + void setColour(Colour c); + + void setChannelHeight(int); + int getChannelHeight(); + + void setChannelOverlap(int); + int getChannelOverlap(); + + void setRange(float range); + int getRange(); + + bool fullredraw; // used to indicate that a full redraw is required. is set false after each full redraw + +protected: + + LfpTrigAvgCanvas* canvas; + LfpTrigAvgDisplay* display; + + bool isSelected; + + int chan; + + String name; + + Font channelFont; + + Colour lineColour; + + int channelOverlap; + int channelHeight; + float channelHeightFloat; + + float range; + +}; + +class LfpTrigAvgChannelDisplayInfo : public LfpTrigAvgChannelDisplay +{ +public: + LfpTrigAvgChannelDisplayInfo(LfpTrigAvgCanvas*, LfpTrigAvgDisplay*, int channelNumber); + + void paint(Graphics& g); + +}; + +class LfpTrigAvgEventInterface : public Component, + public Button::Listener +{ +public: + LfpTrigAvgEventInterface(LfpTrigAvgDisplay*, LfpTrigAvgCanvas*, int chNum); + ~LfpTrigAvgEventInterface(); + + void paint(Graphics& g); + + void buttonClicked(Button* button); + + void checkEnabledState(); + + bool isEnabled; + +private: + + int channelNumber; + + LfpTrigAvgDisplay* display; + LfpTrigAvgCanvas* canvas; + + ScopedPointer<UtilityButton> chButton; + +}; + + +#endif // __LFPTRIGAVGCAVCAS_H_B711873A__ diff --git a/Source/UI/ProcessorList.cpp b/Source/UI/ProcessorList.cpp index 2b0986e59..e6dcb7d97 100755 --- a/Source/UI/ProcessorList.cpp +++ b/Source/UI/ProcessorList.cpp @@ -69,6 +69,7 @@ ProcessorList::ProcessorList() ProcessorListItem* sinks = new ProcessorListItem("Sinks"); sinks->addSubItem(new ProcessorListItem("LFP Viewer")); + //sinks->addSubItem(new ProcessorListItem("LFP Trig. Avg.")); sinks->addSubItem(new ProcessorListItem("Spike Viewer")); //sinks->addSubItem(new ProcessorListItem("WiFi Output")); //sinks->addSubItem(new ProcessorListItem("Arduino Output")); diff --git a/open-ephys.jucer b/open-ephys.jucer index fd93835c6..23a132f80 100644 --- a/open-ephys.jucer +++ b/open-ephys.jucer @@ -230,6 +230,10 @@ file="Source/Audio/AudioComponent.h"/> </GROUP> <GROUP id="yQmqZWk" name="Processors"> + <FILE id="MPPLs5" name="LfpTriggeredAverageNode.cpp" compile="1" resource="0" + file="Source/Processors/LfpTriggeredAverageNode.cpp"/> + <FILE id="SKve8N" name="LfpTriggeredAverageNode.h" compile="0" resource="0" + file="Source/Processors/LfpTriggeredAverageNode.h"/> <FILE id="M6nCIs" name="FileReader.cpp" compile="1" resource="0" file="Source/Processors/FileReader.cpp"/> <FILE id="VU1bQ0" name="FileReader.h" compile="0" resource="0" file="Source/Processors/FileReader.h"/> <FILE id="e7QoyI" name="ChannelMappingNode.cpp" compile="1" resource="0" @@ -296,6 +300,10 @@ <FILE id="DXYynnz" name="Splitter.h" compile="0" resource="0" file="Source/Processors/Utilities/Splitter.h"/> </GROUP> <GROUP id="W4eqkOy" name="Visualization"> + <FILE id="hQVEUi" name="LfpTriggeredAverageCanvas.cpp" compile="1" + resource="0" file="Source/Processors/Visualization/LfpTriggeredAverageCanvas.cpp"/> + <FILE id="zbsYsH" name="LfpTriggeredAverageCanvas.h" compile="0" resource="0" + file="Source/Processors/Visualization/LfpTriggeredAverageCanvas.h"/> <FILE id="ajAJi" name="SpikeObject.cpp" compile="1" resource="0" file="Source/Processors/Visualization/SpikeObject.cpp"/> <FILE id="xqF5zL" name="SpikeObject.h" compile="0" resource="0" file="Source/Processors/Visualization/SpikeObject.h"/> <FILE id="jGEqDp" name="SpikeDisplayCanvas.cpp" compile="1" resource="0" @@ -322,6 +330,10 @@ <FILE id="hGnGAjh" name="EventNode.cpp" compile="1" resource="0" file="Source/Processors/EventNode.cpp"/> <FILE id="dUtRN6" name="EventNode.h" compile="0" resource="0" file="Source/Processors/EventNode.h"/> <GROUP id="AqvwO6w" name="Editors"> + <FILE id="CfwbqI" name="LfpTriggeredAverageEditor.cpp" compile="1" + resource="0" file="Source/Processors/Editors/LfpTriggeredAverageEditor.cpp"/> + <FILE id="hQoogh" name="LfpTriggeredAverageEditor.h" compile="0" resource="0" + file="Source/Processors/Editors/LfpTriggeredAverageEditor.h"/> <FILE id="g1ki17" name="ChannelMappingEditor.cpp" compile="1" resource="0" file="Source/Processors/Editors/ChannelMappingEditor.cpp"/> <FILE id="KLhI0Q" name="ChannelMappingEditor.h" compile="0" resource="0" -- GitLab