Frequency Counter. User interface are used DISCO-F746NG GUI with touch panel.

Dependencies:   BSP_DISCO_F746NG F746_GUI LCD_DISCO_F746NG RingBuffer TS_DISCO_F746NG fc_GPS1PPS_f746_f4xx mbed

Please refer following.
/users/kenjiArai/notebook/frequency-counters/

Committer:
kenjiArai
Date:
Sat Nov 19 05:32:06 2016 +0000
Revision:
0:52c5dc2b2b68
Frequency Counter. User interface are used DISCO-F746NG GUI with touch panel.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:52c5dc2b2b68 1 /*
kenjiArai 0:52c5dc2b2b68 2 * mbed Application program / Frequency Counter using GPS 1PPS gate puls
kenjiArai 0:52c5dc2b2b68 3 * Only for ST DISCO-F746NG
kenjiArai 0:52c5dc2b2b68 4 * Worked on a dedicated Grafic LCD Module
kenjiArai 0:52c5dc2b2b68 5 *
kenjiArai 0:52c5dc2b2b68 6 * Copyright (c) 2014,'15,'16 Kenji Arai / JH1PJL
kenjiArai 0:52c5dc2b2b68 7 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 0:52c5dc2b2b68 8 * http://mbed.org/users/kenjiArai/
kenjiArai 0:52c5dc2b2b68 9 * Created: October 18th, 2014
kenjiArai 0:52c5dc2b2b68 10 * Revised: January 2nd, 2015
kenjiArai 0:52c5dc2b2b68 11 * Re-started: June 25th, 2016 ported from F411 to F746
kenjiArai 0:52c5dc2b2b68 12 * Re-started: Nobember 13th, 2016 Only for DISCO-F746NG LCD
kenjiArai 0:52c5dc2b2b68 13 * Revised: Nobember 19th, 2016
kenjiArai 0:52c5dc2b2b68 14 *
kenjiArai 0:52c5dc2b2b68 15 * Base program: FreqCntr_GPS1PPS_F746F4xx_w_recipro
kenjiArai 0:52c5dc2b2b68 16 * https://developer.mbed.org/users/kenjiArai
kenjiArai 0:52c5dc2b2b68 17 * /code/FreqCntr_GPS1PPS_F746F4xx_w_recipro/
kenjiArai 0:52c5dc2b2b68 18 *
kenjiArai 0:52c5dc2b2b68 19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
kenjiArai 0:52c5dc2b2b68 20 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
kenjiArai 0:52c5dc2b2b68 21 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
kenjiArai 0:52c5dc2b2b68 22 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
kenjiArai 0:52c5dc2b2b68 23 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
kenjiArai 0:52c5dc2b2b68 24 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
kenjiArai 0:52c5dc2b2b68 25 * THE USE OR OTHER DEALINGS IN THE SOFTWARE.
kenjiArai 0:52c5dc2b2b68 26 */
kenjiArai 0:52c5dc2b2b68 27
kenjiArai 0:52c5dc2b2b68 28 /*
kenjiArai 0:52c5dc2b2b68 29 REFRENCE: see the source code in this file bottom area
kenjiArai 0:52c5dc2b2b68 30 2016/11/12, Copyright (c) 2016 MIKAMI, Naoki
kenjiArai 0:52c5dc2b2b68 31 https://developer.mbed.org/users/MikamiUitOpen/code/F746_GUI_Demo/
kenjiArai 0:52c5dc2b2b68 32 Thanks Mikammi-san!
kenjiArai 0:52c5dc2b2b68 33 */
kenjiArai 0:52c5dc2b2b68 34
kenjiArai 0:52c5dc2b2b68 35 #define USE_COM // use Communication with PC(UART)
kenjiArai 0:52c5dc2b2b68 36
kenjiArai 0:52c5dc2b2b68 37 // Include --------------------------------------------------------------------
kenjiArai 0:52c5dc2b2b68 38 #include "mbed.h"
kenjiArai 0:52c5dc2b2b68 39 #include "F746_GUI.hpp"
kenjiArai 0:52c5dc2b2b68 40 #include "GPSrcvr.h"
kenjiArai 0:52c5dc2b2b68 41 #include "fc_GPS1PPS.h"
kenjiArai 0:52c5dc2b2b68 42
kenjiArai 0:52c5dc2b2b68 43 // Definition -----------------------------------------------------------------
kenjiArai 0:52c5dc2b2b68 44 #ifdef USE_COM
kenjiArai 0:52c5dc2b2b68 45 #define BAUD(x) pc.baud(x)
kenjiArai 0:52c5dc2b2b68 46 #define GETC(x) pc.getc(x)
kenjiArai 0:52c5dc2b2b68 47 #define PUTC(x) pc.putc(x)
kenjiArai 0:52c5dc2b2b68 48 #define PRINTF(...) pc.printf(__VA_ARGS__)
kenjiArai 0:52c5dc2b2b68 49 #define READABLE(x) pc.readable(x)
kenjiArai 0:52c5dc2b2b68 50 #else
kenjiArai 0:52c5dc2b2b68 51 #define BAUD(x) {;}
kenjiArai 0:52c5dc2b2b68 52 #define GETC(x) {;}
kenjiArai 0:52c5dc2b2b68 53 #define PUTC(x) {;}
kenjiArai 0:52c5dc2b2b68 54 #define PRINTF(...) {;}
kenjiArai 0:52c5dc2b2b68 55 #define READABLE(x) {;}
kenjiArai 0:52c5dc2b2b68 56 #endif
kenjiArai 0:52c5dc2b2b68 57
kenjiArai 0:52c5dc2b2b68 58 enum input_select {
kenjiArai 0:52c5dc2b2b68 59 BNC_NORMAL = 1,
kenjiArai 0:52c5dc2b2b68 60 RECIPRO_AC,
kenjiArai 0:52c5dc2b2b68 61 RECIPRO_DC,
kenjiArai 0:52c5dc2b2b68 62 SMA_10,
kenjiArai 0:52c5dc2b2b68 63 SMA_20
kenjiArai 0:52c5dc2b2b68 64 };
kenjiArai 0:52c5dc2b2b68 65
kenjiArai 0:52c5dc2b2b68 66 using namespace Frequency_counter;
kenjiArai 0:52c5dc2b2b68 67
kenjiArai 0:52c5dc2b2b68 68 // Object ---------------------------------------------------------------------
kenjiArai 0:52c5dc2b2b68 69 DigitalOut input_frq_select(PF_9);
kenjiArai 0:52c5dc2b2b68 70 DigitalInOut prescaler10or20(PB_15);
kenjiArai 0:52c5dc2b2b68 71 DigitalOut recipro_select(PA_8);
kenjiArai 0:52c5dc2b2b68 72 DigitalOut led1(LED1);
kenjiArai 0:52c5dc2b2b68 73 Serial pc(USBTX, USBRX);
kenjiArai 0:52c5dc2b2b68 74 Timer tmr;
kenjiArai 0:52c5dc2b2b68 75
kenjiArai 0:52c5dc2b2b68 76 //**** Req. Counter
kenjiArai 0:52c5dc2b2b68 77 FRQ_CUNTR fc;
kenjiArai 0:52c5dc2b2b68 78 //**** GUI
kenjiArai 0:52c5dc2b2b68 79 LCD_DISCO_F746NG lcd_;
kenjiArai 0:52c5dc2b2b68 80
kenjiArai 0:52c5dc2b2b68 81 // RAM ------------------------------------------------------------------------
kenjiArai 0:52c5dc2b2b68 82 // Freq.
kenjiArai 0:52c5dc2b2b68 83 double new_frequency;
kenjiArai 0:52c5dc2b2b68 84 double f_10sec;
kenjiArai 0:52c5dc2b2b68 85 double f_100sec;
kenjiArai 0:52c5dc2b2b68 86 double f_1000sec;
kenjiArai 0:52c5dc2b2b68 87 double freq_recipro;
kenjiArai 0:52c5dc2b2b68 88 // Operation mode
kenjiArai 0:52c5dc2b2b68 89 uint8_t input_mode;
kenjiArai 0:52c5dc2b2b68 90
kenjiArai 0:52c5dc2b2b68 91 // ROM / Constant data --------------------------------------------------------
kenjiArai 0:52c5dc2b2b68 92 // 12345678901234567890
kenjiArai 0:52c5dc2b2b68 93 static char *const msg_msg0 = "Frequency Counter by JH1PJL K.Arai";
kenjiArai 0:52c5dc2b2b68 94 static char *const msg_msg1 = "on DISCO-F746NG System";
kenjiArai 0:52c5dc2b2b68 95 static char *const msg_msg2 = " "__DATE__" ";
kenjiArai 0:52c5dc2b2b68 96 static char *const msg_mode1 = " BNC none-prescaler ";
kenjiArai 0:52c5dc2b2b68 97 static char *const msg_mode2 = " BNC recipro(BNC none-prescaler) ";
kenjiArai 0:52c5dc2b2b68 98 static char *const msg_mode3 = " BNC recipro(dedicated BNC input)";
kenjiArai 0:52c5dc2b2b68 99 static char *const msg_mode4 = " SMA prescaler 1/10 ";
kenjiArai 0:52c5dc2b2b68 100 static char *const msg_mode5 = " SMA prescaler 1/20 ";
kenjiArai 0:52c5dc2b2b68 101
kenjiArai 0:52c5dc2b2b68 102 char *const open_msg[] = {
kenjiArai 0:52c5dc2b2b68 103 "(1) BNC(AC) div = 1/1 10Hz to 100MHz",
kenjiArai 0:52c5dc2b2b68 104 "(2) BNC(AC)(same as above) Reciprocal mode less than 5KHz",
kenjiArai 0:52c5dc2b2b68 105 "(3) BNC(DC) (another BNC) Reciprocal mode less than 5KHz",
kenjiArai 0:52c5dc2b2b68 106 "(4) SMA div = 1/10 up to 1GHz",
kenjiArai 0:52c5dc2b2b68 107 "(5) SMA(same as above) div = 1/20 up to 1.5GHz"
kenjiArai 0:52c5dc2b2b68 108 };
kenjiArai 0:52c5dc2b2b68 109
kenjiArai 0:52c5dc2b2b68 110 char *const select_msg[] = {
kenjiArai 0:52c5dc2b2b68 111 "(1) BNC(AC) div = 1/1 ",
kenjiArai 0:52c5dc2b2b68 112 "(2) BNC(AC) Reciprocal",
kenjiArai 0:52c5dc2b2b68 113 "(3) BNC(DC) Reciprocal",
kenjiArai 0:52c5dc2b2b68 114 "(4) SMA div = 1/10",
kenjiArai 0:52c5dc2b2b68 115 "(5) SMA div = 1/20"
kenjiArai 0:52c5dc2b2b68 116 };
kenjiArai 0:52c5dc2b2b68 117
kenjiArai 0:52c5dc2b2b68 118 // Function prototypes --------------------------------------------------------
kenjiArai 0:52c5dc2b2b68 119 void gps_data_rcv(void);
kenjiArai 0:52c5dc2b2b68 120 void freq_measurement(uint8_t mode);
kenjiArai 0:52c5dc2b2b68 121 void recipro(uint8_t mode);
kenjiArai 0:52c5dc2b2b68 122 void opening(void);
kenjiArai 0:52c5dc2b2b68 123 void show_time(void);
kenjiArai 0:52c5dc2b2b68 124 uint8_t mode_slect(void);
kenjiArai 0:52c5dc2b2b68 125
kenjiArai 0:52c5dc2b2b68 126 //------------------------------------------------------------------------------
kenjiArai 0:52c5dc2b2b68 127 // Control Program
kenjiArai 0:52c5dc2b2b68 128 //------------------------------------------------------------------------------
kenjiArai 0:52c5dc2b2b68 129 void freq_measurement(uint8_t mode)
kenjiArai 0:52c5dc2b2b68 130 {
kenjiArai 0:52c5dc2b2b68 131 uint16_t n = 0;
kenjiArai 0:52c5dc2b2b68 132 char buf[48];
kenjiArai 0:52c5dc2b2b68 133 double scale;
kenjiArai 0:52c5dc2b2b68 134
kenjiArai 0:52c5dc2b2b68 135 Button button(400, 3, 70, 40, "MODE", Font16);
kenjiArai 0:52c5dc2b2b68 136 Label obj20(180, 5, "Frequency Counter",
kenjiArai 0:52c5dc2b2b68 137 Label::CENTER, Font24, LCD_COLOR_GREEN, LCD_COLOR_BLACK);
kenjiArai 0:52c5dc2b2b68 138 if (mode == SMA_20){
kenjiArai 0:52c5dc2b2b68 139 Label obj21(200, 30, "Input=SMA, Division=1/20",
kenjiArai 0:52c5dc2b2b68 140 Label::CENTER, Font16, LCD_COLOR_WHITE, LCD_COLOR_BLACK);
kenjiArai 0:52c5dc2b2b68 141 scale = 20.0f;
kenjiArai 0:52c5dc2b2b68 142 } else if(mode == SMA_10){
kenjiArai 0:52c5dc2b2b68 143 Label obj21(200, 30, "Input=SMA, Division=1/10",
kenjiArai 0:52c5dc2b2b68 144 Label::CENTER, Font16, LCD_COLOR_WHITE, LCD_COLOR_BLACK);
kenjiArai 0:52c5dc2b2b68 145 scale = 10.0f;
kenjiArai 0:52c5dc2b2b68 146 } else {
kenjiArai 0:52c5dc2b2b68 147 Label obj21(200, 30, "Input=BNC(AC), Division=1/1",
kenjiArai 0:52c5dc2b2b68 148 Label::CENTER, Font16, LCD_COLOR_WHITE, LCD_COLOR_BLACK);
kenjiArai 0:52c5dc2b2b68 149 scale = 1.0f;
kenjiArai 0:52c5dc2b2b68 150 }
kenjiArai 0:52c5dc2b2b68 151 while(true){
kenjiArai 0:52c5dc2b2b68 152 tmr.reset();
kenjiArai 0:52c5dc2b2b68 153 tmr.start();
kenjiArai 0:52c5dc2b2b68 154 if (fc.status_freq_update() != 0) {
kenjiArai 0:52c5dc2b2b68 155 new_frequency = fc.read_freq_data() * scale;
kenjiArai 0:52c5dc2b2b68 156 f_10sec = fc.read_freq_w_gate_time(10) * scale;
kenjiArai 0:52c5dc2b2b68 157 f_100sec = fc.read_freq_w_gate_time(100) * scale;
kenjiArai 0:52c5dc2b2b68 158 f_1000sec = fc.read_freq_w_gate_time(1000) * scale;
kenjiArai 0:52c5dc2b2b68 159 PRINTF("%8d, Freq: %9.0f,", ++n, new_frequency);
kenjiArai 0:52c5dc2b2b68 160 PRINTF(" F10s: %10.1f, F100s: %11.2f,", f_10sec, f_100sec);
kenjiArai 0:52c5dc2b2b68 161 PRINTF(" F1000s: %12.3f,", f_1000sec);
kenjiArai 0:52c5dc2b2b68 162 sprintf(buf, "Freq: %11.0f [Hz]", new_frequency);
kenjiArai 0:52c5dc2b2b68 163 Label obj22(40, 60, buf, Label::LEFT, Font24,
kenjiArai 0:52c5dc2b2b68 164 LCD_COLOR_GREEN, LCD_COLOR_BLACK);
kenjiArai 0:52c5dc2b2b68 165 sprintf(buf, "F10S: %12.1f [Hz]", f_10sec);
kenjiArai 0:52c5dc2b2b68 166 Label obj23(40, 90, buf, Label::LEFT, Font24,
kenjiArai 0:52c5dc2b2b68 167 LCD_COLOR_WHITE, LCD_COLOR_BLACK);
kenjiArai 0:52c5dc2b2b68 168 sprintf(buf, "F100: %13.2f [Hz]", f_100sec);
kenjiArai 0:52c5dc2b2b68 169 Label obj24(40, 120, buf, Label::LEFT, Font24,
kenjiArai 0:52c5dc2b2b68 170 LCD_COLOR_WHITE, LCD_COLOR_BLACK);
kenjiArai 0:52c5dc2b2b68 171 } else {
kenjiArai 0:52c5dc2b2b68 172 PRINTF("%8d, No data,,,,", ++n);
kenjiArai 0:52c5dc2b2b68 173 Label obj25(40, 60, "Data is NOT available!", Label::LEFT, Font24,
kenjiArai 0:52c5dc2b2b68 174 LCD_COLOR_GREEN, LCD_COLOR_BLACK);
kenjiArai 0:52c5dc2b2b68 175 sprintf(buf, " ");
kenjiArai 0:52c5dc2b2b68 176 Label obj26(40, 80, buf, Label::LEFT, Font24,
kenjiArai 0:52c5dc2b2b68 177 LCD_COLOR_WHITE, LCD_COLOR_BLACK);
kenjiArai 0:52c5dc2b2b68 178 Label obj27(40, 100, buf, Label::LEFT, Font24,
kenjiArai 0:52c5dc2b2b68 179 LCD_COLOR_MAGENTA, LCD_COLOR_BLACK);
kenjiArai 0:52c5dc2b2b68 180 }
kenjiArai 0:52c5dc2b2b68 181 if (mode == SMA_20){
kenjiArai 0:52c5dc2b2b68 182 PRINTF(" Div: 1/20,");
kenjiArai 0:52c5dc2b2b68 183 } else if(mode == SMA_10){
kenjiArai 0:52c5dc2b2b68 184 PRINTF(" Div: 1/10,");
kenjiArai 0:52c5dc2b2b68 185 } else {
kenjiArai 0:52c5dc2b2b68 186 PRINTF(" Div: 1/1 ,");
kenjiArai 0:52c5dc2b2b68 187 }
kenjiArai 0:52c5dc2b2b68 188 show_time();
kenjiArai 0:52c5dc2b2b68 189 while (1000 > tmr.read_ms()){ // 1 second interval
kenjiArai 0:52c5dc2b2b68 190 if (button.Touched()){ // if user touched "MODE" panel then return
kenjiArai 0:52c5dc2b2b68 191 return;
kenjiArai 0:52c5dc2b2b68 192 }
kenjiArai 0:52c5dc2b2b68 193 wait_ms(1);
kenjiArai 0:52c5dc2b2b68 194 }
kenjiArai 0:52c5dc2b2b68 195 }
kenjiArai 0:52c5dc2b2b68 196 }
kenjiArai 0:52c5dc2b2b68 197
kenjiArai 0:52c5dc2b2b68 198 void recipro(uint8_t mode)
kenjiArai 0:52c5dc2b2b68 199 {
kenjiArai 0:52c5dc2b2b68 200 uint16_t n = 0;
kenjiArai 0:52c5dc2b2b68 201 char buf[48];
kenjiArai 0:52c5dc2b2b68 202 double freq_recipro;
kenjiArai 0:52c5dc2b2b68 203 uint32_t interval_recipro;
kenjiArai 0:52c5dc2b2b68 204 uint32_t base_clk;
kenjiArai 0:52c5dc2b2b68 205 int32_t run2stop;
kenjiArai 0:52c5dc2b2b68 206
kenjiArai 0:52c5dc2b2b68 207 Button button(400, 3, 70, 40, "MODE", Font16);
kenjiArai 0:52c5dc2b2b68 208 Label obj30(180, 5, "Frequency Counter",
kenjiArai 0:52c5dc2b2b68 209 Label::CENTER, Font24, LCD_COLOR_GREEN, LCD_COLOR_BLACK);
kenjiArai 0:52c5dc2b2b68 210 if (mode == RECIPRO_AC){
kenjiArai 0:52c5dc2b2b68 211 Label obj31(200, 30, "Input=BNC(AC) Reciprocal Mode",
kenjiArai 0:52c5dc2b2b68 212 Label::CENTER, Font16, LCD_COLOR_WHITE, LCD_COLOR_BLACK);
kenjiArai 0:52c5dc2b2b68 213 } else if (mode == RECIPRO_DC){
kenjiArai 0:52c5dc2b2b68 214 Label obj31(200, 30, "Input=BNC(DC) Reciprocal Mode",
kenjiArai 0:52c5dc2b2b68 215 Label::CENTER, Font16, LCD_COLOR_WHITE, LCD_COLOR_BLACK);
kenjiArai 0:52c5dc2b2b68 216 }
kenjiArai 0:52c5dc2b2b68 217 while(true){
kenjiArai 0:52c5dc2b2b68 218 tmr.reset();
kenjiArai 0:52c5dc2b2b68 219 tmr.start();
kenjiArai 0:52c5dc2b2b68 220 fc.recipro_start_measure();
kenjiArai 0:52c5dc2b2b68 221 PRINTF("Start measurement\r");
kenjiArai 0:52c5dc2b2b68 222 while (fc.recipro_check_trigger() == 0){
kenjiArai 0:52c5dc2b2b68 223 run2stop = tmr.read_ms();
kenjiArai 0:52c5dc2b2b68 224 if (run2stop >= 100000){ // 100sec 0.001Hz
kenjiArai 0:52c5dc2b2b68 225 break;
kenjiArai 0:52c5dc2b2b68 226 }
kenjiArai 0:52c5dc2b2b68 227 if (button.Touched()){ // if user touched "MODE" panel then return
kenjiArai 0:52c5dc2b2b68 228 return;
kenjiArai 0:52c5dc2b2b68 229 }
kenjiArai 0:52c5dc2b2b68 230 }
kenjiArai 0:52c5dc2b2b68 231 if (button.Touched()){ // if user touched "MODE" panel then return
kenjiArai 0:52c5dc2b2b68 232 return;
kenjiArai 0:52c5dc2b2b68 233 }
kenjiArai 0:52c5dc2b2b68 234 if (run2stop >= 1000000){ // 100sec 0.001Hz
kenjiArai 0:52c5dc2b2b68 235 //freq_recipro = 0;
kenjiArai 0:52c5dc2b2b68 236 } else {
kenjiArai 0:52c5dc2b2b68 237 interval_recipro = fc.recipro_read_data();
kenjiArai 0:52c5dc2b2b68 238 base_clk = fc.recipro_base_clk_data(1);
kenjiArai 0:52c5dc2b2b68 239 if (interval_recipro >= 9000){// Measure less than 10KHz frequency
kenjiArai 0:52c5dc2b2b68 240 freq_recipro = (double)base_clk / (double)interval_recipro;
kenjiArai 0:52c5dc2b2b68 241 } else {
kenjiArai 0:52c5dc2b2b68 242 //freq_recipro = 0;
kenjiArai 0:52c5dc2b2b68 243 }
kenjiArai 0:52c5dc2b2b68 244 }
kenjiArai 0:52c5dc2b2b68 245 PRINTF("%8d, Freq: %11.5f [Hz] , ", n++, freq_recipro);
kenjiArai 0:52c5dc2b2b68 246 PRINTF("Raw: %11u [cnt] , ", interval_recipro);
kenjiArai 0:52c5dc2b2b68 247 PRINTF("Base: %11u [Hz], ", base_clk);
kenjiArai 0:52c5dc2b2b68 248 sprintf(buf, "Freq:%11.5f [Hz]", freq_recipro);
kenjiArai 0:52c5dc2b2b68 249 Label obj32(40, 60, buf, Label::LEFT, Font24,
kenjiArai 0:52c5dc2b2b68 250 LCD_COLOR_GREEN, LCD_COLOR_BLACK);
kenjiArai 0:52c5dc2b2b68 251 sprintf(buf, "Raw: %11u [Counts]", interval_recipro);
kenjiArai 0:52c5dc2b2b68 252 Label obj33(40, 90, buf, Label::LEFT, Font24,
kenjiArai 0:52c5dc2b2b68 253 LCD_COLOR_WHITE, LCD_COLOR_BLACK);
kenjiArai 0:52c5dc2b2b68 254 sprintf(buf, "Base:%11u (Sys Clk)", base_clk);
kenjiArai 0:52c5dc2b2b68 255 Label obj34(40, 120, buf, Label::LEFT, Font24,
kenjiArai 0:52c5dc2b2b68 256 LCD_COLOR_MAGENTA, LCD_COLOR_BLACK);
kenjiArai 0:52c5dc2b2b68 257 show_time();
kenjiArai 0:52c5dc2b2b68 258 run2stop = tmr.read_ms();
kenjiArai 0:52c5dc2b2b68 259 if (run2stop < 1000){
kenjiArai 0:52c5dc2b2b68 260 while (tmr.read_ms() < 1000){ // 1 second interval
kenjiArai 0:52c5dc2b2b68 261 if (button.Touched()){
kenjiArai 0:52c5dc2b2b68 262 return;
kenjiArai 0:52c5dc2b2b68 263 }
kenjiArai 0:52c5dc2b2b68 264 wait_ms(1);
kenjiArai 0:52c5dc2b2b68 265 }
kenjiArai 0:52c5dc2b2b68 266 }
kenjiArai 0:52c5dc2b2b68 267 }
kenjiArai 0:52c5dc2b2b68 268 }
kenjiArai 0:52c5dc2b2b68 269
kenjiArai 0:52c5dc2b2b68 270 void show_time(void)
kenjiArai 0:52c5dc2b2b68 271 {
kenjiArai 0:52c5dc2b2b68 272 char buf[48];
kenjiArai 0:52c5dc2b2b68 273 time_t seconds;
kenjiArai 0:52c5dc2b2b68 274
kenjiArai 0:52c5dc2b2b68 275 seconds = time(NULL) + 32400; // Adjust UTC to JST
kenjiArai 0:52c5dc2b2b68 276 strftime(buf, 40,
kenjiArai 0:52c5dc2b2b68 277 " %I:%M:%S %p JST %y/%m/%d", localtime(&seconds));
kenjiArai 0:52c5dc2b2b68 278 PRINTF("%s\r\n", buf);
kenjiArai 0:52c5dc2b2b68 279 Label obj0(40, 240, buf, Label::LEFT, Font24,
kenjiArai 0:52c5dc2b2b68 280 LCD_COLOR_ORANGE, LCD_COLOR_BLACK);
kenjiArai 0:52c5dc2b2b68 281 }
kenjiArai 0:52c5dc2b2b68 282
kenjiArai 0:52c5dc2b2b68 283 int main()
kenjiArai 0:52c5dc2b2b68 284 {
kenjiArai 0:52c5dc2b2b68 285 // Initial input mode
kenjiArai 0:52c5dc2b2b68 286 input_mode = BNC_NORMAL;
kenjiArai 0:52c5dc2b2b68 287 input_frq_select = 1;
kenjiArai 0:52c5dc2b2b68 288 prescaler10or20.output();
kenjiArai 0:52c5dc2b2b68 289 prescaler10or20 = 0;
kenjiArai 0:52c5dc2b2b68 290 recipro_select = 0;
kenjiArai 0:52c5dc2b2b68 291 while(true){
kenjiArai 0:52c5dc2b2b68 292 lcd_.Clear(LCD_COLOR_BLACK);
kenjiArai 0:52c5dc2b2b68 293 // openning message
kenjiArai 0:52c5dc2b2b68 294 opening();
kenjiArai 0:52c5dc2b2b68 295 PRINTF("\r\n%s%s\r\n", msg_msg0, msg_msg2);
kenjiArai 0:52c5dc2b2b68 296 PRINTF("%s\r\n", msg_msg1);
kenjiArai 0:52c5dc2b2b68 297 PRINTF("Wait GPS 1PPS signal\r\n");
kenjiArai 0:52c5dc2b2b68 298 // GPS (not return until 3D condition)
kenjiArai 0:52c5dc2b2b68 299 gps_data_rcv();
kenjiArai 0:52c5dc2b2b68 300 lcd_.Clear(LCD_COLOR_BLACK);
kenjiArai 0:52c5dc2b2b68 301 input_mode = mode_slect();
kenjiArai 0:52c5dc2b2b68 302 lcd_.Clear(LCD_COLOR_BLACK);
kenjiArai 0:52c5dc2b2b68 303 PRINTF("\r\nInput mode # is %u\r\n", input_mode);
kenjiArai 0:52c5dc2b2b68 304 PRINTF("If you want to change the input signal,");
kenjiArai 0:52c5dc2b2b68 305 PRINTF(" please restart the system (Enter Alt+B from your PC)\r\n");
kenjiArai 0:52c5dc2b2b68 306 PRINTF("\r\nStart measuring\r\nMeasureing mode = ");
kenjiArai 0:52c5dc2b2b68 307 switch(input_mode){
kenjiArai 0:52c5dc2b2b68 308 case RECIPRO_AC:
kenjiArai 0:52c5dc2b2b68 309 PRINTF("%s\r\n", msg_mode2);
kenjiArai 0:52c5dc2b2b68 310 input_frq_select = 1;
kenjiArai 0:52c5dc2b2b68 311 prescaler10or20.output();
kenjiArai 0:52c5dc2b2b68 312 prescaler10or20 = 0;
kenjiArai 0:52c5dc2b2b68 313 recipro_select = 0;
kenjiArai 0:52c5dc2b2b68 314 recipro(input_mode);
kenjiArai 0:52c5dc2b2b68 315 break;
kenjiArai 0:52c5dc2b2b68 316 case RECIPRO_DC:
kenjiArai 0:52c5dc2b2b68 317 PRINTF("%s\r\n", msg_mode3);
kenjiArai 0:52c5dc2b2b68 318 input_frq_select = 1;
kenjiArai 0:52c5dc2b2b68 319 prescaler10or20.output();
kenjiArai 0:52c5dc2b2b68 320 prescaler10or20 = 0;
kenjiArai 0:52c5dc2b2b68 321 recipro_select = 1;
kenjiArai 0:52c5dc2b2b68 322 recipro(input_mode);
kenjiArai 0:52c5dc2b2b68 323 break;
kenjiArai 0:52c5dc2b2b68 324 case SMA_10:
kenjiArai 0:52c5dc2b2b68 325 PRINTF("%s\r\n", msg_mode4);
kenjiArai 0:52c5dc2b2b68 326 input_frq_select = 0;
kenjiArai 0:52c5dc2b2b68 327 prescaler10or20.output();
kenjiArai 0:52c5dc2b2b68 328 prescaler10or20 = 0;
kenjiArai 0:52c5dc2b2b68 329 recipro_select = 0;
kenjiArai 0:52c5dc2b2b68 330 freq_measurement(input_mode);
kenjiArai 0:52c5dc2b2b68 331 break;
kenjiArai 0:52c5dc2b2b68 332 case SMA_20:
kenjiArai 0:52c5dc2b2b68 333 PRINTF("%s\r\n", msg_mode5);
kenjiArai 0:52c5dc2b2b68 334 input_frq_select = 0;
kenjiArai 0:52c5dc2b2b68 335 prescaler10or20.input();
kenjiArai 0:52c5dc2b2b68 336 recipro_select = 0;
kenjiArai 0:52c5dc2b2b68 337 freq_measurement(input_mode);
kenjiArai 0:52c5dc2b2b68 338 break;
kenjiArai 0:52c5dc2b2b68 339 case BNC_NORMAL:
kenjiArai 0:52c5dc2b2b68 340 default:
kenjiArai 0:52c5dc2b2b68 341 input_mode = BNC_NORMAL;
kenjiArai 0:52c5dc2b2b68 342 PRINTF("%s\r\n", msg_mode1);
kenjiArai 0:52c5dc2b2b68 343 input_frq_select = 1;
kenjiArai 0:52c5dc2b2b68 344 prescaler10or20.output();
kenjiArai 0:52c5dc2b2b68 345 prescaler10or20 = 0;
kenjiArai 0:52c5dc2b2b68 346 recipro_select = 0;
kenjiArai 0:52c5dc2b2b68 347 freq_measurement(input_mode);
kenjiArai 0:52c5dc2b2b68 348 break;
kenjiArai 0:52c5dc2b2b68 349 }
kenjiArai 0:52c5dc2b2b68 350 }
kenjiArai 0:52c5dc2b2b68 351 }
kenjiArai 0:52c5dc2b2b68 352
kenjiArai 0:52c5dc2b2b68 353 void opening()
kenjiArai 0:52c5dc2b2b68 354 {
kenjiArai 0:52c5dc2b2b68 355 Label obj10(240, 2, "Frequency Counter using GPS 1PPS",
kenjiArai 0:52c5dc2b2b68 356 Label::CENTER, Font16);
kenjiArai 0:52c5dc2b2b68 357 Label obj11(240, 20, " created on Nov. 2016 by JH1PJL/Kenji Arai",
kenjiArai 0:52c5dc2b2b68 358 Label::CENTER);
kenjiArai 0:52c5dc2b2b68 359 Label obj12(240, 100, " Please wait to receive",
kenjiArai 0:52c5dc2b2b68 360 Label::CENTER, Font24, LCD_COLOR_LIGHTYELLOW);
kenjiArai 0:52c5dc2b2b68 361 Label obj13(240, 120, " GPS signal!! ",
kenjiArai 0:52c5dc2b2b68 362 Label::CENTER, Font24, LCD_COLOR_LIGHTYELLOW);
kenjiArai 0:52c5dc2b2b68 363 }
kenjiArai 0:52c5dc2b2b68 364
kenjiArai 0:52c5dc2b2b68 365 uint8_t mode_slect()
kenjiArai 0:52c5dc2b2b68 366 {
kenjiArai 0:52c5dc2b2b68 367 Label obj10(240, 2, "Set ""Operationg Mode""",
kenjiArai 0:52c5dc2b2b68 368 Label::CENTER, Font24, LCD_COLOR_LIGHTGREEN);
kenjiArai 0:52c5dc2b2b68 369 Label obj11(40, 30, open_msg[0], Label::LEFT);
kenjiArai 0:52c5dc2b2b68 370 Label obj12(40, 42, open_msg[1], Label::LEFT);
kenjiArai 0:52c5dc2b2b68 371 Label obj13(40, 54, open_msg[2], Label::LEFT);
kenjiArai 0:52c5dc2b2b68 372 Label obj14(40, 66, open_msg[3], Label::LEFT);
kenjiArai 0:52c5dc2b2b68 373 Label obj15(40, 78, open_msg[4], Label::LEFT);
kenjiArai 0:52c5dc2b2b68 374 const int NUMBER_BUTTONS = 5;
kenjiArai 0:52c5dc2b2b68 375 const string STR1[NUMBER_BUTTONS] =
kenjiArai 0:52c5dc2b2b68 376 {"1) Nor(AC)", "2) Rec(AC)", "3) Rec(DC)", "4) 1/10","5) 1/20"};
kenjiArai 0:52c5dc2b2b68 377 ButtonGroup bGroup1(18, 120, 85, 40, NUMBER_BUTTONS, STR1, 5, 5, 5, 5,
kenjiArai 0:52c5dc2b2b68 378 Font12, LCD_COLOR_WHITE, 0xFF003538, 0xFFB70068, 0xFFFF7FFF);
kenjiArai 0:52c5dc2b2b68 379 NumericLabel<int> bTouch(50, 240, "",
kenjiArai 0:52c5dc2b2b68 380 Label::LEFT, Font24, LCD_COLOR_ORANGE);
kenjiArai 0:52c5dc2b2b68 381 Button button1(300, 170, 100, 50, "ENTER", Font16);
kenjiArai 0:52c5dc2b2b68 382 while (true)
kenjiArai 0:52c5dc2b2b68 383 {
kenjiArai 0:52c5dc2b2b68 384 int num;
kenjiArai 0:52c5dc2b2b68 385 if (bGroup1.GetTouchedNumber(num)){
kenjiArai 0:52c5dc2b2b68 386 char buf[32];
kenjiArai 0:52c5dc2b2b68 387 strcpy(buf, select_msg[num]);
kenjiArai 0:52c5dc2b2b68 388 bTouch.Draw(buf, num);
kenjiArai 0:52c5dc2b2b68 389 }
kenjiArai 0:52c5dc2b2b68 390 if (button1.Touched()){
kenjiArai 0:52c5dc2b2b68 391 return (uint8_t)(num + 1);
kenjiArai 0:52c5dc2b2b68 392 }
kenjiArai 0:52c5dc2b2b68 393 wait(0.02f);
kenjiArai 0:52c5dc2b2b68 394 }
kenjiArai 0:52c5dc2b2b68 395 }
kenjiArai 0:52c5dc2b2b68 396
kenjiArai 0:52c5dc2b2b68 397
kenjiArai 0:52c5dc2b2b68 398 //------------------------------------------------------------------------------
kenjiArai 0:52c5dc2b2b68 399 // ORIGINAL PROGRAM FOR F746_GUI_DEMO
kenjiArai 0:52c5dc2b2b68 400 // by MIKAMI, Naoki
kenjiArai 0:52c5dc2b2b68 401 // 2016/11/12, Copyright (c) 2016 MIKAMI, Naoki
kenjiArai 0:52c5dc2b2b68 402 //------------------------------------------------------------------------------
kenjiArai 0:52c5dc2b2b68 403 #if 0
kenjiArai 0:52c5dc2b2b68 404 //-----------------------------------------------------------------------
kenjiArai 0:52c5dc2b2b68 405 // GuiBase とその派生クラスのデモプログラム
kenjiArai 0:52c5dc2b2b68 406 // Demo program for GuiBase class and its derivertive classes
kenjiArai 0:52c5dc2b2b68 407 //
kenjiArai 0:52c5dc2b2b68 408 // GuiBase, Button, ButtonGroup, Label, NumericLabel, BlinkLabel,
kenjiArai 0:52c5dc2b2b68 409 // SeekBar, SeekbarGroup
kenjiArai 0:52c5dc2b2b68 410 //
kenjiArai 0:52c5dc2b2b68 411 // 2016/11/12, Copyright (c) 2016 MIKAMI, Naoki
kenjiArai 0:52c5dc2b2b68 412 //-----------------------------------------------------------------------
kenjiArai 0:52c5dc2b2b68 413
kenjiArai 0:52c5dc2b2b68 414 #include "F746_GUI.hpp"
kenjiArai 0:52c5dc2b2b68 415
kenjiArai 0:52c5dc2b2b68 416 int main()
kenjiArai 0:52c5dc2b2b68 417 {
kenjiArai 0:52c5dc2b2b68 418 Label obj10(240, 2, "Dome: GUI parts, 2016/07/30, 19:43", Label::CENTER, Font16);
kenjiArai 0:52c5dc2b2b68 419 Label obj11(240, 20, "Button, ButtonGroup, Label, NumericLabel, BlinkLabel,",
kenjiArai 0:52c5dc2b2b68 420 Label::CENTER);
kenjiArai 0:52c5dc2b2b68 421 Label obj12(240, 32, "SeekBar, SeekbarGroup",
kenjiArai 0:52c5dc2b2b68 422 Label::CENTER);
kenjiArai 0:52c5dc2b2b68 423
kenjiArai 0:52c5dc2b2b68 424 Button button1(10, 54, 50, 40, "1");
kenjiArai 0:52c5dc2b2b68 425 Button button2(62, 54, 50, 40, "2");
kenjiArai 0:52c5dc2b2b68 426
kenjiArai 0:52c5dc2b2b68 427 const int NUMBER_BUTTONS = 4;
kenjiArai 0:52c5dc2b2b68 428 const string STR1[NUMBER_BUTTONS] = {"Button1", "Button2", "Button3", "Activate"};
kenjiArai 0:52c5dc2b2b68 429 ButtonGroup bGroup1(160, 54, 66, 40, NUMBER_BUTTONS, STR1, 5, 5, 3, 1,
kenjiArai 0:52c5dc2b2b68 430 Font12, LCD_COLOR_WHITE, 0xFF003538, 0xFFB70068, 0xFFFF7FFF);
kenjiArai 0:52c5dc2b2b68 431 NumericLabel<int> bTouch(240, 112, "", Label::LEFT, Font12, LCD_COLOR_MAGENTA);
kenjiArai 0:52c5dc2b2b68 432
kenjiArai 0:52c5dc2b2b68 433 // Control status of bGroup1
kenjiArai 0:52c5dc2b2b68 434 ButtonGroup bGroup2(160, 150, 66, 40, 3, (string[]){"0", "1", "2"}, 5, 5, 3);
kenjiArai 0:52c5dc2b2b68 435 bGroup2.InactivateAll();
kenjiArai 0:52c5dc2b2b68 436
kenjiArai 0:52c5dc2b2b68 437 // Switching buttons to control barH active or inactive
kenjiArai 0:52c5dc2b2b68 438 ButtonGroup bGroup3(10, 150, 66, 40, 2, (string[]){"ON", "OFF"}, 0, 0, 2);
kenjiArai 0:52c5dc2b2b68 439 bGroup3.TouchedColor(0);
kenjiArai 0:52c5dc2b2b68 440
kenjiArai 0:52c5dc2b2b68 441 Button doNotTouch(250, 220, 120, 40, "Don't Touch", Font12,
kenjiArai 0:52c5dc2b2b68 442 GuiBase::ENUM_TEXT, GuiBase::ENUM_BACK,
kenjiArai 0:52c5dc2b2b68 443 LCD_COLOR_DARKGREEN, LCD_COLOR_RED);
kenjiArai 0:52c5dc2b2b68 444
kenjiArai 0:52c5dc2b2b68 445 // Using default value for argument (Horizontal)
kenjiArai 0:52c5dc2b2b68 446 SeekBar barH(20, 250, 200, -5, 5, 0, "-5", "", "5");
kenjiArai 0:52c5dc2b2b68 447 NumericLabel<float> numLabel1(80, 205, "%5.1f", barH.GetValue());
kenjiArai 0:52c5dc2b2b68 448 NumericLabel<int> numLabel2(130, 205, "%3d", (int)barH.GetValue());
kenjiArai 0:52c5dc2b2b68 449 NumericLabel<int> numLabel3(160, 205, "%3d");
kenjiArai 0:52c5dc2b2b68 450
kenjiArai 0:52c5dc2b2b68 451 // SeekbarGroup (vertical)
kenjiArai 0:52c5dc2b2b68 452 SeekbarGroup barV(410, 130, 121, 2, 45, -6, 6, 2,
kenjiArai 0:52c5dc2b2b68 453 SeekBar::Vertical, 0xFFA0FFC0);
kenjiArai 0:52c5dc2b2b68 454 NumericLabel<float> **numLabel4;
kenjiArai 0:52c5dc2b2b68 455 numLabel4 = new NumericLabel<float> *[2];
kenjiArai 0:52c5dc2b2b68 456 for (int n=0; n<2; n++) numLabel4[n] =
kenjiArai 0:52c5dc2b2b68 457 new NumericLabel<float>(410+n*45, 104, "%4.1f", barV.GetValue(n), Label::CENTER);
kenjiArai 0:52c5dc2b2b68 458 NumericLabel<int> numLabel5(455, 92, "%1d", barV.GetIntValue(0), Label::CENTER);
kenjiArai 0:52c5dc2b2b68 459
kenjiArai 0:52c5dc2b2b68 460 // Test of left-, cenrer-, and right-justified
kenjiArai 0:52c5dc2b2b68 461 Label leftJustified(420, 54, "ABC", Label::LEFT);
kenjiArai 0:52c5dc2b2b68 462 Label centerJustified(420, 64, "ABC", Label::CENTER);
kenjiArai 0:52c5dc2b2b68 463 Label rightJustified1(420, 74, "ABC", Label::RIGHT);
kenjiArai 0:52c5dc2b2b68 464
kenjiArai 0:52c5dc2b2b68 465 while (true)
kenjiArai 0:52c5dc2b2b68 466 {
kenjiArai 0:52c5dc2b2b68 467 if (button1.Touched()) button2.Draw();
kenjiArai 0:52c5dc2b2b68 468 if (button2.Touched()) button1.Draw();
kenjiArai 0:52c5dc2b2b68 469
kenjiArai 0:52c5dc2b2b68 470 int num;
kenjiArai 0:52c5dc2b2b68 471 if (bGroup1.GetTouchedNumber(num))
kenjiArai 0:52c5dc2b2b68 472 bTouch.Draw("Button%d touched", num+1);
kenjiArai 0:52c5dc2b2b68 473 if (num == 3)
kenjiArai 0:52c5dc2b2b68 474 bGroup2.ActivateAll();
kenjiArai 0:52c5dc2b2b68 475
kenjiArai 0:52c5dc2b2b68 476 if (bGroup2.GetTouchedNumber(num))
kenjiArai 0:52c5dc2b2b68 477 switch (num)
kenjiArai 0:52c5dc2b2b68 478 {
kenjiArai 0:52c5dc2b2b68 479 case 0: button1.Activate();
kenjiArai 0:52c5dc2b2b68 480 bGroup1.Activate(1);
kenjiArai 0:52c5dc2b2b68 481 bGroup1.DrawAll();
kenjiArai 0:52c5dc2b2b68 482 break;
kenjiArai 0:52c5dc2b2b68 483 case 1: button1.Inactivate();
kenjiArai 0:52c5dc2b2b68 484 bGroup1.Inactivate(1);
kenjiArai 0:52c5dc2b2b68 485 break;
kenjiArai 0:52c5dc2b2b68 486 case 2: bGroup1.EraseAll();//for (int n=0; n<4; n++) bGroup1.Erase(n);
kenjiArai 0:52c5dc2b2b68 487 for (int n=0; n<2; n++)
kenjiArai 0:52c5dc2b2b68 488 {
kenjiArai 0:52c5dc2b2b68 489 barV.Draw(n, 0); // reset seekbar
kenjiArai 0:52c5dc2b2b68 490 numLabel4[n]->Draw("%4.1f", barV.GetValue(n));
kenjiArai 0:52c5dc2b2b68 491 }
kenjiArai 0:52c5dc2b2b68 492 break;
kenjiArai 0:52c5dc2b2b68 493 }
kenjiArai 0:52c5dc2b2b68 494
kenjiArai 0:52c5dc2b2b68 495 if (barH.Slide())
kenjiArai 0:52c5dc2b2b68 496 {
kenjiArai 0:52c5dc2b2b68 497 numLabel1.Draw("%5.1f", barH.GetValue());
kenjiArai 0:52c5dc2b2b68 498 int8_t x = (int8_t)barH.GetValue();
kenjiArai 0:52c5dc2b2b68 499 numLabel2.Draw("%3d", x);
kenjiArai 0:52c5dc2b2b68 500
kenjiArai 0:52c5dc2b2b68 501 numLabel3.Draw(barH.GetIntValue());
kenjiArai 0:52c5dc2b2b68 502 }
kenjiArai 0:52c5dc2b2b68 503
kenjiArai 0:52c5dc2b2b68 504 int sbNum;
kenjiArai 0:52c5dc2b2b68 505 if (barV.GetSlidedNumber(sbNum))
kenjiArai 0:52c5dc2b2b68 506 {
kenjiArai 0:52c5dc2b2b68 507 if (sbNum == 0) numLabel4[sbNum]->Draw("%4.1f", barV.GetValue(sbNum));
kenjiArai 0:52c5dc2b2b68 508 else numLabel4[sbNum]->Draw("%4.1f", barV.GetValue(sbNum));
kenjiArai 0:52c5dc2b2b68 509 if (sbNum == 1) numLabel5.Draw("%1d", barV.GetIntValue(sbNum));
kenjiArai 0:52c5dc2b2b68 510 }
kenjiArai 0:52c5dc2b2b68 511 // If "doNotTouch" button touched, trapped into endless loop
kenjiArai 0:52c5dc2b2b68 512 if (doNotTouch.Touched())
kenjiArai 0:52c5dc2b2b68 513 BlinkLabel warning(250, 200, "You must reset", Label::LEFT, Font16);
kenjiArai 0:52c5dc2b2b68 514
kenjiArai 0:52c5dc2b2b68 515 // SeekBar active inactive switching
kenjiArai 0:52c5dc2b2b68 516 if (bGroup3.Touched(0))
kenjiArai 0:52c5dc2b2b68 517 {
kenjiArai 0:52c5dc2b2b68 518 barH.Activate();
kenjiArai 0:52c5dc2b2b68 519 barV.ActivateAll();
kenjiArai 0:52c5dc2b2b68 520 }
kenjiArai 0:52c5dc2b2b68 521 if (bGroup3.Touched(1))
kenjiArai 0:52c5dc2b2b68 522 {
kenjiArai 0:52c5dc2b2b68 523 barH.Inactivate();
kenjiArai 0:52c5dc2b2b68 524 barV.InactivateAll();
kenjiArai 0:52c5dc2b2b68 525 }
kenjiArai 0:52c5dc2b2b68 526
kenjiArai 0:52c5dc2b2b68 527 wait(0.02f);
kenjiArai 0:52c5dc2b2b68 528 }
kenjiArai 0:52c5dc2b2b68 529 }
kenjiArai 0:52c5dc2b2b68 530
kenjiArai 0:52c5dc2b2b68 531 #endif
kenjiArai 0:52c5dc2b2b68 532