Jon Freeman / Mbed 2 deprecated Brute_TS_Controller_2018_11

Dependencies:   TS_DISCO_F746NG mbed Servo LCD_DISCO_F746NG BSP_DISCO_F746NG QSPI_DISCO_F746NG AsyncSerial FastPWM

Committer:
JonFreeman
Date:
Tue May 01 08:34:36 2018 +0000
Revision:
5:21a8ac83142c
Parent:
4:67478861c670
Child:
6:57dc760effd4
Added servo throttle, odometer not complete, ready for trial run

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JonFreeman 5:21a8ac83142c 1 //Loco_TS_2018
JonFreeman 4:67478861c670 2 #include "mbed.h"
JonFreeman 4:67478861c670 3 //#include "BufferedSerial.h"
JonFreeman 5:21a8ac83142c 4 #include "AsyncSerial.hpp"
JonFreeman 4:67478861c670 5 #include <cctype>
JonFreeman 4:67478861c670 6 #include "Electric_Loco.h"
JonFreeman 4:67478861c670 7 using namespace std;
JonFreeman 4:67478861c670 8
JonFreeman 4:67478861c670 9 //extern int I_Am () ; // Returns boards id number as ASCII char '0', '1' etc. Code for Broadcast = '\r'
JonFreeman 5:21a8ac83142c 10 //typedef double fl_typ; //
JonFreeman 4:67478861c670 11
JonFreeman 4:67478861c670 12 const int BROADCAST = '\r';
JonFreeman 4:67478861c670 13
JonFreeman 4:67478861c670 14 // WithOUT RTOS
JonFreeman 4:67478861c670 15 extern Serial pc;
JonFreeman 5:21a8ac83142c 16 extern AsyncSerial com;
JonFreeman 4:67478861c670 17 extern void send_test () ;
JonFreeman 4:67478861c670 18
JonFreeman 5:21a8ac83142c 19 void null_cmd (struct parameters & a)
JonFreeman 5:21a8ac83142c 20 {
JonFreeman 4:67478861c670 21 pc.printf ("At null_cmd, parameters : First %.3f, second %.3f\r\n", a.dbl[0], a.dbl[1]);
JonFreeman 4:67478861c670 22 }
JonFreeman 4:67478861c670 23
JonFreeman 4:67478861c670 24
JonFreeman 4:67478861c670 25 void menucmd (struct parameters & a);
JonFreeman 4:67478861c670 26
JonFreeman 4:67478861c670 27 void kd_cmd (struct parameters & a) // kick the watchdog
JonFreeman 4:67478861c670 28 {
JonFreeman 4:67478861c670 29 }
JonFreeman 4:67478861c670 30
JonFreeman 5:21a8ac83142c 31 extern void rpm_push (struct parameters & a) ;
JonFreeman 5:21a8ac83142c 32 void uprpm_cmd (struct parameters & a) // controller rec'd rpm from driver boards
JonFreeman 5:21a8ac83142c 33 {
JonFreeman 5:21a8ac83142c 34 rpm_push (a);
JonFreeman 5:21a8ac83142c 35 a.gp_i ^= 1; // toggle lsb
JonFreeman 5:21a8ac83142c 36 }
JonFreeman 5:21a8ac83142c 37
JonFreeman 5:21a8ac83142c 38 void uprdi_cmd (struct parameters & a) // controller rec'd rpm from driver boards
JonFreeman 5:21a8ac83142c 39 {
JonFreeman 5:21a8ac83142c 40 // pc.printf ("RPM %d %d\r\n", (int)a.dbl[0], (int)a.dbl[1]);
JonFreeman 5:21a8ac83142c 41 }
JonFreeman 5:21a8ac83142c 42
JonFreeman 4:67478861c670 43
JonFreeman 4:67478861c670 44 /*void who_cmd (struct parameters & a)
JonFreeman 4:67478861c670 45 {
JonFreeman 4:67478861c670 46 int i = I_Am ();
JonFreeman 4:67478861c670 47 if (I_Am() == a.target_unit)
JonFreeman 4:67478861c670 48 pc.printf ("Hi there, I am %c\r\n", a.target_unit);
JonFreeman 4:67478861c670 49 }*/
JonFreeman 4:67478861c670 50
JonFreeman 4:67478861c670 51 struct kb_command {
JonFreeman 4:67478861c670 52 const char * cmd_word; // points to text e.g. "menu"
JonFreeman 4:67478861c670 53 const char * explan;
JonFreeman 4:67478861c670 54 void (*f)(struct parameters &); // points to function
JonFreeman 4:67478861c670 55 } ;
JonFreeman 4:67478861c670 56
JonFreeman 4:67478861c670 57 struct kb_command const command_list[] = {
JonFreeman 4:67478861c670 58 {"ls", "Lists available commands", menucmd},
JonFreeman 4:67478861c670 59 {"?", "Lists available commands, same as ls", menucmd},
JonFreeman 4:67478861c670 60 // {"fw", "forward", fw_cmd},
JonFreeman 4:67478861c670 61 // {"re", "reverse", re_cmd},
JonFreeman 4:67478861c670 62 // {"rb", "regen brake 0 to 99 %", rb_cmd},
JonFreeman 4:67478861c670 63 // {"hb", "hand brake", hb_cmd},
JonFreeman 4:67478861c670 64 // {"v", "set motors V percent RANGE 0 to 100", v_cmd},
JonFreeman 4:67478861c670 65 // {"i", "set motors I percent RANGE 0 to 100", i_cmd},
JonFreeman 4:67478861c670 66 // {"vi", "set motors V and I percent RANGE 0 to 100", vi_cmd},
JonFreeman 4:67478861c670 67 // {"who", "search for connected units, e.g. 3who returs 'Hi there' if found", who_cmd},
JonFreeman 4:67478861c670 68 // {"mode", "read or set params in eeprom", mode_cmd},
JonFreeman 4:67478861c670 69 // {"erase", "set eeprom contents to all 0xff", erase_cmd},
JonFreeman 4:67478861c670 70 {"kd", "kick the dog", kd_cmd},
JonFreeman 5:21a8ac83142c 71 {"rpm", "rpm reading from 2 motors", uprpm_cmd},
JonFreeman 4:67478861c670 72 {"nu", "do nothing", null_cmd},
JonFreeman 4:67478861c670 73 };
JonFreeman 4:67478861c670 74
JonFreeman 4:67478861c670 75 const int numof_menu_items = sizeof(command_list) / sizeof(kb_command);
JonFreeman 4:67478861c670 76 void menucmd (struct parameters & a)
JonFreeman 4:67478861c670 77 {
JonFreeman 5:21a8ac83142c 78 // struct kb_command const * cl = command_list;
JonFreeman 5:21a8ac83142c 79 pc.printf("\r\n\nTS_2018 Locomotive Touch Screen Controller\r\nAt menucmd function - listing commands:-\r\n");
JonFreeman 4:67478861c670 80 for(int i = 0; i < numof_menu_items; i++)
JonFreeman 4:67478861c670 81 pc.printf("[%s]\t\t%s\r\n", command_list[i].cmd_word, command_list[i].explan);
JonFreeman 4:67478861c670 82 pc.printf("End of List of Commands\r\n");
JonFreeman 4:67478861c670 83 }
JonFreeman 4:67478861c670 84
JonFreeman 5:21a8ac83142c 85 struct kb_command const loco_command_list[] = {
JonFreeman 5:21a8ac83142c 86 {"ls", "Lists available commands", menucmd},
JonFreeman 5:21a8ac83142c 87 {"?", "Lists available commands, same as ls", menucmd},
JonFreeman 5:21a8ac83142c 88 {"rpm", "rpm reading from 2 motors", uprpm_cmd},
JonFreeman 5:21a8ac83142c 89 {"rdi", "rpm reading from 2 motors", uprdi_cmd},
JonFreeman 5:21a8ac83142c 90 {"nu", "do nothing", null_cmd},
JonFreeman 5:21a8ac83142c 91 } ;
JonFreeman 5:21a8ac83142c 92
JonFreeman 5:21a8ac83142c 93 struct parameters pccom, lococom;
JonFreeman 5:21a8ac83142c 94
JonFreeman 5:21a8ac83142c 95 /*struct parameters {
JonFreeman 5:21a8ac83142c 96 struct kb_command const * clist;
JonFreeman 5:21a8ac83142c 97 char cmd_line[120];
JonFreeman 5:21a8ac83142c 98 char * cmd_line_ptr;
JonFreeman 5:21a8ac83142c 99 int32_t position_in_list, numof_dbls, target_unit, numof_menu_items;
JonFreeman 5:21a8ac83142c 100 double dbl[MAX_PARAMS];
JonFreeman 5:21a8ac83142c 101 bool respond;
JonFreeman 5:21a8ac83142c 102 } ;
JonFreeman 5:21a8ac83142c 103 */
JonFreeman 5:21a8ac83142c 104 int getc (int which_port)
JonFreeman 5:21a8ac83142c 105 {
JonFreeman 5:21a8ac83142c 106 if (which_port == 0)
JonFreeman 5:21a8ac83142c 107 return pc.getc ();
JonFreeman 5:21a8ac83142c 108 if (which_port == 1)
JonFreeman 5:21a8ac83142c 109 return com.getc ();
JonFreeman 5:21a8ac83142c 110 return -1;
JonFreeman 5:21a8ac83142c 111 }
JonFreeman 5:21a8ac83142c 112 int readable (int which_port)
JonFreeman 5:21a8ac83142c 113 {
JonFreeman 5:21a8ac83142c 114 if (which_port == 0)
JonFreeman 5:21a8ac83142c 115 return pc.readable ();
JonFreeman 5:21a8ac83142c 116 if (which_port == 1)
JonFreeman 5:21a8ac83142c 117 return com.readable ();
JonFreeman 5:21a8ac83142c 118 return -1;
JonFreeman 5:21a8ac83142c 119
JonFreeman 5:21a8ac83142c 120 }
JonFreeman 5:21a8ac83142c 121
JonFreeman 5:21a8ac83142c 122 void setup_pccom ()
JonFreeman 5:21a8ac83142c 123 {
JonFreeman 5:21a8ac83142c 124 pccom.clist = command_list;
JonFreeman 5:21a8ac83142c 125 pccom.numof_menu_items = sizeof(command_list) / sizeof(kb_command);
JonFreeman 5:21a8ac83142c 126 pccom.com_no = 0;
JonFreeman 5:21a8ac83142c 127 pccom.cl_index = 0;
JonFreeman 5:21a8ac83142c 128 pccom.gp_i = 0; // general puropse integer, not used to 30/4/2018
JonFreeman 5:21a8ac83142c 129 }
JonFreeman 5:21a8ac83142c 130
JonFreeman 5:21a8ac83142c 131 void setup_lococom ()
JonFreeman 5:21a8ac83142c 132 {
JonFreeman 5:21a8ac83142c 133 lococom.clist = loco_command_list;
JonFreeman 5:21a8ac83142c 134 lococom.numof_menu_items = sizeof(loco_command_list) / sizeof(kb_command);
JonFreeman 5:21a8ac83142c 135 lococom.com_no = 1;
JonFreeman 5:21a8ac83142c 136 lococom.cl_index = 0;
JonFreeman 5:21a8ac83142c 137 lococom.gp_i = 0; // general puropse integer, toggles 0 / 1 to best guess source of rpm
JonFreeman 5:21a8ac83142c 138 }
JonFreeman 5:21a8ac83142c 139
JonFreeman 5:21a8ac83142c 140 void clicore (struct parameters & a)
JonFreeman 5:21a8ac83142c 141 {
JonFreeman 5:21a8ac83142c 142 int ch;
JonFreeman 5:21a8ac83142c 143 char * pEnd;
JonFreeman 5:21a8ac83142c 144 while (readable(a.com_no)) {
JonFreeman 5:21a8ac83142c 145 ch = getc (a.com_no);
JonFreeman 5:21a8ac83142c 146 if(ch != '\r') // was this the 'Enter' key?
JonFreeman 5:21a8ac83142c 147 a.cmd_line[a.cl_index++] = ch; // added char to command being assembled
JonFreeman 5:21a8ac83142c 148 else { // key was CR, may or may not be command to lookup
JonFreeman 5:21a8ac83142c 149 a.target_unit = BROADCAST; // Broadcast
JonFreeman 5:21a8ac83142c 150 a.cmd_line_ptr = a.cmd_line;
JonFreeman 5:21a8ac83142c 151 a.cmd_line[a.cl_index] = 0; // null terminate command string
JonFreeman 5:21a8ac83142c 152 if(a.cl_index) { // If have got some chars to lookup
JonFreeman 5:21a8ac83142c 153 int i, wrdlen;
JonFreeman 5:21a8ac83142c 154 if (isdigit(a.cmd_line[0])) { // Look for command with prefix digit
JonFreeman 5:21a8ac83142c 155 a.cmd_line_ptr++; // point past identified digit prefix
JonFreeman 5:21a8ac83142c 156 a.target_unit = a.cmd_line[0]; // '0' to '9'
JonFreeman 5:21a8ac83142c 157 //pc.printf ("Got prefix %c\r\n", cmd_line[0]);
JonFreeman 5:21a8ac83142c 158 }
JonFreeman 5:21a8ac83142c 159 for (i = 0; i < a.numof_menu_items; i++) { // Look for input match in command list
JonFreeman 5:21a8ac83142c 160 wrdlen = strlen(a.clist[i].cmd_word);
JonFreeman 5:21a8ac83142c 161 if(strncmp(a.clist[i].cmd_word, a.cmd_line_ptr, wrdlen) == 0 && !isalpha(a.cmd_line_ptr[wrdlen])) { // If match found
JonFreeman 5:21a8ac83142c 162 for (int k = 0; k < MAX_PARAMS; k++) {
JonFreeman 5:21a8ac83142c 163 a.dbl[k] = 0.0;
JonFreeman 5:21a8ac83142c 164 }
JonFreeman 5:21a8ac83142c 165 a.position_in_list = i;
JonFreeman 5:21a8ac83142c 166 a.numof_dbls = 0;
JonFreeman 5:21a8ac83142c 167 pEnd = a.cmd_line_ptr + wrdlen;
JonFreeman 5:21a8ac83142c 168 while (*pEnd) { // Assemble all numerics as doubles
JonFreeman 5:21a8ac83142c 169 a.dbl[a.numof_dbls++] = strtod (pEnd, &pEnd);
JonFreeman 5:21a8ac83142c 170 while (*pEnd && !isdigit(*pEnd) && '-' != *pEnd && '+' != *pEnd) {
JonFreeman 5:21a8ac83142c 171 pEnd++;
JonFreeman 5:21a8ac83142c 172 }
JonFreeman 5:21a8ac83142c 173 }
JonFreeman 5:21a8ac83142c 174 //pc.printf ("\r\n"); // Not allowed as many may output this.
JonFreeman 5:21a8ac83142c 175 //for (int k = 0; k < param_block.numof_dbls; k++)
JonFreeman 5:21a8ac83142c 176 // pc.printf ("Read %.3f\r\n", param_block.dbl[k]);
JonFreeman 5:21a8ac83142c 177 // param_block.times[i] = clock();
JonFreeman 5:21a8ac83142c 178 // if ((param_block.target_unit == BROADCAST) && (I_Am() == '0'))
JonFreeman 5:21a8ac83142c 179 // param_block.respond = true;
JonFreeman 5:21a8ac83142c 180 a.clist[i].f(a); // execute command
JonFreeman 5:21a8ac83142c 181 i = a.numof_menu_items + 1; // to exit for loop
JonFreeman 5:21a8ac83142c 182 } // end of match found
JonFreeman 5:21a8ac83142c 183 } // End of for numof_menu_items
JonFreeman 5:21a8ac83142c 184 if(i == a.numof_menu_items)
JonFreeman 5:21a8ac83142c 185 pc.printf("No Match Found for CMD [%s]\r\n", a.cmd_line);
JonFreeman 5:21a8ac83142c 186 } // End of If have got some chars to lookup
JonFreeman 5:21a8ac83142c 187 //pc.printf("\r\n>");
JonFreeman 5:21a8ac83142c 188 a.cl_index = 0;
JonFreeman 5:21a8ac83142c 189 } // End of else key was CR, may or may not be command to lookup
JonFreeman 5:21a8ac83142c 190 } // End of while (pc.readable())
JonFreeman 5:21a8ac83142c 191 }
JonFreeman 5:21a8ac83142c 192
JonFreeman 4:67478861c670 193
JonFreeman 4:67478861c670 194 /*
JonFreeman 4:67478861c670 195 New - March 2018
JonFreeman 4:67478861c670 196 Using opto isolated serial port, paralleled up using same pair to multiple boards running this code.
JonFreeman 4:67478861c670 197 New feature - commands have optional prefix digit 0-9 indicating which unit message is addressed to.
JonFreeman 4:67478861c670 198 Commands without prefix digit - broadcast to all units, none to respond.
JonFreeman 4:67478861c670 199 Only units recognising its address from prefix digit may respond. This avoids bus contention.
JonFreeman 4:67478861c670 200 But for BROADCAST commands, '0' may respond on behalf of the group
JonFreeman 4:67478861c670 201 */
JonFreeman 4:67478861c670 202 //void command_line_interpreter (void const *argument)
JonFreeman 5:21a8ac83142c 203 /*void command_line_interpreter ()
JonFreeman 4:67478861c670 204 {
JonFreeman 5:21a8ac83142c 205 const int MAX_CMD_LEN = 120;
JonFreeman 5:21a8ac83142c 206 static char cmd_line[MAX_CMD_LEN + 4];
JonFreeman 5:21a8ac83142c 207 static int cl_index = 0;
JonFreeman 5:21a8ac83142c 208 int ch;
JonFreeman 5:21a8ac83142c 209 char * pEnd, * cmd_line_ptr;
JonFreeman 5:21a8ac83142c 210 static struct parameters param_block ;
JonFreeman 5:21a8ac83142c 211 while (pc.readable()) {
JonFreeman 5:21a8ac83142c 212 ch = pc.getc();
JonFreeman 5:21a8ac83142c 213 // if (cl_index > MAX_CMD_LEN) { // trap out stupidly long command lines
JonFreeman 5:21a8ac83142c 214 // pc.printf ("Error!! Stupidly long cmd line\r\n");
JonFreeman 5:21a8ac83142c 215 // cl_index = 0;
JonFreeman 5:21a8ac83142c 216 // }
JonFreeman 5:21a8ac83142c 217 if(ch != '\r') // was this the 'Enter' key?
JonFreeman 5:21a8ac83142c 218 cmd_line[cl_index++] = ch; // added char to command being assembled
JonFreeman 5:21a8ac83142c 219 else { // key was CR, may or may not be command to lookup
JonFreeman 5:21a8ac83142c 220 param_block.target_unit = BROADCAST; // Broadcast
JonFreeman 5:21a8ac83142c 221 cmd_line_ptr = cmd_line;
JonFreeman 5:21a8ac83142c 222 cmd_line[cl_index] = 0; // null terminate command string
JonFreeman 5:21a8ac83142c 223 if(cl_index) { // If have got some chars to lookup
JonFreeman 5:21a8ac83142c 224 int i, wrdlen;
JonFreeman 5:21a8ac83142c 225 if (isdigit(cmd_line[0])) { // Look for command with prefix digit
JonFreeman 5:21a8ac83142c 226 cmd_line_ptr++; // point past identified digit prefix
JonFreeman 5:21a8ac83142c 227 param_block.target_unit = cmd_line[0]; // '0' to '9'
JonFreeman 5:21a8ac83142c 228 //pc.printf ("Got prefix %c\r\n", cmd_line[0]);
JonFreeman 5:21a8ac83142c 229 }
JonFreeman 5:21a8ac83142c 230 for (i = 0; i < numof_menu_items; i++) { // Look for input match in command list
JonFreeman 5:21a8ac83142c 231 wrdlen = strlen(command_list[i].cmd_word);
JonFreeman 5:21a8ac83142c 232 if(strncmp(command_list[i].cmd_word, cmd_line_ptr, wrdlen) == 0 && !isalpha(cmd_line_ptr[wrdlen])) { // If match found
JonFreeman 5:21a8ac83142c 233 for (int k = 0; k < MAX_PARAMS; k++) {
JonFreeman 5:21a8ac83142c 234 param_block.dbl[k] = 0.0;
JonFreeman 5:21a8ac83142c 235 }
JonFreeman 5:21a8ac83142c 236 param_block.position_in_list = i;
JonFreeman 5:21a8ac83142c 237 param_block.numof_dbls = 0;
JonFreeman 5:21a8ac83142c 238 pEnd = cmd_line_ptr + wrdlen;
JonFreeman 5:21a8ac83142c 239 while (*pEnd) { // Assemble all numerics as doubles
JonFreeman 5:21a8ac83142c 240 param_block.dbl[param_block.numof_dbls++] = strtod (pEnd, &pEnd);
JonFreeman 5:21a8ac83142c 241 while (*pEnd && !isdigit(*pEnd) && '-' != *pEnd && '+' != *pEnd) {
JonFreeman 5:21a8ac83142c 242 pEnd++;
JonFreeman 4:67478861c670 243 }
JonFreeman 5:21a8ac83142c 244 }
JonFreeman 5:21a8ac83142c 245 //pc.printf ("\r\n"); // Not allowed as many may output this.
JonFreeman 5:21a8ac83142c 246 //for (int k = 0; k < param_block.numof_dbls; k++)
JonFreeman 5:21a8ac83142c 247 // pc.printf ("Read %.3f\r\n", param_block.dbl[k]);
JonFreeman 4:67478861c670 248 // param_block.times[i] = clock();
JonFreeman 4:67478861c670 249 // if ((param_block.target_unit == BROADCAST) && (I_Am() == '0'))
JonFreeman 4:67478861c670 250 // param_block.respond = true;
JonFreeman 5:21a8ac83142c 251 command_list[i].f(param_block); // execute command
JonFreeman 5:21a8ac83142c 252 i = numof_menu_items + 1; // to exit for loop
JonFreeman 5:21a8ac83142c 253 } // end of match found
JonFreeman 5:21a8ac83142c 254 } // End of for numof_menu_items
JonFreeman 5:21a8ac83142c 255 if(i == numof_menu_items)
JonFreeman 5:21a8ac83142c 256 pc.printf("No Match Found for CMD [%s]\r\n", cmd_line);
JonFreeman 5:21a8ac83142c 257 } // End of If have got some chars to lookup
JonFreeman 5:21a8ac83142c 258 //pc.printf("\r\n>");
JonFreeman 5:21a8ac83142c 259 cl_index = 0;
JonFreeman 5:21a8ac83142c 260 } // End of else key was CR, may or may not be command to lookup
JonFreeman 5:21a8ac83142c 261 } // End of while (pc.readable())
JonFreeman 4:67478861c670 262 // Thread::wait(20); // Using RTOS on this project
JonFreeman 4:67478861c670 263 // }
JonFreeman 4:67478861c670 264 }
JonFreeman 5:21a8ac83142c 265 */
JonFreeman 4:67478861c670 266