JLC test

Dependencies:   PinDetect libmDot mbed-rtos mbed

commandline.cpp

Committer:
tmulrooney
Date:
2016-01-30
Revision:
2:376af6a70e8a
Parent:
1:96c429800568

File content as of revision 2:376af6a70e8a:

/* ========================================
 * Filename: commandLine.c
 *
 * Description: functions and operations needed for  command line operation
 *
 * Copyright J-Factor Embedded Technologies 2015
 * Copyright TJM Embedded Software 2015
 * All Rights Reserved
 * UNPUBLISHED, LICENSED SOFTWARE.
 *
 * CONFIDENTIAL AND PROPRIETARY INFORMATION
 * WHICH IS THE PROPERTY OF J-Factor Embedded Technologies.
 *
 * ========================================
*/
//#include <project.h>
#include "mbed.h"
#include "stdio.h"
#include "common.h"

/** \file
 * \brief command line - contains all functions related to the command line.
 */

/* externals */

/* Globals */
char line[LINE_SIZE];                       //!< character array read 
char lastLine[NUM_LINES][LINE_SIZE];        //!< array of previous command lines
int8 indexNextLineIn = 0;                   //!< index of next position to save current command line
int8 indexNextLineOut = 0;                  //!< index of next position to read out saved comman dlines
int8 linesInBuffer = 0;                     //!< number of lines in  command line buffer
uint8 enableCLI = 1;
uint8 escapeSeen = 0;                       //!< escape character seen
int8 charCount;                            //!< number of characters in the current command line
int8 cursorPosition;                       //!< current cursor position in the current command line
char TransmitBuffer[TRANSMIT_BUFFER_SIZE];  //!< charaters to be sent to the console
uint8 ptrCmd = 0;
uint8 binaryParameter;                      //!< result of any 8 bit integer read operation
uint16 digitalParameter;                    //!< result of any 16 bit integer read operation
float analogParameter;                      //!< result of any floating point read operation
char *validCmds[] = {"help","version","read","readReg","write","writeReg","info","find","run","stop","date","hvstate"};    //!< array of valid commands - case insensitive    
uint16 regAddress;
uint16 regLength;
uint8 regData[MAX_REGISTER_DATA];

/** 
 * \fn getLine
 *
 * \brief Reads characters from UART and retuns a line when new line seen.
 * if enableCLI == 1 - process input characters<p>
 * if enableCLI == 0 - return 0<p>
 *
 * will call UART_1_CetChar() to get the next character.<p>
 * if ch == 0 - no character available<p>
 * if ch != 0 - add ch to line array<p>
 * features: <p>
 * up arrow will go through last NUM_LINES commands. <p>
 * backspace will remove last typed character<p>
 *
 * \return uint8 - 0 - no character ready or line not finished, 1 - line complete (CR seen)<p>
 *
 */
