![](/media/cache/group/orange_and_cat.png.50x50_q85.jpg)
pwm period is now 200us instead of the default 20ms veml6040 config is now AF_BIT | TRIG_BIT
Dependencies: mbed MMA8451Q USBDevice WakeUp vt100
Fork of afero_node_suntory_2017_06_15 by
Diff: util/RTC_Handler.cpp
- Revision:
- 0:20bce0dcc921
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/util/RTC_Handler.cpp Tue Dec 20 01:51:02 2016 +0000 @@ -0,0 +1,148 @@ +#include "RTC_Handler.h" + +static RTC_Handler *self = NULL; + +RTC_Handler* RTC_Handler::getInstance() +{ + return self != NULL ? self : self = new RTC_Handler(); +} + +#if defined (TARGET_KL25Z) + +#define RTC8564NB_ADR 0xA2 + +#define CONTROL1 0x00 +#define CONTROL2 0x01 +#define SECONDS 0x02 +#define MINUTES 0x03 +#define HOURS 0x04 +#define DAYS 0x05 +#define WEEKDAYS 0x06 +#define MONTHS 0x07 +#define YEARS 0x08 +#define MINUTE_ALARM 0x09 +#define HOUR_ALARM 0x0A +#define DAY_ALARM 0x0B +#define WEEKDAY_ALARM 0x0C +#define CLOCKOUT_FREQ 0x0D +#define TIMER_CONTROL 0x0E +#define TIMER 0x0F +#define _READ 0x01 +#define JST_TO_UTC_DELTA (9*60*60) + + +RTC_Handler::RTC_Handler() : i2c(PTE0, PTE1) +{ +} + +char +RTC_Handler::read(char address) +{ + char value; + i2c.start(); + i2c.write(RTC8564NB_ADR); + i2c.write(address); + i2c.start(); + i2c.write(RTC8564NB_ADR | _READ); + value = i2c.read(0); + i2c.stop(); + return value; +} + +char +RTC_Handler::write(char address, char value) +{ + i2c.start(); + i2c.write(RTC8564NB_ADR); + i2c.write(address); + i2c.write(value); + i2c.stop(); +} + +void +RTC_Handler::set(char y[3], char m[3], char d[3], char h[3], char min[3], char s[3]) +{ + write(CONTROL1, 0x20); //stop + write(CONTROL2, 0x00); + write(YEARS, ((y[0]-0x30)<<4)+(y[1]-0x30)); + write(MONTHS, ((m[0]-0x30)<<4)+(m[1]-0x30)); + write(DAYS, ((d[0]-0x30)<<4)+(d[1]-0x30)); + write(HOURS, ((h[0]-0x30)<<4)+(h[1]-0x30)); + write(MINUTES, ((min[0]-0x30)<<4)+(min[1]-0x30)); + write(SECONDS, ((s[0]-0x30)<<4)+(s[1]-0x30)); +// write(WEEKDAYS, week_val[0] - 0x30); //Sunday = "0", Monday = "1" ... + write(CLOCKOUT_FREQ, 0x00); // 0x83 = TE on & 1Hz + write(TIMER_CONTROL, 0x00); + write(CONTROL1, 0x00); //start + return; +} + +void +RTC_Handler::setUTC(time_t t) +{ + struct tm *date; + char str[32]; + memset(str,'\0',sizeof(str)); + //timer = time(NULL); + t -= JST_TO_UTC_DELTA; //make local time UTC + date = localtime(&t); + strftime(str, 255, "%y%m%d%H%M%S", date); + //printf("%s\n", str); + set(&str[0],&str[2],&str[4],&str[6],&str[8],&str[10]); +} + +time_t +RTC_Handler::getUTC() +{ + int year = read(YEARS); + int mon = read(MONTHS); + int day = read(DAYS); + int week = read(WEEKDAYS); + int hour = read(HOURS); + int min = read(MINUTES); + int sec = read(SECONDS); + + year = 2000 + ((year>>4)&0x03)*10 + (year&0x0F); + mon = ((mon>>4)&0x01)*10 + (mon&0x0F); + day = ((day>>4)&0x03)*10 + (day&0x0F); + hour = ((hour>>4)&0x03)*10 + (hour&0x0F); + min = (min>>4)*10 + (min&0x0F); + sec = (sec>>4)*10 + (sec&0x0F); + + struct tm strtim; + time_t ret; + memset(( void * )&strtim , '\0' , sizeof( strtim )); + strtim.tm_year = year-1900; /* 年[1900年から起算] */ + strtim.tm_mon = mon-1; /* 月[0-11] */ + strtim.tm_mday = day; /* 日[1-31] */ + strtim.tm_hour = hour ;/* 時[0-23] */ + strtim.tm_min = min ;/* 分[0-59] */ + strtim.tm_sec = sec; /* 秒[0-61]閏秒考慮 */ + + /* 日付補完 */ + ret = mktime( &strtim ); + if( ret == -1 ) { + printf( "mmktime error\n" ); + } + + return ret; +} +#elif defined (TARGET_TEENSY3_1) + +RTC_Handler::RTC_Handler() +{ +} + +void +RTC_Handler::setUTC(time_t t) +{ + set_time(t); +} + +time_t +RTC_Handler::getUTC() +{ + return time(NULL); +} + +#endif