source: MML/trunk/mml/links/ucode/uio.c @ 4

Last change on this file since 4 was 4, checked in by zhangj, 10 years ago

Initial import--MML version from SOLEIL@2013

File size: 3.0 KB
Line 
1#include <stdio.h>
2#include <nslsc.h>
3#include <ucode_def.h>
4#include <umacro_v2.h>
5#include <time.h>
6
7/*
8nslsc.h:#define DEV_NAMELEN   16
9nslsc.h:typedef char DEV_NAME[DEV_NAMELEN];
10*/
11
12
13#define N_MAX 256
14
15
16int uget(int ndev, DEV_NAME devnames[], float setp[], float rdbk[])
17{
18  int       i, setp_cnts[N_MAX], rdbk_cnts[N_MAX], status;
19  float     gain[N_MAX], offset[N_MAX];
20
21  if (ndev < 1) {
22    printf("*** No of devices = %d\n", ndev); exit(0);
23  }
24  for(i = 0; i < ndev; i++) {
25    ugddr_getcalib_data(devnames[i], &gain[i], &offset[i]);
26  }
27
28  if (uidopen("Ctest")) {
29    ucdperror(); exit(1);
30  }
31  status = ureadsetp(ndev, devnames, setp_cnts) ||
32           ureadmag(ndev, devnames, rdbk_cnts);
33  if (status) {
34    fprintf(stderr, "*** ");
35    ucdperror();
36  } else {
37    for(i = 0; i < ndev; i++) {
38      setp[i] = setp_cnts[i]*gain[i]; rdbk[i] = rdbk_cnts[i]*gain[i];
39    }
40  }
41  uclose();
42  return(status);
43}
44
45int sgn(float x)
46{
47  if (x >= 0.0)
48    return(1);
49  else if (x == 0.0)
50    return(0);
51  else
52    return(-1);
53}
54
55int uputsp(int ndev, DEV_NAME devnames[], float setp[])
56{
57  int       k, cnts[N_MAX], status;
58  float     gain[N_MAX], offset[N_MAX], val;
59
60  if (ndev < 1) {
61    printf("*** No of devices = %d\n", ndev); exit(0);
62  } else {
63    for (k = 0; k < ndev; k++) {
64      ugddr_getcalib_data(devnames[k], &gain[k], &offset[k]);
65      cnts[k] = (int)(setp[k]/gain[k]+sgn(setp[k])*0.5);
66      printf("name=%s, value=%d gain=%e\n", devnames[k], cnts[k], gain[k]) ;
67    }
68  }
69
70  if(uidopen("Ctest")) {
71    ucdperror(); exit(1);
72  }
73  status = usetmag(ndev, devnames, cnts); 
74  uclose();
75  return(status);
76}
77
78
79main(int argc, char *argv[])
80{
81  clock_t   tv1, tv2;
82  double    time;
83  int       i, ndev, status;
84  DEV_NAME  devnames[N_MAX];
85  float     setp[N_MAX], rdbk[N_MAX], val;
86
87  char read = 0;
88
89  if (read) {
90    if( argc <= 1 )
91      printf("*** command line error\n");
92    else {
93      ndev = argc - 1;
94      for(i = 0; i < ndev; i++)
95        strcpy(devnames[i], argv[i+1]);
96      tv1 = clock();
97      status = uget(ndev, devnames, setp, rdbk);
98      tv2 = clock();
99      time = (tv2-tv1)/(CLOCKS_PER_SEC/(double)1000.0);
100      printf("execution time = %5.3f sec\n", 1e-3*time);
101      if (status == 0)
102        for (i = 0; i < ndev; i++) {
103          printf("%d %s %e %e\n", status, devnames[i], setp[i], rdbk[i]) ;
104        }
105      else
106        printf("%d\n", status);
107    }
108  } else {   
109    if((argc < 2) || (argc % 2 == 0)) {
110      printf("*** Incorrect number of args\n"); exit(0);
111    } else {
112      ndev = argc/2;
113      for (i = 0; i < ndev; i++) {
114        sscanf(argv[2*i+1], "%s", devnames[i]);
115        sscanf(argv[2*i+2], "%f", &setp[i]);     
116      }
117      tv1 = clock();
118      status = uputsp(ndev, devnames, setp);
119      tv2 = clock();
120      time = (tv2-tv1)/(CLOCKS_PER_SEC/(double)1000.0);
121      printf("execution time = %5.3f sec\n", 1e-3*time);
122      printf("%d\n", status);
123      status = uget(ndev, devnames, setp, rdbk);
124      if (status == 0)
125        for (i = 0; i < ndev; i++) {
126          printf("%d %s %e %e\n", status, devnames[i], setp[i], rdbk[i]) ;
127        }
128      else
129        printf("%d\n", status);
130    }
131  }
132
133}
Note: See TracBrowser for help on using the repository browser.