Files
CCU4-firmware/utils.h
T
2023-09-11 18:04:36 +02:00

36 lines
1.6 KiB
C

#ifdef ARRAY_CHECK
#define ARRAY(ARR, POS) ARR[(size_t)(POS) * sizeof(*ARR) < sizeof(ARR) ?(POS):array_out_of_bounds(__FUNCTION__,__LINE__,(POS))]
#else
#define ARRAY(ARR, POS) ARR[POS]
#endif
typedef unsigned long ulong;
#define flash_str const __FlashStringHelper *
#define time_ge(A,B) ((long)((A)-(B)) >= 0)
// FCPY, FCAT: set or append string from flash
//#define FCPY(NAME, TEXT) {static const char str[] PROGMEM = TEXT; strlcpy_P((NAME), str, sizeof(NAME)); }
//#define FCAT(NAME, TEXT) {static const char str[] PROGMEM = TEXT; strlcat_P((NAME), str, sizeof(NAME)); }
// convert to compressed code containing up to 40 different chars (NUL 0-9 a-z . - _)
#define CHAR_TO_C40(c) ((c) >= 'a' && (c) <= 'z' ? (c) - 'a' + 12 : \
(c) >= 'A' && (c) <= 'Z' ? (c) - 'A' + 12 : \
(c) >= '0' && (c) <= '9' ? (c) - '0' + 1 : \
(c) == 0 ? 0 : \
(c) == '.' ? 37 : \
(c) == '-' ? 38 : 39)
// compress short strings (up to 6 chars)
// up to 3 letters fit into a word
// up to 6 letters fit into a unsigned long
#define COMP_C40_4(name) (name[4]?CHAR_TO_C40(name[4])+40L*CHAR_TO_C40(name[5]):0)
#define COMP_C40_3(name) (name[3]?CHAR_TO_C40(name[3])+40L*COMP_C40_4(name):0)
#define COMP_C40_2(name) (name[2]?CHAR_TO_C40(name[2])+40L*COMP_C40_3(name):0)
#define COMP_C40_1(name) (name[1]?CHAR_TO_C40(name[1])+40*COMP_C40_2(name):0)
#define C(name) (name[0]?CHAR_TO_C40(name[0])+40*COMP_C40_1(name):0)
typedef enum {ee_read, ee_write} EeMode;
#define EESTORE(NAME, MODE) eeStore((void *)&NAME, sizeof NAME, MODE)