一、方向键输入
在Shell环境下,方向键输入为3个字节,其键值对应分别为:
键 | ASCII码 |
---|---|
上 | ^[[A |
下 | ^[[B |
左 | ^[[D |
右 | ^[[C |
其中,
字符 | HEX | 解释 |
---|---|---|
^[ | 0x1B | ESC键 |
[ | 0x58 | 开方括号 |
A | 0x41 | 大写A |
B | 0x42 | 大写B |
C | 0x43 | 大写C |
D | 0x44 | 大写D |
二、方向键解析
解析应分三步进行:
- 读取
^[
,即0x1B
- 读取
[
,即0x58
- 读取
A/B/C/D
三、代码实现
typedef enum
{
CONTROL_FREE = 0,
CONTROL_STEP_ONE,
CONTROL_STEP_TWO,
} CONTROL_Status;
static CONTROL_Status controlFlag = CONTROL_FREE;
switch(receiveData)
case 0x1B: // ESC
controlFlag = CONTROL_STEP_ONE;
break;
default:
switch ((uint8_t)controlFlag)
{
case CONTROL_STEP_TWO:
if (receiveData == 0x41) // 方向上键
{
shellBackspace(shellCommandIndex);
if (shellHistoryOffset-- <= -((shellHistoryCount > shellHistoryFlag)
? shellHistoryCount
: shellHistoryFlag))
{
shellHistoryOffset = -((shellHistoryCount > shellHistoryFlag)
? shellHistoryCount
: shellHistoryFlag);
}
shellCommandIndex = shellStringCopy((char *)shellCommandBuff,
(const char *)shellHistoryCommand[(shellHistoryFlag + SHELL_HISTORY_MAX_NUMBER + shellHistoryOffset) % SHELL_HISTORY_MAX_NUMBER]);
Serial.print((const char *)shellCommandBuff);
}
else if (receiveData == 0x42) // 方向下键
{
if (++shellHistoryOffset >= 0)
{
shellHistoryOffset = -1;
break;
}
shellBackspace(shellCommandIndex);
shellCommandIndex = shellStringCopy((char *)shellCommandBuff,
(const char *)shellHistoryCommand[(shellHistoryFlag + SHELL_HISTORY_MAX_NUMBER + shellHistoryOffset) % SHELL_HISTORY_MAX_NUMBER]);
Serial.print((const char *)shellCommandBuff);
}
else if (receiveData == 0x43) // 方向右键
{
// Serial.print("right\r\n");
}
else if (receiveData == 0x44) // 方向左键
{
// Serial.print("left\r\n");
}
else
{
controlFlag = CONTROL_FREE;
goto normal;
}
break;
case CONTROL_STEP_ONE:
if (receiveData == '[') // 0x58
{
controlFlag = CONTROL_STEP_TWO;
}
else
{
controlFlag = CONTROL_FREE;
goto normal;
}
break;
case CONTROL_FREE: // 正常按键处理
normal:
if (shellCommandIndex < SHELL_COMMAND_MAX_LENGTH - 1)
{
shellCommandBuff[shellCommandIndex++] = receiveData;
Serial.write(receiveData);
}
else
{
shellCommandIndex++;
Serial.write(receiveData);
}
break;
}
break;
}