#ifndef LINKPROTOCOL_H #define LINKPROTOCOL_H #include #include "intelhex.h" class CdcCmd; class MemoryBase; /** * @class LinkProtocol * @brief Protokol po CDC. * * Vychází z formátu IntelHex. komunikaci začíná PC, modul odpovídá. První co musí PC (vždy na začátku konunikace !) poslat * je paket ElaRecord (4), který určuje počáteční adresu - podle ní modul vybere potřebný ovladač paměti. Formy komunikace : * -# Mazání obsahu flash. Probíhá po jednotlivých blocích. * - PC -> MODUL : ersRecord (v poli offset číslo bloku relativně k počátku typu paměti) * - MODUL -> PC : ackRecord (v poli offset číslo bloku relativně k počátku typu paměti) * -# Zápis dat do paměti. * - PC -> MODUL : dataRecord (max. 32 bytů) * - MODUL -> PC : ackRecord nebo nakRecord pokud je cosi špatně * -# Čtení dat z paměti. * - PC -> MODUL : reqRecord (v poli offset odkud chci číst) * - MODUL -> PC : dataRecord - pokud má nulovou délku, další data nejsou. Posílána je délka 32 bytů. * -# Spuštění uživatelského programu. * - PC -> MODUL : slaRecord * - bez odpovědi - je to jen pro uživatelské testy a může to špatně skončit. Vlastně je to přidáno * jen proto, že to jde. * */ class LinkProtocol { static constexpr unsigned strbuflen = 0x80u; public: explicit LinkProtocol(CdcCmd & g, MemoryBase & b) noexcept; void ParseLine (const char * line); protected: void AcquireDataRecord (); void AcquireElaRecord (); void AcquireSlaRecord (); void AcquireEofRecord (); void AcquireReqRecord (); void AcquireErsRecord (); void SendAck (bool ok=true); private: CdcCmd & cdccmd; IntelHex ihx; MemoryBase & driver; uint32_t begin_addr; uint32_t start_addr; uint32_t lenght; char strbuf [strbuflen]; }; #endif // LINKPROTOCOL_H