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.