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 #include <locale.h>
00034 #include <libintl.h>
00035 
00036 
00037 #include "glbvars.h"
00038 #include "plug-ins/hard/modules/dsp.h"
00039 #include <fcntl.h>
00040 #include <sys/ioctl.h>
00041 
00042 #include "dsp-pci32/spa/spacmd.h"
00043 #include "innovative_dsp_hwi.h"
00044 
00045 
00046 
00047 
00048 
00049 
00050 
00051 innovative_dsp_hwi_spa::innovative_dsp_hwi_spa():innovative_dsp_hwi_dev(){
00052   ScanningFlg=0;
00053 }
00054 
00055 innovative_dsp_hwi_spa::~innovative_dsp_hwi_spa(){
00056 }
00057 
00058 
00059 
00060 
00061 
00062 void innovative_dsp_hwi_spa::PutParameter(void *src, int grp){ 
00063   if(src)
00064     memcpy(&dspPar, src, sizeof(DSP_Param));
00065   switch(ScanningFlg){
00066   case 0:
00067     DSP_SpaWerte();
00068     break;
00069   case 1:
00070     ScanningFlg=2;
00071     break;
00072   case 3:
00073     DSP_SpaWerte();
00074     break;
00075   }
00076 }
00077 
00078 void innovative_dsp_hwi_spa::StoreParameter(){
00079 }
00080 
00081 void innovative_dsp_hwi_spa::RestoreParameter(){
00082   DSP_SpaWerte(TRUE);
00083 }
00084 
00085 
00086 void innovative_dsp_hwi_spa::StartScan2D(){
00087   ScanningFlg=1; KillFlg=FALSE;
00088 }
00089 
00090 void innovative_dsp_hwi_spa::EndScan2D(){ 
00091   if(ScanningFlg>1){
00092     ScanningFlg=0; 
00093     PutParameter(NULL);
00094   }
00095   else
00096     ScanningFlg=0; 
00097 }
00098 
00099 void innovative_dsp_hwi_spa::MovetoXY(long x, long y){
00100   rx=x;
00101   ry=y;
00102 }
00103 void innovative_dsp_hwi_spa::SetDxDy(int dx, int dy){
00104   Dx = dx; 
00105   Dy = dy;
00106   dspPar.LS_dnx = dx;
00107 }
00108 void innovative_dsp_hwi_spa::SetOffset(long x, long y){
00109   rotoffx = x; rotoffy = y;
00110   DSP_SpaWerte();
00111 }
00112 void innovative_dsp_hwi_spa::SetAlpha(double alpha){ 
00113   Alpha=M_PI*alpha/180.;
00114   rotmyy = rotmxx = cos(Alpha);
00115   rotmyx = -(rotmxy = sin(Alpha));
00116   DSP_SpaWerte();
00117 }
00118 
00119 void innovative_dsp_hwi_spa::SetNx(long nx){ 
00120   Nx=nx; 
00121   dspPar.LS_nx2scan = nx;
00122 }
00123 
00124 
00125 
00126 
00127 
00128 
00129 void innovative_dsp_hwi_spa::DSP_SpaWerte(int flg){
00130   static double sum=1234e100;
00131   double nowsum;
00132   nowsum = rotoffx+rotoffx+dspPar.SPA_Length+dspPar.LS_nx2scan+Alpha+dspPar.SPA_Gatetime+dspPar.SPA_EnergyVolt;
00133   if(sum != nowsum || flg){
00134     PARAMETER_SET hardpar;
00135     sum = nowsum;
00136     XSM_DEBUG (DBG_L4, "DSP_SpaWerte");
00137 
00138     hardpar.N   = DSP_MYY+1;
00139     hardpar.Cmd = DSP_CMD_SCAN_PARAM;
00140     hardpar.hp[DSP_X0   ].value = rotoffx;
00141     hardpar.hp[DSP_Y0   ].value = rotoffy;
00142     hardpar.hp[DSP_len  ].value = dspPar.SPA_Length;
00143     hardpar.hp[DSP_N    ].value = dspPar.LS_nx2scan;
00144     hardpar.hp[DSP_alpha].value = Alpha;
00145     hardpar.hp[DSP_ms   ].value = 1000.*dspPar.SPA_Gatetime;
00146     hardpar.hp[DSP_E    ].value = dspPar.SPA_EnergyVolt;
00147     hardpar.hp[DSP_MXX  ].value = cos (Alpha);
00148     hardpar.hp[DSP_MXY  ].value = sin (Alpha);
00149     hardpar.hp[DSP_MYX  ].value = -sin (Alpha);
00150     hardpar.hp[DSP_MYY  ].value = cos (Alpha);
00151     SetParameter(hardpar);
00152   }
00153 }
00154 
00155 
00156 
00157 
00158 
00159 
00160 
00161 
00162 
00163 
00164 
00165 
00166 
00167 
00168 
00169 
00170 
00171 
00172 
00173 
00174 
00175 
00176 
00177 
00178 
00179 
00180 
00181 
00182 void innovative_dsp_hwi_spa::ScanLineM(int yindex, int xdir, int lssrcs, Mem2d *Mob[MAX_SRCS_CHANNELS], int ix0){
00183         if (yindex < 0) return;
00184 
00185         int i, bi, bi2, bin;
00186         size_t elem_size=sizeof(long);
00187         size_t bsz;
00188         size_t sz;
00189         static long linebuffer[DSP_DATA_REG_LEN]; 
00190         PARAMETER_SET hardpar;
00191 
00192         hardpar.N   = DSP_E+1;
00193         hardpar.Cmd = DSP_CMD_SCAN_START;
00194         hardpar.hp[DSP_Y0   ].value = ry;
00195         hardpar.hp[DSP_len  ].value = dspPar.SPA_Length; 
00196         hardpar.hp[DSP_E    ].value = dspPar.SPA_EnergyVolt;
00197         SetParameter(hardpar, TRUE);
00198 
00199         
00200         
00201 
00202         
00203         bsz=(dspPar.LS_nx2scan*elem_size);
00204         bi=i=0;
00205         do{
00206                 bin=sz=0;
00207                 do{
00208                         if(lssrcs & (1<<bi++)){
00209                                 sz += bsz; ++bin;
00210                         }
00211                         if((sz+bsz) > (DSP_DATA_REG_LEN<<2)) 
00212                                 break;
00213                 }while(bi<16);
00214                 if(bin){
00215                         
00216                         ReadData(linebuffer, sz);
00217                         bi2=0;
00218                         do{
00219                                 
00220                                 Mob[i++]->PutDataLine(yindex, linebuffer+(bi2++)*dspPar.LS_nx2scan, scanmode);
00221                         }while(--bin && (i < MAX_SRCS_CHANNELS) ? Mob[i]!=NULL : FALSE);
00222                 }
00223                 else 
00224                         break;
00225                 
00226                 ExecCmd(DSP_CMD_SWAPDPRAM);
00227         }while((i < MAX_SRCS_CHANNELS) ? Mob[i]!=NULL : FALSE);
00228 }