Si-Labs EFM32 Back Up domain and BUrtc demo.

Dependencies:   EFM32_BUrtc EFM32_CapSenseSlider EFM32_SegmentLCD mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 
00002 #include "mbed.h"
00003 #include "EFM32_SegmentLCD.h"
00004 #include "EFM32_CapSenseSlider.h"
00005 #include "BUrtc.h"
00006 
00007 silabs::EFM32_SegmentLCD segmentDisplay;
00008 silabs::EFM32_CapSenseSlider capSlider;
00009 
00010 InterruptIn MinMonth(SW0);
00011 InterruptIn HourDate(SW1);
00012 
00013 DigitalOut led1(LED1);
00014 DigitalOut led2(LED2);
00015 
00016 char timebuff[20], lcdTime[8];
00017 int initialized = false;
00018 int month,date,lcdDate,slider;
00019 
00020 struct tm t;
00021 
00022 void displayRefresh(),timeSet(),dateSet();
00023 
00024 int main()
00025 {
00026     // set up BU domain and BUrtc if not started, else restore system RTC from BUrtc
00027     BUrtcInit();
00028     
00029     // set the reset time
00030     t.tm_sec    = 0;    // 0-59
00031     t.tm_min    = 0;    // 0-59
00032     t.tm_hour   = 0;   // 0-23
00033     t.tm_mday   = 17;   // 1-31
00034     t.tm_mon    = 4;    // 0-11
00035     t.tm_year   = 116;  // years since 1900
00036     
00037     // time setting button interrupts
00038     HourDate.fall(&timeSet);
00039     MinMonth.fall(&timeSet);
00040     capSlider.start();
00041     capSlider.attach_slide(-1, dateSet);
00042 
00043     while(1) {
00044 
00045         // Sleep while waiting for interrupt
00046         EMU_EnterEM2(true);
00047         // Run display update code on wake up
00048         displayRefresh();
00049     }
00050 }
00051 
00052 void displayRefresh()
00053 {    
00054      if (!initialized) {
00055             segmentDisplay.Symbol(LCD_SYMBOL_COL3,true);
00056             segmentDisplay.Symbol(LCD_SYMBOL_COL5,true);
00057             SegmentLCD_Symbol(LCD_SYMBOL_DP10, true);
00058             // set time if RTC is reset
00059             if(time(NULL)<10) {
00060                 RTCset(mktime(&t));
00061             }
00062             initialized = true;
00063         }
00064         time_t seconds = time(NULL);
00065         strftime(timebuff, 2,"%d", localtime(&seconds));
00066         date = atoi(timebuff);
00067         strftime(timebuff, 2,"%m", localtime(&seconds));
00068         month = atoi(timebuff);
00069         lcdDate = ((date %31)* 100 + (month % 12));
00070         strftime(lcdTime,8,"%H%M%S", localtime(&seconds));
00071 
00072         SegmentLCD_Write(lcdTime);
00073         segmentDisplay.Number(lcdDate);
00074         segmentDisplay.Symbol(LCD_SYMBOL_EFM32, seconds & 0x1);
00075         led1=0;led2=0;
00076 }
00077 
00078 void dateSet() {
00079     
00080     // set date by tapping slider, slow and fast settings    
00081     slider = capSlider.get_position();
00082     led2=!led2;    
00083     time_t seconds = time(NULL);  
00084     seconds=seconds + (86400 * (slider/10));    
00085     RTCset(seconds);    
00086 }
00087 
00088 void timeSet()
00089 {
00090     // set hours and minutes with buttons, set date first, can't go backwards
00091     led1=!led1;
00092     time_t seconds = time(NULL);  
00093     if(MinMonth){seconds=seconds+60;}
00094     if(HourDate){seconds=seconds+3600;}     
00095     RTCset(seconds);    
00096 }
00097