Hackaday demo: Signal generator

Dependencies:   SDFileSystem mbed

Committer:
wd5gnr
Date:
Tue Sep 15 15:21:34 2015 +0000
Revision:
1:c229c3ceb909
Parent:
0:8baa10bd07de
Making sure all changes are ready for publication.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wd5gnr 0:8baa10bd07de 1 #include "mbed.h"
wd5gnr 0:8baa10bd07de 2 #define _EXTERN_ extern
wd5gnr 0:8baa10bd07de 3 #include "main.h"
wd5gnr 0:8baa10bd07de 4 #include "cio.h"
wd5gnr 0:8baa10bd07de 5 #include <cctype>
wd5gnr 0:8baa10bd07de 6
wd5gnr 0:8baa10bd07de 7 // Character I/O functions
wd5gnr 0:8baa10bd07de 8
wd5gnr 0:8baa10bd07de 9 // Get a character but handle backspace
wd5gnr 0:8baa10bd07de 10 // However, since we don't understand the start of a line
wd5gnr 0:8baa10bd07de 11 // Don't print backspaces
wd5gnr 0:8baa10bd07de 12 // Return is a non-zero character
wd5gnr 0:8baa10bd07de 13 int getachar(void)
wd5gnr 0:8baa10bd07de 14 {
wd5gnr 0:8baa10bd07de 15 int c=0;
wd5gnr 0:8baa10bd07de 16 while (!c) {
wd5gnr 0:8baa10bd07de 17 c=pc.getc();
wd5gnr 0:8baa10bd07de 18 if (c==0x7f) c=8; // backspace
wd5gnr 0:8baa10bd07de 19 if (c!=8) pc.putc(c);
wd5gnr 0:8baa10bd07de 20 if (c=='\n') c='\r';
wd5gnr 0:8baa10bd07de 21 }
wd5gnr 0:8baa10bd07de 22 return c;
wd5gnr 0:8baa10bd07de 23 }
wd5gnr 0:8baa10bd07de 24
wd5gnr 0:8baa10bd07de 25
wd5gnr 0:8baa10bd07de 26
wd5gnr 0:8baa10bd07de 27
wd5gnr 0:8baa10bd07de 28
wd5gnr 0:8baa10bd07de 29 // Get a token (number)
wd5gnr 0:8baa10bd07de 30 // basically we skip anything that doesn't look
wd5gnr 0:8baa10bd07de 31 // like a hex number (even in decimal mode)
wd5gnr 0:8baa10bd07de 32 // so we skip comma, quotes, etc. in CSV
wd5gnr 0:8baa10bd07de 33 // Return: -1 - Exit via Esc, Semicolon or CNTL_Z
wd5gnr 0:8baa10bd07de 34 // 0 - ok
wd5gnr 0:8baa10bd07de 35 // 1 - long token
wd5gnr 0:8baa10bd07de 36 // Odd input may cause odd results (for example floating point 1.2FF or something
wd5gnr 0:8baa10bd07de 37 int gettoken(int type)
wd5gnr 0:8baa10bd07de 38 {
wd5gnr 0:8baa10bd07de 39 int ip=0;
wd5gnr 0:8baa10bd07de 40 int c;
wd5gnr 0:8baa10bd07de 41 bool good;
wd5gnr 0:8baa10bd07de 42 do {
wd5gnr 0:8baa10bd07de 43 good=true;
wd5gnr 0:8baa10bd07de 44 c=getachar(); // get character
wd5gnr 0:8baa10bd07de 45 if (c==27 || c==';' || c==26) return -1; // escape, semicolon, or ^Z returns -1 (stop)
wd5gnr 0:8baa10bd07de 46 if (c==8 && ip!=0) {
wd5gnr 0:8baa10bd07de 47 ip--; // backspace not at first position
wd5gnr 0:8baa10bd07de 48 pc.putc(8);
wd5gnr 0:8baa10bd07de 49 pc.putc(' ');
wd5gnr 0:8baa10bd07de 50 pc.putc(8);
wd5gnr 0:8baa10bd07de 51 }
wd5gnr 0:8baa10bd07de 52 if (c==8) continue; // any backspace
wd5gnr 0:8baa10bd07de 53 if (type==NUM_DEC && (c=='x' || c=='X')) type=NUM_HEX; // decimal to hex if you see 0x
wd5gnr 0:8baa10bd07de 54
wd5gnr 0:8baa10bd07de 55 switch (type) {
wd5gnr 0:8baa10bd07de 56 case NUM_HEX:
wd5gnr 0:8baa10bd07de 57 good=isxdigit(c)||c=='x'||c=='X'; // hex digits (including 0x)
wd5gnr 0:8baa10bd07de 58 break;
wd5gnr 0:8baa10bd07de 59 case NUM_DEC:
wd5gnr 0:8baa10bd07de 60 good=isdigit(c); // decimal digits
wd5gnr 0:8baa10bd07de 61 break;
wd5gnr 0:8baa10bd07de 62 case NUM_FLT:
wd5gnr 0:8baa10bd07de 63 good=isdigit(c)||c=='.'||c=='-'||c=='e'||c=='E'; // simple floating point
wd5gnr 0:8baa10bd07de 64 break;
wd5gnr 0:8baa10bd07de 65 }
wd5gnr 0:8baa10bd07de 66 if (!good) { // illegal character?
wd5gnr 0:8baa10bd07de 67 if (ip) {
wd5gnr 0:8baa10bd07de 68 ibuf[ip]='\0'; // got something
wd5gnr 0:8baa10bd07de 69 return 0;
wd5gnr 0:8baa10bd07de 70 } else
wd5gnr 0:8baa10bd07de 71 continue; // just skip leading cruft
wd5gnr 0:8baa10bd07de 72 }
wd5gnr 0:8baa10bd07de 73 if (ip<sizeof(ibuf)-1) ibuf[ip++]=c; // accumulate
wd5gnr 0:8baa10bd07de 74 } while (1);
wd5gnr 0:8baa10bd07de 75 }
wd5gnr 0:8baa10bd07de 76
wd5gnr 0:8baa10bd07de 77
wd5gnr 0:8baa10bd07de 78 // Get a token and convert to a number
wd5gnr 0:8baa10bd07de 79 int getnum(unsigned int *v, int type)
wd5gnr 0:8baa10bd07de 80 {
wd5gnr 0:8baa10bd07de 81 int val, rc, forcehex=0;
wd5gnr 0:8baa10bd07de 82 if (gettoken(type)<0) return -1;
wd5gnr 0:8baa10bd07de 83 if (ibuf[0]=='0' && (ibuf[1]=='x' || ibuf[1]=='X')) {
wd5gnr 0:8baa10bd07de 84 forcehex=2;
wd5gnr 0:8baa10bd07de 85 type=0;
wd5gnr 0:8baa10bd07de 86 }
wd5gnr 0:8baa10bd07de 87 // Get number from input buffer (forcehex skips 0x)
wd5gnr 0:8baa10bd07de 88 rc=sscanf(ibuf+forcehex,type?"%d":"%x",&val);
wd5gnr 0:8baa10bd07de 89 if (rc && v) *v=val;
wd5gnr 0:8baa10bd07de 90 return rc==-1?0:rc;
wd5gnr 0:8baa10bd07de 91 }
wd5gnr 0:8baa10bd07de 92
wd5gnr 0:8baa10bd07de 93 // Get decimal number
wd5gnr 0:8baa10bd07de 94 int getdec(unsigned int *v)
wd5gnr 0:8baa10bd07de 95 {
wd5gnr 0:8baa10bd07de 96 return getnum(v,NUM_DEC);
wd5gnr 0:8baa10bd07de 97 }
wd5gnr 0:8baa10bd07de 98
wd5gnr 0:8baa10bd07de 99
wd5gnr 0:8baa10bd07de 100 // Get hex number
wd5gnr 0:8baa10bd07de 101 int gethex(unsigned int *v)
wd5gnr 0:8baa10bd07de 102 {
wd5gnr 0:8baa10bd07de 103 return getnum(v,NUM_HEX);
wd5gnr 0:8baa10bd07de 104 }
wd5gnr 0:8baa10bd07de 105
wd5gnr 0:8baa10bd07de 106 // Get float number
wd5gnr 0:8baa10bd07de 107 int getfloat(float *v)
wd5gnr 0:8baa10bd07de 108 {
wd5gnr 0:8baa10bd07de 109 int rv;
wd5gnr 0:8baa10bd07de 110 float vv;
wd5gnr 0:8baa10bd07de 111 if (gettoken(NUM_FLT)<0) return -1;
wd5gnr 0:8baa10bd07de 112 rv=sscanf(ibuf,"%f",&vv);
wd5gnr 0:8baa10bd07de 113 if (rv && v) *v=vv;
wd5gnr 0:8baa10bd07de 114 return rv;
wd5gnr 0:8baa10bd07de 115 }