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