feat(ex01): fixed parsing to account for >2 digit hex char
This commit is contained in:
parent
e62f4ea7b1
commit
1915aee2a0
1 changed files with 80 additions and 28 deletions
108
ex01/src/main.c
108
ex01/src/main.c
|
|
@ -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");
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue