a command line interface that can dynamically assign pins

Dependencies:   TextLCD mbed PS2

Command.cpp

Committer:
gsulc
Date:
2011-10-20
Revision:
0:4b04cc4cccb4

File content as of revision 0:4b04cc4cccb4:

/**************************************************************/
// Name: Commande.h
// 
// Description: defines a command object for checking and  
//  executing commands
//
/**************************************************************/

#include "Command.h"
#include "Interface.h"
#include "PS2Keyboard.h"
#include <string.h>
#include "keyname.h"
#include "TextLCD.h"
#include <stdlib.h>

Interface interface[32];

/*Command::Command(char* cmdname){
    strcpy(name, cmdname);
    parameter_count = 0;
}

int Command::addParameter(char* param){
    
    return parameter_count++;
}*/

PS2Keyboard ps2kb(p12, p11); // CLK, DAT
//Serial pc(USBTX, USBRX);
TextLCD pc(p15, p16, p17, p18, p19, p20);
//char input[32];

DigitalOut testled(LED2);

void execute(char* input){
    char* cmdname = strtok(input," -");
    char* param;
    if(strcmp(cmdname, "DIN") == 0){
        param = strtok(NULL," -");
        // create operation
        if(strcmp(param, "C") == 0){
            param = strtok (NULL," -");
            if(param[0] == 'P'){
                int pin_num = str2int(param+1);
                if(pin_num >= 5 && pin_num <= 32){
                    pc.printf("\n\nCreating D_IN...");
                    wait(2);
                    interface[pin_num-5].p_object = malloc(sizeof(DigitalIn));
                    memmove(interface[pin_num-5].p_object, &DigitalIn(getPin(pin_num)), sizeof(DigitalIn));
                }
            }
            else {  //pins not given
            }
        }
        // read operation
        else if(strcmp(param, "R") == 0){
            param = strtok(NULL," -");
            if(param[0] == 'P'){
                int pin_num = str2int(param+1);
                if(pin_num >= 5 && pin_num <= 32){
                    pc.printf("\n\nReading...");
                    int val = ((DigitalIn)(*(DigitalIn*)interface[pin_num-5].p_object)).read();
                    pc.printf("\nI am: %d", val);
                    wait(2);
                }
            }
        }
    }
    else if((strcmp(cmdname, "DOUT")) == 0){
        param = strtok(NULL," -");
        // create operation
        if(strcmp(param, "C") == 0){
            param = strtok(NULL," -");
            if(param[0] == 'P'){
                int pin_num = str2int(param + 1);
                if(pin_num >= 5 && pin_num <= 32){
                    pc.printf("\n\nCreating D_Out..");
                    wait(1);
                    //DigitalOut tmp(getPin(pin_num));
                    //interface[pin_num-5].p_object = &tmp;
                    //interface[pin_num-5].dout = &DigitalOut(getPin(pin_num));
                    interface[pin_num-5].p_object = malloc(sizeof(DigitalOut));
                    //(DigitalOut)interface[pin_num-5].p_object = DigitalOut(getPin(pin_num));
                    memmove(interface[pin_num-5].p_object, &DigitalOut(getPin(pin_num)), sizeof(DigitalOut));
                    //pc.printf("\n\nwriting to %X", interface[pin_num-5].p_object);
                    //wait(2);
                    
                    /*DigitalOut t = *((DigitalOut*)(interface[pin_num-5].p_object));
                    
                    wait(4);*/
                    //interface[pin_num-5].dout = &tmp;
                    
                }
            }
            else {  //pins not given
            }
        }
        // write operation
        else if(strcmp(param, "W") == 0){
            param = strtok(NULL," -");
            if(param[0] == 'P'){
                int pin_num = str2int(param + 1);
                if(pin_num >= 5 && pin_num <= 32){
                    param = strtok(NULL," -");
                    int a = str2int(param);
                    //interface[pin_num-5].dout = a;
                    //(DigitalOut)(*((DigitalOut*)(interface[pin_num-5].dout))).write(a);
                    //DigitalOut t = *((DigitalOut*)(interface[pin_num-5].p_object));
                    //memcpy(, sizeof(DigitalOut));
                    //pc.printf("\n\na:%X", interface[pin_num-5].p_object);
                    //pc.printf("\nb:%X", &t);
                    //wait(2);
                    pc.printf("\n\nWriting...");
                    wait(2);
                    ((DigitalOut)(*(DigitalOut*)interface[pin_num-5].p_object)).write(a);
                    //t = a;
                    //(DigitalOut)(*(interface[pin_num-5].dout)).write(a);
                }
            }
            else{ //Bad pin parameter
            }
        }
        
        else if(strcmp(param, "R") == 0){
            param = strtok(NULL," -");
            if(param[0] == 'P'){
                int pin_num = str2int(param + 1);
                if(pin_num >= 5 && pin_num <= 32){
                    pc.printf("\n\nWriting...");
                    wait(2);
                    int a = ((DigitalOut)(*(DigitalOut*)interface[pin_num-5].p_object)).read();
                    pc.printf("\n\n Value = %d", a);
                    wait(2);
                }
            }
            else{ //Bad pin parameter
            }
        }
    }
    else if(!strcmp(cmdname, "I2C")){
        char* param = strtok(NULL," -");
        // create operation
        if(!strcmp(param, "C")){
            param = strtok(NULL," -");
            if(param[0] == 'P'){
                pc.printf("\n\nCreating I2C...");
                wait(2);
                int pin_num = str2int(param+1);
                interface[pin_num-5].p_object = malloc(sizeof(I2C));
                if(pin_num == 9 || pin_num == 10){
                    memmove(interface[pin_num-5].p_object, &I2C(p9, p10), sizeof(I2C));
                }
                else if(pin_num == 28 || pin_num == 27){
                    memmove(interface[pin_num-5].p_object, &I2C(p28, p27), sizeof(I2C));
                }
            }
            else {  //pins not given
            }
        }
        // write operation
        else if(!strcmp(param, "W")){
            param = strtok(NULL," -");
            if(param[0] == 'P'){
            
                pc.printf("\n\nWriting to I2C...");
                wait(2);
                int pin_num = str2int(param+1);
                //I2C tmp = *((I2C*)(interface[pin_num-5].p_object));
                
                int addr, strlen;
                
                param = strtok(NULL," -");
                addr = hexstr2int(param);
                param = strtok(NULL," -");
                strlen = str2int(param);
                char cmd[strlen];
                for(int i = 0; i < strlen; i++){
                    param = strtok(NULL," -");
                    cmd[i] = str2int(&param[i]);
                }
                
                
                ((I2C)(*(I2C*)interface[pin_num-5].p_object)).write(addr, cmd, strlen);
            }
        }
        //read
        else if(!strcmp(param, "R")){
            param = strtok(NULL," -");
            if(param[0] == 'P'){
                pc.printf("\n\nReading from I2C...");
                wait(2);
            
                int pin_num = str2int(param+1);
                int addr, strlen;
                
                param = strtok(NULL," -");
                addr = str2int(param);
                param = strtok(NULL," -");
                strlen = str2int(param);
                char cmd[strlen];
                
                ((I2C)(*(I2C*)interface[pin_num-5].p_object)).read(addr, cmd, strlen);
                // print the ranging data to the screen
                int e = 0;
                for(int i = 1; i < strlen; i++){
                    e =  ((e << 8) + cmd[i]);
                }
                float echo = (float)e* 0.01;
                pc.printf("Value = %.4f\n", echo);
                wait(2);
                // print the ranging data to the screen
                //float echo = 0.01 * ((cmd[0] << 8) + cmd[1]);
                //pc.printf("Range = %.2f\n", echo);
                //wait(2);
            }
        }
    }
    else if(!strcmp(cmdname, "SERIAL")){
    //baud, putc, getc
        char* param = strtok(NULL," -");
        // create operation
        if(!strcmp(param, "C")){
            param = strtok(NULL," -");
            if(param[0] == 'P'){
                pc.printf("\n\nCreating Serial...");
                wait(2);
                int pin_num = str2int(param+1);
                interface[pin_num-5].p_object = malloc(sizeof(Serial));
                if(pin_num == 9 || pin_num == 10){
                    memmove(interface[pin_num-5].p_object, &Serial(p9, p10), sizeof(Serial));
                }
                else if(pin_num == 13 || pin_num == 14){
                    memmove(interface[pin_num-5].p_object, &Serial(p13, p14), sizeof(Serial));
                }
                else if(pin_num == 28 || pin_num == 27){
                    memmove(interface[pin_num-5].p_object, &Serial(p28, p27), sizeof(Serial));
                }
            }
            else {  //pins not given
            }
        }
        //putc
        else if(!strcmp(param, "P")){
            param = strtok(NULL," -");
            if(param[0] == 'P'){
                int pin_num = str2int(param+1);
                param = strtok(NULL," -");
                int c = str2int(param);
                pc.printf("\n\nPutting a %d", c);
                wait(2);
                ((Serial)(*(Serial*)interface[pin_num-5].p_object)).putc(c);
            }
        }
        //getc
        else if(!strcmp(param, "G")){
            param = strtok(NULL," -");
            if(param[0] == 'P'){
                int pin_num = str2int(param+1);
                int val = ((Serial)(*(Serial*)interface[pin_num-5].p_object)).getc();
                pc.printf("\nValue: %d", val);
                wait(2);
            }
        }
        //baud
        else if(!strcmp(param, "B")){
            param = strtok(NULL," -");
            if(param[0] == 'P'){
                int pin_num = str2int(param+1);
                param = strtok(NULL," -");
                int a = str2int(param);
                pc.printf("\n\nSetting baud to %d", a);
                wait(2);
                ((Serial)(*(Serial*)interface[pin_num-5].p_object)).baud(a);
            }
        }
    }
    
    else if(!strcmp(cmdname, "PWMO")){
        char* param = strtok(NULL," -");
        // create operation
        if(!strcmp(param, "C")){
            param = strtok(NULL," -");
            if(param[0] == 'P'){
                int pin_num = str2int(param+1);
                if(pin_num >= 21 && pin_num <= 26){
                    pc.printf("\n\nCreating PWM...");
                    wait(2);
                    interface[pin_num-5].p_object = malloc(sizeof(PwmOut));
                    memmove(interface[pin_num-5].p_object, &PwmOut(getPin(pin_num)), sizeof(PwmOut));
                }
            }
            else {  //pins not given
            }
        }
        //write
        else if(strcmp(param, "W") == 0){
            param = strtok(NULL," -");
            if(param[0] == 'P'){
                int pin_num = str2int(param + 1);
                if(pin_num >= 21 && pin_num <= 26){
                    param = strtok(NULL," -");
                    //float a = str2int(param) / (sizeof(int)*8 - 1);
                    float a = atof(param);
                    pc.printf("\n\nWriting... a %f", a);
                    wait(2);
                    ((PwmOut)(*(PwmOut*)interface[pin_num-5].p_object)).write(a);
                }
            }
            else{ //Bad pin parameter
            }
        }
        
        //read
        else if(!strcmp(param, "R")){
            param = strtok(NULL," -");
            if(param[0] == 'P'){
                int pin_num = str2int(param + 1);
                if(pin_num >= 21 && pin_num <= 26){
                    float a = ((PwmOut)(*(PwmOut*)interface[pin_num-5].p_object)).read();
                    pc.printf("\n\nValue = %f", a);
                    wait(2);
                }
            }
        }
    }
}

