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
|
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
|
} |