Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed BufferedSerial Servo2 PCT2075 I2CEeprom FastPWM
cli.cpp@3:43cb067ecd00, 2020-07-27 (annotated)
- 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?
| User | Revision | Line number | New 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 |