uint8 getLine()
{
     /* Variable to store UART received character */
    uint8 ch,i;
    
    /* check if CLI enabled */
    if(enableCLI == 0)
        return 0;
    
    /* Non-blocking call to get the latest data recieved  */
    if(pc.readable())
        ch = pc.getc();
    else
        ch = '\0';
        
    /* Set flags based on UART command */
    switch(ch)
    {
        case 0:
            /* No new data was recieved */
            return 0;
         
        case 0x1B:                      /* up arrow seen */
            escapeSeen = 1;
            break;
        
        case '\n':                      /* new line seen */
        case '\r':
            pc.printf("\r\n");
            line[charCount] = '\0';
            charCount = 0;
            cursorPosition = charCount;
            escapeSeen = 0;
            if(strlen(line) > 0)
            {
                strcpy(&lastLine[indexNextLineIn][0],line); /* save current command line in  buffer */
                if(linesInBuffer < NUM_LINES)
                    linesInBuffer++;
                indexNextLineIn++;                          /* point to next free space in command line buffer */
                if(indexNextLineIn == NUM_LINES - 1)        /* wrap around if past end */
                    indexNextLineIn = 0;
                indexNextLineOut = indexNextLineIn;
            }
            return 1;
            
        default:
//            sprintf(TransmitBuffer,"char: %02X %c  charCount: %d\r\n",ch,ch,charCount);
//            UART_1_PutString(TransmitBuffer);
            if( (escapeSeen == 1) && (ch == '[') )
            {
                escapeSeen++;
                break;
            }
            else if( (escapeSeen == 2) && (ch == 'A') )      /* look for up arrow escape sequence */
            {
                if(linesInBuffer == 0)
                    break;
                indexNextLineOut--;                     /* point to last line in */
                if(indexNextLineOut < 0)                /* check if wrap around */
                {
                    if(linesInBuffer < NUM_LINES)
                        indexNextLineOut = linesInBuffer -1;
                    else
                        indexNextLineOut = NUM_LINES - 1;
                }
                strcpy(line,&lastLine[indexNextLineOut][0]); /* copy command line from buffer to command line */
                charCount = strlen(line);
                cursorPosition = charCount;
                escapeSeen = 0;
                pc.printf("\r");
                for (i=0;i<sizeof(line);i++)                 /* clear line of last command */
                    pc.printf(" ");
                sprintf(TransmitBuffer,"\r%s cmd>%s",time_string,line);    /* restore with selected command */
                pc.printf(TransmitBuffer);
                break;
            }
            else if( (escapeSeen == 2) && (ch == 'D') )      /* look for left arrow escape sequence */
            {
                if( cursorPosition > 0 )
                {
                    pc.printf("\b");
                    cursorPosition--;
                }
                escapeSeen = 0;
                break;
            }
            else if( (escapeSeen == 2) && (ch == 'C') )      /* look for right arrow escape sequence */
            {
                if( cursorPosition < charCount )
                {
                    sprintf(TransmitBuffer,"%c",line[cursorPosition]);
                    pc.printf(TransmitBuffer);
                    cursorPosition++;
                }
                escapeSeen = 0;
                break;
            }
            else if( (ch == 0x7F) || (ch == '\b') )  /* backspace seen */
            {
                if( (charCount > 0) && (charCount == cursorPosition) )
                {
                    pc.printf("\b \b");
                    charCount--;
                    cursorPosition = charCount;
                    line[charCount] = '\0';
                }
            }
            else
            {
                if(charCount < (LINE_SIZE - 1))
                {
                    sprintf(TransmitBuffer,"%c",ch);
                    pc.printf(TransmitBuffer);
                    if(charCount != cursorPosition)         /* move characters at cursor up to fit in new character */
                    {
                        for(i = charCount ; i > cursorPosition; i--)
                            line[i] = line[i-1];
                        line[cursorPosition] = ch;
                        line[++charCount] = '\0';
                        for (i=cursorPosition + 1;i<charCount;i++) 
                        {
                            sprintf(TransmitBuffer,"%c",line[i]);
                            pc.printf(TransmitBuffer);
                        }
                        cursorPosition = charCount;
                    }
                    else
                    {
                        line[charCount++] = ch;
                        cursorPosition = charCount;
                    }
                 }
            }
            break;    
    }
    return 0;
}


/** 
 * \fn executeCmd
 *
 * \brief executes the command in line array.
 *
 * calls getCmd to parse command and then switches to proper command handler.
 * command list kept short for simplicity.<p>
 * read, write, and info command will read and verify parametsr on  command line.
 * \return None<p>
 *
 */
