Hackaday demo: Signal generator

Dependencies:   SDFileSystem mbed

Revision:
0:8baa10bd07de
Child:
1:c229c3ceb909
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/command.cpp	Fri Sep 11 02:32:43 2015 +0000
@@ -0,0 +1,134 @@
+#include "mbed.h"
+#define _EXTERN_ extern
+#include "main.h"
+#include "command.h"
+#include "sdcard.h"
+
+#include <cctype>
+
+// Commands (except SDCARD commands)
+
+// Print help
+void help(void)
+{
+    pc.printf("Pat Gen V1.0. Buffers size %d\r\n",BUFSIZE);
+    pc.printf("l=load decimal\r\nx=load hex\r\nf=load floating\r\ng=go\r\nt=timebase\r\nz=zap\r\nd=sd card dir\r\nr=sd read\r\nw=sd write\r\n");
+}
+
+// Fill memory with one or two values (helper function)
+static void zapengine(unsigned int v1, unsigned int v2)
+{
+    int i;
+    for (i=0; i<sizeof(buffer)/sizeof(buffer[0]); i++) {
+        buffer[i]=(i&1)?v1:v2;
+    }
+
+}
+
+// UI for fill memory (zap)
+void zap(void)
+{
+    unsigned int v1,v2;
+    pc.printf("First value (Esc to quit): ");
+    if (gethex(&v1)<=0) return;
+    pc.printf("\r\nSecond value (Enter for none): ");
+    v2=v1;
+    if (gethex(&v2)<0) return;
+    if (ibuf[0])
+        sscanf(ibuf,"%x",&v2);
+    zapengine(v1,v2);
+    pc.printf("\r\nDone");
+}
+
+
+
+
+// Load from PC
+void load(int decflag)  // -1 is float (-1,1), 0 is hex, 1 is dec
+{
+    unsigned int i, n=0;
+    int rc;
+    float f=0.0;
+    pc.printf("Transfer file now (%d  items Esc or ; to quit early)\r\n",sizeof(buffer)/sizeof(buffer[0]));
+    for (i=0; i<sizeof(buffer)/sizeof(buffer[0]); i++) {
+        if (decflag<0) {
+            rc=getfloat(&f);
+            if (f<-1.0f || f>1.0f) {
+                printf("Range error %f\r\n",f);
+                rc=-1;
+            } else
+                n=(unsigned int)((f+1.0f)*32767.0f+0.5f);
+        } else
+            rc=decflag?getdec(&n):gethex(&n);
+        if (rc<0) {
+            pc.printf("\r\nAborted at %d\r\n",i);
+            return;
+        } else buffer[i]=n;
+    }
+    pc.printf("\r\nDone\r\n");
+}
+
+// Set time base
+void timebase()
+{
+    float v;
+    pc.printf("Time/tick in uS: ");
+    if (getfloat(&v)>0) timebaseus=v;
+}
+
+
+
+// Command parser
+void command(void)
+{
+    char cmd=' ';
+    zapengine(0xaaaa,0x5555);
+    help();
+    while (1) {
+        pc.printf("\r\n? ");
+        // commands: ? = help, l=load CSV, g=go, t=set timebase
+        cmd=getachar();
+        cmd=tolower(cmd);
+        pc.printf("\r\n");
+        switch (cmd) {
+            case '?':
+                help();
+                break;
+            case 'f':
+                load(-1);
+                break;
+            case 'l':
+                load(1);
+                break;
+            case 'x':
+                load(0);
+                break;
+            case 'g':
+                break;
+            case 't':
+                timebase();
+                break;
+            case 'z':
+                zap();
+                break;
+            case 'd':
+                dir();
+                break;
+            case 'r':
+                sdread();
+                break;
+            case 'w':
+                sdwrite();
+                break;
+            case '\r':
+                break;
+            case '\n':
+                break;
+            default:
+                help();
+        }
+        if (cmd=='g') break;  // return to caller
+    }
+}
+
+