Code to drive a CNC machine via a PC LPT port lookalike 25 pin 'D', experiment in 'PC/Mach3' replacement. Designed to compile and run on mbed LPC1768, Freescale KL25Z and Freescale KL46Z. Proved on LPC1768 and KL25Z, problem with serial port on KL46Z. Reads subset of 'G Codes' through usb/serial port and drives 3 stepper/servo drives for X, Y and Z, also similar Step/Dir outputs for spindle motor control. Emulates PC LPT, outputs 'charge pump', proved driving Seig KX3 CNC mill

Dependencies:   MODSERIAL mbed

Committer:
JonFreeman
Date:
Fri Mar 14 14:14:55 2014 +0000
Revision:
3:7aaf0072cc22
Parent:
2:b3c668ec43ac
CNC Machine driver, emulates PC LPT port, docs are wip

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JonFreeman 0:5d0f270bfc87 1 #include "mbed.h"
JonFreeman 1:66ee619f206b 2 #include "rtos.h"
JonFreeman 2:b3c668ec43ac 3 #include "MODSERIAL.h"
JonFreeman 0:5d0f270bfc87 4 #include "cnc.h"
JonFreeman 3:7aaf0072cc22 5 #include <cctype>
JonFreeman 0:5d0f270bfc87 6
JonFreeman 2:b3c668ec43ac 7 extern MODSERIAL pc;
JonFreeman 1:66ee619f206b 8 extern struct Gparams last_position;
JonFreeman 2:b3c668ec43ac 9 extern void move_to_XYZ (struct pirbufgrain & ins) ;
JonFreeman 2:b3c668ec43ac 10 extern void flags_report_cmd (struct singleGparam * a) ;
JonFreeman 2:b3c668ec43ac 11 extern void report_inputs () ;
JonFreeman 0:5d0f270bfc87 12
JonFreeman 3:7aaf0072cc22 13 fl_typ feed_rate = 1.0; // global scope, mm per minute. DEFAULTS to 1.0mm per min, very slow.
JonFreeman 3:7aaf0072cc22 14 signed long spindle_rpm = 0; // global scope
JonFreeman 3:7aaf0072cc22 15
JonFreeman 3:7aaf0072cc22 16
JonFreeman 3:7aaf0072cc22 17
JonFreeman 3:7aaf0072cc22 18
JonFreeman 3:7aaf0072cc22 19 #if defined I2C_Enable
JonFreeman 3:7aaf0072cc22 20 extern I2CSlave slave;//(PTE0, PTE1); on KL25
JonFreeman 3:7aaf0072cc22 21
JonFreeman 3:7aaf0072cc22 22 int i2c_checksumchecker (char * buf, int len) {
JonFreeman 3:7aaf0072cc22 23 int k, i = 0x01;
JonFreeman 3:7aaf0072cc22 24 for (k = 0; k < len; k++)
JonFreeman 3:7aaf0072cc22 25 i += buf[k];
JonFreeman 3:7aaf0072cc22 26 i &= 0x0ff;
JonFreeman 3:7aaf0072cc22 27 return i;
JonFreeman 3:7aaf0072cc22 28 }
JonFreeman 0:5d0f270bfc87 29
JonFreeman 3:7aaf0072cc22 30 int i2c_checksumchecker (char * buf) {
JonFreeman 3:7aaf0072cc22 31 return i2c_checksumchecker (buf, strlen(buf));
JonFreeman 3:7aaf0072cc22 32 }
JonFreeman 3:7aaf0072cc22 33
JonFreeman 3:7aaf0072cc22 34 char * add_csum (char * buf, int len) { // Adds checksum to end of binary string of known length
JonFreeman 3:7aaf0072cc22 35 int j;
JonFreeman 3:7aaf0072cc22 36 char cs = 0;
JonFreeman 3:7aaf0072cc22 37 for (j = 0; j < len; j++) {
JonFreeman 3:7aaf0072cc22 38 cs += buf[j];
JonFreeman 3:7aaf0072cc22 39 }
JonFreeman 3:7aaf0072cc22 40 buf[len] = 0xff - cs;
JonFreeman 3:7aaf0072cc22 41 buf[len + 1] = 0;
JonFreeman 3:7aaf0072cc22 42 return buf;
JonFreeman 3:7aaf0072cc22 43 }
JonFreeman 3:7aaf0072cc22 44
JonFreeman 3:7aaf0072cc22 45 char * add_csum (char * buf) { // Adds checksum to end of null terminated string
JonFreeman 3:7aaf0072cc22 46 return add_csum (buf, strlen(buf));
JonFreeman 0:5d0f270bfc87 47 }
JonFreeman 0:5d0f270bfc87 48
JonFreeman 3:7aaf0072cc22 49 void i2c_handler (void const * name)
JonFreeman 0:5d0f270bfc87 50 {
JonFreeman 3:7aaf0072cc22 51 const int i2buflen = 16;
JonFreeman 3:7aaf0072cc22 52 int err = 0;
JonFreeman 3:7aaf0072cc22 53 char buf[i2buflen];
JonFreeman 3:7aaf0072cc22 54 char msg[20] = "Message 2snd\0";
JonFreeman 3:7aaf0072cc22 55 add_csum(msg);
JonFreeman 3:7aaf0072cc22 56 slave.address(0xc0);
JonFreeman 3:7aaf0072cc22 57 err = slave.write(msg, strlen(msg) + 1); // Includes null char // returns 0 on success, nz otherwise
JonFreeman 3:7aaf0072cc22 58 while (true) {
JonFreeman 3:7aaf0072cc22 59 int i = slave.receive();
JonFreeman 3:7aaf0072cc22 60 switch (i) {
JonFreeman 3:7aaf0072cc22 61 case I2CSlave::NoData: // Happens most of the time NoData - the slave has not been addressed
JonFreeman 3:7aaf0072cc22 62 osThreadYield(); // Using RTOS on this project
JonFreeman 3:7aaf0072cc22 63 break;
JonFreeman 3:7aaf0072cc22 64 case I2CSlave::ReadAddressed: // - the master has requested a read from this slave
JonFreeman 3:7aaf0072cc22 65 err = slave.write(msg, strlen(msg) + 1); // Includes null char // returns 0 on success, nz otherwise
JonFreeman 3:7aaf0072cc22 66 pc.printf("RdAddr'd ");
JonFreeman 3:7aaf0072cc22 67 break;
JonFreeman 3:7aaf0072cc22 68 case I2CSlave::WriteGeneral: // - the master is writing to all slave
JonFreeman 3:7aaf0072cc22 69 err = slave.read(buf, i2buflen); // returns 0 on success, nz otherwise
JonFreeman 3:7aaf0072cc22 70 pc.printf("i=%d, - the master is writing to all slave %s\r\n", i, buf);
JonFreeman 3:7aaf0072cc22 71 break;
JonFreeman 3:7aaf0072cc22 72 case I2CSlave::WriteAddressed: // - the master is writing to this slave
JonFreeman 3:7aaf0072cc22 73 err = slave.read(buf, i2buflen); // returns 0 on success, nz otherwise
JonFreeman 3:7aaf0072cc22 74 pc.printf("M wr-> [%s]", buf);
JonFreeman 3:7aaf0072cc22 75 for (int z = 0; z < strlen(buf); z++)
JonFreeman 3:7aaf0072cc22 76 pc.printf("%2x, ", buf[z]);
JonFreeman 3:7aaf0072cc22 77 pc.printf("cs %2x\r\n", i2c_checksumchecker(buf));
JonFreeman 3:7aaf0072cc22 78 break;
JonFreeman 3:7aaf0072cc22 79 default:
JonFreeman 3:7aaf0072cc22 80 pc.printf("Unknown I2C code %d\r\n");
JonFreeman 3:7aaf0072cc22 81 break;
JonFreeman 3:7aaf0072cc22 82 } // end of switch (i) upon result of slave.receive()
JonFreeman 3:7aaf0072cc22 83 if (err) {
JonFreeman 3:7aaf0072cc22 84 pc.printf("Err %d with i = %d\r\n", err, i);
JonFreeman 3:7aaf0072cc22 85 err = 0;
JonFreeman 3:7aaf0072cc22 86 }
JonFreeman 3:7aaf0072cc22 87 memset (buf, 0, i2buflen); // Clear buffer
JonFreeman 3:7aaf0072cc22 88 } // end of while (true)
JonFreeman 3:7aaf0072cc22 89 } // end of void i2c_handler (void const * name)
JonFreeman 0:5d0f270bfc87 90
JonFreeman 3:7aaf0072cc22 91 #endif
JonFreeman 0:5d0f270bfc87 92
JonFreeman 0:5d0f270bfc87 93
JonFreeman 0:5d0f270bfc87 94 const int goodcodes[] = {0,'a','b','c','i','j','l','r','x','y','z'}; // possible G Code options
JonFreeman 0:5d0f270bfc87 95 const int const_numofcodes = sizeof(goodcodes) / sizeof(int);
JonFreeman 0:5d0f270bfc87 96
JonFreeman 0:5d0f270bfc87 97 int find_char_in_goodcodes (int target) // Returns position of char in goodcodes[], 0 if not found.
JonFreeman 0:5d0f270bfc87 98 {
JonFreeman 0:5d0f270bfc87 99 for (int i = 1; i < const_numofcodes; i++)
JonFreeman 0:5d0f270bfc87 100 if (goodcodes[i] == target)
JonFreeman 0:5d0f270bfc87 101 return i;
JonFreeman 0:5d0f270bfc87 102 return 0;
JonFreeman 0:5d0f270bfc87 103 }
JonFreeman 0:5d0f270bfc87 104
JonFreeman 0:5d0f270bfc87 105 /*
JonFreeman 0:5d0f270bfc87 106 void get_codepositions (struct singleGparam * a, struct Gparams & p)
JonFreeman 0:5d0f270bfc87 107 Only call from "void g0g1cmdcore (struct singleGparam * a, double f_rate)"
JonFreeman 0:5d0f270bfc87 108 Purpose:
JonFreeman 0:5d0f270bfc87 109 G code line may have any number of valid axes or parameters entered in any order or position.
JonFreeman 0:5d0f270bfc87 110 This function detects any X,Y,Z,A,I,J,R entries in 'p' if present and copies values into their
JonFreeman 0:5d0f270bfc87 111 respective positions within singleGparam 'a', setting the 'changed' flag for each to true if found,
JonFreeman 0:5d0f270bfc87 112 false if not found
JonFreeman 0:5d0f270bfc87 113 struct Gparams { // Where possibly messy G code line gets ordered and sorted into
JonFreeman 0:5d0f270bfc87 114 struct singleGparam x, y, z, i, j, r, a, b, c, d; // After sorting, know where to find any X, Y etc values !
JonFreeman 0:5d0f270bfc87 115 } ;
JonFreeman 0:5d0f270bfc87 116 */
JonFreeman 0:5d0f270bfc87 117 void get_codepositions (struct singleGparam * source_array, struct Gparams & dest)
JonFreeman 0:5d0f270bfc87 118 {
JonFreeman 0:5d0f270bfc87 119 //const int goodcodes[] = {0,'a','b','c','i','j','l','r','x','y','z'}; // possible G Code options
JonFreeman 0:5d0f270bfc87 120 //const int const_numofcodes = sizeof(goodcodes) / sizeof(int);
JonFreeman 1:66ee619f206b 121 // source_array is the array filled by function 'void command_line_interpreter ()'.
JonFreeman 1:66ee619f206b 122 // It contains any parameters read from the command line :
JonFreeman 1:66ee619f206b 123 // source_array[i].c may contain 'x' or 'y' etc to tie this entry to one of the 'goodcodes' - or not
JonFreeman 0:5d0f270bfc87 124 int codecnt[const_numofcodes +1];
JonFreeman 0:5d0f270bfc87 125 int codepos[const_numofcodes +1];
JonFreeman 0:5d0f270bfc87 126 int j;
JonFreeman 0:5d0f270bfc87 127 for (j = 0; j < const_numofcodes; j++)
JonFreeman 0:5d0f270bfc87 128 codecnt[j] = codepos[j] = 0; // Zero all results
JonFreeman 0:5d0f270bfc87 129 for (int i = 1; i <= source_array[0].i; i++) { // for number of parameters passed to us here
JonFreeman 0:5d0f270bfc87 130 for(j = 0; j < const_numofcodes; j++) { // for a, for b, ... for x, then y, then z
JonFreeman 0:5d0f270bfc87 131 if (source_array[i].c == goodcodes[j]) {
JonFreeman 0:5d0f270bfc87 132 codecnt[j]++; // Count of number of 'a's, 'b's ... 'x's, 'y's, 'z's. All should be 0 or 1 but could be more
JonFreeman 0:5d0f270bfc87 133 codepos[j] = i; // Identifies the a[?] containing last incidence of goodcodes[j]
JonFreeman 0:5d0f270bfc87 134 }
JonFreeman 0:5d0f270bfc87 135 }
JonFreeman 0:5d0f270bfc87 136 }
JonFreeman 0:5d0f270bfc87 137 dest.x.changed = dest.y.changed = dest.z.changed = dest.a.changed = false;
JonFreeman 0:5d0f270bfc87 138 dest.i.changed = dest.j.changed = dest.r.changed = false;
JonFreeman 3:7aaf0072cc22 139 dest.x.flt = last_position.x.flt; // copy previous coordinates in case not re-specified
JonFreeman 3:7aaf0072cc22 140 dest.y.flt = last_position.y.flt;
JonFreeman 3:7aaf0072cc22 141 dest.z.flt = last_position.z.flt;
JonFreeman 3:7aaf0072cc22 142 dest.a.flt = last_position.a.flt;
JonFreeman 3:7aaf0072cc22 143 dest.i.flt = last_position.i.flt;
JonFreeman 3:7aaf0072cc22 144 dest.j.flt = last_position.j.flt;
JonFreeman 3:7aaf0072cc22 145 dest.r.flt = last_position.r.flt;
JonFreeman 0:5d0f270bfc87 146 j = codepos[find_char_in_goodcodes('a')];
JonFreeman 0:5d0f270bfc87 147 if (j) {
JonFreeman 0:5d0f270bfc87 148 dest.a.changed = true;
JonFreeman 3:7aaf0072cc22 149 dest.a.flt = source_array[j].flt;
JonFreeman 0:5d0f270bfc87 150 }
JonFreeman 0:5d0f270bfc87 151 j = codepos[find_char_in_goodcodes('x')];
JonFreeman 0:5d0f270bfc87 152 if (j) {
JonFreeman 0:5d0f270bfc87 153 dest.x.changed = true;
JonFreeman 3:7aaf0072cc22 154 dest.x.flt = source_array[j].flt;
JonFreeman 0:5d0f270bfc87 155 }
JonFreeman 0:5d0f270bfc87 156 j = codepos[find_char_in_goodcodes('y')];
JonFreeman 0:5d0f270bfc87 157 if (j) {
JonFreeman 0:5d0f270bfc87 158 dest.y.changed = true;
JonFreeman 3:7aaf0072cc22 159 dest.y.flt = source_array[j].flt;
JonFreeman 0:5d0f270bfc87 160 }
JonFreeman 0:5d0f270bfc87 161 j = codepos[find_char_in_goodcodes('z')];
JonFreeman 0:5d0f270bfc87 162 if (j) {
JonFreeman 0:5d0f270bfc87 163 dest.z.changed = true;
JonFreeman 3:7aaf0072cc22 164 dest.z.flt = source_array[j].flt;
JonFreeman 0:5d0f270bfc87 165 }
JonFreeman 0:5d0f270bfc87 166 j = codepos[find_char_in_goodcodes('i')];
JonFreeman 0:5d0f270bfc87 167 if (j) {
JonFreeman 0:5d0f270bfc87 168 dest.i.changed = true;
JonFreeman 3:7aaf0072cc22 169 dest.i.flt = source_array[j].flt;
JonFreeman 0:5d0f270bfc87 170 }
JonFreeman 0:5d0f270bfc87 171 j = codepos[find_char_in_goodcodes('j')];
JonFreeman 0:5d0f270bfc87 172 if (j) {
JonFreeman 0:5d0f270bfc87 173 dest.j.changed = true;
JonFreeman 3:7aaf0072cc22 174 dest.j.flt = source_array[j].flt;
JonFreeman 0:5d0f270bfc87 175 }
JonFreeman 0:5d0f270bfc87 176 j = codepos[find_char_in_goodcodes('r')];
JonFreeman 0:5d0f270bfc87 177 if (j) {
JonFreeman 0:5d0f270bfc87 178 dest.r.changed = true;
JonFreeman 3:7aaf0072cc22 179 dest.r.flt = source_array[j].flt;
JonFreeman 0:5d0f270bfc87 180 }
JonFreeman 0:5d0f270bfc87 181 }
JonFreeman 0:5d0f270bfc87 182
JonFreeman 1:66ee619f206b 183
JonFreeman 1:66ee619f206b 184 void g2g3cmdcore (struct singleGparam * source_array, int twoorthree) {
JonFreeman 1:66ee619f206b 185 struct Gparams tmp;
JonFreeman 1:66ee619f206b 186 struct pirbufgrain start_point, end_point, centre_point, next_point;
JonFreeman 1:66ee619f206b 187 int state = 0, arc_steps;
JonFreeman 3:7aaf0072cc22 188 fl_typ rad_start, rad_end, start_angle, end_angle, next_angle, swept_angle, angle_step, arc_len, z_step;
JonFreeman 1:66ee619f206b 189 if (twoorthree != 2 && twoorthree != 3) {
JonFreeman 1:66ee619f206b 190 pc.printf("Err got %d when should be 2 or 3", twoorthree);
JonFreeman 1:66ee619f206b 191 return;
JonFreeman 1:66ee619f206b 192 }
JonFreeman 1:66ee619f206b 193 if (twoorthree == 2)
JonFreeman 1:66ee619f206b 194 pc.printf("g2 Clockwise Arc\r\n");
JonFreeman 1:66ee619f206b 195 else
JonFreeman 1:66ee619f206b 196 pc.printf("g3 CounterClockwise Arc\r\n");
JonFreeman 1:66ee619f206b 197 get_codepositions (source_array, tmp); // will overwrite with new where entered
JonFreeman 1:66ee619f206b 198 pc.printf("X %s\r\n", tmp.x.changed ? "T":"F");
JonFreeman 1:66ee619f206b 199 pc.printf("Y %s\r\n", tmp.y.changed ? "T":"F");
JonFreeman 1:66ee619f206b 200 pc.printf("Z %s\r\n", tmp.z.changed ? "T":"F");
JonFreeman 1:66ee619f206b 201 pc.printf("R %s\r\n", tmp.r.changed ? "T":"F");
JonFreeman 1:66ee619f206b 202 pc.printf("I %s\r\n", tmp.i.changed ? "T":"F");
JonFreeman 1:66ee619f206b 203 pc.printf("J %s\r\n", tmp.j.changed ? "T":"F");
JonFreeman 1:66ee619f206b 204 if (!tmp.x.changed || !tmp.y.changed) state |= 0x10000; // Error, X or Y missing
JonFreeman 1:66ee619f206b 205 if (tmp.r.changed && !tmp.i.changed && !tmp.j.changed) state |= 1; // Validated R mode got R not I not J
JonFreeman 1:66ee619f206b 206 if (!tmp.r.changed && tmp.i.changed && tmp.j.changed) state |= 2; // Validated IJ mode not R got I got J
JonFreeman 3:7aaf0072cc22 207 start_point.x = last_position.x.flt;
JonFreeman 3:7aaf0072cc22 208 start_point.y = last_position.y.flt;
JonFreeman 3:7aaf0072cc22 209 start_point.z = last_position.z.flt;
JonFreeman 3:7aaf0072cc22 210 end_point.x = tmp.x.flt;
JonFreeman 3:7aaf0072cc22 211 end_point.y = tmp.y.flt;
JonFreeman 3:7aaf0072cc22 212 end_point.z = tmp.z.flt;
JonFreeman 1:66ee619f206b 213 switch (state) {
JonFreeman 1:66ee619f206b 214 case 1: // Radius format arc
JonFreeman 1:66ee619f206b 215 pc.printf("Valid Radius format arc TO DO - not yet implemeted\r\n");
JonFreeman 1:66ee619f206b 216 break;
JonFreeman 1:66ee619f206b 217 case 2: // Centre format arc ** OFFSETS ARE RELATIVE ** Abs coordinates not catered for
JonFreeman 1:66ee619f206b 218 pc.printf("Valid Centre format arc\r\n");
JonFreeman 3:7aaf0072cc22 219 centre_point.x = start_point.x + tmp.i.flt;
JonFreeman 3:7aaf0072cc22 220 centre_point.y = start_point.y + tmp.j.flt;
JonFreeman 1:66ee619f206b 221 rad_start = hypot(start_point.x - centre_point.x, start_point.y - centre_point.y);
JonFreeman 1:66ee619f206b 222 rad_end = hypot(end_point.x - centre_point.x, end_point.y - centre_point.y);
JonFreeman 1:66ee619f206b 223 pc.printf("Start point X %.3f, Y %.3f\r\n", start_point.x, start_point.y);
JonFreeman 1:66ee619f206b 224 pc.printf("Centre point X %.3f, Y %.3f\r\n", centre_point.x, centre_point.y);
JonFreeman 1:66ee619f206b 225 pc.printf("End point X %.3f, Y %.3f\r\n", end_point.x, end_point.y);
JonFreeman 1:66ee619f206b 226 pc.printf("Rad start %.3f, Rad end %.3f\r\n", rad_start, rad_end);
JonFreeman 1:66ee619f206b 227 if (fabs(rad_start - rad_end) > 0.001) {
JonFreeman 1:66ee619f206b 228 // if ((rad_start - rad_end) > 0.001 || (rad_start - rad_end) < -0.001) {
JonFreeman 1:66ee619f206b 229 state |= 0x20000;
JonFreeman 1:66ee619f206b 230 pc.printf("Radii mismatch error in g2g3\r\n");
JonFreeman 1:66ee619f206b 231 }
JonFreeman 1:66ee619f206b 232 start_angle = atan2(start_point.y - centre_point.y, start_point.x - centre_point.x);
JonFreeman 1:66ee619f206b 233 end_angle = atan2(end_point.y - centre_point.y, end_point.x - centre_point.x);
JonFreeman 1:66ee619f206b 234 swept_angle = end_angle - start_angle;
JonFreeman 1:66ee619f206b 235 //swept_angle = 0.0; //=IF((B$8=2);IF((H$24>-0.0001);(H$24-2*PI());(H$24))
JonFreeman 1:66ee619f206b 236 // ;IF((H$24>0.0001);(H$24);(H$24+2*PI())))
JonFreeman 1:66ee619f206b 237 if (twoorthree == 2) {
JonFreeman 1:66ee619f206b 238 if (swept_angle > -epsilon)
JonFreeman 1:66ee619f206b 239 swept_angle -= TWO_PI;
JonFreeman 1:66ee619f206b 240 }
JonFreeman 1:66ee619f206b 241 else { // twoorthree is 3
JonFreeman 1:66ee619f206b 242 if (!(swept_angle > epsilon))
JonFreeman 1:66ee619f206b 243 swept_angle += TWO_PI;
JonFreeman 1:66ee619f206b 244 }
JonFreeman 1:66ee619f206b 245 arc_len = fabs(rad_start * swept_angle);
JonFreeman 1:66ee619f206b 246 pc.printf("start_angle %.3f, end_angle %.3f, swept_angle %.3f, arc_len %.3f\r\n", start_angle, end_angle, swept_angle, arc_len);
JonFreeman 1:66ee619f206b 247 arc_steps = (int)(4.0 + fabs(1.7 * rad_end * swept_angle)); // fiddle factors adjusted empirically !
JonFreeman 1:66ee619f206b 248 angle_step = swept_angle / arc_steps;
JonFreeman 1:66ee619f206b 249 next_angle = start_angle;
JonFreeman 1:66ee619f206b 250 z_step = (end_point.z - start_point.z) / arc_steps;
JonFreeman 1:66ee619f206b 251 next_point.z = start_point.z;
JonFreeman 1:66ee619f206b 252 pc.printf("Number of steps = %d, angle_step %.3f\r\n", arc_steps, angle_step);
JonFreeman 1:66ee619f206b 253 for (int i = 0; i < arc_steps; i++) { // cut 'arc_steps' straight lines
JonFreeman 1:66ee619f206b 254 next_angle += angle_step;
JonFreeman 1:66ee619f206b 255 next_point.x = centre_point.x + (rad_start * cos(next_angle));
JonFreeman 1:66ee619f206b 256 next_point.y = centre_point.y + (rad_start * sin(next_angle));
JonFreeman 1:66ee619f206b 257 next_point.z += z_step;
JonFreeman 1:66ee619f206b 258 pc.printf("X %.3f, Y %.3f\r\n", next_point.x, next_point.y);
JonFreeman 1:66ee619f206b 259 Thread::wait(300);
JonFreeman 2:b3c668ec43ac 260 next_point.f_rate = feed_rate;
JonFreeman 2:b3c668ec43ac 261 move_to_XYZ (next_point);
JonFreeman 1:66ee619f206b 262 }
JonFreeman 1:66ee619f206b 263 break; // end of case 2: // Centre format arc ** OFFSETS ARE RELATIVE ** Abs coordinates not catered for
JonFreeman 1:66ee619f206b 264 default: // Input error detected
JonFreeman 1:66ee619f206b 265 pc.printf("Input error detected in g2g3, code %x\r\n", state);
JonFreeman 1:66ee619f206b 266 break;
JonFreeman 1:66ee619f206b 267 } // end of switch(state)
JonFreeman 1:66ee619f206b 268 }
JonFreeman 0:5d0f270bfc87 269
JonFreeman 3:7aaf0072cc22 270 void g0g1cmdcore (struct singleGparam * source_array, fl_typ f_rate) // Updates any / all of x, y, z NCOs
JonFreeman 1:66ee619f206b 271 { // Only get here when some G0 or G1 input has been read. G0 or G1 determined by f_rate
JonFreeman 2:b3c668ec43ac 272 struct pirbufgrain ins;//, outs;
JonFreeman 1:66ee619f206b 273 struct Gparams tmp;
JonFreeman 1:66ee619f206b 274 get_codepositions (source_array, tmp); // will overwrite with new where entered
JonFreeman 1:66ee619f206b 275 if (!tmp.x.changed && !tmp.y.changed && !tmp.z.changed) {
JonFreeman 1:66ee619f206b 276 pc.printf("No change in X, Y or Z in G0/G1. Ignoring\r\n");
JonFreeman 1:66ee619f206b 277 return;
JonFreeman 1:66ee619f206b 278 }
JonFreeman 3:7aaf0072cc22 279 ins.x = tmp.x.flt;
JonFreeman 3:7aaf0072cc22 280 ins.y = tmp.y.flt;
JonFreeman 3:7aaf0072cc22 281 ins.z = tmp.z.flt;
JonFreeman 1:66ee619f206b 282 ins.f_rate = f_rate;
JonFreeman 2:b3c668ec43ac 283 move_to_XYZ (ins);
JonFreeman 0:5d0f270bfc87 284 }
JonFreeman 0:5d0f270bfc87 285
JonFreeman 0:5d0f270bfc87 286 void g0cmd (struct singleGparam * a) // Updates any / all of x, y, z NCOs
JonFreeman 0:5d0f270bfc87 287 {
JonFreeman 0:5d0f270bfc87 288 g0g1cmdcore (a, feed_rate_max); // Defined parameter in code
JonFreeman 0:5d0f270bfc87 289 }
JonFreeman 0:5d0f270bfc87 290
JonFreeman 0:5d0f270bfc87 291 void g1cmd (struct singleGparam * a) // Updates any / all of x, y, z NCOs
JonFreeman 0:5d0f270bfc87 292 {
JonFreeman 0:5d0f270bfc87 293 g0g1cmdcore (a, feed_rate); // Settable feed_rate
JonFreeman 0:5d0f270bfc87 294 }
JonFreeman 0:5d0f270bfc87 295
JonFreeman 2:b3c668ec43ac 296 void g2cmd (struct singleGparam * a) { // Clockwise arc
JonFreeman 2:b3c668ec43ac 297 g2g3cmdcore (a, 2);
JonFreeman 2:b3c668ec43ac 298 }
JonFreeman 2:b3c668ec43ac 299
JonFreeman 2:b3c668ec43ac 300 void g3cmd (struct singleGparam * a) { // Counter clockwise arc
JonFreeman 2:b3c668ec43ac 301 g2g3cmdcore (a, 3);
JonFreeman 2:b3c668ec43ac 302 }
JonFreeman 2:b3c668ec43ac 303
JonFreeman 1:66ee619f206b 304 void fcmd (struct singleGparam * a) { // Set Feed Rate command
JonFreeman 3:7aaf0072cc22 305 if (a[1].flt < 0.0) {
JonFreeman 3:7aaf0072cc22 306 pc.printf("feed rate %.1f ? Setting to 0\r\n", a[1].flt);
JonFreeman 3:7aaf0072cc22 307 a[1].flt = 0.0;
JonFreeman 1:66ee619f206b 308 }
JonFreeman 3:7aaf0072cc22 309 if (a[1].flt > feed_rate_max) {
JonFreeman 3:7aaf0072cc22 310 pc.printf ("Error, can't set feed rate to %.1f, max is %.1f, ", a[1].flt, feed_rate_max);
JonFreeman 3:7aaf0072cc22 311 a[1].flt = feed_rate_max;
JonFreeman 0:5d0f270bfc87 312 }
JonFreeman 3:7aaf0072cc22 313 pc.printf ("Setting feed_rate to %.1f\r\n", a[1].flt);
JonFreeman 3:7aaf0072cc22 314 feed_rate = a[1].flt;
JonFreeman 0:5d0f270bfc87 315 }
JonFreeman 3:7aaf0072cc22 316 extern void spindle_control (signed long ss) ;
JonFreeman 2:b3c668ec43ac 317 extern bool spindle_running () ;
JonFreeman 0:5d0f270bfc87 318
JonFreeman 2:b3c668ec43ac 319 void M3cmd (struct singleGparam * a) { spindle_control (spindle_rpm); }
JonFreeman 3:7aaf0072cc22 320 void M5cmd (struct singleGparam * a) { spindle_control (0); }
JonFreeman 0:5d0f270bfc87 321
JonFreeman 0:5d0f270bfc87 322 void scmd (struct singleGparam * a) {
JonFreeman 3:7aaf0072cc22 323 if (fabs(a[1].flt) > spindle_max) {
JonFreeman 3:7aaf0072cc22 324 pc.printf ("Errror setting spindle RPM, can't set to %.0f, ignoring request\r\n", a[1].flt);
JonFreeman 2:b3c668ec43ac 325 return;
JonFreeman 0:5d0f270bfc87 326 }
JonFreeman 3:7aaf0072cc22 327 pc.printf ("Setting spindle RPM to %.0f Can set Pos or Neg for fwd/rev\r\n", a[1].flt);
JonFreeman 3:7aaf0072cc22 328 spindle_rpm = (signed long) a[1].flt;
JonFreeman 2:b3c668ec43ac 329 if (spindle_running())
JonFreeman 2:b3c668ec43ac 330 spindle_control (spindle_rpm);
JonFreeman 3:7aaf0072cc22 331 pc.printf("Readback ss %d\r\n", spindle_rpm);
JonFreeman 0:5d0f270bfc87 332 }
JonFreeman 0:5d0f270bfc87 333
JonFreeman 2:b3c668ec43ac 334 extern void target_cmd (struct singleGparam * a) ;
JonFreeman 2:b3c668ec43ac 335
JonFreeman 2:b3c668ec43ac 336 void stopcmd (struct singleGparam * a) {pc.printf("Stop ! er, not working yet\r\n");}
JonFreeman 3:7aaf0072cc22 337 //void m1cmd (struct singleGparam * a) {pc.printf("m1 Optional Programme Stop\r\n");}
JonFreeman 3:7aaf0072cc22 338 //void m3cmd (struct singleGparam * a) {pc.printf("m3 Rotate Spindle Clockwise\r\n");}
JonFreeman 3:7aaf0072cc22 339 //void m4cmd (struct singleGparam * a) {pc.printf("m4 Rotate Spindle Counter Clockwise\r\n");}
JonFreeman 3:7aaf0072cc22 340 //void m5cmd (struct singleGparam * a) {pc.printf("m5 Stop Spindle\r\n");}
JonFreeman 0:5d0f270bfc87 341 /*void m30cmd (struct singleGparam * a) {pc.printf("m30 Programme End and Rewind\r\n");}
JonFreeman 0:5d0f270bfc87 342 void m47cmd (struct singleGparam * a) {pc.printf("m47 Repeat Prog from First Line\r\n");}
JonFreeman 0:5d0f270bfc87 343 void m48cmd (struct singleGparam * a) {pc.printf("m48 Enable Speed and Feed Override\r\n");}
JonFreeman 0:5d0f270bfc87 344 void m49cmd (struct singleGparam * a) {pc.printf("m49 Disable Speed and Feed Override\r\n");}
JonFreeman 0:5d0f270bfc87 345 void m98cmd (struct singleGparam * a) {pc.printf("m98 Call Subroutine\r\n");}
JonFreeman 0:5d0f270bfc87 346 void m99cmd (struct singleGparam * a) {pc.printf("m99 Return from Subroutine\r\n");}
JonFreeman 0:5d0f270bfc87 347 void g10cmd (struct singleGparam * a) {pc.printf("g10 Coord System Origin Set\r\n");}
JonFreeman 0:5d0f270bfc87 348 void g17cmd (struct singleGparam * a) {pc.printf("g17 XY Plane Select\r\n");}
JonFreeman 0:5d0f270bfc87 349 void g20cmd (struct singleGparam * a) {pc.printf("g20 Inch\r\n");}
JonFreeman 0:5d0f270bfc87 350 void g21cmd (struct singleGparam * a) {pc.printf("g21 mm\r\n");}
JonFreeman 0:5d0f270bfc87 351
JonFreeman 0:5d0f270bfc87 352 void g40cmd (struct singleGparam * a) {pc.printf("g40 Cutter Compensation Off\r\n");}
JonFreeman 0:5d0f270bfc87 353 void g50cmd (struct singleGparam * a) {pc.printf("g50 Reset Scale Factors\r\n");}
JonFreeman 0:5d0f270bfc87 354 void g53cmd (struct singleGparam * a) {pc.printf("g53 Move in Absolute Coordinates\r\n");}
JonFreeman 0:5d0f270bfc87 355 void g90cmd (struct singleGparam * a) {pc.printf("g90 Absolute Distance Mode\r\n");}
JonFreeman 0:5d0f270bfc87 356 */
JonFreeman 2:b3c668ec43ac 357 //void g4cmd (struct singleGparam * a) {pc.printf("g4 Dwell\r\n");}
JonFreeman 2:b3c668ec43ac 358 //void g91p1cmd (struct singleGparam * a) {pc.printf("g91.1 \r\n");}
JonFreeman 0:5d0f270bfc87 359
JonFreeman 2:b3c668ec43ac 360 //void report_inputs () {
JonFreeman 2:b3c668ec43ac 361 void report_ins_cmd (struct singleGparam * a) {
JonFreeman 2:b3c668ec43ac 362 report_inputs();
JonFreeman 2:b3c668ec43ac 363 }
JonFreeman 3:7aaf0072cc22 364 extern void lissajous (fl_typ) ;
JonFreeman 2:b3c668ec43ac 365
JonFreeman 1:66ee619f206b 366 void lisscmd (struct singleGparam * a) {
JonFreeman 2:b3c668ec43ac 367 lissajous (feed_rate);
JonFreeman 1:66ee619f206b 368 }
JonFreeman 0:5d0f270bfc87 369
JonFreeman 0:5d0f270bfc87 370 void menucmd (struct singleGparam * a);
JonFreeman 1:66ee619f206b 371 struct kb_command {
JonFreeman 0:5d0f270bfc87 372 const char * cmd_word; // points to text e.g. "menu"
JonFreeman 0:5d0f270bfc87 373 const char * explan;
JonFreeman 0:5d0f270bfc87 374 void (*f)(struct singleGparam *); // points to function
JonFreeman 1:66ee619f206b 375 } ;
JonFreeman 1:66ee619f206b 376
JonFreeman 1:66ee619f206b 377 struct kb_command const * command_list_ptr = NULL; // Pointer switched between 'input_syntax_check' and 'command_execute'
JonFreeman 1:66ee619f206b 378
JonFreeman 1:66ee619f206b 379 struct kb_command const input_syntax_check [] = {
JonFreeman 1:66ee619f206b 380 {"menu", "Lists available commands, same as ls", menucmd},
JonFreeman 1:66ee619f206b 381 {"ls", "Lists available commands, same as menu", menucmd}
JonFreeman 1:66ee619f206b 382 } ;
JonFreeman 1:66ee619f206b 383
JonFreeman 1:66ee619f206b 384 struct kb_command const command_execute[] = {
JonFreeman 1:66ee619f206b 385 {"menu", "Lists available commands, same as ls", menucmd},
JonFreeman 1:66ee619f206b 386 {"ls", "Lists available commands, same as menu", menucmd},
JonFreeman 0:5d0f270bfc87 387 {"stop", "To Stop the Machine !", stopcmd},
JonFreeman 0:5d0f270bfc87 388 {"f ", "To set Feed Rate mm/min, e.g. f 25", fcmd},
JonFreeman 0:5d0f270bfc87 389 {"s ", "To set Spindle RPM, e.g. S 1250", scmd},
JonFreeman 2:b3c668ec43ac 390 {"m3", "Start Spindle at last 'S'", M3cmd},
JonFreeman 2:b3c668ec43ac 391 {"m5", "Stop Spindle", M5cmd},
JonFreeman 1:66ee619f206b 392 {"g0", "Rapid move", g0cmd},
JonFreeman 1:66ee619f206b 393 {"g1", "Linear Interpolation - move straight at current feed rate", g1cmd},
JonFreeman 1:66ee619f206b 394 {"g2", "Helical Interpolation CW (Arc, circle)", g2cmd},
JonFreeman 1:66ee619f206b 395 {"g3", "Helical Interpolation CCW (Arc, circle)", g3cmd},
JonFreeman 2:b3c668ec43ac 396 {"liss", "Run Lissajous pattern generator", lisscmd},
JonFreeman 2:b3c668ec43ac 397 {"flags", "Report System Flags", flags_report_cmd},
JonFreeman 2:b3c668ec43ac 398 {"inputs", "Report State of Input bits", report_ins_cmd},
JonFreeman 2:b3c668ec43ac 399 {"target", "Identify computer device", target_cmd},
JonFreeman 0:5d0f270bfc87 400 };
JonFreeman 3:7aaf0072cc22 401
JonFreeman 1:66ee619f206b 402 int numof_menu_items;
JonFreeman 0:5d0f270bfc87 403 void menucmd (struct singleGparam * a)
JonFreeman 0:5d0f270bfc87 404 {
JonFreeman 0:5d0f270bfc87 405 pc.printf("At menucmd function - listing commands:-\r\n");
JonFreeman 0:5d0f270bfc87 406 for(int i = 0; i < numof_menu_items; i++)
JonFreeman 1:66ee619f206b 407 pc.printf("[%s]\t\t%s\r\n", command_list_ptr[i].cmd_word, command_list_ptr[i].explan);
JonFreeman 0:5d0f270bfc87 408 pc.printf("End of List of Commands\r\n");
JonFreeman 0:5d0f270bfc87 409 }
JonFreeman 0:5d0f270bfc87 410
JonFreeman 0:5d0f270bfc87 411
JonFreeman 3:7aaf0072cc22 412 void nudger (int code) { // Allows <Ctrl> chars to nudge machine axes
JonFreeman 2:b3c668ec43ac 413 // Using <Ctrl>+ 'F', 'B' for Y, 'L', 'R' for X, 'U', 'D' for Z
JonFreeman 2:b3c668ec43ac 414 // 6 2 12 18 21 4
JonFreeman 2:b3c668ec43ac 415 struct pirbufgrain dest;
JonFreeman 3:7aaf0072cc22 416 dest.x = last_position.x.flt;
JonFreeman 3:7aaf0072cc22 417 dest.y = last_position.y.flt;
JonFreeman 3:7aaf0072cc22 418 dest.z = last_position.z.flt;
JonFreeman 2:b3c668ec43ac 419 dest.f_rate = feed_rate;
JonFreeman 2:b3c668ec43ac 420 switch (code) {
JonFreeman 2:b3c668ec43ac 421 case 6: // 'F' move -Y
JonFreeman 2:b3c668ec43ac 422 dest.y -= 0.1;
JonFreeman 2:b3c668ec43ac 423 break;
JonFreeman 2:b3c668ec43ac 424 case 2: // 'B' move +Y
JonFreeman 2:b3c668ec43ac 425 dest.y += 0.1;
JonFreeman 2:b3c668ec43ac 426 break;
JonFreeman 2:b3c668ec43ac 427 case 12: // 'L' move +X
JonFreeman 2:b3c668ec43ac 428 dest.x += 0.1;
JonFreeman 2:b3c668ec43ac 429 break;
JonFreeman 2:b3c668ec43ac 430 case 18: // 'R' move -X
JonFreeman 2:b3c668ec43ac 431 dest.x -= 0.1;
JonFreeman 2:b3c668ec43ac 432 break;
JonFreeman 2:b3c668ec43ac 433 case 21: // 'U' move +Z
JonFreeman 2:b3c668ec43ac 434 dest.z += 0.1;
JonFreeman 2:b3c668ec43ac 435 break;
JonFreeman 2:b3c668ec43ac 436 case 4: // 'D' move -Z
JonFreeman 2:b3c668ec43ac 437 dest.z -= 0.1;
JonFreeman 2:b3c668ec43ac 438 default:
JonFreeman 2:b3c668ec43ac 439 break;
JonFreeman 2:b3c668ec43ac 440 } // end of switch
JonFreeman 2:b3c668ec43ac 441 move_to_XYZ (dest);
JonFreeman 2:b3c668ec43ac 442 }
JonFreeman 2:b3c668ec43ac 443
JonFreeman 0:5d0f270bfc87 444 ////class CLI {
JonFreeman 0:5d0f270bfc87 445
JonFreeman 0:5d0f270bfc87 446 /*
JonFreeman 0:5d0f270bfc87 447 void command_line_interpreter ()
JonFreeman 0:5d0f270bfc87 448 Purpose:
JonFreeman 0:5d0f270bfc87 449
JonFreeman 0:5d0f270bfc87 450 */
JonFreeman 3:7aaf0072cc22 451
JonFreeman 1:66ee619f206b 452 void command_line_interpreter (void const * name)
JonFreeman 0:5d0f270bfc87 453 {
JonFreeman 1:66ee619f206b 454 const int MAX_PARAMS = 10, MAX_CMD_LEN = 120;
JonFreeman 1:66ee619f206b 455 static char cmd_line[MAX_CMD_LEN + 4];
JonFreeman 1:66ee619f206b 456 static struct singleGparam params[MAX_PARAMS + 1];
JonFreeman 1:66ee619f206b 457 static int cl_index = 0, lastalpha = 0;
JonFreeman 3:7aaf0072cc22 458 static fl_typ fracmul;
JonFreeman 1:66ee619f206b 459 if (true) {
JonFreeman 1:66ee619f206b 460 command_list_ptr = command_execute;
JonFreeman 1:66ee619f206b 461 numof_menu_items = sizeof(command_execute) / sizeof(kb_command);
JonFreeman 1:66ee619f206b 462 }
JonFreeman 1:66ee619f206b 463 else {
JonFreeman 1:66ee619f206b 464 command_list_ptr = input_syntax_check;
JonFreeman 1:66ee619f206b 465 numof_menu_items = sizeof(input_syntax_check) / sizeof(kb_command);
JonFreeman 1:66ee619f206b 466 }
JonFreeman 1:66ee619f206b 467 while (true) {
JonFreeman 1:66ee619f206b 468 while (pc.readable()) {
JonFreeman 1:66ee619f206b 469 int ch;
JonFreeman 1:66ee619f206b 470 if (cl_index > MAX_CMD_LEN) { // trap out stupidly long command lines
JonFreeman 1:66ee619f206b 471 pc.printf ("Keyboard Error!! Killing stupidly long command line");
JonFreeman 1:66ee619f206b 472 cl_index = 0;
JonFreeman 1:66ee619f206b 473 }
JonFreeman 1:66ee619f206b 474 ch = tolower(pc.getc());
JonFreeman 2:b3c668ec43ac 475 if (ch == '\r' || ch >= ' ' && ch <= 'z')
JonFreeman 2:b3c668ec43ac 476 pc.printf("%c", ch);
JonFreeman 2:b3c668ec43ac 477 else { // Using <Ctrl>+ 'F', 'B' for Y, 'L', 'R' for X, 'U', 'D' for Z
JonFreeman 2:b3c668ec43ac 478 cl_index = 0; // 6 2 12 18 21 4
JonFreeman 2:b3c668ec43ac 479 pc.printf("[%d]", ch);
JonFreeman 2:b3c668ec43ac 480 nudger (ch);
JonFreeman 2:b3c668ec43ac 481 }
JonFreeman 1:66ee619f206b 482 if(ch != '\r') // was this the 'Enter' key?
JonFreeman 1:66ee619f206b 483 cmd_line[cl_index++] = ch; // added char to command being assembled
JonFreeman 1:66ee619f206b 484 else { // key was CR, may or may not be command to lookup
JonFreeman 1:66ee619f206b 485 cmd_line[cl_index] = 0; // null terminate command string
JonFreeman 1:66ee619f206b 486 if(cl_index) { // If have got some chars to lookup
JonFreeman 1:66ee619f206b 487 int i, wrdlen;
JonFreeman 1:66ee619f206b 488 for (i = 0; i < numof_menu_items; i++) { // Look for input match in command list
JonFreeman 1:66ee619f206b 489 wrdlen = strlen(command_list_ptr[i].cmd_word);
JonFreeman 1:66ee619f206b 490 if(strncmp(command_list_ptr[i].cmd_word, cmd_line, wrdlen) == 0) { // If match found
JonFreeman 1:66ee619f206b 491 bool negflag = false;
JonFreeman 1:66ee619f206b 492 int state = 0, paramindex;
JonFreeman 1:66ee619f206b 493 // pc.printf("Found match for word [%s]\r\n", kbc[i].wrd);
JonFreeman 1:66ee619f206b 494 for(paramindex = 0; paramindex < MAX_PARAMS; paramindex++) {
JonFreeman 1:66ee619f206b 495 // Clear out whole set of old parameters ready for anything new on this line
JonFreeman 1:66ee619f206b 496 params[paramindex].i = 0; // for integer parameters
JonFreeman 1:66ee619f206b 497 params[paramindex].c = 0; // for last alpha char, helps tie 'X' to '-23.5' etc
JonFreeman 3:7aaf0072cc22 498 params[paramindex].flt = 0.0; // for floating point parameters
JonFreeman 1:66ee619f206b 499 params[paramindex].ul = 0;
JonFreeman 1:66ee619f206b 500 params[paramindex].changed = false;
JonFreeman 1:66ee619f206b 501 }
JonFreeman 1:66ee619f206b 502 paramindex = 0;
JonFreeman 1:66ee619f206b 503 // read any parameters from command line here
JonFreeman 1:66ee619f206b 504 // Using parameters[0] as count of parameters to follow
JonFreeman 1:66ee619f206b 505 while (wrdlen <= cl_index) {
JonFreeman 1:66ee619f206b 506 ch = cmd_line[wrdlen++];
JonFreeman 1:66ee619f206b 507 if(isalpha(ch)) lastalpha = ch;
JonFreeman 1:66ee619f206b 508 if(ch == '-') negflag = true;
JonFreeman 1:66ee619f206b 509 if(ch == '+') negflag = false;
JonFreeman 1:66ee619f206b 510 switch (state) {
JonFreeman 1:66ee619f206b 511 case 0: // looking for start of a number string
JonFreeman 1:66ee619f206b 512 if(isdigit(ch)) { // found first digit of a number string
JonFreeman 1:66ee619f206b 513 paramindex++;
JonFreeman 1:66ee619f206b 514 if(paramindex > MAX_PARAMS) {
JonFreeman 1:66ee619f206b 515 wrdlen = cl_index; // exit condition
JonFreeman 1:66ee619f206b 516 pc.printf("WARNING - too many parameters, ignoring extra\r\n");
JonFreeman 1:66ee619f206b 517 } else {
JonFreeman 1:66ee619f206b 518 params[paramindex].i = ch - '0';
JonFreeman 1:66ee619f206b 519 params[paramindex].c = lastalpha;
JonFreeman 1:66ee619f206b 520 state = 1; // Found first digit char of number string
JonFreeman 1:66ee619f206b 521 }
JonFreeman 0:5d0f270bfc87 522 }
JonFreeman 1:66ee619f206b 523 break;
JonFreeman 1:66ee619f206b 524 case 1: // looking for end of a number string
JonFreeman 1:66ee619f206b 525 if(isdigit(ch)) { // accumulating integer from string
JonFreeman 1:66ee619f206b 526 params[paramindex].i *= 10;
JonFreeman 1:66ee619f206b 527 params[paramindex].i += ch - '0';
JonFreeman 1:66ee619f206b 528 } else { // found non-digit terminating number
JonFreeman 1:66ee619f206b 529 if (ch == '.') {
JonFreeman 1:66ee619f206b 530 state = 2;
JonFreeman 1:66ee619f206b 531 fracmul = 0.1;
JonFreeman 3:7aaf0072cc22 532 params[paramindex].flt = (fl_typ)params[paramindex].i;
JonFreeman 1:66ee619f206b 533 } else {
JonFreeman 1:66ee619f206b 534 params[0].i++; // count of validated parameters
JonFreeman 1:66ee619f206b 535 state = 0; // Have read past last digit of number string
JonFreeman 1:66ee619f206b 536 if(negflag) {
JonFreeman 1:66ee619f206b 537 params[paramindex].i = -params[paramindex].i;
JonFreeman 1:66ee619f206b 538 negflag = false;
JonFreeman 1:66ee619f206b 539 }
JonFreeman 3:7aaf0072cc22 540 params[paramindex].flt = (fl_typ)params[paramindex].i;
JonFreeman 1:66ee619f206b 541 }
JonFreeman 1:66ee619f206b 542 }
JonFreeman 1:66ee619f206b 543 break;
JonFreeman 1:66ee619f206b 544 case 2: // looking for fractional part of double
JonFreeman 1:66ee619f206b 545 if(isdigit(ch)) { // accumulating fractional part from string
JonFreeman 3:7aaf0072cc22 546 params[paramindex].flt += (fl_typ)((ch - '0') * fracmul);
JonFreeman 1:66ee619f206b 547 fracmul /= 10.0;
JonFreeman 1:66ee619f206b 548 } else { // found non-digit terminating double precision number
JonFreeman 0:5d0f270bfc87 549 params[0].i++; // count of validated parameters
JonFreeman 0:5d0f270bfc87 550 state = 0; // Have read past last digit of number string
JonFreeman 0:5d0f270bfc87 551 if(negflag) {
JonFreeman 0:5d0f270bfc87 552 params[paramindex].i = -params[paramindex].i;
JonFreeman 3:7aaf0072cc22 553 params[paramindex].flt = -params[paramindex].flt;
JonFreeman 0:5d0f270bfc87 554 negflag = false;
JonFreeman 0:5d0f270bfc87 555 }
JonFreeman 0:5d0f270bfc87 556 }
JonFreeman 1:66ee619f206b 557 break;
JonFreeman 1:66ee619f206b 558 default:
JonFreeman 1:66ee619f206b 559 break;
JonFreeman 1:66ee619f206b 560 } // end of switch state
JonFreeman 1:66ee619f206b 561 } // end of while wrdlen < cl_index
JonFreeman 1:66ee619f206b 562 // pc.printf("Found match to [%s] with %d parameters\r\n", command_list_ptr[i].wrd, paramindex);
JonFreeman 1:66ee619f206b 563 command_list_ptr[i].f(params); // execute command
JonFreeman 1:66ee619f206b 564 i = numof_menu_items + 1; // to exit for loop
JonFreeman 1:66ee619f206b 565 }
JonFreeman 1:66ee619f206b 566 } // End of for numof_menu_items
JonFreeman 1:66ee619f206b 567 if(i == numof_menu_items)
JonFreeman 1:66ee619f206b 568 pc.printf("No Match Found for CMD [%s]\r\n", cmd_line);
JonFreeman 1:66ee619f206b 569 } // End of If have got some chars to lookup
JonFreeman 2:b3c668ec43ac 570 pc.printf("\r\n>");
JonFreeman 1:66ee619f206b 571 cl_index = lastalpha = 0;
JonFreeman 1:66ee619f206b 572 } // End of else key was CR, may or may not be command to lookup
JonFreeman 1:66ee619f206b 573 } // End of while (pc.readable())
JonFreeman 1:66ee619f206b 574 osThreadYield(); // Using RTOS on this project
JonFreeman 1:66ee619f206b 575 }
JonFreeman 0:5d0f270bfc87 576 }
JonFreeman 0:5d0f270bfc87 577
JonFreeman 0:5d0f270bfc87 578 ////} cli;
JonFreeman 0:5d0f270bfc87 579