void executeCmd()
{
    int8 cmd;
    uint8 type,i;
    int32 convertFloat1,convertFloat2;
    float floatValue;
    int value,num, pos;
    char str[40] = "", str2[40] = "";
    uint8 statusRegister;
    
    cmd = getCmd();
//    sprintf(TransmitBuffer,"cmd: %d ptrCmd: %d\r\n",cmd,ptrCmd);
//    UART_1_PutString(TransmitBuffer);
    
    /* execute command */
    switch (cmd)
    {
        case HELP:
            pc.printf("Valid Commands (case insensitive)\r\n");
            pc.printf("find [string] - find all parameters or all parameters that contain the string\r\n");
            pc.printf("help - display list of valid commands\r\n");
            pc.printf("info [parameter]- display info on all or parameter\r\n");
            pc.printf("read parameter - read value of parameter\r\n");
            pc.printf("readReg parameter register length - read N values from parameter registers\r\n");
            pc.printf("version - display version information\r\n");
            pc.printf("write parameter register value - write value to parameter register\r\n");
            pc.printf("writeReg parameter value - write value to parameter\r\n");
            pc.printf("run - start control running\r\n");
            pc.printf("stop - stop control running\r\n");
            pc.printf("date [date string]- display/set current time and date\r\n");
            pc.printf("hvstate - current HV status\r\n");
            break;
           
        case DATE:
            num = sscanf(&line[ptrCmd],"%s",str);       /* optional parameter on the command line - date string */
            if(num > 0)
            {
                setDate(&line[ptrCmd]);
            }
            date();
            sprintf(TransmitBuffer,"current time is %s\r\n",c_time_string);
            pc.printf(TransmitBuffer);
            break;
             
        case VERSION:
            printVersion();
//            sprintf(TransmitBuffer,"PSK15-5 CSE: V%d.%02d %s\r\n",VERSION_MAJOR,VERSION_MINOR,VERSION_DATE);
//            UART_1_PutString(TransmitBuffer);
//            sprintf(TransmitBuffer,"Built on: %s %s\r\n",__DATE__,__TIME__);
//            UART_1_PutString(TransmitBuffer);
            break;
          
        case READ:
            num = sscanf(&line[ptrCmd],"%s",str);       /* expecting one parameter on the command line - parameter name */
            if(num == 1)
            {
                num = getParameter(str);                /* get paramter position in parameters array from paramter name */
                if (num >= 0)
                {
                    type = readParam(num);              /* read paramter value and return parameter type */
                    if(type == BINARY)
                    {
                        sprintf(TransmitBuffer,"%s: %d %s\r\n",parameters[num].name,binaryParameter,parameters[num].uints);
                    }
                    else if(type == DIGITAL)
                    {
                        sprintf(TransmitBuffer,"%s: %d %s\r\n",parameters[num].name,digitalParameter,parameters[num].uints);
                    }
                    else if(type == ANALOG)
                    {
                        convertFloat1 = analogParameter * 100.0;
                        sprintf(TransmitBuffer,"%s: %ld.%02ld %s\r\n",parameters[num].name,convertFloat1/100,convertFloat1%100,parameters[num].uints);
                    }
                     pc.printf(TransmitBuffer);
                }
                else
                {
                    sprintf(TransmitBuffer,"Invalid parameter\r\nType help for list of valid parameters\r\n");
                    pc.printf(TransmitBuffer);
               }
            }
            else
            {
                sprintf(TransmitBuffer,"Missing parameter\r\nformat: read parameter\r\n");
                pc.printf(TransmitBuffer);
           }
            break;
         
        case READ_REG:
            num = sscanf(&line[ptrCmd],"%s %X %X",str, &regAddress, &regLength); 
            if(num < 0)
            {
                sprintf(TransmitBuffer,"Missing parameter\r\nformat: read parameter [Reg Address (hex)] [Length (hex)]\r\n");
                pc.printf(TransmitBuffer);
                return;
            }
            pos = getParameter(str);                /* get paramter position in parameters array from paramter name */
            if(pos == -1)
            {
                sprintf(TransmitBuffer,"Invalid parameter\r\nType help for list of valid parameters\r\n");
                pc.printf(TransmitBuffer);
                return;
           }
            switch(num)
            {
                 case 1:
                    regAddress = 0;
                    regLength = 1;
                    break;
               
                case 2:
                     regLength = 1;
                    break;
               
                case 3:
                     break;
           
            }
            type = readParam(pos);              /* read paramter value and return parameter type */
            for(i=0; i< bytesRead; i++)
            {
                if( i == 0 )
                    pc.printf("%04X ",regAddress);
                else if( (i % 0x10) == 0 )
                    pc.printf("\r\n%04X ",regAddress + i);
                pc.printf("%02X ",regData[i]);
            }
            pc.printf("\r\n");
            break;
 #if 0       
        case WRITE:
            floatValue = 0.0;
            num = sscanf(&line[ptrCmd],"%s %s",str,str2);       /* expecting two parameters on the command line - parameter name and parameter value */
            if(num == 2)
            {
                num = getParameter(str);                        /* get paramter position in parameters array from paramter name */
                if (num >= 0)
                {
                    type = readParam(num);                      /* read paramter value and return parameter type */
                    if(type == ANALOG)
                    {
                        floatValue = strtofloat(str2);          /* paramters name and floating point number */
                    }
                    else
                    {
                        sscanf(&line[ptrCmd],"%s %d",str,&value);   /* parameters name and integer value */
                    }
                    if(type == BINARY)
                    {
                        if(value > parameters[num].maxInt)
                        {
                           sprintf(TransmitBuffer,"%d exceeds maximum value %d\r\n",value,parameters[num].maxInt);
                        }
                        else
                        {
                            writeParam(num,value,floatValue);
                            type = readParam(num);
                            sprintf(TransmitBuffer,"%s: %d %s\r\n",parameters[num].name,binaryParameter,parameters[num].uints);
                        }
                    }
                    else if(type == DIGITAL)
                    {
                        if(value > parameters[num].maxInt)
                        {
                           sprintf(TransmitBuffer,"%d %s exceeds maximum value %d %s\r\n",value,parameters[num].uints,parameters[num].maxInt,parameters[num].uints);
                        }
                        else if(value < parameters[num].minInt)
                        {
                           sprintf(TransmitBuffer,"%d %s less than minimum value %d %s\r\n",value,parameters[num].uints,parameters[num].minInt,parameters[num].uints);
                        }
                        else
                        {
                            writeParam(num,value,floatValue);
                            type = readParam(num);
                            sprintf(TransmitBuffer,"%s: %d %s\r\n",parameters[num].name,digitalParameter,parameters[num].uints);
                        }
                    }
                    else if(type == ANALOG)
                    {
                        if(floatValue > parameters[num].maxFloat)
                        {
                            convertFloat1 = floatValue * 100;
                            convertFloat2 = parameters[num].maxFloat * 100;
                            sprintf(TransmitBuffer,"%ld.%02ld %s exceeds maximum value %ld.%02ld %s\r\n",convertFloat1/100,convertFloat1%100,parameters[num].uints,convertFloat2/100,convertFloat2%100,parameters[num].uints);
                        }
                        else if(floatValue < parameters[num].minFloat)
                        {
                            convertFloat1 = floatValue * 100;
                            convertFloat2 = parameters[num].minFloat * 100;
                            sprintf(TransmitBuffer,"%ld.%02ld %s is less than value %ld.%02ld %s\r\n",convertFloat1/100,convertFloat1%100,parameters[num].uints,convertFloat2/100,convertFloat2%100,parameters[num].uints);
                        }
                        else
                        {
                            writeParam(num,value,floatValue);
                            type = readParam(num);
                            convertFloat1 = analogParameter * 100;
                            sprintf(TransmitBuffer,"%s: %ld.%02ld %s\r\n",parameters[num].name,convertFloat1/100,convertFloat1%100,parameters[num].uints);
                        }
                    }
                     pc.printf(TransmitBuffer);
                }
                else
                {
                    pc.printf("Invalid parameter\r\nType help for list of valid parameters\r\n");
                }
            }
            else
            {
                pc.printf("Missing parameter(s)\r\nformat: write parameter value\r\n");
            }
            break;
 #endif       
        case WRITE_REG:
             num = sscanf(&line[ptrCmd],"%s %X %X",str, &regAddress, &regData); 
            if(num != 3)
            {
                pc.printf("Missing parameter\r\nformat: write parameter Reg Address (hex) Value (hex)\r\n");
                return;
            }
            pos = getParameter(str);                /* get paramter position in parameters array from paramter name */
             if(pos == -1)
            {
                sprintf(TransmitBuffer,"Invalid parameter\r\nType help for list of valid parameters\r\n");
                pc.printf(TransmitBuffer);
                return;
           }
           writeParam(pos,regData);              /* write paramter value and return parameter type */
            regLength = 1;
            readParam(pos);
            for(i=0; i< bytesRead; i++)
            {
                if( i == 0 )
                    pc.printf("%04X ",regAddress);
                else if( (i % 0x10) == 0 )
                    pc.printf("\r\n%04X ",regAddress + i);
                pc.printf("%02X ",regData[i]);
            }
            pc.printf("\r\n");
            break;
#if 0
           floatValue = 0.0;
            num = sscanf(&line[ptrCmd],"%s %s",str,str2);       /* expecting two parameters on the command line - parameter name and parameter value */
            if(num == 2)
            {
                num = getParameter(str);                        /* get paramter position in parameters array from paramter name */
                if (num >= 0)
                {
                    type = readParam(num);                      /* read paramter value and return parameter type */
                    if(type == ANALOG)
                    {
                        floatValue = strtofloat(str2);          /* paramters name and floating point number */
                    }
                    else
                    {
                        sscanf(&line[ptrCmd],"%s %d",str,&value);   /* parameters name and integer value */
                    }
                    if(type == BINARY)
                    {
                        if(value > parameters[num].maxInt)
                        {
                           sprintf(TransmitBuffer,"%d exceeds maximum value %d\r\n",value,parameters[num].maxInt);
                        }
                        else
                        {
                            writeParam(num,value,floatValue);
                            type = readParam(num);
                            sprintf(TransmitBuffer,"%s: %d %s\r\n",parameters[num].name,binaryParameter,parameters[num].uints);
                        }
                    }
                    else if(type == DIGITAL)
                    {
                        if(value > parameters[num].maxInt)
                        {
                           sprintf(TransmitBuffer,"%d %s exceeds maximum value %d %s\r\n",value,parameters[num].uints,parameters[num].maxInt,parameters[num].uints);
                        }
                        else if(value < parameters[num].minInt)
                        {
                           sprintf(TransmitBuffer,"%d %s less than minimum value %d %s\r\n",value,parameters[num].uints,parameters[num].minInt,parameters[num].uints);
                        }
                        else
                        {
                            writeParam(num,value,floatValue);
                            type = readParam(num);
                            sprintf(TransmitBuffer,"%s: %d %s\r\n",parameters[num].name,digitalParameter,parameters[num].uints);
                        }
                    }
                    else if(type == ANALOG)
                    {
                        if(floatValue > parameters[num].maxFloat)
                        {
                            convertFloat1 = floatValue * 100;
                            convertFloat2 = parameters[num].maxFloat * 100;
                            sprintf(TransmitBuffer,"%ld.%02ld %s exceeds maximum value %ld.%02ld %s\r\n",convertFloat1/100,convertFloat1%100,parameters[num].uints,convertFloat2/100,convertFloat2%100,parameters[num].uints);
                        }
                        else if(floatValue < parameters[num].minFloat)
                        {
                            convertFloat1 = floatValue * 100;
                            convertFloat2 = parameters[num].minFloat * 100;
                            sprintf(TransmitBuffer,"%ld.%02ld %s is less than value %ld.%02ld %s\r\n",convertFloat1/100,convertFloat1%100,parameters[num].uints,convertFloat2/100,convertFloat2%100,parameters[num].uints);
                        }
                        else
                        {
                            writeParam(num,value,floatValue);
                            type = readParam(num);
                            convertFloat1 = analogParameter * 100;
                            sprintf(TransmitBuffer,"%s: %ld.%02ld %s\r\n",parameters[num].name,convertFloat1/100,convertFloat1%100,parameters[num].uints);
                        }
                    }
                     pc.printf(TransmitBuffer);
                }
                else
                {
                    pc.printf("Invalid parameter\r\nType help for list of valid parameters\r\n");
                }
            }
            else
            {
                pc.printf("Missing parameter(s)\r\nformat: write parameter value\r\n");
            }
            break;
#endif
#if 0       
        case INFO:
            num = sscanf(&line[ptrCmd],"%s",str);       /* expecting one parameter on the command line - parameter name */
            if(num == 1)
            {
                num = getParameter(str);                /* get paramter position in parameters array from paramter name */
                if (num >= 0)
                {
         //           type = readParam(num);
                    displayParameter(num);
                }
                else
                {
                    UART_1_PutString("Invalid parameter\r\nType help for list of valid parameters\r\n");
                }
            }
            else
            {
//                for(i=0;strcmpi(parameters[i].name,"end") != 0;i++)
                for(i=0;strcasecmp(parameters[i].name,"end") != 0;i++)
                    displayParameter(i);
            }
            break;
       
        case FIND:
            num = sscanf(&line[ptrCmd],"%s",str);       /* expecting one parameter on the command line - parameter name */
            if(num == 1)
            {
                num = findParameter(str);                /* get paramter position in parameters array from paramter name */
                if (num < 0)
                {
                    sprintf(TransmitBuffer,"String %s not found in any parameter name\r\n",str);
                    UART_1_PutString(TransmitBuffer);
                }
            }
            else
            {
                UART_1_PutString("\r\nValid Paramters\r\n");
    
                /* print parameter list */
//                for(i=0;strcmpi(parameters[i].name,"end") != 0;i++)
                for(i=0;strcasecmp(parameters[i].name,"end") != 0;i++)
                {
                    sprintf(TransmitBuffer,"%s\r\n",parameters[i].name);
                    UART_1_PutString(TransmitBuffer);   
                }
            }
            break;
            
        case RUN:
                if(runStatus == TRUE)
                {
                    sprintf(TransmitBuffer,"%s Control already Running\r\n",time_string);
                    UART_1_PutString(TransmitBuffer);  
                }
                else
                {
                    runStatus = TRUE;
                    lampTestStatus = LAMPTESTNOTRUN;
                    sprintf(TransmitBuffer,"%s Control Running\r\n",time_string);
                    UART_1_PutString(TransmitBuffer);   
                }
                break;
            
        case STOP:
                if(runStatus == FALSE)
                {
                    sprintf(TransmitBuffer,"%s Control already Stopped\r\n",time_string);
                    UART_1_PutString(TransmitBuffer);   
                }
                else
                {
                    runStatus = FALSE;
                    sprintf(TransmitBuffer,"%s Control Stopped\r\n",time_string);
                    UART_1_PutString(TransmitBuffer);   
                    phaseUV = (PHASE_AB_UV_Read() << 0);
                    phaseUV |= (PHASE_AC_UV_Read() << 1);
                    phaseUV |= (PHASE_BC_UV_Read() << 2);
                    statusRegister = STATUS_REGISTER1_ReadMask();
                    statusRegister |= (PHASEABUVIN | PHASEBCUVIN | PHASEACUVIN);
                    STATUS_REGISTER1_INT_ClearPending();
                    STATUS_REGISTER1_WriteMask(statusRegister);
                    HVState = HVSTATEOFF;
                    eStopSeen = FALSE;
                    outputOCSeen = FALSE;
                    HVStateMsg = 0;                 /* no messages printed yet */
                    flashCtrlSys = 0;
                    tempFailed = FALSE;
                    pendantTestStatus = 0;
                    pendantPresent = FALSE;
                    waitForPowerCycle = FALSE;
                    PEND_PRESENT_NOT_INT_Stop();
                    SOFT_START_RELAY_CTRL_Write(0);
                    PWM_DC_Stop();
                    statusRegister = STATUS_REGISTER1_ReadMask();
                    statusRegister &= ~(BRIDGEOCFLAGIN | OUTPUTOCFLAGIN | UTILOCFLAGIN  );
                    STATUS_REGISTER1_WriteMask(statusRegister);
                    ENCODER_COUNTER_Stop();
                    initializeAllParameters();
writeCurrent0(0.0);                               /* test prurposes only */
                }
                break;
                
        case HVSTATE:
            sprintf(TransmitBuffer,"%s HV State: %02X\r\n",time_string,HVState);
            UART_1_PutString(TransmitBuffer);
            printHVState();
            break;
            #endif
           
        default:
            if(strlen(line) !=0)
            {
                sprintf(TransmitBuffer,"Unknown cmd: %s\r\nType help for list of valid commands\r\n",line);
                pc.printf(TransmitBuffer);
//                linesInBuffer--;
//                indexNextLineIn--;
//                if(linesInBuffer == NUM_LINES)
//                    indexNextLineIn = NUM_LINES -1;
            }
            break;
     }
    for(i=0;i < sizeof(line);i++)
        line[i] = '\0';
}

