A simple oscilloscope using Adafruit 2.8" TFT with touch. Runs on FRDM-KL25Z, FRDM-K22F, FRDM-K64F, NUCLEO-F411RE. 2 channel analog inputs with 4 trigger modes and time division.

Dependencies:   SPI_STMPE610 UniGraphic mbed vt100

My first attempt of implementing an oscilloscope using FRDM-KL25Z and Adafruit 2.8" TFT with touch.

FRDM-KL25Z と Adafruit 2.8" TFT with touch を使用して作ってみた最初のオシロスコープです。

On 25-Sep-2017, wrong calculation of trigger pos/val fixed.
On 25-Nov-2015, FRDM-K64F and NUCLEO-F411RE platforms were added.
On 26-Nov-2015, FRDM-K22F is added (tested).
Note: Now ch2 is A2 instead of A1!

25-Sep-2017, トリガー値と位置の計算の誤りを修正しました。
25-Nov-2015, FRDM-K64F と NUCLEO-F411RE でも動くようになりました。
26-Nov-2015, FRDM-K22F でも動作確認が出来ました。 ※一身上の都合で、アナログ入力の ch2 は A1 から A2 に変更しましたので、ご注意ください。m(_ _)m

/media/uploads/Rhyme/oscillo_top.jpg

This supports two analog inputs A0 for channel 1 and A2 for channel 2
and four trigger modes (NONE, RISE, FALL, LEVEL),
time division is 30us to 20ms per pixel which will make 300us/div to 200.0ms/div (as 10 pixels per div)

A0と A2 のアナログ2入力にて、
4種類のトリガーモード(NONE: フリーラン RISE: 立ち上がりエッジ、FALL: 立下りエッジ、LEVEL: レベル) 。
サンプリングは30us から 20ms, チャートの1メモリが10ピクセルなので、300us/dev から 200.0ms/div となっています。

The analog signals and gnd was picked at the pins in the picture above.
Note: now you need to pick A0 and A2 instead of A0 and A1.

信号は上記の写真のように、Adafruit のピンからつまみました。
変更により、A0とA2が入力となります。

/media/uploads/Rhyme/freerunmode.jpg

When powered on or reset, the program starts in Trigger Mode = NONE (Free Run Mode)

電源投入、リセット後 プログラムはトリガーモード NONE (フリーランモード) で起動します。

To change trigger mode and/or time division, press run/stop button.

トリガーモードを変えたり、サンプリング時間を変えるのには run/stop ボタンを押してください。

Each time you push Trig button, the trigger mode changes
NONE -> RISE -> FALL -> LEVEL ( -> NONE).

トリガーボタンを押すたびにトリガーモードは
NONE(フリーラン) -> RISE (立ち上がりエッジ) -> FALL (立下りエッジ) -> LEVEL (レベル)
と変化します。

When trigger mode is not NONE,
to specify the trigger position, level and channel, push inside the wave frame.
Then green trigger marks will be shown and value of trigger position and voltage will be printed.

トリガーモードが NONE でないときに、チャネルの枠内をタッチしますと、
その位置がトリガーのポジション、レベル、チャネルになります。 そして、緑色のトリガーマークが表示され、下部にはトリガーの具体的なポジションとボルテージが表示されます。

/media/uploads/Rhyme/usage_screen1.jpg

To change time division push "1/2" to Zoom Out (sampling interval will be bigger) or
"x2" to Zoom In (Sampling interval will be smaller).

サンプリングタイムを変更するのには
"1/2" ズームアウト (サンプリング間隔が長くなります) か
"x2" ズームイン (サンプリング間隔が短くなります。) を押してください。

/media/uploads/Rhyme/helps.jpg

On 7-Mar-2015 updated to UniGraphic library version!

2015年3月7日 UniGraphic ライブラリ使用版にアップデートしました。

/media/uploads/Rhyme/frdm-kl25z-ss.jpg FRDM-KL25Z
/media/uploads/Rhyme/frdm-k64f-ss.jpg FRDM-K64F
/media/uploads/Rhyme/nucleo-f411re-ss.jpg NUCLEO-F411RE

