00001
00002
00003
00004
00005 #include <iostream>
00006 #include <assert.h>
00007
00008 #include "EEdsm0.h"
00009
00010
00011
00012 EEdsm0::EEdsm0() {
00013 clear();
00014 type=1;
00015 mYear=-1;
00016 memset( HTthr,0,sizeof(HTthr));
00017 memset( TPthr,0,sizeof(TPthr));
00018 }
00019
00020
00021
00022 EEdsm0::~EEdsm0() { }
00023
00024
00025
00026 void
00027 EEdsm0::setYear(int y, int*HTth, int*TPth ) {
00028 mYear=y;
00029 assert(type==1 || type==2);
00030 int i;
00031 for(i=0;i<mxTh;i++) {
00032 HTthr[i]= HTth[i];
00033 TPthr[i]= TPth[i];
00034 }
00035 }
00036
00037
00038 void
00039 EEdsm0::clear() {
00040 memset(data,0,sizeof(data));
00041 memset(value,0,sizeof(value));
00042 memset(outHT2bit,0,sizeof(outHT2bit));
00043 memset(outTP2bit,0,sizeof(outTP2bit));
00044 memset(outHTTP2bit,0,sizeof(outHTTP2bit));
00045 memset(outTPsum,0,sizeof(outTPsum));
00046 memset(out16bit,0,sizeof(out16bit));
00047 }
00048
00049
00050
00051 void
00052 EEdsm0::setBite(int b, uchar val){
00053 assert(b>=0 && b<nw);
00054 data[b]=val;
00055 }
00056
00057
00058
00059 void
00060 EEdsm0::setInp12bit(int ch, short val){
00061 assert(ch>=0 && ch<nc);
00062 value[ch]=val;
00063 }
00064
00065
00066
00067 int
00068 EEdsm0::getInp12bit(int ch) const {
00069 assert(ch>=0 && ch<nc);
00070 return value[ch];
00071 }
00072
00073
00074
00075
00076 void
00077 EEdsm0::unpack() {
00078 int ch;
00079 for(ch=0;ch<nc;ch++) {
00080
00081 uint val=99999;
00082 switch( ch%2 ) {
00083 case 0:
00084 {
00085 int k=ch/2*3;
00086 val = ((data[k+1] & 0xf) <<8) + data[k];
00087
00088 } break;
00089 case 1:
00090 {
00091 int k=(ch-1)/2*3+1;
00092 val =( data[k+1] <<4) + (data[k]>>4);
00093
00094 } break;
00095 }
00096
00097 value[ch]= val;
00098 }
00099 }
00100
00101
00102
00103
00104 void
00105 EEdsm0::print( int k) const {
00106 printf("EEdsm0 type=%d year=%d \n",type,mYear);
00107
00108 int i;
00109 printf("thresholds HT="); for(i=0;i<mxTh;i++) printf(" %2d ", HTthr[i]);
00110 printf(" TP="); for(i=0;i<mxTh;i++) printf(" %2d ", TPthr[i]);printf("\n");
00111
00112 printf("byte = ");
00113 for(i=0;i<nw;i++) printf(" %2d ",nw-i-1);
00114 printf("\nraw = ");
00115 for(i=0;i<nw;i++) printf("x%2.2x ",data[nw-i-1]);
00116
00117
00118 printf("\nch = ");
00119 for(i=nc-1;i>=0;i--) printf(" %3d ",i);
00120 printf("\nTP+HT = ");
00121 for(i=nc-1;i>=0;i--) printf(" x%3.3x ", getInp12bit(i) );
00122 printf("\n[dec] = ");
00123 for(i=nc-1;i>=0;i--) printf("%2d+%2d ", getInpTP6bit(i), getInpHT6bit(i) );
00124
00125 printf("\n output(s) TPsum=%d HT2b=%d HTTP2b=%d",outTPsum[0],outHT2bit[0],outHTTP2bit[0]);
00126 if(type==1) printf("\n");
00127 else printf(" AND TPsum=%d HT2b=%d HTTP2b=%d\n",outTPsum[1],outHT2bit[1],outHTTP2bit[1]);
00128
00129 }
00130
00131
00132
00133
00134
00135 void
00136 EEdsm0::compute() {
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
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 assert(mYear=2006);
00179
00180 int iOu=0;
00181 int i;
00182 for(i=0;i<nc;i++) {
00183 if(type==2 && i>=5) iOu=1;
00184 outTPsum[iOu]+=getInpTP6bit(i);
00185 int k;
00186 for(k=0;k<mxTh; k++) {
00187 int lev=k+1;
00188 if( getInpHT6bit(i)>HTthr[k] && outHT2bit[iOu]<lev) outHT2bit[iOu]=lev;
00189 if( getInpTP6bit(i)>TPthr[k] && outTP2bit[iOu]<lev) outTP2bit[iOu]=lev;
00190 if( getInpHT6bit(i)>HTthr[k] && getInpTP6bit(i)>TPthr[k] && outHTTP2bit[iOu]<lev) outHTTP2bit[iOu]=lev;
00191 }
00192
00193 out16bit[iOu] = outTPsum[iOu] + ( outHT2bit[iOu] << 10 ) + ( outTP2bit[iOu] << 12 ) + ( outHTTP2bit[iOu] << 14 );
00194
00195
00196 }
00197
00198 }
00199
00200
00201 #if 0
00202 probably wrong, do not account for type 1 & 2
00203
00204
00205 int EEdsm0 :: maxHT() {
00206 int i;
00207 int k=0;
00208 uint max=getHT(k);
00209 for(i=1;i<nc;i++) {
00210 uint val=getHT(i);
00211 if(val<=max) continue;
00212 max=val;
00213 k=i;
00214 }
00215
00216 return k;
00217 }
00218
00219
00220
00221
00222 int EEdsm0 :: maxTP() {
00223 int i;
00224 int k=0;
00225 uint max=getTP(k);
00226 for(i=1;i<nc;i++) {
00227 uint val=getTP(i);
00228 if(val<=max) continue;
00229 max=val;
00230 k=i;
00231 }
00232
00233 return k;
00234 }
00235 #endif
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260