William Reynolds
/
LPC_Bootloader
UUEncode.cpp@0:15536fa79743, 2011-09-27 (annotated)
- Committer:
- daugihao
- Date:
- Tue Sep 27 15:44:55 2011 +0000
- Revision:
- 0:15536fa79743
- Child:
- 2:9e3ee0c6536b
Who changed what in which revision?
User | Revision | Line number | New 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 | lastByte = 62; |
daugihao | 0:15536fa79743 | 24 | uuline[0] = checksum+32; |
daugihao | 0:15536fa79743 | 25 | uuline[61] = 0x0D; |
daugihao | 0:15536fa79743 | 26 | uuline[62] = 0x0A; |
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 | lastByte = 51; |
daugihao | 0:15536fa79743 | 131 | enduuline[0] = checksum+32; |
daugihao | 0:15536fa79743 | 132 | enduuline[49] = 0x0D; |
daugihao | 0:15536fa79743 | 133 | enduuline[50] = 0x0A; |
daugihao | 0:15536fa79743 | 134 | return 0; |
daugihao | 0:15536fa79743 | 135 | } |