Hallo Konrad,
Danke schon mal für die Antwort. Leider konnte ich mich die letzten Tage
noch nicht damit beschäftigen. Nun bin ich mir nicht sicher oder ich
sehe es einfach nicht. Und ja, ich habe wahrscheinlich nicht genau genug
beschrieben, worum es mir geht. Den Teil, den Du bzgl. des späteren
findens der Referenz anhand der Portnummer vorgeschlagen hast, ist nicht
das eigentliche Problem. Ich hätte das zwar nicht so schön gelöst, aber
so weit bin ich noch nicht...
Um mal noch etwas mehr Hintergrund zu liefern:
Ich habe einen RPi. Dort hängen an 3 verschiedenen I2C-Bus-Leitungen
(der Hardware-I2C-Bus und 2 mit I2C-GPIO emulierte, deshalb auch die
Busnummer im Code). Ich habe Ein- und Ausgabe-Bausteine auf diese
I2C-"Busse" aufgeteilt, da auch noch ein I2C-Drucksensor mit dranhängt,
der nur 100kHz- Baudrate vertragen. Dennoch reagieren die MCP's rasend
schnell. Nun weiss ich nicht (ich weiss es schon, aber will nicht alles
"hardcodieren"), wieviel der MCP23008 oder MCP23017 am jeweiligen Bus
hängen.
Der Codeteil, um den es mir hier geht, liegt in der Subroutine
"init_hw". Dort lese ich aus den csv-Dateien die Zeilen für die MCP's ein.
Wir nehmen jetzt mal 2 dieser MCP23017 an und in der csv steht dann
folgendes:
-----------------
####################
# MCP-I2C-Portexpander
# mcpxxxx;bus;adresse;input|output;start_pinnr;end_pinnr;Int_A;Int_B
#
mcp23017;3;0x22;input;108;131;22;24
mcp23017;4;0x24;output;208;231;;
-----------------
Normalerweise würde man ja das ganze "hardcodiert" so schreiben:
-------------------
int mcp_inc = 0;
if ( file_names[0].length() > 0) {
READCSV read_csv;
vector<mcp_csv_values> mcp_elements;
read_csv.read_mcp_config_files(file_names[0], mcp_elements);
for(int i_e=0; i_e < mcp_elements.size(); i_e++)
{
if (
strstr(mcp_elements[i_e].mcptype.c_str(),"mcp23017") ) {
if ( mcp_inc == 0) {
MCP23017
mcpout1(atoi(mcp_elements[i_e].busnr.c_str()),(int)strtol(mcp_elements[i_e].busaddr.c_str(),
NULL, 0));
for ( int i17 = 0; i17 < 16; i17++) {
if( mcp_elements[i_e].inout_function ==
"input" ) {
// set pin to intput and off/ low
mcpout1.pinMode(i17, INPUT);
mcpout1.pinMode(i17, LOW);
}
else if (
mcp_elements[i_e].inout_function == "output" ) {
// set pin to output and off/ low
mcpout1.pinMode(i17, OUTPUT);
mcpout1.pinMode(i17, LOW);
}
else { cout << "error seting MCP
direction!! exit" << endl; exit; }
}
else if ( mcp_inc == 1) {
MCP23017
mcpout2(atoi(mcp_elements[i_e].busnr.c_str()),(int)strtol(mcp_elements[i_e].busaddr.c_str(),
NULL, 0));
for ( int i17 = 0; i17 < 16; i17++) {
if( mcp_elements[i_e].inout_function ==
"input" ) {
// set pin to intput and off/ low
mcpout2.pinMode(i17, INPUT);
mcpout2.pinMode(i17, LOW);
}
else if (
mcp_elements[i_e].inout_function == "output" ) {
// set pin to output and off/ low
mcpout2.pinMode(i17, OUTPUT);
mcpout2.pinMode(i17, LOW);
}
else { cout << "error seting MCP
direction!! exit" << endl; exit; }
}
mcp_inc++;
}
}
-------------------
Das gefällt mir nat. nicht. Was, wenn ich 3 MCP's am RPi hängen habe?
Dann müsste ich das Programm umschreiben und neu kompilieren. Das möchte
ich nat. nicht!
Nun mein Problem:
Ich möchte das in Kurzform so regeln:
-------------------------
int mcp_inc = 0;
if ( file_names[0].length() > 0) {
READCSV read_csv;
vector<mcp_csv_values> mcp_elements;
read_csv.read_mcp_config_files(file_names[0], mcp_elements);
for(int i_e=0; i_e < mcp_elements.size(); i_e++)
{
if (
strstr(mcp_elements[i_e].mcptype.c_str(),"mcp23017") ) {
MCP23017
mcp_inc(atoi(mcp_elements[i_e].busnr.c_str()),(int)strtol(mcp_elements[i_e].busaddr.c_str(),
NULL, 0));
for ( int i17 = 0; i17 < 16; i17++) {
if( mcp_elements[i_e].inout_function ==
"input" ) {
// set pin to intput and off/ low
mcp_inc.pinMode(i17, INPUT);
mcp_inc.pinMode(i17, LOW);
}
else if (
mcp_elements[i_e].inout_function == "output" ) {
// set pin to output and off/ low
mcp_inc.pinMode(i17, OUTPUT);
mcp_inc.pinMode(i17, LOW);
}
else { cout << "error seting MCP
direction!! exit" << endl; exit; }
}
mcp_inc++;
}
-------------------------
Das Problem ist nur, dass meine Variable ja integer ist und nicht als
Referenz taugt. D.h., dass obiger Code nat. nicht funktioniert! Der
dient nur zur Verdeutlichung, was ich machen möchte.
Ich müsste also aus der Integer-Variable eine Referenz für den ostream
machen und dann möchte ich die eben in einem Vector speichern, den ich
in die anderen Unterprogramme (z.B. output-thread) übergebe. Dort kommen
wir dann zum "Raussuchen" anhand der Portnummer. Aber darum geht es mir
hier noch nicht!
Ich bin mir nicht sicher, ob das überhaupt funktioniert und wenn ja, wie?
Kleine Anmerkung noch für ggf. andere, die das hier mal später lesen:
Die Zeile in meiner früheren Mail:
-----------------
MCP23017 mcpout1.(atoi(mcp_elements[i_e].busnr.c_str()),
atoi(mcp_elements[i_e].busaddr.c_str()));
-----------------
ist nat. Quatsch. Wenn man die Busadresse als String aus einer csv-Datei
einliest und diese z.B. "0x20" lautet, dann macht "atoi()" daraus "0".
Deshalb muss das eben so lauten:
-----------------
MCP23017
mcpout1(atoi(mcp_elements[i_e].busnr.c_str()),(int)strtol(mcp_elements[i_e].busaddr.c_str(),
NULL, 0));
-----------------
Aber das nur am Rande. Da habe ich zu viel herumprobiert und mir einen
Fehler eingebaut.
--
Mit freundlichen Grüßen
Sebastian Reinhardt