Updated
Diff: serial_terminal.cpp
- Revision:
- 0:f3fb124dace1
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/serial_terminal.cpp Sat Jan 05 15:02:46 2019 +0000 @@ -0,0 +1,228 @@ +#include "serial_terminal.hpp" + +#define SAMPLES_IN_MEMORY 120 + +void serialterm() +{ + serial_tout.attach(serial_toutISR,TOUT_TIME_DEF); + + //change these sizes + char cmnd[30]; + char arg[30]; + float val; + int argnum; + + e_commands e_cmnd; + e_commands e_arg; + + argnum = sscanf(cmdBuffer,"%s %s",cmnd,arg); + + if(argnum != 2) + { + printQueue.call(puts, "INVALID COMMAND\r"); + } + else + { + argnum = sscanf(arg, "%f", &val); //returns 0 if no number present + + e_cmnd = stringconv(cmnd); + e_arg = stringconv(arg); + + switch (e_cmnd) + { + + case (READ) : + if ((argnum == 0 && e_arg != ALL) || (argnum == 1 && val < 1)) + { + printQueue.call(puts, "INVALID COMMAND\r\n"); + } + else if (e_arg == ALL || val >= (BUFFERSIZE-Nspaces)) + { + SDqueue.call(SDread,-1); //read all + } + else + { + SDqueue.call(SDread,val); + } + break; + + case (DELETE) : + if ((argnum == 0 && e_arg != ALL) || (argnum == 1 && val < 1)) + { + printQueue.call(puts,"INVALID COMMAND\r\n"); + } + else if (e_arg == ALL || val > (BUFFERSIZE-Nspaces)) SDqueue.call(SDdelete,-1); //delete all + else SDqueue.call(SDdelete,val); + break; + + case (SETDATE) : + timeLock.lock(); + seconds = time(NULL); + timeData = localtime(&seconds); + set_time(mktime(timeData)); + sscanf(arg,"%2d%2d%4d",&(timeData->tm_mday),&(timeData->tm_mon),&(timeData->tm_year)); + (timeData->tm_mon) = (timeData->tm_mon)-1; + (timeData->tm_year) = (timeData->tm_year)-1900; + timeLock.unlock(); + if (mktime(timeData) == -1) + { + printQueue.call(puts,"SETDATE FAILED\r\n"); + } + else + { + timeLock.lock(); + set_time(mktime(timeData)); + timeLock.unlock(); + seconds = time(NULL); + + printQueue.call(printf,"DATE UPDATED TO %s\r\n\n", ctime(&seconds)); + } + break; + + case (SETTIME) : + //Get current time and update the tm structure + timeLock.lock(); + seconds = time(NULL); + timeData = localtime(&seconds); + set_time(mktime(timeData)); + //scan the input for hhmmss + sscanf(arg,"%2d%2d%2d",&(timeData->tm_hour),&(timeData->tm_min),&(timeData->tm_sec)); + //check if the time is valid, if not do not update time + timeLock.unlock(); + if (mktime(timeData) == -1) + { + printQueue.call(puts, "SETTIME FAILED\r\n"); + } + else + { + timeLock.lock(); + set_time(mktime(timeData)); + seconds = time(NULL); + timeLock.unlock(); + + printQueue.call(printf,"TIME UPDATED TO %s\r\n\n", ctime(&seconds)); + + } + break; + + case (SETT) : + //Set the sampling rate + if (e_arg == ALL || val < 0.1 || val > 60) + { + printQueue.call(puts, "OUT OF RANGE\r\n"); + } + else + { + sample_rate = val; + if(sampling) + { + sample.attach(&sampleISR, sample_rate); + } + + printQueue.call(printf, "SAMPLE RATE SET TO %5.2f\r\n\n", sample_rate); + } + break; + + case (STATE) : + if (e_arg == ON) + { + sample.attach(&sampleISR, sample_rate); + sampling = true; + printQueue.call(puts,"SAMPLING ENABLED\r\n"); + } + else if (e_arg == OFF) + { + sample.detach(); + sampling = false; + printQueue.call(puts,"SAMPLING DISABLED\r\n"); + } + else + { + printQueue.call(puts,"INVALID COMMAND\r\n"); + } + break; + + case (LOGGING) : + if (e_arg == ON) + { + yellowLED = 1; + logging = true; + printQueue.call(puts,"LOGGING ENABLED\r\n"); + } + else if (e_arg == OFF) + { + yellowLED = 0; + logging = false; + printQueue.call(puts,"LOGGING DISABLED\r\n"); + } + else + { + printQueue.call(puts,"INVALID COMMAND\r\n"); + } + break; + + default : + printQueue.call(puts,"INVALID COMMAND\r\n"); + break; + } + } + serial_tout.detach(); + memset(cmdBuffer,0,sizeof cmdBuffer); +} + +void serial_toutISR(void) +{ + threadstates |= SERIAL; +} + +void serialISR() +{ + pc->attach(NULL, Serial::RxIrq); + serialqueue.call(serialData); +} + +void serialData() +{ + static int i = 0; + + if (pc->readable()) + { + cmdBuffer[i] = pc->getc(); + if (i != 29) + { + + if (cmdBuffer[i] == '\b') + { + i = (i ? i-1 : 0); + } + else if (cmdBuffer[i] == '\r') + { + cmdBuffer[i+1]==NULL; + serialqueue.call(serialterm); + i = 0; + } + else i++; + } + else + { + serialqueue.call(serialterm); + i = 0; + } + } + pc->attach(serialISR, Serial::RxIrq); +} + +e_commands stringconv(string in) +{ + if (in == "READ") return READ; + if (in == "DELETE") return DELETE; + if (in == "SETDATE") return SETDATE; + if (in == "SETTIME") return SETTIME; + if (in == "SETT") return SETT; + if (in == "STATE") return STATE; + if (in == "LOGGING") return LOGGING; + if (in == "ALL") return ALL; + if (in == "ON") return ON; + if (in == "OFF") return OFF; + else return UNKNOWN; +} \ No newline at end of file