/** 
 * \fn getCmd
 *
 * \brief parses command line to find position of command in validCmds array.
 *
 * copies line array into cmd array until a space or end of line then
 * searches cmd array for a match in validCmds array.
 * \return int8 - position of command in command array if found. -1 if not found<p>
 *
 */
int8 getCmd()
{
    uint i;
    char cmd[40];
    
    for(i=0;i<strlen(line);i++)
    {
        if(line[i] == ' ')
        {
            break;
        }
        cmd[i] = line[i];
    }
    cmd[i] = '\0';
    ptrCmd = strlen(cmd) + 1;
//    sprintf(TransmitBuffer,"cmd: %d %s\r\n",strlen(cmd),cmd);
//    UART_1_PutString(TransmitBuffer);
    
    for(i=0;i< sizeof(validCmds)/sizeof(validCmds[0]);i++)
    {
//        if(strcmpi(validCmds[i],cmd) == 0)
        if(strcasecmp(validCmds[i],cmd) == 0)
        {
            return i;
        }
    }
    return -1;
}

/** 
 * \fn int8 getParameter(char *param)
 *
 * \brief searches parameters array to find position of command in parameters array.
 *
 * searches the entire parameters array for a name match with param.
 *
 * \param[in] param - pointer to an array containing the parameter name.
 *
 * \return int8 - position of command in command array if found. -1 if not found<p>
 *
 */
