Hier mal meinen Code wie ich es benutze.
Schreiben tue ich mit QT. Dann kann man das Programm sowohl auf Windows als auch auf Linux Rechnern laufen lassen.
Ich hoffe es hilft dir etwas weiter.
Mein Programm geht dynamisch mit den Komponenten um.
Ich habe eine Dynamische Liste in der alle gespeichert werden.
Ausserdem ordne ich diese dann der Reihenfolge im Stapel nach.
Es ist auch egal wo sie angesteckt werden.
Zum Beispiel:
Der erste gefundene Quad Relais bekommt bei mir die ID 0 - 3.
Egal an welchem Master er angesteckt wird.
Wenn in der Reihenfolge kein anderer Quad davor kommt, bekommt er die Nummern 0-3. Der nächste dann 4-7 u.s.w.
In meiner Liste ist jede Komponente mit Typ und UID hinterlegt.
Darüber kann ich sie dann finden und ansprechen. Bei Callback zum Beispiel.
void Create_REDBrick(const char* device_uid, uint8_t device_identifier, const char *connected_uid,char position, bool is_new)
{
qDebug() << "Create_REDBrick " << device_uid << " connected_uid " << connected_uid << " position " << position;
/****************************************************************************/
/* Create_REDBrick Bricklet einbinden */
/****************************************************************************/
Brick* NewBrick = NULL;
QString DEVICE_UID = QString(device_uid);
QString CONNECTED_UID = QString(connected_uid);
UID = strdup(device_uid);
if(UID)
{
// _strset( UID, 0 );
// strncpy_s(UID,strlen(device_uid), device_uid, strlen(device_uid)-1);
/****************************************************************************/
/* RED Brick erstellen */
/****************************************************************************/
if(Mainprogramm)
{
if(!Mainprogramm->Check_Brick(DEVICE_UID))
{
NewBrick = new Brick("Redbrick",0,0,DEVICE_UID,CONNECTED_UID,(QString)position);
NewBrick->Redbrick = new RED();
red_create(NewBrick->Redbrick, device_uid,ipcon);
Mainprogramm->Bricklist.append(NewBrick);
}
else
{
NewBrick = Mainprogramm->Get_Brick(DEVICE_UID);
}
Mainprogramm->Set_enumeratebit();
}
}
}
void Create_Master(const char* device_uid, uint8_t device_identifier, const char *connected_uid,char position, bool is_new)
{
qDebug() << "Create_Master " << device_uid << " connected_uid " << connected_uid << " position " << position;
/****************************************************************************/
/* Master Brick einbinden */
/****************************************************************************/
Brick* NewBrick = NULL;
QString DEVICE_UID = QString(device_uid);
QString CONNECTED_UID = QString(connected_uid);
UID = strdup(device_uid);
if(UID)
{
/****************************************************************************/
/* Master Brick erstellen */
/****************************************************************************/
if(Mainprogramm)
{
if(!Mainprogramm->Check_Brick(DEVICE_UID))
{
NewBrick = new Brick("Master",0,0,DEVICE_UID,CONNECTED_UID,(QString)position);
NewBrick->master = new Master();
master_create(NewBrick->master, device_uid,ipcon);
Mainprogramm->Bricklist.append(NewBrick);
}
else
{
NewBrick = Mainprogramm->Get_Brick(DEVICE_UID);
}
if(NewBrick)
{
uint16_t voltage = 0;
uint16_t current = 0;
uint16_t usbvoltage = 0;
master_get_stack_voltage(NewBrick->master, &voltage);
master_get_stack_current(NewBrick->master, ¤t);
master_get_usb_voltage( NewBrick->master, &usbvoltage);
Mainprogramm->Set_Stackvoltage(voltage/1000);
Mainprogramm->Set_Stack_current(current/1000);
/****************************************************************************/
/* Master Brick Callback erstellen */
/****************************************************************************/
master_register_callback(NewBrick->master,MASTER_CALLBACK_STACK_VOLTAGE , (void*)cb_stack_voltage,NewBrick->master);
master_register_callback(NewBrick->master,MASTER_CALLBACK_USB_VOLTAGE , (void*)cb_stack_voltage,NewBrick->master);
master_register_callback(NewBrick->master,MASTER_CALLBACK_STACK_CURRENT , (void*)cb_stack_current,NewBrick->master);
}
Mainprogramm->Set_enumeratebit();
}
}
}
void cb_enumerate(const char *uid, const char *connected_uid, char position, uint8_t hardware_version[3], uint8_t firmware_version[3], uint16_t device_identifier, uint8_t enumeration_type, void *user_data)
{
qDebug() << QTime::currentTime().toString("hh:mm:ss:zzz ") << "cb_enumerate( " << uid << " , " << connected_uid << " , " << position << " , " << hardware_version << " , " << firmware_version << " , " << device_identifier << " , " << enumeration_type << "*user_data)";
/****************************************************************************/
/* Antwort auf Komponentenabfrage (Bricks,Bricklets) */
/****************************************************************************/
int n = 0;
bool New = false;
QString DEVICE_UID = QString(uid);
if(Mainprogramm)
{
if(!Mainprogramm->Check_Brick(DEVICE_UID))
{
New = true;
}
}
if(enumeration_type == IPCON_ENUMERATION_TYPE_DISCONNECTED)
{
Mainprogramm->Remove_Brick(DEVICE_UID);
}
if(device_identifier==MASTER_DEVICE_IDENTIFIER)
{
if(enumeration_type == IPCON_ENUMERATION_TYPE_AVAILABLE)
{
Create_Master(uid,device_identifier, connected_uid, position,true);
uid_master = uid;
qDebug() << "Enumeration Type: " << enumeration_type;
qDebug() << "Master Brick gefunden";
printf("Enumeration Type: %d\n", enumeration_type);
}
if(enumeration_type == IPCON_ENUMERATION_TYPE_CONNECTED)
{
Create_Master(uid,device_identifier, connected_uid, position,true);
uid_master = uid;
printf("Enumeration Type: %d\n", enumeration_type);
qDebug() << "Enumeration Type: " << enumeration_type;
qDebug() << "Master Brick verbunden";
}
if(enumeration_type == IPCON_ENUMERATION_TYPE_DISCONNECTED)
{
printf("Enumeration Type: %d\n", enumeration_type);
qDebug() << "Enumeration Type: " << enumeration_type;
qDebug() << "Master Brick disconnected";
Brick* OldBrick = Mainprogramm->Get_Brick(DEVICE_UID);
if(OldBrick)
{
Mainprogramm->Remove_Brick(DEVICE_UID);
master_destroy(OldBrick->master);
delete OldBrick->master;
OldBrick->master = NULL;
Mainprogramm->Remove_Brick(DEVICE_UID);
}
}
if(device_identifier==INDUSTRIAL_QUAD_RELAY_DEVICE_IDENTIFIER)
{
if(enumeration_type == IPCON_ENUMERATION_TYPE_AVAILABLE)
{
Create_Industrial_Quad_Relay[n](uid,device_identifier, connected_uid, position,true);
uid_Digital_In = uid;
qDebug() << "Enumeration Type: " << enumeration_type;
qDebug() << "DIGITAL QUAD OUT Brickled gefunden";
printf("Enumeration Type: %d\n", enumeration_type);
}
if(enumeration_type == IPCON_ENUMERATION_TYPE_CONNECTED)
{
Create_Industrial_Quad_Relay(uid,device_identifier, connected_uid, position,true);
qDebug() << "Enumeration Type: " << enumeration_type;
qDebug() << "DIGITAL QUAD OUT Brickled gefunden";
printf("Enumeration Type: %d\n", enumeration_type);
}
if(enumeration_type == IPCON_ENUMERATION_TYPE_DISCONNECTED)
{
printf("Enumeration Type: %d\n", enumeration_type);
qDebug() << "Enumeration Type: " << enumeration_type;
qDebug() << "DIGITAL QUAD OUT Brickled disconnected";
Brick* OldBrick = Mainprogramm->Get_Brick(DEVICE_UID);
if(OldBrick)
{
industrial_quad_relay_destroy(OldBrick->Quad_Relay);
delete OldBrick->Quad_Relay;
OldBrick->Quad_Relay = NULL;
}
}
}
}
if(device_identifier==RED_DEVICE_IDENTIFIER)
{
if(enumeration_type == IPCON_ENUMERATION_TYPE_AVAILABLE)
{
Create_REDBrick(uid,device_identifier, connected_uid, position,true);
uid_Redbrick = uid;
qDebug() << "Enumeration Type: " << enumeration_type;
qDebug() << "RED Brick gefunden";
printf("Enumeration Type: %d\n", enumeration_type);
}
if(enumeration_type == IPCON_ENUMERATION_TYPE_CONNECTED)
{
Create_REDBrick(uid,device_identifier, connected_uid, position,true);
uid_Redbrick = uid;
qDebug() << "Enumeration Type: " << enumeration_type;
qDebug() << "RED Brick gefunden";
uid_Redbrick = uid;
printf("Enumeration Type: %d\n", enumeration_type);
}
if(enumeration_type == IPCON_ENUMERATION_TYPE_DISCONNECTED)
{
printf("Enumeration Type: %d\n", enumeration_type);
qDebug() << "Enumeration Type: " << enumeration_type;
qDebug() << "RED Brick disconnected";
Brick* OldBrick = Mainprogramm->Get_Brick(DEVICE_UID);
if(OldBrick)
{
red_destroy(OldBrick->Redbrick);
delete OldBrick->Redbrick;
OldBrick->Redbrick = NULL;
Mainprogramm->Remove_Brick(DEVICE_UID);
}
}
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
qDebug() << "main(" << argc << " , " << argv << ")";
QString Puffer;
int Pos = 0;
while(Pos < argc)
{
Puffer = argv[Pos];
qDebug() << "Arg " << Pos << " : " << Puffer;
if(Puffer.contains("IP="))
{
TFIP = Puffer.remove("IP=");
}
else if(Puffer.contains("PORT="))
{
Puffer = Puffer.remove("PORT=");
PORT = Puffer.toInt();
}
Pos++;
}
/****************************************************************************/
/* Hauptprogramm starten */
/****************************************************************************/
if(Mainprogramm == NULL)
{
qDebug() << "Touchprogram erstellen";
Mainprogramm = new Touchprogram();
Mainprogramm->Read_Ini();
Mainprogramm->Run();
Mainprogramm->window->update();
if(Mainprogramm->LOCALHOST)
{
TFIP = "localhost";
}
else
{
TFIP = Mainprogramm->TFIP;
}
PORT = Mainprogramm->PORT;
}
/****************************************************************************/
/* IPConnection erstellen */
/****************************************************************************/
HOST = (char *)malloc((TFIP.length() + 1) * sizeof(char));
strcpy(HOST, TFIP.toStdString().c_str());
qDebug() << "Create IPConnection";
if(!ipcon)
{
ipcon = new IPConnection();
}
if(ipcon)
{
qDebug() << "Create IPConnection success";
ipcon_create(ipcon);
qDebug() << "connect to " << HOST << " Port: " << PORT;
if(ipcon_connect(ipcon, HOST, PORT) < 0)
{
qDebug() << "Could not create connection";
fprintf(stderr, "Could not create connection\n");
ipcon_set_auto_reconnect(ipcon,true);
}
}
else
{
qDebug() << "Could not create IPConnection";
}
/****************************************************************************/
/* Komponenten (Bricks,Bricklets) abfragen */
/****************************************************************************/
ipcon_register_callback(ipcon, IPCON_CALLBACK_ENUMERATE,(void *)cb_enumerate ,NULL);
ipcon_enumerate(ipcon);
return a.exec();
}