#ifndef _MAIN_H_
#define _MAIN_H_

// Calculate the byte offset of a field in a structure of type type.
#define FIELD_OFFSET(type, field) ((uint32_t)(uint32_t*)&(((type *)0)->field))

// Calculate the size of a field in a structure of type type 
#define FIELD_SIZE(type, field) (sizeof(((type *)0)->field))

// Calculate the size from field1 to field2 (inclusive)
#define FIELD_SIZE_THROUGH(type, field1, field2) \
    (FIELD_OFFSET(type, field2) + FIELD_SIZE(type, field2) - FIELD_OFFSET(type, field1))

#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))

#define NUM_TUBES 4
#define MAX_FADE_DIGITS 2

#define I2C_MAX_BUFFER 20

#define FADE_TICKS 1024
#define FADE_TICK_STEP (PCA9685_Max_Brightness / FADE_TICKS)

#define DIGIT_REFRESH_RATE_US 1000  // 1KHz display refresh rate

#define DIGIT_RNG_REFRESH_RATE_S 30
#define DIGIT_RNG_REFRESH_ITER 20

void I2C_Write(int DeviceAddress, char RegAddress, char *Data, int Length);
void I2C_Read(int DeviceAddress, char RegAddress, char *Data, int Length);

#endif