ftf connects lab 2

Dependencies:   PCAL955x ST7567 SoftPWM

Committer:
uLipe
Date:
Sat Nov 05 23:26:29 2016 +0000
Revision:
1:18ac195ad292
Parent:
0:6504c8e693e1
added backspace suuport independent of terminal tool;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
uLipe 0:6504c8e693e1 1 /**
uLipe 0:6504c8e693e1 2 * @brief NXP FTF LAB2 - Using the UART controls shield with a custom shell
uLipe 0:6504c8e693e1 3 */
uLipe 0:6504c8e693e1 4
uLipe 0:6504c8e693e1 5
uLipe 0:6504c8e693e1 6 #include "mbed.h"
uLipe 0:6504c8e693e1 7 #include "ST7567.h"
uLipe 0:6504c8e693e1 8
uLipe 0:6504c8e693e1 9
uLipe 0:6504c8e693e1 10 /* LCD screen dimensions */
uLipe 0:6504c8e693e1 11 #define LCD_HEIGHT 64
uLipe 0:6504c8e693e1 12 #define LCD_WIDTH 128
uLipe 0:6504c8e693e1 13
uLipe 0:6504c8e693e1 14 /* LCD font dimensions */
uLipe 0:6504c8e693e1 15 #define FONT_HEIGHT 10
uLipe 0:6504c8e693e1 16 #define FONT_WIDTH 5
uLipe 0:6504c8e693e1 17
uLipe 0:6504c8e693e1 18 /** Instance a on board GLCD object */
uLipe 0:6504c8e693e1 19 ST7567 glcd(D11, D13, D12, D9, D10);
uLipe 0:6504c8e693e1 20
uLipe 0:6504c8e693e1 21 /** Instance a Led array */
uLipe 0:6504c8e693e1 22 DigitalOut led1(LED1);
uLipe 0:6504c8e693e1 23 DigitalOut led2(LED2);
uLipe 0:6504c8e693e1 24 DigitalOut led3(LED3);
uLipe 0:6504c8e693e1 25
uLipe 0:6504c8e693e1 26
uLipe 0:6504c8e693e1 27 /** Instance a UART class to communicate with pc */
uLipe 0:6504c8e693e1 28 Serial pc_serial(USBTX,USBRX);
uLipe 0:6504c8e693e1 29
uLipe 0:6504c8e693e1 30 /** character buffer */
uLipe 0:6504c8e693e1 31 char serial_buffer[1024] = {0};
uLipe 0:6504c8e693e1 32 char command_buffer[256];
uLipe 0:6504c8e693e1 33 int read_ptr = 0;
uLipe 0:6504c8e693e1 34
uLipe 0:6504c8e693e1 35 /**
uLipe 0:6504c8e693e1 36 * @brief led command interface
uLipe 0:6504c8e693e1 37 */
uLipe 0:6504c8e693e1 38 static void leds_out(int argc, char **argv) {
uLipe 0:6504c8e693e1 39 if(argc < 2) {
uLipe 0:6504c8e693e1 40 /* this function must have two arguments */
uLipe 0:6504c8e693e1 41 pc_serial.printf("## leds: too few arguments, extiging. \n\r");
uLipe 0:6504c8e693e1 42 } else {
uLipe 0:6504c8e693e1 43 if(strcmp(argv[0], "on") == 0){
uLipe 0:6504c8e693e1 44 /* select which led we have to turn on */
uLipe 0:6504c8e693e1 45 if(strcmp(argv[1], "LED1") == 0) {
uLipe 0:6504c8e693e1 46 led1 = 0;
uLipe 0:6504c8e693e1 47 }else if(strcmp(argv[1], "LED2") == 0) {
uLipe 0:6504c8e693e1 48 led2 = 0;
uLipe 0:6504c8e693e1 49
uLipe 0:6504c8e693e1 50 }else if(strcmp(argv[1], "LED3") == 0) {
uLipe 0:6504c8e693e1 51 led3 = 0;
uLipe 0:6504c8e693e1 52
uLipe 0:6504c8e693e1 53 }else {
uLipe 0:6504c8e693e1 54 pc_serial.printf("leds: invalid arguments, exiting \n\r");
uLipe 0:6504c8e693e1 55 }
uLipe 0:6504c8e693e1 56 }else if (strcmp(argv[0], "off") == 0){
uLipe 0:6504c8e693e1 57 /* select which led we have to turn off */
uLipe 0:6504c8e693e1 58
uLipe 0:6504c8e693e1 59 if(strcmp(argv[1], "LED1") == 0) {
uLipe 0:6504c8e693e1 60 led1 = 1;
uLipe 0:6504c8e693e1 61
uLipe 0:6504c8e693e1 62 }else if(strcmp(argv[1], "LED2") == 0) {
uLipe 0:6504c8e693e1 63 led2 = 1;
uLipe 0:6504c8e693e1 64
uLipe 0:6504c8e693e1 65 }else if(strcmp(argv[1], "LED3") == 0) {
uLipe 0:6504c8e693e1 66 led3 = 1;
uLipe 0:6504c8e693e1 67 }else {
uLipe 0:6504c8e693e1 68 pc_serial.printf("leds: invalid arguments, exiting \n\r");
uLipe 0:6504c8e693e1 69 }
uLipe 0:6504c8e693e1 70
uLipe 0:6504c8e693e1 71 }else {
uLipe 0:6504c8e693e1 72 pc_serial.printf("leds: invalid arguments, exting \n\r");
uLipe 0:6504c8e693e1 73 }
uLipe 0:6504c8e693e1 74 }
uLipe 0:6504c8e693e1 75
uLipe 0:6504c8e693e1 76 }
uLipe 0:6504c8e693e1 77
uLipe 0:6504c8e693e1 78 /**
uLipe 0:6504c8e693e1 79 * @brief led command interface
uLipe 0:6504c8e693e1 80 */
uLipe 0:6504c8e693e1 81 static void display(int argc, char **argv) {
uLipe 0:6504c8e693e1 82 char disp_buffer[64] = {0};
uLipe 0:6504c8e693e1 83 int position_x = 0;
uLipe 0:6504c8e693e1 84 int position_y = 0;
uLipe 0:6504c8e693e1 85
uLipe 0:6504c8e693e1 86 if(argc < 3) {
uLipe 0:6504c8e693e1 87 pc_serial.printf("display: Too few arguments, exiting \n\r");
uLipe 0:6504c8e693e1 88 } else {
uLipe 0:6504c8e693e1 89 sscanf(argv[0], "%3d", &position_x);
uLipe 0:6504c8e693e1 90 sscanf(argv[1], "%2d", &position_y);
uLipe 0:6504c8e693e1 91
uLipe 0:6504c8e693e1 92 /* check position range */
uLipe 0:6504c8e693e1 93 if(position_x > 127 || position_x < 0) {
uLipe 0:6504c8e693e1 94 pc_serial.printf("## display: Invalid arguments, exiting");
uLipe 0:6504c8e693e1 95 return;
uLipe 0:6504c8e693e1 96 }
uLipe 0:6504c8e693e1 97
uLipe 0:6504c8e693e1 98 if(position_y > 63 || position_y < 0) {
uLipe 0:6504c8e693e1 99 pc_serial.printf("## display: Invalid arguments, exiting");
uLipe 0:6504c8e693e1 100 return;
uLipe 0:6504c8e693e1 101 }
uLipe 0:6504c8e693e1 102
uLipe 0:6504c8e693e1 103 /* rebuild the string */
uLipe 0:6504c8e693e1 104 for(int i = 0; i < (argc - 2); i++) {
uLipe 0:6504c8e693e1 105 strcat(&disp_buffer[0], argv[2 + i]);
uLipe 0:6504c8e693e1 106 strcat(&disp_buffer[0],(const char *)" ");
uLipe 0:6504c8e693e1 107 }
uLipe 0:6504c8e693e1 108
uLipe 0:6504c8e693e1 109
uLipe 0:6504c8e693e1 110 /* check consistency */
uLipe 0:6504c8e693e1 111 //pc_serial.printf("## %3d \n\r", position_x);
uLipe 0:6504c8e693e1 112 //pc_serial.printf("## %2d \n\r", position_y);
uLipe 0:6504c8e693e1 113 //pc_serial.printf("## %s \n\r", disp_buffer);
uLipe 0:6504c8e693e1 114
uLipe 0:6504c8e693e1 115 /* prints on the lcd */
uLipe 0:6504c8e693e1 116 glcd.locate(position_x * FONT_WIDTH, position_y * FONT_HEIGHT);
uLipe 0:6504c8e693e1 117 glcd.cls();
uLipe 0:6504c8e693e1 118 glcd.printf(disp_buffer);
uLipe 0:6504c8e693e1 119 }
uLipe 0:6504c8e693e1 120
uLipe 0:6504c8e693e1 121 }
uLipe 0:6504c8e693e1 122
uLipe 0:6504c8e693e1 123 /**
uLipe 0:6504c8e693e1 124 * @brief led command interface
uLipe 0:6504c8e693e1 125 */
uLipe 0:6504c8e693e1 126 static void get_info(int argc, char **argv) {
uLipe 0:6504c8e693e1 127 pc_serial.printf("## *****************************************************\n\r");
uLipe 0:6504c8e693e1 128 pc_serial.printf("## * CPU Board: LPCXpresso 4337 *\n\r");
uLipe 0:6504c8e693e1 129 pc_serial.printf("## * Shield Board: General Purpose Shield *\n\r");
uLipe 0:6504c8e693e1 130 pc_serial.printf("## * SOC: NXP LPC4337 Dual Core Soc *\n\r");
uLipe 0:6504c8e693e1 131 pc_serial.printf("## * CPU1: ARM Cortex M4 (ARMv7M) *\n\r");
uLipe 0:6504c8e693e1 132 pc_serial.printf("## * CPU1: ARM Cortex M0 (ARMv6M) *\n\r");
uLipe 0:6504c8e693e1 133 pc_serial.printf("## * CPU Clocks: 120000000 Hz *\n\r");
uLipe 0:6504c8e693e1 134 pc_serial.printf("## *****************************************************\n\r");
uLipe 0:6504c8e693e1 135
uLipe 0:6504c8e693e1 136 }
uLipe 0:6504c8e693e1 137
uLipe 0:6504c8e693e1 138 /**
uLipe 0:6504c8e693e1 139 * @brief led command interface
uLipe 0:6504c8e693e1 140 */
uLipe 0:6504c8e693e1 141 static void print_usage(void) {
uLipe 0:6504c8e693e1 142 pc_serial.printf("## use with the syntax below: \n\r");
uLipe 0:6504c8e693e1 143 pc_serial.printf("## command <arg1> <arg2> ... <arg16> \n\r");
uLipe 0:6504c8e693e1 144 pc_serial.printf("## Available commands: \n\r");
uLipe 0:6504c8e693e1 145 pc_serial.printf("## leds <on|off> <LED1|LED2|LED3> : control the LPC4337 leds \n\r");
uLipe 0:6504c8e693e1 146 pc_serial.printf("## display <x> <y> <msg> : prints [msg] on the on board lcd with optional clear \n\r");
uLipe 0:6504c8e693e1 147 pc_serial.printf("## get_info : gets LPC4337 Processor informantion \n\r");
uLipe 0:6504c8e693e1 148 }
uLipe 0:6504c8e693e1 149
uLipe 0:6504c8e693e1 150 /**
uLipe 0:6504c8e693e1 151 * @brief shell parser
uLipe 0:6504c8e693e1 152 */
uLipe 0:6504c8e693e1 153 void shell_parser (char *cmd, int size) {
uLipe 0:6504c8e693e1 154 int command;
uLipe 0:6504c8e693e1 155 int cmd_ptr = 0;
uLipe 0:6504c8e693e1 156 int arg_ptr = 0;
uLipe 0:6504c8e693e1 157 int cmd_size = 0;
uLipe 0:6504c8e693e1 158
uLipe 0:6504c8e693e1 159 int argc = 0;
uLipe 0:6504c8e693e1 160 char *argv[16];
uLipe 0:6504c8e693e1 161
uLipe 0:6504c8e693e1 162 /* copy to the root command */
uLipe 0:6504c8e693e1 163 memset(&command_buffer, 0, sizeof(command_buffer));
uLipe 0:6504c8e693e1 164
uLipe 0:6504c8e693e1 165 /* find the root command terminator (space) */
uLipe 0:6504c8e693e1 166 while(cmd_ptr < size) {
uLipe 0:6504c8e693e1 167 if(cmd[cmd_ptr] == ' ') break;
uLipe 0:6504c8e693e1 168 cmd_ptr++;
uLipe 0:6504c8e693e1 169 }
uLipe 0:6504c8e693e1 170 cmd_size = size - cmd_ptr;
uLipe 0:6504c8e693e1 171
uLipe 0:6504c8e693e1 172
uLipe 0:6504c8e693e1 173 /* extract command arguments */
uLipe 0:6504c8e693e1 174 strncpy(&command_buffer[0], &cmd[cmd_ptr + 1], (size - cmd_ptr));
uLipe 0:6504c8e693e1 175
uLipe 0:6504c8e693e1 176 /* terminates the root command */
uLipe 0:6504c8e693e1 177 cmd[cmd_ptr] = 0;
uLipe 0:6504c8e693e1 178 arg_ptr = 0;
uLipe 0:6504c8e693e1 179
uLipe 0:6504c8e693e1 180 //pc_serial.printf("## command: %s \n\r", cmd);
uLipe 0:6504c8e693e1 181 //pc_serial.printf("## arguments: %s \n\r", command_buffer);
uLipe 0:6504c8e693e1 182
uLipe 0:6504c8e693e1 183
uLipe 0:6504c8e693e1 184 /* extract the further arguments */
uLipe 0:6504c8e693e1 185 while(arg_ptr < (cmd_size)) {
uLipe 0:6504c8e693e1 186
uLipe 0:6504c8e693e1 187 argc++;
uLipe 0:6504c8e693e1 188 *(argv + (argc- 1)) = &command_buffer[arg_ptr];
uLipe 0:6504c8e693e1 189
uLipe 0:6504c8e693e1 190 /* find terminator */
uLipe 0:6504c8e693e1 191 while(command_buffer[arg_ptr] != ' ') {
uLipe 0:6504c8e693e1 192 arg_ptr++;
uLipe 0:6504c8e693e1 193 }
uLipe 0:6504c8e693e1 194
uLipe 0:6504c8e693e1 195 /* adds to argument list */
uLipe 0:6504c8e693e1 196 command_buffer[arg_ptr] = 0;
uLipe 0:6504c8e693e1 197 arg_ptr++;
uLipe 0:6504c8e693e1 198 // pc_serial.printf("## argument no: %d : %s \n\r", argc, argv[argc-1]);
uLipe 0:6504c8e693e1 199 }
uLipe 0:6504c8e693e1 200
uLipe 0:6504c8e693e1 201
uLipe 0:6504c8e693e1 202
uLipe 0:6504c8e693e1 203 /* finds and execute the command table */
uLipe 0:6504c8e693e1 204 if(strcmp("leds", cmd) == 0) {
uLipe 0:6504c8e693e1 205 leds_out(argc, argv);
uLipe 0:6504c8e693e1 206 } else if(strcmp("display", cmd) == 0) {
uLipe 0:6504c8e693e1 207 display(argc, argv);
uLipe 0:6504c8e693e1 208 } else if(strcmp("get_info", cmd) == 0) {
uLipe 0:6504c8e693e1 209 get_info(argc,argv);
uLipe 0:6504c8e693e1 210 } else {
uLipe 0:6504c8e693e1 211 print_usage();
uLipe 0:6504c8e693e1 212 }
uLipe 0:6504c8e693e1 213
uLipe 0:6504c8e693e1 214 }
uLipe 0:6504c8e693e1 215
uLipe 0:6504c8e693e1 216
uLipe 0:6504c8e693e1 217 /**
uLipe 0:6504c8e693e1 218 * @brief main application loop
uLipe 0:6504c8e693e1 219 */
uLipe 0:6504c8e693e1 220 int main(void)
uLipe 0:6504c8e693e1 221 {
uLipe 0:6504c8e693e1 222 const char msg[] = {"Welcome to NXP FTF !\0"};
uLipe 0:6504c8e693e1 223
uLipe 0:6504c8e693e1 224 /* setup the serial as 115200 bps */
uLipe 0:6504c8e693e1 225 pc_serial.baud(115200);
uLipe 0:6504c8e693e1 226
uLipe 0:6504c8e693e1 227 /* setup our on-board glcd */
uLipe 0:6504c8e693e1 228 glcd.set_contrast(0x35);
uLipe 0:6504c8e693e1 229 glcd.cls();
uLipe 0:6504c8e693e1 230
uLipe 0:6504c8e693e1 231 /* Center the LCD cursor based on message size*/
uLipe 0:6504c8e693e1 232 glcd.locate(LCD_WIDTH - (sizeof(msg) * FONT_WIDTH),
uLipe 0:6504c8e693e1 233 (LCD_HEIGHT - FONT_HEIGHT) / 2);
uLipe 0:6504c8e693e1 234
uLipe 0:6504c8e693e1 235
uLipe 0:6504c8e693e1 236 /* prints a welcome message */
uLipe 0:6504c8e693e1 237 glcd.printf(msg);
uLipe 0:6504c8e693e1 238
uLipe 0:6504c8e693e1 239 /* initialize the leds */
uLipe 0:6504c8e693e1 240 led1 = led2 = led3 = 1;
uLipe 0:6504c8e693e1 241
uLipe 0:6504c8e693e1 242 pc_serial.printf("******************************************************************\n\r");
uLipe 1:18ac195ad292 243 pc_serial.printf("*** Welcome to NXP FTF Simple Shell application ****\n\r");
uLipe 0:6504c8e693e1 244 pc_serial.printf("*** Type some commands or just Enter key to see the available ****\n\r");
uLipe 0:6504c8e693e1 245 pc_serial.printf("******************************************************************\n\r");
uLipe 0:6504c8e693e1 246 pc_serial.printf(">>");
uLipe 0:6504c8e693e1 247
uLipe 0:6504c8e693e1 248 for(;;) {
uLipe 0:6504c8e693e1 249 /* check if we have character available */
uLipe 0:6504c8e693e1 250 if(pc_serial.readable()) {
uLipe 0:6504c8e693e1 251 bool new_cmd = false;
uLipe 0:6504c8e693e1 252
uLipe 0:6504c8e693e1 253 /* get the incoming character */
uLipe 0:6504c8e693e1 254 char c = pc_serial.getc();
uLipe 1:18ac195ad292 255
uLipe 0:6504c8e693e1 256 if( (c == '\n') || (c == '\r')) {
uLipe 1:18ac195ad292 257 /* handle enter key */
uLipe 0:6504c8e693e1 258 new_cmd = true;
uLipe 1:18ac195ad292 259 pc_serial.printf("\n\r");
uLipe 1:18ac195ad292 260
uLipe 1:18ac195ad292 261 }else if( (c == 0x7F) || (c == 0x08)){
uLipe 1:18ac195ad292 262 /* handle backspace and del keys */
uLipe 1:18ac195ad292 263 pc_serial.printf("\033[1D");
uLipe 1:18ac195ad292 264 pc_serial.putc(' ');
uLipe 1:18ac195ad292 265 pc_serial.printf("\033[1D");
uLipe 1:18ac195ad292 266
uLipe 1:18ac195ad292 267 read_ptr--;
uLipe 1:18ac195ad292 268 if(read_ptr < -1) read_ptr = 1023;
uLipe 1:18ac195ad292 269 serial_buffer[read_ptr] = ' ';
uLipe 1:18ac195ad292 270
uLipe 0:6504c8e693e1 271
uLipe 0:6504c8e693e1 272 } else {
uLipe 1:18ac195ad292 273 /* loopback the pressed key */
uLipe 1:18ac195ad292 274 pc_serial.putc(c);
uLipe 1:18ac195ad292 275
uLipe 1:18ac195ad292 276 /* store the incoming character on command circular buffer */
uLipe 0:6504c8e693e1 277 serial_buffer[read_ptr] = c;
uLipe 0:6504c8e693e1 278 read_ptr = (read_ptr + 1) % 1024;
uLipe 0:6504c8e693e1 279 }
uLipe 0:6504c8e693e1 280
uLipe 1:18ac195ad292 281
uLipe 1:18ac195ad292 282
uLipe 0:6504c8e693e1 283 if(new_cmd != false) {
uLipe 0:6504c8e693e1 284 /* command arrived, has other characters? */
uLipe 0:6504c8e693e1 285 if(read_ptr != 0) {
uLipe 0:6504c8e693e1 286 shell_parser(&serial_buffer[0], read_ptr);
uLipe 0:6504c8e693e1 287 } else {
uLipe 0:6504c8e693e1 288 print_usage();
uLipe 0:6504c8e693e1 289 }
uLipe 0:6504c8e693e1 290 /* reset the buffer command */
uLipe 0:6504c8e693e1 291 memset(&serial_buffer, 0, sizeof(serial_buffer));
uLipe 0:6504c8e693e1 292 read_ptr = 0;
uLipe 0:6504c8e693e1 293 pc_serial.printf(">>");
uLipe 0:6504c8e693e1 294 }
uLipe 0:6504c8e693e1 295
uLipe 0:6504c8e693e1 296 }
uLipe 0:6504c8e693e1 297 }
uLipe 0:6504c8e693e1 298 }