1 #ifndef CYGONCE_IO_WALLCLOCK_INL
2 #define CYGONCE_IO_WALLCLOCK_INL
4 //==========================================================================
8 // Wallclock internal helper functions
10 //==========================================================================
11 //####ECOSGPLCOPYRIGHTBEGIN####
12 // -------------------------------------------
13 // This file is part of eCos, the Embedded Configurable Operating System.
14 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
16 // eCos is free software; you can redistribute it and/or modify it under
17 // the terms of the GNU General Public License as published by the Free
18 // Software Foundation; either version 2 or (at your option) any later version.
20 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
21 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
22 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
25 // You should have received a copy of the GNU General Public License along
26 // with eCos; if not, write to the Free Software Foundation, Inc.,
27 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
29 // As a special exception, if other files instantiate templates or use macros
30 // or inline functions from this file, or you compile this file and link it
31 // with other works to produce a work based on this file, this file does not
32 // by itself cause the resulting work to be covered by the GNU General Public
33 // License. However the source code for this file must still be made available
34 // in accordance with section (3) of the GNU General Public License.
36 // This exception does not invalidate any other reasons why a work based on
37 // this file might be covered by the GNU General Public License.
39 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
40 // at http://sources.redhat.com/ecos/ecos-license/
41 // -------------------------------------------
42 //####ECOSGPLCOPYRIGHTEND####
43 //==========================================================================
44 //#####DESCRIPTIONBEGIN####
47 // Contributors: jskov
49 // Purpose: Wall Clock internal helper functions
51 //####DESCRIPTIONEND####
53 //==========================================================================
55 #include <cyg/infra/cyg_type.h>
56 #include <cyg/infra/cyg_ass.h> // assertions
58 // -------------------------------------------------------------------------
59 // Some helper functions
61 #define is_leap(_y_) (((0==(_y_)%4 && 0!=(_y_)%100) || 0==(_y_)%400) ? 1 : 0)
62 #define year_days(_y_) (is_leap(_y_) ? 366 : 365)
64 static cyg_int32 days_per_month[2][12] = {
65 {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
66 {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
70 #define time_t cyg_uint32
74 _simple_mktime(cyg_uint32 year, cyg_uint32 mon,
75 cyg_uint32 day, cyg_uint32 hour,
76 cyg_uint32 min, cyg_uint32 sec)
79 cyg_uint32 y, m, days;
81 CYG_ASSERT(year <= 3124, "Year is unreasonably large");
82 CYG_ASSERT(mon <= 12, "Month is invalid");
83 CYG_ASSERT(day <= 31, "Day is invalid");
84 CYG_ASSERT(hour <= 23, "Hour is invalid");
85 CYG_ASSERT(min <= 59, "Minutes is invalid");
86 CYG_ASSERT(sec <= 61, "Seconds is invalid");
88 // Number of days due to years
90 for (y = 1970; y < year; y++)
94 for (m = 0; m < mon-1; m++)
95 days += days_per_month[is_leap(year)][m];
99 // Add hours, minutes, and seconds
100 secs = ((days * 24 + hour) * 60 + min) * 60 + sec;
105 #ifdef CYGSEM_WALLCLOCK_SET_GET_MODE
109 _simple_mkdate(time_t time,
110 cyg_uint32* year, cyg_uint32* mon,
111 cyg_uint32* day, cyg_uint32* hour,
112 cyg_uint32* min, cyg_uint32* sec)
114 cyg_int32 days, hms, y, m, *dpm;
116 days = (cyg_int32) (time / (24*60*60));
117 hms = (cyg_int32) (time % (24*60*60));
119 // Nothing fancy about the time - no leap year magic involved
121 *min = (hms % (60*60)) / 60;
122 *hour = hms / (60*60);
125 for (y = 1970; days >= year_days(y); y++)
126 days -= year_days(y);
128 dpm = &days_per_month[is_leap(y)][0];
131 for (m = 0; days >= dpm[m]; m++)
141 //-----------------------------------------------------------------------------
143 #define TO_BCD(x) ((((x)/10)<<4) | ((x)%10))
144 #define TO_DEC(x) ((((x)>>4)*10) + ((x)&0xf))
146 #endif // ifndef CYGONCE_DEVS_WALLCLOCK_INL