Jon Freeman / Mbed 2 deprecated Alternator2020_06

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