Hackaday demo: Signal generator
Dependencies: SDFileSystem mbed
cio.cpp@1:c229c3ceb909, 2015-09-15 (annotated)
- 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?
User | Revision | Line number | New 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 | } |