Si-Labs EFM32 Back Up domain and BUrtc demo.
Dependencies: EFM32_BUrtc EFM32_CapSenseSlider EFM32_SegmentLCD mbed
main.cpp
- Committer:
- star297
- Date:
- 2016-05-16
- Revision:
- 0:dc30d5f06316
File content as of revision 0:dc30d5f06316:
#include "mbed.h"
#include "EFM32_SegmentLCD.h"
#include "EFM32_CapSenseSlider.h"
#include "BUrtc.h"
silabs::EFM32_SegmentLCD segmentDisplay;
silabs::EFM32_CapSenseSlider capSlider;
InterruptIn MinMonth(SW0);
InterruptIn HourDate(SW1);
DigitalOut led1(LED1);
DigitalOut led2(LED2);
char timebuff[20], lcdTime[8];
int initialized = false;
int month,date,lcdDate,slider;
struct tm t;
void displayRefresh(),timeSet(),dateSet();
int main()
{
// set up BU domain and BUrtc if not started, else restore system RTC from BUrtc
BUrtcInit();
// set the reset time
t.tm_sec = 0; // 0-59
t.tm_min = 0; // 0-59
t.tm_hour = 0; // 0-23
t.tm_mday = 17; // 1-31
t.tm_mon = 4; // 0-11
t.tm_year = 116; // years since 1900
// time setting button interrupts
HourDate.fall(&timeSet);
MinMonth.fall(&timeSet);
capSlider.start();
capSlider.attach_slide(-1, dateSet);
while(1) {
// Sleep while waiting for interrupt
EMU_EnterEM2(true);
// Run display update code on wake up
displayRefresh();
}
}
void displayRefresh()
{
if (!initialized) {
segmentDisplay.Symbol(LCD_SYMBOL_COL3,true);
segmentDisplay.Symbol(LCD_SYMBOL_COL5,true);
SegmentLCD_Symbol(LCD_SYMBOL_DP10, true);
// set time if RTC is reset
if(time(NULL)<10) {
RTCset(mktime(&t));
}
initialized = true;
}
time_t seconds = time(NULL);
strftime(timebuff, 2,"%d", localtime(&seconds));
date = atoi(timebuff);
strftime(timebuff, 2,"%m", localtime(&seconds));
month = atoi(timebuff);
lcdDate = ((date %31)* 100 + (month % 12));
strftime(lcdTime,8,"%H%M%S", localtime(&seconds));
SegmentLCD_Write(lcdTime);
segmentDisplay.Number(lcdDate);
segmentDisplay.Symbol(LCD_SYMBOL_EFM32, seconds & 0x1);
led1=0;led2=0;
}
void dateSet() {
// set date by tapping slider, slow and fast settings
slider = capSlider.get_position();
led2=!led2;
time_t seconds = time(NULL);
seconds=seconds + (86400 * (slider/10));
RTCset(seconds);
}
void timeSet()
{
// set hours and minutes with buttons, set date first, can't go backwards
led1=!led1;
time_t seconds = time(NULL);
if(MinMonth){seconds=seconds+60;}
if(HourDate){seconds=seconds+3600;}
RTCset(seconds);
}