86 lines
1.8 KiB
C++
86 lines
1.8 KiB
C++
|
#include <XnodeUtil.h>
|
||
|
|
||
|
char unpstr_buff[UNPSTR_BUFF_SIZE]; // buffer to copy progmem data into
|
||
|
|
||
|
// Uncopy from program/flash memory to sram
|
||
|
char* XnodeUtil::UNPSTR(const char* ptr) {
|
||
|
for (uint8_t i = ZERO; i < UNPSTR_BUFF_SIZE; i++) {
|
||
|
unpstr_buff[i] = '\0'; // clean buffer
|
||
|
}
|
||
|
uint8_t i = ZERO;
|
||
|
uint8_t c = ZERO;
|
||
|
do {
|
||
|
c = pgm_read_byte(ptr++);
|
||
|
unpstr_buff[i++] = c;
|
||
|
} while (c != ZERO);
|
||
|
return unpstr_buff;
|
||
|
}
|
||
|
|
||
|
// Fill pstr_buff from pointer
|
||
|
char* XnodeUtil::UNPSTRA(const uint16_t* argu) {
|
||
|
// rm readByte use word which auto size ptr
|
||
|
uint8_t msb = pgm_read_byte((const char*) argu + 1);
|
||
|
uint8_t lsb = pgm_read_byte((const char*) argu);
|
||
|
const char*p = (const char*) ((msb * 256) + lsb);
|
||
|
return UNPSTR(p);
|
||
|
}
|
||
|
|
||
|
uint8_t XnodeUtil::strcmp(char *s1, char *s2) {
|
||
|
while (*s1 && *s2 && *s1 == *s2) {
|
||
|
s1++;
|
||
|
s2++;
|
||
|
}
|
||
|
if (*s1 == *s2) {
|
||
|
return 0;
|
||
|
}
|
||
|
if (*s1 < *s2) {
|
||
|
return -1;
|
||
|
}
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
uint8_t XnodeUtil::strcmpP(char *s1, const char* s2) {
|
||
|
return strcmp(s1, UNPSTR(s2));
|
||
|
}
|
||
|
|
||
|
void XnodeUtil::charsToByteA(char* input,byte* data, byte data_len) {
|
||
|
for (byte i = ZERO; i < data_len; i++) {
|
||
|
data[i] = ZERO; // clear array
|
||
|
}
|
||
|
byte charIdx = ZERO;
|
||
|
for (byte i = ZERO; i < data_len; i++) {
|
||
|
char c1 = input[charIdx];
|
||
|
char c2 = input[charIdx + ONE];
|
||
|
if (c1 == ZERO || c2 == ZERO) {
|
||
|
break;
|
||
|
}
|
||
|
data[i] = charsToByte(c1, c2);
|
||
|
charIdx++;
|
||
|
charIdx++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
byte XnodeUtil::charsToByte(char c1, char c2) {
|
||
|
byte result = ZERO;
|
||
|
result += charToNibble(c1) * 16;
|
||
|
result += charToNibble(c2);
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
byte XnodeUtil::charToNibble(char c) {
|
||
|
uint8_t result = ZERO;
|
||
|
if (c > '0' && c <= '9') {
|
||
|
result = c - '0';
|
||
|
} else if (c >= 'A' && c <= 'F') {
|
||
|
result = c - 'A' + 10;
|
||
|
}
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
int XnodeUtil::freeRam() {
|
||
|
extern int __heap_start, *__brkval;
|
||
|
int v;
|
||
|
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
|
||
|
}
|
||
|
|