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

Revision:
0:23cc72b18e74
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cli_nortos.cpp	Sun Nov 12 06:26:29 2017 +0000
@@ -0,0 +1,207 @@
+#include "mbed.h"
+#include <cctype>
+using namespace std;
+enum    {FWD, REV}  ;
+//typedef float  fl_typ;  //  
+typedef double  fl_typ;  //  
+struct  singleGparam    {
+    float          flt;
+    unsigned long   ul;
+    int         i,  c;
+    bool            changed;
+}   ;
+
+//  Cleaned up version for use without RTOS
+extern  Serial pc;
+
+void    setpwm_cmd (struct singleGparam * a)   {
+    //a[1].i  //  first param
+    pc.printf   ("First %d, second %d\r\n", a[1].i, a[2].i);
+//??    set_pwm   (a[1].i);
+}
+
+extern  int SD_card_erase_all   (void)  ;   //  assumes sd card is 4 Gbyte, erases 4 Gbyte.
+void    erase_SD_cmd (struct singleGparam * a)   {
+    SD_card_erase_all   ()  ;
+}
+
+void    setvref_cmd (struct singleGparam * a)   {
+    //a[1].i  //  first param
+    pc.printf   ("First %d, second %d\r\n", a[1].i, a[2].i);
+//??    set_I_limit   (a[1].i);
+}
+
+/*
+void    setmotpwm_cmd (struct singleGparam * a)   {
+    //a[1].i  //  first param
+    pc.printf   ("First %d, second %d\r\n", a[1].i, a[2].i);
+//    set_motor_pwm   (a[1].i, a[2].i);
+}
+//extern  void    set_fwd_rev (int direction) ;
+void    set_fwd_cmd (struct singleGparam * a)   {
+//    set_fwd_rev   (FWD);
+}
+void    set_rev_cmd (struct singleGparam * a)   {
+//    set_fwd_rev   (REV);
+}
+
+void    set_speed_cmd (struct singleGparam * a)   {
+    pc.printf   ("Speed entered %d\r\n", a[1].i);
+}
+
+void    read_current_cmd (struct singleGparam * a)   {
+    pc.printf   ("Read current\r\n");
+}
+*/
+void    menucmd (struct singleGparam * a);
+
+struct kb_command  {
+    const char * cmd_word;         //  points to text e.g. "menu"
+    const char * explan;
+    void (*f)(struct singleGparam *);   //  points to function
+}  ;
+
+struct  kb_command const command_list[] = {
+    {"menu", "Lists available commands, same as ls", menucmd},
+    {"ls", "Lists available commands, same as menu", menucmd},
+    {"pw", "set pwm 0 to 999", setpwm_cmd},
+    {"vref", "set vref 0 to 999", setvref_cmd},
+    {"sd erase", "set motors in one direction", erase_SD_cmd},
+//    {"rev", "set motors in tother direction", set_rev_cmd},
+//    {"s", "set speed", set_speed_cmd},
+//    {"i", "Read motor currents", read_current_cmd},
+};
+
+const int numof_menu_items = sizeof(command_list) / sizeof(kb_command);
+void    menucmd (struct singleGparam * a)
+{
+    pc.printf("\r\n\nLoco_TS_2017\r\nAt menucmd function - listing commands:-\r\n");
+    for(int i = 0; i < numof_menu_items; i++)
+        pc.printf("[%s]\t\t%s\r\n", command_list[i].cmd_word, command_list[i].explan);
+    pc.printf("End of List of Commands\r\n");
+}
+
+
+void    grain_clr   (struct singleGparam & g)  {
+    g.flt = 0.0;
+    g.ul = 0L;
+    g.i = g.c = 0;
+    g.changed = false;
+}
+
+//void    command_line_interpreter    (void const * name)
+void    command_line_interpreter    ()
+{
+const int MAX_PARAMS = 10, MAX_CMD_LEN = 120;
+static  char    cmd_line[MAX_CMD_LEN + 4];
+static  struct  singleGparam   params[MAX_PARAMS + 1];
+static  int     cl_index = 0, lastalpha = 0;
+static  fl_typ  fracmul;
+int ch;
+////No RTOS    while   (true)  {
+        while  (pc.readable()) {
+            ch = tolower(pc.getc());
+           // pc.printf("%c", ch);
+            if  (cl_index > MAX_CMD_LEN)  {   //  trap out stupidly long command lines
+                pc.printf   ("Error!! Stupidly long cmd line\r\n");
+                cl_index = 0;
+            }
+            if  (ch == '\r' || ch >= ' ' && ch <= 'z')
+                pc.printf("%c", ch);
+            else    {                   //  Using <Ctrl>+ 'F', 'B' for Y, 'L', 'R' for X, 'U', 'D' for Z
+                cl_index = 0;           //                 6    2          12   18         21   4
+                pc.printf("[%d]", ch);
+                //nudger  (ch); //  was used on cnc to nudge axes a tad
+            }
+            if(ch != '\r')  //  was this the 'Enter' key?
+                cmd_line[cl_index++] = ch;  //  added char to command being assembled
+            else    {   //  key was CR, may or may not be command to lookup
+                cmd_line[cl_index] = 0; //  null terminate command string
+                if(cl_index)    {   //  If have got some chars to lookup
+                    int i, wrdlen;
+                    for (i = 0; i < numof_menu_items; i++)   {   //  Look for input match in command list
+                        wrdlen = strlen(command_list[i].cmd_word);
+                        if(strncmp(command_list[i].cmd_word, cmd_line, wrdlen) == 0
+                            && !isalpha(cmd_line[wrdlen]))  {   //  If match found
+                            bool negflag = false;
+                            int state = 0, paramindex;
+    //                            pc.printf("Found match for word [%s]\r\n", kbc[i].wrd);
+                            for(paramindex = 0; paramindex < MAX_PARAMS; paramindex++) 
+                                grain_clr   (params[paramindex]);
+                            paramindex = 0;
+                            //  read any parameters from command line here
+                            //  Using parameters[0] as count of parameters to follow
+                            while   (wrdlen <= cl_index)  {
+                                ch = cmd_line[wrdlen++];
+                                if(isalpha(ch)) lastalpha = ch;
+                                if(ch == '-')   negflag = true;
+                                if(ch == '+')   negflag = false;
+                                switch  (state) {
+                                    case    0:  //  looking for start of a number string
+                                        if(isdigit(ch)) {   //  found first digit of a number string
+                                            paramindex++;
+                                            if(paramindex > MAX_PARAMS)    {
+                                                wrdlen = cl_index;  //  exit condition
+                                                pc.printf("WARNING - too many parameters, ignoring extra\r\n");
+                                            } else    {
+                                                params[paramindex].i = ch - '0';
+                                                params[paramindex].c = lastalpha;
+                                                state = 1;  //  Found first digit char of number string
+                                            }
+                                        }
+                                        break;
+                                    case    1:  //  looking for end of a number string
+                                        if(isdigit(ch)) {   //  accumulating integer from string
+                                            params[paramindex].i *= 10;
+                                            params[paramindex].i += ch - '0';
+                                        } else    { //  found non-digit terminating number
+                                            if  (ch == '.')  {
+                                                state = 2;
+                                                fracmul = 0.1;
+                                                params[paramindex].flt = (fl_typ)params[paramindex].i;
+                                            } else    {
+                                                params[0].i++;    //  count of validated parameters
+                                                state = 0;  //  Have read past last digit of number string
+                                                if(negflag) {
+                                                    params[paramindex].i = -params[paramindex].i;
+                                                    negflag = false;
+                                                }
+                                                params[paramindex].flt = (fl_typ)params[paramindex].i;
+                                            }
+                                        }
+                                        break;
+                                    case    2:  //  looking for fractional part of double
+                                        if(isdigit(ch)) {   //  accumulating fractional part from string
+                                            params[paramindex].flt += (fl_typ)((ch - '0') * fracmul);
+                                            fracmul /= 10.0;
+                                        } else    { //  found non-digit terminating double precision number
+                                            params[0].i++;    //  count of validated parameters
+                                            state = 0;  //  Have read past last digit of number string
+                                            if(negflag) {
+                                                params[paramindex].i = -params[paramindex].i;
+                                                params[paramindex].flt = -params[paramindex].flt;
+                                                negflag = false;
+                                            }
+                                        }
+                                        break;
+                                    default:
+                                        break;
+                                }   //  end of switch state
+                            }       //  end of while wrdlen < cl_index
+    //                            pc.printf("Found match to [%s] with %d parameters\r\n", command_list_ptr[i].wrd, paramindex);
+                            command_list[i].f(params);   //  execute command
+                            i = numof_menu_items + 1;    //  to exit for loop
+                        }
+                    }       // End of for numof_menu_items
+                    if(i == numof_menu_items)
+                        pc.printf("No Match Found for CMD [%s]\r\n", cmd_line);
+                }           //  End of If have got some chars to lookup
+                pc.printf("\r\n>");
+                cl_index = lastalpha = 0;
+            }               // End of else key was CR, may or may not be command to lookup
+        }                   //  End of while (pc.readable())
+//No RTOS        osThreadYield();  //  Using RTOS on this project
+//    }
+}
+
+