Signal Generator

Dependencies:   IniManager RA8875 Watchdog mbed-rtos mbed

Fork of speaker_demo_Analog by jim hamblen

Committer:
WiredHome
Date:
Sun Jan 15 03:11:22 2017 +0000
Revision:
2:8f71b71fce1b
Parent:
1:dd07e1deec6c
Child:
3:d22f3e52d06a
Almost live update to the waveform while adjusting.

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 2:8f71b71fce1b 7 #include "SignalGenDAC.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 2:8f71b71fce1b 13 #define SAVE_AFTER_IDLE_S 10 // How long after idle should it save
WiredHome 2:8f71b71fce1b 14
WiredHome 1:dd07e1deec6c 15 class SignalGenDisplay {
WiredHome 1:dd07e1deec6c 16 public:
WiredHome 1:dd07e1deec6c 17 /// Constructor for the Signal Generator User Interface.
WiredHome 1:dd07e1deec6c 18 ///
WiredHome 2:8f71b71fce1b 19 /// This will also load the initial settings from the
WiredHome 2:8f71b71fce1b 20 /// file system.
WiredHome 2:8f71b71fce1b 21 ///
WiredHome 1:dd07e1deec6c 22 /// @param[in] lcd is a pointer to the Graphics Display
WiredHome 1:dd07e1deec6c 23 /// @param[in] signal is a handle to the signal generator
WiredHome 1:dd07e1deec6c 24 /// @param[in] ProgrName is a pointer to a constant string
WiredHome 1:dd07e1deec6c 25 /// @param[in] Manuf is a pointer to a constant string
WiredHome 1:dd07e1deec6c 26 /// @param[in] Ver is a pointer to a constant string
WiredHome 1:dd07e1deec6c 27 /// @param[in] Build is a pointer to a constant string
WiredHome 1:dd07e1deec6c 28 ///
WiredHome 2:8f71b71fce1b 29 SignalGenDisplay(RA8875 * lcd, SignalGenDAC * signal,
WiredHome 1:dd07e1deec6c 30 const char * ProgName, const char * Manuf, const char * Ver,
WiredHome 1:dd07e1deec6c 31 const char * Build);
WiredHome 1:dd07e1deec6c 32
WiredHome 1:dd07e1deec6c 33 /// Destructor
WiredHome 1:dd07e1deec6c 34 ////
WiredHome 1:dd07e1deec6c 35 ~SignalGenDisplay();
WiredHome 1:dd07e1deec6c 36
WiredHome 2:8f71b71fce1b 37 /// Refresh the display for the current settings
WiredHome 2:8f71b71fce1b 38 /// and display mode.
WiredHome 1:dd07e1deec6c 39 ///
WiredHome 2:8f71b71fce1b 40 void Refresh(void);
WiredHome 1:dd07e1deec6c 41
WiredHome 1:dd07e1deec6c 42 /// Set the frequency information
WiredHome 1:dd07e1deec6c 43 ///
WiredHome 1:dd07e1deec6c 44 /// This automatically sets the period as 1/frequency
WiredHome 1:dd07e1deec6c 45 ///
WiredHome 1:dd07e1deec6c 46 /// @param[in] frequency desired
WiredHome 1:dd07e1deec6c 47 /// @returns true if the value was accepted
WiredHome 1:dd07e1deec6c 48 ///
WiredHome 1:dd07e1deec6c 49 bool SetFrequency(float frequency);
WiredHome 1:dd07e1deec6c 50
WiredHome 1:dd07e1deec6c 51 /// Get the current frequency setting
WiredHome 1:dd07e1deec6c 52 ///
WiredHome 1:dd07e1deec6c 53 /// @returns current frequency
WiredHome 1:dd07e1deec6c 54 ///
WiredHome 1:dd07e1deec6c 55 float GetFrequency(void) { return frequency; }
WiredHome 1:dd07e1deec6c 56
WiredHome 1:dd07e1deec6c 57 /// Set the period instead of the frequency
WiredHome 1:dd07e1deec6c 58 ///
WiredHome 1:dd07e1deec6c 59 /// This automatically sets the frequency as 1/period
WiredHome 1:dd07e1deec6c 60 ///
WiredHome 1:dd07e1deec6c 61 /// @param[in] period desired
WiredHome 1:dd07e1deec6c 62 /// @returns true if the value was accepted
WiredHome 1:dd07e1deec6c 63 ///
WiredHome 1:dd07e1deec6c 64 bool SetPeriod(float period);
WiredHome 1:dd07e1deec6c 65
WiredHome 1:dd07e1deec6c 66 /// Get the current period
WiredHome 1:dd07e1deec6c 67 ///
WiredHome 1:dd07e1deec6c 68 /// @returns current period
WiredHome 1:dd07e1deec6c 69 ///
WiredHome 1:dd07e1deec6c 70 float GetPeriod(void) { return 1/frequency; }
WiredHome 1:dd07e1deec6c 71
WiredHome 1:dd07e1deec6c 72 /// Set the Duty Cycle
WiredHome 1:dd07e1deec6c 73 ///
WiredHome 1:dd07e1deec6c 74 /// This adjusts the duty cycle of the waveform
WiredHome 1:dd07e1deec6c 75 ///
WiredHome 1:dd07e1deec6c 76 /// @param[in] dutyCycle is a value ranging from 0 to 100.
WiredHome 1:dd07e1deec6c 77 /// @returns true if the value was accepted
WiredHome 1:dd07e1deec6c 78 ///
WiredHome 1:dd07e1deec6c 79 bool SetDutyCycle(float dutyCycle);
WiredHome 1:dd07e1deec6c 80
WiredHome 1:dd07e1deec6c 81 /// Get the current duty cycle
WiredHome 1:dd07e1deec6c 82 ///
WiredHome 1:dd07e1deec6c 83 /// @returns the duty cycle
WiredHome 1:dd07e1deec6c 84 ///
WiredHome 1:dd07e1deec6c 85 float GetDutyCycle(void) { return dutycycle; }
WiredHome 1:dd07e1deec6c 86
WiredHome 1:dd07e1deec6c 87 /// Set the peak-to-peak voltage of the of the waveform
WiredHome 1:dd07e1deec6c 88 ///
WiredHome 1:dd07e1deec6c 89 /// In the range of 0 to 3.3v
WiredHome 1:dd07e1deec6c 90 ///
WiredHome 1:dd07e1deec6c 91 /// @param[in] voltage is the peak to peak voltage
WiredHome 1:dd07e1deec6c 92 /// @returns true if the value was accepted
WiredHome 1:dd07e1deec6c 93 ///
WiredHome 1:dd07e1deec6c 94 bool SetVoltagePeakToPeak(float voltage);
WiredHome 1:dd07e1deec6c 95
WiredHome 1:dd07e1deec6c 96 /// Get the Peak to Peak voltage
WiredHome 1:dd07e1deec6c 97 ///
WiredHome 1:dd07e1deec6c 98 /// @returns peak to peak voltage
WiredHome 1:dd07e1deec6c 99 ///
WiredHome 1:dd07e1deec6c 100 float GetVoltagePeakToPeak(void) { return voltage; }
WiredHome 1:dd07e1deec6c 101
WiredHome 1:dd07e1deec6c 102 /// Set the offset in the range of +/- 1.65v
WiredHome 1:dd07e1deec6c 103 ///
WiredHome 1:dd07e1deec6c 104 /// A zero volt offset is biased to VCC/2 (3.3/2)
WiredHome 1:dd07e1deec6c 105 ///
WiredHome 1:dd07e1deec6c 106 /// @param[in] voltage is the offset voltage.
WiredHome 1:dd07e1deec6c 107 /// @returns true if the value was accepted
WiredHome 1:dd07e1deec6c 108 ///
WiredHome 1:dd07e1deec6c 109 bool SetVoltageOffset(float voltage);
WiredHome 1:dd07e1deec6c 110
WiredHome 1:dd07e1deec6c 111 /// Get the offset voltage
WiredHome 1:dd07e1deec6c 112 ///
WiredHome 1:dd07e1deec6c 113 /// @returns offset voltage
WiredHome 1:dd07e1deec6c 114 ///
WiredHome 1:dd07e1deec6c 115 float GetVoltageOffset(void) { return offset; }
WiredHome 1:dd07e1deec6c 116
WiredHome 1:dd07e1deec6c 117 /// Select a Waveform Mode
WiredHome 1:dd07e1deec6c 118 ///
WiredHome 1:dd07e1deec6c 119 /// The selection will update the display to reflect the current state
WiredHome 1:dd07e1deec6c 120 ///
WiredHome 1:dd07e1deec6c 121 /// @param[in] mode sets the signal generator mode.
WiredHome 2:8f71b71fce1b 122 /// @param[in] force as true will force it to set the mode, redrawing the screen
WiredHome 1:dd07e1deec6c 123 /// @returns true if the value was accepted
WiredHome 1:dd07e1deec6c 124 ///
WiredHome 2:8f71b71fce1b 125 bool SetWaveformMode(SG_Mode mode, bool force = false);
WiredHome 1:dd07e1deec6c 126
WiredHome 1:dd07e1deec6c 127 /// Operating mode changes
WiredHome 1:dd07e1deec6c 128 ///
WiredHome 1:dd07e1deec6c 129 /// Changes in the operating mode are reported by a bitmask value, where
WiredHome 1:dd07e1deec6c 130 /// zero or more bits are set.
WiredHome 1:dd07e1deec6c 131 ///
WiredHome 1:dd07e1deec6c 132 typedef enum {
WiredHome 2:8f71b71fce1b 133 OM_NONE = 0, ///< No change in operating mode
WiredHome 2:8f71b71fce1b 134 OM_MODE = 1, ///< Signal mode changed; Sine, Square, Triangle, Sawtooth, User
WiredHome 2:8f71b71fce1b 135 OM_FREQ = 2, ///< Change in the frequency
WiredHome 2:8f71b71fce1b 136 OM_PERI = 4, ///< Change in the period (effectively same as frequency)
WiredHome 2:8f71b71fce1b 137 OM_DUTY = 8, ///< Change in the duty cycle
WiredHome 2:8f71b71fce1b 138 OM_VOLT = 16, ///< Change in the peak to peak amplitude
WiredHome 2:8f71b71fce1b 139 OM_OFFS = 32, ///< Change in the offset voltage
WiredHome 2:8f71b71fce1b 140 } OM_Changes;
WiredHome 1:dd07e1deec6c 141
WiredHome 1:dd07e1deec6c 142 /// Poll the Signal Generator UI for changes in operation.
WiredHome 1:dd07e1deec6c 143 ///
WiredHome 1:dd07e1deec6c 144 /// Call this periodically, in order to determine if there is a user-activated
WiredHome 1:dd07e1deec6c 145 /// change in the operating mode of the signal generator.
WiredHome 1:dd07e1deec6c 146 ///
WiredHome 1:dd07e1deec6c 147 /// @param[in] c is the optional character, emulating the onscreen keypad
WiredHome 1:dd07e1deec6c 148 /// - 'd' duty cycle entry
WiredHome 1:dd07e1deec6c 149 /// - 'f' frequency entry
WiredHome 1:dd07e1deec6c 150 /// - 'p' period entry
WiredHome 1:dd07e1deec6c 151 /// - 'v' voltage entry
WiredHome 1:dd07e1deec6c 152 /// - 'o' offset voltage entry
WiredHome 1:dd07e1deec6c 153 /// - '0'-'9','.' numeric entry
WiredHome 1:dd07e1deec6c 154 /// - <enter> complete numeric entry
WiredHome 1:dd07e1deec6c 155 /// - <esc> abandon numeric entry
WiredHome 1:dd07e1deec6c 156 /// - <nul> do nothing, just poll
WiredHome 1:dd07e1deec6c 157 /// @returns a bitmask of which non-zero indicates changes in mode.
WiredHome 1:dd07e1deec6c 158 ///
WiredHome 2:8f71b71fce1b 159 OM_Changes Poll(char c = 0);
WiredHome 1:dd07e1deec6c 160
WiredHome 1:dd07e1deec6c 161 /// Show the menu of commands on the console interface
WiredHome 1:dd07e1deec6c 162 ///
WiredHome 1:dd07e1deec6c 163 void ShowMenu(void);
WiredHome 1:dd07e1deec6c 164
WiredHome 1:dd07e1deec6c 165 private:
WiredHome 1:dd07e1deec6c 166 RA8875 * lcd;
WiredHome 2:8f71b71fce1b 167 SignalGenDAC * signal;
WiredHome 1:dd07e1deec6c 168 const char * ProgName;
WiredHome 1:dd07e1deec6c 169 const char * Manuf;
WiredHome 1:dd07e1deec6c 170 const char * Ver;
WiredHome 1:dd07e1deec6c 171 const char * Build;
WiredHome 2:8f71b71fce1b 172 bool needsInit; ///< allows defering first init to after the constructor
WiredHome 1:dd07e1deec6c 173 typedef enum {
WiredHome 1:dd07e1deec6c 174 VS_MainScreen,
WiredHome 1:dd07e1deec6c 175 VS_Settings,
WiredHome 1:dd07e1deec6c 176 } VisualScreen;
WiredHome 1:dd07e1deec6c 177 VisualScreen vis;
WiredHome 1:dd07e1deec6c 178 SG_Mode mode; ///< signal mode
WiredHome 1:dd07e1deec6c 179 float frequency; ///< selected frequency
WiredHome 1:dd07e1deec6c 180 float dutycycle; ///< selected duty cycle
WiredHome 1:dd07e1deec6c 181 float voltage; ///< selected voltage
WiredHome 1:dd07e1deec6c 182 float offset; ///< selected offset
WiredHome 1:dd07e1deec6c 183 char textBuffer[10]; ///< a place to enter text
WiredHome 1:dd07e1deec6c 184 int textLen; ///< num chars in textBuffer
WiredHome 2:8f71b71fce1b 185 Timer timer; ///< Keypad repeat timer
WiredHome 2:8f71b71fce1b 186 OM_Changes EntryMd; ///< indicates if in data entry mode
WiredHome 2:8f71b71fce1b 187 uint16_t Changes; ///< combined from EntryMd for what to save
WiredHome 2:8f71b71fce1b 188 Timer timerSave; ///< Save state timer
WiredHome 2:8f71b71fce1b 189
WiredHome 1:dd07e1deec6c 190 void ShowProductInfo(void);
WiredHome 1:dd07e1deec6c 191 void ShowBrightnessSetting(void);
WiredHome 1:dd07e1deec6c 192 char GetTouchEvent(void);
WiredHome 1:dd07e1deec6c 193 void ClearScope(void);
WiredHome 1:dd07e1deec6c 194 void UpdateScope(void);
WiredHome 1:dd07e1deec6c 195 void updateDutyCycle(void);
WiredHome 1:dd07e1deec6c 196 void updateFrequency(void);
WiredHome 1:dd07e1deec6c 197 void updatePeriod(void);
WiredHome 1:dd07e1deec6c 198 void updateVoltage(void);
WiredHome 1:dd07e1deec6c 199 void updateOffset(void);
WiredHome 1:dd07e1deec6c 200 void updateTextWindow(void);
WiredHome 2:8f71b71fce1b 201 void clearTextWindow(void);
WiredHome 2:8f71b71fce1b 202 /// Set a flag to request modified settings to be saved.
WiredHome 2:8f71b71fce1b 203 ///
WiredHome 2:8f71b71fce1b 204 /// This is also called with OM_NONE as a background task to see if
WiredHome 2:8f71b71fce1b 205 /// any settings have been changed. In this way, settings changes are not
WiredHome 2:8f71b71fce1b 206 /// written immediately, which is both slow, and unnecessary if another
WiredHome 2:8f71b71fce1b 207 /// change is about to be made.
WiredHome 2:8f71b71fce1b 208 ///
WiredHome 2:8f71b71fce1b 209 /// @param[in] reportMode indicates what setting, if any, has changed.
WiredHome 2:8f71b71fce1b 210 ///
WiredHome 2:8f71b71fce1b 211 void SaveSettings(OM_Changes reportMode = OM_NONE);
WiredHome 2:8f71b71fce1b 212 void resetDataEntry(OM_Changes mode = OM_NONE, bool save = false); ///< save the current value if exiting entry mode
WiredHome 2:8f71b71fce1b 213 void DrawNavGadget(void);
WiredHome 2:8f71b71fce1b 214 void DrawModeButtons(void);
WiredHome 1:dd07e1deec6c 215 void DrawKeypadEnabled(bool enable = false);
WiredHome 1:dd07e1deec6c 216 void DrawButton(rect_t r, bool pressed, SG_Mode mode, bool enable = false, int label=0);
WiredHome 2:8f71b71fce1b 217 void DrawWaveform(rect_t r, SG_Mode mode, color_t color, bool drawPure = false); // pure ignores, voltage,offset,dutycycle
WiredHome 1:dd07e1deec6c 218 float rangelimit(float value, float minV, float maxV);
WiredHome 1:dd07e1deec6c 219 };
WiredHome 1:dd07e1deec6c 220
WiredHome 1:dd07e1deec6c 221
WiredHome 1:dd07e1deec6c 222 #endif // SIGNALGENDISPLAY_H