ftf connects lab 2

Dependencies:   PCAL955x ST7567 SoftPWM

Revision:
0:6504c8e693e1
Child:
1:18ac195ad292
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Nov 04 23:59:49 2016 +0000
@@ -0,0 +1,284 @@
+/**
+ *  @brief NXP FTF LAB2 - Using the UART controls shield with a custom shell
+ */
+
+
+#include "mbed.h"
+#include "ST7567.h"
+
+
+/* LCD screen dimensions */
+#define LCD_HEIGHT          64
+#define LCD_WIDTH           128
+
+/* LCD font dimensions */
+#define FONT_HEIGHT         10
+#define FONT_WIDTH          5
+
+/** Instance a on board GLCD object */
+ ST7567 glcd(D11, D13, D12, D9, D10);
+
+/** Instance a Led array */
+DigitalOut led1(LED1);
+DigitalOut led2(LED2);
+DigitalOut led3(LED3);
+
+
+/** Instance a UART class to communicate with pc */
+Serial pc_serial(USBTX,USBRX);
+
+/** character buffer */
+char serial_buffer[1024] = {0};
+char command_buffer[256];
+int read_ptr = 0;
+
+/**
+ * @brief led command interface 
+ */
+static void leds_out(int argc, char **argv) {
+    if(argc < 2) {
+        /* this function must have two arguments */
+        pc_serial.printf("## leds: too few arguments, extiging. \n\r");
+    } else {
+        if(strcmp(argv[0], "on") == 0){
+            /* select which led we have to turn on */
+            if(strcmp(argv[1], "LED1") == 0) {
+                led1 = 0;
+            }else if(strcmp(argv[1], "LED2") == 0) {
+                led2 = 0;
+                
+            }else if(strcmp(argv[1], "LED3") == 0) {
+                led3 = 0;
+
+            }else {
+                pc_serial.printf("leds: invalid arguments, exiting \n\r");
+            }
+        }else if (strcmp(argv[0], "off") == 0){
+            /* select which led we have to turn off */
+            
+            if(strcmp(argv[1], "LED1") == 0) {
+                led1 = 1;
+
+            }else if(strcmp(argv[1], "LED2") == 0) {
+                led2 = 1;
+
+            }else if(strcmp(argv[1], "LED3") == 0) {
+                led3 = 1;
+            }else {
+                pc_serial.printf("leds: invalid arguments, exiting \n\r");
+            }
+
+        }else {
+            pc_serial.printf("leds: invalid arguments, exting \n\r");
+        }
+    }
+
+}
+
+/**
+ * @brief led command interface 
+ */
+static void display(int argc, char **argv) {
+    char disp_buffer[64] = {0};
+    int position_x = 0;
+    int position_y = 0;    
+    
+    if(argc < 3) {
+        pc_serial.printf("display: Too few arguments, exiting \n\r");
+    } else {
+        sscanf(argv[0], "%3d", &position_x);
+        sscanf(argv[1], "%2d", &position_y);
+
+        /* check position range */
+        if(position_x > 127 || position_x < 0) {
+            pc_serial.printf("## display: Invalid arguments, exiting");    
+            return;
+        }
+
+        if(position_y > 63 || position_y < 0) {
+            pc_serial.printf("## display: Invalid arguments, exiting");    
+            return;
+        }
+
+        /* rebuild the string */
+        for(int i = 0; i < (argc - 2); i++) {
+            strcat(&disp_buffer[0], argv[2 + i]);
+            strcat(&disp_buffer[0],(const char *)" ");
+        }
+
+        
+        /* check consistency */
+        //pc_serial.printf("## %3d \n\r", position_x);
+        //pc_serial.printf("## %2d \n\r", position_y);
+        //pc_serial.printf("## %s \n\r", disp_buffer);
+        
+        /* prints on the lcd */
+        glcd.locate(position_x * FONT_WIDTH, position_y * FONT_HEIGHT);
+        glcd.cls();
+        glcd.printf(disp_buffer);    
+    }
+
+}
+
+/**
+ * @brief led command interface 
+ */
+static void get_info(int argc, char **argv) {
+    pc_serial.printf("## *****************************************************\n\r");
+    pc_serial.printf("## *   CPU Board: LPCXpresso 4337                      *\n\r");
+    pc_serial.printf("## *   Shield Board: General Purpose Shield            *\n\r");
+    pc_serial.printf("## *   SOC: NXP LPC4337 Dual Core Soc                  *\n\r");
+    pc_serial.printf("## *   CPU1: ARM Cortex M4 (ARMv7M)                    *\n\r");
+    pc_serial.printf("## *   CPU1: ARM Cortex M0 (ARMv6M)                    *\n\r");
+    pc_serial.printf("## *   CPU Clocks: 120000000 Hz                        *\n\r");
+    pc_serial.printf("## *****************************************************\n\r");    
+
+}
+
+/**
+ * @brief led command interface 
+ */
+static void print_usage(void) {
+    pc_serial.printf("## use with the syntax below:         \n\r");
+    pc_serial.printf("## command <arg1> <arg2> ... <arg16>  \n\r");
+    pc_serial.printf("## Available commands:                \n\r");
+    pc_serial.printf("## leds    <on|off> <LED1|LED2|LED3> : control the LPC4337 leds \n\r");
+    pc_serial.printf("## display  <x> <y> <msg>            : prints [msg] on the on board lcd with optional clear \n\r");        
+    pc_serial.printf("## get_info : gets LPC4337 Processor informantion \n\r");
+}
+
+/**
+ * @brief shell parser  
+ */
+void shell_parser (char *cmd, int size) {
+    int command;
+    int cmd_ptr = 0;
+    int arg_ptr = 0;
+    int cmd_size = 0;
+    
+    int argc = 0;
+    char *argv[16];    
+    
+    /* copy to the root command */
+    memset(&command_buffer, 0, sizeof(command_buffer)); 
+    
+    /* find the root command terminator (space) */
+    while(cmd_ptr < size) {
+        if(cmd[cmd_ptr] == ' ') break;
+        cmd_ptr++;
+    }
+    cmd_size = size - cmd_ptr;
+    
+    
+    /* extract command arguments */
+    strncpy(&command_buffer[0], &cmd[cmd_ptr + 1], (size - cmd_ptr));    
+    
+    /* terminates the root command */
+    cmd[cmd_ptr] = 0;
+    arg_ptr = 0;
+    
+    //pc_serial.printf("## command: %s \n\r", cmd);
+    //pc_serial.printf("## arguments: %s \n\r", command_buffer);
+
+  
+    /* extract the further arguments */
+    while(arg_ptr < (cmd_size)) {
+ 
+        argc++;
+        *(argv + (argc- 1)) = &command_buffer[arg_ptr];
+ 
+        /* find terminator */
+        while(command_buffer[arg_ptr] != ' ') {
+            arg_ptr++;
+        }
+        
+        /* adds to argument list */
+        command_buffer[arg_ptr] = 0;
+        arg_ptr++;       
+       // pc_serial.printf("## argument no: %d : %s \n\r", argc, argv[argc-1]);
+    }
+
+
+
+    /* finds and execute the command table */
+    if(strcmp("leds", cmd) == 0) { 
+        leds_out(argc, argv);
+    } else if(strcmp("display", cmd) == 0) {
+        display(argc, argv);
+    } else if(strcmp("get_info", cmd) == 0) {
+        get_info(argc,argv);
+    } else {
+        print_usage();
+    }    
+
+}
+
+
+/**
+ * @brief main application loop
+ */
+int main(void) 
+{   
+    const char msg[] = {"Welcome to NXP FTF !\0"};
+
+    /* setup the serial as 115200 bps */
+    pc_serial.baud(115200);
+
+    /* setup our on-board glcd */
+    glcd.set_contrast(0x35);
+    glcd.cls();
+    
+    /* Center the LCD cursor based on message size*/
+    glcd.locate(LCD_WIDTH - (sizeof(msg) * FONT_WIDTH), 
+                    (LCD_HEIGHT - FONT_HEIGHT) / 2);
+
+    
+    /* prints a welcome message */
+    glcd.printf(msg);
+
+    /* initialize the leds */
+    led1 = led2 = led3 = 1;
+    
+    pc_serial.printf("******************************************************************\n\r");    
+    pc_serial.printf("***         Welcome to NXP FTF Simple Sheell application      ****\n\r");
+    pc_serial.printf("*** Type some commands or just Enter key to see the available ****\n\r");
+    pc_serial.printf("******************************************************************\n\r");            
+    pc_serial.printf(">>");
+    
+    for(;;) {        
+        /* check if we have character available */
+        if(pc_serial.readable()) {
+            bool new_cmd = false;
+            
+            
+            /* get the incoming character */
+            char c = pc_serial.getc();
+            pc_serial.putc(c);
+            
+            
+            /* is a enter ? */
+            if( (c == '\n') || (c == '\r')) {
+                new_cmd = true;
+                pc_serial.getc();
+                
+            } else {
+                serial_buffer[read_ptr] = c;
+                read_ptr = (read_ptr + 1) % 1024;
+            }
+            
+            if(new_cmd != false) {
+                /* command arrived, has other characters? */
+                if(read_ptr != 0) {
+                    shell_parser(&serial_buffer[0], read_ptr);
+                } else {
+                    print_usage();
+                }
+                /* reset the buffer command */
+                memset(&serial_buffer, 0, sizeof(serial_buffer));
+                read_ptr = 0;
+                pc_serial.printf(">>");
+            } 
+
+        }        
+    }
+}