This is the mail archive of the ecos-patches@sources.redhat.com mailing list for the eCos project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Synthetic wallclock set_get mode


Attached is a patch wich adds support for set_get mode to synthetic wallclock driver.

savin
Index: current/ChangeLog
===================================================================
RCS file: /cvs/ecos/ecos/packages/devs/wallclock/synth/current/ChangeLog,v
retrieving revision 1.1
diff -u -5 -r1.1 ChangeLog
--- current/ChangeLog	5 Oct 2003 13:49:01 -0000	1.1
+++ current/ChangeLog	6 Oct 2003 10:37:05 -0000
@@ -1,5 +1,11 @@
+2003-10-06  Savin Zlobec <savin@elatec.si>
+
+    * cdl/wallclock_synth.cdl:
+    * src/wallclock_synth.cxx:
+    Implemented set_get mode.
+
 2003-10-02  Savin Zlobec <savin@elatec.si> 
 
     * cdl/wallclock_synth.cdl:
     * src/wallclock_synth.cxx:
     Created wallclock driver for synthetic target.
Index: current/cdl/wallclock_synth.cdl
===================================================================
RCS file: /cvs/ecos/ecos/packages/devs/wallclock/synth/current/cdl/wallclock_synth.cdl,v
retrieving revision 1.1
diff -u -5 -r1.1 wallclock_synth.cdl
--- current/cdl/wallclock_synth.cdl	5 Oct 2003 13:49:02 -0000	1.1
+++ current/cdl/wallclock_synth.cdl	6 Oct 2003 10:37:05 -0000
@@ -55,19 +55,31 @@
     display       "Synthetic wallclock driver"
     requires      CYGPKG_HAL_SYNTH 
     hardware
     compile       wallclock_synth.cxx
     implements    CYGINT_WALLCLOCK_HW_IMPLEMENTATIONS
+    implements    CYGINT_WALLCLOCK_SET_GET_MODE_SUPPORTED
     active_if     CYGIMP_WALLCLOCK_HARDWARE
 
     cdl_option CYGIMP_WALLCLOCK_HARDWARE {
         parent    CYGPKG_IO_WALLCLOCK_IMPLEMENTATION
         display       "Hardware wallclock"
         default_value 1
         implements    CYGINT_WALLCLOCK_IMPLEMENTATIONS
     }
 
+    cdl_option CYGDAT_DEVS_WALLCLOCK_SYNTH_FILENAME {
+        display       "Name of file wich holds system-eCos wallclock offset"
+        flavor        data
+        default_value { "\"synth.wallclock\"" }
+        active_if     CYGSEM_WALLCLOCK_SET_GET_MODE
+        description   "
+            This is the name of the file which holds the difference
+            between system and eCos wallclock. It is read at initialization 
+            and written to each time the wallclock it set."
+    }
+    
     cdl_component CYGPKG_DEVS_WALLCLOCK_SYNTH_OPTIONS {
         display "Synthetic wallclock build options"
         flavor  none
         description   "
 	        Package specific build options including control over
Index: current/src/wallclock_synth.cxx
===================================================================
RCS file: /cvs/ecos/ecos/packages/devs/wallclock/synth/current/src/wallclock_synth.cxx,v
retrieving revision 1.1
diff -u -5 -r1.1 wallclock_synth.cxx
--- current/src/wallclock_synth.cxx	5 Oct 2003 13:49:02 -0000	1.1
+++ current/src/wallclock_synth.cxx	6 Oct 2003 10:37:05 -0000
@@ -48,48 +48,98 @@
 //####DESCRIPTIONEND####
 //
 //==========================================================================
 
 #include <pkgconf/wallclock.h>           
+#include <pkgconf/devs_wallclock_synth.h>
 
 #include <cyg/hal/hal_io.h>               
 #include <cyg/hal/hal_arch.h>
 
 #include <cyg/infra/cyg_type.h>          
 #include <cyg/infra/diag.h>            
 
 #include <cyg/io/wallclock.hxx>          
 
 //-----------------------------------------------------------------------------
+
+#ifdef CYGSEM_WALLCLOCK_SET_GET_MODE
+// Difference between system and eCos wallclock
+static cyg_uint32 epoch_ticks;
+static cyg_uint32 epoch_time_stamp;
+#endif
+
+//-----------------------------------------------------------------------------
 // Functions required for the hardware-driver API.
 
 // Initializes the clock
 void
 Cyg_WallClock::init_hw_seconds(void)
 {
-    // Nothing here
+#ifdef CYGSEM_WALLCLOCK_SET_GET_MODE
+    int fd;
+
+    // Read difference between system and eCos wallclock from file
+    fd = cyg_hal_sys_open(CYGDAT_DEVS_WALLCLOCK_SYNTH_FILENAME, 
+        CYG_HAL_SYS_O_RDONLY, 0);
+   
+    if (fd > 0)
+    {
+        cyg_hal_sys_read(fd, &epoch_time_stamp, sizeof(epoch_time_stamp));
+        cyg_hal_sys_read(fd, &epoch_ticks, sizeof(epoch_ticks));
+        cyg_hal_sys_close(fd);
+    }
+#endif
 }
 
 // Returns the number of seconds elapsed since 1970-01-01 00:00:00
 cyg_uint32 
 Cyg_WallClock::get_hw_seconds(void)
 {
+    cyg_uint32 res;
     struct cyg_hal_sys_timeval  ctv;
     struct cyg_hal_sys_timezone ctz;
     
     cyg_hal_sys_gettimeofday(&ctv, &ctz);
 
-    return ctv.hal_tv_sec;    
+#ifdef CYGSEM_WALLCLOCK_SET_GET_MODE
+    res = epoch_time_stamp + ctv.hal_tv_sec - epoch_ticks;    
+#else
+    res = ctv.hal_tv_sec;    
+#endif
+
+    return res;    
 }
 
 #ifdef CYGSEM_WALLCLOCK_SET_GET_MODE
 
 // Sets the clock. Argument is seconds elapsed since 1970-01-01 00:00:00
 void
 Cyg_WallClock::set_hw_seconds(cyg_uint32 secs)
 {
-    // Not supported
+    int fd;
+    struct cyg_hal_sys_timeval  ctv;
+    struct cyg_hal_sys_timezone ctz;
+
+    // System wallclock time    
+    cyg_hal_sys_gettimeofday(&ctv, &ctz);
+    
+    // Set the difference between the system and eCos wallclock
+    epoch_time_stamp = secs;
+    epoch_ticks      = ctv.hal_tv_sec;
+   
+    // Write difference to file
+    fd = cyg_hal_sys_open(CYGDAT_DEVS_WALLCLOCK_SYNTH_FILENAME, 
+        CYG_HAL_SYS_O_WRONLY | CYG_HAL_SYS_O_CREAT,
+        CYG_HAL_SYS_S_IRWXU | CYG_HAL_SYS_S_IRWXG | CYG_HAL_SYS_S_IRWXO);
+
+    if (fd > 0)
+    {
+        cyg_hal_sys_write(fd, &epoch_time_stamp, sizeof(epoch_time_stamp));
+        cyg_hal_sys_write(fd, &epoch_ticks, sizeof(epoch_ticks));
+        cyg_hal_sys_close(fd);
+    }
 }
 
 #endif // CYGSEM_WALLCLOCK_SET_GET_MODE
 
 //-----------------------------------------------------------------------------

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]