Signal Generator

Dependencies:   IniManager RA8875 Watchdog mbed-rtos mbed

Fork of speaker_demo_Analog by jim hamblen

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

Who changed what in which revision?

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