Electric Locomotive control system. Touch screen driver control, includes regenerative braking, drives 4 brushless motors, displays speed MPH, system volts and power
Dependencies: BSP_DISCO_F746NG FastPWM LCD_DISCO_F746NG SD_DISCO_F746NG TS_DISCO_F746NG mbed
cli_nortos.cpp@1:8ef34deb5177, 2017-11-13 (annotated)
- Committer:
- JonFreeman
- Date:
- Mon Nov 13 09:53:00 2017 +0000
- Revision:
- 1:8ef34deb5177
- Parent:
- 0:23cc72b18e74
Brushless Motor electric locomotive congtrol system; Drives 4 motors using touch-screen control.; Displays speed MPH, system volts and power
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
JonFreeman | 0:23cc72b18e74 | 1 | #include "mbed.h" |
JonFreeman | 0:23cc72b18e74 | 2 | #include <cctype> |
JonFreeman | 0:23cc72b18e74 | 3 | using namespace std; |
JonFreeman | 0:23cc72b18e74 | 4 | enum {FWD, REV} ; |
JonFreeman | 0:23cc72b18e74 | 5 | //typedef float fl_typ; // |
JonFreeman | 0:23cc72b18e74 | 6 | typedef double fl_typ; // |
JonFreeman | 0:23cc72b18e74 | 7 | struct singleGparam { |
JonFreeman | 0:23cc72b18e74 | 8 | float flt; |
JonFreeman | 0:23cc72b18e74 | 9 | unsigned long ul; |
JonFreeman | 0:23cc72b18e74 | 10 | int i, c; |
JonFreeman | 0:23cc72b18e74 | 11 | bool changed; |
JonFreeman | 0:23cc72b18e74 | 12 | } ; |
JonFreeman | 0:23cc72b18e74 | 13 | |
JonFreeman | 0:23cc72b18e74 | 14 | // Cleaned up version for use without RTOS |
JonFreeman | 0:23cc72b18e74 | 15 | extern Serial pc; |
JonFreeman | 0:23cc72b18e74 | 16 | |
JonFreeman | 0:23cc72b18e74 | 17 | void setpwm_cmd (struct singleGparam * a) { |
JonFreeman | 0:23cc72b18e74 | 18 | //a[1].i // first param |
JonFreeman | 0:23cc72b18e74 | 19 | pc.printf ("First %d, second %d\r\n", a[1].i, a[2].i); |
JonFreeman | 0:23cc72b18e74 | 20 | //?? set_pwm (a[1].i); |
JonFreeman | 0:23cc72b18e74 | 21 | } |
JonFreeman | 0:23cc72b18e74 | 22 | |
JonFreeman | 0:23cc72b18e74 | 23 | extern int SD_card_erase_all (void) ; // assumes sd card is 4 Gbyte, erases 4 Gbyte. |
JonFreeman | 0:23cc72b18e74 | 24 | void erase_SD_cmd (struct singleGparam * a) { |
JonFreeman | 0:23cc72b18e74 | 25 | SD_card_erase_all () ; |
JonFreeman | 0:23cc72b18e74 | 26 | } |
JonFreeman | 0:23cc72b18e74 | 27 | |
JonFreeman | 0:23cc72b18e74 | 28 | void setvref_cmd (struct singleGparam * a) { |
JonFreeman | 0:23cc72b18e74 | 29 | //a[1].i // first param |
JonFreeman | 0:23cc72b18e74 | 30 | pc.printf ("First %d, second %d\r\n", a[1].i, a[2].i); |
JonFreeman | 0:23cc72b18e74 | 31 | //?? set_I_limit (a[1].i); |
JonFreeman | 0:23cc72b18e74 | 32 | } |
JonFreeman | 0:23cc72b18e74 | 33 | |
JonFreeman | 0:23cc72b18e74 | 34 | /* |
JonFreeman | 0:23cc72b18e74 | 35 | void setmotpwm_cmd (struct singleGparam * a) { |
JonFreeman | 0:23cc72b18e74 | 36 | //a[1].i // first param |
JonFreeman | 0:23cc72b18e74 | 37 | pc.printf ("First %d, second %d\r\n", a[1].i, a[2].i); |
JonFreeman | 0:23cc72b18e74 | 38 | // set_motor_pwm (a[1].i, a[2].i); |
JonFreeman | 0:23cc72b18e74 | 39 | } |
JonFreeman | 0:23cc72b18e74 | 40 | //extern void set_fwd_rev (int direction) ; |
JonFreeman | 0:23cc72b18e74 | 41 | void set_fwd_cmd (struct singleGparam * a) { |
JonFreeman | 0:23cc72b18e74 | 42 | // set_fwd_rev (FWD); |
JonFreeman | 0:23cc72b18e74 | 43 | } |
JonFreeman | 0:23cc72b18e74 | 44 | void set_rev_cmd (struct singleGparam * a) { |
JonFreeman | 0:23cc72b18e74 | 45 | // set_fwd_rev (REV); |
JonFreeman | 0:23cc72b18e74 | 46 | } |
JonFreeman | 0:23cc72b18e74 | 47 | |
JonFreeman | 0:23cc72b18e74 | 48 | void set_speed_cmd (struct singleGparam * a) { |
JonFreeman | 0:23cc72b18e74 | 49 | pc.printf ("Speed entered %d\r\n", a[1].i); |
JonFreeman | 0:23cc72b18e74 | 50 | } |
JonFreeman | 0:23cc72b18e74 | 51 | |
JonFreeman | 0:23cc72b18e74 | 52 | void read_current_cmd (struct singleGparam * a) { |
JonFreeman | 0:23cc72b18e74 | 53 | pc.printf ("Read current\r\n"); |
JonFreeman | 0:23cc72b18e74 | 54 | } |
JonFreeman | 0:23cc72b18e74 | 55 | */ |
JonFreeman | 0:23cc72b18e74 | 56 | void menucmd (struct singleGparam * a); |
JonFreeman | 0:23cc72b18e74 | 57 | |
JonFreeman | 0:23cc72b18e74 | 58 | struct kb_command { |
JonFreeman | 0:23cc72b18e74 | 59 | const char * cmd_word; // points to text e.g. "menu" |
JonFreeman | 0:23cc72b18e74 | 60 | const char * explan; |
JonFreeman | 0:23cc72b18e74 | 61 | void (*f)(struct singleGparam *); // points to function |
JonFreeman | 0:23cc72b18e74 | 62 | } ; |
JonFreeman | 0:23cc72b18e74 | 63 | |
JonFreeman | 0:23cc72b18e74 | 64 | struct kb_command const command_list[] = { |
JonFreeman | 0:23cc72b18e74 | 65 | {"menu", "Lists available commands, same as ls", menucmd}, |
JonFreeman | 0:23cc72b18e74 | 66 | {"ls", "Lists available commands, same as menu", menucmd}, |
JonFreeman | 0:23cc72b18e74 | 67 | {"pw", "set pwm 0 to 999", setpwm_cmd}, |
JonFreeman | 0:23cc72b18e74 | 68 | {"vref", "set vref 0 to 999", setvref_cmd}, |
JonFreeman | 0:23cc72b18e74 | 69 | {"sd erase", "set motors in one direction", erase_SD_cmd}, |
JonFreeman | 0:23cc72b18e74 | 70 | // {"rev", "set motors in tother direction", set_rev_cmd}, |
JonFreeman | 0:23cc72b18e74 | 71 | // {"s", "set speed", set_speed_cmd}, |
JonFreeman | 0:23cc72b18e74 | 72 | // {"i", "Read motor currents", read_current_cmd}, |
JonFreeman | 0:23cc72b18e74 | 73 | }; |
JonFreeman | 0:23cc72b18e74 | 74 | |
JonFreeman | 0:23cc72b18e74 | 75 | const int numof_menu_items = sizeof(command_list) / sizeof(kb_command); |
JonFreeman | 0:23cc72b18e74 | 76 | void menucmd (struct singleGparam * a) |
JonFreeman | 0:23cc72b18e74 | 77 | { |
JonFreeman | 0:23cc72b18e74 | 78 | pc.printf("\r\n\nLoco_TS_2017\r\nAt menucmd function - listing commands:-\r\n"); |
JonFreeman | 0:23cc72b18e74 | 79 | for(int i = 0; i < numof_menu_items; i++) |
JonFreeman | 0:23cc72b18e74 | 80 | pc.printf("[%s]\t\t%s\r\n", command_list[i].cmd_word, command_list[i].explan); |
JonFreeman | 0:23cc72b18e74 | 81 | pc.printf("End of List of Commands\r\n"); |
JonFreeman | 0:23cc72b18e74 | 82 | } |
JonFreeman | 0:23cc72b18e74 | 83 | |
JonFreeman | 0:23cc72b18e74 | 84 | |
JonFreeman | 0:23cc72b18e74 | 85 | void grain_clr (struct singleGparam & g) { |
JonFreeman | 0:23cc72b18e74 | 86 | g.flt = 0.0; |
JonFreeman | 0:23cc72b18e74 | 87 | g.ul = 0L; |
JonFreeman | 0:23cc72b18e74 | 88 | g.i = g.c = 0; |
JonFreeman | 0:23cc72b18e74 | 89 | g.changed = false; |
JonFreeman | 0:23cc72b18e74 | 90 | } |
JonFreeman | 0:23cc72b18e74 | 91 | |
JonFreeman | 0:23cc72b18e74 | 92 | //void command_line_interpreter (void const * name) |
JonFreeman | 0:23cc72b18e74 | 93 | void command_line_interpreter () |
JonFreeman | 0:23cc72b18e74 | 94 | { |
JonFreeman | 0:23cc72b18e74 | 95 | const int MAX_PARAMS = 10, MAX_CMD_LEN = 120; |
JonFreeman | 0:23cc72b18e74 | 96 | static char cmd_line[MAX_CMD_LEN + 4]; |
JonFreeman | 0:23cc72b18e74 | 97 | static struct singleGparam params[MAX_PARAMS + 1]; |
JonFreeman | 0:23cc72b18e74 | 98 | static int cl_index = 0, lastalpha = 0; |
JonFreeman | 0:23cc72b18e74 | 99 | static fl_typ fracmul; |
JonFreeman | 0:23cc72b18e74 | 100 | int ch; |
JonFreeman | 0:23cc72b18e74 | 101 | ////No RTOS while (true) { |
JonFreeman | 0:23cc72b18e74 | 102 | while (pc.readable()) { |
JonFreeman | 0:23cc72b18e74 | 103 | ch = tolower(pc.getc()); |
JonFreeman | 0:23cc72b18e74 | 104 | // pc.printf("%c", ch); |
JonFreeman | 0:23cc72b18e74 | 105 | if (cl_index > MAX_CMD_LEN) { // trap out stupidly long command lines |
JonFreeman | 0:23cc72b18e74 | 106 | pc.printf ("Error!! Stupidly long cmd line\r\n"); |
JonFreeman | 0:23cc72b18e74 | 107 | cl_index = 0; |
JonFreeman | 0:23cc72b18e74 | 108 | } |
JonFreeman | 0:23cc72b18e74 | 109 | if (ch == '\r' || ch >= ' ' && ch <= 'z') |
JonFreeman | 0:23cc72b18e74 | 110 | pc.printf("%c", ch); |
JonFreeman | 0:23cc72b18e74 | 111 | else { // Using <Ctrl>+ 'F', 'B' for Y, 'L', 'R' for X, 'U', 'D' for Z |
JonFreeman | 0:23cc72b18e74 | 112 | cl_index = 0; // 6 2 12 18 21 4 |
JonFreeman | 0:23cc72b18e74 | 113 | pc.printf("[%d]", ch); |
JonFreeman | 0:23cc72b18e74 | 114 | //nudger (ch); // was used on cnc to nudge axes a tad |
JonFreeman | 0:23cc72b18e74 | 115 | } |
JonFreeman | 0:23cc72b18e74 | 116 | if(ch != '\r') // was this the 'Enter' key? |
JonFreeman | 0:23cc72b18e74 | 117 | cmd_line[cl_index++] = ch; // added char to command being assembled |
JonFreeman | 0:23cc72b18e74 | 118 | else { // key was CR, may or may not be command to lookup |
JonFreeman | 0:23cc72b18e74 | 119 | cmd_line[cl_index] = 0; // null terminate command string |
JonFreeman | 0:23cc72b18e74 | 120 | if(cl_index) { // If have got some chars to lookup |
JonFreeman | 0:23cc72b18e74 | 121 | int i, wrdlen; |
JonFreeman | 0:23cc72b18e74 | 122 | for (i = 0; i < numof_menu_items; i++) { // Look for input match in command list |
JonFreeman | 0:23cc72b18e74 | 123 | wrdlen = strlen(command_list[i].cmd_word); |
JonFreeman | 0:23cc72b18e74 | 124 | if(strncmp(command_list[i].cmd_word, cmd_line, wrdlen) == 0 |
JonFreeman | 0:23cc72b18e74 | 125 | && !isalpha(cmd_line[wrdlen])) { // If match found |
JonFreeman | 0:23cc72b18e74 | 126 | bool negflag = false; |
JonFreeman | 0:23cc72b18e74 | 127 | int state = 0, paramindex; |
JonFreeman | 0:23cc72b18e74 | 128 | // pc.printf("Found match for word [%s]\r\n", kbc[i].wrd); |
JonFreeman | 0:23cc72b18e74 | 129 | for(paramindex = 0; paramindex < MAX_PARAMS; paramindex++) |
JonFreeman | 0:23cc72b18e74 | 130 | grain_clr (params[paramindex]); |
JonFreeman | 0:23cc72b18e74 | 131 | paramindex = 0; |
JonFreeman | 0:23cc72b18e74 | 132 | // read any parameters from command line here |
JonFreeman | 0:23cc72b18e74 | 133 | // Using parameters[0] as count of parameters to follow |
JonFreeman | 0:23cc72b18e74 | 134 | while (wrdlen <= cl_index) { |
JonFreeman | 0:23cc72b18e74 | 135 | ch = cmd_line[wrdlen++]; |
JonFreeman | 0:23cc72b18e74 | 136 | if(isalpha(ch)) lastalpha = ch; |
JonFreeman | 0:23cc72b18e74 | 137 | if(ch == '-') negflag = true; |
JonFreeman | 0:23cc72b18e74 | 138 | if(ch == '+') negflag = false; |
JonFreeman | 0:23cc72b18e74 | 139 | switch (state) { |
JonFreeman | 0:23cc72b18e74 | 140 | case 0: // looking for start of a number string |
JonFreeman | 0:23cc72b18e74 | 141 | if(isdigit(ch)) { // found first digit of a number string |
JonFreeman | 0:23cc72b18e74 | 142 | paramindex++; |
JonFreeman | 0:23cc72b18e74 | 143 | if(paramindex > MAX_PARAMS) { |
JonFreeman | 0:23cc72b18e74 | 144 | wrdlen = cl_index; // exit condition |
JonFreeman | 0:23cc72b18e74 | 145 | pc.printf("WARNING - too many parameters, ignoring extra\r\n"); |
JonFreeman | 0:23cc72b18e74 | 146 | } else { |
JonFreeman | 0:23cc72b18e74 | 147 | params[paramindex].i = ch - '0'; |
JonFreeman | 0:23cc72b18e74 | 148 | params[paramindex].c = lastalpha; |
JonFreeman | 0:23cc72b18e74 | 149 | state = 1; // Found first digit char of number string |
JonFreeman | 0:23cc72b18e74 | 150 | } |
JonFreeman | 0:23cc72b18e74 | 151 | } |
JonFreeman | 0:23cc72b18e74 | 152 | break; |
JonFreeman | 0:23cc72b18e74 | 153 | case 1: // looking for end of a number string |
JonFreeman | 0:23cc72b18e74 | 154 | if(isdigit(ch)) { // accumulating integer from string |
JonFreeman | 0:23cc72b18e74 | 155 | params[paramindex].i *= 10; |
JonFreeman | 0:23cc72b18e74 | 156 | params[paramindex].i += ch - '0'; |
JonFreeman | 0:23cc72b18e74 | 157 | } else { // found non-digit terminating number |
JonFreeman | 0:23cc72b18e74 | 158 | if (ch == '.') { |
JonFreeman | 0:23cc72b18e74 | 159 | state = 2; |
JonFreeman | 0:23cc72b18e74 | 160 | fracmul = 0.1; |
JonFreeman | 0:23cc72b18e74 | 161 | params[paramindex].flt = (fl_typ)params[paramindex].i; |
JonFreeman | 0:23cc72b18e74 | 162 | } else { |
JonFreeman | 0:23cc72b18e74 | 163 | params[0].i++; // count of validated parameters |
JonFreeman | 0:23cc72b18e74 | 164 | state = 0; // Have read past last digit of number string |
JonFreeman | 0:23cc72b18e74 | 165 | if(negflag) { |
JonFreeman | 0:23cc72b18e74 | 166 | params[paramindex].i = -params[paramindex].i; |
JonFreeman | 0:23cc72b18e74 | 167 | negflag = false; |
JonFreeman | 0:23cc72b18e74 | 168 | } |
JonFreeman | 0:23cc72b18e74 | 169 | params[paramindex].flt = (fl_typ)params[paramindex].i; |
JonFreeman | 0:23cc72b18e74 | 170 | } |
JonFreeman | 0:23cc72b18e74 | 171 | } |
JonFreeman | 0:23cc72b18e74 | 172 | break; |
JonFreeman | 0:23cc72b18e74 | 173 | case 2: // looking for fractional part of double |
JonFreeman | 0:23cc72b18e74 | 174 | if(isdigit(ch)) { // accumulating fractional part from string |
JonFreeman | 0:23cc72b18e74 | 175 | params[paramindex].flt += (fl_typ)((ch - '0') * fracmul); |
JonFreeman | 0:23cc72b18e74 | 176 | fracmul /= 10.0; |
JonFreeman | 0:23cc72b18e74 | 177 | } else { // found non-digit terminating double precision number |
JonFreeman | 0:23cc72b18e74 | 178 | params[0].i++; // count of validated parameters |
JonFreeman | 0:23cc72b18e74 | 179 | state = 0; // Have read past last digit of number string |
JonFreeman | 0:23cc72b18e74 | 180 | if(negflag) { |
JonFreeman | 0:23cc72b18e74 | 181 | params[paramindex].i = -params[paramindex].i; |
JonFreeman | 0:23cc72b18e74 | 182 | params[paramindex].flt = -params[paramindex].flt; |
JonFreeman | 0:23cc72b18e74 | 183 | negflag = false; |
JonFreeman | 0:23cc72b18e74 | 184 | } |
JonFreeman | 0:23cc72b18e74 | 185 | } |
JonFreeman | 0:23cc72b18e74 | 186 | break; |
JonFreeman | 0:23cc72b18e74 | 187 | default: |
JonFreeman | 0:23cc72b18e74 | 188 | break; |
JonFreeman | 0:23cc72b18e74 | 189 | } // end of switch state |
JonFreeman | 0:23cc72b18e74 | 190 | } // end of while wrdlen < cl_index |
JonFreeman | 0:23cc72b18e74 | 191 | // pc.printf("Found match to [%s] with %d parameters\r\n", command_list_ptr[i].wrd, paramindex); |
JonFreeman | 0:23cc72b18e74 | 192 | command_list[i].f(params); // execute command |
JonFreeman | 0:23cc72b18e74 | 193 | i = numof_menu_items + 1; // to exit for loop |
JonFreeman | 0:23cc72b18e74 | 194 | } |
JonFreeman | 0:23cc72b18e74 | 195 | } // End of for numof_menu_items |
JonFreeman | 0:23cc72b18e74 | 196 | if(i == numof_menu_items) |
JonFreeman | 0:23cc72b18e74 | 197 | pc.printf("No Match Found for CMD [%s]\r\n", cmd_line); |
JonFreeman | 0:23cc72b18e74 | 198 | } // End of If have got some chars to lookup |
JonFreeman | 0:23cc72b18e74 | 199 | pc.printf("\r\n>"); |
JonFreeman | 0:23cc72b18e74 | 200 | cl_index = lastalpha = 0; |
JonFreeman | 0:23cc72b18e74 | 201 | } // End of else key was CR, may or may not be command to lookup |
JonFreeman | 0:23cc72b18e74 | 202 | } // End of while (pc.readable()) |
JonFreeman | 0:23cc72b18e74 | 203 | //No RTOS osThreadYield(); // Using RTOS on this project |
JonFreeman | 0:23cc72b18e74 | 204 | // } |
JonFreeman | 0:23cc72b18e74 | 205 | } |
JonFreeman | 0:23cc72b18e74 | 206 | |
JonFreeman | 0:23cc72b18e74 | 207 |