Signal Generator

Dependencies:   IniManager RA8875 Watchdog mbed-rtos mbed

Fork of speaker_demo_Analog by jim hamblen

Committer:
WiredHome
Date:
Sat May 20 19:52:23 2017 +0000
Revision:
6:1f48212fbaf9
Parent:
5:49dd0c647a40
Signal Generator - a work in process as the need arises.

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 3:d22f3e52d06a 8 #include "BPG_Arial08x08.h"
WiredHome 1:dd07e1deec6c 9
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 3:d22f3e52d06a 17 // | | | | [Start/Stop ] [ ] |
WiredHome 2:8f71b71fce1b 18 // | | | | [Text Entry Box] [ Back ] |
WiredHome 3:d22f3e52d06a 19 // | | | +-- Keypad Area ---------+ |
WiredHome 1:dd07e1deec6c 20 // | | | | | |
WiredHome 2:8f71b71fce1b 21 // | | | | | | |
WiredHome 2:8f71b71fce1b 22 // | | | | | | |
WiredHome 2:8f71b71fce1b 23 // | | ---+ | | | |
WiredHome 3:d22f3e52d06a 24 // | | | | | |
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 #define SC_LEFT_MARGIN 10 // Scope left margin
WiredHome 3:d22f3e52d06a 52 #define SC_TOP_MARGIN 10
WiredHome 2:8f71b71fce1b 53 #define SC_RIGHT_MARGIN 30
WiredHome 3:d22f3e52d06a 54 #define SC_BOT_MARGIN 20
WiredHome 2:8f71b71fce1b 55 #define BTN_W 54 // Button width
WiredHome 2:8f71b71fce1b 56 #define BTN_H 32 // Button height
WiredHome 2:8f71b71fce1b 57 #define BTN_S 5 // Button white-space
WiredHome 2:8f71b71fce1b 58
WiredHome 2:8f71b71fce1b 59 #define BTN_MODE_X 2 // Mode Buttons left edge
WiredHome 2:8f71b71fce1b 60 #define BTN_MODE_Y 233 // Mode Buttons top edge
WiredHome 2:8f71b71fce1b 61
WiredHome 2:8f71b71fce1b 62 #define BTN_KEYP_X 300 // Keypad left edge
WiredHome 2:8f71b71fce1b 63 #define BTN_KEYP_Y 53 // Keypad top edge
WiredHome 1:dd07e1deec6c 64
WiredHome 3:d22f3e52d06a 65 // Rectangular Zones
WiredHome 5:49dd0c647a40 66 static const rect_t UI_START_STOP = {BTN_KEYP_X,BTN_KEYP_Y, BTN_KEYP_X+2*BTN_W+BTN_S,BTN_KEYP_Y+BTN_H};
WiredHome 5:49dd0c647a40 67 static const char * UI_StartLabels[3] = { "Start", "Stop", "Pulse" };
WiredHome 5:49dd0c647a40 68 static const char StartStopKeys[] = { 'G', 'O', 'P' };
WiredHome 5:49dd0c647a40 69 static const rect_t UI_DATA_ENTRY = {BTN_KEYP_X,BTN_KEYP_Y, BTN_KEYP_X+2*BTN_W+BTN_S,BTN_KEYP_Y+BTN_H-2};
WiredHome 5:49dd0c647a40 70 static const rect_t UI_SCOPE_RECT = {4,5, 290,160};
WiredHome 3:d22f3e52d06a 71
WiredHome 5:49dd0c647a40 72 static const rect_t UI_WAVE_RECT = {4+SC_LEFT_MARGIN,5+SC_TOP_MARGIN, 290-SC_RIGHT_MARGIN,160-SC_BOT_MARGIN};
WiredHome 3:d22f3e52d06a 73
WiredHome 5:49dd0c647a40 74 static const rect_t Parameters[] = {
WiredHome 2:8f71b71fce1b 75 {4,170, 60,190}, // 'd'uty cycle
WiredHome 2:8f71b71fce1b 76 {90,170, 186,190}, // 'f'requency
WiredHome 2:8f71b71fce1b 77 {90,200, 186,220}, // 'p'eriod
WiredHome 2:8f71b71fce1b 78 {230,170, 290,190}, // 'v'oltage
WiredHome 2:8f71b71fce1b 79 {230,200, 290,220} // 'o'ffset
WiredHome 1:dd07e1deec6c 80 };
WiredHome 5:49dd0c647a40 81 static const int ParameterCount = sizeof(Parameters)/sizeof(Parameters[0]);
WiredHome 5:49dd0c647a40 82 static const char ParameterKeys[] = { 'd', 'f', 'p', 'v', 'o' };
WiredHome 1:dd07e1deec6c 83
WiredHome 5:49dd0c647a40 84 static const rect_t UI_PROD_RECT = { 298,3, 479,51 };
WiredHome 5:49dd0c647a40 85 static const rect_t NavToSettings = { 4,200, 60,220 };
WiredHome 1:dd07e1deec6c 86
WiredHome 2:8f71b71fce1b 87 // Mode Buttons
WiredHome 5:49dd0c647a40 88 static const rect_t ModeButtons[] = {
WiredHome 1:dd07e1deec6c 89 { 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 90 { 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 91 { 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 92 { 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 93 { 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 94 };
WiredHome 5:49dd0c647a40 95 static const int ModeCount = sizeof(ModeButtons)/sizeof(ModeButtons[0]);
WiredHome 6:1f48212fbaf9 96 static const SG_Waveform UI_ModeList[] = {
WiredHome 2:8f71b71fce1b 97 SG_SINE,
WiredHome 2:8f71b71fce1b 98 SG_SQUARE,
WiredHome 2:8f71b71fce1b 99 SG_TRIANGLE,
WiredHome 2:8f71b71fce1b 100 SG_SAWTOOTH,
WiredHome 2:8f71b71fce1b 101 SG_USER,
WiredHome 1:dd07e1deec6c 102 };
WiredHome 5:49dd0c647a40 103 static const char ModeKeys[] = { 'S','Q','T','W','U' };
WiredHome 5:49dd0c647a40 104 static const char *ModeNames[] = {
WiredHome 2:8f71b71fce1b 105 "Sine",
WiredHome 2:8f71b71fce1b 106 "Square",
WiredHome 2:8f71b71fce1b 107 "Triangle",
WiredHome 2:8f71b71fce1b 108 "Sawtooth",
WiredHome 2:8f71b71fce1b 109 "User",
WiredHome 2:8f71b71fce1b 110 };
WiredHome 1:dd07e1deec6c 111
WiredHome 5:49dd0c647a40 112 static const rect_t UI_Keypad[] = {
WiredHome 2:8f71b71fce1b 113 {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 114 {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 115 {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 116 {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 117 {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 118 {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 119 {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 120 {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 121 {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 122 {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 123 {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 124 {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 125 {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 126 {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 127 {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 128 {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 129 };
WiredHome 5:49dd0c647a40 130 static const int KeypadCount = sizeof(UI_Keypad)/sizeof(UI_Keypad[0]);
WiredHome 5:49dd0c647a40 131 static const char UI_KeyLabels[] = {
WiredHome 2:8f71b71fce1b 132 '\x1B',
WiredHome 1:dd07e1deec6c 133 '7', '8', '9',
WiredHome 1:dd07e1deec6c 134 '4', '5', '6',
WiredHome 1:dd07e1deec6c 135 '1', '2', '3',
WiredHome 1:dd07e1deec6c 136 '0', '.', '-',
WiredHome 2:8f71b71fce1b 137 '\x19', '\x18', '\xB6',
WiredHome 1:dd07e1deec6c 138 };
WiredHome 5:49dd0c647a40 139 static const char KeyPadKeys[] = {
WiredHome 2:8f71b71fce1b 140 '\x08',
WiredHome 2:8f71b71fce1b 141 '7', '8', '9',
WiredHome 2:8f71b71fce1b 142 '4', '5', '6',
WiredHome 2:8f71b71fce1b 143 '1', '2', '3',
WiredHome 2:8f71b71fce1b 144 '0', '.', '-',
WiredHome 2:8f71b71fce1b 145 '<', '>', '\n' };
WiredHome 1:dd07e1deec6c 146
WiredHome 1:dd07e1deec6c 147
WiredHome 1:dd07e1deec6c 148 // ##### Settings #############################################################
WiredHome 1:dd07e1deec6c 149 //
WiredHome 1:dd07e1deec6c 150 // +---------------------------------------------------------------------------+
WiredHome 1:dd07e1deec6c 151 // | Progam Name and version |
WiredHome 1:dd07e1deec6c 152 // | Manufacturer name |
WiredHome 3:d22f3e52d06a 153 // | Build Date |
WiredHome 3:d22f3e52d06a 154 // | Signal Generator Mode |
WiredHome 2:8f71b71fce1b 155 // | \ | / |
WiredHome 3:d22f3e52d06a 156 // | ( * ) Continuous = O = |
WiredHome 2:8f71b71fce1b 157 // | / | \ |
WiredHome 3:d22f3e52d06a 158 // | ( ) One-Shot +--------+ |
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 // | | | |
WiredHome 1:dd07e1deec6c 169 // | +--------+ |
WiredHome 1:dd07e1deec6c 170 // +---------------------------------------------------------------------------+
WiredHome 1:dd07e1deec6c 171
WiredHome 5:49dd0c647a40 172 static const point_t suncenter = { 450,85 };
WiredHome 5:49dd0c647a40 173 static const rect_t sunray[] = {
WiredHome 3:d22f3e52d06a 174 { 450-2, 85-25, 450+2, 85+25 },
WiredHome 3:d22f3e52d06a 175 { 450-25,85-2, 450+25,85+2 }
WiredHome 1:dd07e1deec6c 176 };
WiredHome 5:49dd0c647a40 177 static const rect_t sungraph = { 450-18,120+0, 450+18,265+0 };
WiredHome 5:49dd0c647a40 178 static const rect_t inrgraph = { 450-16,120+2, 450+16,265-2 };
WiredHome 3:d22f3e52d06a 179
WiredHome 5:49dd0c647a40 180 static const rect_t SignalMode =
WiredHome 3:d22f3e52d06a 181 { 20,50, 20+140,70 };
WiredHome 5:49dd0c647a40 182 static const char * SignalModeLabel = "Signal Mode";
WiredHome 3:d22f3e52d06a 183
WiredHome 5:49dd0c647a40 184 static const rect_t radio_Cycles[] = {
WiredHome 3:d22f3e52d06a 185 { 40, 80, 40+120,100 },
WiredHome 3:d22f3e52d06a 186 { 40,110, 40+120,130 }
WiredHome 3:d22f3e52d06a 187 };
WiredHome 5:49dd0c647a40 188 static const int radio_CyclesCount = sizeof(radio_Cycles)/sizeof(radio_Cycles[0]);
WiredHome 5:49dd0c647a40 189 static const char * PulseModeLabels[] = {
WiredHome 3:d22f3e52d06a 190 "Continuous",
WiredHome 3:d22f3e52d06a 191 "One-Shot"
WiredHome 3:d22f3e52d06a 192 };
WiredHome 3:d22f3e52d06a 193 #define UI_CyclesColor Green
WiredHome 3:d22f3e52d06a 194 #define UI_CyclesBackColor RGB(0,0,0)
WiredHome 3:d22f3e52d06a 195
WiredHome 5:49dd0c647a40 196 // rect_t radio_Cycles[], radio_CyclesCount, char * PulseModeLabels[]
WiredHome 1:dd07e1deec6c 197
WiredHome 2:8f71b71fce1b 198 #define PI 3.1415 // Handy value
WiredHome 2:8f71b71fce1b 199
WiredHome 3:d22f3e52d06a 200 template <typename T> int sgn(T val) {
WiredHome 3:d22f3e52d06a 201 return (T(0) < val) - (val < T(0));
WiredHome 3:d22f3e52d06a 202 }
WiredHome 2:8f71b71fce1b 203
WiredHome 3:d22f3e52d06a 204
WiredHome 3:d22f3e52d06a 205 // #############################################################################
WiredHome 3:d22f3e52d06a 206
WiredHome 3:d22f3e52d06a 207 SignalGenDisplay::SignalGenDisplay(RA8875 * _lcd, SignalGenDAC * _signal, const char * _Path,
WiredHome 2:8f71b71fce1b 208 const char * _ProgName, const char * _Manuf, const char * _Ver, const char * _Build) :
WiredHome 3:d22f3e52d06a 209 lcd(_lcd), signal(_signal), Path(_Path), ProgName(_ProgName), Manuf(_Manuf), Ver(_Ver), Build(_Build) {
WiredHome 3:d22f3e52d06a 210 char buf[50];
WiredHome 3:d22f3e52d06a 211
WiredHome 3:d22f3e52d06a 212 snprintf(buf, sizeof(buf), "%s/SigGen.ini", Path);
WiredHome 3:d22f3e52d06a 213 ini.SetFile(buf, 2);
WiredHome 2:8f71b71fce1b 214 needsInit = true;
WiredHome 2:8f71b71fce1b 215 }
WiredHome 2:8f71b71fce1b 216
WiredHome 2:8f71b71fce1b 217
WiredHome 2:8f71b71fce1b 218 SignalGenDisplay::~SignalGenDisplay() {
WiredHome 2:8f71b71fce1b 219 }
WiredHome 2:8f71b71fce1b 220
WiredHome 1:dd07e1deec6c 221
WiredHome 3:d22f3e52d06a 222
WiredHome 1:dd07e1deec6c 223
WiredHome 1:dd07e1deec6c 224 char SignalGenDisplay::GetTouchEvent(void) {
WiredHome 1:dd07e1deec6c 225 TouchCode_t touch;
WiredHome 1:dd07e1deec6c 226
WiredHome 3:d22f3e52d06a 227 touch = lcd->TouchPanelReadable(); // any touch to report?
WiredHome 3:d22f3e52d06a 228 if (touch == no_touch) {
WiredHome 3:d22f3e52d06a 229 timerForceTSCal.stop();
WiredHome 3:d22f3e52d06a 230 timerForceTSCal.reset();
WiredHome 3:d22f3e52d06a 231 } else {
WiredHome 3:d22f3e52d06a 232 uint8_t id = lcd->TouchID(0); // 'id' tracks the individual touches
WiredHome 3:d22f3e52d06a 233 TouchCode_t ev = lcd->TouchCode(0); // 'ev'ent indicates no_touch, touch, held, release, ...
WiredHome 3:d22f3e52d06a 234 point_t point = lcd->TouchCoordinates(0); // and of course the (x,y) coordinates
WiredHome 1:dd07e1deec6c 235 if (ev == touch) {
WiredHome 3:d22f3e52d06a 236 timerRepeat.start();
WiredHome 3:d22f3e52d06a 237 timerRepeat.reset();
WiredHome 3:d22f3e52d06a 238 timerForceTSCal.start();
WiredHome 3:d22f3e52d06a 239 timerForceTSCal.reset();
WiredHome 3:d22f3e52d06a 240 } else if (ev == held && timerForceTSCal.read() > 10.0) {
WiredHome 3:d22f3e52d06a 241 printf("Forcing T.S. Cal\r\n");
WiredHome 3:d22f3e52d06a 242 timerForceTSCal.stop();
WiredHome 3:d22f3e52d06a 243 timerForceTSCal.reset();
WiredHome 3:d22f3e52d06a 244 lcd->cls();
WiredHome 3:d22f3e52d06a 245 CalibrateTS();
WiredHome 3:d22f3e52d06a 246 Refresh();
WiredHome 1:dd07e1deec6c 247 }
WiredHome 3:d22f3e52d06a 248 if ((ev == release) || (ev == held && timerRepeat.read_ms() > 250)) {
WiredHome 3:d22f3e52d06a 249 timerRepeat.reset();
WiredHome 1:dd07e1deec6c 250 switch (vis) {
WiredHome 1:dd07e1deec6c 251 case VS_MainScreen:
WiredHome 3:d22f3e52d06a 252 // Start/Stop/Pulse
WiredHome 3:d22f3e52d06a 253 if (textLen == 0 && ev == release) {
WiredHome 3:d22f3e52d06a 254 if (lcd->Intersect(UI_START_STOP, point)) {
WiredHome 3:d22f3e52d06a 255 printf("Start/Stop/Pulse %d - %d : %c\r\n", pulseMode, signal->isRunning(),
WiredHome 3:d22f3e52d06a 256 StartStopKeys[pulseMode ? 2 : signal->isRunning()]);
WiredHome 3:d22f3e52d06a 257 return StartStopKeys[pulseMode ? 2 : signal->isRunning()];
WiredHome 3:d22f3e52d06a 258 }
WiredHome 3:d22f3e52d06a 259 }
WiredHome 1:dd07e1deec6c 260 // Mode Keys touch
WiredHome 3:d22f3e52d06a 261 if (ev == release) {
WiredHome 3:d22f3e52d06a 262 for (int i=0; i<ModeCount; i++) {
WiredHome 3:d22f3e52d06a 263 if (lcd->Intersect(ModeButtons[i], point)) {
WiredHome 3:d22f3e52d06a 264 return ModeKeys[i];
WiredHome 3:d22f3e52d06a 265 }
WiredHome 1:dd07e1deec6c 266 }
WiredHome 1:dd07e1deec6c 267 }
WiredHome 1:dd07e1deec6c 268 // Parameters
WiredHome 3:d22f3e52d06a 269 if (ev == release) {
WiredHome 3:d22f3e52d06a 270 for (int i=0; i<ParameterCount; i++) {
WiredHome 3:d22f3e52d06a 271 if (lcd->Intersect(Parameters[i], point)) {
WiredHome 3:d22f3e52d06a 272 return ParameterKeys[i];
WiredHome 3:d22f3e52d06a 273 }
WiredHome 3:d22f3e52d06a 274 }
WiredHome 3:d22f3e52d06a 275 }
WiredHome 3:d22f3e52d06a 276 // Keypad
WiredHome 3:d22f3e52d06a 277 if (1 || ev == release) {
WiredHome 3:d22f3e52d06a 278 for (int i=0; i<KeypadCount; i++) {
WiredHome 3:d22f3e52d06a 279 if (lcd->Intersect(UI_Keypad[i], point)) {
WiredHome 3:d22f3e52d06a 280 return KeyPadKeys[i];
WiredHome 3:d22f3e52d06a 281 }
WiredHome 1:dd07e1deec6c 282 }
WiredHome 1:dd07e1deec6c 283 }
WiredHome 1:dd07e1deec6c 284
WiredHome 3:d22f3e52d06a 285 if (ev == release) {
WiredHome 3:d22f3e52d06a 286 if (lcd->Intersect(NavToSettings, point)) {
WiredHome 3:d22f3e52d06a 287 vis = VS_Settings;
WiredHome 3:d22f3e52d06a 288 Refresh();
WiredHome 3:d22f3e52d06a 289 while (lcd->TouchPanelReadable())
WiredHome 3:d22f3e52d06a 290 ;
WiredHome 3:d22f3e52d06a 291 Thread::wait(100);
WiredHome 1:dd07e1deec6c 292 }
WiredHome 1:dd07e1deec6c 293 }
WiredHome 1:dd07e1deec6c 294 break;
WiredHome 3:d22f3e52d06a 295
WiredHome 1:dd07e1deec6c 296 case VS_Settings:
WiredHome 1:dd07e1deec6c 297 Thread::wait(20);
WiredHome 1:dd07e1deec6c 298 if (lcd->Intersect(sungraph, point)) {
WiredHome 1:dd07e1deec6c 299 float bl = (float)(sungraph.p2.y - point.y)/(sungraph.p2.y - sungraph.p1.y);
WiredHome 1:dd07e1deec6c 300 lcd->Backlight(rangelimit(bl, 0.1, 1.0));
WiredHome 3:d22f3e52d06a 301 SaveSettings(OM_BACKL);
WiredHome 1:dd07e1deec6c 302 ShowBrightnessSetting();
WiredHome 1:dd07e1deec6c 303 }
WiredHome 3:d22f3e52d06a 304 if (ev == release) {
WiredHome 3:d22f3e52d06a 305 if (lcd->Intersect(NavToSettings, point)) {
WiredHome 3:d22f3e52d06a 306 // Switch to main screen
WiredHome 3:d22f3e52d06a 307 vis = VS_MainScreen;
WiredHome 3:d22f3e52d06a 308 Refresh();
WiredHome 3:d22f3e52d06a 309 while (lcd->TouchPanelReadable())
WiredHome 3:d22f3e52d06a 310 ;
WiredHome 3:d22f3e52d06a 311 Thread::wait(100);
WiredHome 3:d22f3e52d06a 312 ShowMenu();
WiredHome 3:d22f3e52d06a 313 }
WiredHome 3:d22f3e52d06a 314 }
WiredHome 3:d22f3e52d06a 315
WiredHome 3:d22f3e52d06a 316 if (ev == release) {
WiredHome 3:d22f3e52d06a 317 for (int i=0; i<radio_CyclesCount; i++) {
WiredHome 3:d22f3e52d06a 318 if (lcd->Intersect(radio_Cycles[i], point)) {
WiredHome 3:d22f3e52d06a 319 pulseMode = i;
WiredHome 6:1f48212fbaf9 320 SaveSettings(OM_PULSE);
WiredHome 4:10281ddb673d 321 signal->Stop();
WiredHome 3:d22f3e52d06a 322 ShowCyclesControl();
WiredHome 3:d22f3e52d06a 323 }
WiredHome 3:d22f3e52d06a 324 }
WiredHome 1:dd07e1deec6c 325 }
WiredHome 1:dd07e1deec6c 326 break;
WiredHome 1:dd07e1deec6c 327 }
WiredHome 1:dd07e1deec6c 328 }
WiredHome 1:dd07e1deec6c 329 }
WiredHome 1:dd07e1deec6c 330 return 0;
WiredHome 1:dd07e1deec6c 331 }
WiredHome 1:dd07e1deec6c 332
WiredHome 1:dd07e1deec6c 333
WiredHome 2:8f71b71fce1b 334 void SignalGenDisplay::Refresh() {
WiredHome 2:8f71b71fce1b 335 if (needsInit) {
WiredHome 2:8f71b71fce1b 336 char buf[100];
WiredHome 3:d22f3e52d06a 337
WiredHome 2:8f71b71fce1b 338 needsInit = false;
WiredHome 2:8f71b71fce1b 339 vis = VS_MainScreen; // always start on main screen
WiredHome 3:d22f3e52d06a 340 lcd->TouchPanelInit();
WiredHome 3:d22f3e52d06a 341 InitializeTS();
WiredHome 3:d22f3e52d06a 342
WiredHome 2:8f71b71fce1b 343 // Default the backlight
WiredHome 2:8f71b71fce1b 344 ini.ReadString("Settings", "Backlight", buf, sizeof(buf), "60");
WiredHome 2:8f71b71fce1b 345 lcd->Backlight_u8(atoi(buf));
WiredHome 2:8f71b71fce1b 346
WiredHome 3:d22f3e52d06a 347 ini.ReadString("Signal", "Waveform", buf, sizeof(buf), ModeNames[0]);
WiredHome 2:8f71b71fce1b 348 for (int i=0; i<ModeCount; i++) {
WiredHome 2:8f71b71fce1b 349 if (strcmp(ModeNames[i], buf) == 0) {
WiredHome 6:1f48212fbaf9 350 mode = (SG_Waveform)i;
WiredHome 4:10281ddb673d 351 printf("Read ini mode is %d\r\n", mode);
WiredHome 2:8f71b71fce1b 352 break;
WiredHome 2:8f71b71fce1b 353 }
WiredHome 2:8f71b71fce1b 354 }
WiredHome 2:8f71b71fce1b 355 ini.ReadString("Signal", "Duty Cycle", buf, sizeof(buf), "50");
WiredHome 2:8f71b71fce1b 356 dutycycle = atof(buf);
WiredHome 2:8f71b71fce1b 357
WiredHome 2:8f71b71fce1b 358 ini.ReadString("Signal", "Frequency", buf, sizeof(buf), "1000");
WiredHome 2:8f71b71fce1b 359 frequency = atof(buf);
WiredHome 2:8f71b71fce1b 360
WiredHome 2:8f71b71fce1b 361 ini.ReadString("Signal", "Voltage", buf, sizeof(buf), "3.0");
WiredHome 2:8f71b71fce1b 362 voltage = atof(buf);
WiredHome 2:8f71b71fce1b 363
WiredHome 2:8f71b71fce1b 364 ini.ReadString("Signal", "Offset", buf, sizeof(buf), "1.5");
WiredHome 2:8f71b71fce1b 365 offset = atof(buf);
WiredHome 3:d22f3e52d06a 366
WiredHome 5:49dd0c647a40 367 ini.ReadString("Signal", "Pulse Mode", buf, sizeof(buf), PulseModeLabels[0]);
WiredHome 3:d22f3e52d06a 368 for (int i=0; i<radio_CyclesCount; i++) {
WiredHome 5:49dd0c647a40 369 if (strcmp(PulseModeLabels[i], buf) == 0) {
WiredHome 3:d22f3e52d06a 370 pulseMode = i;
WiredHome 3:d22f3e52d06a 371 break;
WiredHome 3:d22f3e52d06a 372 }
WiredHome 3:d22f3e52d06a 373 }
WiredHome 3:d22f3e52d06a 374 ShowMenu();
WiredHome 2:8f71b71fce1b 375 }
WiredHome 1:dd07e1deec6c 376 switch (vis) {
WiredHome 1:dd07e1deec6c 377 case VS_MainScreen:
WiredHome 1:dd07e1deec6c 378 lcd->background(UI_BackColor);
WiredHome 1:dd07e1deec6c 379 lcd->cls(1);
WiredHome 1:dd07e1deec6c 380 lcd->SelectDrawingLayer(0);
WiredHome 1:dd07e1deec6c 381 // Clear Screen
WiredHome 1:dd07e1deec6c 382 lcd->SetLayerMode(RA8875::ShowLayer0);
WiredHome 1:dd07e1deec6c 383
WiredHome 1:dd07e1deec6c 384 // Product Info
WiredHome 1:dd07e1deec6c 385 lcd->foreground(UI_ProductNameColor);
WiredHome 1:dd07e1deec6c 386 ShowProductInfo();
WiredHome 1:dd07e1deec6c 387
WiredHome 1:dd07e1deec6c 388 ClearScope();
WiredHome 1:dd07e1deec6c 389 resetDataEntry();
WiredHome 1:dd07e1deec6c 390 DrawNavGadget();
WiredHome 2:8f71b71fce1b 391 DrawModeButtons();
WiredHome 1:dd07e1deec6c 392 break;
WiredHome 1:dd07e1deec6c 393
WiredHome 1:dd07e1deec6c 394 case VS_Settings:
WiredHome 1:dd07e1deec6c 395 lcd->background(UI_BackColor);
WiredHome 1:dd07e1deec6c 396 lcd->cls(2);
WiredHome 1:dd07e1deec6c 397 lcd->SelectDrawingLayer(1);
WiredHome 1:dd07e1deec6c 398 lcd->SetLayerMode(RA8875::ShowLayer1);
WiredHome 1:dd07e1deec6c 399 lcd->foreground(UI_ProductNameColor);
WiredHome 3:d22f3e52d06a 400 ShowProductInfo(true);
WiredHome 3:d22f3e52d06a 401 ShowCyclesControl();
WiredHome 1:dd07e1deec6c 402 ShowBrightnessSetting();
WiredHome 2:8f71b71fce1b 403 DrawNavGadget();
WiredHome 1:dd07e1deec6c 404 break;
WiredHome 1:dd07e1deec6c 405 }
WiredHome 1:dd07e1deec6c 406 }
WiredHome 1:dd07e1deec6c 407
WiredHome 5:49dd0c647a40 408 // rect_t radio_Cycles[], radio_CyclesCount, char * PulseModeLabels[]
WiredHome 3:d22f3e52d06a 409
WiredHome 3:d22f3e52d06a 410 void SignalGenDisplay::ShowCyclesControl(void) {
WiredHome 3:d22f3e52d06a 411 lcd->fillrect(SignalMode, UI_CyclesBackColor);
WiredHome 3:d22f3e52d06a 412 lcd->foreground(UI_CyclesColor);
WiredHome 3:d22f3e52d06a 413 lcd->background(UI_CyclesBackColor);
WiredHome 3:d22f3e52d06a 414 lcd->SetTextCursor(SignalMode.p1.x+1, SignalMode.p1.y+1);
WiredHome 3:d22f3e52d06a 415 lcd->printf("%s", SignalModeLabel);
WiredHome 3:d22f3e52d06a 416 for (int x=0; x<radio_CyclesCount; x++) {
WiredHome 3:d22f3e52d06a 417 lcd->fillrect(radio_Cycles[x], UI_CyclesBackColor);
WiredHome 3:d22f3e52d06a 418 lcd->foreground(UI_CyclesColor);
WiredHome 3:d22f3e52d06a 419 lcd->background(UI_CyclesBackColor);
WiredHome 3:d22f3e52d06a 420 lcd->SetTextCursor(radio_Cycles[x].p1.x+1,radio_Cycles[x].p1.y+1);
WiredHome 5:49dd0c647a40 421 lcd->printf("%c %s", (pulseMode == x) ? '\x07' : '\x09', PulseModeLabels[x]);
WiredHome 3:d22f3e52d06a 422 }
WiredHome 3:d22f3e52d06a 423 }
WiredHome 3:d22f3e52d06a 424
WiredHome 2:8f71b71fce1b 425
WiredHome 2:8f71b71fce1b 426 void SignalGenDisplay::DrawModeButtons(void) {
WiredHome 2:8f71b71fce1b 427 for (int i=0; i<ModeCount; i++) {
WiredHome 2:8f71b71fce1b 428 DrawButton(ModeButtons[i], (UI_ModeList[i] == mode) ? true : false, UI_ModeList[i], true);
WiredHome 2:8f71b71fce1b 429 }
WiredHome 2:8f71b71fce1b 430 UpdateScope();
WiredHome 2:8f71b71fce1b 431 }
WiredHome 2:8f71b71fce1b 432
WiredHome 1:dd07e1deec6c 433 void SignalGenDisplay::DrawNavGadget(void) {
WiredHome 1:dd07e1deec6c 434 lcd->fillrect(NavToSettings, Black);
WiredHome 1:dd07e1deec6c 435 lcd->SetTextCursor(NavToSettings.p1.x+1, NavToSettings.p1.y+1);
WiredHome 1:dd07e1deec6c 436 lcd->foreground(White);
WiredHome 1:dd07e1deec6c 437 lcd->background(Black);
WiredHome 1:dd07e1deec6c 438 lcd->puts(" ...");
WiredHome 1:dd07e1deec6c 439 }
WiredHome 1:dd07e1deec6c 440
WiredHome 1:dd07e1deec6c 441
WiredHome 3:d22f3e52d06a 442 void SignalGenDisplay::ShowProductInfo(bool builddate) {
WiredHome 1:dd07e1deec6c 443 rect_t r = UI_PROD_RECT;
WiredHome 1:dd07e1deec6c 444 lcd->window(r);
WiredHome 1:dd07e1deec6c 445 lcd->SetTextCursor(r.p1.x, r.p1.y);
WiredHome 1:dd07e1deec6c 446 lcd->printf("%s v%s", ProgName, Ver);
WiredHome 1:dd07e1deec6c 447 lcd->SetTextCursor(r.p1.x, r.p1.y+16);
WiredHome 1:dd07e1deec6c 448 lcd->printf("by %s", Manuf);
WiredHome 3:d22f3e52d06a 449 if (builddate) {
WiredHome 3:d22f3e52d06a 450 lcd->SetTextCursor(r.p1.x, r.p1.y+32);
WiredHome 3:d22f3e52d06a 451 lcd->printf("%s", Build);
WiredHome 3:d22f3e52d06a 452 }
WiredHome 1:dd07e1deec6c 453 lcd->window();
WiredHome 1:dd07e1deec6c 454 }
WiredHome 1:dd07e1deec6c 455
WiredHome 1:dd07e1deec6c 456 void SignalGenDisplay::ShowBrightnessSetting(void) {
WiredHome 3:d22f3e52d06a 457 int i;
WiredHome 1:dd07e1deec6c 458 // Sunbeam
WiredHome 1:dd07e1deec6c 459 lcd->fillrect(sunray[0], White);
WiredHome 1:dd07e1deec6c 460 lcd->fillrect(sunray[1], White);
WiredHome 3:d22f3e52d06a 461 for (i=-2; i<=+2; i++) {
WiredHome 3:d22f3e52d06a 462 lcd->line(
WiredHome 3:d22f3e52d06a 463 (sunray[0].p1.x + sunray[1].p1.x)/2 - 5 + i, (sunray[0].p1.y + sunray[1].p1.y)/2 - 5 - i,
WiredHome 3:d22f3e52d06a 464 (sunray[0].p2.x + sunray[1].p2.x)/2 + 5 + i, (sunray[0].p2.y + sunray[1].p2.y)/2 + 5 - i,
WiredHome 3:d22f3e52d06a 465 White);
WiredHome 3:d22f3e52d06a 466 lcd->line(
WiredHome 3:d22f3e52d06a 467 (sunray[0].p2.x + sunray[1].p1.x)/2 - 5 + i, (sunray[0].p2.y + sunray[1].p1.y)/2 + 5 + i,
WiredHome 3:d22f3e52d06a 468 (sunray[0].p1.x + sunray[1].p2.x)/2 + 5 + i, (sunray[0].p1.y + sunray[1].p2.y)/2 - 5 + i,
WiredHome 3:d22f3e52d06a 469 White);
WiredHome 3:d22f3e52d06a 470 }
WiredHome 1:dd07e1deec6c 471 lcd->fillcircle(suncenter, 18, UI_BackColor);
WiredHome 3:d22f3e52d06a 472 lcd->fillcircle(suncenter, 12, White);
WiredHome 1:dd07e1deec6c 473 lcd->rect(sungraph, Blue);
WiredHome 1:dd07e1deec6c 474 float bl = lcd->GetBacklight();
WiredHome 1:dd07e1deec6c 475 lcd->fillrect(inrgraph, UI_BackColor);
WiredHome 1:dd07e1deec6c 476 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 477 }
WiredHome 1:dd07e1deec6c 478
WiredHome 2:8f71b71fce1b 479 void SignalGenDisplay::ShowMenu(void) {
WiredHome 2:8f71b71fce1b 480 if (Manuf) {
WiredHome 2:8f71b71fce1b 481 printf("\r\n%s v%s by %s build %s\r\n\r\n", ProgName, Ver, Manuf, Build);
WiredHome 2:8f71b71fce1b 482 }
WiredHome 2:8f71b71fce1b 483 printf(" Select: Signal:\r\n");
WiredHome 2:8f71b71fce1b 484 printf(" S: Sine Wave d: Duty Cycle\r\n");
WiredHome 2:8f71b71fce1b 485 printf(" Q: Square Wave f: Frequency\r\n");
WiredHome 2:8f71b71fce1b 486 printf(" T: Triangle Wave p: Period\r\n");
WiredHome 2:8f71b71fce1b 487 printf(" W: Sawtooth Wave v: Voltage\r\n");
WiredHome 2:8f71b71fce1b 488 printf(" U: User Wave o: Offset\r\n");
WiredHome 2:8f71b71fce1b 489 printf(" \r\n");
WiredHome 2:8f71b71fce1b 490 printf(" 0-9 . - : Numeric entry\r\n");
WiredHome 2:8f71b71fce1b 491 printf(" < > : Modify selected signal\r\n");
WiredHome 2:8f71b71fce1b 492 printf(" <bs>: Backspace entry\r\n");
WiredHome 2:8f71b71fce1b 493 printf(" ?: This help <cr>: Save number\r\n");
WiredHome 2:8f71b71fce1b 494 printf(" #: Dump RA8875 <esc>: Exit number entry\r\n");
WiredHome 2:8f71b71fce1b 495 //printf(" 4: Reverse sawtoothSignal\r\n");
WiredHome 4:10281ddb673d 496
WiredHome 4:10281ddb673d 497 printf(" Settings:\r\n");
WiredHome 4:10281ddb673d 498 printf(" Mode: %d - %s\r\n", mode, ModeNames[mode]);
WiredHome 4:10281ddb673d 499 printf(" Freq: %f\r\n", frequency);
WiredHome 4:10281ddb673d 500 printf(" Duty: %f\r\n", dutycycle);
WiredHome 4:10281ddb673d 501 printf(" Volt: %f\r\n", voltage);
WiredHome 4:10281ddb673d 502 printf(" Offs: %f\r\n", offset);
WiredHome 5:49dd0c647a40 503 printf(" Puls: %d - %s\r\n", pulseMode, PulseModeLabels[pulseMode]);
WiredHome 2:8f71b71fce1b 504 }
WiredHome 2:8f71b71fce1b 505
WiredHome 2:8f71b71fce1b 506 SignalGenDisplay::OM_Changes SignalGenDisplay::Poll(char c) {
WiredHome 2:8f71b71fce1b 507 OM_Changes ret = OM_NONE;
WiredHome 1:dd07e1deec6c 508
WiredHome 3:d22f3e52d06a 509 if (needsInit)
WiredHome 3:d22f3e52d06a 510 Refresh(); // If Poll was the first API call, we need to init
WiredHome 2:8f71b71fce1b 511 SaveSettings();
WiredHome 1:dd07e1deec6c 512 if (!c) {
WiredHome 1:dd07e1deec6c 513 c = GetTouchEvent();
WiredHome 1:dd07e1deec6c 514 }
WiredHome 1:dd07e1deec6c 515 if (c) {
WiredHome 1:dd07e1deec6c 516 printf("%02X: EntryMd: %d, textLen: %d [%s] VIS: %d\r\n", c, EntryMd, textLen, textBuffer, vis);
WiredHome 3:d22f3e52d06a 517 }
WiredHome 3:d22f3e52d06a 518 /// 01234567890-. #?SQTW dfpvo < > <bs> <enter> <esc>
WiredHome 1:dd07e1deec6c 519 switch (c) {
WiredHome 2:8f71b71fce1b 520 case '#':
WiredHome 3:d22f3e52d06a 521 printf("DumpRegisters for RA8875 unsupported\r\n");
WiredHome 3:d22f3e52d06a 522 //lcd->DumpRegisters();
WiredHome 2:8f71b71fce1b 523 break;
WiredHome 1:dd07e1deec6c 524 case '?':
WiredHome 1:dd07e1deec6c 525 ShowMenu();
WiredHome 1:dd07e1deec6c 526 break;
WiredHome 3:d22f3e52d06a 527 case 'G': // Go is 'Start'
WiredHome 3:d22f3e52d06a 528 signal->Start(false);
WiredHome 3:d22f3e52d06a 529 ShowStartStop(true);
WiredHome 3:d22f3e52d06a 530 break;
WiredHome 3:d22f3e52d06a 531 case 'O': // Off
WiredHome 3:d22f3e52d06a 532 signal->Stop();
WiredHome 3:d22f3e52d06a 533 ShowStartStop(true);
WiredHome 3:d22f3e52d06a 534 break;
WiredHome 3:d22f3e52d06a 535 case 'P': // 'P'ulse
WiredHome 3:d22f3e52d06a 536 signal->Start(true);
WiredHome 3:d22f3e52d06a 537 ShowStartStop(true);
WiredHome 3:d22f3e52d06a 538 break;
WiredHome 1:dd07e1deec6c 539 case 'S':
WiredHome 2:8f71b71fce1b 540 if (mode != SG_SINE)
WiredHome 2:8f71b71fce1b 541 SaveSettings(OM_MODE);
WiredHome 2:8f71b71fce1b 542 SetWaveformMode(SG_SINE);
WiredHome 2:8f71b71fce1b 543 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 1:dd07e1deec6c 544 //ret = SG_SINE;
WiredHome 1:dd07e1deec6c 545 break;
WiredHome 1:dd07e1deec6c 546 case 'Q':
WiredHome 2:8f71b71fce1b 547 if (mode != SG_SQUARE)
WiredHome 2:8f71b71fce1b 548 SaveSettings(OM_MODE);
WiredHome 2:8f71b71fce1b 549 SetWaveformMode(SG_SQUARE);
WiredHome 2:8f71b71fce1b 550 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 1:dd07e1deec6c 551 //ret = SG_SQUARE;
WiredHome 1:dd07e1deec6c 552 break;
WiredHome 1:dd07e1deec6c 553 case 'T':
WiredHome 2:8f71b71fce1b 554 if (mode != SG_TRIANGLE)
WiredHome 2:8f71b71fce1b 555 SaveSettings(OM_MODE);
WiredHome 2:8f71b71fce1b 556 SetWaveformMode(SG_TRIANGLE);
WiredHome 2:8f71b71fce1b 557 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 1:dd07e1deec6c 558 //ret = SG_TRIANGLE;
WiredHome 1:dd07e1deec6c 559 break;
WiredHome 1:dd07e1deec6c 560 case 'W':
WiredHome 2:8f71b71fce1b 561 if (mode != SG_SAWTOOTH)
WiredHome 2:8f71b71fce1b 562 SaveSettings(OM_MODE);
WiredHome 2:8f71b71fce1b 563 SetWaveformMode(SG_SAWTOOTH);
WiredHome 2:8f71b71fce1b 564 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 1:dd07e1deec6c 565 //ret = SG_SAWTOOTH;
WiredHome 1:dd07e1deec6c 566 break;
WiredHome 1:dd07e1deec6c 567 case 'U':
WiredHome 2:8f71b71fce1b 568 if (mode != SG_USER)
WiredHome 2:8f71b71fce1b 569 SaveSettings(OM_MODE);
WiredHome 2:8f71b71fce1b 570 SetWaveformMode(SG_USER);
WiredHome 2:8f71b71fce1b 571 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 1:dd07e1deec6c 572 //ret = SG_USER;
WiredHome 1:dd07e1deec6c 573 break;
WiredHome 1:dd07e1deec6c 574 case '0':
WiredHome 1:dd07e1deec6c 575 case '1':
WiredHome 1:dd07e1deec6c 576 case '2':
WiredHome 1:dd07e1deec6c 577 case '3':
WiredHome 1:dd07e1deec6c 578 case '4':
WiredHome 1:dd07e1deec6c 579 case '5':
WiredHome 1:dd07e1deec6c 580 case '6':
WiredHome 1:dd07e1deec6c 581 case '7':
WiredHome 1:dd07e1deec6c 582 case '8':
WiredHome 1:dd07e1deec6c 583 case '9':
WiredHome 1:dd07e1deec6c 584 case '.':
WiredHome 1:dd07e1deec6c 585 case '-':
WiredHome 1:dd07e1deec6c 586 if (EntryMd) {
WiredHome 1:dd07e1deec6c 587 if (textLen<8) {
WiredHome 1:dd07e1deec6c 588 textBuffer[textLen++] = c;
WiredHome 1:dd07e1deec6c 589 textBuffer[textLen] = '\0';
WiredHome 1:dd07e1deec6c 590 updateTextWindow();
WiredHome 1:dd07e1deec6c 591 }
WiredHome 1:dd07e1deec6c 592 }
WiredHome 1:dd07e1deec6c 593 break;
WiredHome 1:dd07e1deec6c 594 case '\x08':
WiredHome 1:dd07e1deec6c 595 if (EntryMd) {
WiredHome 1:dd07e1deec6c 596 if (textLen) {
WiredHome 1:dd07e1deec6c 597 textLen--;
WiredHome 1:dd07e1deec6c 598 textBuffer[textLen] = '\0';
WiredHome 1:dd07e1deec6c 599 updateTextWindow();
WiredHome 1:dd07e1deec6c 600 }
WiredHome 2:8f71b71fce1b 601 if (textLen == 0)
WiredHome 2:8f71b71fce1b 602 clearTextWindow();
WiredHome 1:dd07e1deec6c 603 }
WiredHome 1:dd07e1deec6c 604 break;
WiredHome 1:dd07e1deec6c 605 case '\x1B':
WiredHome 1:dd07e1deec6c 606 textBuffer[0] = '\0';
WiredHome 1:dd07e1deec6c 607 textLen = 0;
WiredHome 1:dd07e1deec6c 608 resetDataEntry();
WiredHome 1:dd07e1deec6c 609 break;
WiredHome 1:dd07e1deec6c 610 case '\r':
WiredHome 1:dd07e1deec6c 611 case '\n':
WiredHome 1:dd07e1deec6c 612 if (EntryMd) {
WiredHome 1:dd07e1deec6c 613 if (strlen(textBuffer)) {
WiredHome 1:dd07e1deec6c 614 switch (EntryMd) {
WiredHome 2:8f71b71fce1b 615 case OM_DUTY:
WiredHome 1:dd07e1deec6c 616 SetDutyCycle(atof(textBuffer));
WiredHome 2:8f71b71fce1b 617 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 2:8f71b71fce1b 618 SaveSettings(OM_DUTY);
WiredHome 1:dd07e1deec6c 619 break;
WiredHome 2:8f71b71fce1b 620 case OM_FREQ:
WiredHome 1:dd07e1deec6c 621 SetFrequency(atof(textBuffer));
WiredHome 2:8f71b71fce1b 622 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 2:8f71b71fce1b 623 SaveSettings(OM_FREQ);
WiredHome 1:dd07e1deec6c 624 break;
WiredHome 2:8f71b71fce1b 625 case OM_PERI:
WiredHome 1:dd07e1deec6c 626 SetPeriod(atof(textBuffer));
WiredHome 2:8f71b71fce1b 627 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 2:8f71b71fce1b 628 SaveSettings(OM_FREQ);
WiredHome 1:dd07e1deec6c 629 break;
WiredHome 2:8f71b71fce1b 630 case OM_VOLT:
WiredHome 1:dd07e1deec6c 631 SetVoltagePeakToPeak(atof(textBuffer));
WiredHome 2:8f71b71fce1b 632 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 2:8f71b71fce1b 633 SaveSettings(OM_VOLT);
WiredHome 1:dd07e1deec6c 634 break;
WiredHome 2:8f71b71fce1b 635 case OM_OFFS:
WiredHome 1:dd07e1deec6c 636 SetVoltageOffset(atof(textBuffer));
WiredHome 2:8f71b71fce1b 637 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 2:8f71b71fce1b 638 SaveSettings(OM_OFFS);
WiredHome 1:dd07e1deec6c 639 break;
WiredHome 1:dd07e1deec6c 640 default:
WiredHome 1:dd07e1deec6c 641 break;
WiredHome 1:dd07e1deec6c 642 }
WiredHome 1:dd07e1deec6c 643 }
WiredHome 2:8f71b71fce1b 644 resetDataEntry(OM_NONE, true);
WiredHome 1:dd07e1deec6c 645 }
WiredHome 1:dd07e1deec6c 646 break;
WiredHome 1:dd07e1deec6c 647 case '>':
WiredHome 1:dd07e1deec6c 648 switch (EntryMd) {
WiredHome 2:8f71b71fce1b 649 case OM_DUTY:
WiredHome 1:dd07e1deec6c 650 SetDutyCycle(dutycycle + 1.0);
WiredHome 2:8f71b71fce1b 651 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 2:8f71b71fce1b 652 SaveSettings(OM_DUTY);
WiredHome 1:dd07e1deec6c 653 break;
WiredHome 2:8f71b71fce1b 654 case OM_FREQ:
WiredHome 1:dd07e1deec6c 655 SetFrequency(frequency + 1.0);
WiredHome 2:8f71b71fce1b 656 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 2:8f71b71fce1b 657 SaveSettings(OM_FREQ);
WiredHome 1:dd07e1deec6c 658 break;
WiredHome 2:8f71b71fce1b 659 case OM_PERI:
WiredHome 2:8f71b71fce1b 660 SetPeriod(1/frequency + 0.000001);
WiredHome 2:8f71b71fce1b 661 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 2:8f71b71fce1b 662 SaveSettings(OM_FREQ);
WiredHome 1:dd07e1deec6c 663 break;
WiredHome 2:8f71b71fce1b 664 case OM_VOLT:
WiredHome 1:dd07e1deec6c 665 SetVoltagePeakToPeak(voltage + 0.1);
WiredHome 2:8f71b71fce1b 666 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 2:8f71b71fce1b 667 SaveSettings(OM_VOLT);
WiredHome 1:dd07e1deec6c 668 break;
WiredHome 2:8f71b71fce1b 669 case OM_OFFS:
WiredHome 2:8f71b71fce1b 670 SetVoltageOffset(offset + 0.1);
WiredHome 2:8f71b71fce1b 671 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 2:8f71b71fce1b 672 SaveSettings(OM_OFFS);
WiredHome 1:dd07e1deec6c 673 break;
WiredHome 1:dd07e1deec6c 674 default:
WiredHome 1:dd07e1deec6c 675 break;
WiredHome 1:dd07e1deec6c 676 }
WiredHome 1:dd07e1deec6c 677 break;
WiredHome 1:dd07e1deec6c 678 case '<':
WiredHome 1:dd07e1deec6c 679 switch (EntryMd) {
WiredHome 2:8f71b71fce1b 680 case OM_DUTY:
WiredHome 1:dd07e1deec6c 681 SetDutyCycle(dutycycle - 1.0);
WiredHome 2:8f71b71fce1b 682 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 2:8f71b71fce1b 683 SaveSettings(OM_DUTY);
WiredHome 1:dd07e1deec6c 684 break;
WiredHome 2:8f71b71fce1b 685 case OM_FREQ:
WiredHome 1:dd07e1deec6c 686 SetFrequency(frequency - 1.0);
WiredHome 2:8f71b71fce1b 687 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 2:8f71b71fce1b 688 SaveSettings(OM_FREQ);
WiredHome 1:dd07e1deec6c 689 break;
WiredHome 2:8f71b71fce1b 690 case OM_PERI:
WiredHome 2:8f71b71fce1b 691 SetPeriod(1/frequency - 0.000001);
WiredHome 2:8f71b71fce1b 692 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 2:8f71b71fce1b 693 SaveSettings(OM_FREQ);
WiredHome 1:dd07e1deec6c 694 break;
WiredHome 2:8f71b71fce1b 695 case OM_VOLT:
WiredHome 1:dd07e1deec6c 696 SetVoltagePeakToPeak(voltage - 0.1);
WiredHome 2:8f71b71fce1b 697 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 2:8f71b71fce1b 698 SaveSettings(OM_VOLT);
WiredHome 1:dd07e1deec6c 699 break;
WiredHome 2:8f71b71fce1b 700 case OM_OFFS:
WiredHome 2:8f71b71fce1b 701 SetVoltageOffset(offset - 0.1);
WiredHome 2:8f71b71fce1b 702 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 2:8f71b71fce1b 703 SaveSettings(OM_OFFS);
WiredHome 1:dd07e1deec6c 704 break;
WiredHome 1:dd07e1deec6c 705 default:
WiredHome 1:dd07e1deec6c 706 break;
WiredHome 1:dd07e1deec6c 707 }
WiredHome 1:dd07e1deec6c 708 break;
WiredHome 1:dd07e1deec6c 709 case 'd':
WiredHome 2:8f71b71fce1b 710 if (EntryMd != OM_DUTY) {
WiredHome 2:8f71b71fce1b 711 SaveSettings(EntryMd);
WiredHome 2:8f71b71fce1b 712 resetDataEntry(OM_DUTY, true);
WiredHome 1:dd07e1deec6c 713 updateDutyCycle();
WiredHome 2:8f71b71fce1b 714 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 1:dd07e1deec6c 715 } else {
WiredHome 2:8f71b71fce1b 716 resetDataEntry(OM_NONE, true);
WiredHome 1:dd07e1deec6c 717 }
WiredHome 1:dd07e1deec6c 718 break;
WiredHome 1:dd07e1deec6c 719 case 'f':
WiredHome 2:8f71b71fce1b 720 if (EntryMd != OM_FREQ) {
WiredHome 2:8f71b71fce1b 721 SaveSettings(EntryMd);
WiredHome 2:8f71b71fce1b 722 resetDataEntry(OM_FREQ, true);
WiredHome 1:dd07e1deec6c 723 updateFrequency();
WiredHome 2:8f71b71fce1b 724 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 1:dd07e1deec6c 725 } else {
WiredHome 2:8f71b71fce1b 726 resetDataEntry(OM_NONE, true);
WiredHome 1:dd07e1deec6c 727 }
WiredHome 1:dd07e1deec6c 728 break;
WiredHome 1:dd07e1deec6c 729 case 'p':
WiredHome 2:8f71b71fce1b 730 if (EntryMd != OM_PERI) {
WiredHome 2:8f71b71fce1b 731 SaveSettings(EntryMd);
WiredHome 2:8f71b71fce1b 732 resetDataEntry(OM_PERI, true);
WiredHome 1:dd07e1deec6c 733 updatePeriod();
WiredHome 2:8f71b71fce1b 734 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 1:dd07e1deec6c 735 } else {
WiredHome 2:8f71b71fce1b 736 resetDataEntry(OM_NONE, true);
WiredHome 1:dd07e1deec6c 737 }
WiredHome 1:dd07e1deec6c 738 break;
WiredHome 1:dd07e1deec6c 739 case 'v':
WiredHome 2:8f71b71fce1b 740 if (EntryMd != OM_VOLT) {
WiredHome 2:8f71b71fce1b 741 SaveSettings(EntryMd);
WiredHome 2:8f71b71fce1b 742 resetDataEntry(OM_VOLT, true);
WiredHome 1:dd07e1deec6c 743 updateVoltage();
WiredHome 2:8f71b71fce1b 744 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 1:dd07e1deec6c 745 } else {
WiredHome 2:8f71b71fce1b 746 resetDataEntry(OM_NONE, true);
WiredHome 1:dd07e1deec6c 747 }
WiredHome 1:dd07e1deec6c 748 break;
WiredHome 1:dd07e1deec6c 749 case 'o':
WiredHome 2:8f71b71fce1b 750 if (EntryMd != OM_OFFS) {
WiredHome 2:8f71b71fce1b 751 SaveSettings(EntryMd);
WiredHome 2:8f71b71fce1b 752 resetDataEntry(OM_OFFS, true);
WiredHome 1:dd07e1deec6c 753 updateOffset();
WiredHome 2:8f71b71fce1b 754 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 1:dd07e1deec6c 755 } else {
WiredHome 2:8f71b71fce1b 756 resetDataEntry(OM_NONE, true);
WiredHome 1:dd07e1deec6c 757 }
WiredHome 1:dd07e1deec6c 758 break;
WiredHome 1:dd07e1deec6c 759 default:
WiredHome 1:dd07e1deec6c 760 break;
WiredHome 1:dd07e1deec6c 761 }
WiredHome 1:dd07e1deec6c 762 return ret;
WiredHome 1:dd07e1deec6c 763 }
WiredHome 1:dd07e1deec6c 764
WiredHome 6:1f48212fbaf9 765 bool SignalGenDisplay::SetWaveformMode(SG_Waveform _mode, bool force) {
WiredHome 1:dd07e1deec6c 766 if (/* _mode >= SG_SINE && */ _mode <= SG_USER) {
WiredHome 2:8f71b71fce1b 767 mode = _mode;
WiredHome 4:10281ddb673d 768 printf("mode is %d\r\n", mode);
WiredHome 2:8f71b71fce1b 769 DrawModeButtons();
WiredHome 1:dd07e1deec6c 770 return true;
WiredHome 1:dd07e1deec6c 771 } else {
WiredHome 1:dd07e1deec6c 772 return false;
WiredHome 1:dd07e1deec6c 773 }
WiredHome 1:dd07e1deec6c 774 }
WiredHome 1:dd07e1deec6c 775
WiredHome 1:dd07e1deec6c 776 bool SignalGenDisplay::SetDutyCycle(float _dutyCycle) {
WiredHome 1:dd07e1deec6c 777 if (_dutyCycle >= 5 && _dutyCycle <= 95) {
WiredHome 1:dd07e1deec6c 778 dutycycle = _dutyCycle;
WiredHome 1:dd07e1deec6c 779 updateDutyCycle();
WiredHome 1:dd07e1deec6c 780 UpdateScope();
WiredHome 1:dd07e1deec6c 781 return true;
WiredHome 1:dd07e1deec6c 782 } else {
WiredHome 1:dd07e1deec6c 783 return false;
WiredHome 1:dd07e1deec6c 784 }
WiredHome 1:dd07e1deec6c 785 }
WiredHome 1:dd07e1deec6c 786
WiredHome 1:dd07e1deec6c 787 bool SignalGenDisplay::SetFrequency(float _frequency) {
WiredHome 1:dd07e1deec6c 788 if (_frequency >= 1.0 && _frequency <= 1.0E6) {
WiredHome 1:dd07e1deec6c 789 frequency = _frequency;
WiredHome 1:dd07e1deec6c 790 updateFrequency();
WiredHome 1:dd07e1deec6c 791 updatePeriod();
WiredHome 1:dd07e1deec6c 792 UpdateScope();
WiredHome 1:dd07e1deec6c 793 return true;
WiredHome 1:dd07e1deec6c 794 } else {
WiredHome 1:dd07e1deec6c 795 return false;
WiredHome 1:dd07e1deec6c 796 }
WiredHome 1:dd07e1deec6c 797 }
WiredHome 1:dd07e1deec6c 798
WiredHome 1:dd07e1deec6c 799 bool SignalGenDisplay::SetPeriod(float _period) {
WiredHome 1:dd07e1deec6c 800 if (_period >= 1.0E-6 && _period <= 1.0) {
WiredHome 1:dd07e1deec6c 801 frequency = 1/_period;
WiredHome 1:dd07e1deec6c 802 updatePeriod();
WiredHome 1:dd07e1deec6c 803 updateFrequency();
WiredHome 1:dd07e1deec6c 804 UpdateScope();
WiredHome 1:dd07e1deec6c 805 return true;
WiredHome 1:dd07e1deec6c 806 } else {
WiredHome 1:dd07e1deec6c 807 return false;
WiredHome 1:dd07e1deec6c 808 }
WiredHome 1:dd07e1deec6c 809 }
WiredHome 1:dd07e1deec6c 810
WiredHome 1:dd07e1deec6c 811 bool SignalGenDisplay::SetVoltagePeakToPeak(float _voltage) {
WiredHome 1:dd07e1deec6c 812 if (_voltage >= 0.0 && _voltage <= 3.3) {
WiredHome 1:dd07e1deec6c 813 voltage = _voltage;
WiredHome 1:dd07e1deec6c 814 updateVoltage();
WiredHome 1:dd07e1deec6c 815 UpdateScope();
WiredHome 1:dd07e1deec6c 816 return true;
WiredHome 1:dd07e1deec6c 817 } else {
WiredHome 1:dd07e1deec6c 818 return false;
WiredHome 1:dd07e1deec6c 819 }
WiredHome 1:dd07e1deec6c 820 }
WiredHome 1:dd07e1deec6c 821
WiredHome 1:dd07e1deec6c 822 bool SignalGenDisplay::SetVoltageOffset(float _voltage) {
WiredHome 3:d22f3e52d06a 823 if (_voltage > -SG_MAX_V && _voltage < SG_MAX_V) {
WiredHome 1:dd07e1deec6c 824 if (abs(_voltage) < 0.008) // if binary precision slips it, fix it
WiredHome 1:dd07e1deec6c 825 _voltage = 0.0;
WiredHome 1:dd07e1deec6c 826 offset = _voltage;
WiredHome 1:dd07e1deec6c 827 updateOffset();
WiredHome 1:dd07e1deec6c 828 UpdateScope();
WiredHome 1:dd07e1deec6c 829 return true;
WiredHome 1:dd07e1deec6c 830 } else {
WiredHome 1:dd07e1deec6c 831 return false;
WiredHome 1:dd07e1deec6c 832 }
WiredHome 1:dd07e1deec6c 833 }
WiredHome 1:dd07e1deec6c 834
WiredHome 1:dd07e1deec6c 835 // ######################## Private Methods past here #######################
WiredHome 1:dd07e1deec6c 836
WiredHome 1:dd07e1deec6c 837 void SignalGenDisplay::UpdateScope(void) {
WiredHome 1:dd07e1deec6c 838 ClearScope();
WiredHome 2:8f71b71fce1b 839 rect_t r = UI_WAVE_RECT;
WiredHome 1:dd07e1deec6c 840
WiredHome 2:8f71b71fce1b 841 float vPeakPos, vPeakNeg;
WiredHome 2:8f71b71fce1b 842 dim_t waveHeight = (UI_WAVE_RECT.p2.y - UI_WAVE_RECT.p1.y);
WiredHome 2:8f71b71fce1b 843 vPeakPos = rangelimit(offset + voltage/2, SG_MIN_V, SG_MAX_V);
WiredHome 2:8f71b71fce1b 844 vPeakNeg = rangelimit(offset - voltage/2, SG_MIN_V, SG_MAX_V);
WiredHome 2:8f71b71fce1b 845 loc_t markerPos_y = UI_WAVE_RECT.p2.y - vPeakPos/(SG_MAX_V-SG_MIN_V) * waveHeight;
WiredHome 2:8f71b71fce1b 846 loc_t markerNeg_y = UI_WAVE_RECT.p2.y - vPeakNeg/(SG_MAX_V-SG_MIN_V) * waveHeight;
WiredHome 2:8f71b71fce1b 847 loc_t df = rangelimit(offset, SG_MIN_V, SG_MAX_V) / SG_MAX_V * (r.p2.y - r.p1.y);
WiredHome 2:8f71b71fce1b 848 loc_t y;
WiredHome 2:8f71b71fce1b 849
WiredHome 3:d22f3e52d06a 850 lcd->SelectUserFont(BPG_Arial08x08);
WiredHome 3:d22f3e52d06a 851 lcd->background(UI_ScopeBackColor);
WiredHome 2:8f71b71fce1b 852 // Draw the Waveform rectangle
WiredHome 2:8f71b71fce1b 853 lcd->rect(UI_WAVE_RECT, WaveOutlineColor);
WiredHome 1:dd07e1deec6c 854
WiredHome 1:dd07e1deec6c 855 // Draw the Peak to Peak markers
WiredHome 2:8f71b71fce1b 856 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 857 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 858 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 859 lcd->filltriangle( // top arrowhead
WiredHome 2:8f71b71fce1b 860 r.p2.x+3*SC_RIGHT_MARGIN/4-3, markerPos_y,
WiredHome 2:8f71b71fce1b 861 r.p2.x+3*SC_RIGHT_MARGIN/4-3+2,markerPos_y+3,
WiredHome 2:8f71b71fce1b 862 r.p2.x+3*SC_RIGHT_MARGIN/4-3-2,markerPos_y+3,
WiredHome 1:dd07e1deec6c 863 UI_VP2PColor);
WiredHome 2:8f71b71fce1b 864 lcd->filltriangle( // bottom arrowhead
WiredHome 2:8f71b71fce1b 865 r.p2.x+3*SC_RIGHT_MARGIN/4-3, markerNeg_y,
WiredHome 2:8f71b71fce1b 866 r.p2.x+3*SC_RIGHT_MARGIN/4-3+2,markerNeg_y-3,
WiredHome 2:8f71b71fce1b 867 r.p2.x+3*SC_RIGHT_MARGIN/4-3-2,markerNeg_y-3,
WiredHome 1:dd07e1deec6c 868 UI_VP2PColor);
WiredHome 3:d22f3e52d06a 869 lcd->SetTextCursor(r.p2.x+3*SC_RIGHT_MARGIN/4-3 - 10, markerPos_y - 9);
WiredHome 3:d22f3e52d06a 870 lcd->printf("%3.2f", vPeakPos);
WiredHome 3:d22f3e52d06a 871 lcd->SetTextCursor(r.p2.x+3*SC_RIGHT_MARGIN/4-3 - 10, markerNeg_y + 3);
WiredHome 3:d22f3e52d06a 872 lcd->printf("%3.2f", vPeakNeg);
WiredHome 1:dd07e1deec6c 873
WiredHome 1:dd07e1deec6c 874 // Draw the offset voltage markers
WiredHome 2:8f71b71fce1b 875 y = r.p2.y - df;
WiredHome 1:dd07e1deec6c 876 dim_t w = (r.p2.x + SC_RIGHT_MARGIN/3 - r.p1.x) / 35;
WiredHome 2:8f71b71fce1b 877 for (int i=0; i<=35+1; i++) { // dashed line
WiredHome 1:dd07e1deec6c 878 if ((i & 1) == 0) {
WiredHome 1:dd07e1deec6c 879 lcd->line(r.p1.x + i * w,y, r.p1.x + (i+1) * w, y, UI_VOffsetColor);
WiredHome 1:dd07e1deec6c 880 }
WiredHome 1:dd07e1deec6c 881 }
WiredHome 1:dd07e1deec6c 882 switch (sgn(offset)) {
WiredHome 1:dd07e1deec6c 883 default:
WiredHome 1:dd07e1deec6c 884 case 0:
WiredHome 1:dd07e1deec6c 885 break;
WiredHome 1:dd07e1deec6c 886 case -1:
WiredHome 1:dd07e1deec6c 887 case 1:
WiredHome 2:8f71b71fce1b 888 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 889 lcd->filltriangle(
WiredHome 1:dd07e1deec6c 890 r.p2.x+SC_RIGHT_MARGIN/3-3,y,
WiredHome 1:dd07e1deec6c 891 r.p2.x+SC_RIGHT_MARGIN/3-3+2,y+sgn(offset)*3,
WiredHome 1:dd07e1deec6c 892 r.p2.x+SC_RIGHT_MARGIN/3-3-2,y+sgn(offset)*3,
WiredHome 1:dd07e1deec6c 893 UI_VOffsetColor);
WiredHome 2:8f71b71fce1b 894 lcd->line(r.p2.x,r.p2.y, r.p2.x+SC_RIGHT_MARGIN/3,r.p2.y, UI_VOffsetColor); // horz
WiredHome 1:dd07e1deec6c 895 break;
WiredHome 1:dd07e1deec6c 896 }
WiredHome 3:d22f3e52d06a 897 lcd->SetTextCursor(r.p2.x+SC_RIGHT_MARGIN/3-3 - 8, y - 10);
WiredHome 3:d22f3e52d06a 898 lcd->printf("%3.2f", offset);
WiredHome 3:d22f3e52d06a 899
WiredHome 1:dd07e1deec6c 900 // Draw the Frequency marker
WiredHome 1:dd07e1deec6c 901 w = r.p2.x - r.p1.x;
WiredHome 1:dd07e1deec6c 902 dim_t dc = dutycycle/100.0 * 1*w/2;
WiredHome 2:8f71b71fce1b 903 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 904 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 905 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 906 lcd->filltriangle(
WiredHome 1:dd07e1deec6c 907 r.p1.x+0,r.p2.y+3*SC_BOT_MARGIN/4-3,
WiredHome 1:dd07e1deec6c 908 r.p1.x+3,r.p2.y+3*SC_BOT_MARGIN/4-3-2,
WiredHome 1:dd07e1deec6c 909 r.p1.x+3,r.p2.y+3*SC_BOT_MARGIN/4-3+2,
WiredHome 1:dd07e1deec6c 910 UI_FreqColor);
WiredHome 1:dd07e1deec6c 911 lcd->filltriangle(
WiredHome 1:dd07e1deec6c 912 r.p1.x+1*w/2-0,r.p2.y+3*SC_BOT_MARGIN/4-3,
WiredHome 1:dd07e1deec6c 913 r.p1.x+1*w/2-3,r.p2.y+3*SC_BOT_MARGIN/4-3-2,
WiredHome 1:dd07e1deec6c 914 r.p1.x+1*w/2-3,r.p2.y+3*SC_BOT_MARGIN/4-3+2,
WiredHome 1:dd07e1deec6c 915 UI_FreqColor);
WiredHome 1:dd07e1deec6c 916
WiredHome 1:dd07e1deec6c 917 // Draw the Duty Cycle markers
WiredHome 2:8f71b71fce1b 918 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 919 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 920 point_t p;
WiredHome 1:dd07e1deec6c 921 p.x = r.p1.x;
WiredHome 1:dd07e1deec6c 922 p.y = r.p2.y+2*SC_BOT_MARGIN/4-3;
WiredHome 1:dd07e1deec6c 923 lcd->line(p.x,p.y, p.x+dc,p.y, UI_DutyColor);
WiredHome 1:dd07e1deec6c 924 lcd->filltriangle(
WiredHome 1:dd07e1deec6c 925 p.x,p.y,
WiredHome 1:dd07e1deec6c 926 p.x+3,p.y-2,
WiredHome 1:dd07e1deec6c 927 p.x+3,p.y+2,
WiredHome 1:dd07e1deec6c 928 UI_DutyColor);
WiredHome 1:dd07e1deec6c 929 p.x = r.p1.x + dc;
WiredHome 1:dd07e1deec6c 930 lcd->filltriangle(
WiredHome 1:dd07e1deec6c 931 p.x,p.y,
WiredHome 1:dd07e1deec6c 932 p.x-3,p.y-2,
WiredHome 1:dd07e1deec6c 933 p.x-3,p.y+2,
WiredHome 1:dd07e1deec6c 934 UI_DutyColor);
WiredHome 3:d22f3e52d06a 935 lcd->SetTextCursor(p.x + 3, p.y-4);
WiredHome 3:d22f3e52d06a 936 float period = dutycycle/100*1/frequency;
WiredHome 3:d22f3e52d06a 937 if (period < 0.001)
WiredHome 3:d22f3e52d06a 938 lcd->printf("%8.3f uS", period * 1000000);
WiredHome 3:d22f3e52d06a 939 else
WiredHome 3:d22f3e52d06a 940 lcd->printf("%8.3f mS", period * 1000);
WiredHome 3:d22f3e52d06a 941
WiredHome 3:d22f3e52d06a 942 lcd->SelectUserFont(); // restore
WiredHome 1:dd07e1deec6c 943 DrawWaveform(r, mode, White);
WiredHome 1:dd07e1deec6c 944 }
WiredHome 1:dd07e1deec6c 945
WiredHome 2:8f71b71fce1b 946
WiredHome 3:d22f3e52d06a 947 // ++ +----+ + +
WiredHome 3:d22f3e52d06a 948 // . . | | / \ / |
WiredHome 3:d22f3e52d06a 949 // . + | | | / + / + |
WiredHome 3:d22f3e52d06a 950 // . | | \ / / |
WiredHome 3:d22f3e52d06a 951 // ++ +----+ + + +
WiredHome 1:dd07e1deec6c 952 //
WiredHome 6:1f48212fbaf9 953 void SignalGenDisplay::DrawWaveform(rect_t r, SG_Waveform mode, color_t color, bool drawPure) {
WiredHome 1:dd07e1deec6c 954 loc_t x,y;
WiredHome 1:dd07e1deec6c 955 loc_t y0 = (r.p1.y + r.p2.y)/2;
WiredHome 1:dd07e1deec6c 956 dim_t w = r.p2.x - r.p1.x;
WiredHome 2:8f71b71fce1b 957 dim_t h = r.p2.y - r.p1.y;
WiredHome 2:8f71b71fce1b 958 dim_t privDutyCycleX;
WiredHome 1:dd07e1deec6c 959 dim_t a = (r.p2.y - r.p1.y)/2;
WiredHome 2:8f71b71fce1b 960 float privVoltage = voltage;
WiredHome 2:8f71b71fce1b 961 float privOffset = offset;
WiredHome 2:8f71b71fce1b 962 float privDutyCycle = dutycycle;
WiredHome 2:8f71b71fce1b 963 float vRange = SG_MAX_V - SG_MIN_V;
WiredHome 1:dd07e1deec6c 964 float v;
WiredHome 2:8f71b71fce1b 965
WiredHome 2:8f71b71fce1b 966 if (drawPure) {
WiredHome 2:8f71b71fce1b 967 privVoltage = vRange;
WiredHome 2:8f71b71fce1b 968 privOffset = vRange/2;
WiredHome 2:8f71b71fce1b 969 privDutyCycle = 50;
WiredHome 2:8f71b71fce1b 970 }
WiredHome 2:8f71b71fce1b 971 privDutyCycleX = privDutyCycle/100.0 * 1*w/2;
WiredHome 5:49dd0c647a40 972 int cyclesToShow = (pulseMode) ? 1 : 2;
WiredHome 1:dd07e1deec6c 973 switch (mode) {
WiredHome 1:dd07e1deec6c 974 case SG_SINE:
WiredHome 5:49dd0c647a40 975 for (int cycle=0; cycle<cyclesToShow; cycle++) {
WiredHome 2:8f71b71fce1b 976 for (x=0; x<=privDutyCycleX; x++) {
WiredHome 2:8f71b71fce1b 977 v = privOffset + privVoltage/2 * sin(x * 1 * PI / privDutyCycleX);
WiredHome 1:dd07e1deec6c 978 v = rangelimit(v, SG_MIN_V, SG_MAX_V);
WiredHome 2:8f71b71fce1b 979 y = r.p2.y - 2 * a * v / vRange;
WiredHome 1:dd07e1deec6c 980 lcd->pixel(r.p1.x + cycle * w/2 + x, y, color);
WiredHome 1:dd07e1deec6c 981 }
WiredHome 2:8f71b71fce1b 982 for (x=0; x<=(w/2-privDutyCycleX); x++) {
WiredHome 2:8f71b71fce1b 983 v = privOffset - privVoltage/2 * sin(x * 1 * PI / (w/2-privDutyCycleX));
WiredHome 1:dd07e1deec6c 984 v = rangelimit(v, SG_MIN_V, SG_MAX_V);
WiredHome 2:8f71b71fce1b 985 y = r.p2.y - 2 * a * v / vRange;
WiredHome 2:8f71b71fce1b 986 lcd->pixel(r.p1.x + cycle * w/2 + privDutyCycleX + x, y, color);
WiredHome 1:dd07e1deec6c 987 }
WiredHome 1:dd07e1deec6c 988 }
WiredHome 1:dd07e1deec6c 989 break;
WiredHome 1:dd07e1deec6c 990 case SG_SQUARE:
WiredHome 5:49dd0c647a40 991 for (int cycle=0; cycle<cyclesToShow; cycle++) {
WiredHome 2:8f71b71fce1b 992 loc_t mid = r.p2.y - rangelimit(privOffset, SG_MIN_V, SG_MAX_V) / vRange * h;
WiredHome 2:8f71b71fce1b 993 loc_t upp = r.p2.y - rangelimit(privOffset + privVoltage/2, SG_MIN_V, SG_MAX_V) / vRange * h;
WiredHome 2:8f71b71fce1b 994 loc_t low = r.p2.y - rangelimit(privOffset - privVoltage/2, SG_MIN_V, SG_MAX_V) / vRange * h;
WiredHome 2:8f71b71fce1b 995 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 996 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 997 lcd->line(r.p1.x+cycle*w/2+privDutyCycleX, upp, r.p1.x+cycle*w/2+privDutyCycleX, low, color); // fall
WiredHome 2:8f71b71fce1b 998 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 999 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 1000 }
WiredHome 1:dd07e1deec6c 1001 break;
WiredHome 1:dd07e1deec6c 1002 case SG_TRIANGLE:
WiredHome 5:49dd0c647a40 1003 for (int cycle=0; cycle<cyclesToShow; cycle++) {
WiredHome 3:d22f3e52d06a 1004 for (x=0; x<=privDutyCycleX; x++) {
WiredHome 3:d22f3e52d06a 1005 v = privVoltage * (float)x/privDutyCycleX;
WiredHome 3:d22f3e52d06a 1006 if (x < privDutyCycleX/2)
WiredHome 3:d22f3e52d06a 1007 v += privOffset;
WiredHome 3:d22f3e52d06a 1008 else
WiredHome 3:d22f3e52d06a 1009 v = privVoltage - (v - privOffset);
WiredHome 3:d22f3e52d06a 1010 y = r.p2.y - rangelimit(v, SG_MIN_V, SG_MAX_V) / vRange * h;
WiredHome 3:d22f3e52d06a 1011 lcd->pixel(r.p1.x + cycle * w/2 + x, y, color);
WiredHome 3:d22f3e52d06a 1012 }
WiredHome 3:d22f3e52d06a 1013 dim_t phaseWidth = (w/2 - privDutyCycleX);
WiredHome 3:d22f3e52d06a 1014 for (x=0; x<phaseWidth; x++) {
WiredHome 3:d22f3e52d06a 1015 v = privVoltage * (float)x/phaseWidth;
WiredHome 3:d22f3e52d06a 1016 if (x < phaseWidth/2)
WiredHome 3:d22f3e52d06a 1017 v = privOffset - v;
WiredHome 3:d22f3e52d06a 1018 else
WiredHome 3:d22f3e52d06a 1019 v = v + privOffset - privVoltage;
WiredHome 3:d22f3e52d06a 1020 y = r.p2.y - rangelimit(v, SG_MIN_V, SG_MAX_V) / vRange * h;
WiredHome 3:d22f3e52d06a 1021 lcd->pixel(r.p1.x + cycle * w/2 + privDutyCycleX + x, y, color);
WiredHome 3:d22f3e52d06a 1022 }
WiredHome 1:dd07e1deec6c 1023 }
WiredHome 1:dd07e1deec6c 1024 break;
WiredHome 1:dd07e1deec6c 1025 case SG_SAWTOOTH:
WiredHome 5:49dd0c647a40 1026 for (int cycle=0; cycle<cyclesToShow; cycle++) {
WiredHome 3:d22f3e52d06a 1027 for (x=0; x<=privDutyCycleX; x++) {
WiredHome 3:d22f3e52d06a 1028 v = privVoltage/2 * (float)x/privDutyCycleX - privVoltage/2 + privOffset;
WiredHome 3:d22f3e52d06a 1029 y = r.p2.y - rangelimit(v, SG_MIN_V, SG_MAX_V) / vRange * h;
WiredHome 3:d22f3e52d06a 1030 lcd->pixel(r.p1.x + cycle * w/2 + x, y, color);
WiredHome 3:d22f3e52d06a 1031 }
WiredHome 3:d22f3e52d06a 1032 dim_t phaseWidth = (w/2 - privDutyCycleX);
WiredHome 3:d22f3e52d06a 1033 for (x=0; x<phaseWidth; x++) {
WiredHome 3:d22f3e52d06a 1034 v = privVoltage/2 * (float)x/phaseWidth + privOffset;
WiredHome 3:d22f3e52d06a 1035 y = r.p2.y - rangelimit(v, SG_MIN_V, SG_MAX_V) / vRange * h;
WiredHome 3:d22f3e52d06a 1036 lcd->pixel(r.p1.x + cycle * w/2 + privDutyCycleX + x, y, color);
WiredHome 3:d22f3e52d06a 1037 }
WiredHome 3:d22f3e52d06a 1038 loc_t y2 = r.p2.y - rangelimit(-privVoltage/2 + privOffset, SG_MIN_V, SG_MAX_V) / vRange * h;
WiredHome 3:d22f3e52d06a 1039 lcd->line(r.p1.x + cycle*w/2 + w/2 - 1, y,
WiredHome 3:d22f3e52d06a 1040 r.p1.x + cycle*w/2 + w/2, y2);
WiredHome 1:dd07e1deec6c 1041 }
WiredHome 1:dd07e1deec6c 1042 break;
WiredHome 1:dd07e1deec6c 1043 case SG_USER:
WiredHome 1:dd07e1deec6c 1044 lcd->line(r.p1.x, y0-1, r.p1.x+w, y0-1, color);
WiredHome 1:dd07e1deec6c 1045 lcd->line(r.p1.x, y0-0, r.p1.x+w, y0-0, color);
WiredHome 1:dd07e1deec6c 1046 lcd->line(r.p1.x, y0+1, r.p1.x+w, y0+1, color);
WiredHome 1:dd07e1deec6c 1047 lcd->rect(r.p1.x+5*w/8, y0-a/4, r.p1.x+7*w/8, y0+a/4, color);
WiredHome 1:dd07e1deec6c 1048 break;
WiredHome 1:dd07e1deec6c 1049 }
WiredHome 5:49dd0c647a40 1050 if (cyclesToShow != 2) {
WiredHome 5:49dd0c647a40 1051 v = rangelimit(privOffset, SG_MIN_V, SG_MAX_V);
WiredHome 5:49dd0c647a40 1052 y = r.p2.y - 2 * a * v / vRange;
WiredHome 5:49dd0c647a40 1053 lcd->line(r.p1.x + w/2, y, r.p1.x+w,y, color);
WiredHome 5:49dd0c647a40 1054 }
WiredHome 1:dd07e1deec6c 1055 }
WiredHome 1:dd07e1deec6c 1056
WiredHome 1:dd07e1deec6c 1057 void SignalGenDisplay::ClearScope(void) {
WiredHome 1:dd07e1deec6c 1058 // Scope area
WiredHome 1:dd07e1deec6c 1059 rect_t r = UI_SCOPE_RECT;
WiredHome 1:dd07e1deec6c 1060 lcd->fillrect(r, UI_ScopeBackColor);
WiredHome 1:dd07e1deec6c 1061 lcd->rect(r, UI_ScopeFrameColor);
WiredHome 1:dd07e1deec6c 1062 }
WiredHome 1:dd07e1deec6c 1063
WiredHome 1:dd07e1deec6c 1064 void SignalGenDisplay::updateDutyCycle(void) {
WiredHome 1:dd07e1deec6c 1065 rect_t r = Parameters[0]; // UI_DUTY_CYCLE_RECT;
WiredHome 1:dd07e1deec6c 1066 color_t fcolor, bcolor;
WiredHome 1:dd07e1deec6c 1067
WiredHome 2:8f71b71fce1b 1068 if (EntryMd != OM_DUTY) {
WiredHome 1:dd07e1deec6c 1069 fcolor = UI_DutyColor;
WiredHome 1:dd07e1deec6c 1070 bcolor = UI_ScopeBackColor;
WiredHome 1:dd07e1deec6c 1071 } else {
WiredHome 1:dd07e1deec6c 1072 fcolor = UI_ScopeBackColor;
WiredHome 1:dd07e1deec6c 1073 bcolor = UI_DutyColor;
WiredHome 1:dd07e1deec6c 1074 }
WiredHome 1:dd07e1deec6c 1075 lcd->fillrect(r, bcolor);
WiredHome 1:dd07e1deec6c 1076 lcd->foreground(fcolor);
WiredHome 1:dd07e1deec6c 1077 lcd->background(bcolor);
WiredHome 1:dd07e1deec6c 1078 lcd->SetTextCursor(r.p1.x+1, r.p1.y+1);
WiredHome 1:dd07e1deec6c 1079 lcd->printf("%3.0f %%", dutycycle);
WiredHome 1:dd07e1deec6c 1080 }
WiredHome 1:dd07e1deec6c 1081
WiredHome 1:dd07e1deec6c 1082 void SignalGenDisplay::updateFrequency(void) {
WiredHome 1:dd07e1deec6c 1083 rect_t r = Parameters[1]; // UI_FREQ_RECT;
WiredHome 1:dd07e1deec6c 1084 color_t fcolor, bcolor;
WiredHome 1:dd07e1deec6c 1085
WiredHome 2:8f71b71fce1b 1086 if (EntryMd != OM_FREQ) {
WiredHome 1:dd07e1deec6c 1087 fcolor = UI_FreqColor;
WiredHome 1:dd07e1deec6c 1088 bcolor = UI_ScopeBackColor;
WiredHome 1:dd07e1deec6c 1089 } else {
WiredHome 1:dd07e1deec6c 1090 fcolor = UI_ScopeBackColor;
WiredHome 1:dd07e1deec6c 1091 bcolor = UI_FreqColor;
WiredHome 1:dd07e1deec6c 1092 }
WiredHome 1:dd07e1deec6c 1093 lcd->fillrect(r, bcolor);
WiredHome 1:dd07e1deec6c 1094 lcd->foreground(fcolor);
WiredHome 1:dd07e1deec6c 1095 lcd->background(bcolor);
WiredHome 1:dd07e1deec6c 1096 lcd->SetTextCursor(r.p1.x+1, r.p1.y+1);
WiredHome 3:d22f3e52d06a 1097 if (frequency >= 1000000.0)
WiredHome 3:d22f3e52d06a 1098 lcd->printf("%8.3f MHz", frequency/1000000);
WiredHome 3:d22f3e52d06a 1099 else if (frequency >= 1000.0)
WiredHome 1:dd07e1deec6c 1100 lcd->printf("%8.3f kHz", frequency/1000);
WiredHome 1:dd07e1deec6c 1101 else
WiredHome 1:dd07e1deec6c 1102 lcd->printf("%8.3f Hz ", frequency);
WiredHome 1:dd07e1deec6c 1103 }
WiredHome 1:dd07e1deec6c 1104
WiredHome 1:dd07e1deec6c 1105 void SignalGenDisplay::updatePeriod(void) {
WiredHome 1:dd07e1deec6c 1106 float period = 1/frequency;
WiredHome 1:dd07e1deec6c 1107 rect_t r = Parameters[2]; // UI_PERIOD_RECT;
WiredHome 1:dd07e1deec6c 1108 color_t fcolor, bcolor;
WiredHome 1:dd07e1deec6c 1109
WiredHome 2:8f71b71fce1b 1110 if (EntryMd != OM_PERI) {
WiredHome 1:dd07e1deec6c 1111 fcolor = UI_FreqColor;
WiredHome 1:dd07e1deec6c 1112 bcolor = UI_ScopeBackColor;
WiredHome 1:dd07e1deec6c 1113 } else {
WiredHome 1:dd07e1deec6c 1114 fcolor = UI_ScopeBackColor;
WiredHome 1:dd07e1deec6c 1115 bcolor = UI_FreqColor;
WiredHome 1:dd07e1deec6c 1116 }
WiredHome 1:dd07e1deec6c 1117 lcd->fillrect(r, bcolor);
WiredHome 1:dd07e1deec6c 1118 lcd->foreground(fcolor);
WiredHome 1:dd07e1deec6c 1119 lcd->background(bcolor);
WiredHome 1:dd07e1deec6c 1120 lcd->SetTextCursor(r.p1.x+1, r.p1.y+1);
WiredHome 1:dd07e1deec6c 1121 if (period < 0.001)
WiredHome 1:dd07e1deec6c 1122 lcd->printf("%8.3f uS", period * 1000000);
WiredHome 1:dd07e1deec6c 1123 else
WiredHome 1:dd07e1deec6c 1124 lcd->printf("%8.3f mS", period * 1000);
WiredHome 1:dd07e1deec6c 1125 }
WiredHome 1:dd07e1deec6c 1126
WiredHome 1:dd07e1deec6c 1127 void SignalGenDisplay::updateVoltage(void) {
WiredHome 1:dd07e1deec6c 1128 rect_t r = Parameters[3]; // UI_VP2P_RECT;
WiredHome 1:dd07e1deec6c 1129 color_t fcolor, bcolor;
WiredHome 1:dd07e1deec6c 1130
WiredHome 2:8f71b71fce1b 1131 if (EntryMd != OM_VOLT) {
WiredHome 1:dd07e1deec6c 1132 fcolor = UI_VP2PColor;
WiredHome 1:dd07e1deec6c 1133 bcolor = UI_ScopeBackColor;
WiredHome 1:dd07e1deec6c 1134 } else {
WiredHome 1:dd07e1deec6c 1135 fcolor = UI_ScopeBackColor;
WiredHome 1:dd07e1deec6c 1136 bcolor = UI_VP2PColor;
WiredHome 1:dd07e1deec6c 1137 }
WiredHome 1:dd07e1deec6c 1138 lcd->fillrect(r, bcolor);
WiredHome 1:dd07e1deec6c 1139 lcd->foreground(fcolor);
WiredHome 1:dd07e1deec6c 1140 lcd->background(bcolor);
WiredHome 1:dd07e1deec6c 1141 lcd->SetTextCursor(r.p1.x+1, r.p1.y+1);
WiredHome 1:dd07e1deec6c 1142 lcd->printf("%5.1f v", voltage);
WiredHome 1:dd07e1deec6c 1143 }
WiredHome 1:dd07e1deec6c 1144
WiredHome 1:dd07e1deec6c 1145 void SignalGenDisplay::updateOffset(void) {
WiredHome 1:dd07e1deec6c 1146 rect_t r = Parameters[4]; // UI_VOFFSET_RECT;
WiredHome 1:dd07e1deec6c 1147 color_t fcolor, bcolor;
WiredHome 1:dd07e1deec6c 1148
WiredHome 2:8f71b71fce1b 1149 if (EntryMd != OM_OFFS) {
WiredHome 1:dd07e1deec6c 1150 fcolor = UI_VOffsetColor;
WiredHome 1:dd07e1deec6c 1151 bcolor = UI_ScopeBackColor;
WiredHome 1:dd07e1deec6c 1152 } else {
WiredHome 1:dd07e1deec6c 1153 fcolor = UI_ScopeBackColor;
WiredHome 1:dd07e1deec6c 1154 bcolor = UI_VOffsetColor;
WiredHome 1:dd07e1deec6c 1155 }
WiredHome 1:dd07e1deec6c 1156 lcd->fillrect(r, bcolor);
WiredHome 1:dd07e1deec6c 1157 lcd->foreground(fcolor);
WiredHome 1:dd07e1deec6c 1158 lcd->background(bcolor);
WiredHome 1:dd07e1deec6c 1159 lcd->SetTextCursor(r.p1.x+1, r.p1.y+1);
WiredHome 1:dd07e1deec6c 1160 lcd->printf("%+4.2f v", offset);
WiredHome 1:dd07e1deec6c 1161 }
WiredHome 1:dd07e1deec6c 1162
WiredHome 1:dd07e1deec6c 1163 void SignalGenDisplay::DrawKeypadEnabled(bool enable) {
WiredHome 1:dd07e1deec6c 1164 for (int i=0; i<KeypadCount; i++) {
WiredHome 1:dd07e1deec6c 1165 DrawButton(UI_Keypad[i], false, SG_KEYPAD, enable, i);
WiredHome 1:dd07e1deec6c 1166 }
WiredHome 1:dd07e1deec6c 1167 }
WiredHome 1:dd07e1deec6c 1168
WiredHome 6:1f48212fbaf9 1169 void SignalGenDisplay::DrawButton(rect_t r, bool pressed, SG_Waveform mode, bool enable, int label) {
WiredHome 1:dd07e1deec6c 1170 rect_t wave;
WiredHome 1:dd07e1deec6c 1171 color_t buttonface = UI_BUTTON_FACE_DISABLED;
WiredHome 1:dd07e1deec6c 1172 color_t buttonshadow = UI_BUTTON_SHADOW_DISABLED;
WiredHome 1:dd07e1deec6c 1173
WiredHome 1:dd07e1deec6c 1174 //lcd->fillrect(r, UI_ScopeBackColor);
WiredHome 1:dd07e1deec6c 1175 if (pressed) {
WiredHome 1:dd07e1deec6c 1176 if (enable) {
WiredHome 1:dd07e1deec6c 1177 buttonface = UI_BUTTON_FACE_DN;
WiredHome 1:dd07e1deec6c 1178 buttonshadow = UI_BUTTON_SHADOW;
WiredHome 1:dd07e1deec6c 1179 }
WiredHome 1:dd07e1deec6c 1180 lcd->fillrect(r, buttonface);
WiredHome 1:dd07e1deec6c 1181 lcd->line(r.p1.x+0,r.p1.y+0, r.p2.x+0,r.p1.y+0, buttonshadow); // top border
WiredHome 1:dd07e1deec6c 1182 lcd->line(r.p1.x+1,r.p1.y+1, r.p2.x+0,r.p1.y+1, buttonshadow); // top border
WiredHome 1:dd07e1deec6c 1183 lcd->line(r.p1.x+2,r.p1.y+2, r.p2.x+0,r.p1.y+2, buttonshadow); // top border
WiredHome 1:dd07e1deec6c 1184 lcd->line(r.p1.x+0,r.p1.y+0, r.p1.x+0,r.p2.y+0, buttonshadow); // left border
WiredHome 1:dd07e1deec6c 1185 lcd->line(r.p1.x+1,r.p1.y+1, r.p1.x+1,r.p2.y+0, buttonshadow); // left border
WiredHome 1:dd07e1deec6c 1186 lcd->line(r.p1.x+2,r.p1.y+2, r.p1.x+2,r.p2.y+0, buttonshadow); // left border
WiredHome 1:dd07e1deec6c 1187 wave.p1.x = r.p1.x+5 + 2; wave.p1.y = r.p1.y + 5 + 2;
WiredHome 1:dd07e1deec6c 1188 wave.p2.x = r.p2.x-5 + 2; wave.p2.y = r.p2.y - 5 + 2;
WiredHome 1:dd07e1deec6c 1189 } else {
WiredHome 1:dd07e1deec6c 1190 if (enable) {
WiredHome 1:dd07e1deec6c 1191 buttonface = UI_BUTTON_FACE_UP;
WiredHome 1:dd07e1deec6c 1192 buttonshadow = UI_BUTTON_SHADOW;
WiredHome 1:dd07e1deec6c 1193 }
WiredHome 1:dd07e1deec6c 1194 lcd->fillrect(r, buttonface);
WiredHome 1:dd07e1deec6c 1195 lcd->line(r.p1.x+0,r.p2.y-0, r.p2.x-0,r.p2.y-0, buttonshadow); // bottom border
WiredHome 1:dd07e1deec6c 1196 lcd->line(r.p1.x+0,r.p2.y-1, r.p2.x-1,r.p2.y-1, buttonshadow); // bottom border
WiredHome 1:dd07e1deec6c 1197 lcd->line(r.p1.x+0,r.p2.y-2, r.p2.x-2,r.p2.y-2, buttonshadow); // bottom border
WiredHome 1:dd07e1deec6c 1198 lcd->line(r.p2.x-0,r.p1.y+0, r.p2.x-0,r.p2.y-0, buttonshadow); // right border
WiredHome 1:dd07e1deec6c 1199 lcd->line(r.p2.x-1,r.p1.y+0, r.p2.x-1,r.p2.y-1, buttonshadow); // right border
WiredHome 1:dd07e1deec6c 1200 lcd->line(r.p2.x-2,r.p1.y+0, r.p2.x-2,r.p2.y-2, buttonshadow); // right border
WiredHome 1:dd07e1deec6c 1201 wave.p1.x = r.p1.x+5 + 0; wave.p1.y = r.p1.y + 5 + 0;
WiredHome 1:dd07e1deec6c 1202 wave.p2.x = r.p2.x-5 + 0; wave.p2.y = r.p2.y - 5 + 0;
WiredHome 1:dd07e1deec6c 1203 }
WiredHome 1:dd07e1deec6c 1204 switch (mode) {
WiredHome 1:dd07e1deec6c 1205 case SG_SINE:
WiredHome 1:dd07e1deec6c 1206 case SG_SQUARE:
WiredHome 1:dd07e1deec6c 1207 case SG_TRIANGLE:
WiredHome 1:dd07e1deec6c 1208 case SG_SAWTOOTH:
WiredHome 1:dd07e1deec6c 1209 case SG_USER:
WiredHome 2:8f71b71fce1b 1210 DrawWaveform(wave, mode, Black, true);
WiredHome 1:dd07e1deec6c 1211 break;
WiredHome 1:dd07e1deec6c 1212 case SG_KEYPAD:
WiredHome 1:dd07e1deec6c 1213 lcd->foreground(Black);
WiredHome 1:dd07e1deec6c 1214 lcd->background(buttonface);
WiredHome 1:dd07e1deec6c 1215 lcd->SetTextCursor((r.p1.x+r.p2.x)/2 - 4,r.p1.y + BTN_H/2 - 8); // 8x16 char
WiredHome 1:dd07e1deec6c 1216 lcd->putc(UI_KeyLabels[label]);
WiredHome 1:dd07e1deec6c 1217 break;
WiredHome 3:d22f3e52d06a 1218 case SG_START:
WiredHome 3:d22f3e52d06a 1219 lcd->foreground(Black);
WiredHome 3:d22f3e52d06a 1220 lcd->background(buttonface);
WiredHome 3:d22f3e52d06a 1221 lcd->SetTextCursor((r.p1.x+r.p2.x)/2 - 4 * strlen(UI_StartLabels[label]),r.p1.y + BTN_H/2 - 8);
WiredHome 3:d22f3e52d06a 1222 lcd->puts(UI_StartLabels[label]);
WiredHome 3:d22f3e52d06a 1223 break;
WiredHome 3:d22f3e52d06a 1224 }
WiredHome 3:d22f3e52d06a 1225 }
WiredHome 3:d22f3e52d06a 1226
WiredHome 3:d22f3e52d06a 1227 void SignalGenDisplay::ShowStartStop(bool showIt) {
WiredHome 3:d22f3e52d06a 1228 if (textLen == 0) {
WiredHome 3:d22f3e52d06a 1229 lcd->fillrect(UI_START_STOP, UI_BackColor);
WiredHome 3:d22f3e52d06a 1230 if (showIt) {
WiredHome 4:10281ddb673d 1231 DrawButton(UI_START_STOP, signal->isRunning(), SG_START, true, pulseMode ? 2 : signal->isRunning());
WiredHome 3:d22f3e52d06a 1232 }
WiredHome 1:dd07e1deec6c 1233 }
WiredHome 1:dd07e1deec6c 1234 }
WiredHome 1:dd07e1deec6c 1235
WiredHome 1:dd07e1deec6c 1236 void SignalGenDisplay::updateTextWindow(void) {
WiredHome 3:d22f3e52d06a 1237 ShowStartStop(false);
WiredHome 1:dd07e1deec6c 1238 lcd->window(UI_DATA_ENTRY);
WiredHome 1:dd07e1deec6c 1239 lcd->fillrect(UI_DATA_ENTRY, White);
WiredHome 1:dd07e1deec6c 1240 lcd->foreground(Black);
WiredHome 1:dd07e1deec6c 1241 lcd->background(White);
WiredHome 1:dd07e1deec6c 1242 lcd->SetTextCursor(UI_DATA_ENTRY.p1.x+1,UI_DATA_ENTRY.p1.y+1);
WiredHome 3:d22f3e52d06a 1243 lcd->printf("%13s", textBuffer);
WiredHome 1:dd07e1deec6c 1244 lcd->window();
WiredHome 1:dd07e1deec6c 1245 }
WiredHome 1:dd07e1deec6c 1246
WiredHome 2:8f71b71fce1b 1247 void SignalGenDisplay::clearTextWindow(void) {
WiredHome 2:8f71b71fce1b 1248 lcd->fillrect(UI_DATA_ENTRY, UI_BackColor);
WiredHome 2:8f71b71fce1b 1249 textBuffer[0] = '\0';
WiredHome 2:8f71b71fce1b 1250 textLen = 0;
WiredHome 3:d22f3e52d06a 1251 ShowStartStop(true);
WiredHome 2:8f71b71fce1b 1252 }
WiredHome 2:8f71b71fce1b 1253
WiredHome 1:dd07e1deec6c 1254 float SignalGenDisplay::rangelimit(float value, float min, float max) {
WiredHome 1:dd07e1deec6c 1255 if (value < min)
WiredHome 1:dd07e1deec6c 1256 return min;
WiredHome 1:dd07e1deec6c 1257 else if (value > max)
WiredHome 1:dd07e1deec6c 1258 return max;
WiredHome 1:dd07e1deec6c 1259 else
WiredHome 1:dd07e1deec6c 1260 return value;
WiredHome 1:dd07e1deec6c 1261 }
WiredHome 1:dd07e1deec6c 1262
WiredHome 2:8f71b71fce1b 1263 void SignalGenDisplay::SaveSettings(OM_Changes reportMode) {
WiredHome 2:8f71b71fce1b 1264 char buf[20];
WiredHome 1:dd07e1deec6c 1265
WiredHome 2:8f71b71fce1b 1266 if (reportMode != OM_NONE) {
WiredHome 2:8f71b71fce1b 1267 Changes |= reportMode;
WiredHome 2:8f71b71fce1b 1268 printf("SaveSettings - reset timer [%02X]\r\n", Changes);
WiredHome 2:8f71b71fce1b 1269 timerSave.reset();
WiredHome 2:8f71b71fce1b 1270 timerSave.start();
WiredHome 2:8f71b71fce1b 1271 } else if (timerSave.read() > SAVE_AFTER_IDLE_S) {
WiredHome 2:8f71b71fce1b 1272 timerSave.stop();
WiredHome 2:8f71b71fce1b 1273 timerSave.reset();
WiredHome 2:8f71b71fce1b 1274 printf("SaveSettings - timeout [%02X]\r\n", Changes);
WiredHome 2:8f71b71fce1b 1275 if (Changes & OM_MODE) {
WiredHome 2:8f71b71fce1b 1276 Changes &= ~ OM_MODE;
WiredHome 6:1f48212fbaf9 1277 printf(" Signal:Waveform=%s\r\n", ModeNames[mode]);
WiredHome 2:8f71b71fce1b 1278 ini.WriteString("Signal", "Waveform", ModeNames[mode]);
WiredHome 2:8f71b71fce1b 1279 }
WiredHome 5:49dd0c647a40 1280 if (Changes & OM_PULSE) {
WiredHome 5:49dd0c647a40 1281 Changes &= ~ OM_PULSE;
WiredHome 6:1f48212fbaf9 1282 printf(" Signal:Pulse Mode=%s\r\n", PulseModeLabels[pulseMode]);
WiredHome 5:49dd0c647a40 1283 ini.WriteString("Signal", "Pulse Mode", PulseModeLabels[pulseMode]);
WiredHome 5:49dd0c647a40 1284 }
WiredHome 2:8f71b71fce1b 1285 if (Changes & OM_FREQ) {
WiredHome 2:8f71b71fce1b 1286 Changes &= ~ OM_FREQ;
WiredHome 2:8f71b71fce1b 1287 snprintf(buf, sizeof(buf),"%5.3f", frequency);
WiredHome 2:8f71b71fce1b 1288 printf(" Signal:Frequency=%s\r\n", buf);
WiredHome 2:8f71b71fce1b 1289 ini.WriteString("Signal", "Frequency", buf);
WiredHome 2:8f71b71fce1b 1290 }
WiredHome 2:8f71b71fce1b 1291 if (Changes & OM_PERI) {
WiredHome 2:8f71b71fce1b 1292 Changes &= ~ OM_PERI;
WiredHome 2:8f71b71fce1b 1293 snprintf(buf, sizeof(buf),"%5.3f", frequency);
WiredHome 2:8f71b71fce1b 1294 printf(" Signal:Frequency=%s\r\n", buf);
WiredHome 2:8f71b71fce1b 1295 ini.WriteString("Signal", "Frequency", buf);
WiredHome 2:8f71b71fce1b 1296 }
WiredHome 2:8f71b71fce1b 1297 if (Changes & OM_DUTY) {
WiredHome 2:8f71b71fce1b 1298 Changes &= ~ OM_DUTY;
WiredHome 2:8f71b71fce1b 1299 snprintf(buf, sizeof(buf),"%1.0f", dutycycle);
WiredHome 2:8f71b71fce1b 1300 printf(" Signal:Duty Cycle=%s\r\n", buf);
WiredHome 2:8f71b71fce1b 1301 ini.WriteString("Signal", "Duty Cycle", buf);
WiredHome 2:8f71b71fce1b 1302 }
WiredHome 2:8f71b71fce1b 1303 if (Changes & OM_VOLT) {
WiredHome 2:8f71b71fce1b 1304 Changes &= ~ OM_VOLT;
WiredHome 2:8f71b71fce1b 1305 snprintf(buf, sizeof(buf),"%3.2f", voltage);
WiredHome 2:8f71b71fce1b 1306 printf(" Signal:Voltage=%s\r\n", buf);
WiredHome 2:8f71b71fce1b 1307 ini.WriteString("Signal", "Voltage", buf);
WiredHome 2:8f71b71fce1b 1308 }
WiredHome 2:8f71b71fce1b 1309 if (Changes & OM_OFFS) {
WiredHome 2:8f71b71fce1b 1310 Changes &= ~ OM_OFFS;
WiredHome 2:8f71b71fce1b 1311 snprintf(buf, sizeof(buf),"%3.2f", offset);
WiredHome 2:8f71b71fce1b 1312 printf(" Signal:Offset=%s\r\n", buf);
WiredHome 2:8f71b71fce1b 1313 ini.WriteString("Signal", "Offset", buf);
WiredHome 2:8f71b71fce1b 1314 }
WiredHome 3:d22f3e52d06a 1315 if (Changes & OM_BACKL) {
WiredHome 3:d22f3e52d06a 1316 Changes &= ~OM_BACKL;
WiredHome 3:d22f3e52d06a 1317 snprintf(buf, sizeof(buf), "%d", lcd->GetBacklight_u8());
WiredHome 3:d22f3e52d06a 1318 ini.WriteString("Settings", "Backlight", buf);
WiredHome 3:d22f3e52d06a 1319 }
WiredHome 3:d22f3e52d06a 1320
WiredHome 1:dd07e1deec6c 1321 }
WiredHome 1:dd07e1deec6c 1322 }
WiredHome 1:dd07e1deec6c 1323
WiredHome 2:8f71b71fce1b 1324 void SignalGenDisplay::resetDataEntry(OM_Changes nextMode, bool save) {
WiredHome 2:8f71b71fce1b 1325 OM_Changes last = EntryMd;
WiredHome 1:dd07e1deec6c 1326
WiredHome 2:8f71b71fce1b 1327 printf("-> resetDataEntry(next: %d) curr:%d, save:%d\r\n", nextMode, last, save);
WiredHome 2:8f71b71fce1b 1328 EntryMd = nextMode;
WiredHome 2:8f71b71fce1b 1329 if (last != OM_NONE)
WiredHome 4:10281ddb673d 1330 signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset);
WiredHome 1:dd07e1deec6c 1331 switch (last) {
WiredHome 2:8f71b71fce1b 1332 case OM_NONE:
WiredHome 1:dd07e1deec6c 1333 updateDutyCycle();
WiredHome 1:dd07e1deec6c 1334 updateFrequency();
WiredHome 1:dd07e1deec6c 1335 updatePeriod();
WiredHome 1:dd07e1deec6c 1336 updateVoltage();
WiredHome 1:dd07e1deec6c 1337 updateOffset();
WiredHome 1:dd07e1deec6c 1338 break;
WiredHome 2:8f71b71fce1b 1339 case OM_DUTY:
WiredHome 1:dd07e1deec6c 1340 updateDutyCycle();
WiredHome 2:8f71b71fce1b 1341 if (save) {
WiredHome 2:8f71b71fce1b 1342 SaveSettings(OM_DUTY);
WiredHome 2:8f71b71fce1b 1343 }
WiredHome 1:dd07e1deec6c 1344 break;
WiredHome 2:8f71b71fce1b 1345 case OM_FREQ:
WiredHome 1:dd07e1deec6c 1346 updateFrequency();
WiredHome 2:8f71b71fce1b 1347 if (save) {
WiredHome 2:8f71b71fce1b 1348 SaveSettings(OM_FREQ);
WiredHome 2:8f71b71fce1b 1349 }
WiredHome 1:dd07e1deec6c 1350 break;
WiredHome 2:8f71b71fce1b 1351 case OM_PERI:
WiredHome 1:dd07e1deec6c 1352 updatePeriod();
WiredHome 2:8f71b71fce1b 1353 if (save) {
WiredHome 2:8f71b71fce1b 1354 SaveSettings(OM_FREQ);
WiredHome 2:8f71b71fce1b 1355 }
WiredHome 1:dd07e1deec6c 1356 break;
WiredHome 2:8f71b71fce1b 1357 case OM_VOLT:
WiredHome 1:dd07e1deec6c 1358 updateVoltage();
WiredHome 2:8f71b71fce1b 1359 if (save) {
WiredHome 2:8f71b71fce1b 1360 SaveSettings(OM_VOLT);
WiredHome 2:8f71b71fce1b 1361 }
WiredHome 1:dd07e1deec6c 1362 break;
WiredHome 2:8f71b71fce1b 1363 case OM_OFFS:
WiredHome 1:dd07e1deec6c 1364 updateOffset();
WiredHome 2:8f71b71fce1b 1365 if (save) {
WiredHome 2:8f71b71fce1b 1366 SaveSettings(OM_OFFS);
WiredHome 2:8f71b71fce1b 1367 }
WiredHome 1:dd07e1deec6c 1368 break;
WiredHome 1:dd07e1deec6c 1369 default:
WiredHome 1:dd07e1deec6c 1370 break;
WiredHome 1:dd07e1deec6c 1371 }
WiredHome 2:8f71b71fce1b 1372 DrawKeypadEnabled(EntryMd != OM_NONE);
WiredHome 2:8f71b71fce1b 1373 if (EntryMd == OM_NONE) {
WiredHome 2:8f71b71fce1b 1374 clearTextWindow();
WiredHome 2:8f71b71fce1b 1375 }
WiredHome 2:8f71b71fce1b 1376 printf("<- end resetDataEntry()\r\n");
WiredHome 3:d22f3e52d06a 1377 }
WiredHome 3:d22f3e52d06a 1378
WiredHome 3:d22f3e52d06a 1379 // Calibrate the resistive touch screen, and store the data on the
WiredHome 3:d22f3e52d06a 1380 // local file system.
WiredHome 3:d22f3e52d06a 1381 //
WiredHome 3:d22f3e52d06a 1382 void SignalGenDisplay::CalibrateTS(void)
WiredHome 3:d22f3e52d06a 1383 {
WiredHome 3:d22f3e52d06a 1384 FILE * fh;
WiredHome 3:d22f3e52d06a 1385 tpMatrix_t matrix;
WiredHome 3:d22f3e52d06a 1386 RetCode_t r;
WiredHome 3:d22f3e52d06a 1387 Timer testperiod;
WiredHome 3:d22f3e52d06a 1388 char buf[100];
WiredHome 3:d22f3e52d06a 1389
WiredHome 3:d22f3e52d06a 1390 r = lcd->TouchPanelCalibrate("Calibrate the touch panel", &matrix);
WiredHome 3:d22f3e52d06a 1391 if (r == noerror) {
WiredHome 3:d22f3e52d06a 1392 snprintf(buf, sizeof(buf), "%s/tpcal.cfg", Path);
WiredHome 3:d22f3e52d06a 1393 fh = fopen(buf, "wb");
WiredHome 3:d22f3e52d06a 1394 if (fh) {
WiredHome 3:d22f3e52d06a 1395 fwrite(&matrix, sizeof(tpMatrix_t), 1, fh);
WiredHome 3:d22f3e52d06a 1396 fclose(fh);
WiredHome 3:d22f3e52d06a 1397 printf(" %s cal written.\r\n", buf);
WiredHome 3:d22f3e52d06a 1398 lcd->cls();
WiredHome 3:d22f3e52d06a 1399 } else {
WiredHome 3:d22f3e52d06a 1400 printf(" couldn't open %s file.\r\n", buf);
WiredHome 3:d22f3e52d06a 1401 }
WiredHome 3:d22f3e52d06a 1402 } else {
WiredHome 3:d22f3e52d06a 1403 printf("error return: %d\r\n", r);
WiredHome 3:d22f3e52d06a 1404 }
WiredHome 3:d22f3e52d06a 1405 lcd->cls();
WiredHome 3:d22f3e52d06a 1406 }
WiredHome 3:d22f3e52d06a 1407
WiredHome 3:d22f3e52d06a 1408 // Try to load a previous resistive touch screen calibration from storage. If it
WiredHome 3:d22f3e52d06a 1409 // doesn't exist, activate the touch screen calibration process.
WiredHome 3:d22f3e52d06a 1410 //
WiredHome 3:d22f3e52d06a 1411 void SignalGenDisplay::InitializeTS(void)
WiredHome 3:d22f3e52d06a 1412 {
WiredHome 3:d22f3e52d06a 1413 FILE * fh;
WiredHome 3:d22f3e52d06a 1414 tpMatrix_t matrix;
WiredHome 3:d22f3e52d06a 1415 char buf[100];
WiredHome 3:d22f3e52d06a 1416
WiredHome 3:d22f3e52d06a 1417 snprintf(buf, sizeof(buf), "%s/tpcal.cfg", Path);
WiredHome 3:d22f3e52d06a 1418 fh = fopen(buf, "rb");
WiredHome 3:d22f3e52d06a 1419 if (fh) {
WiredHome 3:d22f3e52d06a 1420 fread(&matrix, sizeof(tpMatrix_t), 1, fh);
WiredHome 3:d22f3e52d06a 1421 fclose(fh);
WiredHome 3:d22f3e52d06a 1422 lcd->TouchPanelSetMatrix(&matrix);
WiredHome 3:d22f3e52d06a 1423 printf(" tp cal loaded.\r\n");
WiredHome 3:d22f3e52d06a 1424 } else {
WiredHome 3:d22f3e52d06a 1425 CalibrateTS();
WiredHome 3:d22f3e52d06a 1426 }
WiredHome 3:d22f3e52d06a 1427 }
WiredHome 3:d22f3e52d06a 1428