/// \file
/// \brief Utilities
///
/// Bit settings. BCD conversions. Calendar.
///
#pragma once
#define BV2(a,b) (_BV(a)|_BV(b))
#define BV3(a,b,c) (_BV(a)|_BV(b)|_BV(c))
#define BV4(a,b,c,d) (_BV(a)|_BV(b)|_BV(c)|_BV(d))
#define BV5(a,b,c,d,e) (_BV(a)|_BV(b)|_BV(c)|_BV(d)|_BV(e))
#define BV6(a,b,c,d,e,f) (_BV(a)|_BV(b)|_BV(c)|_BV(d)|_BV(e)|_BV(f))
#define BV7(a,b,c,d,e,f,g) (_BV(a)|_BV(b)|_BV(c)|_BV(d)|_BV(e)|_BV(f)|_BV(g))
/// Make BCD time from 2 bytes
#define maketime(hh,mm) (((hh) << 8) + (mm))
/// Convert to binary from BCD representation
/// \see frombcd
#define _frombcd(x) ((x & 017) + (((x) & 0160)>>4) * 10)
#ifdef __cplusplus
extern "C" {
#endif
/// Convert to binary from BCD representation as a function.
/// \see _frombcd
uint8_t frombcd(uint8_t);
uint16_t tobcd16(uint16_t);
/// Return BCD count of days in month for given BCD year and month.
/// Valid only for years 2000-2099.
uint8_t days_in_month_bcd(uint8_t year, uint8_t month);
/// Increment BCD value by 1
uint8_t bcd_increment(uint8_t x);
/// Get day of week, 0 = Sunday. Input parameters are binary (not BCD)
uint8_t day_of_week(uint8_t y, uint8_t m, uint8_t d);
/// Set blinkmode
void blinkmode_set(uint8_t mode);
/// Get blinkmode
uint8_t blinkmode_get();
/// Called every blink, unless NULL
//void (*blinkhandler)(uint8_t);
/// Sets fading mode and speed
/// \see _fademode
void fade_set(uint8_t mode);
void fadeto(uint16_t t);
uint16_t get_display_value();
/// Cycle display modes
/// \see _displaymode
void mode_next();
/// get display mode
/// \see _displaymode
uint8_t mode_get();
void savingmode_set(uint8_t s);
uint8_t savingmode_get();
void savingmode_next();
// see dot blinking mode
// \see _dotmode
void dotmode_set(uint8_t mode);
#ifdef __cplusplus
}
#endif