Test code for proving multi-NCO implementation on Altera FPGA using DEO Nano development board
Dependencies: MODSERIAL mbed-rtos mbed
command_interpreter.cpp
- Committer:
- JonFreeman
- Date:
- 2014-04-24
- Revision:
- 0:7f5b51873953
File content as of revision 0:7f5b51873953:
#include "mbed.h" #include "rtos.h" #include "MODSERIAL.h" #include "cnc.h" #include <cctype> extern MODSERIAL pc; extern void report_inputs () ; #if defined I2C_Enable extern I2CSlave slave;//(PTE0, PTE1); on KL25 int i2c_checksumchecker (char * buf, int len) { int k, i = 0x01; for (k = 0; k < len; k++) i += buf[k]; i &= 0x0ff; return i; } int i2c_checksumchecker (char * buf) { return i2c_checksumchecker (buf, strlen(buf)); } char * add_csum (char * buf, int len) { // Adds checksum to end of binary string of known length int j; char cs = 0; for (j = 0; j < len; j++) { cs += buf[j]; } buf[len] = 0xff - cs; buf[len + 1] = 0; return buf; } char * add_csum (char * buf) { // Adds checksum to end of null terminated string return add_csum (buf, strlen(buf)); } void i2c_handler (void const * name) { const int i2buflen = 16; int err = 0; char buf[i2buflen]; char msg[20] = "Message 2snd\0"; add_csum(msg); slave.address(0xc0); err = slave.write(msg, strlen(msg) + 1); // Includes null char // returns 0 on success, nz otherwise while (true) { int i = slave.receive(); switch (i) { case I2CSlave::NoData: // Happens most of the time NoData - the slave has not been addressed osThreadYield(); // Using RTOS on this project break; case I2CSlave::ReadAddressed: // - the master has requested a read from this slave err = slave.write(msg, strlen(msg) + 1); // Includes null char // returns 0 on success, nz otherwise pc.printf("RdAddr'd "); break; case I2CSlave::WriteGeneral: // - the master is writing to all slave err = slave.read(buf, i2buflen); // returns 0 on success, nz otherwise pc.printf("i=%d, - the master is writing to all slave %s\r\n", i, buf); break; case I2CSlave::WriteAddressed: // - the master is writing to this slave err = slave.read(buf, i2buflen); // returns 0 on success, nz otherwise pc.printf("M wr-> [%s]", buf); for (int z = 0; z < strlen(buf); z++) pc.printf("%2x, ", buf[z]); pc.printf("cs %2x\r\n", i2c_checksumchecker(buf)); break; default: pc.printf("Unknown I2C code %d\r\n"); break; } // end of switch (i) upon result of slave.receive() if (err) { pc.printf("Err %d with i = %d\r\n", err, i); err = 0; } memset (buf, 0, i2buflen); // Clear buffer } // end of while (true) } // end of void i2c_handler (void const * name) #endif extern char const * target_str_addr (void) ; void target_cmd (struct singleGparam * a) { pc.printf("Computer is %s\r\n", target_str_addr()); } //extern void FPGA_bit (int whichbit, int hiorlo) ; extern void setpir_cmd (struct singleGparam * a) ; extern void setcmd_cmd (struct singleGparam * a) ; extern void getdro_cmd (struct singleGparam * a) ; extern void getpir_cmd (struct singleGparam * a) ; extern void clrpir_cmd (struct singleGparam * a) ; extern void clrdro_cmd (struct singleGparam * a) ; extern void setdro_cmd (struct singleGparam * a) ; void report_ins_cmd (struct singleGparam * a) { report_inputs(); } void menucmd (struct singleGparam * a); struct kb_command { const char * cmd_word; // points to text e.g. "menu" const char * explan; void (*f)(struct singleGparam *); // points to function } ; struct kb_command const * command_list_ptr = NULL; // Pointer switched between 'input_syntax_check' and 'command_execute' struct kb_command const input_syntax_check [] = { {"menu", "Lists available commands, same as ls", menucmd}, {"ls", "Lists available commands, same as menu", menucmd} } ; struct kb_command const command_execute[] = { {"menu", "Lists available commands, same as ls", menucmd}, {"ls", "Lists available commands, same as menu", menucmd}, {"inputs", "Report State of Input bits", report_ins_cmd}, {"pir", "Send number to FPGA pir", setpir_cmd}, {"cmd", "Send command to FPGA command reg", setcmd_cmd}, {"rddro", "Read DRO from FPGA", getdro_cmd}, {"rdpir", "Read PIR from FPGA", getpir_cmd}, {"clrpir", "Zero PIR", clrpir_cmd}, {"clrdro", "Zero DRO", clrdro_cmd}, {"setdro", "Set DRO", setdro_cmd}, {"target", "Identify computer device", target_cmd}, }; int numof_menu_items; void menucmd (struct singleGparam * a) { pc.printf("At menucmd function - listing commands:-\r\n"); for(int i = 0; i < numof_menu_items; i++) pc.printf("[%s]\t\t%s\r\n", command_list_ptr[i].cmd_word, command_list_ptr[i].explan); pc.printf("End of List of Commands\r\n"); } extern void grain_clr (struct singleGparam & g) ; void command_line_interpreter (void const * name) { const int MAX_PARAMS = 10, MAX_CMD_LEN = 120; static char cmd_line[MAX_CMD_LEN + 4]; static struct singleGparam params[MAX_PARAMS + 1]; static int cl_index = 0, lastalpha = 0; static fl_typ fracmul; if (true) { command_list_ptr = command_execute; numof_menu_items = sizeof(command_execute) / sizeof(kb_command); } else { command_list_ptr = input_syntax_check; numof_menu_items = sizeof(input_syntax_check) / sizeof(kb_command); } while (true) { while (pc.readable()) { int ch; if (cl_index > MAX_CMD_LEN) { // trap out stupidly long command lines pc.printf ("Keyboard Error!! Killing stupidly long command line"); cl_index = 0; } ch = tolower(pc.getc()); if (ch == '\r' || ch >= ' ' && ch <= 'z') pc.printf("%c", ch); // else { // Using <Ctrl>+ 'F', 'B' for Y, 'L', 'R' for X, 'U', 'D' for Z // cl_index = 0; // 6 2 12 18 21 4 // pc.printf("[%d]", ch); // nudger (ch); // } if(ch != '\r') // was this the 'Enter' key? cmd_line[cl_index++] = ch; // added char to command being assembled else { // key was CR, may or may not be command to lookup cmd_line[cl_index] = 0; // null terminate command string if(cl_index) { // If have got some chars to lookup int i, wrdlen; for (i = 0; i < numof_menu_items; i++) { // Look for input match in command list wrdlen = strlen(command_list_ptr[i].cmd_word); if(strncmp(command_list_ptr[i].cmd_word, cmd_line, wrdlen) == 0 && !isalpha(cmd_line[wrdlen])) { // If match found bool negflag = false; int state = 0, paramindex; // pc.printf("Found match for word [%s]\r\n", kbc[i].wrd); for(paramindex = 0; paramindex < MAX_PARAMS; paramindex++) grain_clr (params[paramindex]); paramindex = 0; // read any parameters from command line here // Using parameters[0] as count of parameters to follow while (wrdlen <= cl_index) { ch = cmd_line[wrdlen++]; if(isalpha(ch)) lastalpha = ch; if(ch == '-') negflag = true; if(ch == '+') negflag = false; switch (state) { case 0: // looking for start of a number string if(isdigit(ch)) { // found first digit of a number string paramindex++; if(paramindex > MAX_PARAMS) { wrdlen = cl_index; // exit condition pc.printf("WARNING - too many parameters, ignoring extra\r\n"); } else { params[paramindex].i = ch - '0'; params[paramindex].c = lastalpha; state = 1; // Found first digit char of number string } } break; case 1: // looking for end of a number string if(isdigit(ch)) { // accumulating integer from string params[paramindex].i *= 10; params[paramindex].i += ch - '0'; } else { // found non-digit terminating number if (ch == '.') { state = 2; fracmul = 0.1; params[paramindex].flt = (fl_typ)params[paramindex].i; } else { params[0].i++; // count of validated parameters state = 0; // Have read past last digit of number string if(negflag) { params[paramindex].i = -params[paramindex].i; negflag = false; } params[paramindex].flt = (fl_typ)params[paramindex].i; } } break; case 2: // looking for fractional part of double if(isdigit(ch)) { // accumulating fractional part from string params[paramindex].flt += (fl_typ)((ch - '0') * fracmul); fracmul /= 10.0; } else { // found non-digit terminating double precision number params[0].i++; // count of validated parameters state = 0; // Have read past last digit of number string if(negflag) { params[paramindex].i = -params[paramindex].i; params[paramindex].flt = -params[paramindex].flt; negflag = false; } } break; default: break; } // end of switch state } // end of while wrdlen < cl_index // pc.printf("Found match to [%s] with %d parameters\r\n", command_list_ptr[i].wrd, paramindex); command_list_ptr[i].f(params); // execute command i = numof_menu_items + 1; // to exit for loop } } // End of for numof_menu_items if(i == numof_menu_items) pc.printf("No Match Found for CMD [%s]\r\n", cmd_line); } // End of If have got some chars to lookup pc.printf("\r\n>"); cl_index = lastalpha = 0; } // End of else key was CR, may or may not be command to lookup } // End of while (pc.readable()) osThreadYield(); // Using RTOS on this project } } ////} cli;