76 lines
2.1 KiB
C++
76 lines
2.1 KiB
C++
|
#include <string.h>
|
||
|
#include "helpers.h"
|
||
|
#include "linkprotocol.h"
|
||
|
|
||
|
#define trace(...)
|
||
|
|
||
|
LinkProtocol::LinkProtocol(CdcCmd & g, MemoryBase & b) noexcept : cdccmd(g), ihx(), driver(b),
|
||
|
begin_addr(0), start_addr(0), lenght (0) {
|
||
|
}
|
||
|
void LinkProtocol::ParseLine (const char * line) {
|
||
|
const unsigned readen = strlen (line);
|
||
|
RowTypes t = ihx.parseRecord (line, readen);
|
||
|
switch (t) {
|
||
|
case dataRecord: AcquireDataRecord (); break;
|
||
|
case elaRecord: AcquireElaRecord (); break;
|
||
|
case slaRecord: AcquireSlaRecord (); break;
|
||
|
case eofRecord: AcquireEofRecord (); break;
|
||
|
case reqRecord: AcquireReqRecord (); break;
|
||
|
case ersRecord: AcquireErsRecord (); break;
|
||
|
default:
|
||
|
trace ("BAD record 0x%02X\r\n", t);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
void LinkProtocol::AcquireDataRecord() {
|
||
|
uint32_t ofs, len;
|
||
|
uint8_t * ptr = ihx.getDataRow (ofs, len);
|
||
|
uint32_t res = driver.Write (begin_addr + ofs, ptr, len);
|
||
|
if (res) {
|
||
|
SendAck();
|
||
|
ihx.AddOffset (res); // posun offsetu az po ack
|
||
|
return;
|
||
|
}
|
||
|
SendAck (false);
|
||
|
}
|
||
|
// První paket, který musí přijít při každé akci.
|
||
|
void LinkProtocol::AcquireElaRecord() {
|
||
|
ihx.getAddress (begin_addr);
|
||
|
trace("Begin = 0x%08X\r\n", begin_addr);
|
||
|
SendAck();
|
||
|
}
|
||
|
typedef void (*pHandler) (void);
|
||
|
void LinkProtocol::AcquireSlaRecord() {
|
||
|
ihx.getAddress (start_addr);
|
||
|
trace("Start = 0x%08X\r\n", start_addr);
|
||
|
}
|
||
|
void LinkProtocol::AcquireEofRecord() {
|
||
|
ihx.getLenght (lenght);
|
||
|
trace ("Lenght = %d\r\n", lenght);
|
||
|
SendAck();
|
||
|
}
|
||
|
void LinkProtocol::AcquireReqRecord() {
|
||
|
static constexpr unsigned chunk_size = 0x20;
|
||
|
uint8_t data [chunk_size];
|
||
|
uint32_t res, len, ofs;
|
||
|
len = chunk_size;
|
||
|
ihx.getOffset (ofs);
|
||
|
//trace ("AcquireReqRecord: %04X, len=%d\r\n", ofs, len);
|
||
|
res = driver.Read (begin_addr + ofs, data, len);
|
||
|
res = ihx.DataRecord(strbuf, data, res);
|
||
|
cdccmd.SendString (strbuf, res);
|
||
|
}
|
||
|
void LinkProtocol::AcquireErsRecord() {
|
||
|
uint32_t block;
|
||
|
ihx.getOffset (block);
|
||
|
driver.Erase (block);
|
||
|
SendAck();
|
||
|
}
|
||
|
|
||
|
void LinkProtocol::SendAck (bool ok) {
|
||
|
RowTypes t = ok ? ackRecord : nakRecord;
|
||
|
const uint32_t r = ihx.BTxRecord (strbuf, t);
|
||
|
cdccmd.SendString (strbuf, r);
|
||
|
}
|