Hackaday demo: Signal generator
Dependencies: SDFileSystem mbed
cio.cpp
- Committer:
- wd5gnr
- Date:
- 2015-09-15
- Revision:
- 1:c229c3ceb909
- Parent:
- 0:8baa10bd07de
File content as of revision 1:c229c3ceb909:
#include "mbed.h" #define _EXTERN_ extern #include "main.h" #include "cio.h" #include <cctype> // Character I/O functions // Get a character but handle backspace // However, since we don't understand the start of a line // Don't print backspaces // Return is a non-zero character int getachar(void) { int c=0; while (!c) { c=pc.getc(); if (c==0x7f) c=8; // backspace if (c!=8) pc.putc(c); if (c=='\n') c='\r'; } return c; } // Get a token (number) // basically we skip anything that doesn't look // like a hex number (even in decimal mode) // so we skip comma, quotes, etc. in CSV // Return: -1 - Exit via Esc, Semicolon or CNTL_Z // 0 - ok // 1 - long token // Odd input may cause odd results (for example floating point 1.2FF or something int gettoken(int type) { int ip=0; int c; bool good; do { good=true; c=getachar(); // get character if (c==27 || c==';' || c==26) return -1; // escape, semicolon, or ^Z returns -1 (stop) if (c==8 && ip!=0) { ip--; // backspace not at first position pc.putc(8); pc.putc(' '); pc.putc(8); } if (c==8) continue; // any backspace if (type==NUM_DEC && (c=='x' || c=='X')) type=NUM_HEX; // decimal to hex if you see 0x switch (type) { case NUM_HEX: good=isxdigit(c)||c=='x'||c=='X'; // hex digits (including 0x) break; case NUM_DEC: good=isdigit(c); // decimal digits break; case NUM_FLT: good=isdigit(c)||c=='.'||c=='-'||c=='e'||c=='E'; // simple floating point break; } if (!good) { // illegal character? if (ip) { ibuf[ip]='\0'; // got something return 0; } else continue; // just skip leading cruft } if (ip<sizeof(ibuf)-1) ibuf[ip++]=c; // accumulate } while (1); } // Get a token and convert to a number int getnum(unsigned int *v, int type) { int val, rc, forcehex=0; if (gettoken(type)<0) return -1; if (ibuf[0]=='0' && (ibuf[1]=='x' || ibuf[1]=='X')) { forcehex=2; type=0; } // Get number from input buffer (forcehex skips 0x) rc=sscanf(ibuf+forcehex,type?"%d":"%x",&val); if (rc && v) *v=val; return rc==-1?0:rc; } // Get decimal number int getdec(unsigned int *v) { return getnum(v,NUM_DEC); } // Get hex number int gethex(unsigned int *v) { return getnum(v,NUM_HEX); } // Get float number int getfloat(float *v) { int rv; float vv; if (gettoken(NUM_FLT)<0) return -1; rv=sscanf(ibuf,"%f",&vv); if (rv && v) *v=vv; return rv; }