Hackaday demo: Signal generator

Dependencies:   SDFileSystem mbed

command.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 "command.h"
#include "sdcard.h"

#include <cctype>

// Commands (except SDCARD commands)

// Print help
void help(void)
{
    pc.printf("\n\n\n\rPat 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
    }
}