Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:24:22

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /**
0004  * @file
0005  *
0006  * @ingroup RTEMSImplClassicClock
0007  *
0008  * @brief This source file contains the implementation of
0009  *   _TOD_To_seconds().
0010  */
0011 
0012 /*
0013  *  COPYRIGHT (c) 1989-2007.
0014  *  On-Line Applications Research Corporation (OAR).
0015  *
0016  * Redistribution and use in source and binary forms, with or without
0017  * modification, are permitted provided that the following conditions
0018  * are met:
0019  * 1. Redistributions of source code must retain the above copyright
0020  *    notice, this list of conditions and the following disclaimer.
0021  * 2. Redistributions in binary form must reproduce the above copyright
0022  *    notice, this list of conditions and the following disclaimer in the
0023  *    documentation and/or other materials provided with the distribution.
0024  *
0025  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0026  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0027  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0028  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0029  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0030  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0031  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0032  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0033  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0034  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0035  * POSSIBILITY OF SUCH DAMAGE.
0036  */
0037 
0038 #ifdef HAVE_CONFIG_H
0039 #include "config.h"
0040 #endif
0041 
0042 #include <rtems/rtems/clockimpl.h>
0043 #include <rtems/score/todimpl.h>
0044 
0045 const uint16_t _TOD_Days_to_date[ 2 ][ 13 ] = {
0046   { 0, 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 },
0047   { 0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }
0048 };
0049 
0050 /*
0051  *  The following array contains the number of days in the years
0052  *  since the last leap year.  The index should be 0 for leap
0053  *  years, and the number of years since the beginning of a leap
0054  *  year otherwise.
0055  */
0056 const uint16_t   _TOD_Days_since_last_leap_year[4] = { 0, 366, 731, 1096 };
0057 
0058 
0059 Watchdog_Interval   _TOD_To_seconds(
0060   const rtems_time_of_day *the_tod
0061 )
0062 {
0063   uint32_t time;
0064   size_t   leap_year_index;
0065 
0066   time = the_tod->day - 1;
0067 
0068   leap_year_index = _TOD_Get_leap_year_index( the_tod->year );
0069   time += _TOD_Days_to_date[ leap_year_index ][ the_tod->month ];
0070 
0071   time += ( (the_tod->year - TOD_BASE_YEAR) / 4 ) *
0072             ( (TOD_DAYS_PER_YEAR * 4) + 1);
0073 
0074   time += _TOD_Days_since_last_leap_year[ the_tod->year % 4 ];
0075 
0076   time *= TOD_SECONDS_PER_DAY;
0077 
0078   time += ((the_tod->hour * TOD_MINUTES_PER_HOUR) + the_tod->minute)
0079              * TOD_SECONDS_PER_MINUTE;
0080 
0081   time += the_tod->second;
0082   time += TOD_SECONDS_1970_THROUGH_1988;
0083 
0084   return( time );
0085 }