2014_winter_EE202A_HM1_UCLA Author:Yujing Qian and Tianlei Tang

Dependencies:   MAG3110 MMA8451Q TSI mbed

Committer:
allonq
Date:
Thu Feb 13 02:00:58 2014 +0000
Revision:
0:3cc7f3653a5d
Child:
1:58c266799ba7
main function for 2014winter_EE202A_HM1; author:Yujing Qian and Tianlei Tang

Who changed what in which revision?

UserRevisionLine numberNew contents of line
allonq 0:3cc7f3653a5d 1 #include "mbed.h"
allonq 0:3cc7f3653a5d 2 #include "MMA8451Q.h"
allonq 0:3cc7f3653a5d 3 #include "MAG3110.h"
allonq 0:3cc7f3653a5d 4 #include "TSISensor.h"
allonq 0:3cc7f3653a5d 5 #define MMA8451_I2C_ADDRESS (0x1d<<1)
allonq 0:3cc7f3653a5d 6 #define BUFFER_SIZE 200
allonq 0:3cc7f3653a5d 7 #define BAUDRATE 9600
allonq 0:3cc7f3653a5d 8
allonq 0:3cc7f3653a5d 9 AnalogIn lightsensor(PTE22);
allonq 0:3cc7f3653a5d 10 AnalogIn analoginput(PTB0);
allonq 0:3cc7f3653a5d 11 Serial pc(USBTX,USBRX);
allonq 0:3cc7f3653a5d 12 char rx_buffer[BUFFER_SIZE];
allonq 0:3cc7f3653a5d 13 int buff=0;
allonq 0:3cc7f3653a5d 14 bool received;
allonq 0:3cc7f3653a5d 15
allonq 0:3cc7f3653a5d 16 void receive_handler(){
allonq 0:3cc7f3653a5d 17 while (pc.readable() && buff< BUFFER_SIZE){
allonq 0:3cc7f3653a5d 18
allonq 0:3cc7f3653a5d 19 rx_buffer[buff] = pc.getc();
allonq 0:3cc7f3653a5d 20 //pc.printf(& rx_buffer[buff]);
allonq 0:3cc7f3653a5d 21 if (rx_buffer[buff] == '#'){
allonq 0:3cc7f3653a5d 22 rx_buffer[buff] = '\0';
allonq 0:3cc7f3653a5d 23 /*
allonq 0:3cc7f3653a5d 24 rx_buffer[6] = '\0';
allonq 0:3cc7f3653a5d 25 int tag=192;
allonq 0:3cc7f3653a5d 26 char *testx=(char*)&tag;
allonq 0:3cc7f3653a5d 27 buff=14;
allonq 0:3cc7f3653a5d 28 rx_buffer[0]=(*testx);
allonq 0:3cc7f3653a5d 29 tag=2;
allonq 0:3cc7f3653a5d 30 testx=(char*)&tag;
allonq 0:3cc7f3653a5d 31 rx_buffer[1]=(*testx);
allonq 0:3cc7f3653a5d 32 rx_buffer[2]=0;
allonq 0:3cc7f3653a5d 33 rx_buffer[3]=0;
allonq 0:3cc7f3653a5d 34 rx_buffer[4]=0;
allonq 0:3cc7f3653a5d 35 tag=100;
allonq 0:3cc7f3653a5d 36 testx=(char*)&tag;
allonq 0:3cc7f3653a5d 37 rx_buffer[5]=(*testx);
allonq 0:3cc7f3653a5d 38 rx_buffer[6]=0;
allonq 0:3cc7f3653a5d 39 rx_buffer[7]=0;
allonq 0:3cc7f3653a5d 40 rx_buffer[8]=0;
allonq 0:3cc7f3653a5d 41 tag=200;
allonq 0:3cc7f3653a5d 42 testx=(char*)&(tag);
allonq 0:3cc7f3653a5d 43 rx_buffer[9]=(*testx);
allonq 0:3cc7f3653a5d 44 rx_buffer[10]=0;
allonq 0:3cc7f3653a5d 45 rx_buffer[11]=0;
allonq 0:3cc7f3653a5d 46 rx_buffer[12]=0;
allonq 0:3cc7f3653a5d 47 tag=400;
allonq 0:3cc7f3653a5d 48 testx=(char*)&(tag);
allonq 0:3cc7f3653a5d 49 rx_buffer[13]=(*testx);
allonq 0:3cc7f3653a5d 50 */
allonq 0:3cc7f3653a5d 51 //pc.printf(rx_buffer);pc.printf("\n");
allonq 0:3cc7f3653a5d 52 //pc.printf("testmode_loaded\n");
allonq 0:3cc7f3653a5d 53 received = true;
allonq 0:3cc7f3653a5d 54 //pc.printf("received=%d\n",received);
allonq 0:3cc7f3653a5d 55 break;
allonq 0:3cc7f3653a5d 56 }
allonq 0:3cc7f3653a5d 57 buff++;
allonq 0:3cc7f3653a5d 58 }
allonq 0:3cc7f3653a5d 59 return;
allonq 0:3cc7f3653a5d 60 }
allonq 0:3cc7f3653a5d 61
allonq 0:3cc7f3653a5d 62 int main() {
allonq 0:3cc7f3653a5d 63 buff = 0;
allonq 0:3cc7f3653a5d 64 received=false;
allonq 0:3cc7f3653a5d 65 pc.baud(BAUDRATE);
allonq 0:3cc7f3653a5d 66 //pc.printf("hello to the magic world\n");
allonq 0:3cc7f3653a5d 67 //pc.printf("minimumnum=%f\n",1.0/BAUDRATE);
allonq 0:3cc7f3653a5d 68
allonq 0:3cc7f3653a5d 69 //set interrupt
allonq 0:3cc7f3653a5d 70 MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS);
allonq 0:3cc7f3653a5d 71 MAG3110 mag(PTE25, PTE24);
allonq 0:3cc7f3653a5d 72 TSISensor tsi;
allonq 0:3cc7f3653a5d 73 //int aaattt=0;
allonq 0:3cc7f3653a5d 74 int accx,accy,accz;
allonq 0:3cc7f3653a5d 75 int magx,magy,magz;
allonq 0:3cc7f3653a5d 76 int light;
allonq 0:3cc7f3653a5d 77 int tsiPerc;
allonq 0:3cc7f3653a5d 78 int tsiDis;
allonq 0:3cc7f3653a5d 79 int analogin;
allonq 0:3cc7f3653a5d 80 char* select;
allonq 0:3cc7f3653a5d 81 int enable=256;
allonq 0:3cc7f3653a5d 82 int tmpf=0;
allonq 0:3cc7f3653a5d 83 int i,j;
allonq 0:3cc7f3653a5d 84 int threshold[15];
allonq 0:3cc7f3653a5d 85 int count[15];
allonq 0:3cc7f3653a5d 86 for(i=0;i<15;i++)threshold[i]=1;//BAUDRATE;
allonq 0:3cc7f3653a5d 87 for(i=0;i<15;i++)count[i]=0;
allonq 0:3cc7f3653a5d 88 bool output_en=0;
allonq 0:3cc7f3653a5d 89 char *tmp;
allonq 0:3cc7f3653a5d 90 //int fl2in;
allonq 0:3cc7f3653a5d 91 char* output;
allonq 0:3cc7f3653a5d 92 output=new char;
allonq 0:3cc7f3653a5d 93 pc.attach(&receive_handler,Serial::RxIrq);
allonq 0:3cc7f3653a5d 94 //pc.printf("enable=%d",enable);
allonq 0:3cc7f3653a5d 95 while (true) {
allonq 0:3cc7f3653a5d 96 if (received) {
allonq 0:3cc7f3653a5d 97 select=rx_buffer;
allonq 0:3cc7f3653a5d 98 //pc.printf("command=");
allonq 0:3cc7f3653a5d 99 //pc.printf(select);
allonq 0:3cc7f3653a5d 100 //pc.printf("\n");
allonq 0:3cc7f3653a5d 101 enable=0;
allonq 0:3cc7f3653a5d 102 enable=(int)(select[1]<<8)+(int)select[0];//record the command
allonq 0:3cc7f3653a5d 103
allonq 0:3cc7f3653a5d 104 i=2;
allonq 0:3cc7f3653a5d 105 int k=15;//indicate which channel
allonq 0:3cc7f3653a5d 106 while(i<buff){
allonq 0:3cc7f3653a5d 107 tmpf=0;
allonq 0:3cc7f3653a5d 108 for( j=0;j<4;j++){
allonq 0:3cc7f3653a5d 109 tmpf=(tmpf<<8)|select[i+j];
allonq 0:3cc7f3653a5d 110 }
allonq 0:3cc7f3653a5d 111 while(!((enable>>(15-k))&1)){
allonq 0:3cc7f3653a5d 112 k=k-1;
allonq 0:3cc7f3653a5d 113 }
allonq 0:3cc7f3653a5d 114 k=k-1;
allonq 0:3cc7f3653a5d 115
allonq 0:3cc7f3653a5d 116 threshold[14-k]=BAUDRATE/tmpf;
allonq 0:3cc7f3653a5d 117 i=i+4;
allonq 0:3cc7f3653a5d 118 }
allonq 0:3cc7f3653a5d 119 for (i=0;i<15;i++)count[i]=0;
allonq 0:3cc7f3653a5d 120
allonq 0:3cc7f3653a5d 121 //for(int o=0;o<15;o++){pc.printf("count=%d",count[o]);pc.printf("threshold=%d\n",threshold[o]);}
allonq 0:3cc7f3653a5d 122 //pc.printf("enable=%d\n",enable&1);
allonq 0:3cc7f3653a5d 123 //pc.putc('$');pc.putc('c');pc.putc('d');pc.putc('_');pc.putc('r');pc.putc('v');pc.putc('d');
allonq 0:3cc7f3653a5d 124 buff=0;
allonq 0:3cc7f3653a5d 125 for(i=0;i<15;i++)count[i]=0;
allonq 0:3cc7f3653a5d 126 received=false;
allonq 0:3cc7f3653a5d 127 }
allonq 0:3cc7f3653a5d 128 int output_map=0;
allonq 0:3cc7f3653a5d 129 output_en=false;
allonq 0:3cc7f3653a5d 130
allonq 0:3cc7f3653a5d 131 int opt=0;
allonq 0:3cc7f3653a5d 132 //pc.printf("nscanning\n");
allonq 0:3cc7f3653a5d 133 //for(int o=0;o<15;o++){pc.printf("count=%d",count[o]);pc.printf("threshold=%d\n",threshold[o]);}
allonq 0:3cc7f3653a5d 134 //pc.getc();
allonq 0:3cc7f3653a5d 135 if((count[0]>=threshold[0])&&(enable&(1))){
allonq 0:3cc7f3653a5d 136 output_map=output_map|(1);
allonq 0:3cc7f3653a5d 137 output_en=true;//output
allonq 0:3cc7f3653a5d 138 light=(int)(lightsensor.read()*10000);
allonq 0:3cc7f3653a5d 139 tmp=(char*)&light;//pc.printf("opt=%d",opt);
allonq 0:3cc7f3653a5d 140 output[opt]=(*(tmp+3));
allonq 0:3cc7f3653a5d 141 output[opt+1]=(*(tmp+2));
allonq 0:3cc7f3653a5d 142 output[opt+2]=(*(tmp+1));
allonq 0:3cc7f3653a5d 143 output[opt+3]=(*tmp);
allonq 0:3cc7f3653a5d 144 count[0]=1;
allonq 0:3cc7f3653a5d 145 opt=opt+4; }
allonq 0:3cc7f3653a5d 146 else count[0]++;
allonq 0:3cc7f3653a5d 147
allonq 0:3cc7f3653a5d 148 //light sensor
allonq 0:3cc7f3653a5d 149 if((count[1]>=threshold[1])&&(enable&(1<<1))){
allonq 0:3cc7f3653a5d 150 output_map=output_map|(1<<1);
allonq 0:3cc7f3653a5d 151 output_en=true;//output
allonq 0:3cc7f3653a5d 152 accx=(int)(acc.getAccX()*10000);
allonq 0:3cc7f3653a5d 153 tmp=(char*)&accx;//pc.printf("opt=%d",opt);
allonq 0:3cc7f3653a5d 154 output[opt]=(*(tmp+3));
allonq 0:3cc7f3653a5d 155 output[opt+1]=(*(tmp+2));
allonq 0:3cc7f3653a5d 156 output[opt+2]=(*(tmp+1));
allonq 0:3cc7f3653a5d 157 output[opt+3]=(*tmp);
allonq 0:3cc7f3653a5d 158 count[1]=1;
allonq 0:3cc7f3653a5d 159 opt=opt+4;}
allonq 0:3cc7f3653a5d 160 else count[1]++;
allonq 0:3cc7f3653a5d 161 //accx
allonq 0:3cc7f3653a5d 162
allonq 0:3cc7f3653a5d 163 if((count[2]>=threshold[2])&&(enable&(1<<2))){
allonq 0:3cc7f3653a5d 164 output_map=output_map|(1<<2);
allonq 0:3cc7f3653a5d 165 output_en=true;//output
allonq 0:3cc7f3653a5d 166 accy=(int)(acc.getAccY()*10000);
allonq 0:3cc7f3653a5d 167 tmp=(char*)&accy;//pc.printf("opt=%d",opt);
allonq 0:3cc7f3653a5d 168 output[opt]=(*(tmp+3));
allonq 0:3cc7f3653a5d 169 output[opt+1]=(*(tmp+2));
allonq 0:3cc7f3653a5d 170 output[opt+2]=(*(tmp+1));
allonq 0:3cc7f3653a5d 171 output[opt+3]=(*tmp);
allonq 0:3cc7f3653a5d 172 count[2]=1;
allonq 0:3cc7f3653a5d 173 opt=opt+4;}
allonq 0:3cc7f3653a5d 174 else count[2]++;
allonq 0:3cc7f3653a5d 175 //accy
allonq 0:3cc7f3653a5d 176 if((count[3]>=threshold[3])&&(enable&(1<<3))){
allonq 0:3cc7f3653a5d 177 output_map=output_map|(1<<3);
allonq 0:3cc7f3653a5d 178 output_en=true;//output
allonq 0:3cc7f3653a5d 179 accz=(int)(acc.getAccZ()*10000);
allonq 0:3cc7f3653a5d 180 tmp=(char*)&accz;//pc.printf("grav=%float",accz);
allonq 0:3cc7f3653a5d 181 output[opt]=(*(tmp+3));
allonq 0:3cc7f3653a5d 182 output[opt+1]=(*(tmp+2));
allonq 0:3cc7f3653a5d 183 output[opt+2]=(*(tmp+1));
allonq 0:3cc7f3653a5d 184 output[opt+3]=(*tmp);
allonq 0:3cc7f3653a5d 185 count[3]=1;
allonq 0:3cc7f3653a5d 186 opt=opt+4;}
allonq 0:3cc7f3653a5d 187 else count[3]++;
allonq 0:3cc7f3653a5d 188 //accz
allonq 0:3cc7f3653a5d 189 if((count[4]>=threshold[4])&&(enable&(1<<4))){
allonq 0:3cc7f3653a5d 190 output_map=output_map|(1<<4);
allonq 0:3cc7f3653a5d 191 output_en=true;//output
allonq 0:3cc7f3653a5d 192 magx=(int)(mag.getX()*10000);
allonq 0:3cc7f3653a5d 193 tmp=(char*)&magx;//pc.printf("opt=%d",opt);
allonq 0:3cc7f3653a5d 194 output[opt]=(*(tmp+3));
allonq 0:3cc7f3653a5d 195 output[opt+1]=(*(tmp+2));
allonq 0:3cc7f3653a5d 196 output[opt+2]=(*(tmp+1));
allonq 0:3cc7f3653a5d 197 output[opt+3]=(*tmp);
allonq 0:3cc7f3653a5d 198 count[4]=1;
allonq 0:3cc7f3653a5d 199 opt=opt+4;}
allonq 0:3cc7f3653a5d 200 else count[4]++;
allonq 0:3cc7f3653a5d 201 //magx
allonq 0:3cc7f3653a5d 202 if((count[5]>=threshold[5])&&(enable&(1<<5))){
allonq 0:3cc7f3653a5d 203 output_map=output_map|(1<<5);
allonq 0:3cc7f3653a5d 204 output_en=true;//output
allonq 0:3cc7f3653a5d 205 magy=(int)(mag.getY()*10000);
allonq 0:3cc7f3653a5d 206 tmp=(char*)&magy;//pc.printf("opt=%d",opt);
allonq 0:3cc7f3653a5d 207 output[opt]=(*(tmp+3));
allonq 0:3cc7f3653a5d 208 output[opt+1]=(*(tmp+2));
allonq 0:3cc7f3653a5d 209 output[opt+2]=(*(tmp+1));
allonq 0:3cc7f3653a5d 210 output[opt+3]=(*tmp);
allonq 0:3cc7f3653a5d 211 count[5]=1;
allonq 0:3cc7f3653a5d 212 opt=opt+4;}
allonq 0:3cc7f3653a5d 213 else count[5]++;
allonq 0:3cc7f3653a5d 214 //magy
allonq 0:3cc7f3653a5d 215 if((count[6]>=threshold[6])&&(enable&(1<<6))){
allonq 0:3cc7f3653a5d 216 output_map=output_map|(1<<6);
allonq 0:3cc7f3653a5d 217 magz=(int)(mag.getZ()*10000);
allonq 0:3cc7f3653a5d 218 output_en=true;//output
allonq 0:3cc7f3653a5d 219 tmp=(char*)&magz;//pc.printf("7");
allonq 0:3cc7f3653a5d 220 output[opt]=(*(tmp+3));
allonq 0:3cc7f3653a5d 221 output[opt+1]=(*(tmp+2));
allonq 0:3cc7f3653a5d 222 output[opt+2]=(*(tmp+1));
allonq 0:3cc7f3653a5d 223 output[opt+3]=(*tmp);
allonq 0:3cc7f3653a5d 224 count[6]=1;
allonq 0:3cc7f3653a5d 225 opt=opt+4;}
allonq 0:3cc7f3653a5d 226 else count[6]++;
allonq 0:3cc7f3653a5d 227 //magz
allonq 0:3cc7f3653a5d 228 if((count[7]>=threshold[7])&&(enable&(1<<7))){
allonq 0:3cc7f3653a5d 229 output_map=output_map|(1<<7);
allonq 0:3cc7f3653a5d 230 tsiPerc=(int)(tsi.readPercentage()*10000);
allonq 0:3cc7f3653a5d 231 output_en=true;//output
allonq 0:3cc7f3653a5d 232 tmp=(char*)&tsiPerc;//pc.printf("7");
allonq 0:3cc7f3653a5d 233 output[opt]=(*(tmp+3));
allonq 0:3cc7f3653a5d 234 output[opt+1]=(*(tmp+2));
allonq 0:3cc7f3653a5d 235 output[opt+2]=(*(tmp+1));
allonq 0:3cc7f3653a5d 236 output[opt+3]=(*tmp);
allonq 0:3cc7f3653a5d 237 count[7]=1;
allonq 0:3cc7f3653a5d 238 opt=opt+4;}
allonq 0:3cc7f3653a5d 239 else count[7]++;
allonq 0:3cc7f3653a5d 240 //TIS_perc
allonq 0:3cc7f3653a5d 241 if((count[8]>=threshold[8])&&(enable&(1<<8))){
allonq 0:3cc7f3653a5d 242 output_map=output_map|(1<<8);
allonq 0:3cc7f3653a5d 243 tsiDis=(int)(tsi.readDistance()*10000);
allonq 0:3cc7f3653a5d 244 output_en=true;//output
allonq 0:3cc7f3653a5d 245 tmp=(char*)&tsiDis;//pc.printf("8");
allonq 0:3cc7f3653a5d 246 output[opt]=(*(tmp+3));
allonq 0:3cc7f3653a5d 247 output[opt+1]=(*(tmp+2));
allonq 0:3cc7f3653a5d 248 output[opt+2]=(*(tmp+1));
allonq 0:3cc7f3653a5d 249 output[opt+3]=(*tmp);
allonq 0:3cc7f3653a5d 250 count[8]=1;
allonq 0:3cc7f3653a5d 251 opt=opt+4;}
allonq 0:3cc7f3653a5d 252 else count[8]++;
allonq 0:3cc7f3653a5d 253 //TIS_perc
allonq 0:3cc7f3653a5d 254 //touchs1=touch1.read();
allonq 0:3cc7f3653a5d 255 //touchs2=touch2.read();
allonq 0:3cc7f3653a5d 256
allonq 0:3cc7f3653a5d 257 if((count[9]>=threshold[9])&&(enable&(1<<9))){
allonq 0:3cc7f3653a5d 258 output_map=output_map|(1<<9);
allonq 0:3cc7f3653a5d 259 analogin=(int)(analoginput.read()*10000);
allonq 0:3cc7f3653a5d 260 output_en=true;//output
allonq 0:3cc7f3653a5d 261 tmp=(char*)&analogin;//pc.printf("opt=%d",opt);
allonq 0:3cc7f3653a5d 262 output[opt]=(*(tmp+3));
allonq 0:3cc7f3653a5d 263 output[opt+1]=(*(tmp+2));
allonq 0:3cc7f3653a5d 264 output[opt+2]=(*(tmp+1));
allonq 0:3cc7f3653a5d 265 output[opt+3]=(*tmp);
allonq 0:3cc7f3653a5d 266 count[9]=1;
allonq 0:3cc7f3653a5d 267 opt=opt+4;}
allonq 0:3cc7f3653a5d 268 else count[9]++;
allonq 0:3cc7f3653a5d 269
allonq 0:3cc7f3653a5d 270
allonq 0:3cc7f3653a5d 271 //analog channel 1#
allonq 0:3cc7f3653a5d 272 //----------OUTPUT----------
allonq 0:3cc7f3653a5d 273 if(output_en){
allonq 0:3cc7f3653a5d 274 //aaattt++;
allonq 0:3cc7f3653a5d 275 //if(aaattt==960){pc.printf("get960");aaattt=1;}
allonq 0:3cc7f3653a5d 276 //pc.printf("ok\n");
allonq 0:3cc7f3653a5d 277 //pc.printf("map=%d",output_map);
allonq 0:3cc7f3653a5d 278 pc.putc('#');//begin of a data
allonq 0:3cc7f3653a5d 279 //for(int o=0;o<15;o++)pc.printf("a=%d\n",output_map&(1<<o));
allonq 0:3cc7f3653a5d 280
allonq 0:3cc7f3653a5d 281 //pc.printf(output);
allonq 0:3cc7f3653a5d 282
allonq 0:3cc7f3653a5d 283 tmp=(char*)&output_map;
allonq 0:3cc7f3653a5d 284 pc.putc(*(tmp));
allonq 0:3cc7f3653a5d 285 pc.putc(*(tmp+1));
allonq 0:3cc7f3653a5d 286 for (int l=0;l<opt;l++) pc.putc(output[l]);
allonq 0:3cc7f3653a5d 287
allonq 0:3cc7f3653a5d 288 /*
allonq 0:3cc7f3653a5d 289 pc.printf("\n");
allonq 0:3cc7f3653a5d 290 pc.printf("c0=%d",count[0]);pc.printf("c1=%d",count[1]);pc.printf("c9=%d",count[9]);
allonq 0:3cc7f3653a5d 291 pc.printf("translate=%d",(int)(*(tmp+1)));
allonq 0:3cc7f3653a5d 292 pc.printf("translate=%d",(int)(*(tmp)));
allonq 0:3cc7f3653a5d 293 pc.printf("\n");
allonq 0:3cc7f3653a5d 294 int inttmp;
allonq 0:3cc7f3653a5d 295 for (i=0;i<8;i++){
allonq 0:3cc7f3653a5d 296 inttmp=0;
allonq 0:3cc7f3653a5d 297 for(int k=0;k<4;k++){
allonq 0:3cc7f3653a5d 298 inttmp=(inttmp<<8);
allonq 0:3cc7f3653a5d 299 inttmp+=((int)(output[4*i+k]));
allonq 0:3cc7f3653a5d 300 }
allonq 0:3cc7f3653a5d 301 pc.printf("output=%d\n",inttmp);
allonq 0:3cc7f3653a5d 302 }
allonq 0:3cc7f3653a5d 303 */
allonq 0:3cc7f3653a5d 304
allonq 0:3cc7f3653a5d 305
allonq 0:3cc7f3653a5d 306 //
allonq 0:3cc7f3653a5d 307 // pc.printf("finish\n");
allonq 0:3cc7f3653a5d 308 }
allonq 0:3cc7f3653a5d 309 //pc.printf("ck=%d",count[0]);
allonq 0:3cc7f3653a5d 310 wait_us(1000000/BAUDRATE);
allonq 0:3cc7f3653a5d 311 }
allonq 0:3cc7f3653a5d 312
allonq 0:3cc7f3653a5d 313 }