304 lines
6.9 KiB
C
304 lines
6.9 KiB
C
#include "watch.h"
|
|
#include "watch_i2c.h"
|
|
#include "watch_registers.h"
|
|
|
|
// leave resource_detector.h as last include!
|
|
#include "resource_detector.h"
|
|
|
|
/*----------------------------------------------------------------------------*/
|
|
/* C O N F I G */
|
|
/*----------------------------------------------------------------------------*/
|
|
int watch_config_reset()
|
|
{
|
|
uint8_t config = 0;
|
|
if (watch_i2c_write_byte(ADDRESS_CONFIG, config) != 0)
|
|
{
|
|
return -1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int watch_config_toggle_pause()
|
|
{
|
|
uint8_t config;
|
|
if (watch_i2c_read_byte(ADDRESS_CONFIG, &config) != 0)
|
|
{
|
|
return -1;
|
|
}
|
|
watch_registers_toggle_config_is_paused(&config);
|
|
if (watch_i2c_write_byte(ADDRESS_CONFIG, config) != 0)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int watch_config_set_time_format(time_format format)
|
|
{
|
|
uint8_t config;
|
|
if (watch_i2c_read_byte(ADDRESS_CONFIG, &config) != 0)
|
|
{
|
|
return -1;
|
|
}
|
|
watch_registers_set_config_time_format(&config, format);
|
|
if (watch_i2c_write_byte(ADDRESS_CONFIG, config) != 0)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int watch_config_set_time_update_interval(time_update_interval interval)
|
|
{
|
|
uint8_t config;
|
|
if (watch_i2c_read_byte(ADDRESS_CONFIG, &config) != 0)
|
|
{
|
|
return -1;
|
|
}
|
|
watch_registers_set_config_time_update_interval(&config, interval);
|
|
if (watch_i2c_write_byte(ADDRESS_CONFIG, config) != 0)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int watch_config_get_settings(
|
|
bool* is_paused, time_format* format,
|
|
time_update_interval* interval)
|
|
{
|
|
uint8_t config;
|
|
|
|
if (is_paused == NULL || format == NULL || interval == NULL)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
if (watch_i2c_read_byte(ADDRESS_CONFIG, &config) != 0)
|
|
{
|
|
return -1;
|
|
}
|
|
watch_registers_get_config_settings(config, is_paused, format, interval);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------*/
|
|
/* T I M E */
|
|
/*----------------------------------------------------------------------------*/
|
|
int watch_set_time_hours(uint8_t hours)
|
|
{
|
|
uint8_t time_bits_low, time_bits_high;
|
|
|
|
if (watch_i2c_read_byte(ADDRESS_TIME_LOW, &time_bits_low) != 0)
|
|
{
|
|
return -1;
|
|
}
|
|
if (watch_i2c_read_byte(ADDRESS_TIME_HIGH, &time_bits_high) != 0)
|
|
{
|
|
return -1;
|
|
}
|
|
watch_registers_set_time_hours(&time_bits_low, &time_bits_high, hours);
|
|
|
|
if (watch_i2c_write_byte(ADDRESS_TIME_LOW, time_bits_low) != 0)
|
|
{
|
|
return -1;
|
|
}
|
|
if (watch_i2c_write_byte(ADDRESS_TIME_HIGH, time_bits_high) != 0)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int watch_set_time_minutes(uint8_t minutes)
|
|
{
|
|
uint8_t time_bits_low, time_bits_high;
|
|
|
|
if (watch_i2c_read_byte(ADDRESS_TIME_LOW, &time_bits_low) != 0)
|
|
{
|
|
return -1;
|
|
}
|
|
if (watch_i2c_read_byte(ADDRESS_TIME_HIGH, &time_bits_high) != 0)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
watch_registers_set_time_minutes(&time_bits_low, &time_bits_high, minutes);
|
|
|
|
if (watch_i2c_write_byte(ADDRESS_TIME_LOW, time_bits_low) != 0)
|
|
{
|
|
return -1;
|
|
}
|
|
if (watch_i2c_write_byte(ADDRESS_TIME_HIGH, time_bits_high) != 0)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int watch_set_time_seconds(uint8_t seconds)
|
|
{
|
|
uint8_t time_bits_low, time_bits_high;
|
|
|
|
if (watch_i2c_read_byte(ADDRESS_TIME_LOW, &time_bits_low) != 0)
|
|
{
|
|
return -1;
|
|
}
|
|
if (watch_i2c_read_byte(ADDRESS_TIME_HIGH, &time_bits_high) != 0)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
watch_registers_set_time_seconds(&time_bits_low, &time_bits_high, seconds);
|
|
|
|
if (watch_i2c_write_byte(ADDRESS_TIME_LOW, time_bits_low) != 0)
|
|
{
|
|
return -1;
|
|
}
|
|
if (watch_i2c_write_byte(ADDRESS_TIME_HIGH, time_bits_high) != 0)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int watch_get_time(uint8_t* hours, uint8_t* minutes, uint8_t* seconds)
|
|
{
|
|
uint8_t time_bits_low, time_bits_high;
|
|
|
|
if (hours == NULL || minutes == NULL || seconds == NULL)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
if (watch_i2c_read_byte(ADDRESS_TIME_LOW, &time_bits_low) != 0)
|
|
{
|
|
return -1;
|
|
}
|
|
if (watch_i2c_read_byte(ADDRESS_TIME_HIGH, &time_bits_high) != 0)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
watch_registers_get_time(
|
|
time_bits_low, time_bits_high, hours, minutes, seconds);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------*/
|
|
/* D A T E */
|
|
/*----------------------------------------------------------------------------*/
|
|
int watch_set_date_year(uint16_t year)
|
|
{
|
|
uint8_t date_bits_low, date_bits_high;
|
|
|
|
if (watch_i2c_read_byte(ADDRESS_DATE_LOW, &date_bits_low) != 0)
|
|
{
|
|
return -1;
|
|
}
|
|
if (watch_i2c_read_byte(ADDRESS_DATE_HIGH, &date_bits_high) != 0)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
watch_registers_set_date_year(&date_bits_low, &date_bits_low, year);
|
|
|
|
if (watch_i2c_write_byte(ADDRESS_DATE_LOW, date_bits_low) != 0)
|
|
{
|
|
return -1;
|
|
}
|
|
if (watch_i2c_write_byte(ADDRESS_DATE_HIGH, date_bits_high) != 0)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int watch_set_date_month(uint8_t month)
|
|
{
|
|
uint8_t date_bits_low, date_bits_high;
|
|
|
|
if (watch_i2c_read_byte(ADDRESS_DATE_LOW, &date_bits_low) != 0)
|
|
{
|
|
return -1;
|
|
}
|
|
if (watch_i2c_read_byte(ADDRESS_DATE_HIGH, &date_bits_high) != 0)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
watch_registers_set_date_month(&date_bits_low, &date_bits_low, month);
|
|
|
|
if (watch_i2c_write_byte(ADDRESS_DATE_LOW, date_bits_low) != 0)
|
|
{
|
|
return -1;
|
|
}
|
|
if (watch_i2c_write_byte(ADDRESS_DATE_HIGH, date_bits_high) != 0)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int watch_set_date_day_of_month(uint8_t day_of_month)
|
|
{
|
|
uint8_t date_bits_low, date_bits_high;
|
|
|
|
if (watch_i2c_read_byte(ADDRESS_DATE_LOW, &date_bits_low) != 0)
|
|
{
|
|
return -1;
|
|
}
|
|
if (watch_i2c_read_byte(ADDRESS_DATE_HIGH, &date_bits_high) != 0)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
watch_registers_set_date_day_of_month(
|
|
&date_bits_low, &date_bits_low, day_of_month);
|
|
|
|
if (watch_i2c_write_byte(ADDRESS_DATE_LOW, date_bits_low) != 0)
|
|
{
|
|
return -1;
|
|
}
|
|
if (watch_i2c_write_byte(ADDRESS_DATE_HIGH, date_bits_high) != 0)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int watch_get_date(uint8_t* year, uint8_t* month, uint8_t* day_of_month)
|
|
{
|
|
uint8_t date_bits_low, date_bits_high;
|
|
|
|
if (year == NULL || month == NULL || day_of_month == NULL)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
if (watch_i2c_read_byte(ADDRESS_DATE_LOW, &date_bits_low) != 0)
|
|
{
|
|
return -1;
|
|
}
|
|
if (watch_i2c_read_byte(ADDRESS_DATE_HIGH, &date_bits_high) != 0)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
watch_registers_get_date(
|
|
date_bits_low, date_bits_low, year, month, day_of_month);
|
|
|
|
return 0;
|
|
}
|