Export (0) Print
Expand All
This topic has not yet been rated - Rate this topic

OEMSetRealTime (Compact 2013)

3/26/2014

This function sets the real-time clock (RTC) to local time.


BOOL OEMSetRealTime( 
  LPSYSTEMTIME lpst 
);
lpst

[in] Long pointer to the buffer containing the current time in SYSTEMTIME format.

TRUE indicates success. FALSE indicates failure.

This function must be reentrant and, thus, must protect the hardware from being accessed multiple times. The kernel calls this function.

If your hardware provides two digits to hold the value for the year, you must add additional code to avoid issues similar to the year 2000 issue.

For more information, see Rtc.c in the %_WINCEROOT%\platform\common\src\x86\common\rtc directory.

Ee478512.note(en-us,WinEmbedded.80).gifNote:
In Windows Embedded Compact, the system behaves as if the real-time clock were maintained in Universal Coordinated Time (UTC). However, for backward compatibility, the underlying hardware clock is maintained in local time.

The following code example shows how to make this function re-entrant and use two digits to hold the value for the year.

Ee478512.note(en-us,WinEmbedded.80).gifImportant:
For readability, the following code example does not contain security checking or error handling. Do not use the following code in a production environment.
BOOL OEMSetRealTime( __in LPSYSTEMTIME lpst )
{
    BOOL RetVal;

    EnterCriticalSection(&RTC_critsect);
    RetVal = Bare_SetRealTime(lpst);
    LeaveCriticalSection(&RTC_critsect);
    
    return RetVal;
}

BOOL Bare_SetRealTime( __in const SYSTEMTIME* const lpst )
{
    BYTE cStatusRegA, cStatusRegB, Year;

     Year = lpst->wYear % 100;

    // Read the update in progress bit, wait for it to be clear.  
    // This bit will be set once per second for about 
    // 2us (Undoc. PC, page 897)
    do 
    {
        cStatusRegA = CMOS_Read( RTC_STATUS_A);
    } 
    while ( cStatusRegA & RTC_SRA_UIP );

    // Disable updates while we change the values
    cStatusRegB = CMOS_Read( RTC_STATUS_B );
    cStatusRegB |= RTC_SRB_UPDT;
    CMOS_Write( RTC_STATUS_B, cStatusRegB );
    if ( !(cStatusRegB & RTC_SRB_DM) ) 
    {
        // BCD Mode
        CMOS_Write( RTC_YEAR,     (BYTE)(CREATE_BCD(Year))); 
        CMOS_Write( RTC_MONTH,    (BYTE)(CREATE_BCD(lpst->wMonth))); 
        // RTC clock stores DO_WEEK 1-7, SYSTEMTIME uses 0-6
        CMOS_Write( RTC_DO_WEEK,  (BYTE)(CREATE_BCD(lpst-wDayOfWeek+1))); 
        CMOS_Write( RTC_DO_MONTH, (BYTE)(CREATE_BCD(lpst->wDay))); 
        CMOS_Write( RTC_HOUR,     (BYTE)(CREATE_BCD(lpst->wHour))); 
        CMOS_Write( RTC_MINUTE,   (BYTE)(CREATE_BCD(lpst->wMinute))); 
        CMOS_Write( RTC_SECOND,   (BYTE)(CREATE_BCD(lpst->wSecond))); 
        // Not sure how we can do lpst->wMilliseconds;
    } 
    else 
    {
        // Binary mode
        CMOS_Write( RTC_YEAR, (UCHAR)Year); 
        CMOS_Write( RTC_MONTH, (UCHAR)lpst->wMonth); 
        // RTC clock stores DO_WEEK 1-7, SYSTEMTIME uses 0-6
        CMOS_Write( RTC_DO_WEEK, (UCHAR)(lpst->wDayOfWeek+1)); 
        CMOS_Write( RTC_DO_MONTH, (UCHAR)lpst->wDay); 
        CMOS_Write( RTC_HOUR, (UCHAR)lpst->wHour); 
        CMOS_Write( RTC_MINUTE, (UCHAR)lpst->wMinute); 
        CMOS_Write( RTC_SECOND, (UCHAR)lpst->wSecond); 
    }
    // Reenable updates
    cStatusRegB &= ~RTC_SRB_UPDT;
    CMOS_Write( RTC_STATUS_B, cStatusRegB );

    return TRUE;
}

Header

nkintr.h

Library

OEMMain.lib or OEMMain_StaticKITL.lib

Did you find this helpful?
(1500 characters remaining)
Thank you for your feedback
Show:
© 2014 Microsoft. All rights reserved.