zoom/firmware/util.c
jim dc0e311582 allow arbitrary value input
git-svn-id: https://bucket.mit.edu/svn/nilm/zoom@7173 ddd99763-3ecb-0310-9145-efcb8ce7c51f
2009-02-05 23:39:49 +00:00

45 lines
796 B
C

#include "config.h"
#include "util.h"
/* Convert from ASCII hex. Returns
the value, or 16 if it was space/newline, or
32 if some other character. */
uint8_t from_hex(uint8_t ch)
{
if(ch==' ' || ch=='\r' || ch=='\n')
return 16;
if(ch < '0')
goto bad;
if(ch <= '9')
return ch - '0';
ch |= 0x20;
if(ch < 'a')
goto bad;
if(ch <= 'f')
return ch - 'a' + 10;
bad:
return 32;
}
const uint8_t hex[16]={'0','1','2','3','4','5','6','7',
'8','9','a','b','c','d','e','f'};
/* Convert 4 ASCII hex digits into a 16-bit unsigned number.
Returns the number, or -1 if there's an error */
int32_t hex_to_u16(char x[4])
{
uint16_t v = 0;
uint8_t t;
int i;
for (i = 0; i < 4; i++) {
t = from_hex(x[i]);
if (t >= 16)
return -1;
v = (v << 4) | t;
}
return v;
}