feat(ex01): fixed parsing to account for >2 digit hex char

This commit is contained in:
Maix0 2026-04-23 09:53:16 +02:00
parent e62f4ea7b1
commit 1915aee2a0

View file

@ -50,45 +50,97 @@ void print_eeprom(uint16_t highlight_addr) {
}
}
uint16_t read_hex(void) {
uint16_t addr;
char data;
// true on error
bool parse_string(char* str, uint16_t* addr, uint8_t* value) {
uint16_t addr_temp;
uint8_t val_temp;
addr = 0;
uint8_t tmp;
uint8_t i;
uint8_t j;
for (uint8_t i = 0; i < 2; i++) {
read_data:
data = uart_rx();
if ('a' <= data && data <= 'z')
data -= 'a' - 'A';
if (!((data >= '0' && data <= '9') || (data >= 'A' && data <= 'F')))
goto read_data;
if (data >= '0' && data <= '9')
addr |= ((data - '0') << (4 - 4 * i));
else
addr |= (data - 'A' + 10) << (4 - 4 * i);
uart_tx(data);
addr_temp = 0;
i = 0;
j = 0;
while ((tmp = ft_stridx("0123456789ABCDEF", str[i])) != 255 && j < 4) {
addr_temp *= 16;
addr_temp += tmp;
i++;
j++;
}
if (str[i] != ' ') {
uart_sendstring("invalid format: <addr> <value>\r\n");
return true;
}
i++;
j = 0;
val_temp = 0;
while ((tmp = ft_stridx("0123456789ABCDEF", str[i])) != 255 && j < 2) {
val_temp *= 16;
val_temp += tmp;
i++;
j++;
}
if (str[i] != 0) {
uart_sendstring("invalid format: <addr> <value>\r\n");
return true;
}
if (addr_temp > 1023) {
uart_sendstring("invalid format: <addr> can't be greater than 1023\r\n");
return true;
}
return addr;
*addr = addr_temp;
*value = val_temp;
return false;
}
void read_addr_value(uint16_t* addr, uint8_t* value) {
#define BUFFER_SIZE (128)
char buffer[BUFFER_SIZE];
uint8_t cursor;
start:
ft_bzero(buffer, BUFFER_SIZE);
cursor = 0;
while (true) {
uint8_t chr = uart_rx();
if (chr == '\x7f' || chr == '\b') {
if (cursor) {
buffer[--cursor] = 0;
uart_sendstring("\b \b");
}
continue;
}
if (chr == '\r') {
uart_sendstring("\r\n");
if (parse_string(buffer, addr, value))
goto start;
return;
}
if (chr < ' ' || chr > '~')
continue;
if (cursor + 1 >= BUFFER_SIZE)
continue;
if (chr >= 'a' && chr <= 'z')
chr -= 'a' - 'A';
buffer[cursor++] = chr;
uart_tx(chr);
}
}
int main(void) {
uart_init();
uint16_t addr = 0;
uint8_t data = 0;
print_eeprom(-1);
while (true) {
uint16_t addr = read_hex();
uart_tx(' ');
uint16_t data = read_hex();
uart_sendstring("\r\n");
if (addr >= 1024) {
uart_sendstring("Addr can't be greater than 1023\r\n");
continue;
}
read_addr_value(&addr, &data);
uint16_t edata = eeprom_read_single(addr);
if (edata == data)
uart_sendstring("not writing anything since same data !\r\n");