int8 getParameter(char *param)
{
    uint i;
    
 //   sprintf(TransmitBuffer,"param: %d %s\r\n",strlen(param),param);
 //   pc.printf(TransmitBuffer);
    
    for(i=0;strcasecmp(parameters[i].name,"end") != 0;i++)
    {
        if(strcasecmp(parameters[i].name,param) == 0)
        {
            return i;
        }
    }
    return -1;
}

/** 
 * \fn int8 findParameter(char *string)
 *
 * \brief finds all parameters with string in the name.
 *
 * searches the entire parameters array for all names 
 * that contain string.
 *
 * \param[in] string - pointer to a string.
 *
 * \return int8 - 0 string found in some names. -1 if string not found in any name<p>
 *
 */
int8 findParameter(char *string)
{
    uint i,j;
    int8 result = -1;
    char name[40];
    char string1[40];
    
//    sprintf(TransmitBuffer,"param: %d %s\r\n",strlen(param),param);
//    UART_1_PutString(TransmitBuffer);
   
    strcpy(string1,string);
    for(i=0;i < strlen(string1);i++)
        string1[i] = tolower((unsigned char)string1[i]);
        
//    for(i=0;strcmpi(parameters[i].name,"end") != 0;i++)
    for(i=0;strcasecmp(parameters[i].name,"end") != 0;i++)
    {
        strcpy(name,parameters[i].name);        /* copy parameter name and convert to lower case */
        for(j=0;j < strlen(name);j++)
            name[j] = tolower((unsigned char)name[j]);
        if(strstr(name,string1) != NULL)
        {
            sprintf(TransmitBuffer,"%s\r\n",parameters[i].name);
            pc.printf(TransmitBuffer);
            result = 0;
        }
    }
    return result;
}

