00001
00002
00003 #ifndef SS_TIME_LIB_H
00004 #define SS_TIME_LIB_H
00005
00006 #ifdef __cplusplus
00007 extern "C" {
00008 #endif
00009
00010 #define EDT_SSTM_COUNTS 0x04010080
00011 #define EDT_SSTM_SECS 0x04010084
00012 #define EDT_SSTM_SET 0x04010088
00013 #define EDT_SSTM_ADJ_VALUE 0x0301008C
00014 #define EDT_SSTM_CMD 0x0101008F
00015
00022 typedef struct _timeregs {
00023 u_int counts;
00024 u_int secs;
00025 u_int set;
00026 u_int adj_value;
00027 u_int cmd;
00028
00029 EdtDev *dev_p;
00030
00031
00032 int check_interval;
00033 int adjust_sample;
00034 int adjustment_scalar;
00035 int max_error;
00036 int tolerance;
00037 int active;
00038 int done;
00039 int loops;
00040 thread_t thread;
00041
00042 double err;
00043 int sign;
00044 int loop;
00045 double converge;
00046 double drift;
00047 double adjust_drift;
00048 int iter;
00049
00050 int ticks;
00051
00052 } EdtTimeController;
00053
00054 #define EDT_SSTM_COPY 0x01
00055 #define EDT_SSTM_LATCH 0x02
00056 #define EDT_SSTM_COPY_ADJ 0x04
00057
00058 #define EDT_SSTM_ADJ_EN 0x10
00059 #define EDT_SSTM_ADJ_PLUS 0x20
00060 #define EDT_SSTM_CMD_LOCK 0x80
00061
00062 #define EDT_SSTM_ZERO_OFFSET_MAX 100
00063
00064 #define EDT_SSTM_MAX_ADJ 0xffffff
00065
00066 #define USECS_FACTOR (1000000.0 / (double) (1 << 20))
00067
00068
00124 EDTAPI void edt_sstm_setup(EdtTimeController *tm, char *bitfile);
00125
00126 EDTAPI void edt_sstm_strobe(EdtTimeController *tm, unsigned int bits);
00127
00128
00129
00130
00131
00132 EDTAPI void edt_sstm_latch_time(EdtTimeController *tm);
00133
00134
00135
00136
00137
00138 EDTAPI u_int edt_sstm_get_seconds(EdtTimeController *tm);
00139
00140
00141
00142
00143
00144 EDTAPI u_int edt_sstm_get_counts(EdtTimeController *tm);
00145
00146
00147
00148
00149
00150
00151
00152 EDTAPI u_int edt_sstm_get_usecs(EdtTimeController *tm);
00153
00154
00155
00156
00157
00158 EDTAPI void edt_sstm_get_time_parts(EdtTimeController *tm, u_int *seconds, u_int *usecs);
00159
00160
00161
00162
00163
00164
00165 EDTAPI double edt_sstm_timestamp(EdtTimeController *tm);
00166
00167
00168
00169
00170
00171
00172 EDTAPI int edt_sstm_get_adjust_enabled(EdtTimeController *tm);
00173
00174
00175
00176
00177
00178
00179 EDTAPI int edt_sstm_get_adjust_sign(EdtTimeController *tm);
00180
00181
00182
00183
00184
00185 EDTAPI u_int edt_sstm_get_adjust_ticks(EdtTimeController *tm);
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195 EDTAPI void edt_sstm_set_secs(EdtTimeController *tm, unsigned int second);
00196
00197
00198
00199
00200
00201
00202 EDTAPI void edt_sstm_set(EdtTimeController *tm, unsigned int second);
00203
00204
00205
00206
00207
00208
00209
00210
00211 EDTAPI void edt_sstm_set_to_sys(EdtTimeController *tm);
00212
00213
00214
00215
00216
00217 EDTAPI void edt_sstm_set_to_sys_error(EdtTimeController *tm, int error);
00218
00219
00220
00221
00222
00223 EDTAPI void edt_sstm_disable_adjust(EdtTimeController *tm);
00224
00225
00226
00227
00228
00229 EDTAPI void edt_sstm_enable_adjust(EdtTimeController *tm);
00230
00231
00232
00233
00234
00235 EDTAPI void edt_sstm_set_adj_sign(EdtTimeController *tm, int positive);
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245 EDTAPI void edt_sstm_set_adj_ticks(EdtTimeController *tm, int ticks, int positive);
00246
00247
00248
00249
00250
00251
00252
00253 EDTAPI double edt_sstm_sys_error(EdtTimeController *tm);
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263 EDTAPI double edt_sstm_measure_drift(EdtTimeController *tm);
00264
00265
00266
00267 EDTAPI int edt_sstm_ticks_from_drift(double drift);
00268
00269
00270
00271
00272 EDTAPI void edt_sstm_set_adj_from_drift(EdtTimeController *tm, double drift);
00273
00274 EDTAPI void edt_sstm_set_drift_sampling(int seconds, int samples);
00275
00276 EDTAPI int edt_sstm_get_adj_sample_secs();
00277
00278 EDTAPI int edt_sstm_get_adj_samples();
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288 EDTAPI double edt_sstm_calc_convergence(EdtTimeController *tm);
00289
00290
00291
00292
00293
00294
00295
00296
00297 EDTAPI double edt_sstm_adjust(EdtTimeController *tm);
00298
00299
00300
00301
00302
00303 EDTAPI void edt_sstm_iterate_adjust(EdtTimeController *tm);
00304
00305 EDTAPI void
00306 edt_sstm_print_loop(EdtTimeController *tm, int interval, int total_time);
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319 EDTAPI EdtTimeController *
00320 edt_sstm_launch_adjuster(EdtTimeController * tm);
00321
00322
00323 EDTAPI void
00324 edt_sstm_adjuster_stop(EdtTimeController * tm);
00325
00326
00327 EDTAPI void
00328 edt_sstm_adjuster_start(EdtTimeController * tm);
00329
00335 EDTAPI char * edt_printable_time(double sys_t, char *buf);
00336
00337 EDTAPI void edt_init_time_controller(EdtTimeController *tm,
00338 EdtDev *edt_p,
00339 u_int address_base);
00340
00341
00342 #ifndef WIN32
00343
00344 #define edt_sys_timestamp edt_timestamp
00345
00346 #else
00347
00348 EDTAPI double edt_sys_timestamp();
00349
00350 #endif
00351
00352
00353
00354 #ifdef __cplusplus
00355 }
00356 #endif
00357
00358
00359
00360 #endif