Ich bastle gerade an einer Lib und da sollte ich einem Objekt diverse Werte übergeben können.
"Initialisierungsliste" im Constructor ist mir bekannt und verwende ich auch in anderen Projekten.
Die Frage die sich mir nun stellt:
Was ist den eigentlich der bevorzugte Weg "viele" Einstellungen an ein Objekt zu geben?
"Viele" sind aktuell knapp 20 Werte die ich beim Anlegen des Objektes definieren möchte, aber in Zukunft mehr werden könnten.
Die Werte müssen zur Laufzeit nicht geändert werden können. Können also const sein.
Aber ich denke mir eine Initialisierungsliste mit 20 Werten ist ja nicht mehr wirklich für den Anwender übersichtlich.
20 setter schreiben und die Werte übergeben finde ich auch nicht übersichtlich (und wie gesagt, könnten eigentlich alle konstant sein).
Ich habe es nun über ein struct probiert (ähnlich wie in in der MCCI bzw. LMIC Library).
Im Usersketch beispiel.ino
const ModbusConf modbusConf = {
addrWrite : 42,
addrWriteOld : 1,
addrBegin : 2,
addrSetDelay : 3,
addrCommand : 4,
addrClear : 5,
addrHome : 6,
addrSetCursor : 7,
addrCursor : 8,
addrBlink : 9,
addrSetBacklight : 10,
addrStream : 11,
addrCreateChar : 12
};
LiquidCrystal_Modbus lcd(node); // you must hand over the Modbus Node Object
in der neuelib.h deklariere ich das struct und verweise auf die externe Struktur (weils ja im Usersketch ist).
struct ModbusConf {
uint16_t addrWrite;
uint16_t addrWriteOld;
uint16_t addrBegin;
uint16_t addrSetDelay;
uint16_t addrCommand;
uint16_t addrClear;
uint16_t addrHome;
uint16_t addrSetCursor;
uint16_t addrCursor;
uint16_t addrBlink;
uint16_t addrSetBacklight;
uint16_t addrStream;
// uint16_t addrStreamExpand; // intent: Master don't use addrStreamExpand in parallel. The sending interface is always a Stream interface
uint16_t addrCreateChar;
};
extern const ModbusConf modbusConf; // define the Modbus Configuration in your main program (in your Arduino sketch)
// und später dann die Klasse + Konstruktor:
class LiquidCrystal_Modbus : public BufferPrint {
protected:
static const byte rwWrite = 0; // read/write WRITE
static const byte rwRead = 1; // read/write READ
byte wait = 5; // use 5 for 9600 Baud - set some delay time
ModbusMaster &node;
const uint8_t cols; // real LCD colums - tbc: not needed
const uint8_t rows; // real LCD rows - tbc: not needed
public:
LiquidCrystal_Modbus(ModbusMaster &node, uint8_t cols = 16, uint8_t rows = 2) :
node(node),
cols{cols},
rows{rows}
{}
kompiliert eigentlich auch. "Nachteil" ist nur, dass mit den aktuellen Arduino Einstellungen/C++11 die Reihenfolge der Membervariablen eingehalten werden muss und auch vollständig sein muss.
Damit kannn ich noch leben. "Vorteil" ist für mich, dass die Werte und deren Bedeutung lesbar sind.
Ich frage mich aber, ob es einen besseren Weg gibt viele Variablen übersichtlich zu übergeben.