pimoroni-pico/drivers/pcf85063a/pcf85063a.hpp

138 lines
4.0 KiB
C++

#pragma once
#include "hardware/i2c.h"
#include "hardware/rtc.h"
#include "common/pimoroni_common.hpp"
#include "common/pimoroni_i2c.hpp"
namespace pimoroni {
class PCF85063A {
//--------------------------------------------------
// Constants
//--------------------------------------------------
public:
static const uint DEFAULT_I2C_ADDRESS = 0x51;
static const int PARAM_UNUSED = -1;
//--------------------------------------------------
// Enums
//--------------------------------------------------
public:
enum ClockOut : uint8_t {
CLOCK_OUT_32768HZ = 0,
CLOCK_OUT_16384HZ = 1,
CLOCK_OUT_8192HZ = 2,
CLOCK_OUT_4096HZ = 3,
CLOCK_OUT_2048HZ = 4,
CLOCK_OUT_1024HZ = 5,
CLOCK_OUT_1HZ = 6,
CLOCK_OUT_OFF = 7
};
enum DayOfWeek : int8_t {
SUNDAY = 0,
MONDAY = 1,
TUESDAY = 2,
WEDNESDAY = 3,
THURSDAY = 4,
FRIDAY = 5,
SATURDAY = 6,
NONE = PARAM_UNUSED
};
enum TimerTickPeriod : int8_t {
TIMER_TICK_4096HZ = 0b00,
TIMER_TICK_64HZ = 0b01,
TIMER_TICK_1HZ = 0b10,
TIMER_TICK_1_OVER_60HZ = 0b11
};
private:
enum Registers : uint8_t {
CONTROL_1 = 0x00,
CONTROL_2 = 0x01,
OFFSET = 0x02,
RAM_BYTE = 0x03,
OSCILLATOR_STATUS = 0x04, // flag embedded in seconds register (see below)
SECONDS = 0x04, // contains oscillator status flag (see above)
MINUTES = 0x05,
HOURS = 0x06,
DAYS = 0x07,
WEEKDAYS = 0x08,
MONTHS = 0x09,
YEARS = 0x0A,
SECOND_ALARM = 0x0B,
MINUTE_ALARM = 0x0C,
HOUR_ALARM = 0x0D,
DAY_ALARM = 0x0E,
WEEKDAY_ALARM = 0x0F,
TIMER_VALUE = 0x10,
TIMER_MODE = 0x11
};
//--------------------------------------------------
// Variables
//--------------------------------------------------
private:
I2C *i2c;
// Interface pins with our standard defaults where appropriate
uint address = DEFAULT_I2C_ADDRESS;
uint interrupt = PIN_UNUSED;
//--------------------------------------------------
// Constructors/Destructor
//--------------------------------------------------
public:
PCF85063A() {}
PCF85063A(I2C *i2c, uint interrupt = PIN_UNUSED) :
i2c(i2c), interrupt(interrupt) {}
//--------------------------------------------------
// Methods
//--------------------------------------------------
public:
void init();
void reset();
// I2C instance details access methods
i2c_inst_t* get_i2c() const;
int get_address() const;
int get_sda() const;
int get_scl() const;
int get_int() const;
// Set and get the date and time
// Uses datetime_t from pico sdk (hardware/rtc) for compatibility
datetime_t get_datetime();
void set_datetime(datetime_t *t);
// Alarm manipulation methods
void set_alarm(int second = PARAM_UNUSED, int minute = PARAM_UNUSED,
int hour = PARAM_UNUSED, int day = PARAM_UNUSED);
void set_weekday_alarm(int second = PARAM_UNUSED, int minute = PARAM_UNUSED,
int hour = PARAM_UNUSED, DayOfWeek dotw = DayOfWeek::NONE);
void enable_alarm_interrupt(bool enable);
bool read_alarm_flag();
void clear_alarm_flag();
void unset_alarm();
// Timer manipulation methods
void set_timer(uint8_t ticks,
TimerTickPeriod ttp = TimerTickPeriod::TIMER_TICK_1HZ);
void enable_timer_interrupt(bool enable, bool flag_only = false);
bool read_timer_flag();
void clear_timer_flag();
void unset_timer();
// Clock output
void set_clock_output(ClockOut co);
};
}