Dependencies:   mbed

Committer:
daugihao
Date:
Fri Sep 30 14:55:11 2011 +0000
Revision:
7:d0f98d61ec4c
Parent:
2:9e3ee0c6536b
Some slight alterations and comment addition

Who changed what in which revision?

UserRevisionLine numberNew contents of line
daugihao 0:15536fa79743 1 #include "mbed.h"
daugihao 0:15536fa79743 2 #include "LPC.h"
daugihao 0:15536fa79743 3
daugihao 0:15536fa79743 4 //ENCODING FUNCTIONS BELOW
daugihao 0:15536fa79743 5 int SerialBuffered::UUEncode() { //Encodes the next 45 bytes in the file into a UUEncoded string with checksum and LF/CR characters ready to be sent to the board
daugihao 0:15536fa79743 6 int loop=0; int i; checksum=0;
daugihao 0:15536fa79743 7 for (int a=0; a<=63; a++) uuline[a]=0;
daugihao 0:15536fa79743 8 for (i=0; i<15; i++) {
daugihao 0:15536fa79743 9 if ((ch1=fgetc(f)) == EOF) //Padded with 0x00 making life easier when the end of the file is reached
daugihao 0:15536fa79743 10 ch1=0x00;
daugihao 0:15536fa79743 11 if ((ch2=fgetc(f)) == EOF)
daugihao 0:15536fa79743 12 ch2=0x00;
daugihao 0:15536fa79743 13 if ((ch3=fgetc(f)) == EOF)
daugihao 0:15536fa79743 14 ch3=0x00;
daugihao 0:15536fa79743 15 checksum +=3;
daugihao 0:15536fa79743 16 Encode3();
daugihao 0:15536fa79743 17 uuline[1+(loop*4)]=n1;
daugihao 0:15536fa79743 18 uuline[2+(loop*4)]=n2;
daugihao 0:15536fa79743 19 uuline[3+(loop*4)]=n3;
daugihao 0:15536fa79743 20 uuline[4+(loop*4)]=n4;
daugihao 0:15536fa79743 21 loop++;
daugihao 0:15536fa79743 22 }
daugihao 0:15536fa79743 23 uuline[0] = checksum+32;
daugihao 0:15536fa79743 24 uuline[61] = 0x0D;
daugihao 0:15536fa79743 25 uuline[62] = 0x0A;
daugihao 2:9e3ee0c6536b 26 uuline[63] = 0x00;
daugihao 0:15536fa79743 27 return 0;
daugihao 0:15536fa79743 28 }
daugihao 0:15536fa79743 29
daugihao 0:15536fa79743 30 int SerialBuffered:: Encode3() { //Does the actual raw encoding. Laid out in a less compact way to explicitly show the process going on
daugihao 0:15536fa79743 31 n1 = 0, n2 = 0, n3 = 0, n4 = 0;
daugihao 0:15536fa79743 32 sum20 += ch1+ch2+ch3;
daugihao 0:15536fa79743 33 if ((ch1-128)>=0) {ch1-=128; n1+=32;}
daugihao 0:15536fa79743 34 if ((ch1-64)>=0) {ch1-=64; n1+=16;}
daugihao 0:15536fa79743 35 if ((ch1-32)>=0) {ch1-=32; n1+=8;}
daugihao 0:15536fa79743 36 if ((ch1-16)>=0) {ch1-=16; n1+=4;}
daugihao 0:15536fa79743 37 if ((ch1-8)>=0) {ch1-=8; n1+=2;}
daugihao 0:15536fa79743 38 if ((ch1-4)>=0) {ch1-=4; n1+=1;}
daugihao 0:15536fa79743 39
daugihao 0:15536fa79743 40 if ((ch1-2)>=0) {ch1-=2; n2+=32;}
daugihao 0:15536fa79743 41 if ((ch1-1)>=0) {ch1-=1; n2+=16;}
daugihao 0:15536fa79743 42 if ((ch2-128)>=0) {ch2-=128; n2+=8;}
daugihao 0:15536fa79743 43 if ((ch2-64)>=0) {ch2-=64; n2+=4;}
daugihao 0:15536fa79743 44 if ((ch2-32)>=0) {ch2-=32; n2+=2;}
daugihao 0:15536fa79743 45 if ((ch2-16)>=0) {ch2-=16; n2+=1;}
daugihao 0:15536fa79743 46
daugihao 0:15536fa79743 47 if ((ch2-8)>=0) {ch2-=8; n3+=32;}
daugihao 0:15536fa79743 48 if ((ch2-4)>=0) {ch2-=4; n3+=16;}
daugihao 0:15536fa79743 49 if ((ch2-2)>=0) {ch2-=2; n3+=8;}
daugihao 0:15536fa79743 50 if ((ch2-1)>=0) {ch2-=1; n3+=4;}
daugihao 0:15536fa79743 51 if ((ch3-128)>=0) {ch3-=128; n3+=2;}
daugihao 0:15536fa79743 52 if ((ch3-64)>=0) {ch3-=64; n3+=1;}
daugihao 0:15536fa79743 53
daugihao 0:15536fa79743 54 if ((ch3-32)>=0) {ch3-=32; n4+=32;}
daugihao 0:15536fa79743 55 if ((ch3-16)>=0) {ch3-=16; n4+=16;}
daugihao 0:15536fa79743 56 if ((ch3-8)>=0) {ch3-=8; n4+=8;}
daugihao 0:15536fa79743 57 if ((ch3-4)>=0) {ch3-=4; n4+=4;}
daugihao 0:15536fa79743 58 if ((ch3-2)>=0) {ch3-=2; n4+=2;}
daugihao 0:15536fa79743 59 if ((ch3-1)>=0) {ch3-=1; n4+=1;}
daugihao 0:15536fa79743 60
daugihao 0:15536fa79743 61 if (n1 == 0x00) n1=0x60;
daugihao 0:15536fa79743 62 else n1+=0x20;
daugihao 0:15536fa79743 63 if (n2 == 0x00) n2=0x60;
daugihao 0:15536fa79743 64 else n2+=0x20;
daugihao 0:15536fa79743 65 if (n3 == 0x00) n3=0x60;
daugihao 0:15536fa79743 66 else n3+=0x20;
daugihao 0:15536fa79743 67 if (n4 == 0x00) n4=0x60;
daugihao 0:15536fa79743 68 else n4+=0x20;
daugihao 0:15536fa79743 69 return 0;
daugihao 0:15536fa79743 70 }
daugihao 0:15536fa79743 71
daugihao 0:15536fa79743 72 int SerialBuffered::FirstEncode() { //Function to add two's complement of the first 7 DWORDs into the space occupied by the 8th DWORD (DWORDs 1-8 should add to zero)
daugihao 0:15536fa79743 73 long int precheck = 0;
daugihao 0:15536fa79743 74 int a;
daugihao 0:15536fa79743 75 for (a=0; a<9; a++) {
daugihao 0:15536fa79743 76 ch1 = fgetc(f); ch2 = fgetc(f); ch3 = fgetc(f);
daugihao 0:15536fa79743 77 sum[a*3]=ch1; sum[(a*3)+1]=ch2; sum[(a*3)+2]=ch3;
daugihao 0:15536fa79743 78 }
daugihao 0:15536fa79743 79 ch1 = fgetc(f); fgetc(f); fgetc(f); fgetc(f); fgetc(f); //Ignores the 4 bytes which are to be overwritten
daugihao 0:15536fa79743 80 sum[27] = ch1;
daugihao 0:15536fa79743 81
daugihao 0:15536fa79743 82 for (a=0; a<7; a++) {
daugihao 0:15536fa79743 83 sum1[a*4] = sum[a*4+3];
daugihao 0:15536fa79743 84 sum1[a*4+1] = sum[a*4+2];
daugihao 0:15536fa79743 85 sum1[a*4+2] = sum[a*4+1];
daugihao 0:15536fa79743 86 sum1[a*4+3] = sum[a*4];
daugihao 0:15536fa79743 87 precheck += (sum1[a*4]*0x1000000) + (sum1[a*4+1]*0x10000) + (sum1[a*4+2]*0x100) + sum1[a*4+3];
daugihao 0:15536fa79743 88 }
daugihao 0:15536fa79743 89 precheck = ~precheck+1; //Takes the two's complement of the checksum
daugihao 0:15536fa79743 90 sum[28] = precheck & 0xFF;
daugihao 0:15536fa79743 91 sum[29] = (precheck >> 8) & 0xFF;
daugihao 0:15536fa79743 92 sum[30] = (precheck >>16) & 0xFF;
daugihao 0:15536fa79743 93 sum[31] = (precheck >>24) & 0xFF;
daugihao 0:15536fa79743 94 sum[32] = fgetc(f);
daugihao 0:15536fa79743 95 for (int a=33; a<46; a++) sum[a] = fgetc(f);
daugihao 0:15536fa79743 96 fseek(f, 0, SEEK_END);
daugihao 0:15536fa79743 97 filesize = ftell(f);
daugihao 0:15536fa79743 98 fclose(f);
daugihao 0:15536fa79743 99 f=fopen("/fs/delete.bin", "w"); //Opens a temporary file for writing to
daugihao 0:15536fa79743 100 fwrite (sum, 1, sizeof(sum), f); //Writes the checksum-added and encoded bytes
daugihao 0:15536fa79743 101 fclose(f);
daugihao 0:15536fa79743 102 f=fopen("/fs/delete.bin", "r"); //Opens the original binary file again for reading
daugihao 0:15536fa79743 103 UUEncode();
daugihao 0:15536fa79743 104 return 0;
daugihao 0:15536fa79743 105 }
daugihao 0:15536fa79743 106
daugihao 0:15536fa79743 107 int SerialBuffered::EndUUEncode() { //Encodes the last 124 bytes of a 1024 byte block
daugihao 0:15536fa79743 108 int loop=0; int i; checksum=0;
daugihao 0:15536fa79743 109 for (int a=0; a<=50; a++) enduuline[a]=0;
daugihao 0:15536fa79743 110 for (i=1; i<=12; i++) {
daugihao 0:15536fa79743 111 if ((ch1=fgetc(f)) == EOF)
daugihao 0:15536fa79743 112 ch1=0x00;
daugihao 0:15536fa79743 113 if ((ch2=fgetc(f)) == EOF)
daugihao 0:15536fa79743 114 ch2=0x00;
daugihao 0:15536fa79743 115 if ((ch3=fgetc(f)) == EOF)
daugihao 0:15536fa79743 116 ch3=0x00;
daugihao 0:15536fa79743 117 checksum +=3;
daugihao 0:15536fa79743 118 if (loop==11) {
daugihao 0:15536fa79743 119 checksum-=2;
daugihao 0:15536fa79743 120 fseek (f, -2, SEEK_CUR);
daugihao 0:15536fa79743 121 ch2=0x00; ch3=0x00;
daugihao 0:15536fa79743 122 }
daugihao 0:15536fa79743 123 Encode3();
daugihao 0:15536fa79743 124 enduuline[1+(loop*4)]=n1;
daugihao 0:15536fa79743 125 enduuline[2+(loop*4)]=n2;
daugihao 0:15536fa79743 126 enduuline[3+(loop*4)]=n3;
daugihao 0:15536fa79743 127 enduuline[4+(loop*4)]=n4;
daugihao 0:15536fa79743 128 loop++;
daugihao 0:15536fa79743 129 }
daugihao 0:15536fa79743 130 enduuline[0] = checksum+32;
daugihao 0:15536fa79743 131 enduuline[49] = 0x0D;
daugihao 0:15536fa79743 132 enduuline[50] = 0x0A;
daugihao 2:9e3ee0c6536b 133 enduuline[51] = 0x00;
daugihao 0:15536fa79743 134 return 0;
daugihao 0:15536fa79743 135 }