/** 
 * \fn uint8 readParam(uint8 paramNum)
 *
 * \brief reads in parameter at position paramNum.
 *
 * This will only be called if there was a valid parameter match found.
 * will read correct parameter based on parameter type. This will call the
 * correct read function specified in the paramter array. A parameter will be
 * read into one of binaryParameter, digitalParameter, or analogParameter based on type.
 *
 * \param[in] paramNum - pointer to a character string containing  parameter name
 * \return uint8 - type of parameter<p>
 *
 */
uint8 readParam(uint8 paramNum)
{
    uint8 type =  parameters[paramNum].type;
    
    if(type == BINARY)
    {
        if(parameters[paramNum].ptrRead == NULL)
        {
            sprintf(TransmitBuffer,"%s has a NULL ptrRead parameter\r\n",parameters[paramNum].name);
            pc.printf(TransmitBuffer);
            binaryParameter = 0;
        }
        else
            binaryParameter = parameters[paramNum].ptrRead();
        return type;
    }
    if(type == ANALOG)
    {
        if(parameters[paramNum].ptrRead == NULL)
        {
            sprintf(TransmitBuffer,"%s has a NULL ptrRead parameter\r\n",parameters[paramNum].name);
            pc.printf(TransmitBuffer);
            analogParameter = 0.0;
        }
        else
            parameters[paramNum].ptrRead();
        return type;
    }
    if(type == DIGITAL)
    {
        if(parameters[paramNum].ptrRead == NULL)
        {
            sprintf(TransmitBuffer,"%s has a NULL ptrRead parameter\r\n",parameters[paramNum].name);
            pc.printf(TransmitBuffer);
            digitalParameter = 0;
        }
        else
            parameters[paramNum].ptrRead();
        return type;
    }
    if(type == REGISTER)
    {
        bytesRead = 0;
        if(parameters[paramNum].ptrReadRegLength == NULL)
        {
            sprintf(TransmitBuffer,"%s has a NULL ptrReadRegLength parameter\r\n",parameters[paramNum].name);
            pc.printf(TransmitBuffer);
            digitalParameter = 0;
        }
        else
            bytesRead = parameters[paramNum].ptrReadRegLength(regAddress, regData, regLength);
        return type;
    }
    return type;
}

