Kenji Arai / Mbed OS Frequency_Cntr_1PPS_F746ZG

Dependencies:   QEI DRV8830 PID ADT7410 TextLCD Frq_cuntr_Nucleo-F746ZG RingBuffer

Fork of Frequency_Counter_w_GPS_1PPS by Kenji Arai

Committer:
kenjiArai
Date:
Wed Nov 23 07:35:20 2016 +0000
Revision:
13:1041596c416c
Child:
14:ba6ea409ab05
Frequency counter using GPS 1PPS signal and temperature controlled 50MHz Base clock. Ported from F411 Frequency Counter.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 13:1041596c416c 1 /*
kenjiArai 13:1041596c416c 2 * mbed Application program / HARDWARE TEST mode program
kenjiArai 13:1041596c416c 3 *
kenjiArai 13:1041596c416c 4 * Copyright (c) 2016 Kenji Arai / JH1PJL
kenjiArai 13:1041596c416c 5 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 13:1041596c416c 6 * http://mbed.org/users/kenjiArai/
kenjiArai 13:1041596c416c 7 * Created: Novemeber 8th, 2016
kenjiArai 13:1041596c416c 8 * Revised: Novemeber 23rd, 2016
kenjiArai 13:1041596c416c 9 *
kenjiArai 13:1041596c416c 10 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
kenjiArai 13:1041596c416c 11 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
kenjiArai 13:1041596c416c 12 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
kenjiArai 13:1041596c416c 13 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
kenjiArai 13:1041596c416c 14 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
kenjiArai 13:1041596c416c 15 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
kenjiArai 13:1041596c416c 16 * THE USE OR OTHER DEALINGS IN THE SOFTWARE.
kenjiArai 13:1041596c416c 17 */
kenjiArai 13:1041596c416c 18
kenjiArai 13:1041596c416c 19 // Include --------------------------------------------------------------------
kenjiArai 13:1041596c416c 20
kenjiArai 13:1041596c416c 21 // Definition -----------------------------------------------------------------
kenjiArai 13:1041596c416c 22 #define GETC(x) pc.getc(x)
kenjiArai 13:1041596c416c 23 #define PUTC(x) pc.putc(x)
kenjiArai 13:1041596c416c 24 #define PRINTF(...) pc.printf(__VA_ARGS__)
kenjiArai 13:1041596c416c 25 #define READABLE(x) pc.readable(x)
kenjiArai 13:1041596c416c 26
kenjiArai 13:1041596c416c 27 // Object ---------------------------------------------------------------------
kenjiArai 13:1041596c416c 28 extern Serial pc;
kenjiArai 13:1041596c416c 29 extern Serial gps;
kenjiArai 13:1041596c416c 30 extern DigitalIn gps_rx;
kenjiArai 13:1041596c416c 31 extern Ticker irq_action;
kenjiArai 13:1041596c416c 32 extern DigitalOut led_R_gps1pps;
kenjiArai 13:1041596c416c 33 extern DigitalOut led_G_temp_ok;
kenjiArai 13:1041596c416c 34 extern DigitalOut led_B_recipro;
kenjiArai 13:1041596c416c 35 extern DigitalOut led_W_prescaler;
kenjiArai 13:1041596c416c 36 extern DigitalOut led_R_rotary;
kenjiArai 13:1041596c416c 37 extern DigitalOut led_G_rotary;
kenjiArai 13:1041596c416c 38 extern DigitalOut led_B_rotary;
kenjiArai 13:1041596c416c 39 extern TextLCD lcd;
kenjiArai 13:1041596c416c 40
kenjiArai 13:1041596c416c 41 // RAM ------------------------------------------------------------------------
kenjiArai 13:1041596c416c 42 char linebuf[64];
kenjiArai 13:1041596c416c 43 int buf_size = sizeof(linebuf);
kenjiArai 13:1041596c416c 44
kenjiArai 13:1041596c416c 45 // Function prototypes --------------------------------------------------------
kenjiArai 13:1041596c416c 46 extern int iGPS_getc(void);
kenjiArai 13:1041596c416c 47 extern double read_temperature(uint8_t n);
kenjiArai 13:1041596c416c 48 extern void temp_control(void const *args);
kenjiArai 13:1041596c416c 49 extern void select_input_div_1or10or20(uint8_t mode);
kenjiArai 13:1041596c416c 50
kenjiArai 13:1041596c416c 51 void msg_hlp(void);
kenjiArai 13:1041596c416c 52 void put_rn(void);
kenjiArai 13:1041596c416c 53 void put_r(void);
kenjiArai 13:1041596c416c 54 void put_lin(void);
kenjiArai 13:1041596c416c 55 void put_spc(uint8_t n);
kenjiArai 13:1041596c416c 56 int xatoi(char **str, int32_t *res);
kenjiArai 13:1041596c416c 57 void get_line(char *buff, int len);
kenjiArai 13:1041596c416c 58
kenjiArai 13:1041596c416c 59 // ROM / Constant data --------------------------------------------------------
kenjiArai 13:1041596c416c 60 char *const test_msg0 = "F746ZG Frequency Counter Hardware Test on mbed";
kenjiArai 13:1041596c416c 61 char *const test_msg1 = " system, created on UTC: "__DATE__"("__TIME__")";
kenjiArai 13:1041596c416c 62
kenjiArai 13:1041596c416c 63 //------------------------------------------------------------------------------
kenjiArai 13:1041596c416c 64 // Control Program
kenjiArai 13:1041596c416c 65 //------------------------------------------------------------------------------
kenjiArai 13:1041596c416c 66 void hardware_test(void)
kenjiArai 13:1041596c416c 67 {
kenjiArai 13:1041596c416c 68 char *ptr;
kenjiArai 13:1041596c416c 69 char c;
kenjiArai 13:1041596c416c 70 uint32_t n;
kenjiArai 13:1041596c416c 71
kenjiArai 13:1041596c416c 72 put_rn();
kenjiArai 13:1041596c416c 73 put_rn();
kenjiArai 13:1041596c416c 74 msg_hlp();
kenjiArai 13:1041596c416c 75 for (;;) {
kenjiArai 13:1041596c416c 76 put_r();
kenjiArai 13:1041596c416c 77 PUTC('>');
kenjiArai 13:1041596c416c 78 ptr = linebuf;
kenjiArai 13:1041596c416c 79 get_line(ptr, sizeof(linebuf));
kenjiArai 13:1041596c416c 80 switch (*ptr++) {
kenjiArai 13:1041596c416c 81 //------------------------------------------------------------------
kenjiArai 13:1041596c416c 82 // LED
kenjiArai 13:1041596c416c 83 //------------------------------------------------------------------
kenjiArai 13:1041596c416c 84 case 'l' :
kenjiArai 13:1041596c416c 85 put_r();
kenjiArai 13:1041596c416c 86 PRINTF("If you want to stop, please het any key.");
kenjiArai 13:1041596c416c 87 put_rn();
kenjiArai 13:1041596c416c 88 while (true){
kenjiArai 13:1041596c416c 89 led_R_gps1pps = 1;
kenjiArai 13:1041596c416c 90 wait(0.4);
kenjiArai 13:1041596c416c 91 led_R_gps1pps = 0;
kenjiArai 13:1041596c416c 92 led_G_temp_ok = 1;
kenjiArai 13:1041596c416c 93 wait(0.4);
kenjiArai 13:1041596c416c 94 led_G_temp_ok = 0;
kenjiArai 13:1041596c416c 95 led_B_recipro = 1;
kenjiArai 13:1041596c416c 96 wait(0.4);
kenjiArai 13:1041596c416c 97 led_B_recipro = 0;
kenjiArai 13:1041596c416c 98 led_W_prescaler = 1;
kenjiArai 13:1041596c416c 99 wait(0.4);
kenjiArai 13:1041596c416c 100 led_W_prescaler = 0;
kenjiArai 13:1041596c416c 101 led_R_rotary = 1;
kenjiArai 13:1041596c416c 102 wait(0.4);
kenjiArai 13:1041596c416c 103 led_R_rotary = 0;
kenjiArai 13:1041596c416c 104 led_G_rotary = 1;
kenjiArai 13:1041596c416c 105 wait(0.4);
kenjiArai 13:1041596c416c 106 led_G_rotary = 0;
kenjiArai 13:1041596c416c 107 led_B_rotary = 1;
kenjiArai 13:1041596c416c 108 wait(0.4);
kenjiArai 13:1041596c416c 109 led_B_rotary = 0;
kenjiArai 13:1041596c416c 110 if (READABLE()){ break;}
kenjiArai 13:1041596c416c 111 }
kenjiArai 13:1041596c416c 112 c = GETC(); // read as dummy
kenjiArai 13:1041596c416c 113 put_r();
kenjiArai 13:1041596c416c 114 break;
kenjiArai 13:1041596c416c 115 //------------------------------------------------------------------
kenjiArai 13:1041596c416c 116 // LCD Display
kenjiArai 13:1041596c416c 117 //------------------------------------------------------------------
kenjiArai 13:1041596c416c 118 case 'd' :
kenjiArai 13:1041596c416c 119 put_r();
kenjiArai 13:1041596c416c 120 lcd.locate(0, 0);
kenjiArai 13:1041596c416c 121 for(char i = 'z';'*' < i; i--){
kenjiArai 13:1041596c416c 122 lcd.putc(i);
kenjiArai 13:1041596c416c 123 }
kenjiArai 13:1041596c416c 124 lcd.locate(0, 0);
kenjiArai 13:1041596c416c 125 wait(2.0);
kenjiArai 13:1041596c416c 126 for(char i = '.';'~' > i; i++){
kenjiArai 13:1041596c416c 127 lcd.putc(i);
kenjiArai 13:1041596c416c 128 }
kenjiArai 13:1041596c416c 129 PRINTF("Please adjust Contrast Volue.");
kenjiArai 13:1041596c416c 130 put_rn();
kenjiArai 13:1041596c416c 131 PRINTF("Hit any key to clear screan.");
kenjiArai 13:1041596c416c 132 put_rn();
kenjiArai 13:1041596c416c 133 while (READABLE()){;}
kenjiArai 13:1041596c416c 134 c = GETC(); // read as dummy
kenjiArai 13:1041596c416c 135 lcd.locate(0, 0);
kenjiArai 13:1041596c416c 136 for (uint8_t x =0 ;100 > x; x++){
kenjiArai 13:1041596c416c 137 lcd.putc(' ');
kenjiArai 13:1041596c416c 138 }
kenjiArai 13:1041596c416c 139 break;
kenjiArai 13:1041596c416c 140 //------------------------------------------------------------------
kenjiArai 13:1041596c416c 141 // Frequency
kenjiArai 13:1041596c416c 142 //------------------------------------------------------------------
kenjiArai 13:1041596c416c 143 case 'f' :
kenjiArai 13:1041596c416c 144 put_r();
kenjiArai 13:1041596c416c 145 select_input_div_1or10or20(0);
kenjiArai 13:1041596c416c 146 PRINTF("50MHz Clock for Timer2:");
kenjiArai 13:1041596c416c 147 PRINTF(" Input clock for Timer8+4:");
kenjiArai 13:1041596c416c 148 put_rn();
kenjiArai 13:1041596c416c 149 while (true){
kenjiArai 13:1041596c416c 150 n = fc.read_base_clock_frequency(1.0f);
kenjiArai 13:1041596c416c 151 PRINTF(" %u ", n);
kenjiArai 13:1041596c416c 152 n = fc.read_input_frequency(1.0f);
kenjiArai 13:1041596c416c 153 PRINTF("%u", n);
kenjiArai 13:1041596c416c 154 put_rn();
kenjiArai 13:1041596c416c 155 if (READABLE()){ break;}
kenjiArai 13:1041596c416c 156 }
kenjiArai 13:1041596c416c 157 c = GETC(); // read as dummy
kenjiArai 13:1041596c416c 158 break;
kenjiArai 13:1041596c416c 159 //------------------------------------------------------------------
kenjiArai 13:1041596c416c 160 // Input select
kenjiArai 13:1041596c416c 161 //------------------------------------------------------------------
kenjiArai 13:1041596c416c 162 case 'i' :
kenjiArai 13:1041596c416c 163 put_r();
kenjiArai 13:1041596c416c 164 select_input_div_1or10or20(0);
kenjiArai 13:1041596c416c 165 PRINTF("Start BNC connecter input (none-prescaler)");
kenjiArai 13:1041596c416c 166 put_rn();
kenjiArai 13:1041596c416c 167 PRINTF("Input freq. (data is not accurate enough");
kenjiArai 13:1041596c416c 168 put_rn();
kenjiArai 13:1041596c416c 169 PRINTF("Hit any key to go next input");
kenjiArai 13:1041596c416c 170 put_rn();
kenjiArai 13:1041596c416c 171 while (true){
kenjiArai 13:1041596c416c 172 n = fc.read_input_frequency(1.0f);
kenjiArai 13:1041596c416c 173 PRINTF("f = %u [Hz]", n);
kenjiArai 13:1041596c416c 174 put_rn();
kenjiArai 13:1041596c416c 175 if (READABLE()){ break;}
kenjiArai 13:1041596c416c 176 }
kenjiArai 13:1041596c416c 177 c = GETC(); // read as dummy
kenjiArai 13:1041596c416c 178 select_input_div_1or10or20(1);
kenjiArai 13:1041596c416c 179 PRINTF("Start SMA connecter input (prescaler 1/10)");
kenjiArai 13:1041596c416c 180 put_rn();
kenjiArai 13:1041596c416c 181 PRINTF("Hit any key to go next input");
kenjiArai 13:1041596c416c 182 put_rn();
kenjiArai 13:1041596c416c 183 while (true){
kenjiArai 13:1041596c416c 184 n = fc.read_input_frequency(1.0f);
kenjiArai 13:1041596c416c 185 PRINTF("f = %u [Hz] x 10 = (your expected freq.)", n);
kenjiArai 13:1041596c416c 186 put_rn();
kenjiArai 13:1041596c416c 187 if (READABLE()){ break;}
kenjiArai 13:1041596c416c 188 }
kenjiArai 13:1041596c416c 189 c = GETC(); // read as dummy
kenjiArai 13:1041596c416c 190 select_input_div_1or10or20(2);
kenjiArai 13:1041596c416c 191 PRINTF("Start SMA connecter input (prescaler 1/20)");
kenjiArai 13:1041596c416c 192 put_rn();
kenjiArai 13:1041596c416c 193 PRINTF("Hit any key to go next input");
kenjiArai 13:1041596c416c 194 put_rn();
kenjiArai 13:1041596c416c 195 while (true){
kenjiArai 13:1041596c416c 196 n = fc.read_input_frequency(1.0f);
kenjiArai 13:1041596c416c 197 PRINTF("f = %u [Hz] x 20 = (your expected freq.)", n);
kenjiArai 13:1041596c416c 198 put_rn();
kenjiArai 13:1041596c416c 199 if (READABLE()){ break;}
kenjiArai 13:1041596c416c 200 }
kenjiArai 13:1041596c416c 201 c = GETC(); // read as dummy
kenjiArai 13:1041596c416c 202 break;
kenjiArai 13:1041596c416c 203 //------------------------------------------------------------------
kenjiArai 13:1041596c416c 204 // GPS signal
kenjiArai 13:1041596c416c 205 //------------------------------------------------------------------
kenjiArai 13:1041596c416c 206 case 'g' :
kenjiArai 13:1041596c416c 207 put_r();
kenjiArai 13:1041596c416c 208 PRINTF("Start GPS checking.");
kenjiArai 13:1041596c416c 209 put_rn();
kenjiArai 13:1041596c416c 210 PRINTF("If you want to stop, please het any key");
kenjiArai 13:1041596c416c 211 put_rn();
kenjiArai 13:1041596c416c 212 // Wait long interval (every 1sec)
kenjiArai 13:1041596c416c 213 for (uint32_t i = 0; i < 100000; i++){
kenjiArai 13:1041596c416c 214 if (gps_rx == 0){
kenjiArai 13:1041596c416c 215 i = 0;
kenjiArai 13:1041596c416c 216 }
kenjiArai 13:1041596c416c 217 }
kenjiArai 13:1041596c416c 218 // Clear PD_2 GPS RX line errors(over run)
kenjiArai 13:1041596c416c 219 CLEAR_PD_2_RX_LINE();
kenjiArai 13:1041596c416c 220 n = 0;
kenjiArai 13:1041596c416c 221 while (true){
kenjiArai 13:1041596c416c 222 pc.putc(gps.getc());
kenjiArai 13:1041596c416c 223 led_R_gps1pps = !led_R_gps1pps;
kenjiArai 13:1041596c416c 224 if (!(++n % 100)){
kenjiArai 13:1041596c416c 225 led_R_gps1pps = !led_R_gps1pps;
kenjiArai 13:1041596c416c 226 }
kenjiArai 13:1041596c416c 227 if (READABLE()){ break;}
kenjiArai 13:1041596c416c 228 }
kenjiArai 13:1041596c416c 229 c = GETC(); // read as dummy
kenjiArai 13:1041596c416c 230 led_R_gps1pps = 0;
kenjiArai 13:1041596c416c 231 put_rn();
kenjiArai 13:1041596c416c 232 PRINTF("Finish GPS part.\r\n");
kenjiArai 13:1041596c416c 233 break;
kenjiArai 13:1041596c416c 234 //------------------------------------------------------------------
kenjiArai 13:1041596c416c 235 // Temperature
kenjiArai 13:1041596c416c 236 //------------------------------------------------------------------
kenjiArai 13:1041596c416c 237 case 't' :
kenjiArai 13:1041596c416c 238 put_r();
kenjiArai 13:1041596c416c 239 read_temperature(0);
kenjiArai 13:1041596c416c 240 while (true){
kenjiArai 13:1041596c416c 241 PRINTF("Temperature: %+6.3f", read_temperature(1));
kenjiArai 13:1041596c416c 242 put_rn();
kenjiArai 13:1041596c416c 243 if (READABLE()){ break;}
kenjiArai 13:1041596c416c 244 wait(1.0);
kenjiArai 13:1041596c416c 245 }
kenjiArai 13:1041596c416c 246 c = GETC(); // read as dummy
kenjiArai 13:1041596c416c 247 break;
kenjiArai 13:1041596c416c 248 //------------------------------------------------------------------
kenjiArai 13:1041596c416c 249 // Special command defined by you
kenjiArai 13:1041596c416c 250 //------------------------------------------------------------------
kenjiArai 13:1041596c416c 251 case 'x' :
kenjiArai 13:1041596c416c 252 while (true){
kenjiArai 13:1041596c416c 253
kenjiArai 13:1041596c416c 254 put_rn();
kenjiArai 13:1041596c416c 255 if (READABLE()){ break;}
kenjiArai 13:1041596c416c 256 wait(1.0);
kenjiArai 13:1041596c416c 257 }
kenjiArai 13:1041596c416c 258 c = GETC(); // read as dummy
kenjiArai 13:1041596c416c 259 break;
kenjiArai 13:1041596c416c 260 //------------------------------------------------------------------
kenjiArai 13:1041596c416c 261 // Oven Temperature Control
kenjiArai 13:1041596c416c 262 //------------------------------------------------------------------
kenjiArai 13:1041596c416c 263 case 'o' :
kenjiArai 13:1041596c416c 264 put_r();
kenjiArai 13:1041596c416c 265 PRINTF("Please check Temp. sensor ('t' comand )");
kenjiArai 13:1041596c416c 266 PRINTF(" before enter this test.");
kenjiArai 13:1041596c416c 267 put_rn();
kenjiArai 13:1041596c416c 268 PRINTF("Are you sure? Yes, the enter 'y'.");
kenjiArai 13:1041596c416c 269 put_rn();
kenjiArai 13:1041596c416c 270 c = GETC();
kenjiArai 13:1041596c416c 271 if (c != 'y'){ break;}
kenjiArai 13:1041596c416c 272 PRINTF("If you want to exit, please enter ALT+B.");
kenjiArai 13:1041596c416c 273 put_rn();
kenjiArai 13:1041596c416c 274 temp_control(NULL);
kenjiArai 13:1041596c416c 275 break;
kenjiArai 13:1041596c416c 276 //------------------------------------------------------------------
kenjiArai 13:1041596c416c 277 // help
kenjiArai 13:1041596c416c 278 //------------------------------------------------------------------
kenjiArai 13:1041596c416c 279 case '?' :
kenjiArai 13:1041596c416c 280 put_r();
kenjiArai 13:1041596c416c 281 msg_hlp();
kenjiArai 13:1041596c416c 282 break;
kenjiArai 13:1041596c416c 283 //------------------------------------------------------------------
kenjiArai 13:1041596c416c 284 // no support
kenjiArai 13:1041596c416c 285 //------------------------------------------------------------------
kenjiArai 13:1041596c416c 286 default:
kenjiArai 13:1041596c416c 287 put_r();
kenjiArai 13:1041596c416c 288 PUTC('?');
kenjiArai 13:1041596c416c 289 put_rn();
kenjiArai 13:1041596c416c 290 break;
kenjiArai 13:1041596c416c 291 }
kenjiArai 13:1041596c416c 292 }
kenjiArai 13:1041596c416c 293 }
kenjiArai 13:1041596c416c 294
kenjiArai 13:1041596c416c 295 void msg_hlp (void)
kenjiArai 13:1041596c416c 296 {
kenjiArai 13:1041596c416c 297 PRINTF(test_msg0);
kenjiArai 13:1041596c416c 298 PRINTF(test_msg1);
kenjiArai 13:1041596c416c 299 PRINTF(" [Help:'?']");
kenjiArai 13:1041596c416c 300 put_rn();
kenjiArai 13:1041596c416c 301 put_rn();
kenjiArai 13:1041596c416c 302 PRINTF("l - ChecK LED's");
kenjiArai 13:1041596c416c 303 put_rn();
kenjiArai 13:1041596c416c 304 PRINTF("d - Show display (on LCD)");
kenjiArai 13:1041596c416c 305 put_rn();
kenjiArai 13:1041596c416c 306 PRINTF("f - Check frequency Base:50MHz & Unknown Freq.");
kenjiArai 13:1041596c416c 307 put_rn();
kenjiArai 13:1041596c416c 308 PRINTF("i - Check Input select function");
kenjiArai 13:1041596c416c 309 put_rn();
kenjiArai 13:1041596c416c 310 PRINTF("g - Check GPS signal");
kenjiArai 13:1041596c416c 311 put_rn();
kenjiArai 13:1041596c416c 312 PRINTF("t - Check Temperature (I2C temp sensor)");
kenjiArai 13:1041596c416c 313 put_rn();
kenjiArai 13:1041596c416c 314 PRINTF("o - Run Oven Temperature Control");
kenjiArai 13:1041596c416c 315 put_rn();
kenjiArai 13:1041596c416c 316 PRINTF("return from 'o' mode, enter ALT+B then the system restart");
kenjiArai 13:1041596c416c 317 put_rn();
kenjiArai 13:1041596c416c 318 }
kenjiArai 13:1041596c416c 319
kenjiArai 13:1041596c416c 320 // Put \r\n
kenjiArai 13:1041596c416c 321 void put_rn ( void )
kenjiArai 13:1041596c416c 322 {
kenjiArai 13:1041596c416c 323 PUTC('\r');
kenjiArai 13:1041596c416c 324 PUTC('\n');
kenjiArai 13:1041596c416c 325 }
kenjiArai 13:1041596c416c 326
kenjiArai 13:1041596c416c 327 // Put \r
kenjiArai 13:1041596c416c 328 void put_r ( void )
kenjiArai 13:1041596c416c 329 {
kenjiArai 13:1041596c416c 330 PUTC('\r');
kenjiArai 13:1041596c416c 331 }
kenjiArai 13:1041596c416c 332
kenjiArai 13:1041596c416c 333 // Put ", "
kenjiArai 13:1041596c416c 334 void put_lin ( void )
kenjiArai 13:1041596c416c 335 {
kenjiArai 13:1041596c416c 336 PRINTF(", ");
kenjiArai 13:1041596c416c 337 }
kenjiArai 13:1041596c416c 338
kenjiArai 13:1041596c416c 339 // Put space n
kenjiArai 13:1041596c416c 340 void put_spc( uint8_t n)
kenjiArai 13:1041596c416c 341 {
kenjiArai 13:1041596c416c 342 for(; n > 0; n--) {
kenjiArai 13:1041596c416c 343 PUTC(' ');
kenjiArai 13:1041596c416c 344 }
kenjiArai 13:1041596c416c 345 }
kenjiArai 13:1041596c416c 346
kenjiArai 13:1041596c416c 347 // Change string -> integer
kenjiArai 13:1041596c416c 348 //int xatoi (char **str, unsigned long *res){
kenjiArai 13:1041596c416c 349 int xatoi (char **str, int32_t *res)
kenjiArai 13:1041596c416c 350 {
kenjiArai 13:1041596c416c 351 unsigned long val;
kenjiArai 13:1041596c416c 352 unsigned char c, radix, s = 0;
kenjiArai 13:1041596c416c 353
kenjiArai 13:1041596c416c 354 while ((c = **str) == ' ') (*str)++;
kenjiArai 13:1041596c416c 355 if (c == '-') {
kenjiArai 13:1041596c416c 356 s = 1;
kenjiArai 13:1041596c416c 357 c = *(++(*str));
kenjiArai 13:1041596c416c 358 }
kenjiArai 13:1041596c416c 359 if (c == '0') {
kenjiArai 13:1041596c416c 360 c = *(++(*str));
kenjiArai 13:1041596c416c 361 if (c <= ' ') {
kenjiArai 13:1041596c416c 362 *res = 0;
kenjiArai 13:1041596c416c 363 return 1;
kenjiArai 13:1041596c416c 364 }
kenjiArai 13:1041596c416c 365 if (c == 'x') {
kenjiArai 13:1041596c416c 366 radix = 16;
kenjiArai 13:1041596c416c 367 c = *(++(*str));
kenjiArai 13:1041596c416c 368 } else {
kenjiArai 13:1041596c416c 369 if (c == 'b') {
kenjiArai 13:1041596c416c 370 radix = 2;
kenjiArai 13:1041596c416c 371 c = *(++(*str));
kenjiArai 13:1041596c416c 372 } else {
kenjiArai 13:1041596c416c 373 if ((c >= '0')&&(c <= '9')) {
kenjiArai 13:1041596c416c 374 radix = 8;
kenjiArai 13:1041596c416c 375 } else {
kenjiArai 13:1041596c416c 376 return 0;
kenjiArai 13:1041596c416c 377 }
kenjiArai 13:1041596c416c 378 }
kenjiArai 13:1041596c416c 379 }
kenjiArai 13:1041596c416c 380 } else {
kenjiArai 13:1041596c416c 381 if ((c < '1')||(c > '9')) {
kenjiArai 13:1041596c416c 382 return 0;
kenjiArai 13:1041596c416c 383 }
kenjiArai 13:1041596c416c 384 radix = 10;
kenjiArai 13:1041596c416c 385 }
kenjiArai 13:1041596c416c 386 val = 0;
kenjiArai 13:1041596c416c 387 while (c > ' ') {
kenjiArai 13:1041596c416c 388 if (c >= 'a') c -= 0x20;
kenjiArai 13:1041596c416c 389 c -= '0';
kenjiArai 13:1041596c416c 390 if (c >= 17) {
kenjiArai 13:1041596c416c 391 c -= 7;
kenjiArai 13:1041596c416c 392 if (c <= 9) return 0;
kenjiArai 13:1041596c416c 393 }
kenjiArai 13:1041596c416c 394 if (c >= radix) return 0;
kenjiArai 13:1041596c416c 395 val = val * radix + c;
kenjiArai 13:1041596c416c 396 c = *(++(*str));
kenjiArai 13:1041596c416c 397 }
kenjiArai 13:1041596c416c 398 if (s) val = -val;
kenjiArai 13:1041596c416c 399 *res = val;
kenjiArai 13:1041596c416c 400 return 1;
kenjiArai 13:1041596c416c 401 }
kenjiArai 13:1041596c416c 402
kenjiArai 13:1041596c416c 403 // Get key input data
kenjiArai 13:1041596c416c 404 void get_line (char *buff, int len)
kenjiArai 13:1041596c416c 405 {
kenjiArai 13:1041596c416c 406 char c;
kenjiArai 13:1041596c416c 407 int idx = 0;
kenjiArai 13:1041596c416c 408
kenjiArai 13:1041596c416c 409 for (;;) {
kenjiArai 13:1041596c416c 410 c = GETC();
kenjiArai 13:1041596c416c 411 if (c == '\r') {
kenjiArai 13:1041596c416c 412 buff[idx++] = c;
kenjiArai 13:1041596c416c 413 break;
kenjiArai 13:1041596c416c 414 }
kenjiArai 13:1041596c416c 415 if ((c == '\b') && idx) {
kenjiArai 13:1041596c416c 416 idx--;
kenjiArai 13:1041596c416c 417 PUTC(c);
kenjiArai 13:1041596c416c 418 PUTC(' ');
kenjiArai 13:1041596c416c 419 PUTC(c);
kenjiArai 13:1041596c416c 420 }
kenjiArai 13:1041596c416c 421 if (((uint8_t)c >= ' ') && (idx < len - 1)) {
kenjiArai 13:1041596c416c 422 buff[idx++] = c;
kenjiArai 13:1041596c416c 423 PUTC(c);
kenjiArai 13:1041596c416c 424 }
kenjiArai 13:1041596c416c 425 }
kenjiArai 13:1041596c416c 426 buff[idx] = 0;
kenjiArai 13:1041596c416c 427 PUTC('\n');
kenjiArai 13:1041596c416c 428 }