254 lines
7 KiB
C
254 lines
7 KiB
C
/** \file
|
|
* \brief This file implements utility functions used by the command interpreter.
|
|
*/
|
|
|
|
/**
|
|
* \ingroup CONSOLE
|
|
*/
|
|
|
|
/* Include Files */
|
|
#include "KTag.h"
|
|
|
|
#if (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED)
|
|
|
|
/* Local Definitions and Constants */
|
|
|
|
/* Public Variables */
|
|
|
|
/* Private Variables */
|
|
|
|
/* Private Function Prototypes */
|
|
|
|
/* Public Functions */
|
|
|
|
//! Find the start location of the nth parameter in the buffer.
|
|
/*!
|
|
* \note The command itself is parameter 0.
|
|
*/
|
|
COMM_Console_Parameter_Result_T COMM_Console_FindNthParameter(const char * const buffer, const uint8_t parameterNumber, const char ** parameterLocation)
|
|
{
|
|
uint32_t buffer_index = 0;
|
|
uint32_t parameter_index = 0;
|
|
COMM_Console_Parameter_Result_T result = COMM_CONSOLE_PARAMETER_RESULT_SUCCESS;
|
|
|
|
while (parameterNumber != parameter_index)
|
|
{
|
|
if (buffer[buffer_index] == COMM_CONSOLE_PARAMETER_DELIMITER)
|
|
{
|
|
parameter_index++;
|
|
}
|
|
else if (buffer[buffer_index] == COMM_CONSOLE_END_OF_MESSAGE)
|
|
{
|
|
result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_ERROR;
|
|
break;
|
|
}
|
|
else if (buffer[buffer_index] == COMM_CONSOLE_STRING_TERMINATOR)
|
|
{
|
|
result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_ERROR;
|
|
break;
|
|
}
|
|
buffer_index++;
|
|
}
|
|
|
|
if (result == COMM_CONSOLE_PARAMETER_RESULT_SUCCESS)
|
|
{
|
|
*parameterLocation = &buffer[buffer_index];
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
|
|
COMM_Console_Parameter_Result_T COMM_Console_DecodeParameterUInt8(const char * const buffer, uint8_t * const parameterUInt8)
|
|
{
|
|
uint8_t value = 0;
|
|
COMM_Console_Parameter_Result_T result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_ERROR;
|
|
|
|
// Strings containing uint8s range from "0" to "255". The large number has three characters.
|
|
uint_fast16_t MAX_CHARACTERS = 3;
|
|
uint_fast16_t index = 0;
|
|
|
|
while (index < (MAX_CHARACTERS + 1))
|
|
{
|
|
if ((buffer[index] >= '0') && (buffer[index] <= '9'))
|
|
{
|
|
value *= 10;
|
|
value += buffer[index] - '0';
|
|
index++;
|
|
}
|
|
else if ( (buffer[index] == COMM_CONSOLE_PARAMETER_DELIMITER) ||
|
|
(buffer[index] == COMM_CONSOLE_STRING_TERMINATOR) ||
|
|
(buffer[index] == COMM_CONSOLE_END_OF_MESSAGE) )
|
|
{
|
|
result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_END;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_ERROR;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (result == COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_END)
|
|
{
|
|
result = COMM_CONSOLE_PARAMETER_RESULT_SUCCESS;
|
|
*parameterUInt8 = value;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
|
|
COMM_Console_Parameter_Result_T COMM_Console_DecodeParameterUInt16(const char * const buffer, uint16_t * const parameterUInt16)
|
|
{
|
|
uint16_t value = 0;
|
|
COMM_Console_Parameter_Result_T result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_ERROR;
|
|
|
|
// Strings containing uint16s range from "0" to "65535". The large number has five characters.
|
|
uint_fast16_t MAX_CHARACTERS = 5;
|
|
uint_fast16_t index = 0;
|
|
|
|
while (index < (MAX_CHARACTERS + 1))
|
|
{
|
|
if ((buffer[index] >= '0') && (buffer[index] <= '9'))
|
|
{
|
|
value *= 10;
|
|
value += buffer[index] - '0';
|
|
index++;
|
|
}
|
|
else if ( (buffer[index] == COMM_CONSOLE_PARAMETER_DELIMITER) ||
|
|
(buffer[index] == COMM_CONSOLE_STRING_TERMINATOR) ||
|
|
(buffer[index] == COMM_CONSOLE_END_OF_MESSAGE) )
|
|
{
|
|
result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_END;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_ERROR;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (result == COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_END)
|
|
{
|
|
result = COMM_CONSOLE_PARAMETER_RESULT_SUCCESS;
|
|
*parameterUInt16 = value;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
COMM_Console_Parameter_Result_T COMM_Console_DecodeParameterInt32(const char * const buffer, int32_t * const parameterInt32)
|
|
{
|
|
int32_t value = 0;
|
|
COMM_Console_Parameter_Result_T result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_ERROR;
|
|
bool is_negative = false;
|
|
|
|
// Strings containing int32s range from "-2147483648" to "2147483647". The negative number has eleven characters.
|
|
uint_fast16_t MAX_CHARACTERS = 11;
|
|
uint_fast16_t index = 0;
|
|
|
|
if (buffer[index] == '-')
|
|
{
|
|
is_negative = true;
|
|
index++;
|
|
}
|
|
|
|
while (index < (MAX_CHARACTERS + 1))
|
|
{
|
|
if ((buffer[index] >= '0') && (buffer[index] <= '9'))
|
|
{
|
|
value *= 10;
|
|
value += buffer[index] - '0';
|
|
index++;
|
|
}
|
|
else if ( (buffer[index] == COMM_CONSOLE_PARAMETER_DELIMITER) ||
|
|
(buffer[index] == COMM_CONSOLE_STRING_TERMINATOR) ||
|
|
(buffer[index] == COMM_CONSOLE_END_OF_MESSAGE) )
|
|
{
|
|
result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_END;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_ERROR;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (is_negative == true)
|
|
{
|
|
value *= -1;
|
|
}
|
|
|
|
if (result == COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_END)
|
|
{
|
|
result = COMM_CONSOLE_PARAMETER_RESULT_SUCCESS;
|
|
*parameterInt32 = value;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
COMM_Console_Parameter_Result_T COMM_Console_DecodeParameterUInt32(const char * const buffer, uint32_t * const parameterUInt32)
|
|
{
|
|
uint32_t value = 0;
|
|
COMM_Console_Parameter_Result_T result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_ERROR;
|
|
|
|
// Strings containing uint32s range from "0" to "4294967296". The large number has ten characters.
|
|
uint_fast16_t MAX_CHARACTERS = 10;
|
|
uint_fast16_t index = 0;
|
|
|
|
while (index < (MAX_CHARACTERS + 1))
|
|
{
|
|
if ((buffer[index] >= '0') && (buffer[index] <= '9'))
|
|
{
|
|
value *= 10;
|
|
value += buffer[index] - '0';
|
|
index++;
|
|
}
|
|
else if ( (buffer[index] == COMM_CONSOLE_PARAMETER_DELIMITER) ||
|
|
(buffer[index] == COMM_CONSOLE_STRING_TERMINATOR) ||
|
|
(buffer[index] == COMM_CONSOLE_END_OF_MESSAGE) )
|
|
{
|
|
result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_END;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_ERROR;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (result == COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_END)
|
|
{
|
|
result = COMM_CONSOLE_PARAMETER_RESULT_SUCCESS;
|
|
*parameterUInt32 = value;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
COMM_Console_Parameter_Result_T COMM_Console_DecodeHexParameterUInt64(const char * const buffer, uint64_t * const parameterUInt64)
|
|
{
|
|
COMM_Console_Parameter_Result_T result = COMM_CONSOLE_PARAMETER_RESULT_SUCCESS;
|
|
struct _reent context;
|
|
|
|
context._errno = 0;
|
|
|
|
*parameterUInt64 = _strtoull_r(&context, buffer, NULL, 16);
|
|
|
|
if (context._errno != 0)
|
|
{
|
|
result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_ERROR;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
/* Private Functions */
|
|
|
|
#endif // (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED)
|