/** 
 * \fn void writeParam(uint8 paramNum,uint16 value, float floatValue)
 *
 * \brief reads in parameter at position paramNum.
 *
 * This will only be called if there was a valid parameter match found.
 * will write value to the correct parameter based on parameter type. This will call the
 * correct write function specified in the paramter array. value will not be written
 * to read only paramters.
 *
 * \param[in] paramNum - pointer to a character string containing the parameter name
 * \param[in] value - 16 bit value to write to a digital parameter.
 * \param[in] floatValue - analog value to write to an anlog parameter.
 * \return uint8 - type of parameter<p>
 *
 */
void writeParam(uint8 paramNum,uint8 *value)
{   
    uint8 type =  parameters[paramNum].type;
     if(parameters[paramNum].mode == READONLY)
    {
            sprintf(TransmitBuffer,"%s is a read only parameter\r\n",parameters[paramNum].name);
            pc.printf(TransmitBuffer);
            return;
    }
   #if 0    
    if(type == BINARY)
    {
        if(parameters[paramNum].ptrWrite8 == NULL)
        {
            sprintf(TransmitBuffer,"%s has a NULL pteWrite8 parameter\r\n",parameters[paramNum].name);
            pc.printf(TransmitBuffer);
        }
        else
            parameters[paramNum].ptrWrite8(value);
    }
    else if(type == DIGITAL)
    {
        if(parameters[paramNum].ptrWrite16 == NULL)
        {
            sprintf(TransmitBuffer,"%s has a NULL pteWrite16 parameter\r\n",parameters[paramNum].name);
            pc.printf(TransmitBuffer);
        }
        else
            parameters[paramNum].ptrWrite16(value);
    }
    #endif
    else if(type == REGISTER)
    {
        if(parameters[paramNum].ptrWriteReg8 == NULL)
        {
            sprintf(TransmitBuffer,"%s has a NULL ptrWriteReg8 parameter\r\n",parameters[paramNum].name);
            pc.printf(TransmitBuffer);
        }
        else
            parameters[paramNum].ptrWriteReg8(regAddress, value);
    }
    #if 0
    else if(type == ANALOG)
    {
        if(parameters[paramNum].ptrWriteAnalog == NULL)
        {
            sprintf(TransmitBuffer,"%s has a NULL pteWriteAnalog parameter\r\n",parameters[paramNum].name);
            pc.printf(TransmitBuffer);
        }
        else
            parameters[paramNum].ptrWriteAnalog(floatValue);
    }
    #endif
        return;
}

