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