Code for 'Smart Regulator' featured in 'Model Engineer', November 2020 on. Contains all work to August 2020 including all code described. Top level algorithm development is quite spares, leaving some work for you! Any questions - jon@jons-workshop.com

Dependencies:   mbed BufferedSerial Servo2 PCT2075 I2CEeprom FastPWM

Committer:
JonFreeman
Date:
Mon Jul 27 08:44:59 2020 +0000
Revision:
3:43cb067ecd00
Parent:
2:8e7b51353f32
Child:
5:6ca3e7ffc553
End of July after good day out at Ashton Court

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JonFreeman 0:77803b3ee157 1 /*
JonFreeman 0:77803b3ee157 2 Command Line Interpreter code module.
JonFreeman 0:77803b3ee157 3 Purpose -
JonFreeman 0:77803b3ee157 4 Provides easy interface to pc terminal programme for use during programme development, debug etc.
JonFreeman 0:77803b3ee157 5 Also usable as comms subsystem in finished code for accepting commands, reporting data etc.
JonFreeman 0:77803b3ee157 6 */
JonFreeman 0:77803b3ee157 7 #include "mbed.h"
JonFreeman 3:43cb067ecd00 8 #include "field.h"
JonFreeman 0:77803b3ee157 9 #include "Alternator.h"
JonFreeman 3:43cb067ecd00 10 #include "BufferedSerial.h"
JonFreeman 0:77803b3ee157 11 #include <cctype>
JonFreeman 0:77803b3ee157 12 using namespace std;
JonFreeman 0:77803b3ee157 13
JonFreeman 3:43cb067ecd00 14 ee_settings_2020 user_settings ;
JonFreeman 0:77803b3ee157 15
JonFreeman 3:43cb067ecd00 16 extern BufferedSerial pc;
JonFreeman 3:43cb067ecd00 17 extern void maketable () ;
JonFreeman 1:450090bdb6f4 18 extern void query_system (struct parameters & a) ;
JonFreeman 0:77803b3ee157 19 extern uint32_t ReadEngineRPM () ;
JonFreeman 3:43cb067ecd00 20 extern double Read_Link_Volts () ;
JonFreeman 3:43cb067ecd00 21 extern double Read_Field_Volts () ;
JonFreeman 3:43cb067ecd00 22 extern double Read_Ammeter () ;
JonFreeman 1:450090bdb6f4 23
JonFreeman 3:43cb067ecd00 24 //bool ee_settings_2020::wr (char c, uint32_t i) { // Write one setup char value to private buffer 'settings'
JonFreeman 3:43cb067ecd00 25 /*
JonFreeman 3:43cb067ecd00 26 void slope_cmd (struct parameters & a) {
JonFreeman 3:43cb067ecd00 27 Provides a quick way of filling lookup table.
JonFreeman 3:43cb067ecd00 28 Sets percent at 3000 RPM with first parameter 0 to 100
JonFreeman 3:43cb067ecd00 29 */
JonFreeman 3:43cb067ecd00 30 void slope_cmd (struct parameters & a) { // Requires two params. First %@ 3000 rpm, second slope MAX +/-20 % per krpm above
JonFreeman 3:43cb067ecd00 31 const int startat = 1800; // rpm to start at
JonFreeman 3:43cb067ecd00 32 const int rpm_per = 200; // rpm per lookup table step
JonFreeman 3:43cb067ecd00 33 const int threshold = startat / rpm_per;
JonFreeman 3:43cb067ecd00 34 signed char at_power_beyond, slope;
JonFreeman 3:43cb067ecd00 35 pc.printf ("Slope - set pct = %d @ 3krpm, slope %d pct above\r\n", (int32_t)a.dbl[0], (int32_t)a.dbl[1]);
JonFreeman 3:43cb067ecd00 36 if (a.numof_dbls != 2)
JonFreeman 3:43cb067ecd00 37 pc.printf ("Need 2 params in slope, got %d, ", a.numof_dbls);
JonFreeman 3:43cb067ecd00 38 else {
JonFreeman 3:43cb067ecd00 39 pc.printf ("Got slope params %.1f, %.1f\r\n", a.dbl[0], a.dbl[1]);
JonFreeman 3:43cb067ecd00 40 if (a.dbl[0] > 100.0) a.dbl[0] = 100.0;
JonFreeman 3:43cb067ecd00 41 if (a.dbl[0] < 0.0) a.dbl[0] = 0.0;
JonFreeman 3:43cb067ecd00 42 if (a.dbl[1] > +20.0) a.dbl[1] = +20.0;
JonFreeman 3:43cb067ecd00 43 if (a.dbl[1] < -20.0) a.dbl[1] = -20.0;
JonFreeman 3:43cb067ecd00 44 at_power_beyond = (signed char)a.dbl[0];
JonFreeman 3:43cb067ecd00 45 slope = (signed char)a.dbl[1];
JonFreeman 3:43cb067ecd00 46 pc.printf ("Setting slope ");
JonFreeman 3:43cb067ecd00 47 for (int i = 0; i < threshold; i++) { // Zero all very low speed settings
JonFreeman 3:43cb067ecd00 48 user_settings.wr (0, i);
JonFreeman 3:43cb067ecd00 49 }
JonFreeman 3:43cb067ecd00 50 for (int i = threshold; i < 21; i++) {
JonFreeman 3:43cb067ecd00 51 user_settings.wr (at_power_beyond, i);
JonFreeman 3:43cb067ecd00 52 pc.printf ("%d, ", at_power_beyond);
JonFreeman 3:43cb067ecd00 53 at_power_beyond += slope;
JonFreeman 3:43cb067ecd00 54 if (at_power_beyond < 0) at_power_beyond = 0;
JonFreeman 3:43cb067ecd00 55 if (at_power_beyond > 100) at_power_beyond = 100;
JonFreeman 3:43cb067ecd00 56 }
JonFreeman 3:43cb067ecd00 57 pc.printf ("\r\nDone\r\n");
JonFreeman 3:43cb067ecd00 58 user_settings.save ();
JonFreeman 3:43cb067ecd00 59 maketable ();
JonFreeman 3:43cb067ecd00 60 }
JonFreeman 3:43cb067ecd00 61 }
JonFreeman 2:8e7b51353f32 62
JonFreeman 3:43cb067ecd00 63 void table_tweak_cmd (struct parameters & a) { // Requires two params. First '20', '22' etc representing hundreds RPM. Second 0 to 99 percent
JonFreeman 2:8e7b51353f32 64 char txt[100];
JonFreeman 2:8e7b51353f32 65 uint32_t d[3];
JonFreeman 2:8e7b51353f32 66 txt[0] = 0;
JonFreeman 2:8e7b51353f32 67 if (a.numof_dbls != 2)
JonFreeman 2:8e7b51353f32 68 sprintf (txt, "Need 2 params, got %d, ", a.numof_dbls);
JonFreeman 2:8e7b51353f32 69 else {
JonFreeman 2:8e7b51353f32 70 d[2] = (uint32_t)a.dbl[0];
JonFreeman 3:43cb067ecd00 71 d[0] = d[2] / 2;
JonFreeman 2:8e7b51353f32 72 d[1] = (uint32_t)a.dbl[1];
JonFreeman 3:43cb067ecd00 73 if (d[0] > 20 || d[1] > 100 || d[2] != d[0] * 2)
JonFreeman 2:8e7b51353f32 74 sprintf (txt + strlen(txt), "Param out of range %d, %d, ", d[2], d[1]);
JonFreeman 2:8e7b51353f32 75 else {
JonFreeman 2:8e7b51353f32 76 pc.printf ("Off to reset table %d RPM, %d percent\r\n", d[2] * 100, d[1]);
JonFreeman 2:8e7b51353f32 77 user_settings.wr ((char)d[1], d[0]);
JonFreeman 2:8e7b51353f32 78 user_settings.save ();
JonFreeman 2:8e7b51353f32 79 maketable ();
JonFreeman 2:8e7b51353f32 80 }
JonFreeman 2:8e7b51353f32 81 }
JonFreeman 2:8e7b51353f32 82 if (txt[0])
JonFreeman 2:8e7b51353f32 83 pc.printf ("Errors in table_tweak_cmd - %s\r\n", txt);
JonFreeman 2:8e7b51353f32 84 else
JonFreeman 2:8e7b51353f32 85 pc.printf ("Good in table_tweak_cmd, RPM=%d, percentage=%d\r\n", d[0] * 500, d[1]);
JonFreeman 2:8e7b51353f32 86 }
JonFreeman 0:77803b3ee157 87
JonFreeman 3:43cb067ecd00 88
JonFreeman 3:43cb067ecd00 89 //extern VEXT_Data Field;
JonFreeman 3:43cb067ecd00 90 extern FieldControl Field;
JonFreeman 3:43cb067ecd00 91
JonFreeman 3:43cb067ecd00 92 extern int32_t set_engine_RPM_lit (uint32_t RPMrequest) ; // Returns speed error pos or neg
JonFreeman 3:43cb067ecd00 93 extern int32_t set_engine_RPM_pct (uint32_t RPMrequest) ; // Returns speed error pos or neg
JonFreeman 3:43cb067ecd00 94 void ss_cmd (struct parameters & a) { // Set engine Speed 0 - 8000 RPM
JonFreeman 3:43cb067ecd00 95 uint32_t v = (uint32_t) a.dbl[0];
JonFreeman 3:43cb067ecd00 96 pc.printf ("Setting engine RPM to %d, measured RPM returned = %d\r\n", v, set_engine_RPM_lit (v));
JonFreeman 3:43cb067ecd00 97 }
JonFreeman 0:77803b3ee157 98
JonFreeman 3:43cb067ecd00 99 void sp_cmd (struct parameters & a) { // Set engine Speed 0 - 8000 RPM
JonFreeman 3:43cb067ecd00 100 uint32_t v = (uint32_t) a.dbl[0];
JonFreeman 3:43cb067ecd00 101 pc.printf ("Setting engine RPM percent to %d, measured RPM returned = %d\r\n", v, set_engine_RPM_pct (v));
JonFreeman 3:43cb067ecd00 102 }
JonFreeman 3:43cb067ecd00 103
JonFreeman 3:43cb067ecd00 104 void rfcmd (struct parameters & a) { //
JonFreeman 3:43cb067ecd00 105 // pc.printf ("Field.measured_period = %u", (uint32_t)Field.get_measured_period());
JonFreeman 3:43cb067ecd00 106 // pc.printf (", Field.measured_pw_us = %u, duty_cycle = %.3f\r\n", (uint32_t)Field.measured_pw_us, Field.duty_cycle());
JonFreeman 3:43cb067ecd00 107 pc.printf ("Field duty cycle measured = %.3f\r\n", Field.get_duty_ratio());
JonFreeman 3:43cb067ecd00 108 }
JonFreeman 3:43cb067ecd00 109
JonFreeman 3:43cb067ecd00 110 void vcmd (struct parameters & a) {
JonFreeman 3:43cb067ecd00 111 pc.printf ("link volts %.2f, field volts %.2f\r\n", Read_Link_Volts(), Read_Field_Volts());
JonFreeman 3:43cb067ecd00 112 }
JonFreeman 3:43cb067ecd00 113
JonFreeman 3:43cb067ecd00 114 void acmd (struct parameters & a) {
JonFreeman 3:43cb067ecd00 115 pc.printf ("amps %.2f\r\n", Read_Ammeter());
JonFreeman 3:43cb067ecd00 116 }
JonFreeman 3:43cb067ecd00 117
JonFreeman 1:450090bdb6f4 118
JonFreeman 3:43cb067ecd00 119 extern void set_pwm (double) ; // Range 0.0 to 1.0
JonFreeman 3:43cb067ecd00 120 void fls_cmd (struct parameters & a) {
JonFreeman 3:43cb067ecd00 121 pc.printf ("Setting field.limiter to %d percent\r\n", (int)a.dbl[0]);
JonFreeman 3:43cb067ecd00 122 set_pwm (a.dbl[0] / 100.0);
JonFreeman 3:43cb067ecd00 123 }
JonFreeman 3:43cb067ecd00 124
JonFreeman 3:43cb067ecd00 125 void set_defaults_cmd (struct parameters & a) {
JonFreeman 3:43cb067ecd00 126 struct sldandt * p = NULL;
JonFreeman 3:43cb067ecd00 127 bool flag = true;
JonFreeman 3:43cb067ecd00 128 int i = 0;
JonFreeman 3:43cb067ecd00 129 while (flag) {
JonFreeman 3:43cb067ecd00 130 p = user_settings.inform(i); // Returns NULL when i goes out of range
JonFreeman 3:43cb067ecd00 131 if (p == NULL)
JonFreeman 3:43cb067ecd00 132 flag = false;
JonFreeman 3:43cb067ecd00 133 else {
JonFreeman 3:43cb067ecd00 134 pc.printf ("min %d, max %d, default %d, text %s\r\n", p->min, p->max, p->de_fault, p->txt);
JonFreeman 3:43cb067ecd00 135 user_settings.wr (p->de_fault, i);
JonFreeman 3:43cb067ecd00 136 i++;
JonFreeman 3:43cb067ecd00 137 }
JonFreeman 0:77803b3ee157 138 }
JonFreeman 3:43cb067ecd00 139 user_settings.save ();
JonFreeman 3:43cb067ecd00 140 }
JonFreeman 0:77803b3ee157 141
JonFreeman 3:43cb067ecd00 142 void servodir_cmd (struct parameters & a) {
JonFreeman 3:43cb067ecd00 143 char ch = (char)a.dbl[0];
JonFreeman 3:43cb067ecd00 144 if (a.numof_dbls != 1 || ch > 1) {
JonFreeman 3:43cb067ecd00 145 pc.printf ("Wrong servodir set\r\n");
JonFreeman 3:43cb067ecd00 146 return ;
JonFreeman 3:43cb067ecd00 147 }
JonFreeman 3:43cb067ecd00 148 if (user_settings.rd(SERVO_DIR) != ch) {
JonFreeman 3:43cb067ecd00 149 pc.printf ("Setting servo dir %.1f \r\n", a.dbl[0]);
JonFreeman 3:43cb067ecd00 150 user_settings.wr(ch, SERVO_DIR);
JonFreeman 3:43cb067ecd00 151 user_settings.save();
JonFreeman 3:43cb067ecd00 152 }
JonFreeman 0:77803b3ee157 153 }
JonFreeman 0:77803b3ee157 154
JonFreeman 3:43cb067ecd00 155 char * modes_txt[] = {
JonFreeman 3:43cb067ecd00 156 "0\tSafe nothing mode for cli cmd testing",
JonFreeman 3:43cb067ecd00 157 "1\tPot to Servo direct, field OFF",
JonFreeman 3:43cb067ecd00 158 "2\tVariable voltage",
JonFreeman 3:43cb067ecd00 159 "3\tFixed voltage",
JonFreeman 3:43cb067ecd00 160 "4\tEngine Revs Control",
JonFreeman 3:43cb067ecd00 161 "5\tSet Engine to Driver's Pot",
JonFreeman 3:43cb067ecd00 162 "6\tControl Engine by Current Load",
JonFreeman 3:43cb067ecd00 163 "7\tAuto Test",
JonFreeman 3:43cb067ecd00 164 } ;
JonFreeman 3:43cb067ecd00 165
JonFreeman 3:43cb067ecd00 166 int numof_op_modes = sizeof(modes_txt) / sizeof(char *);
JonFreeman 0:77803b3ee157 167
JonFreeman 3:43cb067ecd00 168 char * get_mode_text (uint32_t mode) {
JonFreeman 3:43cb067ecd00 169 if (mode > numof_op_modes) {
JonFreeman 3:43cb067ecd00 170 pc.printf ("mode OOR in get_mode_text, %d\r\n", mode);
JonFreeman 3:43cb067ecd00 171 mode = numof_op_modes - 1;
JonFreeman 3:43cb067ecd00 172 }
JonFreeman 3:43cb067ecd00 173 return modes_txt[mode];
JonFreeman 3:43cb067ecd00 174 }
JonFreeman 1:450090bdb6f4 175
JonFreeman 3:43cb067ecd00 176 void mode20_cmd (struct parameters & a) ;
JonFreeman 3:43cb067ecd00 177 void mode_cmd (struct parameters & a) {
JonFreeman 3:43cb067ecd00 178 if (a.numof_dbls == 1 && (uint32_t) a.dbl[0] <= numof_op_modes) {
JonFreeman 3:43cb067ecd00 179 a.dbl[1] = a.dbl[0];
JonFreeman 3:43cb067ecd00 180 a.dbl[0] = OP_MODE; //23.0;
JonFreeman 3:43cb067ecd00 181 a.numof_dbls = 2;
JonFreeman 3:43cb067ecd00 182 mode20_cmd (a);
JonFreeman 3:43cb067ecd00 183 return;
JonFreeman 3:43cb067ecd00 184 }
JonFreeman 3:43cb067ecd00 185 pc.printf ("Current mode is %d \r\nTo set operating mode, use mode n :- where \r\n", user_settings.rd(OP_MODE));
JonFreeman 3:43cb067ecd00 186 for (int i = 0; i < numof_op_modes; i++)
JonFreeman 3:43cb067ecd00 187 pc.printf ("%s\r\n", get_mode_text(i));
JonFreeman 0:77803b3ee157 188 }
JonFreeman 0:77803b3ee157 189
JonFreeman 3:43cb067ecd00 190 void mode20_cmd (struct parameters & a) {
JonFreeman 3:43cb067ecd00 191 struct sldandt * p = NULL; // Pointer to struct containing max, min and default values, and brief text descriptor for a command
JonFreeman 3:43cb067ecd00 192 int i = 0;
JonFreeman 3:43cb067ecd00 193 bool flag = true;
JonFreeman 3:43cb067ecd00 194 bool save_settings = false;
JonFreeman 3:43cb067ecd00 195 int32_t cmd_num = (int32_t) a.dbl[0], first_p = (int32_t) a.dbl[1];
JonFreeman 3:43cb067ecd00 196 pc.printf ("At user setting, numofparams = %d, dbl[0]=%.2f, dbl[1]=%.2f\r\n", a.numof_dbls, a.dbl[0], a.dbl[1]);
JonFreeman 3:43cb067ecd00 197 if (a.numof_dbls < 2) { // Need at least command number followed by at least one parameter
JonFreeman 3:43cb067ecd00 198 pc.printf ("Listing Setup\r\nTo alter, enter us param number, new value\r\n");
JonFreeman 3:43cb067ecd00 199 while (flag) {
JonFreeman 3:43cb067ecd00 200 p = user_settings.inform(i); // Returns false when i goes out of range
JonFreeman 3:43cb067ecd00 201 if (p == NULL)
JonFreeman 3:43cb067ecd00 202 flag = false;
JonFreeman 3:43cb067ecd00 203 else {
JonFreeman 3:43cb067ecd00 204 pc.printf ("%d\tval %d, min %d, max %d, default %d, text %s\r\n", i, user_settings.rd(i), p->min, p->max, p->de_fault, p->txt);
JonFreeman 3:43cb067ecd00 205 i++;
JonFreeman 3:43cb067ecd00 206 }
JonFreeman 3:43cb067ecd00 207 }
JonFreeman 3:43cb067ecd00 208 return ;
JonFreeman 3:43cb067ecd00 209 } // When too few parameters, output list. Done.
JonFreeman 3:43cb067ecd00 210 p = user_settings.inform(cmd_num); // Set pointer to min, max, default and text info
JonFreeman 3:43cb067ecd00 211 if (p == NULL) {
JonFreeman 3:43cb067ecd00 212 pc.printf ("Invalid command number %d in user setting entry\r\n", cmd_num);
JonFreeman 3:43cb067ecd00 213 return ;
JonFreeman 3:43cb067ecd00 214 }
JonFreeman 3:43cb067ecd00 215 if (first_p < p->min || first_p > p->max) {
JonFreeman 3:43cb067ecd00 216 pc.printf ("%s\r\nParameter min %d, max %d, you entered %d. Not setting\r\n", p->txt, p->min, p->max, first_p);
JonFreeman 3:43cb067ecd00 217 return ;
JonFreeman 3:43cb067ecd00 218 }
JonFreeman 3:43cb067ecd00 219 pc.printf ("Hoping to set [%s] to %d\r\n", p->txt, first_p);
JonFreeman 3:43cb067ecd00 220 switch (cmd_num) {
JonFreeman 3:43cb067ecd00 221 case OP_MODE: //
JonFreeman 3:43cb067ecd00 222 case WARM_UP_DELAY:
JonFreeman 3:43cb067ecd00 223 case WARMUP_SERVO_POS:
JonFreeman 3:43cb067ecd00 224 case SPEED_CTRL_P:
JonFreeman 3:43cb067ecd00 225 case SERVO_DIR:
JonFreeman 3:43cb067ecd00 226 i = user_settings.rd(cmd_num);
JonFreeman 3:43cb067ecd00 227 if (i == first_p)
JonFreeman 3:43cb067ecd00 228 pc.printf ("No need, [%s] already set to %d\r\n", p->txt, i);
JonFreeman 3:43cb067ecd00 229 else {
JonFreeman 3:43cb067ecd00 230 user_settings.wr((char)first_p, cmd_num);
JonFreeman 3:43cb067ecd00 231 save_settings = true;
JonFreeman 3:43cb067ecd00 232 pc.printf ("Setting [%s] to %d\r\n", p->txt, first_p);
JonFreeman 3:43cb067ecd00 233 }
JonFreeman 3:43cb067ecd00 234 break;
JonFreeman 3:43cb067ecd00 235 default:
JonFreeman 3:43cb067ecd00 236 pc.printf ("No code for [%s]\r\n", p->txt);
JonFreeman 3:43cb067ecd00 237 break;
JonFreeman 3:43cb067ecd00 238 }
JonFreeman 3:43cb067ecd00 239 if (save_settings)
JonFreeman 3:43cb067ecd00 240 user_settings.save();
JonFreeman 0:77803b3ee157 241 }
JonFreeman 0:77803b3ee157 242
JonFreeman 3:43cb067ecd00 243 extern void auto_test_initiate (int bulb_count) ;
JonFreeman 3:43cb067ecd00 244 void auto_test_kickoff_cmd (struct parameters & a) {
JonFreeman 3:43cb067ecd00 245 auto_test_initiate ((int)a.dbl[0]);
JonFreeman 0:77803b3ee157 246 }
JonFreeman 0:77803b3ee157 247
JonFreeman 3:43cb067ecd00 248 void test_Fsfs_cmd (struct parameters & a) {
JonFreeman 3:43cb067ecd00 249 uint32_t rpm = (uint32_t)a.dbl[0];
JonFreeman 3:43cb067ecd00 250 pc.printf ("Field.set_for_speed %d returned %d\r\n", rpm, Field.set_for_speed(rpm));
JonFreeman 1:450090bdb6f4 251 }
JonFreeman 1:450090bdb6f4 252
JonFreeman 0:77803b3ee157 253 void null_cmd (struct parameters & a) {
JonFreeman 0:77803b3ee157 254 pc.printf ("At null_cmd, parameters : First %.3f, second %.3f\r\n", a.dbl[0], a.dbl[1]);
JonFreeman 0:77803b3ee157 255 }
JonFreeman 0:77803b3ee157 256
JonFreeman 0:77803b3ee157 257 void menucmd (struct parameters & a);
JonFreeman 0:77803b3ee157 258
JonFreeman 0:77803b3ee157 259 struct kb_command {
JonFreeman 0:77803b3ee157 260 const char * cmd_word; // points to text e.g. "menu"
JonFreeman 0:77803b3ee157 261 const char * explan;
JonFreeman 0:77803b3ee157 262 void (*f)(struct parameters &); // points to function
JonFreeman 0:77803b3ee157 263 } ;
JonFreeman 0:77803b3ee157 264
JonFreeman 0:77803b3ee157 265 struct kb_command const command_list[] = {
JonFreeman 0:77803b3ee157 266 {"?", "Lists available commands, same as ls", menucmd},
JonFreeman 3:43cb067ecd00 267 {"ft", "Test Field.set_for_speed fn", test_Fsfs_cmd},
JonFreeman 3:43cb067ecd00 268 {"at", "Initiate Auto Test sequence", auto_test_kickoff_cmd},
JonFreeman 3:43cb067ecd00 269 {"svod", "Set servo sense 0 or 1", servodir_cmd},
JonFreeman 3:43cb067ecd00 270 {"sd", "Set User Settings Defaults", set_defaults_cmd},
JonFreeman 3:43cb067ecd00 271 {"us", "Set User Settings", mode20_cmd},
JonFreeman 3:43cb067ecd00 272 {"tt", "Table Tweak 0 - 100", table_tweak_cmd},
JonFreeman 3:43cb067ecd00 273 {"ss", "Set Speed 0 - 8000 RPM", ss_cmd},
JonFreeman 3:43cb067ecd00 274 {"sp", "Set Speed 0 - 100 percent", sp_cmd},
JonFreeman 3:43cb067ecd00 275 // {"tl", "Throttle logger tester, enter param 0.0 - 1.0", throt_log_cmd},
JonFreeman 0:77803b3ee157 276 {"rf", "Check rise and fall on VEXT", rfcmd},
JonFreeman 0:77803b3ee157 277 {"v", "Read Battery volts", vcmd},
JonFreeman 3:43cb067ecd00 278 {"i", "Read Ammeter", acmd},
JonFreeman 3:43cb067ecd00 279 {"fl", "Field limiter set 0 to 99 percent", fls_cmd},
JonFreeman 3:43cb067ecd00 280 {"mode", "Set operating mode - as us23", mode_cmd},
JonFreeman 3:43cb067ecd00 281 {"slope", "Field limiter set pct 0 to 99 @3k, slope pct per k above", slope_cmd},
JonFreeman 1:450090bdb6f4 282 {"q", "Query system - toggle message stream on/off", query_system},
JonFreeman 0:77803b3ee157 283 {"nu", "do nothing", null_cmd},
JonFreeman 0:77803b3ee157 284 };
JonFreeman 0:77803b3ee157 285
JonFreeman 0:77803b3ee157 286 const int numof_menu_items = sizeof(command_list) / sizeof(kb_command);
JonFreeman 0:77803b3ee157 287 void menucmd (struct parameters & a)
JonFreeman 0:77803b3ee157 288 {
JonFreeman 1:450090bdb6f4 289 pc.printf("\r\nIntelligent Alternator Controller - Jon Freeman 2020\r\nAt menucmd function - listing commands:-\r\n");
JonFreeman 0:77803b3ee157 290 for(int i = 0; i < numof_menu_items; i++)
JonFreeman 0:77803b3ee157 291 pc.printf("[%s]\t\t%s\r\n", command_list[i].cmd_word, command_list[i].explan);
JonFreeman 0:77803b3ee157 292 pc.printf("End of List of Commands\r\n");
JonFreeman 0:77803b3ee157 293 }
JonFreeman 0:77803b3ee157 294
JonFreeman 0:77803b3ee157 295 void command_line_interpreter ()
JonFreeman 0:77803b3ee157 296 {
JonFreeman 1:450090bdb6f4 297
JonFreeman 0:77803b3ee157 298 const int MAX_CMD_LEN = 120;
JonFreeman 0:77803b3ee157 299 static char cmd_line[MAX_CMD_LEN + 4];
JonFreeman 0:77803b3ee157 300 static int cl_index = 0;
JonFreeman 0:77803b3ee157 301 int ch;
JonFreeman 0:77803b3ee157 302 char * pEnd;
JonFreeman 0:77803b3ee157 303 static struct parameters param_block ;
JonFreeman 0:77803b3ee157 304 while (pc.readable()) {
JonFreeman 0:77803b3ee157 305 ch = tolower(pc.getc());
JonFreeman 0:77803b3ee157 306 // pc.printf("%c", ch);
JonFreeman 0:77803b3ee157 307 if (cl_index > MAX_CMD_LEN) { // trap out stupidly long command lines
JonFreeman 0:77803b3ee157 308 pc.printf ("Error!! Stupidly long cmd line\r\n");
JonFreeman 0:77803b3ee157 309 cl_index = 0;
JonFreeman 0:77803b3ee157 310 }
JonFreeman 0:77803b3ee157 311 if (ch == '\r' || ch >= ' ' && ch <= 'z')
JonFreeman 0:77803b3ee157 312 pc.printf("%c", ch);
JonFreeman 0:77803b3ee157 313 else { // Using <Ctrl>+ 'F', 'B' for Y, 'L', 'R' for X, 'U', 'D' for Z
JonFreeman 0:77803b3ee157 314 cl_index = 0; // 6 2 12 18 21 4
JonFreeman 0:77803b3ee157 315 pc.printf("[%d]", ch);
JonFreeman 0:77803b3ee157 316 //nudger (ch); // was used on cnc to nudge axes a tad
JonFreeman 0:77803b3ee157 317 }
JonFreeman 0:77803b3ee157 318 if(ch != '\r') // was this the 'Enter' key?
JonFreeman 0:77803b3ee157 319 cmd_line[cl_index++] = ch; // added char to command being assembled
JonFreeman 0:77803b3ee157 320 else { // key was CR, may or may not be command to lookup
JonFreeman 0:77803b3ee157 321 cmd_line[cl_index] = 0; // null terminate command string
JonFreeman 0:77803b3ee157 322 if(cl_index) { // If have got some chars to lookup
JonFreeman 0:77803b3ee157 323 int i, wrdlen;
JonFreeman 0:77803b3ee157 324 for (i = 0; i < numof_menu_items; i++) { // Look for input match in command list
JonFreeman 0:77803b3ee157 325 wrdlen = strlen(command_list[i].cmd_word);
JonFreeman 0:77803b3ee157 326 if(strncmp(command_list[i].cmd_word, cmd_line, wrdlen) == 0 && !isalpha(cmd_line[wrdlen])) { // If match found
JonFreeman 0:77803b3ee157 327 for (int k = 0; k < MAX_PARAMS; k++) {
JonFreeman 0:77803b3ee157 328 param_block.dbl[k] = 0.0;
JonFreeman 0:77803b3ee157 329 }
JonFreeman 0:77803b3ee157 330 param_block.position_in_list = i;
JonFreeman 3:43cb067ecd00 331 //param_block.last_time = clock ();
JonFreeman 0:77803b3ee157 332 param_block.numof_dbls = 0;
JonFreeman 0:77803b3ee157 333 pEnd = cmd_line + wrdlen;
JonFreeman 0:77803b3ee157 334 while (*pEnd) { // Assemble all numerics as doubles
JonFreeman 0:77803b3ee157 335 param_block.dbl[param_block.numof_dbls++] = strtod (pEnd, &pEnd);
JonFreeman 0:77803b3ee157 336 while (*pEnd && !isdigit(*pEnd) && '-' != *pEnd && '+' != *pEnd) {
JonFreeman 0:77803b3ee157 337 pEnd++;
JonFreeman 0:77803b3ee157 338 }
JonFreeman 0:77803b3ee157 339 }
JonFreeman 0:77803b3ee157 340 pc.printf ("\r\n");
JonFreeman 0:77803b3ee157 341 // for (int k = 0; k < param_block.numof_dbls; k++)
JonFreeman 0:77803b3ee157 342 // pc.printf ("Read %.3f\r\n", param_block.dbl[k]);
JonFreeman 3:43cb067ecd00 343 // param_block.times[i] = clock();
JonFreeman 0:77803b3ee157 344 command_list[i].f(param_block); // execute command
JonFreeman 0:77803b3ee157 345 i = numof_menu_items + 1; // to exit for loop
JonFreeman 0:77803b3ee157 346 } // end of match found
JonFreeman 0:77803b3ee157 347 } // End of for numof_menu_items
JonFreeman 0:77803b3ee157 348 if(i == numof_menu_items)
JonFreeman 0:77803b3ee157 349 pc.printf("No Match Found for CMD [%s]\r\n", cmd_line);
JonFreeman 0:77803b3ee157 350 } // End of If have got some chars to lookup
JonFreeman 0:77803b3ee157 351 pc.printf("\r\n>");
JonFreeman 0:77803b3ee157 352 cl_index = 0;
JonFreeman 0:77803b3ee157 353 } // End of else key was CR, may or may not be command to lookup
JonFreeman 0:77803b3ee157 354 } // End of while (pc.readable())
JonFreeman 1:450090bdb6f4 355
JonFreeman 0:77803b3ee157 356 }
JonFreeman 0:77803b3ee157 357
JonFreeman 0:77803b3ee157 358