Signal Generator
Dependencies: IniManager RA8875 Watchdog mbed-rtos mbed
Fork of speaker_demo_Analog by
SignalGenDisplay.cpp@3:d22f3e52d06a, 2017-01-16 (annotated)
- Committer:
- WiredHome
- Date:
- Mon Jan 16 04:33:06 2017 +0000
- Revision:
- 3:d22f3e52d06a
- Parent:
- 2:8f71b71fce1b
- Child:
- 4:10281ddb673d
Added button for Start/Stop/Pulse
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 | 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 | 3:d22f3e52d06a | 66 | 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 | 3:d22f3e52d06a | 67 | const char * UI_StartLabels[3] = { "Start", "Stop", "Pulse" }; |
WiredHome | 3:d22f3e52d06a | 68 | const char StartStopKeys[] = { 'G', 'O', 'P' }; |
WiredHome | 3:d22f3e52d06a | 69 | 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}; |
WiredHome | 3:d22f3e52d06a | 70 | const rect_t UI_SCOPE_RECT = {4,5, 290,160}; |
WiredHome | 3:d22f3e52d06a | 71 | |
WiredHome | 3:d22f3e52d06a | 72 | 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 | 1:dd07e1deec6c | 74 | 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 | 1:dd07e1deec6c | 81 | const int ParameterCount = sizeof(Parameters)/sizeof(Parameters[0]); |
WiredHome | 2:8f71b71fce1b | 82 | const char ParameterKeys[] = { 'd', 'f', 'p', 'v', 'o' }; |
WiredHome | 1:dd07e1deec6c | 83 | |
WiredHome | 3:d22f3e52d06a | 84 | const rect_t UI_PROD_RECT = { 298,3, 479,51 }; |
WiredHome | 2:8f71b71fce1b | 85 | const rect_t NavToSettings = { 4,200, 60,220 }; |
WiredHome | 1:dd07e1deec6c | 86 | |
WiredHome | 2:8f71b71fce1b | 87 | // Mode Buttons |
WiredHome | 2:8f71b71fce1b | 88 | 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 | 2:8f71b71fce1b | 95 | const int ModeCount = sizeof(ModeButtons)/sizeof(ModeButtons[0]); |
WiredHome | 2:8f71b71fce1b | 96 | SG_Mode 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 | 1:dd07e1deec6c | 103 | const char ModeKeys[] = { 'S','Q','T','W','U' }; |
WiredHome | 2:8f71b71fce1b | 104 | 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 | 1:dd07e1deec6c | 112 | 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 | 1:dd07e1deec6c | 130 | const int KeypadCount = sizeof(UI_Keypad)/sizeof(UI_Keypad[0]); |
WiredHome | 1:dd07e1deec6c | 131 | 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 | 2:8f71b71fce1b | 139 | 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 | 3:d22f3e52d06a | 172 | const point_t suncenter = { 450,85 }; |
WiredHome | 1:dd07e1deec6c | 173 | 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 | 3:d22f3e52d06a | 177 | const rect_t sungraph = { 450-18,120+0, 450+18,265+0 }; |
WiredHome | 3:d22f3e52d06a | 178 | const rect_t inrgraph = { 450-16,120+2, 450+16,265-2 }; |
WiredHome | 3:d22f3e52d06a | 179 | |
WiredHome | 3:d22f3e52d06a | 180 | const rect_t SignalMode = |
WiredHome | 3:d22f3e52d06a | 181 | { 20,50, 20+140,70 }; |
WiredHome | 3:d22f3e52d06a | 182 | const char * SignalModeLabel = "Signal Mode"; |
WiredHome | 3:d22f3e52d06a | 183 | |
WiredHome | 3:d22f3e52d06a | 184 | 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 | 3:d22f3e52d06a | 188 | const int radio_CyclesCount = sizeof(radio_Cycles)/sizeof(radio_Cycles[0]); |
WiredHome | 3:d22f3e52d06a | 189 | const char * radio_CyclesLabels[] = { |
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 | 3:d22f3e52d06a | 196 | // rect_t radio_Cycles[], radio_CyclesCount, char * radio_CyclesLabels[] |
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 | 3:d22f3e52d06a | 320 | ShowCyclesControl(); |
WiredHome | 3:d22f3e52d06a | 321 | } |
WiredHome | 3:d22f3e52d06a | 322 | } |
WiredHome | 1:dd07e1deec6c | 323 | } |
WiredHome | 1:dd07e1deec6c | 324 | break; |
WiredHome | 1:dd07e1deec6c | 325 | } |
WiredHome | 1:dd07e1deec6c | 326 | } |
WiredHome | 1:dd07e1deec6c | 327 | } |
WiredHome | 1:dd07e1deec6c | 328 | return 0; |
WiredHome | 1:dd07e1deec6c | 329 | } |
WiredHome | 1:dd07e1deec6c | 330 | |
WiredHome | 1:dd07e1deec6c | 331 | |
WiredHome | 2:8f71b71fce1b | 332 | void SignalGenDisplay::Refresh() { |
WiredHome | 2:8f71b71fce1b | 333 | if (needsInit) { |
WiredHome | 2:8f71b71fce1b | 334 | char buf[100]; |
WiredHome | 3:d22f3e52d06a | 335 | |
WiredHome | 2:8f71b71fce1b | 336 | needsInit = false; |
WiredHome | 2:8f71b71fce1b | 337 | vis = VS_MainScreen; // always start on main screen |
WiredHome | 3:d22f3e52d06a | 338 | lcd->TouchPanelInit(); |
WiredHome | 3:d22f3e52d06a | 339 | InitializeTS(); |
WiredHome | 3:d22f3e52d06a | 340 | |
WiredHome | 2:8f71b71fce1b | 341 | // Default the backlight |
WiredHome | 2:8f71b71fce1b | 342 | ini.ReadString("Settings", "Backlight", buf, sizeof(buf), "60"); |
WiredHome | 2:8f71b71fce1b | 343 | lcd->Backlight_u8(atoi(buf)); |
WiredHome | 2:8f71b71fce1b | 344 | |
WiredHome | 3:d22f3e52d06a | 345 | ini.ReadString("Signal", "Waveform", buf, sizeof(buf), ModeNames[0]); |
WiredHome | 2:8f71b71fce1b | 346 | for (int i=0; i<ModeCount; i++) { |
WiredHome | 2:8f71b71fce1b | 347 | if (strcmp(ModeNames[i], buf) == 0) { |
WiredHome | 2:8f71b71fce1b | 348 | mode = (SG_Mode)i; |
WiredHome | 2:8f71b71fce1b | 349 | break; |
WiredHome | 2:8f71b71fce1b | 350 | } |
WiredHome | 2:8f71b71fce1b | 351 | } |
WiredHome | 2:8f71b71fce1b | 352 | ini.ReadString("Signal", "Duty Cycle", buf, sizeof(buf), "50"); |
WiredHome | 2:8f71b71fce1b | 353 | dutycycle = atof(buf); |
WiredHome | 2:8f71b71fce1b | 354 | |
WiredHome | 2:8f71b71fce1b | 355 | ini.ReadString("Signal", "Frequency", buf, sizeof(buf), "1000"); |
WiredHome | 2:8f71b71fce1b | 356 | frequency = atof(buf); |
WiredHome | 2:8f71b71fce1b | 357 | |
WiredHome | 2:8f71b71fce1b | 358 | ini.ReadString("Signal", "Voltage", buf, sizeof(buf), "3.0"); |
WiredHome | 2:8f71b71fce1b | 359 | voltage = atof(buf); |
WiredHome | 2:8f71b71fce1b | 360 | |
WiredHome | 2:8f71b71fce1b | 361 | ini.ReadString("Signal", "Offset", buf, sizeof(buf), "1.5"); |
WiredHome | 2:8f71b71fce1b | 362 | offset = atof(buf); |
WiredHome | 3:d22f3e52d06a | 363 | |
WiredHome | 3:d22f3e52d06a | 364 | ini.ReadString("Signal", "Pulse Mode", buf, sizeof(buf), radio_CyclesLabels[0]); |
WiredHome | 3:d22f3e52d06a | 365 | for (int i=0; i<radio_CyclesCount; i++) { |
WiredHome | 3:d22f3e52d06a | 366 | if (strcmp(radio_CyclesLabels[i], buf) == 0) { |
WiredHome | 3:d22f3e52d06a | 367 | pulseMode = i; |
WiredHome | 3:d22f3e52d06a | 368 | break; |
WiredHome | 3:d22f3e52d06a | 369 | } |
WiredHome | 3:d22f3e52d06a | 370 | } |
WiredHome | 3:d22f3e52d06a | 371 | ShowMenu(); |
WiredHome | 2:8f71b71fce1b | 372 | } |
WiredHome | 1:dd07e1deec6c | 373 | switch (vis) { |
WiredHome | 1:dd07e1deec6c | 374 | case VS_MainScreen: |
WiredHome | 1:dd07e1deec6c | 375 | lcd->background(UI_BackColor); |
WiredHome | 1:dd07e1deec6c | 376 | lcd->cls(1); |
WiredHome | 1:dd07e1deec6c | 377 | lcd->SelectDrawingLayer(0); |
WiredHome | 1:dd07e1deec6c | 378 | // Clear Screen |
WiredHome | 1:dd07e1deec6c | 379 | lcd->SetLayerMode(RA8875::ShowLayer0); |
WiredHome | 1:dd07e1deec6c | 380 | |
WiredHome | 1:dd07e1deec6c | 381 | // Product Info |
WiredHome | 1:dd07e1deec6c | 382 | lcd->foreground(UI_ProductNameColor); |
WiredHome | 1:dd07e1deec6c | 383 | ShowProductInfo(); |
WiredHome | 1:dd07e1deec6c | 384 | |
WiredHome | 1:dd07e1deec6c | 385 | ClearScope(); |
WiredHome | 1:dd07e1deec6c | 386 | resetDataEntry(); |
WiredHome | 1:dd07e1deec6c | 387 | DrawNavGadget(); |
WiredHome | 2:8f71b71fce1b | 388 | DrawModeButtons(); |
WiredHome | 1:dd07e1deec6c | 389 | break; |
WiredHome | 1:dd07e1deec6c | 390 | |
WiredHome | 1:dd07e1deec6c | 391 | case VS_Settings: |
WiredHome | 1:dd07e1deec6c | 392 | lcd->background(UI_BackColor); |
WiredHome | 1:dd07e1deec6c | 393 | lcd->cls(2); |
WiredHome | 1:dd07e1deec6c | 394 | lcd->SelectDrawingLayer(1); |
WiredHome | 1:dd07e1deec6c | 395 | lcd->SetLayerMode(RA8875::ShowLayer1); |
WiredHome | 1:dd07e1deec6c | 396 | lcd->foreground(UI_ProductNameColor); |
WiredHome | 3:d22f3e52d06a | 397 | ShowProductInfo(true); |
WiredHome | 3:d22f3e52d06a | 398 | ShowCyclesControl(); |
WiredHome | 1:dd07e1deec6c | 399 | ShowBrightnessSetting(); |
WiredHome | 2:8f71b71fce1b | 400 | DrawNavGadget(); |
WiredHome | 1:dd07e1deec6c | 401 | break; |
WiredHome | 1:dd07e1deec6c | 402 | } |
WiredHome | 1:dd07e1deec6c | 403 | } |
WiredHome | 1:dd07e1deec6c | 404 | |
WiredHome | 3:d22f3e52d06a | 405 | // rect_t radio_Cycles[], radio_CyclesCount, char * radio_CyclesLabels[] |
WiredHome | 3:d22f3e52d06a | 406 | |
WiredHome | 3:d22f3e52d06a | 407 | void SignalGenDisplay::ShowCyclesControl(void) { |
WiredHome | 3:d22f3e52d06a | 408 | lcd->fillrect(SignalMode, UI_CyclesBackColor); |
WiredHome | 3:d22f3e52d06a | 409 | lcd->foreground(UI_CyclesColor); |
WiredHome | 3:d22f3e52d06a | 410 | lcd->background(UI_CyclesBackColor); |
WiredHome | 3:d22f3e52d06a | 411 | lcd->SetTextCursor(SignalMode.p1.x+1, SignalMode.p1.y+1); |
WiredHome | 3:d22f3e52d06a | 412 | lcd->printf("%s", SignalModeLabel); |
WiredHome | 3:d22f3e52d06a | 413 | for (int x=0; x<radio_CyclesCount; x++) { |
WiredHome | 3:d22f3e52d06a | 414 | lcd->fillrect(radio_Cycles[x], UI_CyclesBackColor); |
WiredHome | 3:d22f3e52d06a | 415 | lcd->foreground(UI_CyclesColor); |
WiredHome | 3:d22f3e52d06a | 416 | lcd->background(UI_CyclesBackColor); |
WiredHome | 3:d22f3e52d06a | 417 | lcd->SetTextCursor(radio_Cycles[x].p1.x+1,radio_Cycles[x].p1.y+1); |
WiredHome | 3:d22f3e52d06a | 418 | lcd->printf("%c %s", (pulseMode == x) ? '\x07' : '\x09', radio_CyclesLabels[x]); |
WiredHome | 3:d22f3e52d06a | 419 | } |
WiredHome | 3:d22f3e52d06a | 420 | } |
WiredHome | 3:d22f3e52d06a | 421 | |
WiredHome | 2:8f71b71fce1b | 422 | |
WiredHome | 2:8f71b71fce1b | 423 | void SignalGenDisplay::DrawModeButtons(void) { |
WiredHome | 2:8f71b71fce1b | 424 | for (int i=0; i<ModeCount; i++) { |
WiredHome | 2:8f71b71fce1b | 425 | DrawButton(ModeButtons[i], (UI_ModeList[i] == mode) ? true : false, UI_ModeList[i], true); |
WiredHome | 2:8f71b71fce1b | 426 | } |
WiredHome | 2:8f71b71fce1b | 427 | UpdateScope(); |
WiredHome | 2:8f71b71fce1b | 428 | } |
WiredHome | 2:8f71b71fce1b | 429 | |
WiredHome | 1:dd07e1deec6c | 430 | void SignalGenDisplay::DrawNavGadget(void) { |
WiredHome | 1:dd07e1deec6c | 431 | lcd->fillrect(NavToSettings, Black); |
WiredHome | 1:dd07e1deec6c | 432 | lcd->SetTextCursor(NavToSettings.p1.x+1, NavToSettings.p1.y+1); |
WiredHome | 1:dd07e1deec6c | 433 | lcd->foreground(White); |
WiredHome | 1:dd07e1deec6c | 434 | lcd->background(Black); |
WiredHome | 1:dd07e1deec6c | 435 | lcd->puts(" ..."); |
WiredHome | 1:dd07e1deec6c | 436 | } |
WiredHome | 1:dd07e1deec6c | 437 | |
WiredHome | 1:dd07e1deec6c | 438 | |
WiredHome | 3:d22f3e52d06a | 439 | void SignalGenDisplay::ShowProductInfo(bool builddate) { |
WiredHome | 1:dd07e1deec6c | 440 | rect_t r = UI_PROD_RECT; |
WiredHome | 1:dd07e1deec6c | 441 | lcd->window(r); |
WiredHome | 1:dd07e1deec6c | 442 | lcd->SetTextCursor(r.p1.x, r.p1.y); |
WiredHome | 1:dd07e1deec6c | 443 | lcd->printf("%s v%s", ProgName, Ver); |
WiredHome | 1:dd07e1deec6c | 444 | lcd->SetTextCursor(r.p1.x, r.p1.y+16); |
WiredHome | 1:dd07e1deec6c | 445 | lcd->printf("by %s", Manuf); |
WiredHome | 3:d22f3e52d06a | 446 | if (builddate) { |
WiredHome | 3:d22f3e52d06a | 447 | lcd->SetTextCursor(r.p1.x, r.p1.y+32); |
WiredHome | 3:d22f3e52d06a | 448 | lcd->printf("%s", Build); |
WiredHome | 3:d22f3e52d06a | 449 | } |
WiredHome | 1:dd07e1deec6c | 450 | lcd->window(); |
WiredHome | 1:dd07e1deec6c | 451 | } |
WiredHome | 1:dd07e1deec6c | 452 | |
WiredHome | 1:dd07e1deec6c | 453 | void SignalGenDisplay::ShowBrightnessSetting(void) { |
WiredHome | 3:d22f3e52d06a | 454 | int i; |
WiredHome | 1:dd07e1deec6c | 455 | // Sunbeam |
WiredHome | 1:dd07e1deec6c | 456 | lcd->fillrect(sunray[0], White); |
WiredHome | 1:dd07e1deec6c | 457 | lcd->fillrect(sunray[1], White); |
WiredHome | 3:d22f3e52d06a | 458 | for (i=-2; i<=+2; i++) { |
WiredHome | 3:d22f3e52d06a | 459 | lcd->line( |
WiredHome | 3:d22f3e52d06a | 460 | (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 | 461 | (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 | 462 | White); |
WiredHome | 3:d22f3e52d06a | 463 | lcd->line( |
WiredHome | 3:d22f3e52d06a | 464 | (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 | 465 | (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 | 466 | White); |
WiredHome | 3:d22f3e52d06a | 467 | } |
WiredHome | 1:dd07e1deec6c | 468 | lcd->fillcircle(suncenter, 18, UI_BackColor); |
WiredHome | 3:d22f3e52d06a | 469 | lcd->fillcircle(suncenter, 12, White); |
WiredHome | 1:dd07e1deec6c | 470 | lcd->rect(sungraph, Blue); |
WiredHome | 1:dd07e1deec6c | 471 | float bl = lcd->GetBacklight(); |
WiredHome | 1:dd07e1deec6c | 472 | lcd->fillrect(inrgraph, UI_BackColor); |
WiredHome | 1:dd07e1deec6c | 473 | 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 | 474 | } |
WiredHome | 1:dd07e1deec6c | 475 | |
WiredHome | 2:8f71b71fce1b | 476 | void SignalGenDisplay::ShowMenu(void) { |
WiredHome | 2:8f71b71fce1b | 477 | if (Manuf) { |
WiredHome | 2:8f71b71fce1b | 478 | printf("\r\n%s v%s by %s build %s\r\n\r\n", ProgName, Ver, Manuf, Build); |
WiredHome | 2:8f71b71fce1b | 479 | } |
WiredHome | 2:8f71b71fce1b | 480 | printf(" Select: Signal:\r\n"); |
WiredHome | 2:8f71b71fce1b | 481 | printf(" S: Sine Wave d: Duty Cycle\r\n"); |
WiredHome | 2:8f71b71fce1b | 482 | printf(" Q: Square Wave f: Frequency\r\n"); |
WiredHome | 2:8f71b71fce1b | 483 | printf(" T: Triangle Wave p: Period\r\n"); |
WiredHome | 2:8f71b71fce1b | 484 | printf(" W: Sawtooth Wave v: Voltage\r\n"); |
WiredHome | 2:8f71b71fce1b | 485 | printf(" U: User Wave o: Offset\r\n"); |
WiredHome | 2:8f71b71fce1b | 486 | printf(" \r\n"); |
WiredHome | 2:8f71b71fce1b | 487 | printf(" 0-9 . - : Numeric entry\r\n"); |
WiredHome | 2:8f71b71fce1b | 488 | printf(" < > : Modify selected signal\r\n"); |
WiredHome | 2:8f71b71fce1b | 489 | printf(" <bs>: Backspace entry\r\n"); |
WiredHome | 2:8f71b71fce1b | 490 | printf(" ?: This help <cr>: Save number\r\n"); |
WiredHome | 2:8f71b71fce1b | 491 | printf(" #: Dump RA8875 <esc>: Exit number entry\r\n"); |
WiredHome | 2:8f71b71fce1b | 492 | //printf(" 4: Reverse sawtoothSignal\r\n"); |
WiredHome | 2:8f71b71fce1b | 493 | } |
WiredHome | 2:8f71b71fce1b | 494 | |
WiredHome | 2:8f71b71fce1b | 495 | SignalGenDisplay::OM_Changes SignalGenDisplay::Poll(char c) { |
WiredHome | 2:8f71b71fce1b | 496 | OM_Changes ret = OM_NONE; |
WiredHome | 1:dd07e1deec6c | 497 | |
WiredHome | 3:d22f3e52d06a | 498 | if (needsInit) |
WiredHome | 3:d22f3e52d06a | 499 | Refresh(); // If Poll was the first API call, we need to init |
WiredHome | 2:8f71b71fce1b | 500 | SaveSettings(); |
WiredHome | 1:dd07e1deec6c | 501 | if (!c) { |
WiredHome | 1:dd07e1deec6c | 502 | c = GetTouchEvent(); |
WiredHome | 1:dd07e1deec6c | 503 | } |
WiredHome | 1:dd07e1deec6c | 504 | if (c) { |
WiredHome | 1:dd07e1deec6c | 505 | printf("%02X: EntryMd: %d, textLen: %d [%s] VIS: %d\r\n", c, EntryMd, textLen, textBuffer, vis); |
WiredHome | 3:d22f3e52d06a | 506 | } |
WiredHome | 3:d22f3e52d06a | 507 | /// 01234567890-. #?SQTW dfpvo < > <bs> <enter> <esc> |
WiredHome | 1:dd07e1deec6c | 508 | switch (c) { |
WiredHome | 2:8f71b71fce1b | 509 | case '#': |
WiredHome | 3:d22f3e52d06a | 510 | printf("DumpRegisters for RA8875 unsupported\r\n"); |
WiredHome | 3:d22f3e52d06a | 511 | //lcd->DumpRegisters(); |
WiredHome | 2:8f71b71fce1b | 512 | break; |
WiredHome | 1:dd07e1deec6c | 513 | case '?': |
WiredHome | 1:dd07e1deec6c | 514 | ShowMenu(); |
WiredHome | 1:dd07e1deec6c | 515 | break; |
WiredHome | 3:d22f3e52d06a | 516 | case 'G': // Go is 'Start' |
WiredHome | 3:d22f3e52d06a | 517 | signal->Start(false); |
WiredHome | 3:d22f3e52d06a | 518 | ShowStartStop(true); |
WiredHome | 3:d22f3e52d06a | 519 | break; |
WiredHome | 3:d22f3e52d06a | 520 | case 'O': // Off |
WiredHome | 3:d22f3e52d06a | 521 | signal->Stop(); |
WiredHome | 3:d22f3e52d06a | 522 | ShowStartStop(true); |
WiredHome | 3:d22f3e52d06a | 523 | break; |
WiredHome | 3:d22f3e52d06a | 524 | case 'P': // 'P'ulse |
WiredHome | 3:d22f3e52d06a | 525 | signal->Start(true); |
WiredHome | 3:d22f3e52d06a | 526 | ShowStartStop(true); |
WiredHome | 3:d22f3e52d06a | 527 | break; |
WiredHome | 1:dd07e1deec6c | 528 | case 'S': |
WiredHome | 2:8f71b71fce1b | 529 | if (mode != SG_SINE) |
WiredHome | 2:8f71b71fce1b | 530 | SaveSettings(OM_MODE); |
WiredHome | 2:8f71b71fce1b | 531 | SetWaveformMode(SG_SINE); |
WiredHome | 2:8f71b71fce1b | 532 | signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset); |
WiredHome | 1:dd07e1deec6c | 533 | //ret = SG_SINE; |
WiredHome | 1:dd07e1deec6c | 534 | break; |
WiredHome | 1:dd07e1deec6c | 535 | case 'Q': |
WiredHome | 2:8f71b71fce1b | 536 | if (mode != SG_SQUARE) |
WiredHome | 2:8f71b71fce1b | 537 | SaveSettings(OM_MODE); |
WiredHome | 2:8f71b71fce1b | 538 | SetWaveformMode(SG_SQUARE); |
WiredHome | 2:8f71b71fce1b | 539 | signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset); |
WiredHome | 1:dd07e1deec6c | 540 | //ret = SG_SQUARE; |
WiredHome | 1:dd07e1deec6c | 541 | break; |
WiredHome | 1:dd07e1deec6c | 542 | case 'T': |
WiredHome | 2:8f71b71fce1b | 543 | if (mode != SG_TRIANGLE) |
WiredHome | 2:8f71b71fce1b | 544 | SaveSettings(OM_MODE); |
WiredHome | 2:8f71b71fce1b | 545 | SetWaveformMode(SG_TRIANGLE); |
WiredHome | 2:8f71b71fce1b | 546 | signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset); |
WiredHome | 1:dd07e1deec6c | 547 | //ret = SG_TRIANGLE; |
WiredHome | 1:dd07e1deec6c | 548 | break; |
WiredHome | 1:dd07e1deec6c | 549 | case 'W': |
WiredHome | 2:8f71b71fce1b | 550 | if (mode != SG_SAWTOOTH) |
WiredHome | 2:8f71b71fce1b | 551 | SaveSettings(OM_MODE); |
WiredHome | 2:8f71b71fce1b | 552 | SetWaveformMode(SG_SAWTOOTH); |
WiredHome | 2:8f71b71fce1b | 553 | signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset); |
WiredHome | 1:dd07e1deec6c | 554 | //ret = SG_SAWTOOTH; |
WiredHome | 1:dd07e1deec6c | 555 | break; |
WiredHome | 1:dd07e1deec6c | 556 | case 'U': |
WiredHome | 2:8f71b71fce1b | 557 | if (mode != SG_USER) |
WiredHome | 2:8f71b71fce1b | 558 | SaveSettings(OM_MODE); |
WiredHome | 2:8f71b71fce1b | 559 | SetWaveformMode(SG_USER); |
WiredHome | 2:8f71b71fce1b | 560 | signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset); |
WiredHome | 1:dd07e1deec6c | 561 | //ret = SG_USER; |
WiredHome | 1:dd07e1deec6c | 562 | break; |
WiredHome | 1:dd07e1deec6c | 563 | case '0': |
WiredHome | 1:dd07e1deec6c | 564 | case '1': |
WiredHome | 1:dd07e1deec6c | 565 | case '2': |
WiredHome | 1:dd07e1deec6c | 566 | case '3': |
WiredHome | 1:dd07e1deec6c | 567 | case '4': |
WiredHome | 1:dd07e1deec6c | 568 | case '5': |
WiredHome | 1:dd07e1deec6c | 569 | case '6': |
WiredHome | 1:dd07e1deec6c | 570 | case '7': |
WiredHome | 1:dd07e1deec6c | 571 | case '8': |
WiredHome | 1:dd07e1deec6c | 572 | case '9': |
WiredHome | 1:dd07e1deec6c | 573 | case '.': |
WiredHome | 1:dd07e1deec6c | 574 | case '-': |
WiredHome | 1:dd07e1deec6c | 575 | if (EntryMd) { |
WiredHome | 1:dd07e1deec6c | 576 | if (textLen<8) { |
WiredHome | 1:dd07e1deec6c | 577 | textBuffer[textLen++] = c; |
WiredHome | 1:dd07e1deec6c | 578 | textBuffer[textLen] = '\0'; |
WiredHome | 1:dd07e1deec6c | 579 | updateTextWindow(); |
WiredHome | 1:dd07e1deec6c | 580 | } |
WiredHome | 1:dd07e1deec6c | 581 | } |
WiredHome | 1:dd07e1deec6c | 582 | break; |
WiredHome | 1:dd07e1deec6c | 583 | case '\x08': |
WiredHome | 1:dd07e1deec6c | 584 | if (EntryMd) { |
WiredHome | 1:dd07e1deec6c | 585 | if (textLen) { |
WiredHome | 1:dd07e1deec6c | 586 | textLen--; |
WiredHome | 1:dd07e1deec6c | 587 | textBuffer[textLen] = '\0'; |
WiredHome | 1:dd07e1deec6c | 588 | updateTextWindow(); |
WiredHome | 1:dd07e1deec6c | 589 | } |
WiredHome | 2:8f71b71fce1b | 590 | if (textLen == 0) |
WiredHome | 2:8f71b71fce1b | 591 | clearTextWindow(); |
WiredHome | 1:dd07e1deec6c | 592 | } |
WiredHome | 1:dd07e1deec6c | 593 | break; |
WiredHome | 1:dd07e1deec6c | 594 | case '\x1B': |
WiredHome | 1:dd07e1deec6c | 595 | textBuffer[0] = '\0'; |
WiredHome | 1:dd07e1deec6c | 596 | textLen = 0; |
WiredHome | 1:dd07e1deec6c | 597 | resetDataEntry(); |
WiredHome | 1:dd07e1deec6c | 598 | break; |
WiredHome | 1:dd07e1deec6c | 599 | case '\r': |
WiredHome | 1:dd07e1deec6c | 600 | case '\n': |
WiredHome | 1:dd07e1deec6c | 601 | if (EntryMd) { |
WiredHome | 1:dd07e1deec6c | 602 | if (strlen(textBuffer)) { |
WiredHome | 1:dd07e1deec6c | 603 | switch (EntryMd) { |
WiredHome | 2:8f71b71fce1b | 604 | case OM_DUTY: |
WiredHome | 1:dd07e1deec6c | 605 | SetDutyCycle(atof(textBuffer)); |
WiredHome | 2:8f71b71fce1b | 606 | signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset); |
WiredHome | 2:8f71b71fce1b | 607 | SaveSettings(OM_DUTY); |
WiredHome | 1:dd07e1deec6c | 608 | break; |
WiredHome | 2:8f71b71fce1b | 609 | case OM_FREQ: |
WiredHome | 1:dd07e1deec6c | 610 | SetFrequency(atof(textBuffer)); |
WiredHome | 2:8f71b71fce1b | 611 | signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset); |
WiredHome | 2:8f71b71fce1b | 612 | SaveSettings(OM_FREQ); |
WiredHome | 1:dd07e1deec6c | 613 | break; |
WiredHome | 2:8f71b71fce1b | 614 | case OM_PERI: |
WiredHome | 1:dd07e1deec6c | 615 | SetPeriod(atof(textBuffer)); |
WiredHome | 2:8f71b71fce1b | 616 | signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset); |
WiredHome | 2:8f71b71fce1b | 617 | SaveSettings(OM_FREQ); |
WiredHome | 1:dd07e1deec6c | 618 | break; |
WiredHome | 2:8f71b71fce1b | 619 | case OM_VOLT: |
WiredHome | 1:dd07e1deec6c | 620 | SetVoltagePeakToPeak(atof(textBuffer)); |
WiredHome | 2:8f71b71fce1b | 621 | signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset); |
WiredHome | 2:8f71b71fce1b | 622 | SaveSettings(OM_VOLT); |
WiredHome | 1:dd07e1deec6c | 623 | break; |
WiredHome | 2:8f71b71fce1b | 624 | case OM_OFFS: |
WiredHome | 1:dd07e1deec6c | 625 | SetVoltageOffset(atof(textBuffer)); |
WiredHome | 2:8f71b71fce1b | 626 | signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset); |
WiredHome | 2:8f71b71fce1b | 627 | SaveSettings(OM_OFFS); |
WiredHome | 1:dd07e1deec6c | 628 | break; |
WiredHome | 1:dd07e1deec6c | 629 | default: |
WiredHome | 1:dd07e1deec6c | 630 | break; |
WiredHome | 1:dd07e1deec6c | 631 | } |
WiredHome | 1:dd07e1deec6c | 632 | } |
WiredHome | 2:8f71b71fce1b | 633 | resetDataEntry(OM_NONE, true); |
WiredHome | 1:dd07e1deec6c | 634 | } |
WiredHome | 1:dd07e1deec6c | 635 | break; |
WiredHome | 1:dd07e1deec6c | 636 | case '>': |
WiredHome | 1:dd07e1deec6c | 637 | switch (EntryMd) { |
WiredHome | 2:8f71b71fce1b | 638 | case OM_DUTY: |
WiredHome | 1:dd07e1deec6c | 639 | SetDutyCycle(dutycycle + 1.0); |
WiredHome | 2:8f71b71fce1b | 640 | signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset); |
WiredHome | 2:8f71b71fce1b | 641 | SaveSettings(OM_DUTY); |
WiredHome | 1:dd07e1deec6c | 642 | break; |
WiredHome | 2:8f71b71fce1b | 643 | case OM_FREQ: |
WiredHome | 1:dd07e1deec6c | 644 | SetFrequency(frequency + 1.0); |
WiredHome | 2:8f71b71fce1b | 645 | signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset); |
WiredHome | 2:8f71b71fce1b | 646 | SaveSettings(OM_FREQ); |
WiredHome | 1:dd07e1deec6c | 647 | break; |
WiredHome | 2:8f71b71fce1b | 648 | case OM_PERI: |
WiredHome | 2:8f71b71fce1b | 649 | SetPeriod(1/frequency + 0.000001); |
WiredHome | 2:8f71b71fce1b | 650 | signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset); |
WiredHome | 2:8f71b71fce1b | 651 | SaveSettings(OM_FREQ); |
WiredHome | 1:dd07e1deec6c | 652 | break; |
WiredHome | 2:8f71b71fce1b | 653 | case OM_VOLT: |
WiredHome | 1:dd07e1deec6c | 654 | SetVoltagePeakToPeak(voltage + 0.1); |
WiredHome | 2:8f71b71fce1b | 655 | signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset); |
WiredHome | 2:8f71b71fce1b | 656 | SaveSettings(OM_VOLT); |
WiredHome | 1:dd07e1deec6c | 657 | break; |
WiredHome | 2:8f71b71fce1b | 658 | case OM_OFFS: |
WiredHome | 2:8f71b71fce1b | 659 | SetVoltageOffset(offset + 0.1); |
WiredHome | 2:8f71b71fce1b | 660 | signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset); |
WiredHome | 2:8f71b71fce1b | 661 | SaveSettings(OM_OFFS); |
WiredHome | 1:dd07e1deec6c | 662 | break; |
WiredHome | 1:dd07e1deec6c | 663 | default: |
WiredHome | 1:dd07e1deec6c | 664 | break; |
WiredHome | 1:dd07e1deec6c | 665 | } |
WiredHome | 1:dd07e1deec6c | 666 | break; |
WiredHome | 1:dd07e1deec6c | 667 | case '<': |
WiredHome | 1:dd07e1deec6c | 668 | switch (EntryMd) { |
WiredHome | 2:8f71b71fce1b | 669 | case OM_DUTY: |
WiredHome | 1:dd07e1deec6c | 670 | SetDutyCycle(dutycycle - 1.0); |
WiredHome | 2:8f71b71fce1b | 671 | signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset); |
WiredHome | 2:8f71b71fce1b | 672 | SaveSettings(OM_DUTY); |
WiredHome | 1:dd07e1deec6c | 673 | break; |
WiredHome | 2:8f71b71fce1b | 674 | case OM_FREQ: |
WiredHome | 1:dd07e1deec6c | 675 | SetFrequency(frequency - 1.0); |
WiredHome | 2:8f71b71fce1b | 676 | signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset); |
WiredHome | 2:8f71b71fce1b | 677 | SaveSettings(OM_FREQ); |
WiredHome | 1:dd07e1deec6c | 678 | break; |
WiredHome | 2:8f71b71fce1b | 679 | case OM_PERI: |
WiredHome | 2:8f71b71fce1b | 680 | SetPeriod(1/frequency - 0.000001); |
WiredHome | 2:8f71b71fce1b | 681 | signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset); |
WiredHome | 2:8f71b71fce1b | 682 | SaveSettings(OM_FREQ); |
WiredHome | 1:dd07e1deec6c | 683 | break; |
WiredHome | 2:8f71b71fce1b | 684 | case OM_VOLT: |
WiredHome | 1:dd07e1deec6c | 685 | SetVoltagePeakToPeak(voltage - 0.1); |
WiredHome | 2:8f71b71fce1b | 686 | signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset); |
WiredHome | 2:8f71b71fce1b | 687 | SaveSettings(OM_VOLT); |
WiredHome | 1:dd07e1deec6c | 688 | break; |
WiredHome | 2:8f71b71fce1b | 689 | case OM_OFFS: |
WiredHome | 2:8f71b71fce1b | 690 | SetVoltageOffset(offset - 0.1); |
WiredHome | 2:8f71b71fce1b | 691 | signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset); |
WiredHome | 2:8f71b71fce1b | 692 | SaveSettings(OM_OFFS); |
WiredHome | 1:dd07e1deec6c | 693 | break; |
WiredHome | 1:dd07e1deec6c | 694 | default: |
WiredHome | 1:dd07e1deec6c | 695 | break; |
WiredHome | 1:dd07e1deec6c | 696 | } |
WiredHome | 1:dd07e1deec6c | 697 | break; |
WiredHome | 1:dd07e1deec6c | 698 | case 'd': |
WiredHome | 2:8f71b71fce1b | 699 | if (EntryMd != OM_DUTY) { |
WiredHome | 2:8f71b71fce1b | 700 | SaveSettings(EntryMd); |
WiredHome | 2:8f71b71fce1b | 701 | resetDataEntry(OM_DUTY, true); |
WiredHome | 1:dd07e1deec6c | 702 | updateDutyCycle(); |
WiredHome | 2:8f71b71fce1b | 703 | signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset); |
WiredHome | 1:dd07e1deec6c | 704 | } else { |
WiredHome | 2:8f71b71fce1b | 705 | resetDataEntry(OM_NONE, true); |
WiredHome | 1:dd07e1deec6c | 706 | } |
WiredHome | 1:dd07e1deec6c | 707 | break; |
WiredHome | 1:dd07e1deec6c | 708 | case 'f': |
WiredHome | 2:8f71b71fce1b | 709 | if (EntryMd != OM_FREQ) { |
WiredHome | 2:8f71b71fce1b | 710 | SaveSettings(EntryMd); |
WiredHome | 2:8f71b71fce1b | 711 | resetDataEntry(OM_FREQ, true); |
WiredHome | 1:dd07e1deec6c | 712 | updateFrequency(); |
WiredHome | 2:8f71b71fce1b | 713 | signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset); |
WiredHome | 1:dd07e1deec6c | 714 | } else { |
WiredHome | 2:8f71b71fce1b | 715 | resetDataEntry(OM_NONE, true); |
WiredHome | 1:dd07e1deec6c | 716 | } |
WiredHome | 1:dd07e1deec6c | 717 | break; |
WiredHome | 1:dd07e1deec6c | 718 | case 'p': |
WiredHome | 2:8f71b71fce1b | 719 | if (EntryMd != OM_PERI) { |
WiredHome | 2:8f71b71fce1b | 720 | SaveSettings(EntryMd); |
WiredHome | 2:8f71b71fce1b | 721 | resetDataEntry(OM_PERI, true); |
WiredHome | 1:dd07e1deec6c | 722 | updatePeriod(); |
WiredHome | 2:8f71b71fce1b | 723 | signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset); |
WiredHome | 1:dd07e1deec6c | 724 | } else { |
WiredHome | 2:8f71b71fce1b | 725 | resetDataEntry(OM_NONE, true); |
WiredHome | 1:dd07e1deec6c | 726 | } |
WiredHome | 1:dd07e1deec6c | 727 | break; |
WiredHome | 1:dd07e1deec6c | 728 | case 'v': |
WiredHome | 2:8f71b71fce1b | 729 | if (EntryMd != OM_VOLT) { |
WiredHome | 2:8f71b71fce1b | 730 | SaveSettings(EntryMd); |
WiredHome | 2:8f71b71fce1b | 731 | resetDataEntry(OM_VOLT, true); |
WiredHome | 1:dd07e1deec6c | 732 | updateVoltage(); |
WiredHome | 2:8f71b71fce1b | 733 | signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset); |
WiredHome | 1:dd07e1deec6c | 734 | } else { |
WiredHome | 2:8f71b71fce1b | 735 | resetDataEntry(OM_NONE, true); |
WiredHome | 1:dd07e1deec6c | 736 | } |
WiredHome | 1:dd07e1deec6c | 737 | break; |
WiredHome | 1:dd07e1deec6c | 738 | case 'o': |
WiredHome | 2:8f71b71fce1b | 739 | if (EntryMd != OM_OFFS) { |
WiredHome | 2:8f71b71fce1b | 740 | SaveSettings(EntryMd); |
WiredHome | 2:8f71b71fce1b | 741 | resetDataEntry(OM_OFFS, true); |
WiredHome | 1:dd07e1deec6c | 742 | updateOffset(); |
WiredHome | 2:8f71b71fce1b | 743 | signal->PrepareWaveform(mode, frequency, dutycycle, voltage, offset); |
WiredHome | 1:dd07e1deec6c | 744 | } else { |
WiredHome | 2:8f71b71fce1b | 745 | resetDataEntry(OM_NONE, true); |
WiredHome | 1:dd07e1deec6c | 746 | } |
WiredHome | 1:dd07e1deec6c | 747 | break; |
WiredHome | 1:dd07e1deec6c | 748 | default: |
WiredHome | 1:dd07e1deec6c | 749 | break; |
WiredHome | 1:dd07e1deec6c | 750 | } |
WiredHome | 1:dd07e1deec6c | 751 | return ret; |
WiredHome | 1:dd07e1deec6c | 752 | } |
WiredHome | 1:dd07e1deec6c | 753 | |
WiredHome | 2:8f71b71fce1b | 754 | bool SignalGenDisplay::SetWaveformMode(SG_Mode _mode, bool force) { |
WiredHome | 1:dd07e1deec6c | 755 | if (/* _mode >= SG_SINE && */ _mode <= SG_USER) { |
WiredHome | 2:8f71b71fce1b | 756 | mode = _mode; |
WiredHome | 2:8f71b71fce1b | 757 | DrawModeButtons(); |
WiredHome | 1:dd07e1deec6c | 758 | return true; |
WiredHome | 1:dd07e1deec6c | 759 | } else { |
WiredHome | 1:dd07e1deec6c | 760 | return false; |
WiredHome | 1:dd07e1deec6c | 761 | } |
WiredHome | 1:dd07e1deec6c | 762 | } |
WiredHome | 1:dd07e1deec6c | 763 | |
WiredHome | 1:dd07e1deec6c | 764 | bool SignalGenDisplay::SetDutyCycle(float _dutyCycle) { |
WiredHome | 1:dd07e1deec6c | 765 | if (_dutyCycle >= 5 && _dutyCycle <= 95) { |
WiredHome | 1:dd07e1deec6c | 766 | dutycycle = _dutyCycle; |
WiredHome | 1:dd07e1deec6c | 767 | updateDutyCycle(); |
WiredHome | 1:dd07e1deec6c | 768 | UpdateScope(); |
WiredHome | 1:dd07e1deec6c | 769 | return true; |
WiredHome | 1:dd07e1deec6c | 770 | } else { |
WiredHome | 1:dd07e1deec6c | 771 | return false; |
WiredHome | 1:dd07e1deec6c | 772 | } |
WiredHome | 1:dd07e1deec6c | 773 | } |
WiredHome | 1:dd07e1deec6c | 774 | |
WiredHome | 1:dd07e1deec6c | 775 | bool SignalGenDisplay::SetFrequency(float _frequency) { |
WiredHome | 1:dd07e1deec6c | 776 | if (_frequency >= 1.0 && _frequency <= 1.0E6) { |
WiredHome | 1:dd07e1deec6c | 777 | frequency = _frequency; |
WiredHome | 1:dd07e1deec6c | 778 | updateFrequency(); |
WiredHome | 1:dd07e1deec6c | 779 | updatePeriod(); |
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::SetPeriod(float _period) { |
WiredHome | 1:dd07e1deec6c | 788 | if (_period >= 1.0E-6 && _period <= 1.0) { |
WiredHome | 1:dd07e1deec6c | 789 | frequency = 1/_period; |
WiredHome | 1:dd07e1deec6c | 790 | updatePeriod(); |
WiredHome | 1:dd07e1deec6c | 791 | updateFrequency(); |
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::SetVoltagePeakToPeak(float _voltage) { |
WiredHome | 1:dd07e1deec6c | 800 | if (_voltage >= 0.0 && _voltage <= 3.3) { |
WiredHome | 1:dd07e1deec6c | 801 | voltage = _voltage; |
WiredHome | 1:dd07e1deec6c | 802 | updateVoltage(); |
WiredHome | 1:dd07e1deec6c | 803 | UpdateScope(); |
WiredHome | 1:dd07e1deec6c | 804 | return true; |
WiredHome | 1:dd07e1deec6c | 805 | } else { |
WiredHome | 1:dd07e1deec6c | 806 | return false; |
WiredHome | 1:dd07e1deec6c | 807 | } |
WiredHome | 1:dd07e1deec6c | 808 | } |
WiredHome | 1:dd07e1deec6c | 809 | |
WiredHome | 1:dd07e1deec6c | 810 | bool SignalGenDisplay::SetVoltageOffset(float _voltage) { |
WiredHome | 3:d22f3e52d06a | 811 | if (_voltage > -SG_MAX_V && _voltage < SG_MAX_V) { |
WiredHome | 1:dd07e1deec6c | 812 | if (abs(_voltage) < 0.008) // if binary precision slips it, fix it |
WiredHome | 1:dd07e1deec6c | 813 | _voltage = 0.0; |
WiredHome | 1:dd07e1deec6c | 814 | offset = _voltage; |
WiredHome | 1:dd07e1deec6c | 815 | updateOffset(); |
WiredHome | 1:dd07e1deec6c | 816 | UpdateScope(); |
WiredHome | 1:dd07e1deec6c | 817 | return true; |
WiredHome | 1:dd07e1deec6c | 818 | } else { |
WiredHome | 1:dd07e1deec6c | 819 | return false; |
WiredHome | 1:dd07e1deec6c | 820 | } |
WiredHome | 1:dd07e1deec6c | 821 | } |
WiredHome | 1:dd07e1deec6c | 822 | |
WiredHome | 1:dd07e1deec6c | 823 | // ######################## Private Methods past here ####################### |
WiredHome | 1:dd07e1deec6c | 824 | |
WiredHome | 1:dd07e1deec6c | 825 | void SignalGenDisplay::UpdateScope(void) { |
WiredHome | 1:dd07e1deec6c | 826 | ClearScope(); |
WiredHome | 2:8f71b71fce1b | 827 | rect_t r = UI_WAVE_RECT; |
WiredHome | 1:dd07e1deec6c | 828 | |
WiredHome | 2:8f71b71fce1b | 829 | float vPeakPos, vPeakNeg; |
WiredHome | 2:8f71b71fce1b | 830 | dim_t waveHeight = (UI_WAVE_RECT.p2.y - UI_WAVE_RECT.p1.y); |
WiredHome | 2:8f71b71fce1b | 831 | vPeakPos = rangelimit(offset + voltage/2, SG_MIN_V, SG_MAX_V); |
WiredHome | 2:8f71b71fce1b | 832 | vPeakNeg = rangelimit(offset - voltage/2, SG_MIN_V, SG_MAX_V); |
WiredHome | 2:8f71b71fce1b | 833 | loc_t markerPos_y = UI_WAVE_RECT.p2.y - vPeakPos/(SG_MAX_V-SG_MIN_V) * waveHeight; |
WiredHome | 2:8f71b71fce1b | 834 | loc_t markerNeg_y = UI_WAVE_RECT.p2.y - vPeakNeg/(SG_MAX_V-SG_MIN_V) * waveHeight; |
WiredHome | 2:8f71b71fce1b | 835 | loc_t df = rangelimit(offset, SG_MIN_V, SG_MAX_V) / SG_MAX_V * (r.p2.y - r.p1.y); |
WiredHome | 2:8f71b71fce1b | 836 | loc_t y; |
WiredHome | 2:8f71b71fce1b | 837 | |
WiredHome | 3:d22f3e52d06a | 838 | lcd->SelectUserFont(BPG_Arial08x08); |
WiredHome | 3:d22f3e52d06a | 839 | lcd->background(UI_ScopeBackColor); |
WiredHome | 2:8f71b71fce1b | 840 | // Draw the Waveform rectangle |
WiredHome | 2:8f71b71fce1b | 841 | lcd->rect(UI_WAVE_RECT, WaveOutlineColor); |
WiredHome | 1:dd07e1deec6c | 842 | |
WiredHome | 1:dd07e1deec6c | 843 | // Draw the Peak to Peak markers |
WiredHome | 2:8f71b71fce1b | 844 | 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 | 845 | 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 | 846 | 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 | 847 | lcd->filltriangle( // top arrowhead |
WiredHome | 2:8f71b71fce1b | 848 | r.p2.x+3*SC_RIGHT_MARGIN/4-3, markerPos_y, |
WiredHome | 2:8f71b71fce1b | 849 | r.p2.x+3*SC_RIGHT_MARGIN/4-3+2,markerPos_y+3, |
WiredHome | 2:8f71b71fce1b | 850 | r.p2.x+3*SC_RIGHT_MARGIN/4-3-2,markerPos_y+3, |
WiredHome | 1:dd07e1deec6c | 851 | UI_VP2PColor); |
WiredHome | 2:8f71b71fce1b | 852 | lcd->filltriangle( // bottom arrowhead |
WiredHome | 2:8f71b71fce1b | 853 | r.p2.x+3*SC_RIGHT_MARGIN/4-3, markerNeg_y, |
WiredHome | 2:8f71b71fce1b | 854 | r.p2.x+3*SC_RIGHT_MARGIN/4-3+2,markerNeg_y-3, |
WiredHome | 2:8f71b71fce1b | 855 | r.p2.x+3*SC_RIGHT_MARGIN/4-3-2,markerNeg_y-3, |
WiredHome | 1:dd07e1deec6c | 856 | UI_VP2PColor); |
WiredHome | 3:d22f3e52d06a | 857 | lcd->SetTextCursor(r.p2.x+3*SC_RIGHT_MARGIN/4-3 - 10, markerPos_y - 9); |
WiredHome | 3:d22f3e52d06a | 858 | lcd->printf("%3.2f", vPeakPos); |
WiredHome | 3:d22f3e52d06a | 859 | lcd->SetTextCursor(r.p2.x+3*SC_RIGHT_MARGIN/4-3 - 10, markerNeg_y + 3); |
WiredHome | 3:d22f3e52d06a | 860 | lcd->printf("%3.2f", vPeakNeg); |
WiredHome | 1:dd07e1deec6c | 861 | |
WiredHome | 1:dd07e1deec6c | 862 | // Draw the offset voltage markers |
WiredHome | 2:8f71b71fce1b | 863 | y = r.p2.y - df; |
WiredHome | 1:dd07e1deec6c | 864 | dim_t w = (r.p2.x + SC_RIGHT_MARGIN/3 - r.p1.x) / 35; |
WiredHome | 2:8f71b71fce1b | 865 | for (int i=0; i<=35+1; i++) { // dashed line |
WiredHome | 1:dd07e1deec6c | 866 | if ((i & 1) == 0) { |
WiredHome | 1:dd07e1deec6c | 867 | lcd->line(r.p1.x + i * w,y, r.p1.x + (i+1) * w, y, UI_VOffsetColor); |
WiredHome | 1:dd07e1deec6c | 868 | } |
WiredHome | 1:dd07e1deec6c | 869 | } |
WiredHome | 1:dd07e1deec6c | 870 | switch (sgn(offset)) { |
WiredHome | 1:dd07e1deec6c | 871 | default: |
WiredHome | 1:dd07e1deec6c | 872 | case 0: |
WiredHome | 1:dd07e1deec6c | 873 | break; |
WiredHome | 1:dd07e1deec6c | 874 | case -1: |
WiredHome | 1:dd07e1deec6c | 875 | case 1: |
WiredHome | 2:8f71b71fce1b | 876 | 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 | 877 | lcd->filltriangle( |
WiredHome | 1:dd07e1deec6c | 878 | r.p2.x+SC_RIGHT_MARGIN/3-3,y, |
WiredHome | 1:dd07e1deec6c | 879 | r.p2.x+SC_RIGHT_MARGIN/3-3+2,y+sgn(offset)*3, |
WiredHome | 1:dd07e1deec6c | 880 | r.p2.x+SC_RIGHT_MARGIN/3-3-2,y+sgn(offset)*3, |
WiredHome | 1:dd07e1deec6c | 881 | UI_VOffsetColor); |
WiredHome | 2:8f71b71fce1b | 882 | lcd->line(r.p2.x,r.p2.y, r.p2.x+SC_RIGHT_MARGIN/3,r.p2.y, UI_VOffsetColor); // horz |
WiredHome | 1:dd07e1deec6c | 883 | break; |
WiredHome | 1:dd07e1deec6c | 884 | } |
WiredHome | 3:d22f3e52d06a | 885 | lcd->SetTextCursor(r.p2.x+SC_RIGHT_MARGIN/3-3 - 8, y - 10); |
WiredHome | 3:d22f3e52d06a | 886 | lcd->printf("%3.2f", offset); |
WiredHome | 3:d22f3e52d06a | 887 | |
WiredHome | 1:dd07e1deec6c | 888 | // Draw the Frequency marker |
WiredHome | 1:dd07e1deec6c | 889 | w = r.p2.x - r.p1.x; |
WiredHome | 1:dd07e1deec6c | 890 | dim_t dc = dutycycle/100.0 * 1*w/2; |
WiredHome | 2:8f71b71fce1b | 891 | 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 | 892 | 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 | 893 | 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 | 894 | lcd->filltriangle( |
WiredHome | 1:dd07e1deec6c | 895 | r.p1.x+0,r.p2.y+3*SC_BOT_MARGIN/4-3, |
WiredHome | 1:dd07e1deec6c | 896 | r.p1.x+3,r.p2.y+3*SC_BOT_MARGIN/4-3-2, |
WiredHome | 1:dd07e1deec6c | 897 | r.p1.x+3,r.p2.y+3*SC_BOT_MARGIN/4-3+2, |
WiredHome | 1:dd07e1deec6c | 898 | UI_FreqColor); |
WiredHome | 1:dd07e1deec6c | 899 | lcd->filltriangle( |
WiredHome | 1:dd07e1deec6c | 900 | r.p1.x+1*w/2-0,r.p2.y+3*SC_BOT_MARGIN/4-3, |
WiredHome | 1:dd07e1deec6c | 901 | r.p1.x+1*w/2-3,r.p2.y+3*SC_BOT_MARGIN/4-3-2, |
WiredHome | 1:dd07e1deec6c | 902 | r.p1.x+1*w/2-3,r.p2.y+3*SC_BOT_MARGIN/4-3+2, |
WiredHome | 1:dd07e1deec6c | 903 | UI_FreqColor); |
WiredHome | 1:dd07e1deec6c | 904 | |
WiredHome | 1:dd07e1deec6c | 905 | // Draw the Duty Cycle markers |
WiredHome | 2:8f71b71fce1b | 906 | 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 | 907 | 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 | 908 | point_t p; |
WiredHome | 1:dd07e1deec6c | 909 | p.x = r.p1.x; |
WiredHome | 1:dd07e1deec6c | 910 | p.y = r.p2.y+2*SC_BOT_MARGIN/4-3; |
WiredHome | 1:dd07e1deec6c | 911 | lcd->line(p.x,p.y, p.x+dc,p.y, UI_DutyColor); |
WiredHome | 1:dd07e1deec6c | 912 | lcd->filltriangle( |
WiredHome | 1:dd07e1deec6c | 913 | p.x,p.y, |
WiredHome | 1:dd07e1deec6c | 914 | p.x+3,p.y-2, |
WiredHome | 1:dd07e1deec6c | 915 | p.x+3,p.y+2, |
WiredHome | 1:dd07e1deec6c | 916 | UI_DutyColor); |
WiredHome | 1:dd07e1deec6c | 917 | p.x = r.p1.x + dc; |
WiredHome | 1:dd07e1deec6c | 918 | lcd->filltriangle( |
WiredHome | 1:dd07e1deec6c | 919 | p.x,p.y, |
WiredHome | 1:dd07e1deec6c | 920 | p.x-3,p.y-2, |
WiredHome | 1:dd07e1deec6c | 921 | p.x-3,p.y+2, |
WiredHome | 1:dd07e1deec6c | 922 | UI_DutyColor); |
WiredHome | 3:d22f3e52d06a | 923 | lcd->SetTextCursor(p.x + 3, p.y-4); |
WiredHome | 3:d22f3e52d06a | 924 | float period = dutycycle/100*1/frequency; |
WiredHome | 3:d22f3e52d06a | 925 | if (period < 0.001) |
WiredHome | 3:d22f3e52d06a | 926 | lcd->printf("%8.3f uS", period * 1000000); |
WiredHome | 3:d22f3e52d06a | 927 | else |
WiredHome | 3:d22f3e52d06a | 928 | lcd->printf("%8.3f mS", period * 1000); |
WiredHome | 3:d22f3e52d06a | 929 | |
WiredHome | 3:d22f3e52d06a | 930 | lcd->SelectUserFont(); // restore |
WiredHome | 1:dd07e1deec6c | 931 | DrawWaveform(r, mode, White); |
WiredHome | 1:dd07e1deec6c | 932 | } |
WiredHome | 1:dd07e1deec6c | 933 | |
WiredHome | 2:8f71b71fce1b | 934 | |
WiredHome | 3:d22f3e52d06a | 935 | // ++ +----+ + + |
WiredHome | 3:d22f3e52d06a | 936 | // . . | | / \ / | |
WiredHome | 3:d22f3e52d06a | 937 | // . + | | | / + / + | |
WiredHome | 3:d22f3e52d06a | 938 | // . | | \ / / | |
WiredHome | 3:d22f3e52d06a | 939 | // ++ +----+ + + + |
WiredHome | 1:dd07e1deec6c | 940 | // |
WiredHome | 2:8f71b71fce1b | 941 | void SignalGenDisplay::DrawWaveform(rect_t r, SG_Mode mode, color_t color, bool drawPure) { |
WiredHome | 1:dd07e1deec6c | 942 | loc_t x,y; |
WiredHome | 1:dd07e1deec6c | 943 | loc_t y0 = (r.p1.y + r.p2.y)/2; |
WiredHome | 1:dd07e1deec6c | 944 | dim_t w = r.p2.x - r.p1.x; |
WiredHome | 2:8f71b71fce1b | 945 | dim_t h = r.p2.y - r.p1.y; |
WiredHome | 2:8f71b71fce1b | 946 | dim_t privDutyCycleX; |
WiredHome | 1:dd07e1deec6c | 947 | dim_t a = (r.p2.y - r.p1.y)/2; |
WiredHome | 2:8f71b71fce1b | 948 | float privVoltage = voltage; |
WiredHome | 2:8f71b71fce1b | 949 | float privOffset = offset; |
WiredHome | 2:8f71b71fce1b | 950 | float privDutyCycle = dutycycle; |
WiredHome | 2:8f71b71fce1b | 951 | float vRange = SG_MAX_V - SG_MIN_V; |
WiredHome | 1:dd07e1deec6c | 952 | float v; |
WiredHome | 2:8f71b71fce1b | 953 | |
WiredHome | 2:8f71b71fce1b | 954 | if (drawPure) { |
WiredHome | 2:8f71b71fce1b | 955 | privVoltage = vRange; |
WiredHome | 2:8f71b71fce1b | 956 | privOffset = vRange/2; |
WiredHome | 2:8f71b71fce1b | 957 | privDutyCycle = 50; |
WiredHome | 2:8f71b71fce1b | 958 | } |
WiredHome | 2:8f71b71fce1b | 959 | privDutyCycleX = privDutyCycle/100.0 * 1*w/2; |
WiredHome | 1:dd07e1deec6c | 960 | switch (mode) { |
WiredHome | 1:dd07e1deec6c | 961 | case SG_SINE: |
WiredHome | 1:dd07e1deec6c | 962 | for (int cycle=0; cycle<2; cycle++) { |
WiredHome | 2:8f71b71fce1b | 963 | for (x=0; x<=privDutyCycleX; x++) { |
WiredHome | 2:8f71b71fce1b | 964 | v = privOffset + privVoltage/2 * sin(x * 1 * PI / privDutyCycleX); |
WiredHome | 1:dd07e1deec6c | 965 | v = rangelimit(v, SG_MIN_V, SG_MAX_V); |
WiredHome | 2:8f71b71fce1b | 966 | y = r.p2.y - 2 * a * v / vRange; |
WiredHome | 1:dd07e1deec6c | 967 | lcd->pixel(r.p1.x + cycle * w/2 + x, y, color); |
WiredHome | 1:dd07e1deec6c | 968 | } |
WiredHome | 2:8f71b71fce1b | 969 | for (x=0; x<=(w/2-privDutyCycleX); x++) { |
WiredHome | 2:8f71b71fce1b | 970 | v = privOffset - privVoltage/2 * sin(x * 1 * PI / (w/2-privDutyCycleX)); |
WiredHome | 1:dd07e1deec6c | 971 | v = rangelimit(v, SG_MIN_V, SG_MAX_V); |
WiredHome | 2:8f71b71fce1b | 972 | y = r.p2.y - 2 * a * v / vRange; |
WiredHome | 2:8f71b71fce1b | 973 | lcd->pixel(r.p1.x + cycle * w/2 + privDutyCycleX + x, y, color); |
WiredHome | 1:dd07e1deec6c | 974 | } |
WiredHome | 1:dd07e1deec6c | 975 | } |
WiredHome | 1:dd07e1deec6c | 976 | break; |
WiredHome | 1:dd07e1deec6c | 977 | case SG_SQUARE: |
WiredHome | 1:dd07e1deec6c | 978 | for (int cycle=0; cycle<2; cycle++) { |
WiredHome | 2:8f71b71fce1b | 979 | loc_t mid = r.p2.y - rangelimit(privOffset, SG_MIN_V, SG_MAX_V) / vRange * h; |
WiredHome | 2:8f71b71fce1b | 980 | loc_t upp = r.p2.y - rangelimit(privOffset + privVoltage/2, SG_MIN_V, SG_MAX_V) / vRange * h; |
WiredHome | 2:8f71b71fce1b | 981 | loc_t low = r.p2.y - rangelimit(privOffset - privVoltage/2, SG_MIN_V, SG_MAX_V) / vRange * h; |
WiredHome | 2:8f71b71fce1b | 982 | 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 | 983 | 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 | 984 | lcd->line(r.p1.x+cycle*w/2+privDutyCycleX, upp, r.p1.x+cycle*w/2+privDutyCycleX, low, color); // fall |
WiredHome | 2:8f71b71fce1b | 985 | 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 | 986 | 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 | 987 | } |
WiredHome | 1:dd07e1deec6c | 988 | break; |
WiredHome | 1:dd07e1deec6c | 989 | case SG_TRIANGLE: |
WiredHome | 1:dd07e1deec6c | 990 | for (int cycle=0; cycle<2; cycle++) { |
WiredHome | 3:d22f3e52d06a | 991 | for (x=0; x<=privDutyCycleX; x++) { |
WiredHome | 3:d22f3e52d06a | 992 | v = privVoltage * (float)x/privDutyCycleX; |
WiredHome | 3:d22f3e52d06a | 993 | if (x < privDutyCycleX/2) |
WiredHome | 3:d22f3e52d06a | 994 | v += privOffset; |
WiredHome | 3:d22f3e52d06a | 995 | else |
WiredHome | 3:d22f3e52d06a | 996 | v = privVoltage - (v - privOffset); |
WiredHome | 3:d22f3e52d06a | 997 | y = r.p2.y - rangelimit(v, SG_MIN_V, SG_MAX_V) / vRange * h; |
WiredHome | 3:d22f3e52d06a | 998 | lcd->pixel(r.p1.x + cycle * w/2 + x, y, color); |
WiredHome | 3:d22f3e52d06a | 999 | } |
WiredHome | 3:d22f3e52d06a | 1000 | dim_t phaseWidth = (w/2 - privDutyCycleX); |
WiredHome | 3:d22f3e52d06a | 1001 | for (x=0; x<phaseWidth; x++) { |
WiredHome | 3:d22f3e52d06a | 1002 | v = privVoltage * (float)x/phaseWidth; |
WiredHome | 3:d22f3e52d06a | 1003 | if (x < phaseWidth/2) |
WiredHome | 3:d22f3e52d06a | 1004 | v = privOffset - v; |
WiredHome | 3:d22f3e52d06a | 1005 | else |
WiredHome | 3:d22f3e52d06a | 1006 | v = v + privOffset - privVoltage; |
WiredHome | 3:d22f3e52d06a | 1007 | y = r.p2.y - rangelimit(v, SG_MIN_V, SG_MAX_V) / vRange * h; |
WiredHome | 3:d22f3e52d06a | 1008 | lcd->pixel(r.p1.x + cycle * w/2 + privDutyCycleX + x, y, color); |
WiredHome | 3:d22f3e52d06a | 1009 | } |
WiredHome | 1:dd07e1deec6c | 1010 | } |
WiredHome | 1:dd07e1deec6c | 1011 | break; |
WiredHome | 1:dd07e1deec6c | 1012 | case SG_SAWTOOTH: |
WiredHome | 1:dd07e1deec6c | 1013 | for (int cycle=0; cycle<2; cycle++) { |
WiredHome | 3:d22f3e52d06a | 1014 | for (x=0; x<=privDutyCycleX; x++) { |
WiredHome | 3:d22f3e52d06a | 1015 | v = privVoltage/2 * (float)x/privDutyCycleX - privVoltage/2 + privOffset; |
WiredHome | 3:d22f3e52d06a | 1016 | y = r.p2.y - rangelimit(v, SG_MIN_V, SG_MAX_V) / vRange * h; |
WiredHome | 3:d22f3e52d06a | 1017 | lcd->pixel(r.p1.x + cycle * w/2 + x, y, color); |
WiredHome | 3:d22f3e52d06a | 1018 | } |
WiredHome | 3:d22f3e52d06a | 1019 | dim_t phaseWidth = (w/2 - privDutyCycleX); |
WiredHome | 3:d22f3e52d06a | 1020 | for (x=0; x<phaseWidth; x++) { |
WiredHome | 3:d22f3e52d06a | 1021 | v = privVoltage/2 * (float)x/phaseWidth + privOffset; |
WiredHome | 3:d22f3e52d06a | 1022 | y = r.p2.y - rangelimit(v, SG_MIN_V, SG_MAX_V) / vRange * h; |
WiredHome | 3:d22f3e52d06a | 1023 | lcd->pixel(r.p1.x + cycle * w/2 + privDutyCycleX + x, y, color); |
WiredHome | 3:d22f3e52d06a | 1024 | } |
WiredHome | 3:d22f3e52d06a | 1025 | loc_t y2 = r.p2.y - rangelimit(-privVoltage/2 + privOffset, SG_MIN_V, SG_MAX_V) / vRange * h; |
WiredHome | 3:d22f3e52d06a | 1026 | lcd->line(r.p1.x + cycle*w/2 + w/2 - 1, y, |
WiredHome | 3:d22f3e52d06a | 1027 | r.p1.x + cycle*w/2 + w/2, y2); |
WiredHome | 1:dd07e1deec6c | 1028 | } |
WiredHome | 1:dd07e1deec6c | 1029 | break; |
WiredHome | 1:dd07e1deec6c | 1030 | case SG_USER: |
WiredHome | 1:dd07e1deec6c | 1031 | lcd->line(r.p1.x, y0-1, r.p1.x+w, y0-1, color); |
WiredHome | 1:dd07e1deec6c | 1032 | lcd->line(r.p1.x, y0-0, r.p1.x+w, y0-0, color); |
WiredHome | 1:dd07e1deec6c | 1033 | lcd->line(r.p1.x, y0+1, r.p1.x+w, y0+1, color); |
WiredHome | 1:dd07e1deec6c | 1034 | lcd->rect(r.p1.x+5*w/8, y0-a/4, r.p1.x+7*w/8, y0+a/4, color); |
WiredHome | 1:dd07e1deec6c | 1035 | break; |
WiredHome | 1:dd07e1deec6c | 1036 | } |
WiredHome | 1:dd07e1deec6c | 1037 | } |
WiredHome | 1:dd07e1deec6c | 1038 | |
WiredHome | 1:dd07e1deec6c | 1039 | void SignalGenDisplay::ClearScope(void) { |
WiredHome | 1:dd07e1deec6c | 1040 | // Scope area |
WiredHome | 1:dd07e1deec6c | 1041 | rect_t r = UI_SCOPE_RECT; |
WiredHome | 1:dd07e1deec6c | 1042 | lcd->fillrect(r, UI_ScopeBackColor); |
WiredHome | 1:dd07e1deec6c | 1043 | lcd->rect(r, UI_ScopeFrameColor); |
WiredHome | 1:dd07e1deec6c | 1044 | } |
WiredHome | 1:dd07e1deec6c | 1045 | |
WiredHome | 1:dd07e1deec6c | 1046 | void SignalGenDisplay::updateDutyCycle(void) { |
WiredHome | 1:dd07e1deec6c | 1047 | rect_t r = Parameters[0]; // UI_DUTY_CYCLE_RECT; |
WiredHome | 1:dd07e1deec6c | 1048 | color_t fcolor, bcolor; |
WiredHome | 1:dd07e1deec6c | 1049 | |
WiredHome | 2:8f71b71fce1b | 1050 | if (EntryMd != OM_DUTY) { |
WiredHome | 1:dd07e1deec6c | 1051 | fcolor = UI_DutyColor; |
WiredHome | 1:dd07e1deec6c | 1052 | bcolor = UI_ScopeBackColor; |
WiredHome | 1:dd07e1deec6c | 1053 | } else { |
WiredHome | 1:dd07e1deec6c | 1054 | fcolor = UI_ScopeBackColor; |
WiredHome | 1:dd07e1deec6c | 1055 | bcolor = UI_DutyColor; |
WiredHome | 1:dd07e1deec6c | 1056 | } |
WiredHome | 1:dd07e1deec6c | 1057 | lcd->fillrect(r, bcolor); |
WiredHome | 1:dd07e1deec6c | 1058 | lcd->foreground(fcolor); |
WiredHome | 1:dd07e1deec6c | 1059 | lcd->background(bcolor); |
WiredHome | 1:dd07e1deec6c | 1060 | lcd->SetTextCursor(r.p1.x+1, r.p1.y+1); |
WiredHome | 1:dd07e1deec6c | 1061 | lcd->printf("%3.0f %%", dutycycle); |
WiredHome | 1:dd07e1deec6c | 1062 | } |
WiredHome | 1:dd07e1deec6c | 1063 | |
WiredHome | 1:dd07e1deec6c | 1064 | void SignalGenDisplay::updateFrequency(void) { |
WiredHome | 1:dd07e1deec6c | 1065 | rect_t r = Parameters[1]; // UI_FREQ_RECT; |
WiredHome | 1:dd07e1deec6c | 1066 | color_t fcolor, bcolor; |
WiredHome | 1:dd07e1deec6c | 1067 | |
WiredHome | 2:8f71b71fce1b | 1068 | if (EntryMd != OM_FREQ) { |
WiredHome | 1:dd07e1deec6c | 1069 | fcolor = UI_FreqColor; |
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_FreqColor; |
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 | 3:d22f3e52d06a | 1079 | if (frequency >= 1000000.0) |
WiredHome | 3:d22f3e52d06a | 1080 | lcd->printf("%8.3f MHz", frequency/1000000); |
WiredHome | 3:d22f3e52d06a | 1081 | else if (frequency >= 1000.0) |
WiredHome | 1:dd07e1deec6c | 1082 | lcd->printf("%8.3f kHz", frequency/1000); |
WiredHome | 1:dd07e1deec6c | 1083 | else |
WiredHome | 1:dd07e1deec6c | 1084 | lcd->printf("%8.3f Hz ", frequency); |
WiredHome | 1:dd07e1deec6c | 1085 | } |
WiredHome | 1:dd07e1deec6c | 1086 | |
WiredHome | 1:dd07e1deec6c | 1087 | void SignalGenDisplay::updatePeriod(void) { |
WiredHome | 1:dd07e1deec6c | 1088 | float period = 1/frequency; |
WiredHome | 1:dd07e1deec6c | 1089 | rect_t r = Parameters[2]; // UI_PERIOD_RECT; |
WiredHome | 1:dd07e1deec6c | 1090 | color_t fcolor, bcolor; |
WiredHome | 1:dd07e1deec6c | 1091 | |
WiredHome | 2:8f71b71fce1b | 1092 | if (EntryMd != OM_PERI) { |
WiredHome | 1:dd07e1deec6c | 1093 | fcolor = UI_FreqColor; |
WiredHome | 1:dd07e1deec6c | 1094 | bcolor = UI_ScopeBackColor; |
WiredHome | 1:dd07e1deec6c | 1095 | } else { |
WiredHome | 1:dd07e1deec6c | 1096 | fcolor = UI_ScopeBackColor; |
WiredHome | 1:dd07e1deec6c | 1097 | bcolor = UI_FreqColor; |
WiredHome | 1:dd07e1deec6c | 1098 | } |
WiredHome | 1:dd07e1deec6c | 1099 | lcd->fillrect(r, bcolor); |
WiredHome | 1:dd07e1deec6c | 1100 | lcd->foreground(fcolor); |
WiredHome | 1:dd07e1deec6c | 1101 | lcd->background(bcolor); |
WiredHome | 1:dd07e1deec6c | 1102 | lcd->SetTextCursor(r.p1.x+1, r.p1.y+1); |
WiredHome | 1:dd07e1deec6c | 1103 | if (period < 0.001) |
WiredHome | 1:dd07e1deec6c | 1104 | lcd->printf("%8.3f uS", period * 1000000); |
WiredHome | 1:dd07e1deec6c | 1105 | else |
WiredHome | 1:dd07e1deec6c | 1106 | lcd->printf("%8.3f mS", period * 1000); |
WiredHome | 1:dd07e1deec6c | 1107 | } |
WiredHome | 1:dd07e1deec6c | 1108 | |
WiredHome | 1:dd07e1deec6c | 1109 | void SignalGenDisplay::updateVoltage(void) { |
WiredHome | 1:dd07e1deec6c | 1110 | rect_t r = Parameters[3]; // UI_VP2P_RECT; |
WiredHome | 1:dd07e1deec6c | 1111 | color_t fcolor, bcolor; |
WiredHome | 1:dd07e1deec6c | 1112 | |
WiredHome | 2:8f71b71fce1b | 1113 | if (EntryMd != OM_VOLT) { |
WiredHome | 1:dd07e1deec6c | 1114 | fcolor = UI_VP2PColor; |
WiredHome | 1:dd07e1deec6c | 1115 | bcolor = UI_ScopeBackColor; |
WiredHome | 1:dd07e1deec6c | 1116 | } else { |
WiredHome | 1:dd07e1deec6c | 1117 | fcolor = UI_ScopeBackColor; |
WiredHome | 1:dd07e1deec6c | 1118 | bcolor = UI_VP2PColor; |
WiredHome | 1:dd07e1deec6c | 1119 | } |
WiredHome | 1:dd07e1deec6c | 1120 | lcd->fillrect(r, bcolor); |
WiredHome | 1:dd07e1deec6c | 1121 | lcd->foreground(fcolor); |
WiredHome | 1:dd07e1deec6c | 1122 | lcd->background(bcolor); |
WiredHome | 1:dd07e1deec6c | 1123 | lcd->SetTextCursor(r.p1.x+1, r.p1.y+1); |
WiredHome | 1:dd07e1deec6c | 1124 | lcd->printf("%5.1f v", voltage); |
WiredHome | 1:dd07e1deec6c | 1125 | } |
WiredHome | 1:dd07e1deec6c | 1126 | |
WiredHome | 1:dd07e1deec6c | 1127 | void SignalGenDisplay::updateOffset(void) { |
WiredHome | 1:dd07e1deec6c | 1128 | rect_t r = Parameters[4]; // UI_VOFFSET_RECT; |
WiredHome | 1:dd07e1deec6c | 1129 | color_t fcolor, bcolor; |
WiredHome | 1:dd07e1deec6c | 1130 | |
WiredHome | 2:8f71b71fce1b | 1131 | if (EntryMd != OM_OFFS) { |
WiredHome | 1:dd07e1deec6c | 1132 | fcolor = UI_VOffsetColor; |
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_VOffsetColor; |
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("%+4.2f v", offset); |
WiredHome | 1:dd07e1deec6c | 1143 | } |
WiredHome | 1:dd07e1deec6c | 1144 | |
WiredHome | 1:dd07e1deec6c | 1145 | void SignalGenDisplay::DrawKeypadEnabled(bool enable) { |
WiredHome | 1:dd07e1deec6c | 1146 | for (int i=0; i<KeypadCount; i++) { |
WiredHome | 1:dd07e1deec6c | 1147 | DrawButton(UI_Keypad[i], false, SG_KEYPAD, enable, i); |
WiredHome | 1:dd07e1deec6c | 1148 | } |
WiredHome | 1:dd07e1deec6c | 1149 | } |
WiredHome | 1:dd07e1deec6c | 1150 | |
WiredHome | 1:dd07e1deec6c | 1151 | void SignalGenDisplay::DrawButton(rect_t r, bool pressed, SG_Mode mode, bool enable, int label) { |
WiredHome | 1:dd07e1deec6c | 1152 | rect_t wave; |
WiredHome | 1:dd07e1deec6c | 1153 | color_t buttonface = UI_BUTTON_FACE_DISABLED; |
WiredHome | 1:dd07e1deec6c | 1154 | color_t buttonshadow = UI_BUTTON_SHADOW_DISABLED; |
WiredHome | 1:dd07e1deec6c | 1155 | |
WiredHome | 1:dd07e1deec6c | 1156 | //lcd->fillrect(r, UI_ScopeBackColor); |
WiredHome | 1:dd07e1deec6c | 1157 | if (pressed) { |
WiredHome | 1:dd07e1deec6c | 1158 | if (enable) { |
WiredHome | 1:dd07e1deec6c | 1159 | buttonface = UI_BUTTON_FACE_DN; |
WiredHome | 1:dd07e1deec6c | 1160 | buttonshadow = UI_BUTTON_SHADOW; |
WiredHome | 1:dd07e1deec6c | 1161 | } |
WiredHome | 1:dd07e1deec6c | 1162 | lcd->fillrect(r, buttonface); |
WiredHome | 1:dd07e1deec6c | 1163 | lcd->line(r.p1.x+0,r.p1.y+0, r.p2.x+0,r.p1.y+0, buttonshadow); // top border |
WiredHome | 1:dd07e1deec6c | 1164 | lcd->line(r.p1.x+1,r.p1.y+1, r.p2.x+0,r.p1.y+1, buttonshadow); // top border |
WiredHome | 1:dd07e1deec6c | 1165 | lcd->line(r.p1.x+2,r.p1.y+2, r.p2.x+0,r.p1.y+2, buttonshadow); // top border |
WiredHome | 1:dd07e1deec6c | 1166 | lcd->line(r.p1.x+0,r.p1.y+0, r.p1.x+0,r.p2.y+0, buttonshadow); // left border |
WiredHome | 1:dd07e1deec6c | 1167 | lcd->line(r.p1.x+1,r.p1.y+1, r.p1.x+1,r.p2.y+0, buttonshadow); // left border |
WiredHome | 1:dd07e1deec6c | 1168 | lcd->line(r.p1.x+2,r.p1.y+2, r.p1.x+2,r.p2.y+0, buttonshadow); // left border |
WiredHome | 1:dd07e1deec6c | 1169 | wave.p1.x = r.p1.x+5 + 2; wave.p1.y = r.p1.y + 5 + 2; |
WiredHome | 1:dd07e1deec6c | 1170 | wave.p2.x = r.p2.x-5 + 2; wave.p2.y = r.p2.y - 5 + 2; |
WiredHome | 1:dd07e1deec6c | 1171 | } else { |
WiredHome | 1:dd07e1deec6c | 1172 | if (enable) { |
WiredHome | 1:dd07e1deec6c | 1173 | buttonface = UI_BUTTON_FACE_UP; |
WiredHome | 1:dd07e1deec6c | 1174 | buttonshadow = UI_BUTTON_SHADOW; |
WiredHome | 1:dd07e1deec6c | 1175 | } |
WiredHome | 1:dd07e1deec6c | 1176 | lcd->fillrect(r, buttonface); |
WiredHome | 1:dd07e1deec6c | 1177 | lcd->line(r.p1.x+0,r.p2.y-0, r.p2.x-0,r.p2.y-0, buttonshadow); // bottom border |
WiredHome | 1:dd07e1deec6c | 1178 | lcd->line(r.p1.x+0,r.p2.y-1, r.p2.x-1,r.p2.y-1, buttonshadow); // bottom border |
WiredHome | 1:dd07e1deec6c | 1179 | lcd->line(r.p1.x+0,r.p2.y-2, r.p2.x-2,r.p2.y-2, buttonshadow); // bottom border |
WiredHome | 1:dd07e1deec6c | 1180 | lcd->line(r.p2.x-0,r.p1.y+0, r.p2.x-0,r.p2.y-0, buttonshadow); // right border |
WiredHome | 1:dd07e1deec6c | 1181 | lcd->line(r.p2.x-1,r.p1.y+0, r.p2.x-1,r.p2.y-1, buttonshadow); // right border |
WiredHome | 1:dd07e1deec6c | 1182 | lcd->line(r.p2.x-2,r.p1.y+0, r.p2.x-2,r.p2.y-2, buttonshadow); // right border |
WiredHome | 1:dd07e1deec6c | 1183 | wave.p1.x = r.p1.x+5 + 0; wave.p1.y = r.p1.y + 5 + 0; |
WiredHome | 1:dd07e1deec6c | 1184 | wave.p2.x = r.p2.x-5 + 0; wave.p2.y = r.p2.y - 5 + 0; |
WiredHome | 1:dd07e1deec6c | 1185 | } |
WiredHome | 1:dd07e1deec6c | 1186 | switch (mode) { |
WiredHome | 1:dd07e1deec6c | 1187 | case SG_SINE: |
WiredHome | 1:dd07e1deec6c | 1188 | case SG_SQUARE: |
WiredHome | 1:dd07e1deec6c | 1189 | case SG_TRIANGLE: |
WiredHome | 1:dd07e1deec6c | 1190 | case SG_SAWTOOTH: |
WiredHome | 1:dd07e1deec6c | 1191 | case SG_USER: |
WiredHome | 2:8f71b71fce1b | 1192 | DrawWaveform(wave, mode, Black, true); |
WiredHome | 1:dd07e1deec6c | 1193 | break; |
WiredHome | 1:dd07e1deec6c | 1194 | case SG_KEYPAD: |
WiredHome | 1:dd07e1deec6c | 1195 | lcd->foreground(Black); |
WiredHome | 1:dd07e1deec6c | 1196 | lcd->background(buttonface); |
WiredHome | 1:dd07e1deec6c | 1197 | lcd->SetTextCursor((r.p1.x+r.p2.x)/2 - 4,r.p1.y + BTN_H/2 - 8); // 8x16 char |
WiredHome | 1:dd07e1deec6c | 1198 | lcd->putc(UI_KeyLabels[label]); |
WiredHome | 1:dd07e1deec6c | 1199 | break; |
WiredHome | 3:d22f3e52d06a | 1200 | case SG_START: |
WiredHome | 3:d22f3e52d06a | 1201 | lcd->foreground(Black); |
WiredHome | 3:d22f3e52d06a | 1202 | lcd->background(buttonface); |
WiredHome | 3:d22f3e52d06a | 1203 | lcd->SetTextCursor((r.p1.x+r.p2.x)/2 - 4 * strlen(UI_StartLabels[label]),r.p1.y + BTN_H/2 - 8); |
WiredHome | 3:d22f3e52d06a | 1204 | lcd->puts(UI_StartLabels[label]); |
WiredHome | 3:d22f3e52d06a | 1205 | break; |
WiredHome | 3:d22f3e52d06a | 1206 | } |
WiredHome | 3:d22f3e52d06a | 1207 | } |
WiredHome | 3:d22f3e52d06a | 1208 | |
WiredHome | 3:d22f3e52d06a | 1209 | void SignalGenDisplay::ShowStartStop(bool showIt) { |
WiredHome | 3:d22f3e52d06a | 1210 | if (textLen == 0) { |
WiredHome | 3:d22f3e52d06a | 1211 | lcd->fillrect(UI_START_STOP, UI_BackColor); |
WiredHome | 3:d22f3e52d06a | 1212 | if (showIt) { |
WiredHome | 3:d22f3e52d06a | 1213 | DrawButton(UI_START_STOP, false, SG_START, true, pulseMode ? 2 : signal->isRunning()); |
WiredHome | 3:d22f3e52d06a | 1214 | } |
WiredHome | 1:dd07e1deec6c | 1215 | } |
WiredHome | 1:dd07e1deec6c | 1216 | } |
WiredHome | 1:dd07e1deec6c | 1217 | |
WiredHome | 1:dd07e1deec6c | 1218 | void SignalGenDisplay::updateTextWindow(void) { |
WiredHome | 3:d22f3e52d06a | 1219 | ShowStartStop(false); |
WiredHome | 1:dd07e1deec6c | 1220 | lcd->window(UI_DATA_ENTRY); |
WiredHome | 1:dd07e1deec6c | 1221 | lcd->fillrect(UI_DATA_ENTRY, White); |
WiredHome | 1:dd07e1deec6c | 1222 | lcd->foreground(Black); |
WiredHome | 1:dd07e1deec6c | 1223 | lcd->background(White); |
WiredHome | 1:dd07e1deec6c | 1224 | lcd->SetTextCursor(UI_DATA_ENTRY.p1.x+1,UI_DATA_ENTRY.p1.y+1); |
WiredHome | 3:d22f3e52d06a | 1225 | lcd->printf("%13s", textBuffer); |
WiredHome | 1:dd07e1deec6c | 1226 | lcd->window(); |
WiredHome | 1:dd07e1deec6c | 1227 | } |
WiredHome | 1:dd07e1deec6c | 1228 | |
WiredHome | 2:8f71b71fce1b | 1229 | void SignalGenDisplay::clearTextWindow(void) { |
WiredHome | 2:8f71b71fce1b | 1230 | lcd->fillrect(UI_DATA_ENTRY, UI_BackColor); |
WiredHome | 2:8f71b71fce1b | 1231 | textBuffer[0] = '\0'; |
WiredHome | 2:8f71b71fce1b | 1232 | textLen = 0; |
WiredHome | 3:d22f3e52d06a | 1233 | ShowStartStop(true); |
WiredHome | 2:8f71b71fce1b | 1234 | } |
WiredHome | 2:8f71b71fce1b | 1235 | |
WiredHome | 1:dd07e1deec6c | 1236 | float SignalGenDisplay::rangelimit(float value, float min, float max) { |
WiredHome | 1:dd07e1deec6c | 1237 | if (value < min) |
WiredHome | 1:dd07e1deec6c | 1238 | return min; |
WiredHome | 1:dd07e1deec6c | 1239 | else if (value > max) |
WiredHome | 1:dd07e1deec6c | 1240 | return max; |
WiredHome | 1:dd07e1deec6c | 1241 | else |
WiredHome | 1:dd07e1deec6c | 1242 | return value; |
WiredHome | 1:dd07e1deec6c | 1243 | } |
WiredHome | 1:dd07e1deec6c | 1244 | |
WiredHome | 2:8f71b71fce1b | 1245 | void SignalGenDisplay::SaveSettings(OM_Changes reportMode) { |
WiredHome | 2:8f71b71fce1b | 1246 | char buf[20]; |
WiredHome | 1:dd07e1deec6c | 1247 | |
WiredHome | 2:8f71b71fce1b | 1248 | if (reportMode != OM_NONE) { |
WiredHome | 2:8f71b71fce1b | 1249 | Changes |= reportMode; |
WiredHome | 2:8f71b71fce1b | 1250 | printf("SaveSettings - reset timer [%02X]\r\n", Changes); |
WiredHome | 2:8f71b71fce1b | 1251 | timerSave.reset(); |
WiredHome | 2:8f71b71fce1b | 1252 | timerSave.start(); |
WiredHome | 2:8f71b71fce1b | 1253 | } else if (timerSave.read() > SAVE_AFTER_IDLE_S) { |
WiredHome | 2:8f71b71fce1b | 1254 | timerSave.stop(); |
WiredHome | 2:8f71b71fce1b | 1255 | timerSave.reset(); |
WiredHome | 2:8f71b71fce1b | 1256 | printf("SaveSettings - timeout [%02X]\r\n", Changes); |
WiredHome | 2:8f71b71fce1b | 1257 | if (Changes & OM_MODE) { |
WiredHome | 2:8f71b71fce1b | 1258 | Changes &= ~ OM_MODE; |
WiredHome | 2:8f71b71fce1b | 1259 | ini.WriteString("Signal", "Waveform", ModeNames[mode]); |
WiredHome | 2:8f71b71fce1b | 1260 | } |
WiredHome | 2:8f71b71fce1b | 1261 | if (Changes & OM_FREQ) { |
WiredHome | 2:8f71b71fce1b | 1262 | Changes &= ~ OM_FREQ; |
WiredHome | 2:8f71b71fce1b | 1263 | snprintf(buf, sizeof(buf),"%5.3f", frequency); |
WiredHome | 2:8f71b71fce1b | 1264 | printf(" Signal:Frequency=%s\r\n", buf); |
WiredHome | 2:8f71b71fce1b | 1265 | ini.WriteString("Signal", "Frequency", buf); |
WiredHome | 2:8f71b71fce1b | 1266 | } |
WiredHome | 2:8f71b71fce1b | 1267 | if (Changes & OM_PERI) { |
WiredHome | 2:8f71b71fce1b | 1268 | Changes &= ~ OM_PERI; |
WiredHome | 2:8f71b71fce1b | 1269 | snprintf(buf, sizeof(buf),"%5.3f", frequency); |
WiredHome | 2:8f71b71fce1b | 1270 | printf(" Signal:Frequency=%s\r\n", buf); |
WiredHome | 2:8f71b71fce1b | 1271 | ini.WriteString("Signal", "Frequency", buf); |
WiredHome | 2:8f71b71fce1b | 1272 | } |
WiredHome | 2:8f71b71fce1b | 1273 | if (Changes & OM_DUTY) { |
WiredHome | 2:8f71b71fce1b | 1274 | Changes &= ~ OM_DUTY; |
WiredHome | 2:8f71b71fce1b | 1275 | snprintf(buf, sizeof(buf),"%1.0f", dutycycle); |
WiredHome | 2:8f71b71fce1b | 1276 | printf(" Signal:Duty Cycle=%s\r\n", buf); |
WiredHome | 2:8f71b71fce1b | 1277 | ini.WriteString("Signal", "Duty Cycle", buf); |
WiredHome | 2:8f71b71fce1b | 1278 | } |
WiredHome | 2:8f71b71fce1b | 1279 | if (Changes & OM_VOLT) { |
WiredHome | 2:8f71b71fce1b | 1280 | Changes &= ~ OM_VOLT; |
WiredHome | 2:8f71b71fce1b | 1281 | snprintf(buf, sizeof(buf),"%3.2f", voltage); |
WiredHome | 2:8f71b71fce1b | 1282 | printf(" Signal:Voltage=%s\r\n", buf); |
WiredHome | 2:8f71b71fce1b | 1283 | ini.WriteString("Signal", "Voltage", buf); |
WiredHome | 2:8f71b71fce1b | 1284 | } |
WiredHome | 2:8f71b71fce1b | 1285 | if (Changes & OM_OFFS) { |
WiredHome | 2:8f71b71fce1b | 1286 | Changes &= ~ OM_OFFS; |
WiredHome | 2:8f71b71fce1b | 1287 | snprintf(buf, sizeof(buf),"%3.2f", offset); |
WiredHome | 2:8f71b71fce1b | 1288 | printf(" Signal:Offset=%s\r\n", buf); |
WiredHome | 2:8f71b71fce1b | 1289 | ini.WriteString("Signal", "Offset", buf); |
WiredHome | 2:8f71b71fce1b | 1290 | } |
WiredHome | 3:d22f3e52d06a | 1291 | if (Changes & OM_BACKL) { |
WiredHome | 3:d22f3e52d06a | 1292 | Changes &= ~OM_BACKL; |
WiredHome | 3:d22f3e52d06a | 1293 | snprintf(buf, sizeof(buf), "%d", lcd->GetBacklight_u8()); |
WiredHome | 3:d22f3e52d06a | 1294 | ini.WriteString("Settings", "Backlight", buf); |
WiredHome | 3:d22f3e52d06a | 1295 | } |
WiredHome | 3:d22f3e52d06a | 1296 | |
WiredHome | 1:dd07e1deec6c | 1297 | } |
WiredHome | 1:dd07e1deec6c | 1298 | } |
WiredHome | 1:dd07e1deec6c | 1299 | |
WiredHome | 2:8f71b71fce1b | 1300 | void SignalGenDisplay::resetDataEntry(OM_Changes nextMode, bool save) { |
WiredHome | 2:8f71b71fce1b | 1301 | OM_Changes last = EntryMd; |
WiredHome | 1:dd07e1deec6c | 1302 | |
WiredHome | 2:8f71b71fce1b | 1303 | printf("-> resetDataEntry(next: %d) curr:%d, save:%d\r\n", nextMode, last, save); |
WiredHome | 2:8f71b71fce1b | 1304 | EntryMd = nextMode; |
WiredHome | 2:8f71b71fce1b | 1305 | if (last != OM_NONE) |
WiredHome | 2:8f71b71fce1b | 1306 | signal->PrepareWaveform(SG_SAWTOOTH, frequency, dutycycle, voltage, offset); |
WiredHome | 1:dd07e1deec6c | 1307 | switch (last) { |
WiredHome | 2:8f71b71fce1b | 1308 | case OM_NONE: |
WiredHome | 1:dd07e1deec6c | 1309 | updateDutyCycle(); |
WiredHome | 1:dd07e1deec6c | 1310 | updateFrequency(); |
WiredHome | 1:dd07e1deec6c | 1311 | updatePeriod(); |
WiredHome | 1:dd07e1deec6c | 1312 | updateVoltage(); |
WiredHome | 1:dd07e1deec6c | 1313 | updateOffset(); |
WiredHome | 1:dd07e1deec6c | 1314 | break; |
WiredHome | 2:8f71b71fce1b | 1315 | case OM_DUTY: |
WiredHome | 1:dd07e1deec6c | 1316 | updateDutyCycle(); |
WiredHome | 2:8f71b71fce1b | 1317 | if (save) { |
WiredHome | 2:8f71b71fce1b | 1318 | SaveSettings(OM_DUTY); |
WiredHome | 2:8f71b71fce1b | 1319 | } |
WiredHome | 1:dd07e1deec6c | 1320 | break; |
WiredHome | 2:8f71b71fce1b | 1321 | case OM_FREQ: |
WiredHome | 1:dd07e1deec6c | 1322 | updateFrequency(); |
WiredHome | 2:8f71b71fce1b | 1323 | if (save) { |
WiredHome | 2:8f71b71fce1b | 1324 | SaveSettings(OM_FREQ); |
WiredHome | 2:8f71b71fce1b | 1325 | } |
WiredHome | 1:dd07e1deec6c | 1326 | break; |
WiredHome | 2:8f71b71fce1b | 1327 | case OM_PERI: |
WiredHome | 1:dd07e1deec6c | 1328 | updatePeriod(); |
WiredHome | 2:8f71b71fce1b | 1329 | if (save) { |
WiredHome | 2:8f71b71fce1b | 1330 | SaveSettings(OM_FREQ); |
WiredHome | 2:8f71b71fce1b | 1331 | } |
WiredHome | 1:dd07e1deec6c | 1332 | break; |
WiredHome | 2:8f71b71fce1b | 1333 | case OM_VOLT: |
WiredHome | 1:dd07e1deec6c | 1334 | updateVoltage(); |
WiredHome | 2:8f71b71fce1b | 1335 | if (save) { |
WiredHome | 2:8f71b71fce1b | 1336 | SaveSettings(OM_VOLT); |
WiredHome | 2:8f71b71fce1b | 1337 | } |
WiredHome | 1:dd07e1deec6c | 1338 | break; |
WiredHome | 2:8f71b71fce1b | 1339 | case OM_OFFS: |
WiredHome | 1:dd07e1deec6c | 1340 | updateOffset(); |
WiredHome | 2:8f71b71fce1b | 1341 | if (save) { |
WiredHome | 2:8f71b71fce1b | 1342 | SaveSettings(OM_OFFS); |
WiredHome | 2:8f71b71fce1b | 1343 | } |
WiredHome | 1:dd07e1deec6c | 1344 | break; |
WiredHome | 1:dd07e1deec6c | 1345 | default: |
WiredHome | 1:dd07e1deec6c | 1346 | break; |
WiredHome | 1:dd07e1deec6c | 1347 | } |
WiredHome | 2:8f71b71fce1b | 1348 | DrawKeypadEnabled(EntryMd != OM_NONE); |
WiredHome | 2:8f71b71fce1b | 1349 | if (EntryMd == OM_NONE) { |
WiredHome | 2:8f71b71fce1b | 1350 | clearTextWindow(); |
WiredHome | 2:8f71b71fce1b | 1351 | } |
WiredHome | 2:8f71b71fce1b | 1352 | printf("<- end resetDataEntry()\r\n"); |
WiredHome | 3:d22f3e52d06a | 1353 | } |
WiredHome | 3:d22f3e52d06a | 1354 | |
WiredHome | 3:d22f3e52d06a | 1355 | // Calibrate the resistive touch screen, and store the data on the |
WiredHome | 3:d22f3e52d06a | 1356 | // local file system. |
WiredHome | 3:d22f3e52d06a | 1357 | // |
WiredHome | 3:d22f3e52d06a | 1358 | void SignalGenDisplay::CalibrateTS(void) |
WiredHome | 3:d22f3e52d06a | 1359 | { |
WiredHome | 3:d22f3e52d06a | 1360 | FILE * fh; |
WiredHome | 3:d22f3e52d06a | 1361 | tpMatrix_t matrix; |
WiredHome | 3:d22f3e52d06a | 1362 | RetCode_t r; |
WiredHome | 3:d22f3e52d06a | 1363 | Timer testperiod; |
WiredHome | 3:d22f3e52d06a | 1364 | char buf[100]; |
WiredHome | 3:d22f3e52d06a | 1365 | |
WiredHome | 3:d22f3e52d06a | 1366 | r = lcd->TouchPanelCalibrate("Calibrate the touch panel", &matrix); |
WiredHome | 3:d22f3e52d06a | 1367 | if (r == noerror) { |
WiredHome | 3:d22f3e52d06a | 1368 | snprintf(buf, sizeof(buf), "%s/tpcal.cfg", Path); |
WiredHome | 3:d22f3e52d06a | 1369 | fh = fopen(buf, "wb"); |
WiredHome | 3:d22f3e52d06a | 1370 | if (fh) { |
WiredHome | 3:d22f3e52d06a | 1371 | fwrite(&matrix, sizeof(tpMatrix_t), 1, fh); |
WiredHome | 3:d22f3e52d06a | 1372 | fclose(fh); |
WiredHome | 3:d22f3e52d06a | 1373 | printf(" %s cal written.\r\n", buf); |
WiredHome | 3:d22f3e52d06a | 1374 | lcd->cls(); |
WiredHome | 3:d22f3e52d06a | 1375 | } else { |
WiredHome | 3:d22f3e52d06a | 1376 | printf(" couldn't open %s file.\r\n", buf); |
WiredHome | 3:d22f3e52d06a | 1377 | } |
WiredHome | 3:d22f3e52d06a | 1378 | } else { |
WiredHome | 3:d22f3e52d06a | 1379 | printf("error return: %d\r\n", r); |
WiredHome | 3:d22f3e52d06a | 1380 | } |
WiredHome | 3:d22f3e52d06a | 1381 | lcd->cls(); |
WiredHome | 3:d22f3e52d06a | 1382 | } |
WiredHome | 3:d22f3e52d06a | 1383 | |
WiredHome | 3:d22f3e52d06a | 1384 | // Try to load a previous resistive touch screen calibration from storage. If it |
WiredHome | 3:d22f3e52d06a | 1385 | // doesn't exist, activate the touch screen calibration process. |
WiredHome | 3:d22f3e52d06a | 1386 | // |
WiredHome | 3:d22f3e52d06a | 1387 | void SignalGenDisplay::InitializeTS(void) |
WiredHome | 3:d22f3e52d06a | 1388 | { |
WiredHome | 3:d22f3e52d06a | 1389 | FILE * fh; |
WiredHome | 3:d22f3e52d06a | 1390 | tpMatrix_t matrix; |
WiredHome | 3:d22f3e52d06a | 1391 | char buf[100]; |
WiredHome | 3:d22f3e52d06a | 1392 | |
WiredHome | 3:d22f3e52d06a | 1393 | snprintf(buf, sizeof(buf), "%s/tpcal.cfg", Path); |
WiredHome | 3:d22f3e52d06a | 1394 | fh = fopen(buf, "rb"); |
WiredHome | 3:d22f3e52d06a | 1395 | if (fh) { |
WiredHome | 3:d22f3e52d06a | 1396 | fread(&matrix, sizeof(tpMatrix_t), 1, fh); |
WiredHome | 3:d22f3e52d06a | 1397 | fclose(fh); |
WiredHome | 3:d22f3e52d06a | 1398 | lcd->TouchPanelSetMatrix(&matrix); |
WiredHome | 3:d22f3e52d06a | 1399 | printf(" tp cal loaded.\r\n"); |
WiredHome | 3:d22f3e52d06a | 1400 | } else { |
WiredHome | 3:d22f3e52d06a | 1401 | CalibrateTS(); |
WiredHome | 3:d22f3e52d06a | 1402 | } |
WiredHome | 3:d22f3e52d06a | 1403 | } |
WiredHome | 3:d22f3e52d06a | 1404 |