Voglio separare il protocollo di comunicazione dal mezzo di comunicazione in un progetto. Ad esempio, voglio avere una classe seriale e qualunque altra classe media e separatamente avere una classe di protocollo checksum e una classe di protocollo crc e così via. In questo modo, una classe di dispositivo può avere un puntatore di classe base membro per il mezzo e un altro per il protocollo e tramite le classi figlio del costruttore della classe di dispositivi di entrambi può essere passato.
Pseudo codice
class CDevice
{
public:
CDevice( CCommunicationDriver * drvr, CProtocol * protocol ) :
drvr_ ( drvr ),
protocol_ ( protocol )
{}
private:
CCommunicationDriver * drvr_;
CProtocol * protocol_;
};
class CCrcProtcol : public CProtocol
{};
class CSerial : public CCommunicationDriver
{};
CDevice a_device( new CSerial, new CCrcProtocol );
L'idea è che se la differenza tra 2 dispositivi è solo il mezzo e / o il protocollo, un semplice cambiamento può avere un impatto profondo. L'obiettivo è una riscrittura minima del codice per un cambiamento di questa natura.
In definitiva, immagino che il driver di comunicazione comprenda un CPacket che è un involucro sottile attorno a un vettore std ::. In questo modo l'interfaccia per il driver di comunicazione non deve cambiare in futuro. Prevedo che il vettore tenga i char non firmati (byte) poiché alla fine tutto quello che passa su un filo / mezzo è byte.
Questo porta a comandi disaccoppiati dal mezzo e protocollo anche se non completamente disaccoppiati. Quindi, un comando per accendere una luce potrebbe avere un ID 1 e un sotto-ID 2. Quello che penso che devo fare è passare i comandi figli alla funzione di trasmissione del driver [tx (CCommand *)] e far sì che questa funzione si applichi la decorazione del protocollo (non sono sicuro su come funzionerà ancora) e quindi ottenere un vettore di byte per far spingere il driver di comunicazione figlio fuori dal filo.
Quindi, ho 2 domande che potrei usare per aiutare. 1. (domanda principale) Poiché alla fine tutto finisce nello std :: vector < carattere non firmato > qual è un modo flessibile per aggiungere dati a quel vettore? Cioè un comando ha un id 2 byte lungo a causa di un protocollo ma per un altro è di 4 byte. Come faccio a passare id e 2 o 4 ad una funzione che la dividerà in singoli byte? Supponiamo che ci siano molte dimensioni (lunghezza 1, 2, 3, 4, 8, ecc.). Ho pensato a una funzione modello con cui specifichi il tipo e quindi il valore passato verrà interpretato come la dimensione di quel tipo. modello di < typename T > void addData (dati T) { // determinare il tipo di dati, analizzare in qualche modo? }
and also
template <typename T >
void addData( T data, int size )
{
// size is known but won't I have to specialize every size?
}
- La classe del protocollo dovrebbe essere un membro della classe del driver o tenerli separati?
Spero che questa lunga spiegazione di ciò che sto cercando di ottenere sia più utile che fastidiosa e che qualcuno abbia un'idea brillante.
Grazie. -G -