10
10
#include < QTextCursor>
11
11
12
12
#define READ_ACK_TIMEOUT 5000
13
- #define BUF_SIZE 64
14
-
15
- Q_DECLARE_METATYPE (QtMsgType)
16
13
17
14
void Writer::init (const QString &portName, qint32 baudRate, uint8_t *buf,
18
15
uint32_t addr, uint32_t len, uint32_t pageSize, bool skipBB, bool incSpare,
@@ -31,9 +28,10 @@ void Writer::init(const QString &portName, qint32 baudRate, uint8_t *buf,
31
28
this ->endCmd = endCmd;
32
29
bytesWritten = 0 ;
33
30
bytesAcked = 0 ;
31
+ offset = 0 ;
34
32
}
35
33
36
- int Writer::write (uint8_t *data, uint32_t dataLen)
34
+ int Writer::write (char *data, uint32_t dataLen)
37
35
{
38
36
qint64 ret;
39
37
@@ -50,25 +48,18 @@ int Writer::write(uint8_t *data, uint32_t dataLen)
50
48
return 0 ;
51
49
}
52
50
53
- int Writer::read (uint8_t *data, uint32_t dataLen)
51
+ int Writer::read (char *data, uint32_t dataLen)
54
52
{
55
- qint64 ret;
56
-
57
- // TODO: handle timeout
58
- // if (!serialPort->waitForReadyRead(READ_ACK_TIMEOUT))
59
- // {
60
- // logErr("Write ACK was not received");
61
- // return -1;
62
- // }
53
+ std::function<void (int )> cb = std::bind (&Writer::readCb, this ,
54
+ std::placeholders::_1);
63
55
64
- ret = serialPort->read ( reinterpret_cast < char *>( data) , dataLen);
65
- if (ret < 0 )
56
+ if ( serialPort->asyncReadWithTimeout ( data, dataLen, cb, READ_ACK_TIMEOUT)
57
+ < 0 )
66
58
{
67
- logErr (" Failed to read ACK" );
68
59
return -1 ;
69
60
}
70
61
71
- return static_cast < int >(ret) ;
62
+ return 0 ;
72
63
}
73
64
74
65
int Writer::handleWriteAck (RespHeader *header, uint32_t len)
@@ -125,7 +116,7 @@ int Writer::handleError(RespHeader *header, uint32_t len)
125
116
return -1 ;
126
117
}
127
118
128
- int Writer::handleStatus (uint8_t *pbuf, uint32_t len)
119
+ int Writer::handleStatus (char *pbuf, uint32_t len)
129
120
{
130
121
RespHeader *header = reinterpret_cast <RespHeader *>(pbuf);
131
122
uint8_t status = header->info ;
@@ -148,7 +139,7 @@ int Writer::handleStatus(uint8_t *pbuf, uint32_t len)
148
139
return -1 ;
149
140
}
150
141
151
- int Writer::handlePacket (uint8_t *pbuf, uint32_t len)
142
+ int Writer::handlePacket (char *pbuf, uint32_t len)
152
143
{
153
144
RespHeader *header = reinterpret_cast <RespHeader *>(pbuf);
154
145
@@ -165,7 +156,7 @@ int Writer::handlePacket(uint8_t *pbuf, uint32_t len)
165
156
return handleStatus (pbuf, len);
166
157
}
167
158
168
- int Writer::handlePackets (uint8_t *pbuf, uint32_t len)
159
+ int Writer::handlePackets (char *pbuf, uint32_t len)
169
160
{
170
161
int ret;
171
162
uint32_t offset = 0 ;
@@ -188,26 +179,50 @@ int Writer::handlePackets(uint8_t *pbuf, uint32_t len)
188
179
return static_cast <int >(len - offset);
189
180
}
190
181
191
- int Writer::readData ( )
182
+ void Writer::readCb ( int size )
192
183
{
193
- uint8_t pbuf[BUF_SIZE];
194
- int len, offset = 0 ;
184
+ if (size < 0 )
185
+ goto Error ;
195
186
196
- do
187
+ size += offset;
188
+
189
+ if ((offset = handlePackets (pbuf, static_cast <uint32_t >(size))) < 0 )
190
+ goto Error;
191
+
192
+ if (offset)
193
+ {
194
+ if (read (pbuf + offset, bufSize - offset) < 0 )
195
+ goto Error;
196
+ return ;
197
+ }
198
+
199
+ if (cmd == startCmd)
197
200
{
198
- if ((len = read (pbuf + offset,
199
- static_cast <uint32_t >(BUF_SIZE - offset))) < 0 )
201
+ if (writeData ())
202
+ goto Error;
203
+ }
204
+ else if (cmd == dataCmd)
205
+ {
206
+ if (len)
200
207
{
201
- return -1 ;
208
+ if (writeData ())
209
+ goto Error;
202
210
}
203
- len += offset;
204
-
205
- if ((offset = handlePackets (pbuf, static_cast <uint32_t >(len))) < 0 )
206
- return -1 ;
211
+ else if (writeEnd ())
212
+ goto Error;
213
+ }
214
+ else if (cmd == endCmd)
215
+ {
216
+ emit result (0 );
217
+ goto Exit;
207
218
}
208
- while (offset);
209
219
210
- return 0 ;
220
+ return ;
221
+
222
+ Error:
223
+ emit result (-1 );
224
+ Exit:
225
+ serialPortDestroy ();
211
226
}
212
227
213
228
int Writer::writeStart ()
@@ -219,28 +234,29 @@ int Writer::writeStart()
219
234
writeStartCmd.len = len;
220
235
writeStartCmd.flags .skipBB = skipBB;
221
236
writeStartCmd.flags .incSpare = incSpare;
237
+ cmd = startCmd;
222
238
223
- if (write (reinterpret_cast <uint8_t *>(&writeStartCmd),
239
+ if (write (reinterpret_cast <char *>(&writeStartCmd),
224
240
sizeof (WriteStartCmd)))
225
241
{
226
242
return -1 ;
227
243
}
228
244
229
- if (readData ( ))
245
+ if (read (pbuf, bufSize ))
230
246
return -1 ;
231
247
232
248
return 0 ;
233
249
}
234
250
235
251
int Writer::writeData ()
236
252
{
237
- uint8_t pbuf[BUF_SIZE];
238
253
WriteDataCmd *writeDataCmd = reinterpret_cast <WriteDataCmd *>(pbuf);
239
254
uint32_t dataLen, dataLenMax, headerLen, pageLim;
240
255
241
256
writeDataCmd->cmd .code = dataCmd;
242
257
headerLen = sizeof (WriteDataCmd);
243
- dataLenMax = BUF_SIZE - headerLen;
258
+ dataLenMax = bufSize - headerLen;
259
+ cmd = dataCmd;
244
260
245
261
while (len)
246
262
{
@@ -258,13 +274,13 @@ int Writer::writeData()
258
274
bytesWritten += dataLen;
259
275
len -= dataLen;
260
276
261
- if (len && bytesWritten != pageLim)
262
- continue ;
263
-
264
- if (readData ())
265
- return -1 ;
277
+ if (!len || bytesWritten == pageLim)
278
+ break ;
266
279
}
267
280
281
+ if (read (pbuf, bufSize))
282
+ return -1 ;
283
+
268
284
return 0 ;
269
285
}
270
286
@@ -273,11 +289,12 @@ int Writer::writeEnd()
273
289
WriteEndCmd writeEndCmd;
274
290
275
291
writeEndCmd.cmd .code = endCmd;
292
+ cmd = endCmd;
276
293
277
- if (write (reinterpret_cast <uint8_t *>(&writeEndCmd), sizeof (WriteEndCmd)))
294
+ if (write (reinterpret_cast <char *>(&writeEndCmd), sizeof (WriteEndCmd)))
278
295
return -1 ;
279
296
280
- if (readData ( ))
297
+ if (read (pbuf, bufSize ))
281
298
return -1 ;
282
299
283
300
return 0 ;
@@ -287,16 +304,8 @@ int Writer::serialPortCreate()
287
304
{
288
305
serialPort = new SerialPort ();
289
306
290
-
291
- // TODO: Handle error
292
- // if (!serialPort->open(QIODevice::ReadWrite))
293
- // {
294
- // logErr(QString("Failed to open serial port: %1")
295
- // .arg(serialPort->errorString()));
296
- // return -1;
297
- // }
298
-
299
- serialPort->start (portName.toLatin1 (), baudRate);
307
+ if (!serialPort->start (portName.toLatin1 (), baudRate))
308
+ return -1 ;
300
309
301
310
return 0 ;
302
311
}
@@ -307,27 +316,19 @@ void Writer::serialPortDestroy()
307
316
free (serialPort);
308
317
}
309
318
310
- void Writer::run ()
319
+ void Writer::start ()
311
320
{
312
- int ret = -1 ;
313
-
314
- /* Required for logger */
315
- qRegisterMetaType<QtMsgType>();
316
-
317
321
if (serialPortCreate ())
318
322
goto Exit;
319
323
320
324
if (writeStart ())
321
325
goto Exit;
322
- if (writeData ())
323
- goto Exit;
324
- if (writeEnd ())
325
- goto Exit;
326
326
327
- ret = 0 ;
327
+ return ;
328
+
328
329
Exit:
329
330
serialPortDestroy ();
330
- emit result (ret );
331
+ emit result (- 1 );
331
332
}
332
333
333
334
void Writer::logErr (const QString& msg)
0 commit comments