Hilfe zu einem Projekt.



  • hallo alle.

    Ich bin neue hier in dem Forum und habe ein Projekt und brauche hilfe und zwar sollte ich einen Plugin erweitert. Es wurde schon vorher für fast gleiche Zwecks programmiert...(Telegramm in einer XML Datei zu decodieren).
    Als Ergebnis soll ich das haben:
    decoElDaSp] 03 00 10 03 10 04 10 6D 10 02 84 10 02 83 10 02 FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

    [decoElDaSp] SPAREL = 0x1003 SPELTY = 0x04 (POIS) SPENNO = 0x0003 SPARNO = 0x10 usw...

    bisher habe ichs chon von dem vorherigem Beispiel das kopieren(ich zeige Ihnen nur die entscheidene Zeil):

    /**
    * Dekodiert xsay anhand der in der Konfigurationsdatei angegebenen Regeln.
    *
    * @since 2009-08-28 deck Baustelle.
    *
    * @param pData
    *
    * @return dekodierte TraceMsg
    */
    char *decode_xsay(BYTE *pData)
    {

    static char str[4096];
    LogMsg_t *pMsg =(LogMsg_t *)pData;
    long loc = pMsg->id;

    if ( loc == 1040597888 || loc == 1040597889)
    {
    sprintf(str,"[decoElDaSp] ");

    int len = pMsg->len;
    //Der undekodierte Hex-String wird zu Debug-Zwecken mit ausgegeben
    for (int i=0; i<len; i++) sprintf(str,"%s%02x ",str,pMsg->data[i]);
    sprintf(str,"%s\n[decoElDaSp]",str);

    unsigned long num = pMsg->num;
    // int xsay_len = pData[15];
    int xsay_len = pMsg->len;

    //data[0..1]: Logikauftragsart (xsay: pdata[16..17])
    long logikauftragsart = pMsg->data[0] + 256*pMsg->data[1];

    //Finde passende Definition für Logikauftragsart
    CxmlNode* tg_tree = conf_root->getChild(NN_ROOT)->getChild(NN_TELEGRAMS);
    CxmlNode* av = NULL; //Der gewünschte <logicTelegram> Knoten
    if (tg_tree != NULL) {
    char val[10];
    sprintf(val,"%d",logikauftragsart);
    av = tg_tree->findChildByValue(NN_TELEGRAM,VN_VALUE,val);

    // @since 2008-01-08 deck: Falls es die lange logikauftragsart nicht gibt,
    // noch einmal mit der kurzen (ein Byte) versuchen.
    // Es kann sein, dass eine lange logikauftragsart eine kurze verdeckt.
    // Um das zu vermeiden, müsste geprüft werden, ob bitscale==16.
    if (av==NULL) {
    // @since 2008-01-08 deck: Auf Verdacht die kurze logikauftragsart_byte prüfen.
    long logikauftragsart_byte=logikauftragsart%0x100;
    sprintf(val,"%d",logikauftragsart_byte);
    av = tg_tree->findChildByValue(NN_TELEGRAM,VN_VALUE,val);
    }
    if (av==NULL) {
    //Keine passende Regel für Logikauftragsart gefunden
    sprintf(str,"%s [No matching <logicTelegram> for val=%s]",str,val);
    return str;
    }
    else {
    //Telegrammnamen ausgeben @since 2009-09-02 deck Auf Wunsch von gim ohne Kanalformat.
    // sprintf(str,"%s [%s/%s] -",str,av->getAttribute(VN_NAME).c_str(),av->getAttribute(VN_CHNFRMT).c_str());
    sprintf(str,"%s [%s] -",str,av->getAttribute(VN_NAME).c_str());

    CxmlNode* tg_header = tg_tree->findChildByValue(VN_HEADER,VN_NAME,av->getAttribute(VN_HDRNAME).c_str());

    //ShiftByte-Parameter aus Header und LogicTelegram extrahieren
    int shift_header = 0;
    int shift_telegram = 0;
    string bs = tg_header->getAttribute(VN_SHIFT);
    if (strcmp(bs.c_str(),MX_NULL)) shift_header = atoi(bs.c_str());
    bs = av->getAttribute(VN_SHIFT);
    if (strcmp(bs.c_str(),MX_NULL)) shift_telegram = atoi(bs.c_str());

    shift_header+=16; // @since 2009-09-01 deck Bei xsay liegen die Daten 16 Byte weiter vorne als bei xtrace.
    shift_telegram+=16; // ...das gilt auch für shift_telegram

    //<parameter> mittels der Funktion PARse parsen - zunächst die aus dem Header
    //Die zuletzt bearbeitete Byteposition wird gesichert
    int bp = PARse(tg_header,str,pMsg->data,shift_header,0,xsay_len);
    //Es folgen die <parameter> Werte aus dem Body, ab der letzten Byteposition aus dem Header
    PARse(av,str,pMsg->data,shift_telegram,bp,xsay_len);
    }
    }//endif (tg_tree)
    else {
    //Das im Header definierte Schlüsselwort stimmt nicht mit der Eingabedatei überein
    sprintf(str,"%s [ERROR: <%s> not found in XML file!]",str,NN_TELEGRAMS);
    }
    return str;
    } // endif
    return NULL;
    }

    /**
    * Diese Funktion wird vom Televist aufgerufen (sozusagen main())
    * und verzweigt auf die beiden Hilfsfunktionen xsay.
    /
    char *decode(int link, int datagrammart, int unilinkchannel, int len, BYTE *pData)
    {
    switch (unilinkchannel)
    {
    case 0x889f: /
    ======== xsay =============================================*/
    {
    return decode_xsay(pData);

    break;
    };

    default:
    {
    return NULL;

    break;
    }
    }

    return NULL;
    }

    /**
    * Einstieg in die DLL-Bearbeitung
    *
    * @param hinstDll
    * @param fdwReason
    *
    * @return
    */
    BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD fdwReason,LPVOID) /*lpvReserved*/
    {
    switch (fdwReason)
    {
    case DLL_PROCESS_ATTACH:
    {
    return true;
    break;
    }

    case DLL_THREAD_ATTACH:
    {
    return true;
    break;
    }
    case DLL_THREAD_DETACH:
    {
    return true;
    break;
    }

    case DLL_PROCESS_DETACH:
    {
    return true;
    break;
    }

    default:
    {
    return true;
    break;
    }
    }
    }

    /* Betrachtet die Bits von start bis start+length eines Bytes und gibt sie als int zurück
    * Returnwerte < 0 haben folgende Bedeutung:
    * -1 -> Das gegebene Byte ist NULL.
    * @since 2007-12-13 deck: Paramater duerfen 0 sein, der Fehler wird nicht mehr ausgegeben.
    * -2 -> Das Byte ist länger als acht Bits (Fehler in XML-Datei)
    * @since 2007-12-13 deck: Code ersetzt.
    /
    int bitExtract(BYTE b, int start, int length)
    {
    // if (b == NULL) return -1; //NULL-Byte
    if (start+length > 😎 return -2; // byte overflow
    bitset<8> b_bitset(b);
    int result=0;
    for (int index=start+length-1; index>=start; --index) {
    result
    =2;
    result+=b_bitset[index];
    }
    // cout << std::hex << int(b) << std::dec << " " << b_bitset << " start: " << start << " length: " << length << " result: " << result << endl;
    return result;
    }

    /* Geht durch alle <parameter>-Attribute des gegebenen Knotens und durchsucht sie nach den gewünschten Informationen
    * CxmlNode* n: Der Vaterknoten, der die <parameter>-Knoten enthält
    * char* str: Der Ausgabestring, an den die Resultate angehängt werden sollen
    * BYTE* pData: zu dekodierender Datenstrom
    * int byteshift: accShiftByte-Wert aus dem Header, wird (ab Position 3) von der Byteposition abgezogen
    * int initial_bytePos: fange ab hier an zu dekodieren; default: 0
    * returns: zuletzt bearbeitete Byteposition
    * @since 2008-01-08 deck: Neuer Parameter length zum Stoppen der Dekodierung.
    /
    int PARse(CxmlNode
    n, char* str, BYTE pData, int byteshift, int initial_bytePos, int length)
    {
    int last_bytepos = 0; //Letzte Byteposition vor aktueller
    int current_bytepos = initial_bytePos; //Aktuelle Position
    bool newline=false; // @since 2008-01-08 deck: Einsparung von \n bei leeren Zeilen.
    if (n != NULL)
    {
    //CxmlNode
    types = conf_root->getChild(NN_ROOT)->getChild(NN_ENUMTYPES);
    //Iteration über alle Kinder namens <parameter> des Knotens n
    for (int i=1; i<=n->getChildNumberByName(VN_PARAM); i++)
    {
    CxmlNode* par = n->getChild(VN_PARAM,i);
    if (par != NULL)
    {
    last_bytepos = current_bytepos;
    current_bytepos = atoi(par->getAttribute(VN_BYTEPOS).c_str());
    if (current_bytepos > 2) current_bytepos -= byteshift;
    //es wird davon ausgegangen dass die "bytePos"-Werte chronologisch geordnet sind
    //dekodiere also nur, wenn die aktuelle Byteposition höher ist als die letzte
    // @since 2008-01-08 deck: Abfrage auf Überschreitung von length.
    if ((current_bytepos >= last_bytepos) && (current_bytepos-4<length))
    {
    newline=true; // @since 2008-01-08 deck
    if (strcmp(par->getAttribute(VN_CONST).c_str(),MX_NULL))
    sprintf(str,"%s const@%s=",str,par->getAttribute(VN_BYTEPOS).c_str());
    else sprintf(str,"%s %s=",str,par->getAttribute(VN_NAME).c_str());
    //Werte können in Bytes oder Bits angegeben sein -
    //aber nie beides gleichzeitig; zB 12 Bit (1,5 Byte) lange Werte sind nicht erlaubt
    // @since 2008-01-08 deck: VN_BITSTOTAL statt VN_BITS (besser für RC und kurze auftrg)
    int bitstotal=atoi(par->getAttribute(VN_BITSTOTAL).c_str());
    if (bitstotal >= 😎
    {
    //byteweise dekodieren
    if (bitstotal % 8 == 0)
    {
    for (int j=data_offset+current_bytepos; j<data_offset+current_bytepos+bitstotal/8; j++)
    {
    /*
    //Suche in <enumTypes> nach dem Datentypen
    CxmlNode* type = types->findChildByValue(NN_ENUMTYPE,VN_NAME,par->getAttribute(VN_TYPE));
    if (type != NULL) {
    char val[10];
    sprintf(val,"%d",hex2long(pData,j,1));
    CxmlNode* item = type->findChildByValue("item","val",val);
    sprintf(str,"%s%s ",str,item->getAttribute("name"));
    }
    else */
    sprintf(str,"%s%02x ",str,pData[j]);
    }
    }
    else sprintf(str,"%s [INVALID BYTE RANGE] ",str);
    }
    else
    {
    //bitweise dekodieren
    int start = atoi(par->getAttribute(VN_BITPOS).c_str());
    // @since 2008-01-08 deck: VN_BITS ersetzt durch VN_BITSTOTAL
    int end = atoi(par->getAttribute(VN_BITSTOTAL).c_str());
    // @since 2007-12-13 deck: data_offset fehlte
    int bitValue = bitExtract(pData[current_bytepos+data_offset],start,end);
    if (bitValue == -2) sprintf(str,"%s[INVALID BIT RANGE IN CONFIG FILE] ",str);
    else if (bitValue == -1) sprintf(str,"%sNULL ",str);
    else sprintf(str,"%s%d ",str,bitValue);
    }
    } //if current_bytepos
    } // if (par != NULL)
    } // for i
    if (newline) sprintf(str,"%s\n[decoElDaSp]",str); // @since 2008-01-08 deck. @since 2009-09-02 deck Mit Dekoration.
    } // if (n != NULL)
    return current_bytepos;
    }

    aber wenn ich diese compilieren bekomme ich:
    [decoElDaSp] 03 00 10 03 10 04 10 6D 10 02 84 10 02 83 10 02 FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    [decoElDaSp] [No matching <logicTelegram> for val=3]

    Ich weiss nicht genau was ich ändern soll.

    Vielen Dank im vorraus.



  • Ich denke, dass wird sich keiner anschauen:

    -> falsches Forum (wenn ich das richtig sehe, kommen hier nur Präsentationen rein, keine Algo/C++-Fragen)
    -> kein Syntaxhighlighting benutzt
    -> keine konkrete Fragestellung, sondern nur eben den Code kopiert und Angaben, die keiner sofort versteht
    -> auf Rechtschreibung achten

    Ich hoff niemanden seine Aufgabe weggenommen zu haben...aber ist doch wahr 😃


Anmelden zum Antworten