00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #include <iostream>
00035
00036
00037 #include <fcntl.h>
00038 #include <sys/ioctl.h>
00039
00040 #include <locale.h>
00041 #include <libintl.h>
00042
00043
00044
00045 #include "glbvars.h"
00046 #include "dsp-pci32/xsm/xsmcmd.h"
00047 #include "LAN_rhk_hwi.h"
00048
00049
00050
00051 #define RHK_DEBUG(S) XSM_DEBUG (DBG_L4, S)
00052
00053
00054
00055
00056
00057 LAN_rhk_hwi_spm::LAN_rhk_hwi_spm():LAN_rhk_hwi_dev(){
00058 RHK_DEBUG("Init LAN-RHK SPM");
00059 ScanningFlg=0;
00060 }
00061
00062
00063
00064
00065
00066 LAN_rhk_hwi_spm::~LAN_rhk_hwi_spm(){
00067 RHK_DEBUG("Finish LAN-RHK SPM");
00068 }
00069
00070 void LAN_rhk_hwi_spm::ExecCmd(int Cmd){
00071
00072 char txtcmd[80];
00073
00074 RHK_DEBUG("Exec Cmd 0x" << std::hex << Cmd);
00075 if (Cmd==DSP_CMD_APPROCH)
00076 {
00077 sprintf(txtcmd, "check %6.0d\n",ScanData.hardpars.TIP_DUz);
00078 SendCommand(txtcmd);
00079 }
00080 if (Cmd==DSP_CMD_APPROCH_MOV_XP)
00081 {
00082 sprintf(txtcmd, "approach %6.0f on %6.0f %6.0f\n",ScanData.hardpars.MOV_Steps,
00083 3276.8*ScanData.hardpars.MOV_Ampl, ScanData.hardpars.MOV_Speed);
00084 SendCommand(txtcmd);
00085 }
00086 else if (Cmd==DSP_CMD_CLR_PA)
00087 {
00088 SendCommand("stop\n");
00089 }
00090 else if (Cmd==DSP_CMD_AFM_MOV_YP)
00091 {
00092 sprintf(txtcmd, "approach %6.0f off %6.0f %6.0f\n",ScanData.hardpars.MOV_Steps,
00093 3276.8*ScanData.hardpars.MOV_Ampl, ScanData.hardpars.MOV_Speed);
00094 SendCommand(txtcmd);
00095 }
00096 else if (Cmd==DSP_CMD_AFM_MOV_YM)
00097 {
00098 sprintf(txtcmd, "retract %6.0f %6.0f %6.0f\n",ScanData.hardpars.MOV_Steps, 3276.8*ScanData.hardpars.MOV_Ampl, ScanData.hardpars.MOV_Speed);
00099 SendCommand(txtcmd);
00100 }
00101 else if (Cmd==DSP_CMD_MOVETO_X)
00102 {
00103 SendCommand("xy on\n");
00104 }
00105 else if (Cmd==DSP_CMD_MOVETO_Y)
00106 {
00107 SendCommand("xy off\n");
00108 }
00109
00110
00111
00112
00113
00114 }
00115
00116
00117 void LAN_rhk_hwi_spm::PutParameter(void *par, int grp)
00118 {
00119
00120
00121
00122
00123
00124
00125 char buffer[18], d0,d1;
00126 short *reading;
00127 int ad_gain, mult;
00128 float line_rate;
00129 int temp, count;
00130
00131 if (ScanningFlg) {RHK_DEBUG("Tried to get params while scanning!");
00132 return;
00133 }
00134 if (grp!=1) {
00135 if (par)
00136 memcpy(&(ScanData.hardpars),par, sizeof(ScanData.hardpars));
00137 RHK_DEBUG("Settings " << ScanData.hardpars.AFM_Steps << ScanData.hardpars.MOV_Steps);
00138 return;
00139 }
00140 if (par)
00141 memcpy(&ScanData,par, sizeof(ScanData));
00142 RHK_DEBUG("Settings " << ScanData.hardpars.AFM_Steps << ScanData.hardpars.MOV_Steps);
00143 SendCommand("read_settings\n");
00144 ReadData(buffer,sizeof(buffer));
00145 reading=(short *)buffer;
00146 d0=buffer[16];
00147 d1=buffer[17];
00148 ScanData.hardpars.UTunnel=reading[2];
00149 ScanData.hardpars.ITunnelSoll=reading[1];
00150
00151 ScanData.s.rx=reading[6];
00152 ScanData.s.ry=reading[4];
00153
00154 ScanData.s.tStart;
00155 ScanData.s.tEnd;
00156 ScanData.s.x0=reading[7];
00157 ScanData.s.y0=reading[5];
00158
00159 line_rate = d0 & 0x0f;
00160 temp = 2 << (((d0 & 0x70) >> 4) - 1);
00161 ad_gain = (temp == 0) ? 1 : temp;
00162 temp = d1 & 3;
00163 mult = (int)pow (10.0, temp);
00164 ScanData.s.ny= 128 << ((d1 & 12) >> 2);
00165 ScanData.s.nx= ScanData.s.ny;
00166 line_rate *= mult;
00167 ScanData.s.rz=32768/ad_gain;
00168 RHK_DEBUG("Updating parameters xUT=" );
00169
00170 if (par)
00171 memcpy(par,&ScanData,sizeof(ScanData));
00172
00173
00174 }
00175
00176
00177 void LAN_rhk_hwi_spm::StartScan2D(){
00178 ScanningFlg=1;
00179 KillFlg=FALSE;
00180
00181 RHK_DEBUG("Start Scan 2D");
00182 }
00183
00184
00185 void LAN_rhk_hwi_spm::EndScan2D(){
00186 ScanningFlg=0;
00187 SendCommand("reset\n");
00188 RHK_DEBUG("End Scan 2D");
00189 }
00190
00191
00192 void LAN_rhk_hwi_spm::PauseScan2D(){
00193 ScanningFlg=0;
00194 SendCommand("stop\n");
00195 RHK_DEBUG("Pause Scan 2D");
00196 }
00197
00198
00199 void LAN_rhk_hwi_spm::ResumeScan2D(){
00200 SendCommand("start\n");
00201 RHK_DEBUG("Resume Scan 2D");
00202 ScanningFlg=1;
00203 }
00204
00205
00206
00207
00208 void LAN_rhk_hwi_spm::MovetoX(long x){
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221 }
00222
00223
00224
00225 void LAN_rhk_hwi_spm::MovetoY(long y){
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236 }
00237
00238
00239
00240 void LAN_rhk_hwi_spm::SetDxDy(int dx, int dy){
00241 Dx = dx;
00242 Dy = dy;
00243
00244 RHK_DEBUG("SetDxSy: " << dx << ", " << dy);
00245 }
00246
00247
00248
00249 void LAN_rhk_hwi_spm::SetOffset(long x, long y){
00250 rotoffx = x; rotoffy = y;
00251 RHK_DEBUG("SetOffset: " << x << ", " << y);
00252 }
00253
00254
00255
00256 void LAN_rhk_hwi_spm::SetAlpha(double alpha){
00257
00258 Alpha=M_PI*alpha/180.;
00259 rotmyy = rotmxx = cos(Alpha);
00260 rotmyx = -(rotmxy = sin(Alpha));
00261 RHK_DEBUG("SetAlpha: " << alpha);
00262 }
00263
00264
00265
00266 void LAN_rhk_hwi_spm::SetNx(long nx){
00267 Nx=nx;
00268
00269 RHK_DEBUG("Setnx: " << nx);
00270 }
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301 void LAN_rhk_hwi_spm::ScanLineM(int yindex, int xdir, int lssrcs, Mem2d *Mob[MAX_SRCS_CHANNELS], int ix0 ){
00302 char txt[80];
00303 int count;
00304 int channel;
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329 if (yindex<1) {
00330 if (lssrcs & 0x01) channel=0;
00331 else if (lssrcs & 0x02) channel=1;
00332 else if (lssrcs & 0x04) channel=2;
00333 else if (lssrcs & 0x08) channel=3;
00334 else if (lssrcs & 0x08) channel=3;
00335 else if (lssrcs & 0x10) channel=4;
00336 else if (lssrcs & 0x20) channel=5;
00337 else if (lssrcs & 0x40) channel=6;
00338 else if (lssrcs & 0x80) channel=7;
00339
00340 RHK_DEBUG("Selecting " << lssrcs << " and so, channel " << channel );
00341 count=sprintf(txt, "channel %d\n\0",channel);
00342 SendCommand(txt);
00343 SendCommand("start\n");
00344 }
00345
00346 CallIdleFunc ();
00347
00348
00349 int num_srcs = 0;
00350 int bi = 0;
00351 do{
00352 if(lssrcs & (1<<bi++))
00353 ++num_srcs;
00354 }while(bi<16);
00355
00356 ReadScanData (yindex, num_srcs, Mob);
00357 }