Test code for proving multi-NCO implementation on Altera FPGA using DEO Nano development board

Dependencies:   MODSERIAL mbed-rtos mbed

Committer:
JonFreeman
Date:
Thu Apr 24 15:35:38 2014 +0000
Revision:
0:7f5b51873953
For testing numerically controlled oscillators implemented in Altera FPGA fitted to DEO Nan0 development board

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JonFreeman 0:7f5b51873953 1 #include "mbed.h"
JonFreeman 0:7f5b51873953 2 #include "rtos.h"
JonFreeman 0:7f5b51873953 3 #include "MODSERIAL.h"
JonFreeman 0:7f5b51873953 4 #include "cnc.h"
JonFreeman 0:7f5b51873953 5 #include <cctype>
JonFreeman 0:7f5b51873953 6
JonFreeman 0:7f5b51873953 7 extern MODSERIAL pc;
JonFreeman 0:7f5b51873953 8 extern void report_inputs () ;
JonFreeman 0:7f5b51873953 9
JonFreeman 0:7f5b51873953 10 #if defined I2C_Enable
JonFreeman 0:7f5b51873953 11 extern I2CSlave slave;//(PTE0, PTE1); on KL25
JonFreeman 0:7f5b51873953 12
JonFreeman 0:7f5b51873953 13 int i2c_checksumchecker (char * buf, int len) {
JonFreeman 0:7f5b51873953 14 int k, i = 0x01;
JonFreeman 0:7f5b51873953 15 for (k = 0; k < len; k++)
JonFreeman 0:7f5b51873953 16 i += buf[k];
JonFreeman 0:7f5b51873953 17 i &= 0x0ff;
JonFreeman 0:7f5b51873953 18 return i;
JonFreeman 0:7f5b51873953 19 }
JonFreeman 0:7f5b51873953 20
JonFreeman 0:7f5b51873953 21 int i2c_checksumchecker (char * buf) {
JonFreeman 0:7f5b51873953 22 return i2c_checksumchecker (buf, strlen(buf));
JonFreeman 0:7f5b51873953 23 }
JonFreeman 0:7f5b51873953 24
JonFreeman 0:7f5b51873953 25 char * add_csum (char * buf, int len) { // Adds checksum to end of binary string of known length
JonFreeman 0:7f5b51873953 26 int j;
JonFreeman 0:7f5b51873953 27 char cs = 0;
JonFreeman 0:7f5b51873953 28 for (j = 0; j < len; j++) {
JonFreeman 0:7f5b51873953 29 cs += buf[j];
JonFreeman 0:7f5b51873953 30 }
JonFreeman 0:7f5b51873953 31 buf[len] = 0xff - cs;
JonFreeman 0:7f5b51873953 32 buf[len + 1] = 0;
JonFreeman 0:7f5b51873953 33 return buf;
JonFreeman 0:7f5b51873953 34 }
JonFreeman 0:7f5b51873953 35
JonFreeman 0:7f5b51873953 36 char * add_csum (char * buf) { // Adds checksum to end of null terminated string
JonFreeman 0:7f5b51873953 37 return add_csum (buf, strlen(buf));
JonFreeman 0:7f5b51873953 38 }
JonFreeman 0:7f5b51873953 39
JonFreeman 0:7f5b51873953 40 void i2c_handler (void const * name)
JonFreeman 0:7f5b51873953 41 {
JonFreeman 0:7f5b51873953 42 const int i2buflen = 16;
JonFreeman 0:7f5b51873953 43 int err = 0;
JonFreeman 0:7f5b51873953 44 char buf[i2buflen];
JonFreeman 0:7f5b51873953 45 char msg[20] = "Message 2snd\0";
JonFreeman 0:7f5b51873953 46 add_csum(msg);
JonFreeman 0:7f5b51873953 47 slave.address(0xc0);
JonFreeman 0:7f5b51873953 48 err = slave.write(msg, strlen(msg) + 1); // Includes null char // returns 0 on success, nz otherwise
JonFreeman 0:7f5b51873953 49 while (true) {
JonFreeman 0:7f5b51873953 50 int i = slave.receive();
JonFreeman 0:7f5b51873953 51 switch (i) {
JonFreeman 0:7f5b51873953 52 case I2CSlave::NoData: // Happens most of the time NoData - the slave has not been addressed
JonFreeman 0:7f5b51873953 53 osThreadYield(); // Using RTOS on this project
JonFreeman 0:7f5b51873953 54 break;
JonFreeman 0:7f5b51873953 55 case I2CSlave::ReadAddressed: // - the master has requested a read from this slave
JonFreeman 0:7f5b51873953 56 err = slave.write(msg, strlen(msg) + 1); // Includes null char // returns 0 on success, nz otherwise
JonFreeman 0:7f5b51873953 57 pc.printf("RdAddr'd ");
JonFreeman 0:7f5b51873953 58 break;
JonFreeman 0:7f5b51873953 59 case I2CSlave::WriteGeneral: // - the master is writing to all slave
JonFreeman 0:7f5b51873953 60 err = slave.read(buf, i2buflen); // returns 0 on success, nz otherwise
JonFreeman 0:7f5b51873953 61 pc.printf("i=%d, - the master is writing to all slave %s\r\n", i, buf);
JonFreeman 0:7f5b51873953 62 break;
JonFreeman 0:7f5b51873953 63 case I2CSlave::WriteAddressed: // - the master is writing to this slave
JonFreeman 0:7f5b51873953 64 err = slave.read(buf, i2buflen); // returns 0 on success, nz otherwise
JonFreeman 0:7f5b51873953 65 pc.printf("M wr-> [%s]", buf);
JonFreeman 0:7f5b51873953 66 for (int z = 0; z < strlen(buf); z++)
JonFreeman 0:7f5b51873953 67 pc.printf("%2x, ", buf[z]);
JonFreeman 0:7f5b51873953 68 pc.printf("cs %2x\r\n", i2c_checksumchecker(buf));
JonFreeman 0:7f5b51873953 69 break;
JonFreeman 0:7f5b51873953 70 default:
JonFreeman 0:7f5b51873953 71 pc.printf("Unknown I2C code %d\r\n");
JonFreeman 0:7f5b51873953 72 break;
JonFreeman 0:7f5b51873953 73 } // end of switch (i) upon result of slave.receive()
JonFreeman 0:7f5b51873953 74 if (err) {
JonFreeman 0:7f5b51873953 75 pc.printf("Err %d with i = %d\r\n", err, i);
JonFreeman 0:7f5b51873953 76 err = 0;
JonFreeman 0:7f5b51873953 77 }
JonFreeman 0:7f5b51873953 78 memset (buf, 0, i2buflen); // Clear buffer
JonFreeman 0:7f5b51873953 79 } // end of while (true)
JonFreeman 0:7f5b51873953 80 } // end of void i2c_handler (void const * name)
JonFreeman 0:7f5b51873953 81
JonFreeman 0:7f5b51873953 82 #endif
JonFreeman 0:7f5b51873953 83
JonFreeman 0:7f5b51873953 84 extern char const * target_str_addr (void) ;
JonFreeman 0:7f5b51873953 85 void target_cmd (struct singleGparam * a) {
JonFreeman 0:7f5b51873953 86 pc.printf("Computer is %s\r\n", target_str_addr());
JonFreeman 0:7f5b51873953 87 }
JonFreeman 0:7f5b51873953 88
JonFreeman 0:7f5b51873953 89 //extern void FPGA_bit (int whichbit, int hiorlo) ;
JonFreeman 0:7f5b51873953 90
JonFreeman 0:7f5b51873953 91 extern void setpir_cmd (struct singleGparam * a) ;
JonFreeman 0:7f5b51873953 92 extern void setcmd_cmd (struct singleGparam * a) ;
JonFreeman 0:7f5b51873953 93 extern void getdro_cmd (struct singleGparam * a) ;
JonFreeman 0:7f5b51873953 94 extern void getpir_cmd (struct singleGparam * a) ;
JonFreeman 0:7f5b51873953 95 extern void clrpir_cmd (struct singleGparam * a) ;
JonFreeman 0:7f5b51873953 96 extern void clrdro_cmd (struct singleGparam * a) ;
JonFreeman 0:7f5b51873953 97 extern void setdro_cmd (struct singleGparam * a) ;
JonFreeman 0:7f5b51873953 98
JonFreeman 0:7f5b51873953 99
JonFreeman 0:7f5b51873953 100 void report_ins_cmd (struct singleGparam * a) {
JonFreeman 0:7f5b51873953 101 report_inputs();
JonFreeman 0:7f5b51873953 102 }
JonFreeman 0:7f5b51873953 103 void menucmd (struct singleGparam * a);
JonFreeman 0:7f5b51873953 104 struct kb_command {
JonFreeman 0:7f5b51873953 105 const char * cmd_word; // points to text e.g. "menu"
JonFreeman 0:7f5b51873953 106 const char * explan;
JonFreeman 0:7f5b51873953 107 void (*f)(struct singleGparam *); // points to function
JonFreeman 0:7f5b51873953 108 } ;
JonFreeman 0:7f5b51873953 109
JonFreeman 0:7f5b51873953 110 struct kb_command const * command_list_ptr = NULL; // Pointer switched between 'input_syntax_check' and 'command_execute'
JonFreeman 0:7f5b51873953 111
JonFreeman 0:7f5b51873953 112 struct kb_command const input_syntax_check [] = {
JonFreeman 0:7f5b51873953 113 {"menu", "Lists available commands, same as ls", menucmd},
JonFreeman 0:7f5b51873953 114 {"ls", "Lists available commands, same as menu", menucmd}
JonFreeman 0:7f5b51873953 115 } ;
JonFreeman 0:7f5b51873953 116
JonFreeman 0:7f5b51873953 117 struct kb_command const command_execute[] = {
JonFreeman 0:7f5b51873953 118 {"menu", "Lists available commands, same as ls", menucmd},
JonFreeman 0:7f5b51873953 119 {"ls", "Lists available commands, same as menu", menucmd},
JonFreeman 0:7f5b51873953 120 {"inputs", "Report State of Input bits", report_ins_cmd},
JonFreeman 0:7f5b51873953 121 {"pir", "Send number to FPGA pir", setpir_cmd},
JonFreeman 0:7f5b51873953 122 {"cmd", "Send command to FPGA command reg", setcmd_cmd},
JonFreeman 0:7f5b51873953 123 {"rddro", "Read DRO from FPGA", getdro_cmd},
JonFreeman 0:7f5b51873953 124 {"rdpir", "Read PIR from FPGA", getpir_cmd},
JonFreeman 0:7f5b51873953 125 {"clrpir", "Zero PIR", clrpir_cmd},
JonFreeman 0:7f5b51873953 126 {"clrdro", "Zero DRO", clrdro_cmd},
JonFreeman 0:7f5b51873953 127 {"setdro", "Set DRO", setdro_cmd},
JonFreeman 0:7f5b51873953 128 {"target", "Identify computer device", target_cmd},
JonFreeman 0:7f5b51873953 129 };
JonFreeman 0:7f5b51873953 130
JonFreeman 0:7f5b51873953 131 int numof_menu_items;
JonFreeman 0:7f5b51873953 132 void menucmd (struct singleGparam * a)
JonFreeman 0:7f5b51873953 133 {
JonFreeman 0:7f5b51873953 134 pc.printf("At menucmd function - listing commands:-\r\n");
JonFreeman 0:7f5b51873953 135 for(int i = 0; i < numof_menu_items; i++)
JonFreeman 0:7f5b51873953 136 pc.printf("[%s]\t\t%s\r\n", command_list_ptr[i].cmd_word, command_list_ptr[i].explan);
JonFreeman 0:7f5b51873953 137 pc.printf("End of List of Commands\r\n");
JonFreeman 0:7f5b51873953 138 }
JonFreeman 0:7f5b51873953 139
JonFreeman 0:7f5b51873953 140 extern void grain_clr (struct singleGparam & g) ;
JonFreeman 0:7f5b51873953 141
JonFreeman 0:7f5b51873953 142 void command_line_interpreter (void const * name)
JonFreeman 0:7f5b51873953 143 {
JonFreeman 0:7f5b51873953 144 const int MAX_PARAMS = 10, MAX_CMD_LEN = 120;
JonFreeman 0:7f5b51873953 145 static char cmd_line[MAX_CMD_LEN + 4];
JonFreeman 0:7f5b51873953 146 static struct singleGparam params[MAX_PARAMS + 1];
JonFreeman 0:7f5b51873953 147 static int cl_index = 0, lastalpha = 0;
JonFreeman 0:7f5b51873953 148 static fl_typ fracmul;
JonFreeman 0:7f5b51873953 149 if (true) {
JonFreeman 0:7f5b51873953 150 command_list_ptr = command_execute;
JonFreeman 0:7f5b51873953 151 numof_menu_items = sizeof(command_execute) / sizeof(kb_command);
JonFreeman 0:7f5b51873953 152 }
JonFreeman 0:7f5b51873953 153 else {
JonFreeman 0:7f5b51873953 154 command_list_ptr = input_syntax_check;
JonFreeman 0:7f5b51873953 155 numof_menu_items = sizeof(input_syntax_check) / sizeof(kb_command);
JonFreeman 0:7f5b51873953 156 }
JonFreeman 0:7f5b51873953 157 while (true) {
JonFreeman 0:7f5b51873953 158 while (pc.readable()) {
JonFreeman 0:7f5b51873953 159 int ch;
JonFreeman 0:7f5b51873953 160 if (cl_index > MAX_CMD_LEN) { // trap out stupidly long command lines
JonFreeman 0:7f5b51873953 161 pc.printf ("Keyboard Error!! Killing stupidly long command line");
JonFreeman 0:7f5b51873953 162 cl_index = 0;
JonFreeman 0:7f5b51873953 163 }
JonFreeman 0:7f5b51873953 164 ch = tolower(pc.getc());
JonFreeman 0:7f5b51873953 165 if (ch == '\r' || ch >= ' ' && ch <= 'z')
JonFreeman 0:7f5b51873953 166 pc.printf("%c", ch);
JonFreeman 0:7f5b51873953 167 // else { // Using <Ctrl>+ 'F', 'B' for Y, 'L', 'R' for X, 'U', 'D' for Z
JonFreeman 0:7f5b51873953 168 // cl_index = 0; // 6 2 12 18 21 4
JonFreeman 0:7f5b51873953 169 // pc.printf("[%d]", ch);
JonFreeman 0:7f5b51873953 170 // nudger (ch);
JonFreeman 0:7f5b51873953 171 // }
JonFreeman 0:7f5b51873953 172 if(ch != '\r') // was this the 'Enter' key?
JonFreeman 0:7f5b51873953 173 cmd_line[cl_index++] = ch; // added char to command being assembled
JonFreeman 0:7f5b51873953 174 else { // key was CR, may or may not be command to lookup
JonFreeman 0:7f5b51873953 175 cmd_line[cl_index] = 0; // null terminate command string
JonFreeman 0:7f5b51873953 176 if(cl_index) { // If have got some chars to lookup
JonFreeman 0:7f5b51873953 177 int i, wrdlen;
JonFreeman 0:7f5b51873953 178 for (i = 0; i < numof_menu_items; i++) { // Look for input match in command list
JonFreeman 0:7f5b51873953 179 wrdlen = strlen(command_list_ptr[i].cmd_word);
JonFreeman 0:7f5b51873953 180 if(strncmp(command_list_ptr[i].cmd_word, cmd_line, wrdlen) == 0
JonFreeman 0:7f5b51873953 181 && !isalpha(cmd_line[wrdlen])) { // If match found
JonFreeman 0:7f5b51873953 182 bool negflag = false;
JonFreeman 0:7f5b51873953 183 int state = 0, paramindex;
JonFreeman 0:7f5b51873953 184 // pc.printf("Found match for word [%s]\r\n", kbc[i].wrd);
JonFreeman 0:7f5b51873953 185 for(paramindex = 0; paramindex < MAX_PARAMS; paramindex++)
JonFreeman 0:7f5b51873953 186 grain_clr (params[paramindex]);
JonFreeman 0:7f5b51873953 187 paramindex = 0;
JonFreeman 0:7f5b51873953 188 // read any parameters from command line here
JonFreeman 0:7f5b51873953 189 // Using parameters[0] as count of parameters to follow
JonFreeman 0:7f5b51873953 190 while (wrdlen <= cl_index) {
JonFreeman 0:7f5b51873953 191 ch = cmd_line[wrdlen++];
JonFreeman 0:7f5b51873953 192 if(isalpha(ch)) lastalpha = ch;
JonFreeman 0:7f5b51873953 193 if(ch == '-') negflag = true;
JonFreeman 0:7f5b51873953 194 if(ch == '+') negflag = false;
JonFreeman 0:7f5b51873953 195 switch (state) {
JonFreeman 0:7f5b51873953 196 case 0: // looking for start of a number string
JonFreeman 0:7f5b51873953 197 if(isdigit(ch)) { // found first digit of a number string
JonFreeman 0:7f5b51873953 198 paramindex++;
JonFreeman 0:7f5b51873953 199 if(paramindex > MAX_PARAMS) {
JonFreeman 0:7f5b51873953 200 wrdlen = cl_index; // exit condition
JonFreeman 0:7f5b51873953 201 pc.printf("WARNING - too many parameters, ignoring extra\r\n");
JonFreeman 0:7f5b51873953 202 } else {
JonFreeman 0:7f5b51873953 203 params[paramindex].i = ch - '0';
JonFreeman 0:7f5b51873953 204 params[paramindex].c = lastalpha;
JonFreeman 0:7f5b51873953 205 state = 1; // Found first digit char of number string
JonFreeman 0:7f5b51873953 206 }
JonFreeman 0:7f5b51873953 207 }
JonFreeman 0:7f5b51873953 208 break;
JonFreeman 0:7f5b51873953 209 case 1: // looking for end of a number string
JonFreeman 0:7f5b51873953 210 if(isdigit(ch)) { // accumulating integer from string
JonFreeman 0:7f5b51873953 211 params[paramindex].i *= 10;
JonFreeman 0:7f5b51873953 212 params[paramindex].i += ch - '0';
JonFreeman 0:7f5b51873953 213 } else { // found non-digit terminating number
JonFreeman 0:7f5b51873953 214 if (ch == '.') {
JonFreeman 0:7f5b51873953 215 state = 2;
JonFreeman 0:7f5b51873953 216 fracmul = 0.1;
JonFreeman 0:7f5b51873953 217 params[paramindex].flt = (fl_typ)params[paramindex].i;
JonFreeman 0:7f5b51873953 218 } else {
JonFreeman 0:7f5b51873953 219 params[0].i++; // count of validated parameters
JonFreeman 0:7f5b51873953 220 state = 0; // Have read past last digit of number string
JonFreeman 0:7f5b51873953 221 if(negflag) {
JonFreeman 0:7f5b51873953 222 params[paramindex].i = -params[paramindex].i;
JonFreeman 0:7f5b51873953 223 negflag = false;
JonFreeman 0:7f5b51873953 224 }
JonFreeman 0:7f5b51873953 225 params[paramindex].flt = (fl_typ)params[paramindex].i;
JonFreeman 0:7f5b51873953 226 }
JonFreeman 0:7f5b51873953 227 }
JonFreeman 0:7f5b51873953 228 break;
JonFreeman 0:7f5b51873953 229 case 2: // looking for fractional part of double
JonFreeman 0:7f5b51873953 230 if(isdigit(ch)) { // accumulating fractional part from string
JonFreeman 0:7f5b51873953 231 params[paramindex].flt += (fl_typ)((ch - '0') * fracmul);
JonFreeman 0:7f5b51873953 232 fracmul /= 10.0;
JonFreeman 0:7f5b51873953 233 } else { // found non-digit terminating double precision number
JonFreeman 0:7f5b51873953 234 params[0].i++; // count of validated parameters
JonFreeman 0:7f5b51873953 235 state = 0; // Have read past last digit of number string
JonFreeman 0:7f5b51873953 236 if(negflag) {
JonFreeman 0:7f5b51873953 237 params[paramindex].i = -params[paramindex].i;
JonFreeman 0:7f5b51873953 238 params[paramindex].flt = -params[paramindex].flt;
JonFreeman 0:7f5b51873953 239 negflag = false;
JonFreeman 0:7f5b51873953 240 }
JonFreeman 0:7f5b51873953 241 }
JonFreeman 0:7f5b51873953 242 break;
JonFreeman 0:7f5b51873953 243 default:
JonFreeman 0:7f5b51873953 244 break;
JonFreeman 0:7f5b51873953 245 } // end of switch state
JonFreeman 0:7f5b51873953 246 } // end of while wrdlen < cl_index
JonFreeman 0:7f5b51873953 247 // pc.printf("Found match to [%s] with %d parameters\r\n", command_list_ptr[i].wrd, paramindex);
JonFreeman 0:7f5b51873953 248 command_list_ptr[i].f(params); // execute command
JonFreeman 0:7f5b51873953 249 i = numof_menu_items + 1; // to exit for loop
JonFreeman 0:7f5b51873953 250 }
JonFreeman 0:7f5b51873953 251 } // End of for numof_menu_items
JonFreeman 0:7f5b51873953 252 if(i == numof_menu_items)
JonFreeman 0:7f5b51873953 253 pc.printf("No Match Found for CMD [%s]\r\n", cmd_line);
JonFreeman 0:7f5b51873953 254 } // End of If have got some chars to lookup
JonFreeman 0:7f5b51873953 255 pc.printf("\r\n>");
JonFreeman 0:7f5b51873953 256 cl_index = lastalpha = 0;
JonFreeman 0:7f5b51873953 257 } // End of else key was CR, may or may not be command to lookup
JonFreeman 0:7f5b51873953 258 } // End of while (pc.readable())
JonFreeman 0:7f5b51873953 259 osThreadYield(); // Using RTOS on this project
JonFreeman 0:7f5b51873953 260 }
JonFreeman 0:7f5b51873953 261 }
JonFreeman 0:7f5b51873953 262
JonFreeman 0:7f5b51873953 263 ////} cli;
JonFreeman 0:7f5b51873953 264