void run(){
        /*// Read Input
        pc.printf("> ");
        pc.scanf("%s", input);
        pc.printf("\n\r");
        pc.printf("%s\n\r", input);
        
        // Execute Instruction
        if(1)
            execute(input);*/
            
    PS2Keyboard::keyboard_event_t evt_kb;
    char str[32];
    for(int i = 0; i<32 ; i++) str[i] = ' ';    
    int numchar = 0;
    char *p = str;
    while (1) {
        if (ps2kb.processing(&evt_kb)) {
            for (int i = 0; i < evt_kb.length; i++) {
                if(evt_kb.scancode[i] == 0xf0){
                    i++;
                    char c = evt_kb.scancode[i];
                    if(c == 0x5A){
                        // Gordon can call a function here to use str to do whatever
                        execute(p);
                    
                        for(int i = 0; i<32 ; i++) 
                            p[i] = ' ';
                        numchar = 0;
                    }
                    else numchar = curstr(p,numchar,c);
                }
            }
            for(int i = 0; i<32 ; i++) 
                pc.printf("%c", str[i]);
            pc.printf("\n\n"); 
        }       
        
    }
}

int str2int(char* str) {
    int num = 0, i = 0;
    while(str[i] != NULL){
        num = num * 10 + str[i] - '0';
        i++;
    }
    return num;
}

int hexstr2int(char* str) {
    int num = 0, i = 0;
    while(str[i] != NULL){
        num = num * 16 + str[i] - '0';
        i++;
    }
    return num;
}