mirror of
https://github.com/logicog/RTLPlayground.git
synced 2026-08-30 14:52:51 +08:00
Add support for command history
This adds a command history, both for the CLI as well as for commands sent by the web-interface. They are written to a ring buffer in order to work safely with a relatively small amount of RAM The buffer is used to read the current in-RAM configuration from the switch by the web-interface. It could also be used to implement cmd history via cursor up/down in the CLI.
This commit is contained in:
+50
-11
@@ -5,9 +5,6 @@
|
|||||||
// #define DEBUG
|
// #define DEBUG
|
||||||
// #define REGDBG 1
|
// #define REGDBG 1
|
||||||
|
|
||||||
#define CONFIG_START 0x70000
|
|
||||||
#define CONFIG_LEN 0x1000
|
|
||||||
|
|
||||||
#include "rtl837x_common.h"
|
#include "rtl837x_common.h"
|
||||||
#include "rtl837x_port.h"
|
#include "rtl837x_port.h"
|
||||||
#include "rtl837x_flash.h"
|
#include "rtl837x_flash.h"
|
||||||
@@ -54,12 +51,16 @@ __xdata uint8_t cmd_available;
|
|||||||
__xdata uint8_t l;
|
__xdata uint8_t l;
|
||||||
__xdata uint8_t line_ptr;
|
__xdata uint8_t line_ptr;
|
||||||
__xdata char is_white;
|
__xdata char is_white;
|
||||||
|
__xdata char save_cmd;
|
||||||
|
|
||||||
__xdata uint8_t ip[4];
|
__xdata uint8_t ip[4];
|
||||||
|
|
||||||
#define N_WORDS SBUF_SIZE
|
#define N_WORDS SBUF_SIZE
|
||||||
__xdata signed char cmd_words_b[N_WORDS];
|
__xdata signed char cmd_words_b[N_WORDS];
|
||||||
|
|
||||||
|
__xdata uint8_t cmd_history[CMD_HISTORY_SIZE];
|
||||||
|
__xdata uint16_t cmd_history_ptr;
|
||||||
|
|
||||||
// Maps the physical port (starting from 0) to the logical port
|
// Maps the physical port (starting from 0) to the logical port
|
||||||
__code uint8_t phys_to_log_port[6] = {
|
__code uint8_t phys_to_log_port[6] = {
|
||||||
4, 5, 6, 7, 3, 8
|
4, 5, 6, 7, 3, 8
|
||||||
@@ -706,21 +707,52 @@ void cmd_parser(void) __banked
|
|||||||
if (cmd_compare(0, "version")) {
|
if (cmd_compare(0, "version")) {
|
||||||
print_sw_version();
|
print_sw_version();
|
||||||
}
|
}
|
||||||
|
if (cmd_compare(0, "history")) {
|
||||||
|
__xdata uint16_t p = (cmd_history_ptr + 1) & CMD_HISTORY_MASK;
|
||||||
|
__xdata uint8_t found_begin = 0;
|
||||||
|
print_string("History ptr: ");
|
||||||
|
print_short(cmd_history_ptr); write_char('\n');
|
||||||
|
while (p != cmd_history_ptr) {
|
||||||
|
print_short(p); write_char(' ');
|
||||||
|
if (!cmd_history[p] || cmd_history[p] == '\n')
|
||||||
|
found_begin = 1;
|
||||||
|
if (found_begin && cmd_history[p])
|
||||||
|
write_char(cmd_history[p]);
|
||||||
|
p = (p + 1) & CMD_HISTORY_MASK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (save_cmd) {
|
||||||
|
uint8_t i;
|
||||||
|
for (i = 0; i < N_WORDS; i++) {
|
||||||
|
if (cmd_words_b[i] < 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (i < N_WORDS) {
|
||||||
|
i = cmd_words_b[--i];
|
||||||
|
cmd_history_ptr = (cmd_history_ptr + i) & CMD_HISTORY_MASK;
|
||||||
|
__xdata uint16_t p = cmd_history_ptr;
|
||||||
|
cmd_history[cmd_history_ptr++] = '\n';
|
||||||
|
do {
|
||||||
|
i--;
|
||||||
|
cmd_history[--p & CMD_HISTORY_MASK] = cmd_buffer[i];
|
||||||
|
} while (i);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define FLASH_READ_BURST_SIZE 0x100;
|
#define FLASH_READ_BURST_SIZE 0x100;
|
||||||
void execute_config(void) __banked
|
void execute_config(void) __banked
|
||||||
{
|
{
|
||||||
memcpyc(flash_buf, "test", 5);
|
__xdata uint32_t pos = CONFIG_START;
|
||||||
print_string_x(flash_buf);
|
__xdata uint16_t len_left = CONFIG_LEN;
|
||||||
|
|
||||||
__xdata uint32_t pos = CONFIG_START;
|
save_cmd = 0;
|
||||||
__xdata uint16_t len_left = CONFIG_LEN;
|
|
||||||
do {
|
do {
|
||||||
flash_region.addr = pos;
|
flash_region.addr = pos;
|
||||||
flash_region.len = FLASH_READ_BURST_SIZE;
|
flash_region.len = FLASH_READ_BURST_SIZE;
|
||||||
write_char('-'); print_long(flash_region.addr); write_char(':'); print_short(flash_region.len); write_char('\n');
|
write_char('-'); print_long(flash_region.addr); write_char(':'); print_short(flash_region.len); write_char('\n');
|
||||||
|
|
||||||
flash_read_bulk(flash_buf);
|
flash_read_bulk(flash_buf);
|
||||||
|
|
||||||
@@ -737,7 +769,7 @@ void execute_config(void) __banked
|
|||||||
if (cmd_idx && !cmd_tokenize())
|
if (cmd_idx && !cmd_tokenize())
|
||||||
cmd_parser();
|
cmd_parser();
|
||||||
if (c == 0)
|
if (c == 0)
|
||||||
return;
|
goto config_done;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -748,5 +780,12 @@ void execute_config(void) __banked
|
|||||||
|
|
||||||
len_left -= FLASH_READ_BURST_SIZE;
|
len_left -= FLASH_READ_BURST_SIZE;
|
||||||
pos += FLASH_READ_BURST_SIZE;
|
pos += FLASH_READ_BURST_SIZE;
|
||||||
} while(len_left);
|
} while(len_left);
|
||||||
|
|
||||||
|
config_done:
|
||||||
|
// Start saving commands to cmd_history
|
||||||
|
save_cmd = 1;
|
||||||
|
for (cmd_history_ptr = 0; cmd_history_ptr < CMD_HISTORY_SIZE; cmd_history_ptr++)
|
||||||
|
cmd_history[cmd_history_ptr] = 0;
|
||||||
|
cmd_history_ptr = 0;
|
||||||
}
|
}
|
||||||
|
|||||||
+10
-1
@@ -47,6 +47,15 @@
|
|||||||
#define IS_SFP(port) (i == maxPort || i == 3)
|
#define IS_SFP(port) (i == maxPort || i == 3)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define CONFIG_START 0x70000
|
||||||
|
#define CONFIG_LEN 0x1000
|
||||||
|
#define CODE0_SIZE 0x4000
|
||||||
|
#define CODE_BANK_SIZE 0xc000
|
||||||
|
|
||||||
|
// Constants for the circular command buffer, the size must be 2^n
|
||||||
|
#define CMD_HISTORY_SIZE 0x400
|
||||||
|
#define CMD_HISTORY_MASK (CMD_HISTORY_SIZE - 1)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Representation of a 48-bit Ethernet address.
|
* Representation of a 48-bit Ethernet address.
|
||||||
*/
|
*/
|
||||||
@@ -94,6 +103,6 @@ uint16_t strlen_x(register __xdata const char *s);
|
|||||||
uint16_t strtox(register __xdata uint8_t *dst, register __code const char *s);
|
uint16_t strtox(register __xdata uint8_t *dst, register __code const char *s);
|
||||||
void tcpip_output(void);
|
void tcpip_output(void);
|
||||||
void print_string_x(__xdata char *p);
|
void print_string_x(__xdata char *p);
|
||||||
|
uint8_t read_flash(uint8_t bank, __code uint8_t *addr);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user