/******************************************************/ /* ACQUISITION DE DONNES TELEMETRE ALASCA */ /******************************************************/ #include "sensor/AlascaComponent.h" #include "sensor/AlascaSocket.h" #include #include #include "kernel/ComponentFactory.h" #include #include // Construct the factory ComponentFactory* factory = new ComponentFactory("AlascaComponent"); //Constructeur AlascaComponent::AlascaComponent(const char * name) : ComponentBase(name) { A_socket = new AlascaSocket(this); //QApplication::connect(A_socket, SIGNAL(configuration()), this, SLOT(Config()) ); } //Destructeur AlascaComponent::~AlascaComponent() { delete A_socket; } void AlascaComponent::stopActivity() { A_socket->closeSocket(); } void AlascaComponent::startActivity() { A_socket->connectToServer("172.17.130.205", 12000); // demarrage du telemetre et/ou envoi des donnees sur ethernet } void AlascaComponent::configureComponent(XmlComponentConfig config) { param.localCopy(config.qDomElement()); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// long AlascaComponent::findMagicWord(const char * message, const int length) { unsigned long magicWord=0x00000000; unsigned long i=0; if (length < 4) return -1; magicWord = ( (*(message+i+3)) & 0x000000FF ) + ( ((*(message+i+2))<<8) & 0x0000FF00 ) + ( ((*(message+i+1))<<16) & 0x00FF0000 ) + ( ((*(message+i))<<24) & 0xFF000000 ); while ( magicWord !=0xAFFEC0C0) { i++; magicWord = ( (*(message+i+3)) & 0x000000FF ) + ( ((*(message+i+2))<<8) & 0x0000FF00 ) + ( ((*(message+i+1))<<16) & 0x00FF0000 ) + ( ((*(message+i))<<24) & 0xFF000000 ); if (i==length) { return -1; } else continue ; } return i; } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // decoupe le paquet en messages et remplit la liste de 'Message' // remplit le message header // remplit le scan header // détermine si le message est complet (isFull) // renvoie le nombre de pending bytes unsigned long AlascaComponent:: splitPacket(const char * packet, const int length) { unsigned long ptr = 0; long index; Message msg; // the current message of the list, often the last if ( !msgList.empty() ) { if (msgList.back().isIncomplete == 1) msg = msgList.back(); } // Seulement si c'est un nouveau mesage qui n'est pas encore dans la liste // ou si le dernier message de la liste est complet if (msg.isIncomplete == -1) { // on cherche le magicword index = findMagicWord(packet + ptr,length - ptr); if ( index != -1) { // on vérifie que l'on a le message header (16 octets ) if (index + 16 <= length) { fillMessageHeader(msg, packet, index ); // test si le message est complet "MH + SH + body" if (index + 32 + msg.hMsg.size <= length) { // message complet msg.isIncomplete = 0; memcpy(msg.body, packet + index, index + 32 + msg.hMsg.size); msg.bodyPtr = index + 32 + msg.hMsg.size; } else { // message incomplet MH + une partie de 'SH+body' msg.isIncomplete = 1; memcpy(msg.body, packet + index, length - index); msg.bodyPtr = length - index; } } else { // message incomplet - MW sans le MH memcpy(msg.body, packet + index, length - index); msg.isIncomplete = 1; msg.bodyPtr = length - index; } } else { // pas de magic word memcpy(msg.body, packet + ptr, length - ptr ); msg.isIncomplete = 1; msg.bodyPtr = length - index; } } else { // on travaille sur le dernier message de la liste qui n'est pas complet // msg.isIncomplete == 1 if (msg.hMsg.magicWord != 0) { // on a deja trouvé le MW } else { char * packetCopy = new char [length + msg.bodyPtr]; memcpy(packetCopy, msg.body, msg.bodyPtr); memcpy(packetCopy + msg.bodyPtr, packet, length); index = findMagicWord(packetCopy ,sizeof(packetCopy)); if (index == -1) { // pas de magic word memcpy(msg.body, packetCopy, sizeof(packetCopy) ); msg.isIncomplete = 1; msg.bodyPtr = sizeof(packetCopy); } if (index != 0) qDebug("Error at line %d - file %s",__LINE__, __FILE__ ); else { // tester si on a le MH if (index + 16 <= sizeof(packetCopy)) { fillMessageHeader(msg, packetCopy, index ); // test si le message est complet "MH + SH + body" if (index + 32 + msg.hMsg.size <= sizeof(packetCopy)) { // message complet msg.isIncomplete = 0; memcpy(msg.body, packetCopy + index, index + 32 + msg.hMsg.size); msg.bodyPtr = index + 32 + msg.hMsg.size; } else { // message incomplet MH + une partie de 'SH+body' msg.isIncomplete = 1; memcpy(msg.body, packetCopy + index, sizeof(packetCopy) - index); msg.bodyPtr = sizeof(packetCopy) - index; } } else { // message incomplet - MW sans le MH memcpy(msg.body, packet + index, length - index); msg.isIncomplete = 1; msg.bodyPtr = length - index; } } } // // // if ( !msgList.empty() ) // { // msg = msgList.back(); // if ( (msg.isIncomplete == 1) || (msg.isIncomplete == 0) ) // { // // je vais en (1) // } // else if (msg.isIncomplete == 2) // { // // je vais en (2) // } // else if (msg.isIncomplete == 3) // { // // je vais en (3) // } // else if (msg.isIncomplete == 4) // { // // je vais en (4) // } // else // { // qWarning("Error in the message list ! A message has been found with an incorrect status"); // return 0; // } // } // else // { // msgList.push_back(msg); // } // tester dans la liste qu'il n'y a pas un message incomplet // si oui => le compléter // sinon on continue /* // (1) index = findMagicWord(packet,length ); if ( index == -1) { return length; } // (2) // test if the message header is complete (16 bytes) if (index + 16 <= length) { } else { return length; } // (3) // test if the scan header is complete (16 bytes) if (index + 32 <= length) { fillScanHeader(msg, packet, index ) } else return length; // (4) // test if the message body is complete ( index + 32 + msg.hScan.numPoints * 12 <= length) if (index + 32 + msg.hScan.numPoints * 12 <= length) { msg.isIncomplete = 0; memcpy(msg.body, packet + index + 32, msg.hScan.numPoints * 12); } else { msg.isIncomplete = 4; // on copie ce qu'il reste dans le paquet memcpy(msg.body, packet + index + 32, length - index + 32); } msgList.push_back(msg); /* // tabmessages [0]=i; // nbmessages=1; ptr=i+4; while ( ptrtype(); FRAME * frame= (FRAME*)e->data(); /* // le paquet complet char *messg = new char [frame->size]; memcpy(messg, frame->msg, frame->size); delete [] frame->msg; // resultat de splitPacket char *messgtemp=new char[frame->size]; j=0; size=frame->size; nbmessages=splitPacket(messg,size); if (nbmessages==0) { printf ("0"); delete [] messgtemp; delete [] messg; return; } for (i=0;i<(nbmessages-1);i++) { ptr=0; while (j=8) { taille = (restOfBytes[4])&0x000000FF+ (restOfBytes[5]<<8)&0x0000FF00+ (restOfBytes[6]<<16)&0x00FF0000+ (restOfBytes[7]<<24)&0xFF000000; if ( taille <= (size-tabmessages[nbmessages-1])) nbpoints= splitMessage(restOfBytes,size-tabmessages[nbmessages-1]); } delete [] messgtemp; delete [] messg; */ } void AlascaComponent::Config() { double CalOffsetX; //Postponement in x-direction. double CalOffsetY; //Postponement in y-direction. double CalOffsetZ; //Postponement in z-direction. double HAngleOffset; //Rotation horizontale du télémètre. double VAngleOffset; //Rotation verticale du télémètre. double StartAngle; //Angle de début. double EndAngle; //Angle de fin. double ScanFrequency; //Configure la fréquence de scan du télémètre. //bool UpsideDown; //Specifie si le télémètre est monté à l'envers. cout<<"Configuration du telemetre"<>CalOffsetX; cout<<"Offset y:"<>CalOffsetY; cout<<"Offset z:"<>CalOffsetZ; cout<<"Rotation vericale:"<>HAngleOffset; cout<<"Rotation horizontale:"<>VAngleOffset; cout<<"Angle de debut:"<>StartAngle; cout<<"Angle de fin:"<>EndAngle; cout<<"Frequence:"<>ScanFrequency; cout<<"Telemetre monte a l'envers? Oui=1, Non=0 :"<sendToServer(...); // a voir si utile de renvoyer de nouveau la configuration au telemetre cout<<"Telemetre configure.\nRedemarrer l'ECU pour la prise en compte de la configuration\n"; }