]> rtime.felk.cvut.cz Git - frescor/fosa.git/blobdiff - src_partikle/fosa_clocks_and_timers.c
Updating header text in FOSA files for the incoming final project
[frescor/fosa.git] / src_partikle / fosa_clocks_and_timers.c
index bfa0e70176de3f375994006d86889298979afccf..fb49590414804443cf796e01f47b9d054739ebc9 100644 (file)
-/** fosa_clocks_and_timers.c
- *
- * < description >
- * < author >
- * < date >
- */
+// -----------------------------------------------------------------------
+//  Copyright (C) 2006 - 2009 FRESCOR consortium partners:
+//
+//    Universidad de Cantabria,              SPAIN
+//    University of York,                    UK
+//    Scuola Superiore Sant'Anna,            ITALY
+//    Kaiserslautern University,             GERMANY
+//    Univ. Politécnica  Valencia,           SPAIN
+//    Czech Technical University in Prague,  CZECH REPUBLIC
+//    ENEA                                   SWEDEN
+//    Thales Communication S.A.              FRANCE
+//    Visual Tools S.A.                      SPAIN
+//    Rapita Systems Ltd                     UK
+//    Evidence                               ITALY
+//
+//    See http://www.frescor.org for a link to partners' websites
+//
+//           FRESCOR project (FP6/2005/IST/5-034026) is funded
+//        in part by the European Union Sixth Framework Programme
+//        The European Union is not liable of any use that may be
+//        made of this code.
+//
+//
+//  based on previous work (FSF) done in the FIRST project
+//
+//   Copyright (C) 2005  Mälardalen University, SWEDEN
+//                       Scuola Superiore S.Anna, ITALY
+//                       Universidad de Cantabria, SPAIN
+//                       University of York, UK
+//
+//   FSF API web pages: http://marte.unican.es/fsf/docs
+//                      http://shark.sssup.it/contrib/first/docs/
+//
+//   This file is part of FOSA (Frsh Operating System Adaption)
+//
+//  FOSA is free software; you can redistribute it and/or modify it
+//  under terms of the GNU General Public License as published by the
+//  Free Software Foundation; either version 2, or (at your option) any
+//  later version.  FOSA is distributed in the hope that it will be
+//  useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+//  of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+//  General Public License for more details. You should have received a
+//  copy of the GNU General Public License along with FOSA; see file
+//  COPYING. If not, write to the Free Software Foundation, 675 Mass Ave,
+//  Cambridge, MA 02139, USA.
+//
+//  As a special exception, including FOSA header files in a file,
+//  instantiating FOSA generics or templates, or linking other files
+//  with FOSA objects to produce an executable application, does not
+//  by itself cause the resulting executable application to be covered
+//  by the GNU General Public License. This exception does not
+//  however invalidate any other reasons why the executable file might be
+//  covered by the GNU Public License.
+// -----------------------------------------------------------------------
+//==============================================
+//  ********  ******    ********  **********
+//  **///// /**    **  **//////  /**     /**
+//  **      /**    ** /**        /**     /**
+//  ******* /**    ** /********* /**********
+//  **////  /**    ** ////////** /**//////**
+//  **      /**    **        /** /**     /**
+//  **      /**    **  ********  /**     /**
+//  //       /******/  ////////   //      // 
+//
+// FOSA(Frescor Operating System Adaptation layer)
+//================================================
 
 #include <fosa_clocks_and_timers.h>
+#include <fosa_time.h>
+#include <stdlib.h>
 
 /*************************
  * Timing: Clocks
  *************************/
