25
25
26
26
bool FileManager::loadFromFile (EEPROM *eeprom, QString filename) {
27
27
QFile file (filename);
28
- if (!file.exists () || file. size () != 2048 )
28
+ if (!file.exists ())
29
29
return false ;
30
30
31
31
if (!file.open (QIODevice::ReadOnly))
32
32
return false ;
33
33
34
- QByteArray data = file.readAll ();
34
+ QByteArray rawData = file.readAll ();
35
+ QByteArray data = parseFile (rawData);
35
36
file.close ();
36
37
38
+ if (data.length () != 2048 )
39
+ return false ;
40
+
37
41
eeprom->setData (data);
38
42
39
43
return true ;
@@ -50,3 +54,73 @@ bool FileManager::saveToFile(EEPROM *eeprom, QString filename) {
50
54
51
55
return true ;
52
56
}
57
+
58
+ QByteArray FileManager::parseFile (const QByteArray &rawData) {
59
+ QByteArray data;
60
+
61
+ if (rawData.size () == 2048 ) {
62
+ data = rawData;
63
+ } else if (isIntelHex (rawData)) {
64
+ data = intelHexToByteArray (rawData);
65
+ }
66
+
67
+ return data;
68
+ }
69
+
70
+ bool FileManager::isIntelHex (const QByteArray &rawFile) {
71
+ QStringList rows = splitInLines (rawFile);
72
+
73
+ for (const QString &row : rows)
74
+ if (!row.startsWith (" :" ))
75
+ return false ;
76
+
77
+ return rows.last () == " :00000001FF" ;
78
+
79
+ }
80
+
81
+ QStringList FileManager::splitInLines (const QByteArray &rawData) {
82
+ QString rawFileString = QString::fromLatin1 (rawData);
83
+ QStringList rows = rawFileString.replace (' \r ' , ' \n ' ).split (' \n ' , QString::SkipEmptyParts);
84
+ return rows;
85
+ }
86
+
87
+ QByteArray FileManager::intelHexToByteArray (const QByteArray &rawData) {
88
+ QStringList rows = splitInLines (rawData);
89
+
90
+ QByteArray data;
91
+ int previousOffest = 0 ;
92
+
93
+ for (const QString &row : rows) {
94
+ unsigned int checksum = 0 ;
95
+ for (auto &c : QByteArray::fromHex (row.toLatin1 ()))
96
+ checksum += (unsigned char ) c;
97
+
98
+ checksum &= 0b11111111 ;
99
+
100
+ if (checksum != 0 )
101
+ return QByteArray ();
102
+
103
+ int size = row.mid (1 , 2 ).toInt (nullptr , 16 );
104
+ int offset = row.mid (3 , 4 ).toInt (nullptr , 16 );
105
+ int type = row.mid (7 , 2 ).toInt (nullptr , 16 );
106
+ QByteArray lineData = QByteArray::fromHex (row.mid (9 , size * 2 ).toLatin1 ());
107
+
108
+ if (type == 0x01 )
109
+ break ;
110
+ if (type != 0x00 )
111
+ continue ;
112
+
113
+ if (offset != previousOffest)
114
+ return QByteArray ();
115
+
116
+ previousOffest = offset + size;
117
+
118
+
119
+ if (lineData.size () != size)
120
+ return QByteArray ();
121
+
122
+ data.append (lineData);
123
+ }
124
+
125
+ return data;
126
+ }
0 commit comments