Signal Generator

Dependencies:   IniManager RA8875 Watchdog mbed-rtos mbed

Fork of speaker_demo_Analog by jim hamblen

Committer:
WiredHome
Date:
Mon Jan 16 22:57:59 2017 +0000
Revision:
5:49dd0c647a40
Parent:
3:d22f3e52d06a
Child:
6:1f48212fbaf9
Stable commit before any major refactoring

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 3:d22f3e52d06a 8 #include "IniManager.h"
WiredHome 1:dd07e1deec6c 9
WiredHome 1:dd07e1deec6c 10 #define SG_MIN_V 0.0 // Constraint, to match to the hardware
WiredHome 1:dd07e1deec6c 11 #define SG_MAX_V 3.3 //
WiredHome 1:dd07e1deec6c 12 #define SG_AOUT_FS 3.3 // Analog output full scale
WiredHome 1:dd07e1deec6c 13
WiredHome 2:8f71b71fce1b 14 #define SAVE_AFTER_IDLE_S 10 // How long after idle should it save
WiredHome 2:8f71b71fce1b 15
WiredHome 1:dd07e1deec6c 16 class SignalGenDisplay {
WiredHome 1:dd07e1deec6c 17 public:
WiredHome 1:dd07e1deec6c 18 /// Constructor for the Signal Generator User Interface.
WiredHome 1:dd07e1deec6c 19 ///
WiredHome 2:8f71b71fce1b 20 /// This will also load the initial settings from the
WiredHome 2:8f71b71fce1b 21 /// file system.
WiredHome 2:8f71b71fce1b 22 ///
WiredHome 3:d22f3e52d06a 23 /// @code
WiredHome 3:d22f3e52d06a 24 /// #include "SignalGenDisplay.h"
WiredHome 3:d22f3e52d06a 25 /// #include "SignalGenDAC.h"
WiredHome 3:d22f3e52d06a 26 /// RA8875 lcd(p5,p6,p7,p12, NC, "tft"); // SPI:{MOSI,MISO,SCK,/ChipSelect,/reset}, name
WiredHome 3:d22f3e52d06a 27 /// INI ini;
WiredHome 3:d22f3e52d06a 28 ///
WiredHome 3:d22f3e52d06a 29 /// RawSerial pc(USBTX, USBRX);
WiredHome 3:d22f3e52d06a 30 /// LocalFileSystem local("local");
WiredHome 3:d22f3e52d06a 31 /// SignalGenDAC g_signal(p18);
WiredHome 3:d22f3e52d06a 32 /// SignalGenDisplay ui(&lcd, &g_signal);
WiredHome 3:d22f3e52d06a 33 ///
WiredHome 3:d22f3e52d06a 34 /// int main() {
WiredHome 3:d22f3e52d06a 35 /// pc.baud(460800);
WiredHome 3:d22f3e52d06a 36 ///
WiredHome 3:d22f3e52d06a 37 /// if (wd.WatchdogCausedReset()) {
WiredHome 3:d22f3e52d06a 38 /// pc.printf("**** Watchdog Event caused reset ****\r\n");
WiredHome 3:d22f3e52d06a 39 /// }
WiredHome 3:d22f3e52d06a 40 /// wd.Configure(30.0);
WiredHome 3:d22f3e52d06a 41 /// ini.SetFile("/local/SigGen.ini", 2);
WiredHome 3:d22f3e52d06a 42 ///
WiredHome 3:d22f3e52d06a 43 /// lcd.init(480,272,16, true, true, true);
WiredHome 3:d22f3e52d06a 44 /// while (true)
WiredHome 3:d22f3e52d06a 45 /// {
WiredHome 3:d22f3e52d06a 46 /// wd.Service();
WiredHome 3:d22f3e52d06a 47 /// if (pc.readable()) {
WiredHome 3:d22f3e52d06a 48 /// int c = pc.getc();
WiredHome 3:d22f3e52d06a 49 /// ui.Poll(c);
WiredHome 3:d22f3e52d06a 50 /// } else {
WiredHome 3:d22f3e52d06a 51 /// ui.Poll();
WiredHome 3:d22f3e52d06a 52 /// }
WiredHome 3:d22f3e52d06a 53 /// } // End of 'while' statement
WiredHome 3:d22f3e52d06a 54 /// } // End of main program
WiredHome 3:d22f3e52d06a 55 /// @endcode
WiredHome 3:d22f3e52d06a 56 ///
WiredHome 1:dd07e1deec6c 57 /// @param[in] lcd is a pointer to the Graphics Display
WiredHome 1:dd07e1deec6c 58 /// @param[in] signal is a handle to the signal generator
WiredHome 3:d22f3e52d06a 59 /// @param[in] Path is a pointer to an optional file system path. If
WiredHome 3:d22f3e52d06a 60 /// not provided, "/local" is used. If you do not have the
WiredHome 3:d22f3e52d06a 61 /// original mbed, your device might not have the local file
WiredHome 3:d22f3e52d06a 62 /// system.
WiredHome 3:d22f3e52d06a 63 /// @param[in] ProgrName is an optional pointer to a constant string
WiredHome 3:d22f3e52d06a 64 /// proclaiming the program name. If not provided,
WiredHome 3:d22f3e52d06a 65 /// "Signal Generator" is used.
WiredHome 3:d22f3e52d06a 66 /// @param[in] Manuf is an optional pointer to a constant string. If
WiredHome 3:d22f3e52d06a 67 /// not provided, "Smartware Computing" is used.
WiredHome 3:d22f3e52d06a 68 /// @param[in] Ver is an optional pointer to a constant string. If not
WiredHome 3:d22f3e52d06a 69 /// provided, "0.01" (or similar) is used.
WiredHome 3:d22f3e52d06a 70 /// @param[in] Build is an optional pointer to a constant string. If not
WiredHome 3:d22f3e52d06a 71 /// provided, __DATE__ " " __TIME__ is used.
WiredHome 1:dd07e1deec6c 72 ///
WiredHome 3:d22f3e52d06a 73 SignalGenDisplay(RA8875 * lcd, SignalGenDAC * signal,
WiredHome 3:d22f3e52d06a 74 const char * Path = "/local",
WiredHome 3:d22f3e52d06a 75 const char * ProgName = "Signal Generator",
WiredHome 3:d22f3e52d06a 76 const char * Manuf = "Smartware Computing",
WiredHome 3:d22f3e52d06a 77 const char * Ver = "0.01",
WiredHome 3:d22f3e52d06a 78 const char * Build = __DATE__ " " __TIME__);
WiredHome 1:dd07e1deec6c 79
WiredHome 1:dd07e1deec6c 80 /// Destructor
WiredHome 1:dd07e1deec6c 81 ////
WiredHome 1:dd07e1deec6c 82 ~SignalGenDisplay();
WiredHome 1:dd07e1deec6c 83
WiredHome 2:8f71b71fce1b 84 /// Refresh the display for the current settings
WiredHome 2:8f71b71fce1b 85 /// and display mode.
WiredHome 1:dd07e1deec6c 86 ///
WiredHome 2:8f71b71fce1b 87 void Refresh(void);
WiredHome 1:dd07e1deec6c 88
WiredHome 1:dd07e1deec6c 89 /// Set the frequency information
WiredHome 1:dd07e1deec6c 90 ///
WiredHome 1:dd07e1deec6c 91 /// This automatically sets the period as 1/frequency
WiredHome 1:dd07e1deec6c 92 ///
WiredHome 1:dd07e1deec6c 93 /// @param[in] frequency desired
WiredHome 1:dd07e1deec6c 94 /// @returns true if the value was accepted
WiredHome 1:dd07e1deec6c 95 ///
WiredHome 1:dd07e1deec6c 96 bool SetFrequency(float frequency);
WiredHome 1:dd07e1deec6c 97
WiredHome 1:dd07e1deec6c 98 /// Get the current frequency setting
WiredHome 1:dd07e1deec6c 99 ///
WiredHome 1:dd07e1deec6c 100 /// @returns current frequency
WiredHome 1:dd07e1deec6c 101 ///
WiredHome 1:dd07e1deec6c 102 float GetFrequency(void) { return frequency; }
WiredHome 1:dd07e1deec6c 103
WiredHome 1:dd07e1deec6c 104 /// Set the period instead of the frequency
WiredHome 1:dd07e1deec6c 105 ///
WiredHome 1:dd07e1deec6c 106 /// This automatically sets the frequency as 1/period
WiredHome 1:dd07e1deec6c 107 ///
WiredHome 1:dd07e1deec6c 108 /// @param[in] period desired
WiredHome 1:dd07e1deec6c 109 /// @returns true if the value was accepted
WiredHome 1:dd07e1deec6c 110 ///
WiredHome 1:dd07e1deec6c 111 bool SetPeriod(float period);
WiredHome 1:dd07e1deec6c 112
WiredHome 1:dd07e1deec6c 113 /// Get the current period
WiredHome 1:dd07e1deec6c 114 ///
WiredHome 1:dd07e1deec6c 115 /// @returns current period
WiredHome 1:dd07e1deec6c 116 ///
WiredHome 1:dd07e1deec6c 117 float GetPeriod(void) { return 1/frequency; }
WiredHome 1:dd07e1deec6c 118
WiredHome 1:dd07e1deec6c 119 /// Set the Duty Cycle
WiredHome 1:dd07e1deec6c 120 ///
WiredHome 1:dd07e1deec6c 121 /// This adjusts the duty cycle of the waveform
WiredHome 1:dd07e1deec6c 122 ///
WiredHome 1:dd07e1deec6c 123 /// @param[in] dutyCycle is a value ranging from 0 to 100.
WiredHome 1:dd07e1deec6c 124 /// @returns true if the value was accepted
WiredHome 1:dd07e1deec6c 125 ///
WiredHome 1:dd07e1deec6c 126 bool SetDutyCycle(float dutyCycle);
WiredHome 1:dd07e1deec6c 127
WiredHome 1:dd07e1deec6c 128 /// Get the current duty cycle
WiredHome 1:dd07e1deec6c 129 ///
WiredHome 1:dd07e1deec6c 130 /// @returns the duty cycle
WiredHome 1:dd07e1deec6c 131 ///
WiredHome 1:dd07e1deec6c 132 float GetDutyCycle(void) { return dutycycle; }
WiredHome 1:dd07e1deec6c 133
WiredHome 1:dd07e1deec6c 134 /// Set the peak-to-peak voltage of the of the waveform
WiredHome 1:dd07e1deec6c 135 ///
WiredHome 1:dd07e1deec6c 136 /// In the range of 0 to 3.3v
WiredHome 1:dd07e1deec6c 137 ///
WiredHome 1:dd07e1deec6c 138 /// @param[in] voltage is the peak to peak voltage
WiredHome 1:dd07e1deec6c 139 /// @returns true if the value was accepted
WiredHome 1:dd07e1deec6c 140 ///
WiredHome 1:dd07e1deec6c 141 bool SetVoltagePeakToPeak(float voltage);
WiredHome 1:dd07e1deec6c 142
WiredHome 1:dd07e1deec6c 143 /// Get the Peak to Peak voltage
WiredHome 1:dd07e1deec6c 144 ///
WiredHome 1:dd07e1deec6c 145 /// @returns peak to peak voltage
WiredHome 1:dd07e1deec6c 146 ///
WiredHome 1:dd07e1deec6c 147 float GetVoltagePeakToPeak(void) { return voltage; }
WiredHome 1:dd07e1deec6c 148
WiredHome 1:dd07e1deec6c 149 /// Set the offset in the range of +/- 1.65v
WiredHome 1:dd07e1deec6c 150 ///
WiredHome 1:dd07e1deec6c 151 /// A zero volt offset is biased to VCC/2 (3.3/2)
WiredHome 1:dd07e1deec6c 152 ///
WiredHome 1:dd07e1deec6c 153 /// @param[in] voltage is the offset voltage.
WiredHome 1:dd07e1deec6c 154 /// @returns true if the value was accepted
WiredHome 1:dd07e1deec6c 155 ///
WiredHome 1:dd07e1deec6c 156 bool SetVoltageOffset(float voltage);
WiredHome 1:dd07e1deec6c 157
WiredHome 1:dd07e1deec6c 158 /// Get the offset voltage
WiredHome 1:dd07e1deec6c 159 ///
WiredHome 1:dd07e1deec6c 160 /// @returns offset voltage
WiredHome 1:dd07e1deec6c 161 ///
WiredHome 1:dd07e1deec6c 162 float GetVoltageOffset(void) { return offset; }
WiredHome 1:dd07e1deec6c 163
WiredHome 1:dd07e1deec6c 164 /// Select a Waveform Mode
WiredHome 1:dd07e1deec6c 165 ///
WiredHome 1:dd07e1deec6c 166 /// The selection will update the display to reflect the current state
WiredHome 1:dd07e1deec6c 167 ///
WiredHome 1:dd07e1deec6c 168 /// @param[in] mode sets the signal generator mode.
WiredHome 2:8f71b71fce1b 169 /// @param[in] force as true will force it to set the mode, redrawing the screen
WiredHome 1:dd07e1deec6c 170 /// @returns true if the value was accepted
WiredHome 1:dd07e1deec6c 171 ///
WiredHome 2:8f71b71fce1b 172 bool SetWaveformMode(SG_Mode mode, bool force = false);
WiredHome 1:dd07e1deec6c 173
WiredHome 1:dd07e1deec6c 174 /// Operating mode changes
WiredHome 1:dd07e1deec6c 175 ///
WiredHome 3:d22f3e52d06a 176 /// Changes in the operating mode or other parameters are reported by a
WiredHome 3:d22f3e52d06a 177 /// bitmask value, where zero or more bits are set.
WiredHome 1:dd07e1deec6c 178 ///
WiredHome 1:dd07e1deec6c 179 typedef enum {
WiredHome 5:49dd0c647a40 180 OM_NONE = 0x0000, ///< No change in operating mode
WiredHome 5:49dd0c647a40 181 OM_MODE = 0x0001, ///< Signal mode changed; Sine, Square, Triangle, Sawtooth, User
WiredHome 5:49dd0c647a40 182 OM_PULSE = 0x0002, ///< Continuous v. Single-shot
WiredHome 5:49dd0c647a40 183 OM_FREQ = 0x0004, ///< Change in the frequency
WiredHome 5:49dd0c647a40 184 OM_PERI = 0x0008, ///< Change in the period (effectively same as frequency)
WiredHome 5:49dd0c647a40 185 OM_DUTY = 0x0010, ///< Change in the duty cycle
WiredHome 5:49dd0c647a40 186 OM_VOLT = 0x0020, ///< Change in the peak to peak amplitude
WiredHome 5:49dd0c647a40 187 OM_OFFS = 0x0040, ///< Change in the offset voltage
WiredHome 5:49dd0c647a40 188 OM_BACKL = 0x0080, ///< Change in the backlight setting
WiredHome 2:8f71b71fce1b 189 } OM_Changes;
WiredHome 1:dd07e1deec6c 190
WiredHome 1:dd07e1deec6c 191 /// Poll the Signal Generator UI for changes in operation.
WiredHome 1:dd07e1deec6c 192 ///
WiredHome 1:dd07e1deec6c 193 /// Call this periodically, in order to determine if there is a user-activated
WiredHome 1:dd07e1deec6c 194 /// change in the operating mode of the signal generator.
WiredHome 1:dd07e1deec6c 195 ///
WiredHome 1:dd07e1deec6c 196 /// @param[in] c is the optional character, emulating the onscreen keypad
WiredHome 1:dd07e1deec6c 197 /// - 'd' duty cycle entry
WiredHome 1:dd07e1deec6c 198 /// - 'f' frequency entry
WiredHome 1:dd07e1deec6c 199 /// - 'p' period entry
WiredHome 1:dd07e1deec6c 200 /// - 'v' voltage entry
WiredHome 1:dd07e1deec6c 201 /// - 'o' offset voltage entry
WiredHome 1:dd07e1deec6c 202 /// - '0'-'9','.' numeric entry
WiredHome 1:dd07e1deec6c 203 /// - <enter> complete numeric entry
WiredHome 1:dd07e1deec6c 204 /// - <esc> abandon numeric entry
WiredHome 1:dd07e1deec6c 205 /// - <nul> do nothing, just poll
WiredHome 1:dd07e1deec6c 206 /// @returns a bitmask of which non-zero indicates changes in mode.
WiredHome 1:dd07e1deec6c 207 ///
WiredHome 2:8f71b71fce1b 208 OM_Changes Poll(char c = 0);
WiredHome 1:dd07e1deec6c 209
WiredHome 1:dd07e1deec6c 210 /// Show the menu of commands on the console interface
WiredHome 1:dd07e1deec6c 211 ///
WiredHome 1:dd07e1deec6c 212 void ShowMenu(void);
WiredHome 1:dd07e1deec6c 213
WiredHome 1:dd07e1deec6c 214 private:
WiredHome 1:dd07e1deec6c 215 RA8875 * lcd;
WiredHome 2:8f71b71fce1b 216 SignalGenDAC * signal;
WiredHome 3:d22f3e52d06a 217 const char * Path;
WiredHome 1:dd07e1deec6c 218 const char * ProgName;
WiredHome 1:dd07e1deec6c 219 const char * Manuf;
WiredHome 1:dd07e1deec6c 220 const char * Ver;
WiredHome 1:dd07e1deec6c 221 const char * Build;
WiredHome 2:8f71b71fce1b 222 bool needsInit; ///< allows defering first init to after the constructor
WiredHome 3:d22f3e52d06a 223 INI ini;
WiredHome 1:dd07e1deec6c 224 typedef enum {
WiredHome 1:dd07e1deec6c 225 VS_MainScreen,
WiredHome 1:dd07e1deec6c 226 VS_Settings,
WiredHome 1:dd07e1deec6c 227 } VisualScreen;
WiredHome 1:dd07e1deec6c 228 VisualScreen vis;
WiredHome 1:dd07e1deec6c 229 SG_Mode mode; ///< signal mode
WiredHome 1:dd07e1deec6c 230 float frequency; ///< selected frequency
WiredHome 1:dd07e1deec6c 231 float dutycycle; ///< selected duty cycle
WiredHome 1:dd07e1deec6c 232 float voltage; ///< selected voltage
WiredHome 1:dd07e1deec6c 233 float offset; ///< selected offset
WiredHome 3:d22f3e52d06a 234 int pulseMode; ///< 0 == continuos, 1 == one-shot
WiredHome 1:dd07e1deec6c 235 char textBuffer[10]; ///< a place to enter text
WiredHome 1:dd07e1deec6c 236 int textLen; ///< num chars in textBuffer
WiredHome 3:d22f3e52d06a 237 Timer timerRepeat; ///< Keypad repeat timer
WiredHome 2:8f71b71fce1b 238 OM_Changes EntryMd; ///< indicates if in data entry mode
WiredHome 2:8f71b71fce1b 239 uint16_t Changes; ///< combined from EntryMd for what to save
WiredHome 2:8f71b71fce1b 240 Timer timerSave; ///< Save state timer
WiredHome 3:d22f3e52d06a 241 Timer timerForceTSCal; ///< tracks continuous touch to force TS Calibration
WiredHome 3:d22f3e52d06a 242
WiredHome 3:d22f3e52d06a 243 void ShowProductInfo(bool builddate = false);
WiredHome 1:dd07e1deec6c 244 void ShowBrightnessSetting(void);
WiredHome 1:dd07e1deec6c 245 char GetTouchEvent(void);
WiredHome 1:dd07e1deec6c 246 void ClearScope(void);
WiredHome 1:dd07e1deec6c 247 void UpdateScope(void);
WiredHome 1:dd07e1deec6c 248 void updateDutyCycle(void);
WiredHome 1:dd07e1deec6c 249 void updateFrequency(void);
WiredHome 1:dd07e1deec6c 250 void updatePeriod(void);
WiredHome 1:dd07e1deec6c 251 void updateVoltage(void);
WiredHome 1:dd07e1deec6c 252 void updateOffset(void);
WiredHome 1:dd07e1deec6c 253 void updateTextWindow(void);
WiredHome 2:8f71b71fce1b 254 void clearTextWindow(void);
WiredHome 2:8f71b71fce1b 255 /// Set a flag to request modified settings to be saved.
WiredHome 2:8f71b71fce1b 256 ///
WiredHome 2:8f71b71fce1b 257 /// This is also called with OM_NONE as a background task to see if
WiredHome 2:8f71b71fce1b 258 /// any settings have been changed. In this way, settings changes are not
WiredHome 2:8f71b71fce1b 259 /// written immediately, which is both slow, and unnecessary if another
WiredHome 2:8f71b71fce1b 260 /// change is about to be made.
WiredHome 2:8f71b71fce1b 261 ///
WiredHome 2:8f71b71fce1b 262 /// @param[in] reportMode indicates what setting, if any, has changed.
WiredHome 2:8f71b71fce1b 263 ///
WiredHome 2:8f71b71fce1b 264 void SaveSettings(OM_Changes reportMode = OM_NONE);
WiredHome 2:8f71b71fce1b 265 void resetDataEntry(OM_Changes mode = OM_NONE, bool save = false); ///< save the current value if exiting entry mode
WiredHome 2:8f71b71fce1b 266 void DrawNavGadget(void);
WiredHome 2:8f71b71fce1b 267 void DrawModeButtons(void);
WiredHome 1:dd07e1deec6c 268 void DrawKeypadEnabled(bool enable = false);
WiredHome 1:dd07e1deec6c 269 void DrawButton(rect_t r, bool pressed, SG_Mode mode, bool enable = false, int label=0);
WiredHome 2:8f71b71fce1b 270 void DrawWaveform(rect_t r, SG_Mode mode, color_t color, bool drawPure = false); // pure ignores, voltage,offset,dutycycle
WiredHome 1:dd07e1deec6c 271 float rangelimit(float value, float minV, float maxV);
WiredHome 3:d22f3e52d06a 272 void ShowCyclesControl(void);
WiredHome 3:d22f3e52d06a 273
WiredHome 3:d22f3e52d06a 274 /// Force a calibration of the resistive touchscreen
WiredHome 3:d22f3e52d06a 275 void CalibrateTS(void);
WiredHome 3:d22f3e52d06a 276
WiredHome 3:d22f3e52d06a 277 /// Try to load a previous resistive touch screen calibration from storage. If it
WiredHome 3:d22f3e52d06a 278 /// doesn't exist, activate the touch screen calibration process.
WiredHome 3:d22f3e52d06a 279 void InitializeTS(void);
WiredHome 3:d22f3e52d06a 280 void ShowStartStop(bool showIt);
WiredHome 1:dd07e1deec6c 281 };
WiredHome 1:dd07e1deec6c 282
WiredHome 1:dd07e1deec6c 283
WiredHome 5:49dd0c647a40 284 #endif // SIGNALGENVIEW_H