-int fosa_clock_get_time(fosa_clock_id_t clockid, struct timespec *current_time)
-{
-       if (clock_gettime (clockid, current_time))
-               return FOSA_EINVAL;
+int fosa_clock_get_time(fosa_clock_id_t clockid, fosa_abs_time_t *current_time)
+{      
+       int err;
+       struct timespec now;
+       
+       err = clock_gettime (clockid, &now);
+       *current_time = fosa_timespec_to_abs_time(now);
        
        return 0;
 }
 
 
-
-int fosa_thread_get_cputime_clock(frsh_thread_id_t tid, fosa_clock_id_t *clockid)
+int fosa_thread_get_cputime_clock(fosa_thread_id_t tid, fosa_clock_id_t *clockid)
 {
-//     if (tid == thread_invalid) 
-//             return FOSA_EINVAL;
-       
-       *clockid = CLOCK_THREAD_CPUTIME_ID;
-       return 0;
+  return pthread_getcpuclockid (tid, clockid);
 }
 
+
+
+
 /*************************
  * Timing: Timers
  *************************/
 int fosa_timer_create
-                (fosa_clock_id_t clockid, frsh_signal_t signal, frsh_signal_info_t info,
-                 fosa_timer_id_t *timerid);
+    (fosa_clock_id_t clockid, fosa_signal_t signal, fosa_signal_info_t info,
+     fosa_timer_id_t *timerid)
+ {
+       struct sigevent se;
+       struct sigaction act, oact;
+
+       sigaction (signal, NULL, &oact);
+       act = oact;
+       act.sa_flags = SA_SIGINFO;      // accept signal queuing
+       sigaction (signal, &act, NULL);
+       
+       se.sigev_notify = SIGEV_SIGNAL;
+       se.sigev_signo = signal;
+       
+       se.sigev_value.sival_int = info.sival_int;
+       se.sigev_value.sival_ptr = info.sival_ptr;
+
+       return timer_create (clockid, &se, timerid);
+}
+
+
+int fosa_timer_create_with_receiver
+    (fosa_clock_id_t clockid, fosa_signal_t signal, fosa_signal_info_t info,
+     fosa_timer_id_t *timerid, fosa_thread_id_t receiver)
+{
+  return fosa_timer_create (clockid, signal, info, timerid);
+}
 
 int fosa_timer_delete(fosa_timer_id_t timerid)
 {
-       if (timer_delete (timerid))
+       return timer_delete (timerid);
+}
+
+
+int fosa_rel_timer_arm (fosa_timer_id_t timerid, const fosa_rel_time_t *value)
+{
+       struct itimerspec tvalue; 
+       
+       tvalue.it_value = fosa_rel_time_to_timespec(*value);
+       tvalue.it_interval = (struct timespec) {0,0};
+       
+       if (timer_settime (timerid, 0, &tvalue, NULL))
                return FOSA_EINVAL;
+       
        return 0;
 }
 
-
-int fosa_timer_arm
-               (fosa_timer_id_t timerid, bool abstime,
-                const struct timespec *value)
+int fosa_abs_timer_arm (fosa_timer_id_t timerid, const fosa_abs_time_t *value)
 {
-       struct itimerspec value = 
-       {
-               .it_value = (struct timespec) *value,
-               .it_interval = 0,
-       }
+       struct itimerspec tvalue; 
        
-       if (timer_settime (timerid, abstime, &value, NULL))
-               return EINVAL;
+       tvalue.it_value = fosa_abs_time_to_timespec(*value);
+       tvalue.it_interval = (struct timespec) {0,0};
+       
+       if (timer_settime (timerid, TIMER_ABSTIME, &tvalue, NULL))
+               return FOSA_EINVAL;
        
        return 0;
 }
 
 
-// TODO: CPU-clock ???
 int fosa_timer_get_remaining_time
-               (fosa_timer_id_t timerid, struct timespec *remaining_time)
+               (fosa_timer_id_t timerid, fosa_rel_time_t *remaining_time)
 {
        struct itimerspec value;
        
        if (timer_gettime (timerid, &value))
-               return EINVAL;
+               return FOSA_EINVAL;
        
-       *remaining_time = value.it_value;
+       *remaining_time = fosa_timespec_to_rel_time (value.it_value);
        return 0;
 }
 
-int fosa_timer_disarm(fosa_timer_id_t timerid, struct timespec
-               *remaining_time)
+
+int fosa_timer_disarm (fosa_timer_id_t timerid, fosa_rel_time_t *remaining_time)
 {
        struct itimerspec null_timer, old;
        
        // NULL timer -> disarm
-       value = (struct itimerspec) {
+       null_timer = (struct itimerspec) {
                .it_value = {0, 0},
-               .it_interval = 0,
-       }
+               .it_interval = {0, 0},
+       };
        
        if (timer_settime (timerid, 0, &null_timer, &old))
-               return EINVAL;
+               return FOSA_EINVAL;
        
        if (remaining_time)
-               *remaining_time = old.it_value; 
+               *remaining_time = fosa_timespec_to_rel_time (old.it_value);
                
        return 0;
 }
+