Signal Generator

Dependencies:   IniManager RA8875 Watchdog mbed-rtos mbed

Fork of speaker_demo_Analog by jim hamblen

Committer:
WiredHome
Date:
Fri Jan 13 12:33:37 2017 +0000
Revision:
1:dd07e1deec6c
Child:
2:8f71b71fce1b
Added settings screen, started revising the scope layout

Who changed what in which revision?

UserRevisionLine numberNew contents of line
WiredHome 1:dd07e1deec6c 1
WiredHome 1:dd07e1deec6c 2 #ifndef SIGNALGENDISPLAY_H
WiredHome 1:dd07e1deec6c 3 #define SIGNALGENDISPLAY_H
WiredHome 1:dd07e1deec6c 4
WiredHome 1:dd07e1deec6c 5 #include "mbed.h"
WiredHome 1:dd07e1deec6c 6 #include "RA8875.h"
WiredHome 1:dd07e1deec6c 7 #include "SignalGenerator.h"
WiredHome 1:dd07e1deec6c 8
WiredHome 1:dd07e1deec6c 9 #define SG_MIN_V 0.0 // Constraint, to match to the hardware
WiredHome 1:dd07e1deec6c 10 #define SG_MAX_V 3.3 //
WiredHome 1:dd07e1deec6c 11 #define SG_AOUT_FS 3.3 // Analog output full scale
WiredHome 1:dd07e1deec6c 12
WiredHome 1:dd07e1deec6c 13 class SignalGenDisplay {
WiredHome 1:dd07e1deec6c 14 public:
WiredHome 1:dd07e1deec6c 15 /// Constructor for the Signal Generator User Interface.
WiredHome 1:dd07e1deec6c 16 ///
WiredHome 1:dd07e1deec6c 17 /// @param[in] lcd is a pointer to the Graphics Display
WiredHome 1:dd07e1deec6c 18 /// @param[in] signal is a handle to the signal generator
WiredHome 1:dd07e1deec6c 19 /// @param[in] ProgrName is a pointer to a constant string
WiredHome 1:dd07e1deec6c 20 /// @param[in] Manuf is a pointer to a constant string
WiredHome 1:dd07e1deec6c 21 /// @param[in] Ver is a pointer to a constant string
WiredHome 1:dd07e1deec6c 22 /// @param[in] Build is a pointer to a constant string
WiredHome 1:dd07e1deec6c 23 ///
WiredHome 1:dd07e1deec6c 24 SignalGenDisplay(RA8875 * lcd, SignalGenerator * signal,
WiredHome 1:dd07e1deec6c 25 const char * ProgName, const char * Manuf, const char * Ver,
WiredHome 1:dd07e1deec6c 26 const char * Build);
WiredHome 1:dd07e1deec6c 27
WiredHome 1:dd07e1deec6c 28 /// Destructor
WiredHome 1:dd07e1deec6c 29 ////
WiredHome 1:dd07e1deec6c 30 ~SignalGenDisplay();
WiredHome 1:dd07e1deec6c 31
WiredHome 1:dd07e1deec6c 32 /// Initialization to present the initial display
WiredHome 1:dd07e1deec6c 33 ///
WiredHome 1:dd07e1deec6c 34 /// As part of the display initialization, it also shows
WiredHome 1:dd07e1deec6c 35 /// program information.
WiredHome 1:dd07e1deec6c 36 ///
WiredHome 1:dd07e1deec6c 37 void Init(void);
WiredHome 1:dd07e1deec6c 38
WiredHome 1:dd07e1deec6c 39 /// Set the frequency information
WiredHome 1:dd07e1deec6c 40 ///
WiredHome 1:dd07e1deec6c 41 /// This automatically sets the period as 1/frequency
WiredHome 1:dd07e1deec6c 42 ///
WiredHome 1:dd07e1deec6c 43 /// @param[in] frequency desired
WiredHome 1:dd07e1deec6c 44 /// @returns true if the value was accepted
WiredHome 1:dd07e1deec6c 45 ///
WiredHome 1:dd07e1deec6c 46 bool SetFrequency(float frequency);
WiredHome 1:dd07e1deec6c 47
WiredHome 1:dd07e1deec6c 48 /// Get the current frequency setting
WiredHome 1:dd07e1deec6c 49 ///
WiredHome 1:dd07e1deec6c 50 /// @returns current frequency
WiredHome 1:dd07e1deec6c 51 ///
WiredHome 1:dd07e1deec6c 52 float GetFrequency(void) { return frequency; }
WiredHome 1:dd07e1deec6c 53
WiredHome 1:dd07e1deec6c 54 /// Set the period instead of the frequency
WiredHome 1:dd07e1deec6c 55 ///
WiredHome 1:dd07e1deec6c 56 /// This automatically sets the frequency as 1/period
WiredHome 1:dd07e1deec6c 57 ///
WiredHome 1:dd07e1deec6c 58 /// @param[in] period desired
WiredHome 1:dd07e1deec6c 59 /// @returns true if the value was accepted
WiredHome 1:dd07e1deec6c 60 ///
WiredHome 1:dd07e1deec6c 61 bool SetPeriod(float period);
WiredHome 1:dd07e1deec6c 62
WiredHome 1:dd07e1deec6c 63 /// Get the current period
WiredHome 1:dd07e1deec6c 64 ///
WiredHome 1:dd07e1deec6c 65 /// @returns current period
WiredHome 1:dd07e1deec6c 66 ///
WiredHome 1:dd07e1deec6c 67 float GetPeriod(void) { return 1/frequency; }
WiredHome 1:dd07e1deec6c 68
WiredHome 1:dd07e1deec6c 69 /// Set the Duty Cycle
WiredHome 1:dd07e1deec6c 70 ///
WiredHome 1:dd07e1deec6c 71 /// This adjusts the duty cycle of the waveform
WiredHome 1:dd07e1deec6c 72 ///
WiredHome 1:dd07e1deec6c 73 /// @param[in] dutyCycle is a value ranging from 0 to 100.
WiredHome 1:dd07e1deec6c 74 /// @returns true if the value was accepted
WiredHome 1:dd07e1deec6c 75 ///
WiredHome 1:dd07e1deec6c 76 bool SetDutyCycle(float dutyCycle);
WiredHome 1:dd07e1deec6c 77
WiredHome 1:dd07e1deec6c 78 /// Get the current duty cycle
WiredHome 1:dd07e1deec6c 79 ///
WiredHome 1:dd07e1deec6c 80 /// @returns the duty cycle
WiredHome 1:dd07e1deec6c 81 ///
WiredHome 1:dd07e1deec6c 82 float GetDutyCycle(void) { return dutycycle; }
WiredHome 1:dd07e1deec6c 83
WiredHome 1:dd07e1deec6c 84 /// Set the peak-to-peak voltage of the of the waveform
WiredHome 1:dd07e1deec6c 85 ///
WiredHome 1:dd07e1deec6c 86 /// In the range of 0 to 3.3v
WiredHome 1:dd07e1deec6c 87 ///
WiredHome 1:dd07e1deec6c 88 /// @param[in] voltage is the peak to peak voltage
WiredHome 1:dd07e1deec6c 89 /// @returns true if the value was accepted
WiredHome 1:dd07e1deec6c 90 ///
WiredHome 1:dd07e1deec6c 91 bool SetVoltagePeakToPeak(float voltage);
WiredHome 1:dd07e1deec6c 92
WiredHome 1:dd07e1deec6c 93 /// Get the Peak to Peak voltage
WiredHome 1:dd07e1deec6c 94 ///
WiredHome 1:dd07e1deec6c 95 /// @returns peak to peak voltage
WiredHome 1:dd07e1deec6c 96 ///
WiredHome 1:dd07e1deec6c 97 float GetVoltagePeakToPeak(void) { return voltage; }
WiredHome 1:dd07e1deec6c 98
WiredHome 1:dd07e1deec6c 99 /// Set the offset in the range of +/- 1.65v
WiredHome 1:dd07e1deec6c 100 ///
WiredHome 1:dd07e1deec6c 101 /// A zero volt offset is biased to VCC/2 (3.3/2)
WiredHome 1:dd07e1deec6c 102 ///
WiredHome 1:dd07e1deec6c 103 /// @param[in] voltage is the offset voltage.
WiredHome 1:dd07e1deec6c 104 /// @returns true if the value was accepted
WiredHome 1:dd07e1deec6c 105 ///
WiredHome 1:dd07e1deec6c 106 bool SetVoltageOffset(float voltage);
WiredHome 1:dd07e1deec6c 107
WiredHome 1:dd07e1deec6c 108 /// Get the offset voltage
WiredHome 1:dd07e1deec6c 109 ///
WiredHome 1:dd07e1deec6c 110 /// @returns offset voltage
WiredHome 1:dd07e1deec6c 111 ///
WiredHome 1:dd07e1deec6c 112 float GetVoltageOffset(void) { return offset; }
WiredHome 1:dd07e1deec6c 113
WiredHome 1:dd07e1deec6c 114 /// Signal Generator Modes
WiredHome 1:dd07e1deec6c 115 ///
WiredHome 1:dd07e1deec6c 116 /// This defines the modes. However, SG_KEYPAD is not an mode,
WiredHome 1:dd07e1deec6c 117 /// it is a proprietary mechanism used for displaying the keypad, and
WiredHome 1:dd07e1deec6c 118 /// is not intended to be used by the application.
WiredHome 1:dd07e1deec6c 119 ///
WiredHome 1:dd07e1deec6c 120 typedef enum {
WiredHome 1:dd07e1deec6c 121 SG_SINE, ///< Sine wave
WiredHome 1:dd07e1deec6c 122 SG_SQUARE, ///< Square wave
WiredHome 1:dd07e1deec6c 123 SG_TRIANGLE, ///< Triangle wave
WiredHome 1:dd07e1deec6c 124 SG_SAWTOOTH, ///< Sawtooth
WiredHome 1:dd07e1deec6c 125 SG_USER, ///< User defined waveform
WiredHome 1:dd07e1deec6c 126 SG_KEYPAD, ///< This is an internal value, not for applications
WiredHome 1:dd07e1deec6c 127 } SG_Mode;
WiredHome 1:dd07e1deec6c 128
WiredHome 1:dd07e1deec6c 129 /// Select a Waveform Mode
WiredHome 1:dd07e1deec6c 130 ///
WiredHome 1:dd07e1deec6c 131 /// The selection will update the display to reflect the current state
WiredHome 1:dd07e1deec6c 132 ///
WiredHome 1:dd07e1deec6c 133 /// @param[in] mode sets the signal generator mode.
WiredHome 1:dd07e1deec6c 134 /// @returns true if the value was accepted
WiredHome 1:dd07e1deec6c 135 ///
WiredHome 1:dd07e1deec6c 136 bool SelectWaveformMode(SG_Mode mode);
WiredHome 1:dd07e1deec6c 137
WiredHome 1:dd07e1deec6c 138 /// Operating mode changes
WiredHome 1:dd07e1deec6c 139 ///
WiredHome 1:dd07e1deec6c 140 /// Changes in the operating mode are reported by a bitmask value, where
WiredHome 1:dd07e1deec6c 141 /// zero or more bits are set.
WiredHome 1:dd07e1deec6c 142 ///
WiredHome 1:dd07e1deec6c 143 typedef enum {
WiredHome 1:dd07e1deec6c 144 SG_NONE = 0, ///< No change in operating mode
WiredHome 1:dd07e1deec6c 145 SG_MODE = 1, ///< Signal mode changed; Sine, Square, Triangle, Sawtooth, User
WiredHome 1:dd07e1deec6c 146 SG_FREQ = 2, ///< Change in the frequency
WiredHome 1:dd07e1deec6c 147 SG_PERI = 4, ///< Change in the period (effectively same as frequency)
WiredHome 1:dd07e1deec6c 148 SG_DUTY = 8, ///< Change in the duty cycle
WiredHome 1:dd07e1deec6c 149 SG_VOLT = 16, ///< Change in the peak to peak amplitude
WiredHome 1:dd07e1deec6c 150 SG_OFFS = 32, ///< Change in the offset voltage
WiredHome 1:dd07e1deec6c 151 } SG_Changes;
WiredHome 1:dd07e1deec6c 152
WiredHome 1:dd07e1deec6c 153 /// Poll the Signal Generator UI for changes in operation.
WiredHome 1:dd07e1deec6c 154 ///
WiredHome 1:dd07e1deec6c 155 /// Call this periodically, in order to determine if there is a user-activated
WiredHome 1:dd07e1deec6c 156 /// change in the operating mode of the signal generator.
WiredHome 1:dd07e1deec6c 157 ///
WiredHome 1:dd07e1deec6c 158 /// @param[in] c is the optional character, emulating the onscreen keypad
WiredHome 1:dd07e1deec6c 159 /// - 'd' duty cycle entry
WiredHome 1:dd07e1deec6c 160 /// - 'f' frequency entry
WiredHome 1:dd07e1deec6c 161 /// - 'p' period entry
WiredHome 1:dd07e1deec6c 162 /// - 'v' voltage entry
WiredHome 1:dd07e1deec6c 163 /// - 'o' offset voltage entry
WiredHome 1:dd07e1deec6c 164 /// - '0'-'9','.' numeric entry
WiredHome 1:dd07e1deec6c 165 /// - <enter> complete numeric entry
WiredHome 1:dd07e1deec6c 166 /// - <esc> abandon numeric entry
WiredHome 1:dd07e1deec6c 167 /// - <nul> do nothing, just poll
WiredHome 1:dd07e1deec6c 168 /// @returns a bitmask of which non-zero indicates changes in mode.
WiredHome 1:dd07e1deec6c 169 ///
WiredHome 1:dd07e1deec6c 170 SG_Changes Poll(char c = 0);
WiredHome 1:dd07e1deec6c 171
WiredHome 1:dd07e1deec6c 172 /// Show the menu of commands on the console interface
WiredHome 1:dd07e1deec6c 173 ///
WiredHome 1:dd07e1deec6c 174 void ShowMenu(void);
WiredHome 1:dd07e1deec6c 175
WiredHome 1:dd07e1deec6c 176 private:
WiredHome 1:dd07e1deec6c 177 RA8875 * lcd;
WiredHome 1:dd07e1deec6c 178 SignalGenerator * signal;
WiredHome 1:dd07e1deec6c 179 const char * ProgName;
WiredHome 1:dd07e1deec6c 180 const char * Manuf;
WiredHome 1:dd07e1deec6c 181 const char * Ver;
WiredHome 1:dd07e1deec6c 182 const char * Build;
WiredHome 1:dd07e1deec6c 183 typedef enum {
WiredHome 1:dd07e1deec6c 184 VS_MainScreen,
WiredHome 1:dd07e1deec6c 185 VS_Settings,
WiredHome 1:dd07e1deec6c 186 } VisualScreen;
WiredHome 1:dd07e1deec6c 187 VisualScreen vis;
WiredHome 1:dd07e1deec6c 188 SG_Mode mode; ///< signal mode
WiredHome 1:dd07e1deec6c 189 float frequency; ///< selected frequency
WiredHome 1:dd07e1deec6c 190 float dutycycle; ///< selected duty cycle
WiredHome 1:dd07e1deec6c 191 float voltage; ///< selected voltage
WiredHome 1:dd07e1deec6c 192 float offset; ///< selected offset
WiredHome 1:dd07e1deec6c 193 SG_Changes EntryMd; ///< indicates if in data entry mode
WiredHome 1:dd07e1deec6c 194 char textBuffer[10]; ///< a place to enter text
WiredHome 1:dd07e1deec6c 195 int textLen; ///< num chars in textBuffer
WiredHome 1:dd07e1deec6c 196 Timer timer;
WiredHome 1:dd07e1deec6c 197
WiredHome 1:dd07e1deec6c 198 void DrawNavGadget(void);
WiredHome 1:dd07e1deec6c 199 void ShowProductInfo(void);
WiredHome 1:dd07e1deec6c 200 void ShowBrightnessSetting(void);
WiredHome 1:dd07e1deec6c 201 char GetTouchEvent(void);
WiredHome 1:dd07e1deec6c 202 void ClearScope(void);
WiredHome 1:dd07e1deec6c 203 void UpdateScope(void);
WiredHome 1:dd07e1deec6c 204 void updateDutyCycle(void);
WiredHome 1:dd07e1deec6c 205 void updateFrequency(void);
WiredHome 1:dd07e1deec6c 206 void updatePeriod(void);
WiredHome 1:dd07e1deec6c 207 void updateVoltage(void);
WiredHome 1:dd07e1deec6c 208 void updateOffset(void);
WiredHome 1:dd07e1deec6c 209 void updateTextWindow(void);
WiredHome 1:dd07e1deec6c 210 void resetDataEntry(void);
WiredHome 1:dd07e1deec6c 211 void DrawKeypadEnabled(bool enable = false);
WiredHome 1:dd07e1deec6c 212 void DrawButton(rect_t r, bool pressed, SG_Mode mode, bool enable = false, int label=0);
WiredHome 1:dd07e1deec6c 213 void DrawWaveform(rect_t r, SG_Mode mode, color_t color, float dutycycleOverride = 0.0);
WiredHome 1:dd07e1deec6c 214 float rangelimit(float value, float minV, float maxV);
WiredHome 1:dd07e1deec6c 215 };
WiredHome 1:dd07e1deec6c 216
WiredHome 1:dd07e1deec6c 217
WiredHome 1:dd07e1deec6c 218 #endif // SIGNALGENDISPLAY_H