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

Committer:
JonFreeman
Date:
Sun Nov 12 06:26:29 2017 +0000
Revision:
0:23cc72b18e74
Electric loco controller up to Nov 2017 includes SD odometer

Who changed what in which revision?

UserRevisionLine numberNew 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