123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286 |
- ////////////////////////////////////////////////////////////////////////////////
- //
- // Copyright 2016 RWS Inc, All Rights Reserved
- //
- // This program is free software; you can redistribute it and/or modify
- // it under the terms of version 2 of the GNU General Public License as published by
- // the Free Software Foundation
- //
- // 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, write to the Free Software Foundation, Inc.,
- // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- //
- #ifndef METER_H
- #define METER_H
- //////////////////////////////////////////////////////////////////////////////
- // Please see the CPP file for an explanation of this API.
- //////////////////////////////////////////////////////////////////////////////
- //////////////////////////////////////////////////////////////////////////////
- // Headers.
- //////////////////////////////////////////////////////////////////////////////
- #include "System.h"
- // If PATHS_IN_INCLUDES macro is defined, we can utilized relative
- // paths to a header file. In this case we generally go off of our
- // RSPiX root directory. System.h MUST be included before this macro
- // is evaluated. System.h is the header that, based on the current
- // platform (or more so in this case on the compiler), defines
- // PATHS_IN_INCLUDES. Blue.h includes system.h so you can include that
- // instead.
- #ifdef PATHS_IN_INCLUDES
- #include "ORANGE/GUI/dlg.h"
- #else
- #include "Dlg.h"
- #endif // PATHS_IN_INCLUDES
- #include <string.h>
- //////////////////////////////////////////////////////////////////////////////
- // Macros.
- //////////////////////////////////////////////////////////////////////////////
- // Number of values remembered for histogram.
- #define METER_HISTOGRAM_HISTORY 20 // Values.
- // Maximum length for the unit string.
- #define MAX_UNIT_LEN 128 // Characters.
- //////////////////////////////////////////////////////////////////////////////
- // Typedefs.
- //////////////////////////////////////////////////////////////////////////////
- //////////////////////////////////////////////////////////////////////////////
- class RMeter : public RDlg
- {
- public: // Construction/Destruction.
- // Default constructor.
- RMeter(void);
- // Destructor.
- ~RMeter(void);
- //////////////////////////////////////////////////////////////////////////////
- public: // Enums.
- ////////////////////////////////////////////////////////////////////////
- // Enums.
- ////////////////////////////////////////////////////////////////////////
- typedef enum
- {
- Needle, // Analog needle meter.
- Digital, // Digital meter.
- Bar, // Bar (like progress bar).
- Histogram, // Histogram.
- NumDisplayTypes // Ceiling.
- } DisplayType; // Type of meter display.
- typedef enum
- {
- Percentage, // Info displayed as percentage.
- Value, // Info displayed as value.
- NumInfoTypes // Ceiling.
- } InfoType; // Type of meter info.
- public: // Methods.
- ////////////////////////////////////////////////////////////////////////
- // Methods.
- ////////////////////////////////////////////////////////////////////////
- //////////////////////// Virtual Overrides /////////////////////////////
- // Composes the meter into the image provided. For consistency, you
- // should probably always draw the meter.
- short Draw( // Returns 0 on success.
- RImage* pimDst, // Destination image.
- short sDstX = 0, // X position in destination.
- short sDstY = 0, // Y position in destination.
- short sSrcX = 0, // X position in source.
- short sSrcY = 0, // Y position in source.
- short sW = 0, // Amount to draw.
- short sH = 0, // Amount to draw.
- RRect* prc = NULL); // Clip to.
- // Activate or deactivate mouse reaction.
- void SetActive( // Returns nothing.
- short sActive) // TRUE to make active, FALSE otherwise.
- {
- RDlg::SetActive(sActive);
- m_guiMeter.SetActive(sActive);
- }
- ////////////////////// Original to this class ///////////////////////////
- // Set the new value for the meter. Do this BEFORE drawing for most
- // accurate results.
- long SetNewValue( // Returns previous value.
- long lNewVal) // In: New value.
- {
- long lRes = m_lCurVal;
- // Store new val.
- m_lCurVal = lNewVal;
- // Accumulate total.
- m_lCurTotal += lNewVal;
- // Count updates.
- m_lNumValues++;
- // If the new value is less than the min . . .
- if (lNewVal < m_lMinValue)
- {
- m_lMinValue = lNewVal;
- }
- // If the new value is greater than the max . . .
- if (lNewVal > m_lMaxValue)
- {
- m_lMaxValue = lNewVal;
- }
- // Return old.
- return lRes;
- }
- // This begins a period to be timed with rspGetMilliseconds().
- // Call EndPeriod() to end the period and update the meter.
- void StartPeriod(void)
- {
- m_lStartPeriod = rspGetMilliseconds();
- }
- // This ends a period and updates the meter with the length of
- // the period in milliseconds.
- long EndPeriod(void) // Returns period.
- {
- SetNewValue(rspGetMilliseconds() - m_lStartPeriod);
- return m_lCurVal;
- }
- // Set duration between updates.
- void SetUpdateInterval( // Returns nothing.
- long lDuration) // Time in milliseconds between updates.
- {
- m_lDuration = lDuration;
- }
- // Set the type of meter you want.
- void SetType( // Returns nothing.
- DisplayType dtType, // In: Type of meter display.
- // See Enums above.
- InfoType itType) // In: Type of info display.
- // See Enums above.
- {
- m_dtType = dtType;
- m_itType = itType;
- }
- // Set the range for the meter.
- void SetRange( // Returns nothing.
- long lMin, // Minimum value.
- long lMax) // Maximum value.
- {
- m_lMin = lMin;
- m_lMax = lMax;
- }
- // Set the unit of measurement for info display.
- void SetUnit( // Returns nothing.
- char* pszUnit) // Unit string (ex: "Mbytes" or "ms").
- {
- ASSERT(strlen(pszUnit) < sizeof(m_szUnit));
- strcpy(m_szUnit, pszUnit);
- }
- // Set the colors.
- void SetColors( // Returns nothing.
- U32 u32Background, // Background color.
- U32 u32Meter, // Meter color.
- U32 u32Needle, // Needle, bar, etc. color.
- U32 u32Text, // Text foreground color.
- U32 u32Overflow) // Needle color for over/underflow.
- {
- m_u32BackColor = u32Background;
- m_u32Meter = u32Meter;
- m_u32Needle = u32Needle;
- m_u32TextColor = u32Text;
- m_u32Overflow = u32Overflow;
- }
- // Compose the static portions. Fills the parts of the image
- // that don't change.
- void Compose( // Returns 0 nothing.
- RImage* pimDst = NULL); // In: Destination. NULL == use internal m_im.
- // Advance to next meter type. Called by btn callback.
- void NextType(void)
- {
- SetType(
- (DisplayType)((m_dtType + 1) % NumDisplayTypes),
- m_itType);
- Compose();
- }
- ////////////////////////////////////////////////////////////////////////
- // Querries.
- ////////////////////////////////////////////////////////////////////////
- //////////////////////////////////////////////////////////////////////////////
- public: // Static
- //////////////////////////////////////////////////////////////////////////////
- public: // Querries.
- //////////////////////////////////////////////////////////////////////////////
- protected: // Internal functions.
- // Callbacks from m_guiMeter's Hot.
- static void BtnCall(RGuiItem* pgui)
- { ((RMeter*)pgui->m_ulUserInstance)->NextType(); }
- //////////////////////////////////////////////////////////////////////////////
- public: // Member variables.
- long m_lCurVal; // Value for next draw.
- long m_lStartPeriod; // Start period.
- char m_szUnit[MAX_UNIT_LEN + 1]; // Unit of measurement text.
- long m_lMin; // Minimum value on meter.
- long m_lMax; // Maximum value on meter.
- DisplayType m_dtType; // Type of meter display.
- InfoType m_itType; // Type of meter info.
- U32 m_u32Meter; // Meter color.
- U32 m_u32Needle; // Needle, bar, etc. color.
- U32 m_u32Overflow; // Needle color for over/underflow.
- long m_lDuration; // Time between updates in
- // milliseconds.
- long m_lNextUpdate; // Time of next update in
- // milliseconds.
- long m_lCurTotal; // Current total.
- long m_lNumValues; // Number of values since
- // total was last cleared.
- long m_lMaxValue; // Maximum value since
- // total was last cleared.
- long m_lMinValue; // Minimum value since
- // total was last cleared.
- RGuiItem m_guiMeter; // Actual meter gui.
- // History of values for histogram.
- short m_asQHistory[METER_HISTOGRAM_HISTORY];
- long m_lQIndex;
- protected: // Internal typedefs.
- protected: // Protected member variables.
- short m_sInfoY;
- };
- #endif // METER_H
- //////////////////////////////////////////////////////////////////////////////
- // EOF
- //////////////////////////////////////////////////////////////////////////////
|