#include #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); }