summaryrefslogtreecommitdiffstats
path: root/src/gui/oscilloscope.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/oscilloscope.h')
-rw-r--r--src/gui/oscilloscope.h192
1 files changed, 192 insertions, 0 deletions
diff --git a/src/gui/oscilloscope.h b/src/gui/oscilloscope.h
new file mode 100644
index 0000000..79e0dbd
--- /dev/null
+++ b/src/gui/oscilloscope.h
@@ -0,0 +1,192 @@
+/***************************************************************************
+ * Copyright (C) 2005 by David Saxton *
+ * *
+ * 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 2 of the License, or *
+ * (at your option) any later version. *
+ ***************************************************************************/
+
+#ifndef OSCILLOSCOPE_H
+#define OSCILLOSCOPE_H
+
+#ifndef PROBE_H
+#ifndef KTECHLAB_H
+#ifndef OSCILLOSCOPEDATA_H
+#include "oscilloscopewidget.h"
+#endif
+#endif
+#endif
+
+#include "simulator.h"
+#include <qmap.h>
+
+class FloatingProbeData;
+class LogicProbe;
+class LogicProbeData;
+class KTechlab;
+class Oscilloscope;
+class Probe;
+class ProbeData;
+class VoltageProbe;
+class QTimer;
+namespace KateMDI { class ToolView; }
+
+typedef QMap< int, ProbeData * > ProbeDataMap;
+typedef QMap< int, LogicProbeData * > LogicProbeDataMap;
+typedef QMap< int, FloatingProbeData * > FloatingProbeDataMap;
+
+typedef unsigned long long ullong;
+typedef long long llong;
+
+
+#if 0
+const double MAX_BITS_PER_S = 100000;
+
+// NOTE: The 10 has to agree with the 2^10 = 1024.0
+const int MIN_MAX_LOG_2_DIFF = 10;
+const double MIN_BITS_PER_S = MAX_BITS_PER_S / 1024.0;
+#else
+const double MAX_BITS_PER_S = LOGIC_UPDATE_RATE * 4;
+
+// NOTE: The 18 has to agree with the 2^18 = 262144.0
+const int MIN_MAX_LOG_2_DIFF = 18;
+const double MIN_BITS_PER_S = MAX_BITS_PER_S / 262144.0;
+#endif
+
+
+/*
+Due to strangeness with generation of .[cpp/h] files from .ui files (that is,
+my inability to sort it out neatly), files other than those in /src/gui can't
+see header files such as "oscilloscopewidget.h", so we have to provide some
+interface functions for accessing the functionality in this class
+*/
+ProbeData * registerProbe( Probe * probe );
+void unregisterProbe( int id );
+void addOscilloscopeAsToolView( KTechlab *ktechlab );
+
+
+#ifndef PROBE_H
+#ifndef KTECHLAB_H
+#ifndef OSCILLOSCOPEDATA_H
+/**
+@author David Saxton
+*/
+class Oscilloscope : public OscilloscopeWidget
+{
+ Q_OBJECT
+ public:
+ static Oscilloscope * self( KateMDI::ToolView * parent = 0l );
+ static QString toolViewIdentifier() { return "Oscilloscope"; }
+ virtual ~Oscilloscope();
+
+ /**
+ * Register a probe (that outputs boolean data) with the oscilloscope.
+ * Returns a unique id that the probe can use to add data points
+ */
+ ProbeData * registerProbe( Probe * probe );
+ void unregisterProbe( int id );
+ /**
+ * Returns the Simulator time since recording started.
+ */
+ ullong time() const;
+ /**
+ * Returns how much of an increment in value of the oscilloscope slider
+ * is equivalent to one second.
+ */
+ int sliderTicksPerSecond() const;
+ /**
+ * Returns the number of pixels per second the user has requested to be
+ * displayed.
+ */
+ double pixelsPerSecond() const;
+ /**
+ * Zoom level; a value between 0 and 1. 0 is maximum zoom out, and 1 is
+ * maximum zoom in.
+ */
+ double zoomLevel() const { return m_zoomLevel; }
+ /**
+ * Sets the zoom level (and in the process, checks that it is within the
+ * bounds allowed).
+ */
+ void setZoomLevel( double zoomLevel );
+ /**
+ * Returns the Simulator time as given by the current scrollbar
+ * position.
+ */
+ llong scrollTime() const;
+ /**
+ * @returns pointer to probe with given id, or NULL if no such probe exists
+ */
+ ProbeData * probeData( int id ) const;
+ /**
+ * @returns the total number of probes
+ */
+ int numberOfProbes() const;
+ /**
+ * @returns number of the probe with the given id, starting from 0, or -1 if no such probe
+ */
+ int probeNumber( int id ) const;
+
+ signals:
+ /**
+ * Emitted when a probe is registered
+ */
+ void probeRegistered( int id, ProbeData * probe );
+ /**
+ * Emitted when a probe is unregistered
+ */
+ void probeUnregistered( int id );
+
+ public slots:
+ /**
+ * Resets all recorded data
+ */
+ void reset();
+ /**
+ * Called when the zoom slider value was changed.
+ */
+ void slotZoomSliderChanged( int value );
+ /**
+ * Called when the horizontal scrollbar was scrolled by the user
+ */
+ void slotSliderValueChanged( int value );
+ /**
+ * Pause the data capture (e.g. user clicked on pause button)
+ */
+ void slotTogglePause();
+
+ protected:
+ void getOldestProbe();
+
+// bool b_isPaused;
+ int m_nextId;
+ ProbeData * m_oldestProbe;
+ int m_oldestId;
+ int m_nextColor; // For giving the probes colours
+
+ ProbeDataMap m_probeDataMap;
+ LogicProbeDataMap m_logicProbeDataMap;
+ FloatingProbeDataMap m_floatingProbeDataMap;
+
+ Simulator * m_pSimulator;
+
+ protected slots:
+ void updateScrollbars();
+
+ private:
+ Oscilloscope( KateMDI::ToolView * parent );
+
+ static Oscilloscope * m_pSelf;
+ double m_zoomLevel;
+
+ friend class OscilloscopeView;
+ friend class ProbePositioner;
+};
+
+#endif // OSCILLOSCOPEDATA_H
+#endif // KTECHLAB_H
+#endif // PROBE_H
+
+#endif // OSCILLOSCOPE_H