Committer:
Rhyme
Date:
Mon Sep 25 02:09:53 2017 +0000
Revision:
10:bd3d8d71ee73
Parent:
3:ea0c3cffa988
miss calc of trigger value/pos fixed

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Rhyme 0:2b9a6c5fcd52 1 /** mbed oscilloscope my implementation of a oscillo scope
Rhyme 0:2b9a6c5fcd52 2 * Copyright (c) 2014, 2015 Motoo Tanaka @ Design Methodology Lab
Rhyme 0:2b9a6c5fcd52 3 *
Rhyme 0:2b9a6c5fcd52 4 * view.cpp
Rhyme 0:2b9a6c5fcd52 5 *
Rhyme 0:2b9a6c5fcd52 6 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Rhyme 0:2b9a6c5fcd52 7 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Rhyme 0:2b9a6c5fcd52 8 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
Rhyme 0:2b9a6c5fcd52 9 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
Rhyme 0:2b9a6c5fcd52 10 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Rhyme 0:2b9a6c5fcd52 11 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
Rhyme 0:2b9a6c5fcd52 12 * THE SOFTWARE.
Rhyme 0:2b9a6c5fcd52 13 */
Rhyme 0:2b9a6c5fcd52 14 #include "mbed.h"
Rhyme 3:ea0c3cffa988 15 #include <ILI9341.h>
Rhyme 0:2b9a6c5fcd52 16 #include "SPI_STMPE610.h"
Rhyme 0:2b9a6c5fcd52 17 #include "Arial12x12.h"
Rhyme 0:2b9a6c5fcd52 18 #include "Arial24x23.h"
Rhyme 0:2b9a6c5fcd52 19 #include "Arial28x28.h"
Rhyme 3:ea0c3cffa988 20 #include "Arial43x48_numb.h"
Rhyme 0:2b9a6c5fcd52 21 #include "vt100.h"
Rhyme 0:2b9a6c5fcd52 22 #include "TFTMenu.h"
Rhyme 0:2b9a6c5fcd52 23 #include "main.h"
Rhyme 0:2b9a6c5fcd52 24 #include "trig.h"
Rhyme 0:2b9a6c5fcd52 25 #include "view.h"
Rhyme 0:2b9a6c5fcd52 26
Rhyme 0:2b9a6c5fcd52 27 int pane_w = 200 ;
Rhyme 0:2b9a6c5fcd52 28 int pane_h = 70 ; // height per channel
Rhyme 0:2b9a6c5fcd52 29 int head_h = 20 ; // header height
Rhyme 0:2b9a6c5fcd52 30 int foot_h = 20 ; // footer height
Rhyme 0:2b9a6c5fcd52 31 int right_margin = 10 ;
Rhyme 0:2b9a6c5fcd52 32 int left_margin = 30 ;
Rhyme 0:2b9a6c5fcd52 33
Rhyme 0:2b9a6c5fcd52 34 void initTFT(void)
Rhyme 0:2b9a6c5fcd52 35 {
Rhyme 0:2b9a6c5fcd52 36 //Configure the display driver
Rhyme 3:ea0c3cffa988 37 TFT.BusEnable(true) ;
Rhyme 3:ea0c3cffa988 38 TFT.FastWindow(true) ;
Rhyme 0:2b9a6c5fcd52 39 TFT.background(Black);
Rhyme 0:2b9a6c5fcd52 40 TFT.foreground(White);
Rhyme 0:2b9a6c5fcd52 41 wait(0.01) ;
Rhyme 0:2b9a6c5fcd52 42 TFT.cls();
Rhyme 3:ea0c3cffa988 43 TFT.BusEnable(false) ;
Rhyme 0:2b9a6c5fcd52 44 }
Rhyme 0:2b9a6c5fcd52 45
Rhyme 0:2b9a6c5fcd52 46
Rhyme 0:2b9a6c5fcd52 47 void eraseChFrame(int ch)
Rhyme 0:2b9a6c5fcd52 48 {
Rhyme 0:2b9a6c5fcd52 49 int x1, x2, y1, y2 ;
Rhyme 0:2b9a6c5fcd52 50 x1 = left_margin ;
Rhyme 0:2b9a6c5fcd52 51 x2 = left_margin + pane_w ;
Rhyme 0:2b9a6c5fcd52 52 y1 = head_h + (pane_h + 5) * ch ;
Rhyme 0:2b9a6c5fcd52 53 y2 = y1 + pane_h ;
Rhyme 3:ea0c3cffa988 54 TFT.BusEnable(true) ;
Rhyme 0:2b9a6c5fcd52 55 TFT.fillrect(x1,y1,x2, y2, Black) ;
Rhyme 3:ea0c3cffa988 56 TFT.BusEnable(false) ;
Rhyme 0:2b9a6c5fcd52 57 }
Rhyme 0:2b9a6c5fcd52 58
Rhyme 0:2b9a6c5fcd52 59 void eraseGraphFrames(void)
Rhyme 0:2b9a6c5fcd52 60 {
Rhyme 0:2b9a6c5fcd52 61 int ch ;
Rhyme 3:ea0c3cffa988 62 TFT.BusEnable(true) ;
Rhyme 0:2b9a6c5fcd52 63 for (ch = 0 ; ch < numAnalogIn ; ch++) {
Rhyme 0:2b9a6c5fcd52 64 eraseChFrame(ch) ;
Rhyme 0:2b9a6c5fcd52 65 }
Rhyme 3:ea0c3cffa988 66 TFT.BusEnable(false) ;
Rhyme 0:2b9a6c5fcd52 67 }
Rhyme 0:2b9a6c5fcd52 68
Rhyme 0:2b9a6c5fcd52 69 void drawChFrame(int ch)
Rhyme 0:2b9a6c5fcd52 70 {
Rhyme 0:2b9a6c5fcd52 71 int x1, x2, y1, y2,y_offset ;
Rhyme 0:2b9a6c5fcd52 72 x1 = left_margin ;
Rhyme 0:2b9a6c5fcd52 73 x2 = left_margin + pane_w ;
Rhyme 0:2b9a6c5fcd52 74 y1 = head_h + (pane_h + 5) * ch ;
Rhyme 0:2b9a6c5fcd52 75 y2 = y1 + pane_h ;
Rhyme 3:ea0c3cffa988 76 TFT.BusEnable(true) ;
Rhyme 0:2b9a6c5fcd52 77 TFT.set_font((unsigned char*) Arial12x12);
Rhyme 0:2b9a6c5fcd52 78 TFT.background(Black) ;
Rhyme 0:2b9a6c5fcd52 79 TFT.foreground(White) ;
Rhyme 0:2b9a6c5fcd52 80 TFT.locate(5, y1+5) ;
Rhyme 0:2b9a6c5fcd52 81 TFT.printf("3.0") ;
Rhyme 0:2b9a6c5fcd52 82 TFT.locate(15, (y1+y2)/2) ;
Rhyme 0:2b9a6c5fcd52 83 TFT.printf("V") ;
Rhyme 0:2b9a6c5fcd52 84 TFT.locate(5, y2-10) ;
Rhyme 0:2b9a6c5fcd52 85 TFT.printf("0.0") ;
Rhyme 0:2b9a6c5fcd52 86 TFT.rect(x1,y1,x2,y2,Blue) ;
Rhyme 0:2b9a6c5fcd52 87 y_offset = head_h + 1;
Rhyme 0:2b9a6c5fcd52 88
Rhyme 0:2b9a6c5fcd52 89 for (int i = 0 ; i < pane_w ; i += 10) {
Rhyme 0:2b9a6c5fcd52 90 x1 = left_margin + i ;
Rhyme 0:2b9a6c5fcd52 91 x2 = x1 ;
Rhyme 0:2b9a6c5fcd52 92 if ((i % 100) == 0) {
Rhyme 0:2b9a6c5fcd52 93 y1 = head_h - 5 ;
Rhyme 0:2b9a6c5fcd52 94 } else {
Rhyme 0:2b9a6c5fcd52 95 y1 = head_h - 2 ;
Rhyme 0:2b9a6c5fcd52 96 }
Rhyme 0:2b9a6c5fcd52 97 y2 = head_h ;
Rhyme 0:2b9a6c5fcd52 98 TFT.line(x1, y1, x2, y2, Blue) ;
Rhyme 0:2b9a6c5fcd52 99 y1 = head_h + (pane_h + 5) * 2 - 5 ;
Rhyme 0:2b9a6c5fcd52 100 if ((i % 100) == 0) {
Rhyme 0:2b9a6c5fcd52 101 y2 = y1 + 5 ;
Rhyme 0:2b9a6c5fcd52 102 } else {
Rhyme 0:2b9a6c5fcd52 103 y2 = y1 + 2 ;
Rhyme 0:2b9a6c5fcd52 104 }
Rhyme 0:2b9a6c5fcd52 105 TFT.line(x1, y1, x2, y2, Blue) ;
Rhyme 0:2b9a6c5fcd52 106 }
Rhyme 0:2b9a6c5fcd52 107
Rhyme 0:2b9a6c5fcd52 108 for (float f = 0.0 ; f < vref ; f += 1.0) {
Rhyme 0:2b9a6c5fcd52 109 y_offset = head_h + 1;
Rhyme 0:2b9a6c5fcd52 110 y1 = ((pane_h - 2) * (1.0 - f/vref)) + y_offset ;
Rhyme 0:2b9a6c5fcd52 111 y2 = y1 ;
Rhyme 0:2b9a6c5fcd52 112 x1 = left_margin - 3 ;
Rhyme 0:2b9a6c5fcd52 113 x2 = left_margin ;
Rhyme 0:2b9a6c5fcd52 114 TFT.line(x1, y1, x2, y2, Blue) ;
Rhyme 0:2b9a6c5fcd52 115 y_offset = head_h + (pane_h + 5) + 1;
Rhyme 0:2b9a6c5fcd52 116 y1 = ((pane_h - 2) * (1.0 - f/vref)) + y_offset ;
Rhyme 0:2b9a6c5fcd52 117 y2 = y1 ;
Rhyme 0:2b9a6c5fcd52 118 TFT.line(x1, y1, x2, y2, Blue) ;
Rhyme 0:2b9a6c5fcd52 119 }
Rhyme 3:ea0c3cffa988 120 TFT.BusEnable(false) ;
Rhyme 0:2b9a6c5fcd52 121 }
Rhyme 0:2b9a6c5fcd52 122
Rhyme 0:2b9a6c5fcd52 123 bool inChFrame(int ch, int x, int y)
Rhyme 0:2b9a6c5fcd52 124 {
Rhyme 0:2b9a6c5fcd52 125 bool result = false ;
Rhyme 0:2b9a6c5fcd52 126 int x1, x2, y1, y2 ;
Rhyme 0:2b9a6c5fcd52 127 x1 = left_margin ;
Rhyme 0:2b9a6c5fcd52 128 x2 = left_margin + pane_w ;
Rhyme 0:2b9a6c5fcd52 129 y1 = head_h + (pane_h + 5) * ch ;
Rhyme 0:2b9a6c5fcd52 130 y2 = y1 + pane_h ;
Rhyme 3:ea0c3cffa988 131 if ((x1 < x)&&(x < x2)&&(y1 < y)&&(y < y2)) { // on 5-Mar-2015 '=' removed
Rhyme 0:2b9a6c5fcd52 132 result = true ;
Rhyme 0:2b9a6c5fcd52 133 }
Rhyme 0:2b9a6c5fcd52 134 return( result ) ;
Rhyme 0:2b9a6c5fcd52 135 }
Rhyme 0:2b9a6c5fcd52 136
Rhyme 0:2b9a6c5fcd52 137 void plotCh_line(int turn, int ch, int index, int color)
Rhyme 0:2b9a6c5fcd52 138 {
Rhyme 0:2b9a6c5fcd52 139 int x[2], y[2] ;
Rhyme 0:2b9a6c5fcd52 140 int y_offset, data_pos, prev_pos ;
Rhyme 0:2b9a6c5fcd52 141
Rhyme 0:2b9a6c5fcd52 142 y_offset = head_h + (pane_h + 5) * ch + 1;
Rhyme 0:2b9a6c5fcd52 143 data_pos = (bor[turn] + index) % memLength ;
Rhyme 0:2b9a6c5fcd52 144 prev_pos = (memLength + bor[turn] + index - 1) % memLength ;
Rhyme 0:2b9a6c5fcd52 145
Rhyme 0:2b9a6c5fcd52 146 x[1] = left_margin + index + 1;
Rhyme 0:2b9a6c5fcd52 147 y[1] = ((pane_h - 2) * (1.0 - u2f(udata[turn][ch][data_pos]))) + y_offset ;
Rhyme 0:2b9a6c5fcd52 148
Rhyme 0:2b9a6c5fcd52 149 if (index == 0) {
Rhyme 0:2b9a6c5fcd52 150 x[0] = x[1] ;
Rhyme 0:2b9a6c5fcd52 151 y[0] = y[1] ;
Rhyme 0:2b9a6c5fcd52 152 } else {
Rhyme 0:2b9a6c5fcd52 153 x[0] = left_margin + index ;
Rhyme 0:2b9a6c5fcd52 154 y[0] = ((pane_h - 2) * (1.0 - u2f(udata[turn][ch][prev_pos]))) + y_offset ;
Rhyme 0:2b9a6c5fcd52 155 }
Rhyme 0:2b9a6c5fcd52 156 TFT.line(x[0],y[0],x[1],y[1], color) ;
Rhyme 0:2b9a6c5fcd52 157 }
Rhyme 0:2b9a6c5fcd52 158
Rhyme 0:2b9a6c5fcd52 159 void drawGraphFrames(void)
Rhyme 0:2b9a6c5fcd52 160 {
Rhyme 3:ea0c3cffa988 161 TFT.BusEnable(true) ;
Rhyme 0:2b9a6c5fcd52 162 for (int i = 0 ; i < numAnalogIn ; i++ ) {
Rhyme 0:2b9a6c5fcd52 163 drawChFrame(i) ;
Rhyme 0:2b9a6c5fcd52 164 }
Rhyme 3:ea0c3cffa988 165 TFT.BusEnable(false) ;
Rhyme 0:2b9a6c5fcd52 166 }
Rhyme 0:2b9a6c5fcd52 167
Rhyme 0:2b9a6c5fcd52 168 void drawChart(void)
Rhyme 0:2b9a6c5fcd52 169 {
Rhyme 0:2b9a6c5fcd52 170 int i, ch ;
Rhyme 0:2b9a6c5fcd52 171 if (!frame_full) {
Rhyme 0:2b9a6c5fcd52 172 return ;
Rhyme 0:2b9a6c5fcd52 173 }
Rhyme 0:2b9a6c5fcd52 174 if (mode == MODE_RUN) {
Rhyme 0:2b9a6c5fcd52 175 timer.detach() ;
Rhyme 0:2b9a6c5fcd52 176 }
Rhyme 0:2b9a6c5fcd52 177
Rhyme 3:ea0c3cffa988 178 TFT.BusEnable(true) ;
Rhyme 0:2b9a6c5fcd52 179 for (i = 0 ; i < memLength ; i++ ) {
Rhyme 0:2b9a6c5fcd52 180 for (ch = 0 ; ch < numAnalogIn ; ch++ ) {
Rhyme 0:2b9a6c5fcd52 181 plotCh_line(prev_page, ch, i, Black) ; // erase prev
Rhyme 0:2b9a6c5fcd52 182 plotCh_line(page, ch, i, White) ;
Rhyme 0:2b9a6c5fcd52 183 }
Rhyme 0:2b9a6c5fcd52 184 }
Rhyme 3:ea0c3cffa988 185 TFT.BusEnable(false) ;
Rhyme 0:2b9a6c5fcd52 186 prev_page = page ;
Rhyme 0:2b9a6c5fcd52 187 page = (page + 1)%2 ;
Rhyme 0:2b9a6c5fcd52 188 sampling_status = ST_PRE_TRIG ;
Rhyme 0:2b9a6c5fcd52 189 frame_full = false ;
Rhyme 0:2b9a6c5fcd52 190 trig_index = 0 ;
Rhyme 0:2b9a6c5fcd52 191 data_index = 0 ;
Rhyme 0:2b9a6c5fcd52 192 if (mode == MODE_RUN) {
Rhyme 0:2b9a6c5fcd52 193 timer.attach_us(&sampleAD, us_interval) ;
Rhyme 0:2b9a6c5fcd52 194 }
Rhyme 0:2b9a6c5fcd52 195 }
Rhyme 0:2b9a6c5fcd52 196
Rhyme 0:2b9a6c5fcd52 197 void printMode(void)
Rhyme 0:2b9a6c5fcd52 198 {
Rhyme 3:ea0c3cffa988 199 TFT.BusEnable(true) ;
Rhyme 0:2b9a6c5fcd52 200 TFT.locate(80, 200) ;
Rhyme 0:2b9a6c5fcd52 201 TFT.background(Black) ;
Rhyme 0:2b9a6c5fcd52 202
Rhyme 0:2b9a6c5fcd52 203 if (mode == MODE_STOP) {
Rhyme 0:2b9a6c5fcd52 204 TFT.foreground(Yellow) ;
Rhyme 0:2b9a6c5fcd52 205 TFT.printf(" Stopped") ;
Rhyme 0:2b9a6c5fcd52 206 } else if (mode == MODE_RUN) {
Rhyme 0:2b9a6c5fcd52 207 TFT.foreground(White) ;
Rhyme 0:2b9a6c5fcd52 208 TFT.printf(" Running") ;
Rhyme 0:2b9a6c5fcd52 209 }
Rhyme 3:ea0c3cffa988 210 TFT.BusEnable(false) ;
Rhyme 0:2b9a6c5fcd52 211 }
Rhyme 0:2b9a6c5fcd52 212
Rhyme 0:2b9a6c5fcd52 213 void printTimeDiv(void)
Rhyme 0:2b9a6c5fcd52 214 {
Rhyme 0:2b9a6c5fcd52 215 char str[32] ;
Rhyme 0:2b9a6c5fcd52 216 int ival, dotval ;
Rhyme 0:2b9a6c5fcd52 217 if (us_interval < 100) { // 10 * us_interval < 1ms
Rhyme 0:2b9a6c5fcd52 218 sprintf(str, " %3d us/div", 10 *us_interval) ;
Rhyme 0:2b9a6c5fcd52 219 } else if (us_interval < 100000) { // 10 * us_interval >= 1ms
Rhyme 0:2b9a6c5fcd52 220 ival = us_interval / 100 ;
Rhyme 0:2b9a6c5fcd52 221 dotval = us_interval % 100 ;
Rhyme 0:2b9a6c5fcd52 222 sprintf(str, " %3d.%0d ms/div", ival, dotval) ;
Rhyme 0:2b9a6c5fcd52 223 }
Rhyme 3:ea0c3cffa988 224 TFT.BusEnable(true) ;
Rhyme 0:2b9a6c5fcd52 225 TFT.fillrect(65, 240, 175, 260, Black) ;
Rhyme 0:2b9a6c5fcd52 226
Rhyme 0:2b9a6c5fcd52 227 TFT.background(Black) ;
Rhyme 0:2b9a6c5fcd52 228 TFT.foreground(White) ;
Rhyme 0:2b9a6c5fcd52 229
Rhyme 0:2b9a6c5fcd52 230 TFT.locate(65, 240) ;
Rhyme 0:2b9a6c5fcd52 231 TFT.printf(str) ;
Rhyme 3:ea0c3cffa988 232 TFT.BusEnable(false) ;
Rhyme 0:2b9a6c5fcd52 233 }
Rhyme 0:2b9a6c5fcd52 234
Rhyme 0:2b9a6c5fcd52 235 void printTrigMode(void)
Rhyme 0:2b9a6c5fcd52 236 {
Rhyme 0:2b9a6c5fcd52 237 char str[60] ;
Rhyme 3:ea0c3cffa988 238 TFT.BusEnable(true) ;
Rhyme 0:2b9a6c5fcd52 239 TFT.fillrect(65, 280, 235, 310, Black) ;
Rhyme 0:2b9a6c5fcd52 240
Rhyme 0:2b9a6c5fcd52 241 TFT.background(Black) ;
Rhyme 0:2b9a6c5fcd52 242 TFT.foreground(White) ;
Rhyme 0:2b9a6c5fcd52 243
Rhyme 0:2b9a6c5fcd52 244 if (trig_mode == TRIG_MODE_NONE) {
Rhyme 0:2b9a6c5fcd52 245 sprintf(str, "%6s",
Rhyme 0:2b9a6c5fcd52 246 trig_name[trig_mode]) ;
Rhyme 0:2b9a6c5fcd52 247 } else {
Rhyme 0:2b9a6c5fcd52 248 sprintf(str, "%6s ch%1d (%d, %.1f)",
Rhyme 0:2b9a6c5fcd52 249 trig_name[trig_mode], trig_ch+1, trig_pos, trig_level) ;
Rhyme 0:2b9a6c5fcd52 250 }
Rhyme 0:2b9a6c5fcd52 251 TFT.locate(65, 280) ;
Rhyme 0:2b9a6c5fcd52 252 TFT.printf(str) ;
Rhyme 3:ea0c3cffa988 253 TFT.BusEnable(false) ;
Rhyme 0:2b9a6c5fcd52 254 }
Rhyme 0:2b9a6c5fcd52 255
Rhyme 0:2b9a6c5fcd52 256 void printTrigLevel(void)
Rhyme 0:2b9a6c5fcd52 257 {
Rhyme 0:2b9a6c5fcd52 258 char str[16] ;
Rhyme 3:ea0c3cffa988 259 sprintf(str, " %.1f", trig_level) ;
Rhyme 3:ea0c3cffa988 260 TFT.BusEnable(true) ;
Rhyme 0:2b9a6c5fcd52 261 TFT.locate(140, 280) ;
Rhyme 0:2b9a6c5fcd52 262 TFT.background(Black) ;
Rhyme 0:2b9a6c5fcd52 263 TFT.foreground(White) ;
Rhyme 0:2b9a6c5fcd52 264 TFT.printf(str) ;
Rhyme 3:ea0c3cffa988 265 TFT.BusEnable(false) ;
Rhyme 0:2b9a6c5fcd52 266 }
Rhyme 0:2b9a6c5fcd52 267
Rhyme 0:2b9a6c5fcd52 268 void eraseTrigMark(void)
Rhyme 0:2b9a6c5fcd52 269 {
Rhyme 0:2b9a6c5fcd52 270 int x1, x2, y1, y2 ;
Rhyme 3:ea0c3cffa988 271 TFT.BusEnable(true) ;
Rhyme 0:2b9a6c5fcd52 272 x1 = left_margin - 3 ;
Rhyme 0:2b9a6c5fcd52 273 x2 = left_margin + pane_w + 3 ;
Rhyme 0:2b9a6c5fcd52 274 y1 = 1 ;
Rhyme 0:2b9a6c5fcd52 275 y2 = head_h - 5 ;
Rhyme 0:2b9a6c5fcd52 276 TFT.fillrect(x1,y1,x2, y2, Black) ;
Rhyme 0:2b9a6c5fcd52 277 y1 = (head_h + (pane_h + 5)*2) + 5 ;
Rhyme 0:2b9a6c5fcd52 278 y2 = y1 + 13 ;
Rhyme 0:2b9a6c5fcd52 279 TFT.fillrect(x1,y1,x2, y2, Black) ;
Rhyme 0:2b9a6c5fcd52 280 x1 = left_margin + pane_w + 1 ;
Rhyme 0:2b9a6c5fcd52 281 x2 = x1 + 10 ;
Rhyme 0:2b9a6c5fcd52 282 y1 = 0 ;
Rhyme 0:2b9a6c5fcd52 283 y2 = head_h + (pane_h + 5) * (2) + 1;
Rhyme 0:2b9a6c5fcd52 284 TFT.fillrect(x1, y1, x2, y2, Black) ;
Rhyme 3:ea0c3cffa988 285 TFT.BusEnable(false) ;
Rhyme 0:2b9a6c5fcd52 286 }
Rhyme 0:2b9a6c5fcd52 287
Rhyme 0:2b9a6c5fcd52 288 void drawTrigPos()
Rhyme 0:2b9a6c5fcd52 289 {
Rhyme 0:2b9a6c5fcd52 290 uint16_t color = Green ;
Rhyme 0:2b9a6c5fcd52 291 int x1, x2, y1, y2 ;
Rhyme 0:2b9a6c5fcd52 292 int y_offset ;
Rhyme 0:2b9a6c5fcd52 293 // draw down arrow
Rhyme 3:ea0c3cffa988 294 TFT.BusEnable(true) ;
Rhyme 0:2b9a6c5fcd52 295 x1 = left_margin + trig_pos + 1 ;
Rhyme 0:2b9a6c5fcd52 296 x2 = x1 ;
Rhyme 0:2b9a6c5fcd52 297 y1 = 5 ;
Rhyme 0:2b9a6c5fcd52 298 y2 = head_h - 8 ;
Rhyme 0:2b9a6c5fcd52 299 TFT.line(x1, y1, x2, y2, color) ;
Rhyme 0:2b9a6c5fcd52 300 x1 = x2 - 3 ;
Rhyme 0:2b9a6c5fcd52 301 y1 = y2 - 4 ;
Rhyme 0:2b9a6c5fcd52 302 TFT.line(x1, y1, x2, y2, color) ;
Rhyme 0:2b9a6c5fcd52 303 x1 = x2 + 3 ;
Rhyme 0:2b9a6c5fcd52 304 TFT.line(x1, y1, x2, y2, color) ;
Rhyme 0:2b9a6c5fcd52 305 // draw up arrow
Rhyme 0:2b9a6c5fcd52 306 x1 = x2 ;
Rhyme 0:2b9a6c5fcd52 307 y1 = (head_h + (pane_h + 5)*2) + 5 ;
Rhyme 0:2b9a6c5fcd52 308 y2 = y1 + 7 ;
Rhyme 0:2b9a6c5fcd52 309 TFT.line(x1, y1, x2, y2, color) ;
Rhyme 0:2b9a6c5fcd52 310 x2 = x1 - 3 ;
Rhyme 0:2b9a6c5fcd52 311 y2 = y1 + 3 ;
Rhyme 0:2b9a6c5fcd52 312 TFT.line(x1, y1, x2, y2, color) ;
Rhyme 0:2b9a6c5fcd52 313 x2 = x1 + 3 ;
Rhyme 0:2b9a6c5fcd52 314 TFT.line(x1, y1, x2, y2, color) ;
Rhyme 0:2b9a6c5fcd52 315 // draw level mark
Rhyme 0:2b9a6c5fcd52 316 x1 = left_margin + pane_w + 3 ;
Rhyme 0:2b9a6c5fcd52 317 x2 = x1 + 7 ;
Rhyme 10:bd3d8d71ee73 318 y_offset = head_h + (pane_h * (trig_ch+1)) + (5 * trig_ch) - 1;
Rhyme 10:bd3d8d71ee73 319 y1 = y_offset - ((pane_h - 2) * (trig_level/vref)) ;
Rhyme 0:2b9a6c5fcd52 320 y2 = y1 ;
Rhyme 0:2b9a6c5fcd52 321 TFT.line(x1, y1, x2, y2, color) ;
Rhyme 0:2b9a6c5fcd52 322 x2 = x1 + 3 ;
Rhyme 0:2b9a6c5fcd52 323 y2 = y1 - 3 ;
Rhyme 0:2b9a6c5fcd52 324 TFT.line(x1, y1, x2, y2, color) ;
Rhyme 0:2b9a6c5fcd52 325 y2 = y1 + 3 ;
Rhyme 0:2b9a6c5fcd52 326 TFT.line(x1, y1, x2, y2, color) ;
Rhyme 3:ea0c3cffa988 327 TFT.BusEnable(false) ;
Rhyme 10:bd3d8d71ee73 328 // printf("trig_ch = %d, trig level = %.2f, y1 = %d yoffset = %d\n",
Rhyme 10:bd3d8d71ee73 329 // trig_ch, trig_level, y1, y_offset) ;
Rhyme 0:2b9a6c5fcd52 330 }
Rhyme 0:2b9a6c5fcd52 331
Rhyme 0:2b9a6c5fcd52 332 void drawTrigMark(void)
Rhyme 0:2b9a6c5fcd52 333 {
Rhyme 0:2b9a6c5fcd52 334 eraseTrigMark() ;
Rhyme 0:2b9a6c5fcd52 335 switch(trig_mode) {
Rhyme 0:2b9a6c5fcd52 336 case TRIG_MODE_NONE:
Rhyme 0:2b9a6c5fcd52 337 break ;
Rhyme 0:2b9a6c5fcd52 338 case TRIG_MODE_RISE:
Rhyme 0:2b9a6c5fcd52 339 case TRIG_MODE_FALL:
Rhyme 0:2b9a6c5fcd52 340 case TRIG_MODE_LEVEL:
Rhyme 0:2b9a6c5fcd52 341 drawTrigPos() ;
Rhyme 0:2b9a6c5fcd52 342 break ;
Rhyme 0:2b9a6c5fcd52 343 default:
Rhyme 0:2b9a6c5fcd52 344 printf("Unkown trigger mode %d\n\r",trig_mode) ;
Rhyme 0:2b9a6c5fcd52 345 break ;
Rhyme 0:2b9a6c5fcd52 346 }
Rhyme 0:2b9a6c5fcd52 347 }