ftf connects lab 2

Dependencies:   PCAL955x ST7567 SoftPWM

main.cpp

Committer:
uLipe
Date:
2016-11-05
Revision:
1:18ac195ad292
Parent:
0:6504c8e693e1

File content as of revision 1:18ac195ad292:

/**
 *  @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 Shell 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();
                       
            if( (c == '\n') || (c == '\r')) {
                /* handle enter key */
                new_cmd = true;
                pc_serial.printf("\n\r");
                
            }else if( (c == 0x7F) || (c == 0x08)){
                /* handle backspace and del keys */
                pc_serial.printf("\033[1D");
                pc_serial.putc(' ');
                pc_serial.printf("\033[1D");
                
                read_ptr--;
                if(read_ptr < -1) read_ptr = 1023;
                serial_buffer[read_ptr] = ' ';

                
            } else {
                /* loopback the pressed key */
                pc_serial.putc(c);
                
                /* store the incoming character on command circular buffer */
                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(">>");
            } 

        }        
    }
}