00001
00002
00003 #include "routix/time.h"
00004 #include "routix/8254.h"
00005 #include <routix/kstdio.h>
00006
00007 #ifndef __SYSTEM
00008 #include "routix/system.h"
00009 #endif
00010
00011
00012 static char dias_por_mes[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
00013 enum { ENERO, FEBRERO, MARZO, ABRIL, MAYO, JUNIO, JULIO, AGOSTO, SEPTIEMBRE, OCTUBRE, NOVIEMBRE, DICIEMBRE };
00014 static time_t reloj=0;
00015
00016
00017 byte get_value(word registro)
00018 {
00019 outportb_p(CMOS_C, registro);
00020 return(inportb_p(CMOS_V));
00021 }
00022
00023 void set_value(word registro, byte valor)
00024 {
00025 outportb_p(CMOS_C, registro);
00026 outportb_p(CMOS_V, valor);
00027 }
00028
00029
00030 void init_time()
00031 {
00032
00033 struct tm tm;
00034
00035 int year = get_year();
00036 year = ( year >= 1970 ) ? 1900+year : 2000+year;
00037 year -= 1900;
00038
00039 tm.tm_sec = get_sec();
00040 tm.tm_min = get_min();
00041 tm.tm_hour = get_hour();
00042 tm.tm_mday = get_dayofmonth();
00043 tm.tm_mon = get_month() - 1;
00044 tm.tm_year = year ;
00045 tm.tm_wday = get_dayofweek();
00046 tm.tm_yday = day_of_year(tm.tm_year, tm.tm_mon, tm.tm_mday);
00047 tm.tm_isdst = 0;
00048
00049
00050
00051 reloj = mktime( &tm );
00052 kprintf("Seteando reloj: %d\n",reloj);
00053 }
00054
00055
00056
00057 inline void actualizar_reloj()
00058 {
00059 reloj++;
00060 }
00061
00062
00063 struct tm *localtime(const time_t *clock)
00064 {
00065 static struct tm tm;
00066 time_t tod;
00067
00068
00069 if ( ! clock ) {
00070 kprintf("localtime: null tod, seteando tod=reloj (%d ticks)\n",reloj);
00071 tod = reloj;
00072 }
00073
00074
00075 else {
00076 kprintf("localtime: tod especificado, tod=*clock (%d ticks)\n",*clock);
00077 tod = *clock;
00078 }
00079
00080
00081 for ( tm.tm_year=ANIO_INICIO; (tod -= SEC_PER_YEAR(1900+tm.tm_year)) > 0; tm.tm_year++ ) ;
00082
00083 tod += SEC_PER_YEAR(1900+tm.tm_year);
00084
00085
00086 for ( tm.tm_mon=MES_INICIO; (tod -= SEC_PER_MONTH(tm.tm_year,tm.tm_mon)) > 0; tm.tm_mon++ ) ;
00087
00088 tod += SEC_PER_MONTH(tm.tm_year,tm.tm_mon);
00089
00090
00091 tm.tm_mday = (time_t) (tod / SEC_PER_DAY);
00092 tod -= (tm.tm_mday * SEC_PER_DAY);
00093 tm.tm_mday++;
00094
00095 tm.tm_hour = (time_t) (tod / SEC_PER_HOUR);
00096 tod -= (tm.tm_hour * SEC_PER_HOUR);
00097
00098 tm.tm_min = (time_t) (tod / SEC_PER_MIN);
00099 tm.tm_sec = tod - (tm.tm_min * SEC_PER_MIN);
00100
00101 return &tm;
00102 }
00103
00104
00105
00106 int day_of_year(int anio, int mes, int dia)
00107 {
00108 int tmp;
00109 int dias=dia;
00110
00111
00112 for ( tmp=0; tmp < mes; tmp++)
00113 dias += dias_por_mes[tmp];
00114
00115
00116 if ( (mes > FEBRERO) && es_bisiesto(1900+anio) ) dias++;
00117
00118 return dias;
00119 }
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161 time_t mktime(struct tm *tm)
00162 {
00163 int tmp;
00164 time_t tod=0;
00165
00166 for ( tmp=ANIO_INICIO; tmp < tm->tm_year ; tmp++ )
00167 tod += SEC_PER_YEAR(1900+tmp);
00168
00169 for ( tmp=MES_INICIO; tmp < tm->tm_mon ; tmp++ )
00170 tod += SEC_PER_MONTH(tm->tm_year,tmp);
00171
00172 tod += (tm->tm_mday - 1) * SEC_PER_DAY + tm->tm_hour * SEC_PER_HOUR + tm->tm_min * SEC_PER_MIN + tm->tm_sec;
00173
00174 return tod;
00175 }
00176
00177
00178
00179
00180
00181
00182
00183 int es_bisiesto(int year)
00184 {
00185 if ( (!(year%4)) && (year%100) ) { return 1; }
00186 else if ( !(year%400) ) { return 1; }
00187 else return 0;
00188 }
00189
00190 char *dias[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
00191 char *mes[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
00192
00193
00194 char *asctime(const struct tm *tm)
00195 {
00196
00197 static char string[26];
00198
00199
00200 kprintf("%s %s %d %d:%d:%d %d\n", dias[0], mes[tm->tm_mon], tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, (1900 + tm->tm_year) );
00201
00202 string[26]='\0';
00203
00204 return string;
00205 }
00206
00207
00208