Det hela handlar om en meddelande pool där man har en gemensam buffer där man lägger sina meddelanden. Därefter har man "användare" som håller koll på vilket det senaste meddelandet var som man läst och kan på så sätt hålla koll på antal olästa meddelanden var för sig.
Det har blivit en hel del kod och jag tror inte att någon orkar läsa genom mina filer så jag tänkte pressentera en förenklad variant.
meddelandet ser ung ut såhär:
Kod: Markera allt
typedef struct
{
uint8_t type;
uint8_t size;
uint8_t payload[8];
}msgPacketBase_t
det finns en basklass för meddelandet:
Kod: Markera allt
class msgBase
{
void headerToString(uint8_t *outStr, uint32_t strSize);
virtual void payloadToString(uint8_t *outStr, uint32_t strSize); // skriver ut payload som rena hex-värden
void convertBaseToDerived(void);
}
Kod: Markera allt
class msgTime: public msgBase
{
void payloadToString(uint8_t *outStr, uint32_t strSize); // skriver ut payload som en tolkning av tiden.
}
Det jag skulle vilja göra är att kunna omvandla sin bas-klass till en specifik typ av klass.
Kod: Markera allt
void printPayload( msgPacketBase_t *ptr)
{
msgBase myMsg(*ptr);
myMsg.convertBaseToDerived();
pritf("%s", myMsg.payloadToString();
}
Kod: Markera allt
this = <static_cast>(msgTime*)this;
går det att skapa en ny klass på samma adress som den gamla klassen?
eller finns det något smidigare sätt att ha en funktion i bas-klassen som kan omvandla sig själv till lämplig typ av meddelande?
ett annat alternativ skulle kunna vara att låta bufferten innehålla klasser istället för meddelanden. men då skulle jag vilja skapa en klass direkt i bufferten utan att behöva göra en kopiering från en variabel till bufferten. Dessutom klagar kompilatorn på att en array av klasser behöver initieras, vilket jag i detta fallet inte är intresserad av. klasserna kommer initieras när man lägger till dem i bufferten.
Misstänker att detta är väldigt enklet, har sökt en del på polymorphism och derived classes men har inte hittat något vettigt ännnu.