William Reynolds
/
LPC_Bootloader
Diff: UUEncode.cpp
- Revision:
- 0:15536fa79743
- Child:
- 2:9e3ee0c6536b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/UUEncode.cpp Tue Sep 27 15:44:55 2011 +0000 @@ -0,0 +1,135 @@ +#include "mbed.h" +#include "LPC.h" + +//ENCODING FUNCTIONS BELOW +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 + int loop=0; int i; checksum=0; + for (int a=0; a<=63; a++) uuline[a]=0; + for (i=0; i<15; i++) { + if ((ch1=fgetc(f)) == EOF) //Padded with 0x00 making life easier when the end of the file is reached + ch1=0x00; + if ((ch2=fgetc(f)) == EOF) + ch2=0x00; + if ((ch3=fgetc(f)) == EOF) + ch3=0x00; + checksum +=3; + Encode3(); + uuline[1+(loop*4)]=n1; + uuline[2+(loop*4)]=n2; + uuline[3+(loop*4)]=n3; + uuline[4+(loop*4)]=n4; + loop++; + } + lastByte = 62; + uuline[0] = checksum+32; + uuline[61] = 0x0D; + uuline[62] = 0x0A; + return 0; +} + +int SerialBuffered:: Encode3() { //Does the actual raw encoding. Laid out in a less compact way to explicitly show the process going on + n1 = 0, n2 = 0, n3 = 0, n4 = 0; + sum20 += ch1+ch2+ch3; + if ((ch1-128)>=0) {ch1-=128; n1+=32;} + if ((ch1-64)>=0) {ch1-=64; n1+=16;} + if ((ch1-32)>=0) {ch1-=32; n1+=8;} + if ((ch1-16)>=0) {ch1-=16; n1+=4;} + if ((ch1-8)>=0) {ch1-=8; n1+=2;} + if ((ch1-4)>=0) {ch1-=4; n1+=1;} + + if ((ch1-2)>=0) {ch1-=2; n2+=32;} + if ((ch1-1)>=0) {ch1-=1; n2+=16;} + if ((ch2-128)>=0) {ch2-=128; n2+=8;} + if ((ch2-64)>=0) {ch2-=64; n2+=4;} + if ((ch2-32)>=0) {ch2-=32; n2+=2;} + if ((ch2-16)>=0) {ch2-=16; n2+=1;} + + if ((ch2-8)>=0) {ch2-=8; n3+=32;} + if ((ch2-4)>=0) {ch2-=4; n3+=16;} + if ((ch2-2)>=0) {ch2-=2; n3+=8;} + if ((ch2-1)>=0) {ch2-=1; n3+=4;} + if ((ch3-128)>=0) {ch3-=128; n3+=2;} + if ((ch3-64)>=0) {ch3-=64; n3+=1;} + + if ((ch3-32)>=0) {ch3-=32; n4+=32;} + if ((ch3-16)>=0) {ch3-=16; n4+=16;} + if ((ch3-8)>=0) {ch3-=8; n4+=8;} + if ((ch3-4)>=0) {ch3-=4; n4+=4;} + if ((ch3-2)>=0) {ch3-=2; n4+=2;} + if ((ch3-1)>=0) {ch3-=1; n4+=1;} + + if (n1 == 0x00) n1=0x60; + else n1+=0x20; + if (n2 == 0x00) n2=0x60; + else n2+=0x20; + if (n3 == 0x00) n3=0x60; + else n3+=0x20; + if (n4 == 0x00) n4=0x60; + else n4+=0x20; + return 0; +} + +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) + long int precheck = 0; + int a; + for (a=0; a<9; a++) { + ch1 = fgetc(f); ch2 = fgetc(f); ch3 = fgetc(f); + sum[a*3]=ch1; sum[(a*3)+1]=ch2; sum[(a*3)+2]=ch3; + } + ch1 = fgetc(f); fgetc(f); fgetc(f); fgetc(f); fgetc(f); //Ignores the 4 bytes which are to be overwritten + sum[27] = ch1; + + for (a=0; a<7; a++) { + sum1[a*4] = sum[a*4+3]; + sum1[a*4+1] = sum[a*4+2]; + sum1[a*4+2] = sum[a*4+1]; + sum1[a*4+3] = sum[a*4]; + precheck += (sum1[a*4]*0x1000000) + (sum1[a*4+1]*0x10000) + (sum1[a*4+2]*0x100) + sum1[a*4+3]; + } + precheck = ~precheck+1; //Takes the two's complement of the checksum + sum[28] = precheck & 0xFF; + sum[29] = (precheck >> 8) & 0xFF; + sum[30] = (precheck >>16) & 0xFF; + sum[31] = (precheck >>24) & 0xFF; + sum[32] = fgetc(f); + for (int a=33; a<46; a++) sum[a] = fgetc(f); + fseek(f, 0, SEEK_END); + filesize = ftell(f); + fclose(f); + f=fopen("/fs/delete.bin", "w"); //Opens a temporary file for writing to + fwrite (sum, 1, sizeof(sum), f); //Writes the checksum-added and encoded bytes + fclose(f); + f=fopen("/fs/delete.bin", "r"); //Opens the original binary file again for reading + UUEncode(); + return 0; +} + +int SerialBuffered::EndUUEncode() { //Encodes the last 124 bytes of a 1024 byte block + int loop=0; int i; checksum=0; + for (int a=0; a<=50; a++) enduuline[a]=0; + for (i=1; i<=12; i++) { + if ((ch1=fgetc(f)) == EOF) + ch1=0x00; + if ((ch2=fgetc(f)) == EOF) + ch2=0x00; + if ((ch3=fgetc(f)) == EOF) + ch3=0x00; + checksum +=3; + if (loop==11) { + checksum-=2; + fseek (f, -2, SEEK_CUR); + ch2=0x00; ch3=0x00; + } + Encode3(); + enduuline[1+(loop*4)]=n1; + enduuline[2+(loop*4)]=n2; + enduuline[3+(loop*4)]=n3; + enduuline[4+(loop*4)]=n4; + loop++; + } + lastByte = 51; + enduuline[0] = checksum+32; + enduuline[49] = 0x0D; + enduuline[50] = 0x0A; + return 0; +} \ No newline at end of file