/** 
 * \fn void displayParameter(uint8 num)
 *
 * \brief displays information about a parameter
 *
 * This routine all of the information in the parameters array
 * for the selected parameter.
 *
 * \param[in] num - 8 bit integer location in the parameters array 
  * \return uint16 - 16 bit num to the power pow<p>
 *
 */
void displayParameter(uint8 num)
{
    char *strType;
    char *strMode;
    uint16 convertFloat1,convertFloat2,convertFloat3;
    
    switch (parameters[num].type)
    {
        case BINARY:
            strType = "Binary";
            break;
          
        case DIGITAL:
            strType = "16 Bit";
            break;
        
        case ANALOG:
            strType = "Analog";
            break;
        
        default:
            strType = "Unknown";
            break;
    }
    
    switch (parameters[num].mode)
    {
        case READONLY:
            strMode = "Read Only";
            break;
        
        case READWRITE:
            strMode = "Read/Write";
            break;
        
        case WRITEONLY:
            strMode = "Write Only";
            break;
        
        default:
            strMode = "Unknown";
            break;
    }
    
    sprintf(TransmitBuffer,"Name:\t'%s' Port: '%s' Connector: '%s' Units: '%s'\r\n",parameters[num].name,parameters[num].port,parameters[num].connector,parameters[num].uints);
    pc.printf(TransmitBuffer);   
    sprintf(TransmitBuffer,"\tDescription: '%s'\r\n",parameters[num].description);
    pc.printf(TransmitBuffer); 
    
    if(parameters[num].type != ANALOG)
    {
        sprintf(TransmitBuffer,"\tType: '%s' mode: '%s' Initial: %d Min: %d Max: %d\r\n",strType,strMode,parameters[num].initialInt,parameters[num].minInt,parameters[num].maxInt);
        pc.printf(TransmitBuffer);   
    }
    else
    {
        convertFloat1 = parameters[num].initialFloat * 100;
        convertFloat2 = parameters[num].minFloat * 100;
        convertFloat3 = parameters[num].maxFloat * 100;
        sprintf(TransmitBuffer,"\tType: '%s' mode: '%s' Initial: %d.%02d Min: %d.%02d Max: %d.%02d\r\n",strType,strMode,convertFloat1/100,convertFloat1%100,convertFloat2/100,convertFloat2%100,convertFloat3/100,convertFloat3%100);
        pc.printf(TransmitBuffer);   
    }
}

uint16 readSPIReg(uint16 regAddress, uint8 *regData, uint16 length)
{
    
//    sprintf(TransmitBuffer,"read SPI %02X %04X\r\n",regAddress, length);
//    pc.printf(TransmitBuffer); 
    if(length > MAX_REGISTER_DATA)
    {
        sprintf(TransmitBuffer,"Length 0x%X > 0x%X",length,MAX_REGISTER_DATA);
        pc.printf(TransmitBuffer);   
      return 0;
    }  
    SPIRead(regAddress,regData,length);
    return(length);
}

void writeSPIReg(uint16 regAddress, uint8 *regData)
{
    sprintf(TransmitBuffer,"write SPI %02X %02X\r\n",regAddress, regData[0]);
    pc.printf(TransmitBuffer); 
    SPIWrite(regAddress, regData,1);
    return;
}

uint16 readI2CReg(uint16 regAddress, uint8 *regData, uint16 length)
{
    
//    sprintf(TransmitBuffer,"read I2C %02X %04X\r\n",regAddress, length);
//    pc.printf(TransmitBuffer); 
    if(length > MAX_REGISTER_DATA)
    {
        sprintf(TransmitBuffer,"Length 0x%X > 0x%X",length,MAX_REGISTER_DATA);
        pc.printf(TransmitBuffer);   
      return 0;
    }  
    I2CRead(regAddress,regData,length);
    return(length);
}


void writeI2CReg(uint16 regAddress, uint8 *regData)
{
    sprintf(TransmitBuffer,"write I2C %02X %02X\r\n",regAddress, regData[0]);
    pc.printf(TransmitBuffer); 
    I2CWrite(regAddress, regData,1);
    return;
}

/* [] END OF FILE */