📄 clock.cpp
字号:
#include "ClockApp.h"
#include "Calendar.h"
#include "EEprom.h"
#include "Ring.h"
// m_view_type:
// 0: 月日星期时分秒
// 1: 年月日星期节气
// 2: 闹钟
// 3: 农历月日节气
CClock::CClock()
{
m_month = 1; m_day = 1;
#ifdef WIN32
m_year = 0;
m_hour = m_min = m_sec = 0;
m_tick = m_view_tick = m_view_type = 0;
m_alarm_index = 0;
#endif
#if SUPPORT_LUNAR
m_lunar_mon = 11; m_lunar_day = 25;
#if SUPPORT_LUNAR_HOLIDAY
m_lunar_holiday = 23; m_lunar_holiday_wait = 5;
// m_lunar_holiday_wait =
#endif
// CCalendar::GetLunar(
// m_lunar_mon,
// m_lunar_day,
//#if SUPPORT_LUNAR_HOLIDAY
// m_lunar_holiday,
//#endif
// m_year, m_month,
// m_day);
#endif
m_week_day = 6;
//m_week_day = CCalendar::GetWeekday(year, month, day)
CEEprom::LoadConfig(m_alarmBuff, m_hour_ring);
}
CClock::~CClock()
{
}
bool CClock::OnKeyPress(UCHAR key, UCHAR sec, UCHAR down)
{
if(!down && !sec){
m_view_tick = 4 * 16;//显示4秒钟
#if SUPPORT_LUNAR
if(KEY_RIGHT == key){
m_view_type = 3;//显示农历
Refresh();
}else
#endif
if(KEY_PREV == key || KEY_NEXT == key){
memset(&led, 0, sizeof(led));
CClockApp::clockApp->Flash(NULL);//不要豆豆跳动
if(m_view_type != 2) m_alarm_index = 0;
else if(key == KEY_PREV){
if(!m_alarm_index) m_alarm_index = ALARM_MAX-1;
else m_alarm_index--;
}else{
if(m_alarm_index >= ALARM_MAX-1) m_alarm_index = 0;
else m_alarm_index++;
}
AlarmbuffToLedbuff(led, m_alarmBuff[m_alarm_index], m_alarm_index);
led.dot = 1;
CClockApp::clockApp->Display(led);
m_view_type = 2; //显示闹钟
}else/* if(KEY_LEFT == key)*/{
m_view_type = 1;//显示年月日
Refresh();
}//else return false;
return true;
}else if(down && KEY_LEFT == key && m_view_type == 1){
if(sec > 2){
//在看年月日的时候长时间按住left
m_view_tick = 4 * 16;//显示4秒钟
m_hour_ring = !m_hour_ring;
//保存设置
CEEprom::SaveConfig(m_alarmBuff, m_hour_ring);
if(m_hour_ring) CRing::Beep(1000, 16);
CClockApp::clockApp->CleanKeystate();
}
return true;
}
return false;
}
void CClock::OnTick()
{
if(m_view_tick && !--m_view_tick)
m_view_type = 0;
if(++m_tick & 0x0f) return;
for(;;){
if(++m_sec < 60) break;
m_sec = 0;
if(++m_min < 60) break;
m_min = 0;
if(++m_hour < 24) break;
m_hour = 0;
for(;;){
++m_day;
if(m_day <= 28) break;
if(m_day <= 31 &&
((m_month < 8 && (m_month & 1)) || (m_month > 7 && !(m_month & 1))) ) break;
if(m_day <= 30 && (m_month == 4 || m_month == 6 || m_month == 9 || m_month == 11)) break;
if(!(m_year & 3)){//闰年
if(m_day <= 29) break;
}
m_day = 1;
if(++m_month < 13) break;
m_month = 1;
if(++m_year >= 100) m_year = 0;
break;
}
//重新计算星期
if(m_week_day == 6) m_week_day = 0;
else m_week_day++;
#if SUPPORT_LUNAR
//重新计算农历
#if SUPPORT_LUNAR_HOLIDAY
m_lunar_holiday_wait =
#endif
CCalendar::GetLunar(
m_lunar_mon,
m_lunar_day,
#if SUPPORT_LUNAR_HOLIDAY
m_lunar_holiday,
#endif
m_year, m_month,
m_day);
#endif
break;
}
if(m_view_type != 2) Refresh();
//半点和整点报时
if((!m_min || m_min == 30) &&
!m_sec && m_hour_ring &&
m_hour >= 7 && m_hour <= 22) CRing::Beep(1000, 16);
//闹钟
UCHAR i;
for(i = 0; i < ALARM_MAX; i++){
if(m_alarmBuff[i].enable &&
!m_sec &&
m_alarmBuff[i].hour == m_hour && m_alarmBuff[i].min == m_min &&
(m_alarmBuff[i].week & (1<<m_week_day)) ){
//播放铃声 m_alarmBuff[i].ring
CRing::Play(m_alarmBuff[i].ring);
break;
}
}
}
void CClock::GetTime(UCHAR &year, UCHAR &month, UCHAR &day, UCHAR &hour, UCHAR &min, UCHAR &sec)
{
year = m_year; month = m_month; day = m_day;
hour = m_hour; min = m_min; sec = m_sec;
}
void CClock::SetTime(UCHAR year, UCHAR month, UCHAR day, UCHAR hour, UCHAR min, UCHAR sec)
{
m_year = year; m_month = month; m_day = day;
m_hour = hour; m_min = min; m_sec = sec;
//计算星期
m_week_day = CCalendar::GetWeekday(year, month, day);
#if SUPPORT_LUNAR
//计算农历
#if SUPPORT_LUNAR_HOLIDAY
m_lunar_holiday_wait =
#endif
CCalendar::GetLunar(
m_lunar_mon,
m_lunar_day,
#if SUPPORT_LUNAR_HOLIDAY
m_lunar_holiday,
#endif
m_year, m_month,
m_day);
#endif
m_tick = 0;
}
void CClock::OnSetFocus()
{
CClockApp::clockApp->Flash(NULL);
m_view_tick = m_view_type = 0;
Refresh();
}
void CClock::Refresh()
{
memset(&led, 0, sizeof(led));
if(CClockApp::clockApp->GetCurrentFunc() == this){//正常工作模式
if(m_view_type == 3 && m_lunar_mon & 0xf0){
//闰月
led.lunMon1 = led.lunMon2 = 0x7f;
CClockApp::clockApp->Flash(&led);//让月份跳动
}
if(!m_view_type){
led.dot = 1;
CClockApp::clockApp->Flash(&led);//让豆豆跳动
}
#if SUPPORT_LUNAR_HOLIDAY
if((m_view_type == 1 && !m_lunar_holiday_wait) ||//显示日期时,今日就是某节气
m_view_type == 3){ //显示农历时
if(m_lunar_holiday > 9)led.lunarholiday1 = DataLed[m_lunar_holiday / 10];
led.lunarholiday2 = DataLed[m_lunar_holiday % 10];
}
#endif
if(m_view_type <= 1){
//月
if(m_month > 9) led.mon1 = DataLed[1];
led.mon2 = DataLed[m_month % 10];
//日
if(m_day > 9) led.day1 = DataLed[m_day / 10];
led.day2 = DataLed[m_day % 10];
//星期
if(m_week_day) led.week = DataLed[m_week_day];
else led.week = 127;
}
if(m_view_type == 1){//显示年月日
//年
led.year1 = DataLed[2];
led.year2 = DataLed[0];
led.year3 = DataLed[m_year / 10];
led.year4 = DataLed[m_year % 10];
//整点报时
if(m_hour_ring) led.hourring = 0x7f;
#if SUPPORT_LUNAR
}else if(m_view_type == 3){//显示农历
#if SUPPORT_LUNAR_HOLIDAY
if(m_lunar_holiday_wait){
if(m_lunar_holiday_wait > 9)
led.lunHolidayWait1 = DataLed[1];
led.lunHolidayWait2 = DataLed[m_lunar_holiday_wait % 10];
}
#endif
//月
if((m_lunar_mon & 0x0f) > 9) led.lunMon1 = DataLed[1];
led.lunMon2 = DataLed[(m_lunar_mon & 0x0f) % 10];
//日
if(m_lunar_day > 9) led.lunDay1 = DataLed[m_lunar_day / 10];
led.lunDay2 = DataLed[m_lunar_day % 10];
#endif
}else if(!m_view_type){//显示时间
//时
if(m_hour > 9) led.hour1 = DataLed[m_hour / 10];
led.hour2 = DataLed[m_hour % 10];
//分
led.min1 = DataLed[m_min / 10];
led.min2 = DataLed[m_min % 10];
//秒
led.sec1 = DataLed[m_sec / 10];
led.sec2 = DataLed[m_sec % 10];
//豆豆
led.dot = 1;
}
CClockApp::clockApp->Display(led);
}
}
void CClock::AlarmbuffToLedbuff(LEDBUFF &led, const ALARMBUFF &alarm, UCHAR index)
{
led.mon1 = 127 - 64; //'O'
if(alarm.enable){
led.mon2 = 127 - 64 - 8; //'n'
}else{
led.mon2 = led.day1 = 127 - 2 - 4 - 8;//'F'
}
led.week = DataLed[index+1];
//时
if(alarm.hour > 9) led.hour1 = DataLed[alarm.hour / 10];
led.hour2 = DataLed[alarm.hour % 10];
//分
led.min1 = DataLed[alarm.min / 10];
led.min2 = DataLed[alarm.min % 10];
//铃声
UCHAR ring = alarm.ring+1;
if(ring > 9) led.ring1 = DataLed[ring / 10];
led.ring2 = DataLed[ring % 10];
//星期标志
led.weeksel = alarm.week;
}
void CClock::GetAlarm(ALARMBUFF &alarm, UCHAR index)
{
if(index < ALARM_MAX){
alarm = m_alarmBuff[index];
}
}
void CClock::SetAlarm(ALARMBUFF &alarm, UCHAR index)
{
if(index < ALARM_MAX){
m_alarmBuff[index] = alarm;
//保存设置
CEEprom::SaveConfig(m_alarmBuff, m_hour_ring);
}
}
void CClock::SetSecondZero()
{
if(m_sec < 30){
m_sec = 0;
m_tick = 0;
Refresh();
}else{
m_tick = 0x0f;
m_sec = 59;
OnTick();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -