a command line interface that can dynamically assign pins

Dependencies:   TextLCD mbed PS2

Revision:
0:4b04cc4cccb4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Command.cpp	Thu Oct 20 20:27:04 2011 +0000
@@ -0,0 +1,386 @@
+/**************************************************************/
+// 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;
+}