annotate DDSBes.c @ 36:fb6092340979

Minor fixes to UI
author Daniele Nicolodi <daniele.nicolodi@obspm.fr>
date Wed, 03 Oct 2012 15:05:40 +0200
parents d9aae7d7f2c6
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
1 #include <utility.h>
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
2 #include <cvirte.h> /* Needed if linking in external compiler; harmless otherwise */
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
3 #include <userint.h>
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
4 #include "DDSBes.h"
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
5 #include <ansi_c.h>
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
6 #include <gpib.h>
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
7
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
8 #define PPORT 0x378
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
9 #define PPCTRL PPORT+2
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
10 #define UPDate 0x040
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
11 #define nWR 0x080
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
12 #define MReset 0x0C0
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
13 #define tempo 20
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
14
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
15 // Private functions, hence declared as static ...
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
16
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
17 static int delai(int t) {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
18 int j ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
19 for (j=0;j<t; j++) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
20 return(0) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
21 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
22
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
23
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
24 static int Strb_adress(unsigned char ad) {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
25 outp(PPCTRL,0x08) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
26 outp(PPORT,ad) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
27 outp(PPCTRL,0x09) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
28 delai(tempo) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
29 outp(PPCTRL,0x08) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
30 delai(tempo);
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
31 return(0) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
32 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
33
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
34 static int Strb_data(unsigned char da) {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
35 outp(PPCTRL,0x00) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
36 outp(PPORT,da) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
37 outp(PPCTRL,0x01) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
38 delai(tempo) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
39 outp(PPCTRL,0x00) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
40 delai(tempo) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
41 return(0) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
42 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
43
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
44 static int Strb_nWrite(void) {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
45 outp(PPCTRL,0x08) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
46 outp(PPORT,nWR) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
47 outp(PPCTRL,0x09) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
48 delai(tempo) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
49 outp(PPCTRL,0x08) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
50 delai(tempo) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
51 return(0) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
52 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
53
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
54 static int Strb_Update(void) {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
55 outp(PPCTRL,0x08) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
56 outp(PPORT,UPDate) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
57 outp(PPCTRL,0x09) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
58 delai(tempo) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
59 outp(PPCTRL,0x08) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
60 delai(tempo) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
61 return(0) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
62 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
63
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
64 static int Strb_MReset(void) {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
65 outp(PPCTRL,0x08) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
66 outp(PPORT,MReset) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
67 outp(PPCTRL,0x09) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
68 delai(tempo) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
69 outp(PPCTRL,0x08) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
70 delai(tempo) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
71 return(0) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
72 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
73
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
74 // Public functions
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
75
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
76 void DDSBes_Initialize(DDSBes_Data * Instance) {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
77 Strb_MReset();
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
78 /* 0 dans 0x1F => update clock externe */
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
79 Strb_data(0x00);
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
80 Strb_adress(0x1F);
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
81 Strb_nWrite();
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
82
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
83 return ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
84 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
85
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
86 void DDSBes_Close(DDSBes_Data * Instance){
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
87
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
88 return ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
89 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
90
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
91 void DDSBes_SetClockFrequency(DDSBes_Data * Instance, double clock_frequency){
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
92
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
93 int fPLL ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
94 unsigned char oPLL;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
95
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
96 fPLL = 1;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
97 if(fPLL==1 || (fPLL>3 && fPLL<21)) {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
98 Instance->ClockFrequency = clock_frequency*fPLL;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
99 if (Instance->ClockFrequency>300.0e6) {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
100 Instance->ClockFrequency = 300.0e6 ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
101 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
102 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
103
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
104 if (fPLL==1) oPLL=0x60 ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
105 else {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
106 if (Instance->ClockFrequency>=2e8) oPLL=(unsigned char)(0x40 + fPLL) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
107 else oPLL= (unsigned char)fPLL ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
108 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
109
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
110 Strb_data(oPLL);
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
111 Strb_adress(0x1E);
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
112 Strb_nWrite();
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
113
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
114 return ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
115 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
116
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
117 void DDSBes_SetFrequency(DDSBes_Data * Instance, double frequency){
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
118
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
119 double pas ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
120 double reste ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
121 double coeff;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
122 double fdiv[7];
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
123 double p[6];
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
124
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
125 int i;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
126
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
127 unsigned char o[6];
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
128
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
129 fdiv[6]=pow(2.0,48.0);
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
130 fdiv[5]=pow(2.0,40.0);
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
131 fdiv[4]=pow(2.0,32.0);
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
132 fdiv[3]=pow(2.0,24.0);
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
133 fdiv[2]=65536.0;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
134 fdiv[1]=256.0;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
135 fdiv[0]=1.0;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
136
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
137 coeff=fdiv[6]/Instance->ClockFrequency;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
138 pas=coeff*frequency;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
139 reste=pas;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
140
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
141 for (i=5;i>0;i--){
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
142 p[i]=(reste/fdiv[i]);
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
143 reste=fmod(pas,fdiv[i]);
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
144 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
145 p[0]=reste;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
146
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
147 for (i=5;i>=0;i--){
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
148 o[i]=(unsigned char) p[i];
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
149 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
150
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
151 /* frequence (6 octets) */
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
152 Strb_adress(0x04);Strb_data(o[5]);Strb_nWrite();
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
153 Strb_adress(0x05);Strb_data(o[4]);Strb_nWrite();
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
154 Strb_adress(0x06);Strb_data(o[3]);Strb_nWrite();
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
155 Strb_adress(0x07);Strb_data(o[2]);Strb_nWrite();
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
156 Strb_adress(0x08);Strb_data(o[1]);Strb_nWrite();
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
157 Strb_adress(0x09);Strb_data(o[0]);Strb_nWrite();
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
158
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
159 Strb_Update();
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
160
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
161 // store in Instance->Frequency the real frequency generated by the DDS
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
162 // (and not "frequency", which is only the requested frequency and might differ by as much as ClockFrequency/2^48
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
163 Instance->Frequency = Instance->ClockFrequency/fdiv[6]
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
164 *(fdiv[5]*o[5]+fdiv[4]*o[4]+fdiv[3]*o[3]+fdiv[2]*o[2]+fdiv[1]*o[1]+fdiv[0]*o[0]) ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
165
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
166
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
167
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
168 return ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
169 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
170
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
171
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
172 void DDSBes_SetAmplitude(DDSBes_Data * Instance, int amplitude) {
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
173 unsigned char a[2];
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
174
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
175 if (amplitude > 0 && amplitude < 4096){
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
176 a[1]=(unsigned char)(amplitude>>8);
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
177 a[0]=(unsigned char)floor(fmod(amplitude,256.0));
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
178 Instance->Amplitude = amplitude ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
179 }
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
180
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
181 /* nibble fort adresse=0x21 data=a[1] */
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
182 Strb_data(a[1]);
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
183 Strb_adress(0x21);
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
184 Strb_nWrite();
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
185 /* octet faible adresse=0x22 data=a[0] */
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
186 Strb_data(a[0]);
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
187 Strb_adress(0x22);
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
188 Strb_nWrite();
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
189 /* mise a jour */
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
190 Strb_Update();
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
191
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
192 return ;
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff changeset
193 }