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

Committer:
JonFreeman
Date:
2017-11-12
Revision:
0:23cc72b18e74

File content as of revision 0:23cc72b18e74:

#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
//    }
}