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);    
}