00001
00002
00003
00004
00005 #include <fcntl.h>
00006 #include <unistd.h>
00007 #include <string.h>
00008
00009 #include <stdio.h>
00010 #include <stdlib.h>
00011 #include <sys/mman.h>
00012 #include <math.h>
00013
00014 #include "lasercalc.h"
00015 #define D(x)
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 int calculateBeamParams(const char * dmaFileName,
00047 int width,
00048 int height,
00049 struct beam_params * beam
00050 ) {
00051 int i,j,k,l,y;
00052 int d,q;
00053 int DMALongsPerRow;
00054 int data_fd;
00055 long long iSQ=0;
00056 long long iSxQ=0;
00057 long long iSyQ=0;
00058 long long iSxxQ=0;
00059 long long iSyyQ=0;
00060 long long iSxyQ=0;
00061 long long d2;
00062 int eps;
00063
00064 unsigned long * DMAData;
00065 unsigned long scols [MAX_IMAGE_WIDTH];
00066 unsigned long scolsy[MAX_IMAGE_WIDTH];
00067 unsigned long srows [MAX_IMAGE_HEIGHT];
00068
00069 MD(fprintf(stderr,"dmaFileName- %s,width - %d, height %d\r\n",dmaFileName,width,height));
00070 if ( (width>MAX_IMAGE_WIDTH) ||
00071 (width<=0) ||
00072 (height>MAX_IMAGE_HEIGHT) ||
00073 (height<=0) ) return -1;
00074 i=width/3;
00075 DMALongsPerRow = (3*i == width)? i: i+1;
00076
00077 if ((data_fd = open(dmaFileName, O_RDONLY))==-1) return -2;
00078 MD(fprintf(stderr,"\r\n"));
00079 DMAData = (unsigned long *) mmap(0, (DMALongsPerRow*height)<<2, PROT_READ, MAP_OPTIONS, data_fd, 0);
00080 MD(fprintf(stderr,"\r\n"));
00081
00082 if((int)(DMAData) == -1) {
00083 close(data_fd);
00084 return -3;
00085 }
00086 MD(fprintf(stderr,"\r\n"));
00087
00088 memset (scols, 0,sizeof(scols ));
00089 memset (scolsy,0,sizeof(scolsy));
00090 memset (srows, 0,sizeof(srows));
00091 for (i=0;i<height;i++) {
00092 l=DMALongsPerRow*i;
00093 d=DMAData[l++];
00094 k=0;
00095 y=height-i;
00096 for (j=0;j<width;j++) {
00097 q=(d>>k)&0x3ff;
00098 scols [j]+=q;
00099 scolsy[j]+=q*y;
00100 srows [y]+=q;
00101 if ((k+=10)>20) {
00102 k=0;
00103 d=DMAData[l++];
00104 }
00105
00106 }
00107 }
00108
00109 for (j=0;j<width;j++) {
00110 iSQ+= scols[j];
00111 d2=((long long) j) * scols[j];
00112 iSxQ+=d2;
00113 iSxxQ+=d2 * j;
00114 iSxyQ+=((long long) j) * scolsy[j];
00115 }
00116 for (i=0;i<height;i++) {
00117 d2=((long long) i) * srows[i];
00118 iSyQ+=d2;
00119 iSyyQ+=d2 * i;
00120 }
00121
00122 beam->SQ= iSQ;
00123 beam->SxQ= iSxQ;
00124 beam->SyQ= iSyQ;
00125 beam->SxxQ= iSxxQ;
00126 beam->SyyQ= iSyyQ;
00127 beam->SxyQ= iSxyQ;
00128
00129 beam->xc= beam->SxQ/beam->SQ;
00130 beam->yc= beam->SyQ/beam->SQ;
00131 beam->s2x= beam->SxxQ/beam->SQ - (beam->xc*beam->xc);
00132 beam->s2y= beam->SyyQ/beam->SQ - (beam->yc*beam->yc);
00133 beam->sxy= beam->SxyQ/beam->SQ - (beam->xc*beam->yc);
00134
00135 beam->dx= 4*sqrt(beam->s2x);
00136 beam->dy= 4*sqrt(beam->s2y);
00137 beam->d= 4*sqrt((beam->s2x+beam->s2y)/2);
00138 beam->az= 0.5*atan2(2*beam->sxy,beam->s2x-beam->s2y);
00139
00140 eps= (beam->s2x > beam->s2y) ? 1: -1;
00141 beam->dxe= 2.0*sqrt(2.0)*sqrt(beam->s2x+beam->s2y+\
00142 eps*sqrt((beam->s2x-beam->s2y)*(beam->s2x-beam->s2y) +4*(beam->sxy*beam->sxy)));
00143 beam->dye= 2.0*sqrt(2.0)*sqrt(beam->s2x+beam->s2y-\
00144 eps*sqrt((beam->s2x-beam->s2y)*(beam->s2x-beam->s2y) +4*(beam->sxy*beam->sxy)));
00145 beam->ar= beam->dye/beam->dxe;
00146 return 0;
00147 }
00148
00149