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 2:8f71b71fce1b 1 //
WiredHome 2:8f71b71fce1b 2 // Signal Generator Control System
WiredHome 2:8f71b71fce1b 3 //
WiredHome 2:8f71b71fce1b 4 //
WiredHome 1:dd07e1deec6c 5 #include "SignalGenDisplay.h"
WiredHome 1:dd07e1deec6c 6 #include "rtos.h"
WiredHome 1:dd07e1deec6c 7 #include "IniManager.h"
WiredHome 1:dd07e1deec6c 8
WiredHome 1:dd07e1deec6c 9 extern INI ini;
WiredHome 1:dd07e1deec6c 10
WiredHome 1:dd07e1deec6c 11 // ##### Main Page #############################################################
WiredHome 1:dd07e1deec6c 12 //
WiredHome 1:dd07e1deec6c 13 // +---------------------------------------------------------------------------+
WiredHome 2:8f71b71fce1b 14 // | +--- Scope Area ---------------------------+ Progam Name and version |
WiredHome 1:dd07e1deec6c 15 // | | | Manufacturer name |
WiredHome 2:8f71b71fce1b 16 // | | +---- Wave Outline - - | |
WiredHome 2:8f71b71fce1b 17 // | | | | [Text Entry Box] [ Back ] |
WiredHome 2:8f71b71fce1b 18 // | | | | |
WiredHome 2:8f71b71fce1b 19 // | | | +------------------------+ |
WiredHome 1:dd07e1deec6c 20 // | | | | | |
WiredHome 2:8f71b71fce1b 21 // | | | | | | |
WiredHome 2:8f71b71fce1b 22 // | | | | | | |
WiredHome 2:8f71b71fce1b 23 // | | ---+ | | | |
WiredHome 1:dd07e1deec6c 24 // | | | | Keypad Area | |
WiredHome 1:dd07e1deec6c 25 // | +------------------------------------------+ | | |
WiredHome 1:dd07e1deec6c 26 // | | | |
WiredHome 1:dd07e1deec6c 27 // | [duty cycle] [frequency] [amplitude] | | |
WiredHome 1:dd07e1deec6c 28 // | | | |
WiredHome 1:dd07e1deec6c 29 // | [ ... ] [period ] [offset ] | | |
WiredHome 1:dd07e1deec6c 30 // | | | |
WiredHome 1:dd07e1deec6c 31 // | [ ] [ ] [ ] [ ] [ ] | | |
WiredHome 1:dd07e1deec6c 32 // | [Sine ] [Square] [Triangle] [Sawtooth] [User] +------------------------+ |
WiredHome 1:dd07e1deec6c 33 // +---------------------------------------------------------------------------+
WiredHome 1:dd07e1deec6c 34
WiredHome 2:8f71b71fce1b 35 // Object Colors
WiredHome 2:8f71b71fce1b 36 #define UI_BackColor RGB(8,8,8)
WiredHome 2:8f71b71fce1b 37 #define UI_ScopeBackColor RGB(0,0,0)
WiredHome 2:8f71b71fce1b 38 #define UI_ScopeFrameColor RGB(255,255,255)
WiredHome 2:8f71b71fce1b 39 #define WaveOutlineColor RGB(16,16,32)
WiredHome 2:8f71b71fce1b 40 #define UI_DutyColor Magenta
WiredHome 2:8f71b71fce1b 41 #define UI_FreqColor BrightRed
WiredHome 2:8f71b71fce1b 42 #define UI_VP2PColor Yellow
WiredHome 2:8f71b71fce1b 43 #define UI_VOffsetColor Green
WiredHome 2:8f71b71fce1b 44 #define UI_BUTTON_FACE_UP White
WiredHome 2:8f71b71fce1b 45 #define UI_BUTTON_FACE_DN RGB(255,92,92)
WiredHome 2:8f71b71fce1b 46 #define UI_BUTTON_SHADOW RGB(128,0,0)
WiredHome 2:8f71b71fce1b 47 #define UI_BUTTON_FACE_DISABLED RGB(24,24,24)
WiredHome 2:8f71b71fce1b 48 #define UI_BUTTON_SHADOW_DISABLED RGB(32,0,0)
WiredHome 2:8f71b71fce1b 49 #define UI_ProductNameColor UI_BUTTON_FACE_DN
WiredHome 1:dd07e1deec6c 50
WiredHome 2:8f71b71fce1b 51 // Rectangular Zones
WiredHome 2:8f71b71fce1b 52 const rect_t UI_DATA_ENTRY = {300,53, 410,73};
WiredHome 1:dd07e1deec6c 53 const rect_t UI_SCOPE_RECT = {4,5, 290,160};
WiredHome 2:8f71b71fce1b 54 #define SC_LEFT_MARGIN 10 // Scope left margin
WiredHome 2:8f71b71fce1b 55 #define SC_TOP_MARGIN 20
WiredHome 2:8f71b71fce1b 56 #define SC_RIGHT_MARGIN 30
WiredHome 2:8f71b71fce1b 57 #define SC_BOT_MARGIN 30
WiredHome 2:8f71b71fce1b 58 const rect_t UI_WAVE_RECT = {4+SC_LEFT_MARGIN,5+SC_TOP_MARGIN, 290-SC_RIGHT_MARGIN,160-SC_BOT_MARGIN};
WiredHome 1:dd07e1deec6c 59
WiredHome 2:8f71b71fce1b 60 #define BTN_W 54 // Button width
WiredHome 2:8f71b71fce1b 61 #define BTN_H 32 // Button height
WiredHome 2:8f71b71fce1b 62 #define BTN_S 5 // Button white-space
WiredHome 2:8f71b71fce1b 63
WiredHome 2:8f71b71fce1b 64 #define BTN_MODE_X 2 // Mode Buttons left edge
WiredHome 2:8f71b71fce1b 65 #define BTN_MODE_Y 233 // Mode Buttons top edge
WiredHome 2:8f71b71fce1b 66
WiredHome 2:8f71b71fce1b 67 #define BTN_KEYP_X 300 // Keypad left edge
WiredHome 2:8f71b71fce1b 68 #define BTN_KEYP_Y 53 // Keypad top edge
WiredHome 1:dd07e1deec6c 69
WiredHome 1:dd07e1deec6c 70 const rect_t Parameters[] = {
WiredHome 2:8f71b71fce1b 71 {4,170, 60,190}, // 'd'uty cycle
WiredHome 2:8f71b71fce1b 72 {90,170, 186,190}, // 'f'requency
WiredHome 2:8f71b71fce1b 73 {90,200, 186,220}, // 'p'eriod
WiredHome 2:8f71b71fce1b 74 {230,170, 290,190}, // 'v'oltage
WiredHome 2:8f71b71fce1b 75 {230,200, 290,220} // 'o'ffset
WiredHome 1:dd07e1deec6c 76 };
WiredHome 1:dd07e1deec6c 77 const int ParameterCount = sizeof(Parameters)/sizeof(Parameters[0]);
WiredHome 2:8f71b71fce1b 78 const char ParameterKeys[] = { 'd', 'f', 'p', 'v', 'o' };
WiredHome 1:dd07e1deec6c 79
WiredHome 2:8f71b71fce1b 80 const rect_t UI_PROD_RECT = {298,3, 479,40};
WiredHome 2:8f71b71fce1b 81 const rect_t NavToSettings = { 4,200, 60,220 };
WiredHome 1:dd07e1deec6c 82
WiredHome 2:8f71b71fce1b 83 // Mode Buttons
WiredHome 2:8f71b71fce1b 84 const rect_t ModeButtons[] = {
WiredHome 1:dd07e1deec6c 85 { BTN_MODE_X+0*(BTN_W+BTN_S),BTN_MODE_Y, BTN_MODE_X+0*(BTN_W+BTN_S)+BTN_W,BTN_MODE_Y+BTN_H },
WiredHome 1:dd07e1deec6c 86 { BTN_MODE_X+1*(BTN_W+BTN_S),BTN_MODE_Y, BTN_MODE_X+1*(BTN_W+BTN_S)+BTN_W,BTN_MODE_Y+BTN_H },
WiredHome 1:dd07e1deec6c 87 { BTN_MODE_X+2*(BTN_W+BTN_S),BTN_MODE_Y, BTN_MODE_X+2*(BTN_W+BTN_S)+BTN_W,BTN_MODE_Y+BTN_H },
WiredHome 1:dd07e1deec6c 88 { BTN_MODE_X+3*(BTN_W+BTN_S),BTN_MODE_Y, BTN_MODE_X+3*(BTN_W+BTN_S)+BTN_W,BTN_MODE_Y+BTN_H },
WiredHome 1:dd07e1deec6c 89 { BTN_MODE_X+4*(BTN_W+BTN_S),BTN_MODE_Y, BTN_MODE_X+4*(BTN_W+BTN_S)+BTN_W,BTN_MODE_Y+BTN_H },
WiredHome 1:dd07e1deec6c 90 };
WiredHome 2:8f71b71fce1b 91 const int ModeCount = sizeof(ModeButtons)/sizeof(ModeButtons[0]);
WiredHome 2:8f71b71fce1b 92 SG_Mode UI_ModeList[] = {
WiredHome 2:8f71b71fce1b 93 SG_SINE,
WiredHome 2:8f71b71fce1b 94 SG_SQUARE,
WiredHome 2:8f71b71fce1b 95 SG_TRIANGLE,
WiredHome 2:8f71b71fce1b 96 SG_SAWTOOTH,
WiredHome 2:8f71b71fce1b 97 SG_USER,
WiredHome 1:dd07e1deec6c 98 };
WiredHome 1:dd07e1deec6c 99 const char ModeKeys[] = { 'S','Q','T','W','U' };
WiredHome 2:8f71b71fce1b 100 const char *ModeNames[] = {
WiredHome 2:8f71b71fce1b 101 "Sine",
WiredHome 2:8f71b71fce1b 102 "Square",
WiredHome 2:8f71b71fce1b 103 "Triangle",
WiredHome 2:8f71b71fce1b 104 "Sawtooth",
WiredHome 2:8f71b71fce1b 105 "User",
WiredHome 2:8f71b71fce1b 106 };
WiredHome 1:dd07e1deec6c 107
WiredHome 1:dd07e1deec6c 108 const rect_t UI_Keypad[] = {
WiredHome 2:8f71b71fce1b 109 {BTN_KEYP_X+2*(BTN_W+BTN_S),BTN_KEYP_Y+0*(BTN_H+BTN_S), BTN_KEYP_X+2*(BTN_W+BTN_S)+BTN_W,BTN_KEYP_Y+0*(BTN_H+BTN_S)+BTN_H }, // backspace
WiredHome 1:dd07e1deec6c 110 {BTN_KEYP_X+0*(BTN_W+BTN_S),BTN_KEYP_Y+1*(BTN_H+BTN_S), BTN_KEYP_X+0*(BTN_W+BTN_S)+BTN_W,BTN_KEYP_Y+1*(BTN_H+BTN_S)+BTN_H },
WiredHome 1:dd07e1deec6c 111 {BTN_KEYP_X+1*(BTN_W+BTN_S),BTN_KEYP_Y+1*(BTN_H+BTN_S), BTN_KEYP_X+1*(BTN_W+BTN_S)+BTN_W,BTN_KEYP_Y+1*(BTN_H+BTN_S)+BTN_H },
WiredHome 1:dd07e1deec6c 112 {BTN_KEYP_X+2*(BTN_W+BTN_S),BTN_KEYP_Y+1*(BTN_H+BTN_S), BTN_KEYP_X+2*(BTN_W+BTN_S)+BTN_W,BTN_KEYP_Y+1*(BTN_H+BTN_S)+BTN_H },
WiredHome 1:dd07e1deec6c 113 {BTN_KEYP_X+0*(BTN_W+BTN_S),BTN_KEYP_Y+2*(BTN_H+BTN_S), BTN_KEYP_X+0*(BTN_W+BTN_S)+BTN_W,BTN_KEYP_Y+2*(BTN_H+BTN_S)+BTN_H },
WiredHome 1:dd07e1deec6c 114 {BTN_KEYP_X+1*(BTN_W+BTN_S),BTN_KEYP_Y+2*(BTN_H+BTN_S), BTN_KEYP_X+1*(BTN_W+BTN_S)+BTN_W,BTN_KEYP_Y+2*(BTN_H+BTN_S)+BTN_H },
WiredHome 1:dd07e1deec6c 115 {BTN_KEYP_X+2*(BTN_W+BTN_S),BTN_KEYP_Y+2*(BTN_H+BTN_S), BTN_KEYP_X+2*(BTN_W+BTN_S)+BTN_W,BTN_KEYP_Y+2*(BTN_H+BTN_S)+BTN_H },
WiredHome 1:dd07e1deec6c 116 {BTN_KEYP_X+0*(BTN_W+BTN_S),BTN_KEYP_Y+3*(BTN_H+BTN_S), BTN_KEYP_X+0*(BTN_W+BTN_S)+BTN_W,BTN_KEYP_Y+3*(BTN_H+BTN_S)+BTN_H },
WiredHome 1:dd07e1deec6c 117 {BTN_KEYP_X+1*(BTN_W+BTN_S),BTN_KEYP_Y+3*(BTN_H+BTN_S), BTN_KEYP_X+1*(BTN_W+BTN_S)+BTN_W,BTN_KEYP_Y+3*(BTN_H+BTN_S)+BTN_H },
WiredHome 1:dd07e1deec6c 118 {BTN_KEYP_X+2*(BTN_W+BTN_S),BTN_KEYP_Y+3*(BTN_H+BTN_S), BTN_KEYP_X+2*(BTN_W+BTN_S)+BTN_W,BTN_KEYP_Y+3*(BTN_H+BTN_S)+BTN_H },
WiredHome 1:dd07e1deec6c 119 {BTN_KEYP_X+0*(BTN_W+BTN_S),BTN_KEYP_Y+4*(BTN_H+BTN_S), BTN_KEYP_X+0*(BTN_W+BTN_S)+BTN_W,BTN_KEYP_Y+4*(BTN_H+BTN_S)+BTN_H },
WiredHome 1:dd07e1deec6c 120 {BTN_KEYP_X+1*(BTN_W+BTN_S),BTN_KEYP_Y+4*(BTN_H+BTN_S), BTN_KEYP_X+1*(BTN_W+BTN_S)+BTN_W,BTN_KEYP_Y+4*(BTN_H+BTN_S)+BTN_H },
WiredHome 1:dd07e1deec6c 121 {BTN_KEYP_X+2*(BTN_W+BTN_S),BTN_KEYP_Y+4*(BTN_H+BTN_S), BTN_KEYP_X+2*(BTN_W+BTN_S)+BTN_W,BTN_KEYP_Y+4*(BTN_H+BTN_S)+BTN_H },
WiredHome 2:8f71b71fce1b 122 {BTN_KEYP_X+0*(BTN_W+BTN_S),BTN_KEYP_Y+5*(BTN_H+BTN_S), BTN_KEYP_X+0*(BTN_W+BTN_S)+BTN_W,BTN_KEYP_Y+5*(BTN_H+BTN_S)+BTN_H },
WiredHome 2:8f71b71fce1b 123 {BTN_KEYP_X+1*(BTN_W+BTN_S),BTN_KEYP_Y+5*(BTN_H+BTN_S), BTN_KEYP_X+1*(BTN_W+BTN_S)+BTN_W,BTN_KEYP_Y+5*(BTN_H+BTN_S)+BTN_H },
WiredHome 2:8f71b71fce1b 124 {BTN_KEYP_X+2*(BTN_W+BTN_S),BTN_KEYP_Y+5*(BTN_H+BTN_S), BTN_KEYP_X+2*(BTN_W+BTN_S)+BTN_W,BTN_KEYP_Y+5*(BTN_H+BTN_S)+BTN_H },
WiredHome 1:dd07e1deec6c 125 };
WiredHome 1:dd07e1deec6c 126 const int KeypadCount = sizeof(UI_Keypad)/sizeof(UI_Keypad[0]);
WiredHome 1:dd07e1deec6c 127 const char UI_KeyLabels[] = {
WiredHome 2:8f71b71fce1b 128 '\x1B',
WiredHome 1:dd07e1deec6c 129 '7', '8', '9',
WiredHome 1:dd07e1deec6c 130 '4', '5', '6',
WiredHome 1:dd07e1deec6c 131 '1', '2', '3',
WiredHome 1:dd07e1deec6c 132 '0', '.', '-',
WiredHome 2:8f71b71fce1b 133 '\x19', '\x18', '\xB6',
WiredHome 1:dd07e1deec6c 134 };
WiredHome 2:8f71b71fce1b 135 const char KeyPadKeys[] = {
WiredHome 2:8f71b71fce1b 136 '\x08',
WiredHome 2:8f71b71fce1b 137 '7', '8', '9',
WiredHome 2:8f71b71fce1b 138 '4', '5', '6',
WiredHome 2:8f71b71fce1b 139 '1', '2', '3',
WiredHome 2:8f71b71fce1b 140 '0', '.', '-',
WiredHome 2:8f71b71fce1b 141 '<', '>', '\n' };
WiredHome 1:dd07e1deec6c 142
WiredHome 1:dd07e1deec6c 143
WiredHome 1:dd07e1deec6c 144 // ##### Settings #############################################################
WiredHome 1:dd07e1deec6c 145 //
WiredHome 1:dd07e1deec6c 146 // +---------------------------------------------------------------------------+
WiredHome 1:dd07e1deec6c 147 // | Progam Name and version |
WiredHome 1:dd07e1deec6c 148 // | Manufacturer name |
WiredHome 1:dd07e1deec6c 149 // | |
WiredHome 2:8f71b71fce1b 150 // | \ | / |
WiredHome 2:8f71b71fce1b 151 // | = O = |
WiredHome 2:8f71b71fce1b 152 // | / | \ |
WiredHome 1:dd07e1deec6c 153 // | +--------+ |
WiredHome 1:dd07e1deec6c 154 // | | | |
WiredHome 1:dd07e1deec6c 155 // | | | |
WiredHome 1:dd07e1deec6c 156 // | | | |
WiredHome 1:dd07e1deec6c 157 // | | | |
WiredHome 1:dd07e1deec6c 158 // | | | |
WiredHome 1:dd07e1deec6c 159 // | | | |
WiredHome 1:dd07e1deec6c 160 // | |--------| |
WiredHome 1:dd07e1deec6c 161 // | | | |
WiredHome 1:dd07e1deec6c 162 // | [ ... ] | | |
WiredHome 1:dd07e1deec6c 163 // | | | |
WiredHome 1:dd07e1deec6c 164 // | | | |
WiredHome 1:dd07e1deec6c 165 // | +--------+ |
WiredHome 1:dd07e1deec6c 166 // +---------------------------------------------------------------------------+
WiredHome 1:dd07e1deec6c 167
WiredHome 1:dd07e1deec6c 168 const point_t suncenter = { 450,65 };
WiredHome 1:dd07e1deec6c 169 const rect_t sunray[] = {
WiredHome 1:dd07e1deec6c 170 { 450-2,65-25, 450+2,65+25 },
WiredHome 1:dd07e1deec6c 171 { 450-25,65-2, 450+25,65+2 }
WiredHome 1:dd07e1deec6c 172 };
WiredHome 1:dd07e1deec6c 173 const rect_t sungraph = { 450-20,100+0, 450+20,265+0 };
WiredHome 1:dd07e1deec6c 174 const rect_t inrgraph = { 450-18,100+2, 450+18,265-2 };
WiredHome 1:dd07e1deec6c 175
WiredHome 2:8f71b71fce1b 176 #define PI 3.1415 // Handy value
WiredHome 2:8f71b71fce1b 177
WiredHome 2:8f71b71fce1b 178
WiredHome 2:8f71b71fce1b 179 SignalGenDisplay::SignalGenDisplay(RA8875 * _lcd, SignalGenDAC * _signal,
WiredHome 2:8f71b71fce1b 180 const char * _ProgName, const char * _Manuf, const char * _Ver, const char * _Build) :
WiredHome 2:8f71b71fce1b 181 lcd(_lcd), signal(_signal), ProgName(_ProgName), Manuf(_Manuf), Ver(_Ver), Build(_Build) {
WiredHome 2:8f71b71fce1b 182 needsInit = true;
WiredHome 2:8f71b71fce1b 183 }
WiredHome 2:8f71b71fce1b 184
WiredHome 2:8f71b71fce1b 185
WiredHome 2:8f71b71fce1b 186 SignalGenDisplay::~SignalGenDisplay() {
WiredHome 2:8f71b71fce1b 187 }
WiredHome 2:8f71b71fce1b 188
WiredHome 1:dd07e1deec6c 189
WiredHome 1:dd07e1deec6c 190 template <typename T> int sgn(T val) {
WiredHome 1:dd07e1deec6c 191 return (T(0) < val) - (val < T(0));
WiredHome 1:dd07e1deec6c 192 }
WiredHome 1:dd07e1deec6c 193
WiredHome 1:dd07e1deec6c 194 char SignalGenDisplay::GetTouchEvent(void) {
WiredHome 1:dd07e1deec6c 195 TouchCode_t touch;
WiredHome 1:dd07e1deec6c 196
WiredHome 1:dd07e1deec6c 197 touch = lcd->TouchPanelReadable(); // any touch to report?
WiredHome 1:dd07e1deec6c 198 if (touch) {
WiredHome 1:dd07e1deec6c 199 uint8_t id = lcd->TouchID(0); // 'id' tracks the individual touches
WiredHome 1:dd07e1deec6c 200 TouchCode_t ev = lcd->TouchCode(0); // 'ev'ent indicates no_touch, touch, held, release, ...
WiredHome 1:dd07e1deec6c 201 point_t point = lcd->TouchCoordinates(0); // and of course the (x,y) coordinates
WiredHome 1:dd07e1deec6c 202 if (ev == touch) {
WiredHome 1:dd07e1deec6c 203 timer.start();
WiredHome 1:dd07e1deec6c 204 timer.reset();
WiredHome 1:dd07e1deec6c 205 }
WiredHome 1:dd07e1deec6c 206 if ((ev == release) || (ev == held && timer.read_ms() > 250)) {
WiredHome 1:dd07e1deec6c 207 timer.reset();
WiredHome 1:dd07e1deec6c 208 switch (vis) {
WiredHome 1:dd07e1deec6c 209 case VS_MainScreen:
WiredHome 1:dd07e1deec6c 210 // Mode Keys touch
WiredHome 2:8f71b71fce1b 211 for (int i=0; i<ModeCount; i++) {
WiredHome 2:8f71b71fce1b 212 if (lcd->Intersect(ModeButtons[i], point)) {
WiredHome 1:dd07e1deec6c 213 return ModeKeys[i];
WiredHome 1:dd07e1deec6c 214 }
WiredHome 1:dd07e1deec6c 215 }
WiredHome 1:dd07e1deec6c 216 // Parameters
WiredHome 1:dd07e1deec6c 217 for (int i=0; i<ParameterCount; i++) {
WiredHome 1:dd07e1deec6c 218 if (lcd->Intersect(Parameters[i], point)) {
WiredHome 1:dd07e1deec6c 219 return ParameterKeys[i];
WiredHome 1:dd07e1deec6c 220 }
WiredHome 1:dd07e1deec6c 221 }
WiredHome 1:dd07e1deec6c 222
WiredHome 1:dd07e1deec6c 223 // Keypad
WiredHome 1:dd07e1deec6c 224 for (int i=0; i<KeypadCount; i++) {
WiredHome 1:dd07e1deec6c 225 if (lcd->Intersect(UI_Keypad[i], point)) {
WiredHome 1:dd07e1deec6c 226 return KeyPadKeys[i];
WiredHome 1:dd07e1deec6c 227 }
WiredHome 1:dd07e1deec6c 228 }
WiredHome 1:dd07e1deec6c 229
WiredHome 1:dd07e1deec6c 230 if (lcd->Intersect(NavToSettings, point)) {
WiredHome 1:dd07e1deec6c 231 vis = VS_Settings;
WiredHome 2:8f71b71fce1b 232 Refresh();
WiredHome 1:dd07e1deec6c 233 while (lcd->TouchPanelReadable())
WiredHome 1:dd07e1deec6c 234 ;
WiredHome 1:dd07e1deec6c 235 Thread::wait(100);
WiredHome 1:dd07e1deec6c 236 }
WiredHome 1:dd07e1deec6c 237 break;
WiredHome 1:dd07e1deec6c 238 case VS_Settings:
WiredHome 1:dd07e1deec6c 239 Thread::wait(20);
WiredHome 1:dd07e1deec6c 240 if (lcd->Intersect(sungraph, point)) {
WiredHome 1:dd07e1deec6c 241 float bl = (float)(sungraph.p2.y - point.y)/(sungraph.p2.y - sungraph.p1.y);
WiredHome 1:dd07e1deec6c 242 lcd->Backlight(rangelimit(bl, 0.1, 1.0));
WiredHome 1:dd07e1deec6c 243 ShowBrightnessSetting();
WiredHome 1:dd07e1deec6c 244 }
WiredHome 1:dd07e1deec6c 245 if (lcd->Intersect(NavToSettings, point)) {
WiredHome 2:8f71b71fce1b 246 // Save Backlight settings on screen change
WiredHome 1:dd07e1deec6c 247 char buf[20];
WiredHome 1:dd07e1deec6c 248 snprintf(buf, sizeof(buf), "%d", lcd->GetBacklight_u8());
WiredHome 1:dd07e1deec6c 249 ini.WriteString("Settings", "Backlight", buf);
WiredHome 1:dd07e1deec6c 250
WiredHome 1:dd07e1deec6c 251 // Switch to main screen
WiredHome 1:dd07e1deec6c 252 vis = VS_MainScreen;
WiredHome 2:8f71b71fce1b 253 Refresh();
WiredHome 1:dd07e1deec6c 254 while (lcd->TouchPanelReadable())
WiredHome 1:dd07e1deec6c 255 ;
WiredHome 1:dd07e1deec6c 256 Thread::wait(100);
WiredHome 1:dd07e1deec6c 257 ShowMenu();
WiredHome 1:dd07e1deec6c 258 }
WiredHome 1:dd07e1deec6c 259 break;
WiredHome 1:dd07e1deec6c 260 }
WiredHome 1:dd07e1deec6c 261 }
WiredHome 1:dd07e1deec6c 262 }
WiredHome 1:dd07e1deec6c 263 return 0;
WiredHome 1:dd07e1deec6c 264 }
WiredHome 1:dd07e1deec6c 265
WiredHome 1:dd07e1deec6c 266
WiredHome 2:8f71b71fce1b 267 void SignalGenDisplay::Refresh() {
WiredHome 2:8f71b71fce1b 268 if (needsInit) {
WiredHome 2:8f71b71fce1b 269 char buf[100];
WiredHome 2:8f71b71fce1b 270
WiredHome 2:8f71b71fce1b 271 needsInit = false;
WiredHome 2:8f71b71fce1b 272 vis = VS_MainScreen; // always start on main screen
WiredHome 2:8f71b71fce1b 273
WiredHome 2:8f71b71fce1b 274 // Default the backlight
WiredHome 2:8f71b71fce1b 275 ini.ReadString("Settings", "Backlight", buf, sizeof(buf), "60");
WiredHome 2:8f71b71fce1b 276 lcd->Backlight_u8(atoi(buf));
WiredHome 2:8f71b71fce1b 277
WiredHome 2:8f71b71fce1b 278 ini.ReadString("Signal", "Waveform", buf, sizeof(buf), "Sine");
WiredHome 2:8f71b71fce1b 279 for (int i=0; i<ModeCount; i++) {
WiredHome 2:8f71b71fce1b 280 if (strcmp(ModeNames[i], buf) == 0) {
WiredHome 2:8f71b71fce1b 281 mode = (SG_Mode)i;
WiredHome 2:8f71b71fce1b 282 break;
WiredHome 2:8f71b71fce1b 283 }
WiredHome 2:8f71b71fce1b 284 }
WiredHome 2:8f71b71fce1b 285 ini.ReadString("Signal", "Duty Cycle", buf, sizeof(buf), "50");
WiredHome 2:8f71b71fce1b 286 dutycycle = atof(buf);
WiredHome 2:8f71b71fce1b 287
WiredHome 2:8f71b71fce1b 288 ini.ReadString("Signal", "Frequency", buf, sizeof(buf), "1000");
WiredHome 2:8f71b71fce1b 289 frequency = atof(buf);
WiredHome 2:8f71b71fce1b 290
WiredHome 2:8f71b71fce1b 291 ini.ReadString("Signal", "Voltage", buf, sizeof(buf), "3.0");
WiredHome 2:8f71b71fce1b 292 voltage = atof(buf);
WiredHome 2:8f71b71fce1b 293
WiredHome 2:8f71b71fce1b 294 ini.ReadString("Signal", "Offset", buf, sizeof(buf), "1.5");
WiredHome 2:8f71b71fce1b 295 offset = atof(buf);
WiredHome 2:8f71b71fce1b 296 }
WiredHome 1:dd07e1deec6c 297 switch (vis) {
WiredHome 1:dd07e1deec6c 298 case VS_MainScreen:
WiredHome 1:dd07e1deec6c 299 lcd->background(UI_BackColor);
WiredHome 1:dd07e1deec6c 300 lcd->cls(1);
WiredHome 1:dd07e1deec6c 301 lcd->SelectDrawingLayer(0);
WiredHome 1:dd07e1deec6c 302 // Clear Screen
WiredHome 1:dd07e1deec6c 303 lcd->SetLayerMode(RA8875::ShowLayer0);
WiredHome 1:dd07e1deec6c 304
WiredHome 1:dd07e1deec6c 305 // Product Info
WiredHome 1:dd07e1deec6c 306 lcd->foreground(UI_ProductNameColor);
WiredHome 1:dd07e1deec6c 307 ShowProductInfo();
WiredHome 1:dd07e1deec6c 308
WiredHome 1:dd07e1deec6c 309 ClearScope();
WiredHome 1:dd07e1deec6c 310 resetDataEntry();
WiredHome 1:dd07e1deec6c 311 DrawNavGadget();
WiredHome 2:8f71b71fce1b 312 DrawModeButtons();
WiredHome 1:dd07e1deec6c 313 break;
WiredHome 1:dd07e1deec6c 314
WiredHome 1:dd07e1deec6c 315 case VS_Settings:
WiredHome 1:dd07e1deec6c 316 lcd->background(UI_BackColor);
WiredHome 1:dd07e1deec6c 317 lcd->cls(2);
WiredHome 1:dd07e1deec6c 318 lcd->SelectDrawingLayer(1);
WiredHome 1:dd07e1deec6c 319 lcd->SetLayerMode(RA8875::ShowLayer1);
WiredHome 1:dd07e1deec6c 320 lcd->foreground(UI_ProductNameColor);
WiredHome 1:dd07e1deec6c 321 ShowProductInfo();
WiredHome 1:dd07e1deec6c 322 ShowBrightnessSetting();
WiredHome 2:8f71b71fce1b 323 DrawNavGadget();
WiredHome 2:8f71b71fce1b 324 DrawModeButtons();
WiredHome 1:dd07e1deec6c 325 break;
WiredHome 1:dd07e1deec6c 326 }
WiredHome 1:dd07e1deec6c 327 }
WiredHome 1:dd07e1deec6c 328
WiredHome 2:8f71b71fce1b 329
WiredHome 2:8f71b71fce1b 330 void SignalGenDisplay::DrawModeButtons(void) {
WiredHome 2:8f71b71fce1b 331 for (int i=0; i<ModeCount; i++) {
WiredHome 2:8f71b71fce1b 332 DrawButton(ModeButtons[i], (UI_ModeList[i] == mode) ? true : false, UI_ModeList[i], true);
WiredHome 2:8f71b71fce1b 333 }
WiredHome 2:8f71b71fce1b 334 UpdateScope();
WiredHome 2:8f71b71fce1b 335 }
WiredHome 2:8f71b71fce1b 336
WiredHome 1:dd07e1deec6c 337 void SignalGenDisplay::DrawNavGadget(void) {
WiredHome 1:dd07e1deec6c 338 lcd->fillrect(NavToSettings, Black);
WiredHome 1:dd07e1deec6c 339 lcd->SetTextCursor(NavToSettings.p1.x+1, NavToSettings.p1.y+1);
WiredHome 1:dd07e1deec6c 340 lcd->foreground(White);
WiredHome 1:dd07e1deec6c 341 lcd->background(Black);
WiredHome 1:dd07e1deec6c 342 lcd->puts(" ...");
WiredHome 1:dd07e1deec6c 343 }
WiredHome 1:dd07e1deec6c 344
WiredHome 1:dd07e1deec6c 345
WiredHome 1:dd07e1deec6c 346 void SignalGenDisplay::ShowProductInfo(void) {
WiredHome 1:dd07e1deec6c 347 rect_t r = UI_PROD_RECT;
WiredHome 1:dd07e1deec6c 348 lcd->window(r);
WiredHome 1:dd07e1deec6c 349 lcd->SetTextCursor(r.p1.x, r.p1.y);
WiredHome 1:dd07e1deec6c 350 lcd->printf("%s v%s", ProgName, Ver);
WiredHome 1:dd07e1deec6c 351 lcd->SetTextCursor(r.p1.x, r.p1.y+16);
WiredHome 1:dd07e1deec6c 352 lcd->printf("by %s", Manuf);
WiredHome 1:dd07e1deec6c 353 lcd->window();
WiredHome 1:dd07e1deec6c 354 }
WiredHome 1:dd07e1deec6c 355
WiredHome 1:dd07e1deec6c 356 void SignalGenDisplay::ShowBrightnessSetting(void) {
WiredHome 1:dd07e1deec6c 357 // Sunbeam
WiredHome 1:dd07e1deec6c 358 lcd->fillrect(sunray[0], White);
WiredHome 1:dd07e1deec6c 359 lcd->fillrect(sunray[1], White);
WiredHome 1:dd07e1deec6c 360 lcd->fillcircle(suncenter, 18, UI_BackColor);
WiredHome 1:dd07e1deec6c 361 lcd->fillcircle(suncenter, 15, White);
WiredHome 1:dd07e1deec6c 362 lcd->rect(sungraph, Blue);
WiredHome 1:dd07e1deec6c 363 float bl = lcd->GetBacklight();
WiredHome 1:dd07e1deec6c 364 lcd->fillrect(inrgraph, UI_BackColor);
WiredHome 1:dd07e1deec6c 365 lcd->fillrect(inrgraph.p1.x,inrgraph.p2.y, inrgraph.p2.x, inrgraph.p2.y - bl * (inrgraph.p2.y - inrgraph.p1.y), White);
WiredHome 1:dd07e1deec6c 366 }
WiredHome 1:dd07e1deec6c 367
WiredHome 2:8f71b71fce1b 368 void SignalGenDisplay::ShowMenu(void) {
WiredHome 2:8f71b71fce1b 369 if (Manuf) {
WiredHome 2:8f71b71fce1b 370 printf("\r\n%s v%s by %s build %s\r\n\r\n", ProgName, Ver, Manuf, Build);
WiredHome 2:8f71b71fce1b 371 }
WiredHome 2:8f71b71fce1b 372 printf(" Select: Signal:\r\n");
WiredHome 2:8f71b71fce1b 373 printf(" S: Sine Wave d: Duty Cycle\r\n");
WiredHome 2:8f71b71fce1b 374 printf(" Q: Square Wave f: Frequency\r\n");
WiredHome 2:8f71b71fce1b 375 printf(" T: Triangle Wave p: Period\r\n");
WiredHome 2:8f71b71fce1b 376 printf(" W: Sawtooth Wave v: Voltage\r\n");
WiredHome 2:8f71b71fce1b 377 printf(" U: User Wave o: Offset\r\n");
WiredHome 2:8f71b71fce1b 378 printf(" \r\n");
WiredHome 2:8f71b71fce1b 379 printf(" 0-9 . - : Numeric entry\r\n");
WiredHome 2:8f71b71fce1b 380 printf(" < > : Modify selected signal\r\n");
WiredHome 2:8f71b71fce1b 381 printf(" <bs>: Backspace entry\r\n");
WiredHome 2:8f71b71fce1b 382 printf(" ?: This help <cr>: Save number\r\n");
WiredHome 2:8f71b71fce1b 383 printf(" #: Dump RA8875 <esc>: Exit number entry\r\n");
WiredHome 2:8f71b71fce1b 384 //printf(" 4: Reverse sawtoothSignal\r\n");
WiredHome 2:8f71b71fce1b 385 }
WiredHome 2:8f71b71fce1b 386
WiredHome 2:8f71b71fce1b 387 SignalGenDisplay::OM_Changes SignalGenDisplay::Poll(char c) {
WiredHome 2:8f71b71fce1b 388 OM_Changes ret = OM_NONE;
WiredHome 1:dd07e1deec6c 389
WiredHome 2:8f71b71fce1b 390 SaveSettings();
WiredHome 1:dd07e1deec6c 391 if (!c) {
WiredHome 1:dd07e1deec6c 392 c = GetTouchEvent();
WiredHome 1:dd07e1deec6c 393 }
WiredHome 1:dd07e1deec6c 394 if (c) {
WiredHome 1:dd07e1deec6c 395 printf("%02X: EntryMd: %d, textLen: %d [%s] VIS: %d\r\n", c, EntryMd, textLen, textBuffer, vis);
WiredHome 1:dd07e1deec6c 396 }
WiredHome 1:dd07e1deec6c 397 /// - 'd' duty cycle entry
WiredHome 1:dd07e1deec6c 398 /// - 'f' frequency entry
WiredHome 1:dd07e1deec6c 399 /// - 'p' period entry
WiredHome 1:dd07e1deec6c 400 /// - 'v' voltage entry
WiredHome 1:dd07e1deec6c 401 /// - 'o' offset voltage entry
WiredHome 1:dd07e1deec6c 402 /// - '0'-'9','.' numeric entry
WiredHome 1:dd07e1deec6c 403 /// - <enter> complete numeric entry
WiredHome 1:dd07e1deec6c 404 /// - <esc> abandon numeric entry
WiredHome 1:dd07e1deec6c 405 /// - <nul> do nothing, just poll
WiredHome 1:dd07e1deec6c 406 switch (c) {
WiredHome 2:8f71b71fce1b 407 case '#':
WiredHome 2:8f71b71fce1b 408 lcd->DumpRegisters();
WiredHome 2:8f71b71fce1b 409 break;
WiredHome 1:dd07e1deec6c 410 case '?':
WiredHome 1:dd07e1deec6c 411 ShowMenu();
WiredHome 1:dd07e1deec6c 412 break;
WiredHome 1:dd07e1deec6c 413 case 'S':
WiredHome 2:8f71b71fce1b 414 if (mode != SG_SINE)
WiredHome 2:8f71b71fce1b 415 SaveSettings(OM_MODE);
WiredHome 2:8f71b71fce1b 416 SetWaveformMode(SG_SINE);
WiredHome 2:8f71b71fce1b 417 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 1:dd07e1deec6c 418 //ret = SG_SINE;
WiredHome 1:dd07e1deec6c 419 break;
WiredHome 1:dd07e1deec6c 420 case 'Q':
WiredHome 2:8f71b71fce1b 421 if (mode != SG_SQUARE)
WiredHome 2:8f71b71fce1b 422 SaveSettings(OM_MODE);
WiredHome 2:8f71b71fce1b 423 SetWaveformMode(SG_SQUARE);
WiredHome 2:8f71b71fce1b 424 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 1:dd07e1deec6c 425 //ret = SG_SQUARE;
WiredHome 1:dd07e1deec6c 426 break;
WiredHome 1:dd07e1deec6c 427 case 'T':
WiredHome 2:8f71b71fce1b 428 if (mode != SG_TRIANGLE)
WiredHome 2:8f71b71fce1b 429 SaveSettings(OM_MODE);
WiredHome 2:8f71b71fce1b 430 SetWaveformMode(SG_TRIANGLE);
WiredHome 2:8f71b71fce1b 431 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 1:dd07e1deec6c 432 //ret = SG_TRIANGLE;
WiredHome 1:dd07e1deec6c 433 break;
WiredHome 1:dd07e1deec6c 434 case 'W':
WiredHome 2:8f71b71fce1b 435 if (mode != SG_SAWTOOTH)
WiredHome 2:8f71b71fce1b 436 SaveSettings(OM_MODE);
WiredHome 2:8f71b71fce1b 437 SetWaveformMode(SG_SAWTOOTH);
WiredHome 2:8f71b71fce1b 438 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 1:dd07e1deec6c 439 //ret = SG_SAWTOOTH;
WiredHome 1:dd07e1deec6c 440 break;
WiredHome 1:dd07e1deec6c 441 case 'U':
WiredHome 2:8f71b71fce1b 442 if (mode != SG_USER)
WiredHome 2:8f71b71fce1b 443 SaveSettings(OM_MODE);
WiredHome 2:8f71b71fce1b 444 SetWaveformMode(SG_USER);
WiredHome 2:8f71b71fce1b 445 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 1:dd07e1deec6c 446 //ret = SG_USER;
WiredHome 1:dd07e1deec6c 447 break;
WiredHome 1:dd07e1deec6c 448 case '0':
WiredHome 1:dd07e1deec6c 449 case '1':
WiredHome 1:dd07e1deec6c 450 case '2':
WiredHome 1:dd07e1deec6c 451 case '3':
WiredHome 1:dd07e1deec6c 452 case '4':
WiredHome 1:dd07e1deec6c 453 case '5':
WiredHome 1:dd07e1deec6c 454 case '6':
WiredHome 1:dd07e1deec6c 455 case '7':
WiredHome 1:dd07e1deec6c 456 case '8':
WiredHome 1:dd07e1deec6c 457 case '9':
WiredHome 1:dd07e1deec6c 458 case '.':
WiredHome 1:dd07e1deec6c 459 case '-':
WiredHome 1:dd07e1deec6c 460 if (EntryMd) {
WiredHome 1:dd07e1deec6c 461 if (textLen<8) {
WiredHome 1:dd07e1deec6c 462 textBuffer[textLen++] = c;
WiredHome 1:dd07e1deec6c 463 textBuffer[textLen] = '\0';
WiredHome 1:dd07e1deec6c 464 updateTextWindow();
WiredHome 1:dd07e1deec6c 465 }
WiredHome 1:dd07e1deec6c 466 }
WiredHome 1:dd07e1deec6c 467 break;
WiredHome 1:dd07e1deec6c 468 case '\x08':
WiredHome 1:dd07e1deec6c 469 if (EntryMd) {
WiredHome 1:dd07e1deec6c 470 if (textLen) {
WiredHome 1:dd07e1deec6c 471 textLen--;
WiredHome 1:dd07e1deec6c 472 textBuffer[textLen] = '\0';
WiredHome 1:dd07e1deec6c 473 updateTextWindow();
WiredHome 1:dd07e1deec6c 474 }
WiredHome 2:8f71b71fce1b 475 if (textLen == 0)
WiredHome 2:8f71b71fce1b 476 clearTextWindow();
WiredHome 1:dd07e1deec6c 477 }
WiredHome 1:dd07e1deec6c 478 break;
WiredHome 1:dd07e1deec6c 479 case '\x1B':
WiredHome 1:dd07e1deec6c 480 textBuffer[0] = '\0';
WiredHome 1:dd07e1deec6c 481 textLen = 0;
WiredHome 1:dd07e1deec6c 482 resetDataEntry();
WiredHome 1:dd07e1deec6c 483 break;
WiredHome 1:dd07e1deec6c 484 case '\r':
WiredHome 1:dd07e1deec6c 485 case '\n':
WiredHome 1:dd07e1deec6c 486 if (EntryMd) {
WiredHome 1:dd07e1deec6c 487 if (strlen(textBuffer)) {
WiredHome 1:dd07e1deec6c 488 switch (EntryMd) {
WiredHome 2:8f71b71fce1b 489 case OM_DUTY:
WiredHome 1:dd07e1deec6c 490 SetDutyCycle(atof(textBuffer));
WiredHome 2:8f71b71fce1b 491 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 2:8f71b71fce1b 492 SaveSettings(OM_DUTY);
WiredHome 1:dd07e1deec6c 493 break;
WiredHome 2:8f71b71fce1b 494 case OM_FREQ:
WiredHome 1:dd07e1deec6c 495 SetFrequency(atof(textBuffer));
WiredHome 2:8f71b71fce1b 496 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 2:8f71b71fce1b 497 SaveSettings(OM_FREQ);
WiredHome 1:dd07e1deec6c 498 break;
WiredHome 2:8f71b71fce1b 499 case OM_PERI:
WiredHome 1:dd07e1deec6c 500 SetPeriod(atof(textBuffer));
WiredHome 2:8f71b71fce1b 501 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 2:8f71b71fce1b 502 SaveSettings(OM_FREQ);
WiredHome 1:dd07e1deec6c 503 break;
WiredHome 2:8f71b71fce1b 504 case OM_VOLT:
WiredHome 1:dd07e1deec6c 505 SetVoltagePeakToPeak(atof(textBuffer));
WiredHome 2:8f71b71fce1b 506 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 2:8f71b71fce1b 507 SaveSettings(OM_VOLT);
WiredHome 1:dd07e1deec6c 508 break;
WiredHome 2:8f71b71fce1b 509 case OM_OFFS:
WiredHome 1:dd07e1deec6c 510 SetVoltageOffset(atof(textBuffer));
WiredHome 2:8f71b71fce1b 511 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 2:8f71b71fce1b 512 SaveSettings(OM_OFFS);
WiredHome 1:dd07e1deec6c 513 break;
WiredHome 1:dd07e1deec6c 514 default:
WiredHome 1:dd07e1deec6c 515 break;
WiredHome 1:dd07e1deec6c 516 }
WiredHome 1:dd07e1deec6c 517 }
WiredHome 2:8f71b71fce1b 518 resetDataEntry(OM_NONE, true);
WiredHome 1:dd07e1deec6c 519 }
WiredHome 1:dd07e1deec6c 520 break;
WiredHome 1:dd07e1deec6c 521 case '>':
WiredHome 1:dd07e1deec6c 522 switch (EntryMd) {
WiredHome 2:8f71b71fce1b 523 case OM_DUTY:
WiredHome 1:dd07e1deec6c 524 SetDutyCycle(dutycycle + 1.0);
WiredHome 2:8f71b71fce1b 525 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 2:8f71b71fce1b 526 SaveSettings(OM_DUTY);
WiredHome 1:dd07e1deec6c 527 break;
WiredHome 2:8f71b71fce1b 528 case OM_FREQ:
WiredHome 1:dd07e1deec6c 529 SetFrequency(frequency + 1.0);
WiredHome 2:8f71b71fce1b 530 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 2:8f71b71fce1b 531 SaveSettings(OM_FREQ);
WiredHome 1:dd07e1deec6c 532 break;
WiredHome 2:8f71b71fce1b 533 case OM_PERI:
WiredHome 2:8f71b71fce1b 534 SetPeriod(1/frequency + 0.000001);
WiredHome 2:8f71b71fce1b 535 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 2:8f71b71fce1b 536 SaveSettings(OM_FREQ);
WiredHome 1:dd07e1deec6c 537 break;
WiredHome 2:8f71b71fce1b 538 case OM_VOLT:
WiredHome 1:dd07e1deec6c 539 SetVoltagePeakToPeak(voltage + 0.1);
WiredHome 2:8f71b71fce1b 540 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 2:8f71b71fce1b 541 SaveSettings(OM_VOLT);
WiredHome 1:dd07e1deec6c 542 break;
WiredHome 2:8f71b71fce1b 543 case OM_OFFS:
WiredHome 2:8f71b71fce1b 544 SetVoltageOffset(offset + 0.1);
WiredHome 2:8f71b71fce1b 545 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 2:8f71b71fce1b 546 SaveSettings(OM_OFFS);
WiredHome 1:dd07e1deec6c 547 break;
WiredHome 1:dd07e1deec6c 548 default:
WiredHome 1:dd07e1deec6c 549 break;
WiredHome 1:dd07e1deec6c 550 }
WiredHome 1:dd07e1deec6c 551 break;
WiredHome 1:dd07e1deec6c 552 case '<':
WiredHome 1:dd07e1deec6c 553 switch (EntryMd) {
WiredHome 2:8f71b71fce1b 554 case OM_DUTY:
WiredHome 1:dd07e1deec6c 555 SetDutyCycle(dutycycle - 1.0);
WiredHome 2:8f71b71fce1b 556 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 2:8f71b71fce1b 557 SaveSettings(OM_DUTY);
WiredHome 1:dd07e1deec6c 558 break;
WiredHome 2:8f71b71fce1b 559 case OM_FREQ:
WiredHome 1:dd07e1deec6c 560 SetFrequency(frequency - 1.0);
WiredHome 2:8f71b71fce1b 561 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 2:8f71b71fce1b 562 SaveSettings(OM_FREQ);
WiredHome 1:dd07e1deec6c 563 break;
WiredHome 2:8f71b71fce1b 564 case OM_PERI:
WiredHome 2:8f71b71fce1b 565 SetPeriod(1/frequency - 0.000001);
WiredHome 2:8f71b71fce1b 566 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 2:8f71b71fce1b 567 SaveSettings(OM_FREQ);
WiredHome 1:dd07e1deec6c 568 break;
WiredHome 2:8f71b71fce1b 569 case OM_VOLT:
WiredHome 1:dd07e1deec6c 570 SetVoltagePeakToPeak(voltage - 0.1);
WiredHome 2:8f71b71fce1b 571 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 2:8f71b71fce1b 572 SaveSettings(OM_VOLT);
WiredHome 1:dd07e1deec6c 573 break;
WiredHome 2:8f71b71fce1b 574 case OM_OFFS:
WiredHome 2:8f71b71fce1b 575 SetVoltageOffset(offset - 0.1);
WiredHome 2:8f71b71fce1b 576 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 2:8f71b71fce1b 577 SaveSettings(OM_OFFS);
WiredHome 1:dd07e1deec6c 578 break;
WiredHome 1:dd07e1deec6c 579 default:
WiredHome 1:dd07e1deec6c 580 break;
WiredHome 1:dd07e1deec6c 581 }
WiredHome 1:dd07e1deec6c 582 break;
WiredHome 1:dd07e1deec6c 583 case 'd':
WiredHome 2:8f71b71fce1b 584 if (EntryMd != OM_DUTY) {
WiredHome 2:8f71b71fce1b 585 SaveSettings(EntryMd);
WiredHome 2:8f71b71fce1b 586 resetDataEntry(OM_DUTY, true);
WiredHome 1:dd07e1deec6c 587 updateDutyCycle();
WiredHome 2:8f71b71fce1b 588 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 1:dd07e1deec6c 589 } else {
WiredHome 2:8f71b71fce1b 590 resetDataEntry(OM_NONE, true);
WiredHome 1:dd07e1deec6c 591 }
WiredHome 1:dd07e1deec6c 592 break;
WiredHome 1:dd07e1deec6c 593 case 'f':
WiredHome 2:8f71b71fce1b 594 if (EntryMd != OM_FREQ) {
WiredHome 2:8f71b71fce1b 595 SaveSettings(EntryMd);
WiredHome 2:8f71b71fce1b 596 resetDataEntry(OM_FREQ, true);
WiredHome 1:dd07e1deec6c 597 updateFrequency();
WiredHome 2:8f71b71fce1b 598 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 1:dd07e1deec6c 599 } else {
WiredHome 2:8f71b71fce1b 600 resetDataEntry(OM_NONE, true);
WiredHome 1:dd07e1deec6c 601 }
WiredHome 1:dd07e1deec6c 602 break;
WiredHome 1:dd07e1deec6c 603 case 'p':
WiredHome 2:8f71b71fce1b 604 if (EntryMd != OM_PERI) {
WiredHome 2:8f71b71fce1b 605 SaveSettings(EntryMd);
WiredHome 2:8f71b71fce1b 606 resetDataEntry(OM_PERI, true);
WiredHome 1:dd07e1deec6c 607 updatePeriod();
WiredHome 2:8f71b71fce1b 608 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 1:dd07e1deec6c 609 } else {
WiredHome 2:8f71b71fce1b 610 resetDataEntry(OM_NONE, true);
WiredHome 1:dd07e1deec6c 611 }
WiredHome 1:dd07e1deec6c 612 break;
WiredHome 1:dd07e1deec6c 613 case 'v':
WiredHome 2:8f71b71fce1b 614 if (EntryMd != OM_VOLT) {
WiredHome 2:8f71b71fce1b 615 SaveSettings(EntryMd);
WiredHome 2:8f71b71fce1b 616 resetDataEntry(OM_VOLT, true);
WiredHome 1:dd07e1deec6c 617 updateVoltage();
WiredHome 2:8f71b71fce1b 618 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 1:dd07e1deec6c 619 } else {
WiredHome 2:8f71b71fce1b 620 resetDataEntry(OM_NONE, true);
WiredHome 1:dd07e1deec6c 621 }
WiredHome 1:dd07e1deec6c 622 break;
WiredHome 1:dd07e1deec6c 623 case 'o':
WiredHome 2:8f71b71fce1b 624 if (EntryMd != OM_OFFS) {
WiredHome 2:8f71b71fce1b 625 SaveSettings(EntryMd);
WiredHome 2:8f71b71fce1b 626 resetDataEntry(OM_OFFS, true);
WiredHome 1:dd07e1deec6c 627 updateOffset();
WiredHome 2:8f71b71fce1b 628 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 1:dd07e1deec6c 629 } else {
WiredHome 2:8f71b71fce1b 630 resetDataEntry(OM_NONE, true);
WiredHome 1:dd07e1deec6c 631 }
WiredHome 1:dd07e1deec6c 632 break;
WiredHome 1:dd07e1deec6c 633 default:
WiredHome 1:dd07e1deec6c 634 break;
WiredHome 1:dd07e1deec6c 635 }
WiredHome 1:dd07e1deec6c 636 return ret;
WiredHome 1:dd07e1deec6c 637 }
WiredHome 1:dd07e1deec6c 638
WiredHome 2:8f71b71fce1b 639 bool SignalGenDisplay::SetWaveformMode(SG_Mode _mode, bool force) {
WiredHome 1:dd07e1deec6c 640 if (/* _mode >= SG_SINE && */ _mode <= SG_USER) {
WiredHome 2:8f71b71fce1b 641 mode = _mode;
WiredHome 2:8f71b71fce1b 642 DrawModeButtons();
WiredHome 1:dd07e1deec6c 643 return true;
WiredHome 1:dd07e1deec6c 644 } else {
WiredHome 1:dd07e1deec6c 645 return false;
WiredHome 1:dd07e1deec6c 646 }
WiredHome 1:dd07e1deec6c 647 }
WiredHome 1:dd07e1deec6c 648
WiredHome 1:dd07e1deec6c 649 bool SignalGenDisplay::SetDutyCycle(float _dutyCycle) {
WiredHome 1:dd07e1deec6c 650 if (_dutyCycle >= 5 && _dutyCycle <= 95) {
WiredHome 1:dd07e1deec6c 651 dutycycle = _dutyCycle;
WiredHome 1:dd07e1deec6c 652 updateDutyCycle();
WiredHome 1:dd07e1deec6c 653 UpdateScope();
WiredHome 1:dd07e1deec6c 654 return true;
WiredHome 1:dd07e1deec6c 655 } else {
WiredHome 1:dd07e1deec6c 656 return false;
WiredHome 1:dd07e1deec6c 657 }
WiredHome 1:dd07e1deec6c 658 }
WiredHome 1:dd07e1deec6c 659
WiredHome 1:dd07e1deec6c 660 bool SignalGenDisplay::SetFrequency(float _frequency) {
WiredHome 1:dd07e1deec6c 661 if (_frequency >= 1.0 && _frequency <= 1.0E6) {
WiredHome 1:dd07e1deec6c 662 frequency = _frequency;
WiredHome 1:dd07e1deec6c 663 updateFrequency();
WiredHome 1:dd07e1deec6c 664 updatePeriod();
WiredHome 1:dd07e1deec6c 665 UpdateScope();
WiredHome 1:dd07e1deec6c 666 return true;
WiredHome 1:dd07e1deec6c 667 } else {
WiredHome 1:dd07e1deec6c 668 return false;
WiredHome 1:dd07e1deec6c 669 }
WiredHome 1:dd07e1deec6c 670 }
WiredHome 1:dd07e1deec6c 671
WiredHome 1:dd07e1deec6c 672 bool SignalGenDisplay::SetPeriod(float _period) {
WiredHome 1:dd07e1deec6c 673 if (_period >= 1.0E-6 && _period <= 1.0) {
WiredHome 1:dd07e1deec6c 674 frequency = 1/_period;
WiredHome 1:dd07e1deec6c 675 updatePeriod();
WiredHome 1:dd07e1deec6c 676 updateFrequency();
WiredHome 1:dd07e1deec6c 677 UpdateScope();
WiredHome 1:dd07e1deec6c 678 return true;
WiredHome 1:dd07e1deec6c 679 } else {
WiredHome 1:dd07e1deec6c 680 return false;
WiredHome 1:dd07e1deec6c 681 }
WiredHome 1:dd07e1deec6c 682 }
WiredHome 1:dd07e1deec6c 683
WiredHome 1:dd07e1deec6c 684 bool SignalGenDisplay::SetVoltagePeakToPeak(float _voltage) {
WiredHome 1:dd07e1deec6c 685 if (_voltage >= 0.0 && _voltage <= 3.3) {
WiredHome 1:dd07e1deec6c 686 voltage = _voltage;
WiredHome 1:dd07e1deec6c 687 updateVoltage();
WiredHome 1:dd07e1deec6c 688 UpdateScope();
WiredHome 1:dd07e1deec6c 689 return true;
WiredHome 1:dd07e1deec6c 690 } else {
WiredHome 1:dd07e1deec6c 691 return false;
WiredHome 1:dd07e1deec6c 692 }
WiredHome 1:dd07e1deec6c 693 }
WiredHome 1:dd07e1deec6c 694
WiredHome 1:dd07e1deec6c 695 bool SignalGenDisplay::SetVoltageOffset(float _voltage) {
WiredHome 1:dd07e1deec6c 696 if (_voltage >= -1.65 && _voltage <= 1.65) {
WiredHome 1:dd07e1deec6c 697 if (abs(_voltage) < 0.008) // if binary precision slips it, fix it
WiredHome 1:dd07e1deec6c 698 _voltage = 0.0;
WiredHome 1:dd07e1deec6c 699 offset = _voltage;
WiredHome 1:dd07e1deec6c 700 updateOffset();
WiredHome 1:dd07e1deec6c 701 UpdateScope();
WiredHome 1:dd07e1deec6c 702 return true;
WiredHome 1:dd07e1deec6c 703 } else {
WiredHome 1:dd07e1deec6c 704 return false;
WiredHome 1:dd07e1deec6c 705 }
WiredHome 1:dd07e1deec6c 706 }
WiredHome 1:dd07e1deec6c 707
WiredHome 1:dd07e1deec6c 708 // ######################## Private Methods past here #######################
WiredHome 1:dd07e1deec6c 709
WiredHome 1:dd07e1deec6c 710 void SignalGenDisplay::UpdateScope(void) {
WiredHome 1:dd07e1deec6c 711 ClearScope();
WiredHome 2:8f71b71fce1b 712 rect_t r = UI_WAVE_RECT;
WiredHome 1:dd07e1deec6c 713
WiredHome 2:8f71b71fce1b 714 float vPeakPos, vPeakNeg;
WiredHome 2:8f71b71fce1b 715 dim_t waveHeight = (UI_WAVE_RECT.p2.y - UI_WAVE_RECT.p1.y);
WiredHome 2:8f71b71fce1b 716 vPeakPos = rangelimit(offset + voltage/2, SG_MIN_V, SG_MAX_V);
WiredHome 2:8f71b71fce1b 717 vPeakNeg = rangelimit(offset - voltage/2, SG_MIN_V, SG_MAX_V);
WiredHome 2:8f71b71fce1b 718 loc_t markerPos_y = UI_WAVE_RECT.p2.y - vPeakPos/(SG_MAX_V-SG_MIN_V) * waveHeight;
WiredHome 2:8f71b71fce1b 719 loc_t markerNeg_y = UI_WAVE_RECT.p2.y - vPeakNeg/(SG_MAX_V-SG_MIN_V) * waveHeight;
WiredHome 2:8f71b71fce1b 720 loc_t df = rangelimit(offset, SG_MIN_V, SG_MAX_V) / SG_MAX_V * (r.p2.y - r.p1.y);
WiredHome 2:8f71b71fce1b 721 loc_t y;
WiredHome 2:8f71b71fce1b 722
WiredHome 2:8f71b71fce1b 723 // Draw the Waveform rectangle
WiredHome 2:8f71b71fce1b 724 lcd->rect(UI_WAVE_RECT, WaveOutlineColor);
WiredHome 1:dd07e1deec6c 725
WiredHome 1:dd07e1deec6c 726 // Draw the Peak to Peak markers
WiredHome 2:8f71b71fce1b 727 lcd->line(UI_WAVE_RECT.p1.x-3,markerPos_y, UI_WAVE_RECT.p2.x+3*SC_RIGHT_MARGIN/4,markerPos_y, UI_VP2PColor);
WiredHome 2:8f71b71fce1b 728 lcd->line(UI_WAVE_RECT.p1.x-3,markerNeg_y, UI_WAVE_RECT.p2.x+3*SC_RIGHT_MARGIN/4,markerNeg_y, UI_VP2PColor);
WiredHome 2:8f71b71fce1b 729 lcd->line(r.p2.x+3*SC_RIGHT_MARGIN/4-3,markerPos_y, r.p2.x+3*SC_RIGHT_MARGIN/4-3,markerNeg_y, UI_VP2PColor); // vert
WiredHome 2:8f71b71fce1b 730 lcd->filltriangle( // top arrowhead
WiredHome 2:8f71b71fce1b 731 r.p2.x+3*SC_RIGHT_MARGIN/4-3, markerPos_y,
WiredHome 2:8f71b71fce1b 732 r.p2.x+3*SC_RIGHT_MARGIN/4-3+2,markerPos_y+3,
WiredHome 2:8f71b71fce1b 733 r.p2.x+3*SC_RIGHT_MARGIN/4-3-2,markerPos_y+3,
WiredHome 1:dd07e1deec6c 734 UI_VP2PColor);
WiredHome 2:8f71b71fce1b 735 lcd->filltriangle( // bottom arrowhead
WiredHome 2:8f71b71fce1b 736 r.p2.x+3*SC_RIGHT_MARGIN/4-3, markerNeg_y,
WiredHome 2:8f71b71fce1b 737 r.p2.x+3*SC_RIGHT_MARGIN/4-3+2,markerNeg_y-3,
WiredHome 2:8f71b71fce1b 738 r.p2.x+3*SC_RIGHT_MARGIN/4-3-2,markerNeg_y-3,
WiredHome 1:dd07e1deec6c 739 UI_VP2PColor);
WiredHome 1:dd07e1deec6c 740
WiredHome 1:dd07e1deec6c 741 // Draw the offset voltage markers
WiredHome 2:8f71b71fce1b 742 y = r.p2.y - df;
WiredHome 1:dd07e1deec6c 743 dim_t w = (r.p2.x + SC_RIGHT_MARGIN/3 - r.p1.x) / 35;
WiredHome 2:8f71b71fce1b 744 for (int i=0; i<=35+1; i++) { // dashed line
WiredHome 1:dd07e1deec6c 745 if ((i & 1) == 0) {
WiredHome 1:dd07e1deec6c 746 lcd->line(r.p1.x + i * w,y, r.p1.x + (i+1) * w, y, UI_VOffsetColor);
WiredHome 1:dd07e1deec6c 747 }
WiredHome 1:dd07e1deec6c 748 }
WiredHome 1:dd07e1deec6c 749 switch (sgn(offset)) {
WiredHome 1:dd07e1deec6c 750 default:
WiredHome 1:dd07e1deec6c 751 case 0:
WiredHome 1:dd07e1deec6c 752 break;
WiredHome 1:dd07e1deec6c 753 case -1:
WiredHome 1:dd07e1deec6c 754 case 1:
WiredHome 2:8f71b71fce1b 755 lcd->line(r.p2.x+SC_RIGHT_MARGIN/3-3,r.p2.y, r.p2.x+SC_RIGHT_MARGIN/3-3,y, UI_VOffsetColor); // vert
WiredHome 1:dd07e1deec6c 756 lcd->filltriangle(
WiredHome 1:dd07e1deec6c 757 r.p2.x+SC_RIGHT_MARGIN/3-3,y,
WiredHome 1:dd07e1deec6c 758 r.p2.x+SC_RIGHT_MARGIN/3-3+2,y+sgn(offset)*3,
WiredHome 1:dd07e1deec6c 759 r.p2.x+SC_RIGHT_MARGIN/3-3-2,y+sgn(offset)*3,
WiredHome 1:dd07e1deec6c 760 UI_VOffsetColor);
WiredHome 2:8f71b71fce1b 761 lcd->line(r.p2.x,r.p2.y, r.p2.x+SC_RIGHT_MARGIN/3,r.p2.y, UI_VOffsetColor); // horz
WiredHome 1:dd07e1deec6c 762 break;
WiredHome 1:dd07e1deec6c 763 }
WiredHome 1:dd07e1deec6c 764
WiredHome 1:dd07e1deec6c 765 // Draw the Frequency marker
WiredHome 1:dd07e1deec6c 766 w = r.p2.x - r.p1.x;
WiredHome 1:dd07e1deec6c 767 dim_t dc = dutycycle/100.0 * 1*w/2;
WiredHome 2:8f71b71fce1b 768 lcd->line(r.p1.x,r.p1.y-3, r.p1.x,r.p2.y+3*SC_BOT_MARGIN/4, UI_FreqColor);
WiredHome 2:8f71b71fce1b 769 lcd->line(r.p1.x+1*w/2,r.p1.y-3, r.p1.x+1*w/2,r.p2.y+3*SC_BOT_MARGIN/4, UI_FreqColor);
WiredHome 1:dd07e1deec6c 770 lcd->line(r.p1.x,r.p2.y+3*SC_BOT_MARGIN/4-3, r.p1.x+1*w/2,r.p2.y+3*SC_BOT_MARGIN/4-3, UI_FreqColor);
WiredHome 1:dd07e1deec6c 771 lcd->filltriangle(
WiredHome 1:dd07e1deec6c 772 r.p1.x+0,r.p2.y+3*SC_BOT_MARGIN/4-3,
WiredHome 1:dd07e1deec6c 773 r.p1.x+3,r.p2.y+3*SC_BOT_MARGIN/4-3-2,
WiredHome 1:dd07e1deec6c 774 r.p1.x+3,r.p2.y+3*SC_BOT_MARGIN/4-3+2,
WiredHome 1:dd07e1deec6c 775 UI_FreqColor);
WiredHome 1:dd07e1deec6c 776 lcd->filltriangle(
WiredHome 1:dd07e1deec6c 777 r.p1.x+1*w/2-0,r.p2.y+3*SC_BOT_MARGIN/4-3,
WiredHome 1:dd07e1deec6c 778 r.p1.x+1*w/2-3,r.p2.y+3*SC_BOT_MARGIN/4-3-2,
WiredHome 1:dd07e1deec6c 779 r.p1.x+1*w/2-3,r.p2.y+3*SC_BOT_MARGIN/4-3+2,
WiredHome 1:dd07e1deec6c 780 UI_FreqColor);
WiredHome 1:dd07e1deec6c 781
WiredHome 1:dd07e1deec6c 782 // Draw the Duty Cycle markers
WiredHome 2:8f71b71fce1b 783 lcd->line(r.p1.x,r.p1.y-3, r.p1.x,r.p2.y+2*SC_BOT_MARGIN/4, UI_DutyColor);
WiredHome 2:8f71b71fce1b 784 lcd->line(r.p1.x + dc,r.p1.y-3, r.p1.x + dc,r.p2.y+2*SC_BOT_MARGIN/4, UI_DutyColor);
WiredHome 1:dd07e1deec6c 785 point_t p;
WiredHome 1:dd07e1deec6c 786 p.x = r.p1.x;
WiredHome 1:dd07e1deec6c 787 p.y = r.p2.y+2*SC_BOT_MARGIN/4-3;
WiredHome 1:dd07e1deec6c 788 lcd->line(p.x,p.y, p.x+dc,p.y, UI_DutyColor);
WiredHome 1:dd07e1deec6c 789 lcd->filltriangle(
WiredHome 1:dd07e1deec6c 790 p.x,p.y,
WiredHome 1:dd07e1deec6c 791 p.x+3,p.y-2,
WiredHome 1:dd07e1deec6c 792 p.x+3,p.y+2,
WiredHome 1:dd07e1deec6c 793 UI_DutyColor);
WiredHome 1:dd07e1deec6c 794 p.x = r.p1.x + dc;
WiredHome 1:dd07e1deec6c 795 lcd->filltriangle(
WiredHome 1:dd07e1deec6c 796 p.x,p.y,
WiredHome 1:dd07e1deec6c 797 p.x-3,p.y-2,
WiredHome 1:dd07e1deec6c 798 p.x-3,p.y+2,
WiredHome 1:dd07e1deec6c 799 UI_DutyColor);
WiredHome 1:dd07e1deec6c 800 DrawWaveform(r, mode, White);
WiredHome 1:dd07e1deec6c 801 }
WiredHome 1:dd07e1deec6c 802
WiredHome 2:8f71b71fce1b 803
WiredHome 1:dd07e1deec6c 804 // ++ +----+ + +
WiredHome 1:dd07e1deec6c 805 // . . | | / \ /|
WiredHome 1:dd07e1deec6c 806 // . . | | | / \ / / |
WiredHome 1:dd07e1deec6c 807 // . | | \ / / |
WiredHome 1:dd07e1deec6c 808 // ++ +----+ + + +
WiredHome 1:dd07e1deec6c 809 //
WiredHome 2:8f71b71fce1b 810 void SignalGenDisplay::DrawWaveform(rect_t r, SG_Mode mode, color_t color, bool drawPure) {
WiredHome 1:dd07e1deec6c 811 loc_t x,y;
WiredHome 1:dd07e1deec6c 812 loc_t y0 = (r.p1.y + r.p2.y)/2;
WiredHome 1:dd07e1deec6c 813 dim_t w = r.p2.x - r.p1.x;
WiredHome 2:8f71b71fce1b 814 dim_t h = r.p2.y - r.p1.y;
WiredHome 2:8f71b71fce1b 815 dim_t privDutyCycleX;
WiredHome 1:dd07e1deec6c 816 dim_t a = (r.p2.y - r.p1.y)/2;
WiredHome 2:8f71b71fce1b 817 float privVoltage = voltage;
WiredHome 2:8f71b71fce1b 818 float privOffset = offset;
WiredHome 2:8f71b71fce1b 819 float privDutyCycle = dutycycle;
WiredHome 2:8f71b71fce1b 820 float vRange = SG_MAX_V - SG_MIN_V;
WiredHome 1:dd07e1deec6c 821 float v;
WiredHome 2:8f71b71fce1b 822
WiredHome 2:8f71b71fce1b 823 if (drawPure) {
WiredHome 2:8f71b71fce1b 824 privVoltage = vRange;
WiredHome 2:8f71b71fce1b 825 privOffset = vRange/2;
WiredHome 2:8f71b71fce1b 826 privDutyCycle = 50;
WiredHome 2:8f71b71fce1b 827 }
WiredHome 2:8f71b71fce1b 828 privDutyCycleX = privDutyCycle/100.0 * 1*w/2;
WiredHome 1:dd07e1deec6c 829 switch (mode) {
WiredHome 1:dd07e1deec6c 830 case SG_SINE:
WiredHome 1:dd07e1deec6c 831 for (int cycle=0; cycle<2; cycle++) {
WiredHome 2:8f71b71fce1b 832 for (x=0; x<=privDutyCycleX; x++) {
WiredHome 2:8f71b71fce1b 833 v = privOffset + privVoltage/2 * sin(x * 1 * PI / privDutyCycleX);
WiredHome 1:dd07e1deec6c 834 v = rangelimit(v, SG_MIN_V, SG_MAX_V);
WiredHome 2:8f71b71fce1b 835 y = r.p2.y - 2 * a * v / vRange;
WiredHome 1:dd07e1deec6c 836 lcd->pixel(r.p1.x + cycle * w/2 + x, y, color);
WiredHome 1:dd07e1deec6c 837 }
WiredHome 2:8f71b71fce1b 838 for (x=0; x<=(w/2-privDutyCycleX); x++) {
WiredHome 2:8f71b71fce1b 839 v = privOffset - privVoltage/2 * sin(x * 1 * PI / (w/2-privDutyCycleX));
WiredHome 1:dd07e1deec6c 840 v = rangelimit(v, SG_MIN_V, SG_MAX_V);
WiredHome 2:8f71b71fce1b 841 y = r.p2.y - 2 * a * v / vRange;
WiredHome 2:8f71b71fce1b 842 lcd->pixel(r.p1.x + cycle * w/2 + privDutyCycleX + x, y, color);
WiredHome 1:dd07e1deec6c 843 }
WiredHome 1:dd07e1deec6c 844 }
WiredHome 1:dd07e1deec6c 845 break;
WiredHome 1:dd07e1deec6c 846 case SG_SQUARE:
WiredHome 1:dd07e1deec6c 847 for (int cycle=0; cycle<2; cycle++) {
WiredHome 2:8f71b71fce1b 848 loc_t mid = r.p2.y - rangelimit(privOffset, SG_MIN_V, SG_MAX_V) / vRange * h;
WiredHome 2:8f71b71fce1b 849 loc_t upp = r.p2.y - rangelimit(privOffset + privVoltage/2, SG_MIN_V, SG_MAX_V) / vRange * h;
WiredHome 2:8f71b71fce1b 850 loc_t low = r.p2.y - rangelimit(privOffset - privVoltage/2, SG_MIN_V, SG_MAX_V) / vRange * h;
WiredHome 2:8f71b71fce1b 851 lcd->line(r.p1.x+cycle*w/2+0*w/8, mid, r.p1.x+cycle*w/2+0*w/8, upp, color); // rise
WiredHome 2:8f71b71fce1b 852 lcd->line(r.p1.x+cycle*w/2+0*w/8, upp, r.p1.x+cycle*w/2+privDutyCycleX, upp, color); // horz
WiredHome 2:8f71b71fce1b 853 lcd->line(r.p1.x+cycle*w/2+privDutyCycleX, upp, r.p1.x+cycle*w/2+privDutyCycleX, low, color); // fall
WiredHome 2:8f71b71fce1b 854 lcd->line(r.p1.x+cycle*w/2+privDutyCycleX, low, r.p1.x+cycle*w/2+4*w/8, low, color); // horz
WiredHome 2:8f71b71fce1b 855 lcd->line(r.p1.x+cycle*w/2+4*w/8, low, r.p1.x+cycle*w/2+4*w/8, mid, color); // rise
WiredHome 1:dd07e1deec6c 856 }
WiredHome 1:dd07e1deec6c 857 break;
WiredHome 1:dd07e1deec6c 858 case SG_TRIANGLE:
WiredHome 1:dd07e1deec6c 859 for (int cycle=0; cycle<2; cycle++) {
WiredHome 2:8f71b71fce1b 860 loc_t mid = r.p2.y - rangelimit(privOffset, SG_MIN_V, SG_MAX_V) / vRange * h;
WiredHome 2:8f71b71fce1b 861 loc_t upp = r.p2.y - rangelimit(privOffset + privVoltage/2, SG_MIN_V, SG_MAX_V) / vRange * h;
WiredHome 2:8f71b71fce1b 862 loc_t low = r.p2.y - rangelimit(privOffset - privVoltage/2, SG_MIN_V, SG_MAX_V) / vRange * h;
WiredHome 2:8f71b71fce1b 863 lcd->line(r.p1.x+cycle*w/2+0*w/8, mid, r.p1.x+cycle*w/2+privDutyCycleX/2, upp, color); // rise 2
WiredHome 2:8f71b71fce1b 864 lcd->line(r.p1.x+cycle*w/2+privDutyCycleX/2, upp, r.p1.x+cycle*w/2+privDutyCycleX/1, mid, color); // fall 1
WiredHome 2:8f71b71fce1b 865 lcd->line(r.p1.x+cycle*w/2+privDutyCycleX/1, mid, r.p1.x+cycle*w/2+(w/2+privDutyCycleX)/2, low, color); // fall 2
WiredHome 2:8f71b71fce1b 866 lcd->line(r.p1.x+cycle*w/2+(w/2+privDutyCycleX)/2, low, r.p1.x+cycle*w/2+4*w/8, mid, color); // rise 1
WiredHome 1:dd07e1deec6c 867 }
WiredHome 1:dd07e1deec6c 868 break;
WiredHome 1:dd07e1deec6c 869 case SG_SAWTOOTH:
WiredHome 1:dd07e1deec6c 870 for (int cycle=0; cycle<2; cycle++) {
WiredHome 2:8f71b71fce1b 871 loc_t mid = r.p2.y - rangelimit(privOffset, SG_MIN_V, SG_MAX_V) / vRange * h;
WiredHome 2:8f71b71fce1b 872 loc_t upp = r.p2.y - rangelimit(privOffset + privVoltage/2, SG_MIN_V, SG_MAX_V) / vRange * h;
WiredHome 2:8f71b71fce1b 873 loc_t low = r.p2.y - rangelimit(privOffset - privVoltage/2, SG_MIN_V, SG_MAX_V) / vRange * h;
WiredHome 2:8f71b71fce1b 874 lcd->line(r.p1.x+cycle*w/2+0*w/8+0, low, r.p1.x+cycle*w/2+privDutyCycleX, mid, color);
WiredHome 2:8f71b71fce1b 875 lcd->line(r.p1.x+cycle*w/2+privDutyCycleX, mid, r.p1.x+cycle*w/2+4*w/8-1, upp, color);
WiredHome 2:8f71b71fce1b 876 lcd->line(r.p1.x+cycle*w/2+4*w/8-1, upp, r.p1.x+cycle*w/2+4*w/8, low, color);
WiredHome 1:dd07e1deec6c 877 }
WiredHome 1:dd07e1deec6c 878 break;
WiredHome 1:dd07e1deec6c 879 case SG_USER:
WiredHome 1:dd07e1deec6c 880 lcd->line(r.p1.x, y0-1, r.p1.x+w, y0-1, color);
WiredHome 1:dd07e1deec6c 881 lcd->line(r.p1.x, y0-0, r.p1.x+w, y0-0, color);
WiredHome 1:dd07e1deec6c 882 lcd->line(r.p1.x, y0+1, r.p1.x+w, y0+1, color);
WiredHome 1:dd07e1deec6c 883 lcd->rect(r.p1.x+5*w/8, y0-a/4, r.p1.x+7*w/8, y0+a/4, color);
WiredHome 1:dd07e1deec6c 884 break;
WiredHome 1:dd07e1deec6c 885 }
WiredHome 1:dd07e1deec6c 886 }
WiredHome 1:dd07e1deec6c 887
WiredHome 1:dd07e1deec6c 888 void SignalGenDisplay::ClearScope(void) {
WiredHome 1:dd07e1deec6c 889 // Scope area
WiredHome 1:dd07e1deec6c 890 rect_t r = UI_SCOPE_RECT;
WiredHome 1:dd07e1deec6c 891 lcd->fillrect(r, UI_ScopeBackColor);
WiredHome 1:dd07e1deec6c 892 lcd->rect(r, UI_ScopeFrameColor);
WiredHome 1:dd07e1deec6c 893 }
WiredHome 1:dd07e1deec6c 894
WiredHome 1:dd07e1deec6c 895 void SignalGenDisplay::updateDutyCycle(void) {
WiredHome 1:dd07e1deec6c 896 rect_t r = Parameters[0]; // UI_DUTY_CYCLE_RECT;
WiredHome 1:dd07e1deec6c 897 color_t fcolor, bcolor;
WiredHome 1:dd07e1deec6c 898
WiredHome 2:8f71b71fce1b 899 if (EntryMd != OM_DUTY) {
WiredHome 1:dd07e1deec6c 900 fcolor = UI_DutyColor;
WiredHome 1:dd07e1deec6c 901 bcolor = UI_ScopeBackColor;
WiredHome 1:dd07e1deec6c 902 } else {
WiredHome 1:dd07e1deec6c 903 fcolor = UI_ScopeBackColor;
WiredHome 1:dd07e1deec6c 904 bcolor = UI_DutyColor;
WiredHome 1:dd07e1deec6c 905 }
WiredHome 1:dd07e1deec6c 906 lcd->fillrect(r, bcolor);
WiredHome 1:dd07e1deec6c 907 lcd->foreground(fcolor);
WiredHome 1:dd07e1deec6c 908 lcd->background(bcolor);
WiredHome 1:dd07e1deec6c 909 lcd->SetTextCursor(r.p1.x+1, r.p1.y+1);
WiredHome 1:dd07e1deec6c 910 lcd->printf("%3.0f %%", dutycycle);
WiredHome 1:dd07e1deec6c 911 }
WiredHome 1:dd07e1deec6c 912
WiredHome 1:dd07e1deec6c 913 void SignalGenDisplay::updateFrequency(void) {
WiredHome 1:dd07e1deec6c 914 rect_t r = Parameters[1]; // UI_FREQ_RECT;
WiredHome 1:dd07e1deec6c 915 color_t fcolor, bcolor;
WiredHome 1:dd07e1deec6c 916
WiredHome 2:8f71b71fce1b 917 if (EntryMd != OM_FREQ) {
WiredHome 1:dd07e1deec6c 918 fcolor = UI_FreqColor;
WiredHome 1:dd07e1deec6c 919 bcolor = UI_ScopeBackColor;
WiredHome 1:dd07e1deec6c 920 } else {
WiredHome 1:dd07e1deec6c 921 fcolor = UI_ScopeBackColor;
WiredHome 1:dd07e1deec6c 922 bcolor = UI_FreqColor;
WiredHome 1:dd07e1deec6c 923 }
WiredHome 1:dd07e1deec6c 924 lcd->fillrect(r, bcolor);
WiredHome 1:dd07e1deec6c 925 lcd->foreground(fcolor);
WiredHome 1:dd07e1deec6c 926 lcd->background(bcolor);
WiredHome 1:dd07e1deec6c 927 lcd->SetTextCursor(r.p1.x+1, r.p1.y+1);
WiredHome 1:dd07e1deec6c 928 if (frequency >= 1000.0)
WiredHome 1:dd07e1deec6c 929 lcd->printf("%8.3f kHz", frequency/1000);
WiredHome 1:dd07e1deec6c 930 else
WiredHome 1:dd07e1deec6c 931 lcd->printf("%8.3f Hz ", frequency);
WiredHome 1:dd07e1deec6c 932 }
WiredHome 1:dd07e1deec6c 933
WiredHome 1:dd07e1deec6c 934 void SignalGenDisplay::updatePeriod(void) {
WiredHome 1:dd07e1deec6c 935 float period = 1/frequency;
WiredHome 1:dd07e1deec6c 936 rect_t r = Parameters[2]; // UI_PERIOD_RECT;
WiredHome 1:dd07e1deec6c 937 color_t fcolor, bcolor;
WiredHome 1:dd07e1deec6c 938
WiredHome 2:8f71b71fce1b 939 if (EntryMd != OM_PERI) {
WiredHome 1:dd07e1deec6c 940 fcolor = UI_FreqColor;
WiredHome 1:dd07e1deec6c 941 bcolor = UI_ScopeBackColor;
WiredHome 1:dd07e1deec6c 942 } else {
WiredHome 1:dd07e1deec6c 943 fcolor = UI_ScopeBackColor;
WiredHome 1:dd07e1deec6c 944 bcolor = UI_FreqColor;
WiredHome 1:dd07e1deec6c 945 }
WiredHome 1:dd07e1deec6c 946 lcd->fillrect(r, bcolor);
WiredHome 1:dd07e1deec6c 947 lcd->foreground(fcolor);
WiredHome 1:dd07e1deec6c 948 lcd->background(bcolor);
WiredHome 1:dd07e1deec6c 949 lcd->SetTextCursor(r.p1.x+1, r.p1.y+1);
WiredHome 1:dd07e1deec6c 950 if (period < 0.001)
WiredHome 1:dd07e1deec6c 951 lcd->printf("%8.3f uS", period * 1000000);
WiredHome 1:dd07e1deec6c 952 else
WiredHome 1:dd07e1deec6c 953 lcd->printf("%8.3f mS", period * 1000);
WiredHome 1:dd07e1deec6c 954 }
WiredHome 1:dd07e1deec6c 955
WiredHome 1:dd07e1deec6c 956 void SignalGenDisplay::updateVoltage(void) {
WiredHome 1:dd07e1deec6c 957 rect_t r = Parameters[3]; // UI_VP2P_RECT;
WiredHome 1:dd07e1deec6c 958 color_t fcolor, bcolor;
WiredHome 1:dd07e1deec6c 959
WiredHome 2:8f71b71fce1b 960 if (EntryMd != OM_VOLT) {
WiredHome 1:dd07e1deec6c 961 fcolor = UI_VP2PColor;
WiredHome 1:dd07e1deec6c 962 bcolor = UI_ScopeBackColor;
WiredHome 1:dd07e1deec6c 963 } else {
WiredHome 1:dd07e1deec6c 964 fcolor = UI_ScopeBackColor;
WiredHome 1:dd07e1deec6c 965 bcolor = UI_VP2PColor;
WiredHome 1:dd07e1deec6c 966 }
WiredHome 1:dd07e1deec6c 967 lcd->fillrect(r, bcolor);
WiredHome 1:dd07e1deec6c 968 lcd->foreground(fcolor);
WiredHome 1:dd07e1deec6c 969 lcd->background(bcolor);
WiredHome 1:dd07e1deec6c 970 lcd->SetTextCursor(r.p1.x+1, r.p1.y+1);
WiredHome 1:dd07e1deec6c 971 lcd->printf("%5.1f v", voltage);
WiredHome 1:dd07e1deec6c 972 }
WiredHome 1:dd07e1deec6c 973
WiredHome 1:dd07e1deec6c 974 void SignalGenDisplay::updateOffset(void) {
WiredHome 1:dd07e1deec6c 975 rect_t r = Parameters[4]; // UI_VOFFSET_RECT;
WiredHome 1:dd07e1deec6c 976 color_t fcolor, bcolor;
WiredHome 1:dd07e1deec6c 977
WiredHome 2:8f71b71fce1b 978 if (EntryMd != OM_OFFS) {
WiredHome 1:dd07e1deec6c 979 fcolor = UI_VOffsetColor;
WiredHome 1:dd07e1deec6c 980 bcolor = UI_ScopeBackColor;
WiredHome 1:dd07e1deec6c 981 } else {
WiredHome 1:dd07e1deec6c 982 fcolor = UI_ScopeBackColor;
WiredHome 1:dd07e1deec6c 983 bcolor = UI_VOffsetColor;
WiredHome 1:dd07e1deec6c 984 }
WiredHome 1:dd07e1deec6c 985 lcd->fillrect(r, bcolor);
WiredHome 1:dd07e1deec6c 986 lcd->foreground(fcolor);
WiredHome 1:dd07e1deec6c 987 lcd->background(bcolor);
WiredHome 1:dd07e1deec6c 988 lcd->SetTextCursor(r.p1.x+1, r.p1.y+1);
WiredHome 1:dd07e1deec6c 989 lcd->printf("%+4.2f v", offset);
WiredHome 1:dd07e1deec6c 990 }
WiredHome 1:dd07e1deec6c 991
WiredHome 1:dd07e1deec6c 992 void SignalGenDisplay::DrawKeypadEnabled(bool enable) {
WiredHome 1:dd07e1deec6c 993 for (int i=0; i<KeypadCount; i++) {
WiredHome 1:dd07e1deec6c 994 DrawButton(UI_Keypad[i], false, SG_KEYPAD, enable, i);
WiredHome 1:dd07e1deec6c 995 }
WiredHome 1:dd07e1deec6c 996 }
WiredHome 1:dd07e1deec6c 997
WiredHome 1:dd07e1deec6c 998 void SignalGenDisplay::DrawButton(rect_t r, bool pressed, SG_Mode mode, bool enable, int label) {
WiredHome 1:dd07e1deec6c 999 rect_t wave;
WiredHome 1:dd07e1deec6c 1000 color_t buttonface = UI_BUTTON_FACE_DISABLED;
WiredHome 1:dd07e1deec6c 1001 color_t buttonshadow = UI_BUTTON_SHADOW_DISABLED;
WiredHome 1:dd07e1deec6c 1002
WiredHome 1:dd07e1deec6c 1003 //lcd->fillrect(r, UI_ScopeBackColor);
WiredHome 1:dd07e1deec6c 1004 if (pressed) {
WiredHome 1:dd07e1deec6c 1005 if (enable) {
WiredHome 1:dd07e1deec6c 1006 buttonface = UI_BUTTON_FACE_DN;
WiredHome 1:dd07e1deec6c 1007 buttonshadow = UI_BUTTON_SHADOW;
WiredHome 1:dd07e1deec6c 1008 }
WiredHome 1:dd07e1deec6c 1009 lcd->fillrect(r, buttonface);
WiredHome 1:dd07e1deec6c 1010 lcd->line(r.p1.x+0,r.p1.y+0, r.p2.x+0,r.p1.y+0, buttonshadow); // top border
WiredHome 1:dd07e1deec6c 1011 lcd->line(r.p1.x+1,r.p1.y+1, r.p2.x+0,r.p1.y+1, buttonshadow); // top border
WiredHome 1:dd07e1deec6c 1012 lcd->line(r.p1.x+2,r.p1.y+2, r.p2.x+0,r.p1.y+2, buttonshadow); // top border
WiredHome 1:dd07e1deec6c 1013 lcd->line(r.p1.x+0,r.p1.y+0, r.p1.x+0,r.p2.y+0, buttonshadow); // left border
WiredHome 1:dd07e1deec6c 1014 lcd->line(r.p1.x+1,r.p1.y+1, r.p1.x+1,r.p2.y+0, buttonshadow); // left border
WiredHome 1:dd07e1deec6c 1015 lcd->line(r.p1.x+2,r.p1.y+2, r.p1.x+2,r.p2.y+0, buttonshadow); // left border
WiredHome 1:dd07e1deec6c 1016 wave.p1.x = r.p1.x+5 + 2; wave.p1.y = r.p1.y + 5 + 2;
WiredHome 1:dd07e1deec6c 1017 wave.p2.x = r.p2.x-5 + 2; wave.p2.y = r.p2.y - 5 + 2;
WiredHome 1:dd07e1deec6c 1018 } else {
WiredHome 1:dd07e1deec6c 1019 if (enable) {
WiredHome 1:dd07e1deec6c 1020 buttonface = UI_BUTTON_FACE_UP;
WiredHome 1:dd07e1deec6c 1021 buttonshadow = UI_BUTTON_SHADOW;
WiredHome 1:dd07e1deec6c 1022 }
WiredHome 1:dd07e1deec6c 1023 lcd->fillrect(r, buttonface);
WiredHome 1:dd07e1deec6c 1024 lcd->line(r.p1.x+0,r.p2.y-0, r.p2.x-0,r.p2.y-0, buttonshadow); // bottom border
WiredHome 1:dd07e1deec6c 1025 lcd->line(r.p1.x+0,r.p2.y-1, r.p2.x-1,r.p2.y-1, buttonshadow); // bottom border
WiredHome 1:dd07e1deec6c 1026 lcd->line(r.p1.x+0,r.p2.y-2, r.p2.x-2,r.p2.y-2, buttonshadow); // bottom border
WiredHome 1:dd07e1deec6c 1027 lcd->line(r.p2.x-0,r.p1.y+0, r.p2.x-0,r.p2.y-0, buttonshadow); // right border
WiredHome 1:dd07e1deec6c 1028 lcd->line(r.p2.x-1,r.p1.y+0, r.p2.x-1,r.p2.y-1, buttonshadow); // right border
WiredHome 1:dd07e1deec6c 1029 lcd->line(r.p2.x-2,r.p1.y+0, r.p2.x-2,r.p2.y-2, buttonshadow); // right border
WiredHome 1:dd07e1deec6c 1030 wave.p1.x = r.p1.x+5 + 0; wave.p1.y = r.p1.y + 5 + 0;
WiredHome 1:dd07e1deec6c 1031 wave.p2.x = r.p2.x-5 + 0; wave.p2.y = r.p2.y - 5 + 0;
WiredHome 1:dd07e1deec6c 1032 }
WiredHome 1:dd07e1deec6c 1033 switch (mode) {
WiredHome 1:dd07e1deec6c 1034 case SG_SINE:
WiredHome 1:dd07e1deec6c 1035 case SG_SQUARE:
WiredHome 1:dd07e1deec6c 1036 case SG_TRIANGLE:
WiredHome 1:dd07e1deec6c 1037 case SG_SAWTOOTH:
WiredHome 1:dd07e1deec6c 1038 case SG_USER:
WiredHome 2:8f71b71fce1b 1039 DrawWaveform(wave, mode, Black, true);
WiredHome 1:dd07e1deec6c 1040 break;
WiredHome 1:dd07e1deec6c 1041 case SG_KEYPAD:
WiredHome 1:dd07e1deec6c 1042 lcd->foreground(Black);
WiredHome 1:dd07e1deec6c 1043 lcd->background(buttonface);
WiredHome 1:dd07e1deec6c 1044 lcd->SetTextCursor((r.p1.x+r.p2.x)/2 - 4,r.p1.y + BTN_H/2 - 8); // 8x16 char
WiredHome 1:dd07e1deec6c 1045 lcd->putc(UI_KeyLabels[label]);
WiredHome 1:dd07e1deec6c 1046 break;
WiredHome 1:dd07e1deec6c 1047 }
WiredHome 1:dd07e1deec6c 1048 }
WiredHome 1:dd07e1deec6c 1049
WiredHome 1:dd07e1deec6c 1050 void SignalGenDisplay::updateTextWindow(void) {
WiredHome 1:dd07e1deec6c 1051 lcd->window(UI_DATA_ENTRY);
WiredHome 1:dd07e1deec6c 1052 lcd->fillrect(UI_DATA_ENTRY, White);
WiredHome 1:dd07e1deec6c 1053 lcd->foreground(Black);
WiredHome 1:dd07e1deec6c 1054 lcd->background(White);
WiredHome 1:dd07e1deec6c 1055 lcd->SetTextCursor(UI_DATA_ENTRY.p1.x+1,UI_DATA_ENTRY.p1.y+1);
WiredHome 1:dd07e1deec6c 1056 lcd->printf("%21s", textBuffer);
WiredHome 1:dd07e1deec6c 1057 lcd->window();
WiredHome 1:dd07e1deec6c 1058 }
WiredHome 1:dd07e1deec6c 1059
WiredHome 2:8f71b71fce1b 1060 void SignalGenDisplay::clearTextWindow(void) {
WiredHome 2:8f71b71fce1b 1061 lcd->fillrect(UI_DATA_ENTRY, UI_BackColor);
WiredHome 2:8f71b71fce1b 1062 textBuffer[0] = '\0';
WiredHome 2:8f71b71fce1b 1063 textLen = 0;
WiredHome 2:8f71b71fce1b 1064 }
WiredHome 2:8f71b71fce1b 1065
WiredHome 1:dd07e1deec6c 1066 float SignalGenDisplay::rangelimit(float value, float min, float max) {
WiredHome 1:dd07e1deec6c 1067 if (value < min)
WiredHome 1:dd07e1deec6c 1068 return min;
WiredHome 1:dd07e1deec6c 1069 else if (value > max)
WiredHome 1:dd07e1deec6c 1070 return max;
WiredHome 1:dd07e1deec6c 1071 else
WiredHome 1:dd07e1deec6c 1072 return value;
WiredHome 1:dd07e1deec6c 1073 }
WiredHome 1:dd07e1deec6c 1074
WiredHome 2:8f71b71fce1b 1075 void SignalGenDisplay::SaveSettings(OM_Changes reportMode) {
WiredHome 2:8f71b71fce1b 1076 char buf[20];
WiredHome 1:dd07e1deec6c 1077
WiredHome 2:8f71b71fce1b 1078 if (reportMode != OM_NONE) {
WiredHome 2:8f71b71fce1b 1079 Changes |= reportMode;
WiredHome 2:8f71b71fce1b 1080 printf("SaveSettings - reset timer [%02X]\r\n", Changes);
WiredHome 2:8f71b71fce1b 1081 timerSave.reset();
WiredHome 2:8f71b71fce1b 1082 timerSave.start();
WiredHome 2:8f71b71fce1b 1083 } else if (timerSave.read() > SAVE_AFTER_IDLE_S) {
WiredHome 2:8f71b71fce1b 1084 timerSave.stop();
WiredHome 2:8f71b71fce1b 1085 timerSave.reset();
WiredHome 2:8f71b71fce1b 1086 printf("SaveSettings - timeout [%02X]\r\n", Changes);
WiredHome 2:8f71b71fce1b 1087 if (Changes & OM_MODE) {
WiredHome 2:8f71b71fce1b 1088 Changes &= ~ OM_MODE;
WiredHome 2:8f71b71fce1b 1089 ini.WriteString("Signal", "Waveform", ModeNames[mode]);
WiredHome 2:8f71b71fce1b 1090 }
WiredHome 2:8f71b71fce1b 1091 if (Changes & OM_FREQ) {
WiredHome 2:8f71b71fce1b 1092 Changes &= ~ OM_FREQ;
WiredHome 2:8f71b71fce1b 1093 snprintf(buf, sizeof(buf),"%5.3f", frequency);
WiredHome 2:8f71b71fce1b 1094 printf(" Signal:Frequency=%s\r\n", buf);
WiredHome 2:8f71b71fce1b 1095 ini.WriteString("Signal", "Frequency", buf);
WiredHome 2:8f71b71fce1b 1096 }
WiredHome 2:8f71b71fce1b 1097 if (Changes & OM_PERI) {
WiredHome 2:8f71b71fce1b 1098 Changes &= ~ OM_PERI;
WiredHome 2:8f71b71fce1b 1099 snprintf(buf, sizeof(buf),"%5.3f", frequency);
WiredHome 2:8f71b71fce1b 1100 printf(" Signal:Frequency=%s\r\n", buf);
WiredHome 2:8f71b71fce1b 1101 ini.WriteString("Signal", "Frequency", buf);
WiredHome 2:8f71b71fce1b 1102 }
WiredHome 2:8f71b71fce1b 1103 if (Changes & OM_DUTY) {
WiredHome 2:8f71b71fce1b 1104 Changes &= ~ OM_DUTY;
WiredHome 2:8f71b71fce1b 1105 snprintf(buf, sizeof(buf),"%1.0f", dutycycle);
WiredHome 2:8f71b71fce1b 1106 printf(" Signal:Duty Cycle=%s\r\n", buf);
WiredHome 2:8f71b71fce1b 1107 ini.WriteString("Signal", "Duty Cycle", buf);
WiredHome 2:8f71b71fce1b 1108 }
WiredHome 2:8f71b71fce1b 1109 if (Changes & OM_VOLT) {
WiredHome 2:8f71b71fce1b 1110 Changes &= ~ OM_VOLT;
WiredHome 2:8f71b71fce1b 1111 snprintf(buf, sizeof(buf),"%3.2f", voltage);
WiredHome 2:8f71b71fce1b 1112 printf(" Signal:Voltage=%s\r\n", buf);
WiredHome 2:8f71b71fce1b 1113 ini.WriteString("Signal", "Voltage", buf);
WiredHome 2:8f71b71fce1b 1114 }
WiredHome 2:8f71b71fce1b 1115 if (Changes & OM_OFFS) {
WiredHome 2:8f71b71fce1b 1116 Changes &= ~ OM_OFFS;
WiredHome 2:8f71b71fce1b 1117 snprintf(buf, sizeof(buf),"%3.2f", offset);
WiredHome 2:8f71b71fce1b 1118 printf(" Signal:Offset=%s\r\n", buf);
WiredHome 2:8f71b71fce1b 1119 ini.WriteString("Signal", "Offset", buf);
WiredHome 2:8f71b71fce1b 1120 }
WiredHome 1:dd07e1deec6c 1121 }
WiredHome 1:dd07e1deec6c 1122 }
WiredHome 1:dd07e1deec6c 1123
WiredHome 2:8f71b71fce1b 1124 void SignalGenDisplay::resetDataEntry(OM_Changes nextMode, bool save) {
WiredHome 2:8f71b71fce1b 1125 OM_Changes last = EntryMd;
WiredHome 1:dd07e1deec6c 1126
WiredHome 2:8f71b71fce1b 1127 printf("-> resetDataEntry(next: %d) curr:%d, save:%d\r\n", nextMode, last, save);
WiredHome 2:8f71b71fce1b 1128 EntryMd = nextMode;
WiredHome 2:8f71b71fce1b 1129 if (last != OM_NONE)
WiredHome 2:8f71b71fce1b 1130 signal->PrepareWaveform(SG_SAWTOOTH, frequency, dutycycle, voltage, offset);
WiredHome 1:dd07e1deec6c 1131 switch (last) {
WiredHome 2:8f71b71fce1b 1132 case OM_NONE:
WiredHome 1:dd07e1deec6c 1133 updateDutyCycle();
WiredHome 1:dd07e1deec6c 1134 updateFrequency();
WiredHome 1:dd07e1deec6c 1135 updatePeriod();
WiredHome 1:dd07e1deec6c 1136 updateVoltage();
WiredHome 1:dd07e1deec6c 1137 updateOffset();
WiredHome 1:dd07e1deec6c 1138 break;
WiredHome 2:8f71b71fce1b 1139 case OM_DUTY:
WiredHome 1:dd07e1deec6c 1140 updateDutyCycle();
WiredHome 2:8f71b71fce1b 1141 if (save) {
WiredHome 2:8f71b71fce1b 1142 SaveSettings(OM_DUTY);
WiredHome 2:8f71b71fce1b 1143 }
WiredHome 1:dd07e1deec6c 1144 break;
WiredHome 2:8f71b71fce1b 1145 case OM_FREQ:
WiredHome 1:dd07e1deec6c 1146 updateFrequency();
WiredHome 2:8f71b71fce1b 1147 if (save) {
WiredHome 2:8f71b71fce1b 1148 SaveSettings(OM_FREQ);
WiredHome 2:8f71b71fce1b 1149 }
WiredHome 1:dd07e1deec6c 1150 break;
WiredHome 2:8f71b71fce1b 1151 case OM_PERI:
WiredHome 1:dd07e1deec6c 1152 updatePeriod();
WiredHome 2:8f71b71fce1b 1153 if (save) {
WiredHome 2:8f71b71fce1b 1154 SaveSettings(OM_FREQ);
WiredHome 2:8f71b71fce1b 1155 }
WiredHome 1:dd07e1deec6c 1156 break;
WiredHome 2:8f71b71fce1b 1157 case OM_VOLT:
WiredHome 1:dd07e1deec6c 1158 updateVoltage();
WiredHome 2:8f71b71fce1b 1159 if (save) {
WiredHome 2:8f71b71fce1b 1160 SaveSettings(OM_VOLT);
WiredHome 2:8f71b71fce1b 1161 }
WiredHome 1:dd07e1deec6c 1162 break;
WiredHome 2:8f71b71fce1b 1163 case OM_OFFS:
WiredHome 1:dd07e1deec6c 1164 updateOffset();
WiredHome 2:8f71b71fce1b 1165 if (save) {
WiredHome 2:8f71b71fce1b 1166 SaveSettings(OM_OFFS);
WiredHome 2:8f71b71fce1b 1167 }
WiredHome 1:dd07e1deec6c 1168 break;
WiredHome 1:dd07e1deec6c 1169 default:
WiredHome 1:dd07e1deec6c 1170 break;
WiredHome 1:dd07e1deec6c 1171 }
WiredHome 2:8f71b71fce1b 1172 DrawKeypadEnabled(EntryMd != OM_NONE);
WiredHome 2:8f71b71fce1b 1173 if (EntryMd == OM_NONE) {
WiredHome 2:8f71b71fce1b 1174 clearTextWindow();
WiredHome 2:8f71b71fce1b 1175 }
WiredHome 2:8f71b71fce1b 1176 printf("<- end resetDataEntry()\r\n");
WiredHome 1:dd07e1deec6c 1177 }