S1F1RAre You Online? Sent by Host and Equipment

using namespace std;

    // S1F1R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 1, 1, ::recvS1F1R);

// receive method 
void recvS1F1R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // no data expected
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(1, 2, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S1F1R

S1F2On Line Data Different Host and Equipment Use

using namespace std;

    // S1F2 C++ Parse Equipment reply 
    RcResult rcr = sp->sendSecsMsg(1, 1, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 MDLN SOFTREV
        // variables for data items and parsing
        string MDLN;  	// A:20 (always)  equipment model type
        string SOFTREV;  	// A:20 (always)  software revision
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { MDLN = list1[1];} else { MDLN = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { SOFTREV = list1[1];} else { SOFTREV = ""; }
        return;  // parsed ok
        } // end while(ok)
using namespace std;

    // S1F2 C++ Parse Host reply
    RcResult rcr = sp->sendSecsMsg(1, 1, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:0
        // variables for data items and parsing
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() != 1 || list0[0] != "L:0") { ok = false; break; }
        // single token data such as L:0 or U4:0 has been received as expected
        return;  // parsed ok
        } // end while(ok)

S1F3RSelected Equipment Status Request Sent by Host Only

using namespace std;

    // S1F3R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 1, 3, ::recvS1F3R);

// receive method 
void recvS1F3R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:n SVID
        // variables for data items and parsing
        string SVID;  	// U4:1 (varies)  status variable ID
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if (list1.size() < 1) { ok = false; break; }
            if ( list1.size() == 2) { SVID = list1[1];} else { SVID = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(1, 4, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S1F3R

S1F4Selected Equipment Status Data Sent by Equipment Only

using namespace std;

    // S1F4 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(1, 3, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:n SV
        // variables for data items and parsing
        string SV;  	// A:n (varies)  status variable value
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if (list1.size() < 1) { ok = false; break; }
            if ( list1.size() == 2) { SV = list1[1];} else { SV = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S1F5RFormatted Status Request Sent by Host Only

using namespace std;

    // S1F5R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 1, 5, ::recvS1F5R);

// receive method 
void recvS1F5R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect SFCD
        // variables for data items and parsing
        int SFCD;  	// B:1 (always)  status form code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        SFCD = sp->binToInt(list0[1].c_str());
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(1, 6, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S1F5R

S1F6Formatted Status Data Sent by Equipment Only

using namespace std;

    // S1F6 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(1, 5, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:n SV
        // variables for data items and parsing
        string SV;  	// A:n (varies)  status variable value
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if (list1.size() < 1) { ok = false; break; }
            if ( list1.size() == 2) { SV = list1[1];} else { SV = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S1F7Fixed Form Request Sent by Host Only

using namespace std;

    // S1F7 C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 1, 7, ::recvS1F7);

// receive method 
void recvS1F7(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect SFCD
        // variables for data items and parsing
        int SFCD;  	// B:1 (always)  status form code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        SFCD = sp->binToInt(list0[1].c_str());
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(1, 8, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S1F7

S1F8Fixed Form Data Sent by Equipment Only

using namespace std;

    // S1F8 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(1, 7, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:n {L:2 SVNAME SV0}
        // variables for data items and parsing
        string SVNAME;  	// A:n (always)  status variable name
        string SV0;  	// A:0 (varies)  Zero length value used to convey format type
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
            vector<string> list2;
            sp->listSplit(list1[1], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { SVNAME = list2[1];} else { SVNAME = ""; }
            list2.clear();
            sp->listSplit(list1[2], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { SV0 = list2[1];} else { SV0 = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S1F9RMaterial Transfer Status Request Sent by Host Only

using namespace std;

    // S1F9R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 1, 9, ::recvS1F9R);

// receive method 
void recvS1F9R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // no data expected
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(1, 10, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S1F9R

S1F10Material Transfer Status Data Sent by Equipment Only

using namespace std;

    // S1F10 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(1, 9, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 TSIP TSOP
        // variables for data items and parsing
        int [] TSIP;  	// B:n (always)  transfer status of input ports
        int [] TSOP;  	// B:n (always)  transfer status of output ports
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("B:") != 0 ) { ok = false; break; }
        vector<int> TSIP;
        for(size_t i=0; i < TSIP.size(); i++) {
            TSIP.push_back(sp->binToInt(list1[1+i].c_str()));
            }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("B:") != 0 ) { ok = false; break; }
        vector<int> TSOP;
        for(size_t i=0; i < TSOP.size(); i++) {
            TSOP.push_back(sp->binToInt(list1[1+i].c_str()));
            }
        return;  // parsed ok
        } // end while(ok)

S1F11RStatus Variable Namelist Request Sent by Host Only

using namespace std;

    // S1F11R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 1, 11, ::recvS1F11R);

// receive method 
void recvS1F11R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:n SVID
        // variables for data items and parsing
        string SVID;  	// U4:1 (varies)  status variable ID
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if (list1.size() < 1) { ok = false; break; }
            if ( list1.size() == 2) { SVID = list1[1];} else { SVID = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(1, 12, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S1F11R

S1F12Status Variable Namelist Reply Sent by Equipment Only

using namespace std;

    // S1F12 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(1, 11, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:n {L:3 SVID SVNAME UNITS}
        // variables for data items and parsing
        string SVID;  	// U4:1 (varies)  status variable ID
        string SVNAME;  	// A:n (always)  status variable name
        string UNITS;  	// A:n (always)  units identifier (see E5 Section 9)
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if ( list1.size() != 4 || list1[0] != "L:3") { ok=false; break; }
            vector<string> list2;
            sp->listSplit(list1[1], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { SVID = list2[1];} else { SVID = ""; }
            list2.clear();
            sp->listSplit(list1[2], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { SVNAME = list2[1];} else { SVNAME = ""; }
            list2.clear();
            sp->listSplit(list1[3], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { UNITS = list2[1];} else { UNITS = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S1F13REstablish Communications Request Different Host and Equipment Use

using namespace std;

    // S1F13R C++ Receive Equipment message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 1, 13, ::recvS1F13R);

// receive method 
void recvS1F13R(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 MDLN SOFTREV
        // variables for data items and parsing
        string MDLN;  	// A:20 (always)  equipment model type
        string SOFTREV;  	// A:20 (always)  software revision
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { MDLN = list1[1];} else { MDLN = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { SOFTREV = list1[1];} else { SOFTREV = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(1, 14, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S1F13R
using namespace std;

    // S1F13R C++ Receive Host message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 1, 13, ::recvS1F13R);

// receive method 
void recvS1F13R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:0
        // variables for data items and parsing
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() != 1 || list0[0] != "L:0") { ok = false; break; }
        // single token data such as L:0 or U4:0 has been received as expected
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(1, 14, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S1F13R

S1F14Establish Communications Request Acknowledge Different Host and Equipment Use

using namespace std;

    // S1F14 C++ Parse Equipment reply 
    RcResult rcr = sp->sendSecsMsg(1, 13, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 COMMACK {L:2 MDLN SOFTREV}
        // variables for data items and parsing
        int COMMACK;  	// B:1 (always)  establish communications acknowledgement code
        string MDLN;  	// A:20 (always)  equipment model type
        string SOFTREV;  	// A:20 (always)  software revision
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        COMMACK = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0].find("A:") != 0 ) { ok = false; break; }
        if ( list2.size() == 2) { MDLN = list2[1];} else { MDLN = ""; }
        list2.clear();
        sp->listSplit(list1[2], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0].find("A:") != 0 ) { ok = false; break; }
        if ( list2.size() == 2) { SOFTREV = list2[1];} else { SOFTREV = ""; }
        return;  // parsed ok
        } // end while(ok)
using namespace std;

    // S1F14 C++ Parse Host reply
    RcResult rcr = sp->sendSecsMsg(1, 13, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 COMMACK L:0
        // variables for data items and parsing
        int COMMACK;  	// B:1 (always)  establish communications acknowledgement code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        COMMACK = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() != 1 || list1[0] != "L:0") { ok = false; break; }
        // single token data such as L:0 or U4:0 has been received as expected
        return;  // parsed ok
        } // end while(ok)

S1F15RRequest OFF-LINE Sent by Host Only

using namespace std;

    // S1F15R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 1, 15, ::recvS1F15R);

// receive method 
void recvS1F15R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // no data expected
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(1, 16, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S1F15R

S1F16OFF-LINE Acknowledge Sent by Equipment Only

using namespace std;

    // S1F16 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(1, 15, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect OFLACK
        // variables for data items and parsing
        int OFLACK;  	// B:1 (always)  offline acknowledge, 0 ok
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        OFLACK = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S1F17RRequest ON-LINE Sent by Host Only

using namespace std;

    // S1F17R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 1, 17, ::recvS1F17R);

// receive method 
void recvS1F17R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // no data expected
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(1, 18, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S1F17R

S1F18ON-LINE Acknowledge Sent by Equipment Only

using namespace std;

    // S1F18 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(1, 17, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect ONLACK
        // variables for data items and parsing
        int ONLACK;  	// B:1 (always)  online acknowledge, 0 ok
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        ONLACK = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S1F19RGet Attribute Sent by Host and Equipment

using namespace std;

    // S1F19R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 1, 19, ::recvS1F19R);

// receive method 
void recvS1F19R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:3 OBJTYPE {L:m OBJID} {L:n ATTRID}
        // variables for data items and parsing
        string OBJTYPE;  	// A:40 (varies)  object class name, chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        string OBJID;  	// A:80 (varies)  E39 object identifier 1-80 chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        string ATTRID;  	// A:40 (varies)  identifies an attribute type, chars 0x20-0x7e but not >, :, ?, *, or ~.  Does not begin or end with space.
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJTYPE = list1[1];} else { OBJTYPE = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t m=1; m < list1.size(); m++) {
            vector<string> list2;
            sp->listSplit(list1[m], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { OBJID = list2[1];} else { OBJID = ""; }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { ATTRID = list2[1];} else { ATTRID = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(1, 20, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S1F19R

S1F20Attribute Data Sent by Host and Equipment

using namespace std;

    // S1F20 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(1, 19, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 {L:m {L:n ATTRDATA}} {L:p {L:2 ERRCODE ERRTEXT}}
        // variables for data items and parsing
        string ATTRDATA;  	// A:n (varies)  a specific attribute value of any data type
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t m=1; m < list1.size(); m++) {
            vector<string> list2;
            sp->listSplit(list1[m], list2);
            if ( list2.size() < 1) { ok=false; break; }
            for(size_t n=1; n < list2.size(); n++) {
                vector<string> list3;
                sp->listSplit(list2[n], list3);
                if (list3.size() < 1) { ok = false; break; }
                if ( list3.size() == 2) { ATTRDATA = list3[1];} else { ATTRDATA = ""; }
                }
            if (!ok) break;
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t p=1; p < list1.size(); p++) {
            vector<string> list2;
            sp->listSplit(list1[p], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ERRCODE = list3[1];} else { ERRCODE = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { ERRTEXT = list3[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S1F21RData Variable Namelist Request Sent by Host Only

using namespace std;

    // S1F21R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 1, 21, ::recvS1F21R);

// receive method 
void recvS1F21R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:n VID
        // variables for data items and parsing
        string VID;  	// A:n (varies)  A variable ID
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if (list1.size() < 1) { ok = false; break; }
            if ( list1.size() == 2) { VID = list1[1];} else { VID = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(1, 22, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S1F21R

S1F22Data Variable Namelist Reply Sent by Equipment Only

using namespace std;

    // S1F22 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(1, 21, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:n {L:3 VID DVVALNAME UNITS}
        // variables for data items and parsing
        string VID;  	// A:n (varies)  A variable ID
        string DVVALNAME;  	// A:n (always)  a descriptive name for a Data Value variable (DVVAL)
        string UNITS;  	// A:n (always)  units identifier (see E5 Section 9)
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if ( list1.size() != 4 || list1[0] != "L:3") { ok=false; break; }
            vector<string> list2;
            sp->listSplit(list1[1], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { VID = list2[1];} else { VID = ""; }
            list2.clear();
            sp->listSplit(list1[2], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { DVVALNAME = list2[1];} else { DVVALNAME = ""; }
            list2.clear();
            sp->listSplit(list1[3], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { UNITS = list2[1];} else { UNITS = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S1F23RCollection Event Namelist Request Sent by Host Only

using namespace std;

    // S1F23R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 1, 23, ::recvS1F23R);

// receive method 
void recvS1F23R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:n CEID
        // variables for data items and parsing
        string CEID;  	// U4:1 (varies)  collection event identifier, GEM requires type Un
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if (list1.size() < 1) { ok = false; break; }
            if ( list1.size() == 2) { CEID = list1[1];} else { CEID = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(1, 24, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S1F23R

S1F24Collection Event Namelist Reply Sent by Equipment Only

using namespace std;

    // S1F24 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(1, 23, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:n {L:3 CEID CENAME {L:a VID}}
        // variables for data items and parsing
        string CEID;  	// U4:1 (varies)  collection event identifier, GEM requires type Un
        string CENAME;  	// A:n (always)  a descriptive name for a Data Collection Event
        string VID;  	// A:n (varies)  A variable ID
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if ( list1.size() != 4 || list1[0] != "L:3") { ok=false; break; }
            vector<string> list2;
            sp->listSplit(list1[1], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { CEID = list2[1];} else { CEID = ""; }
            list2.clear();
            sp->listSplit(list1[2], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { CENAME = list2[1];} else { CENAME = ""; }
            list2.clear();
            sp->listSplit(list1[3], list2);
            if ( list2.size() < 1) { ok=false; break; }
            for(size_t a=1; a < list2.size(); a++) {
                vector<string> list3;
                sp->listSplit(list2[a], list3);
                if (list3.size() < 1) { ok = false; break; }
                if ( list3.size() == 2) { VID = list3[1];} else { VID = ""; }
                }
            if (!ok) break;
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S2F1Service Program Load Inquire Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S2F1 C++ Receive message - add next line to setup
    sp->messageTypeAdd( 2, 1, ::recvS2F1);

// receive method 
void recvS2F1(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 SPID LENGTH
        // variables for data items and parsing
        string SPID;  	// A:6 (always)  service program identifier
        unsigned long LENGTH;  	// U4:1 (always)  program length in bytes
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { SPID = list1[1];} else { SPID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U4:1" ) { ok = false; break; }
        LENGTH = atoul(list1[1].c_str());
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(2, 2, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S2F1

S2F2Service Program Load Grant Sent by Host and Equipment

using namespace std;

    // S2F2 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(2, 1, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect GRANT
        // variables for data items and parsing
        int GRANT;  	// B:1 (always)  multiblock grant code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        GRANT = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S2F3Service Program Send Sent by Host and Equipment

using namespace std;

    // S2F3 C++ Receive message - add next line to setup
    sp->messageTypeAdd( 2, 3, ::recvS2F3);

// receive method 
void recvS2F3(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect SPD
        // variables for data items and parsing
        int [] SPD;  	// B:n (always)  service program data
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0].find("B:") != 0 ) { ok = false; break; }
        vector<int> SPD;
        for(size_t i=0; i < SPD.size(); i++) {
            SPD.push_back(sp->binToInt(list0[1+i].c_str()));
            }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(2, 4, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S2F3

S2F4Service Program Send Acknowledge Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S2F4 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(2, 3, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect SPAACK
        // variables for data items and parsing
        unsigned long SPAACK;  	// U1:1 (always)  service completion code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "U1:1" ) { ok = false; break; }
        SPAACK = atoul(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S2F5Service Program Load Request Sent by Host and Equipment

using namespace std;

    // S2F5 C++ Receive message - add next line to setup
    sp->messageTypeAdd( 2, 5, ::recvS2F5);

// receive method 
void recvS2F5(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect SPID
        // variables for data items and parsing
        string SPID;  	// A:6 (always)  service program identifier
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0].find("A:") != 0 ) { ok = false; break; }
        if ( list0.size() == 2) { SPID = list0[1];} else { SPID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(2, 6, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S2F5

S2F6Service Program Load Data Sent by Host and Equipment

using namespace std;

    // S2F6 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(2, 5, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect SPD
        // variables for data items and parsing
        int [] SPD;  	// B:n (always)  service program data
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0].find("B:") != 0 ) { ok = false; break; }
        vector<int> SPD;
        for(size_t i=0; i < SPD.size(); i++) {
            SPD.push_back(sp->binToInt(list0[1+i].c_str()));
            }
        return;  // parsed ok
        } // end while(ok)

S2F7Service Program Run Send Sent by Host and Equipment

using namespace std;

    // S2F7 C++ Receive message - add next line to setup
    sp->messageTypeAdd( 2, 7, ::recvS2F7);

// receive method 
void recvS2F7(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect SPID
        // variables for data items and parsing
        string SPID;  	// A:6 (always)  service program identifier
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0].find("A:") != 0 ) { ok = false; break; }
        if ( list0.size() == 2) { SPID = list0[1];} else { SPID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(2, 8, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S2F7

S2F8Service Program Run Acknowledge Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S2F8 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(2, 7, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect CSAACK
        // variables for data items and parsing
        unsigned long CSAACK;  	// U1:1 (always)  equipment acknowledge code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "U1:1" ) { ok = false; break; }
        CSAACK = atoul(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S2F9Service Program Results Request Sent by Host and Equipment

using namespace std;

    // S2F9 C++ Receive message - add next line to setup
    sp->messageTypeAdd( 2, 9, ::recvS2F9);

// receive method 
void recvS2F9(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect SPID
        // variables for data items and parsing
        string SPID;  	// A:6 (always)  service program identifier
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0].find("A:") != 0 ) { ok = false; break; }
        if ( list0.size() == 2) { SPID = list0[1];} else { SPID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(2, 10, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S2F9

S2F10Service Program Results Data Sent by Host and Equipment

using namespace std;

    // S2F10 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(2, 9, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect SPR
        // variables for data items and parsing
        string SPR;  	// A:n (varies)  device dependent, any data type
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0.size() == 2) { SPR = list0[1];} else { SPR = ""; }
        return;  // parsed ok
        } // end while(ok)

S2F11Service Program Directory Request Sent by Host and Equipment

using namespace std;

    // S2F11 C++ Receive message - add next line to setup
    sp->messageTypeAdd( 2, 11, ::recvS2F11);

// receive method 
void recvS2F11(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // no data expected
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(2, 12, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S2F11

S2F12Service Program Directory Data Sent by Host and Equipment

using namespace std;

    // S2F12 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(2, 11, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:n SPID
        // variables for data items and parsing
        string SPID;  	// A:6 (always)  service program identifier
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if (list1.size() < 1) { ok = false; break; }
            if ( list1[0].find("A:") != 0 ) { ok = false; break; }
            if ( list1.size() == 2) { SPID = list1[1];} else { SPID = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S2F13REquipment Constant Request Sent by Host Only

using namespace std;

    // S2F13R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 2, 13, ::recvS2F13R);

// receive method 
void recvS2F13R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:n ECID
        // variables for data items and parsing
        string ECID;  	// U4:1 (varies)  equipment constant ID, GEM requires U4
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if (list1.size() < 1) { ok = false; break; }
            if ( list1.size() == 2) { ECID = list1[1];} else { ECID = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(2, 14, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S2F13R

S2F14Equipment Constant Data Sent by Equipment Only

using namespace std;

    // S2F14 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(2, 13, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:n ECV
        // variables for data items and parsing
        string ECV;  	// A:n (varies)  equipment constant value, any scalar type (constant is a misnomer)
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if (list1.size() < 1) { ok = false; break; }
            if ( list1.size() == 2) { ECV = list1[1];} else { ECV = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S2F15RNew Equipment Constant Send Sent by Host Only

using namespace std;

    // S2F15R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 2, 15, ::recvS2F15R);

// receive method 
void recvS2F15R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:n {L:2 ECID ECV}
        // variables for data items and parsing
        string ECID;  	// U4:1 (varies)  equipment constant ID, GEM requires U4
        string ECV;  	// A:n (varies)  equipment constant value, any scalar type (constant is a misnomer)
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
            vector<string> list2;
            sp->listSplit(list1[1], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { ECID = list2[1];} else { ECID = ""; }
            list2.clear();
            sp->listSplit(list1[2], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { ECV = list2[1];} else { ECV = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(2, 16, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S2F15R

S2F16New Equipment Constant Ack Sent by Equipment Only

using namespace std;

    // S2F16 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(2, 15, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect EAC
        // variables for data items and parsing
        int EAC;  	// B:1 (always)  equipment acknowledge code, 0 ok
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        EAC = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S2F17RDate and Time Request Sent by Host and Equipment

using namespace std;

    // S2F17R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 2, 17, ::recvS2F17R);

// receive method 
void recvS2F17R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // no data expected
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(2, 18, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S2F17R

S2F18Date and Time Data Sent by Host and Equipment

using namespace std;

    // S2F18 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(2, 17, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect TIME
        // variables for data items and parsing
        string TIME;  	// A:32 (always)  ECV TimeFormat controls format, 0=A:12 YYMMDDHHMMSS, 1=A:16 YYYYMMDDHHMMSScc,2=YYYY-MM-DDTHH:MM:SS.s[s]*{Z|+hh:mm|-hh:mm}
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0].find("A:") != 0 ) { ok = false; break; }
        if ( list0.size() == 2) { TIME = list0[1];} else { TIME = ""; }
        return;  // parsed ok
        } // end while(ok)

S2F19RReset/Initialize Send Sent by Host Only

using namespace std;

    // S2F19R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 2, 19, ::recvS2F19R);

// receive method 
void recvS2F19R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect RIC
        // variables for data items and parsing
        string RIC;  	// U1:1 (varies)  reset code, 1 means power up reset
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0.size() == 2) { RIC = list0[1];} else { RIC = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(2, 20, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S2F19R

S2F20Reset Acknowledge Sent by Equipment Only

using namespace std;

    // S2F20 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(2, 19, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect RAC
        // variables for data items and parsing
        string RAC;  	// U1:1 (varies)  reset acknowledge
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0.size() == 2) { RAC = list0[1];} else { RAC = ""; }
        return;  // parsed ok
        } // end while(ok)

S2F21[R]Remote Command Send Sent by Host Only

using namespace std;

    // S2F21 C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 2, 21, ::recvS2F21);

// receive method 
void recvS2F21(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect RCMD
        // variables for data items and parsing
        string RCMD;  	// A:n (varies)  remote command, GEM requires a maximum length of 20 printable characters, taken from hex 21-7E (no spaces)
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0.size() == 2) { RCMD = list0[1];} else { RCMD = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(2, 22, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S2F21

S2F22Remote Command Acknowledge Sent by Equipment Only

using namespace std;

    // S2F22 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(2, 21, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect CMDA
        // variables for data items and parsing
        int CMDA;  	// B:1 (always)  command acknowledge code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        CMDA = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S2F23RTrace Initialize Send Sent by Host Only

using namespace std;

    // S2F23R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 2, 23, ::recvS2F23R);

// receive method 
void recvS2F23R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:5 TRID DSPER TOTSMP REPGSZ {L:n SVID}
        // variables for data items and parsing
        string TRID;  	// A:n (varies)  trace request ID
        string DSPER;  	// A:6 (varies)  data sample period, hhmmss is always supported, A:8 hhmmsscc may be supported
        string TOTSMP;  	// U4:1 (varies)  total samples to be made, should be an even multiple of REPGSZ
        string REPGSZ;  	// U4:1 (varies)  reporting group size, TOTSMP modulo REPGSZ should be 0
        string SVID;  	// U4:1 (varies)  status variable ID
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 6 || list0[0] != "L:5") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { TRID = list1[1];} else { TRID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DSPER = list1[1];} else { DSPER = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { TOTSMP = list1[1];} else { TOTSMP = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { REPGSZ = list1[1];} else { REPGSZ = ""; }
        list1.clear();
        sp->listSplit(list0[5], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { SVID = list2[1];} else { SVID = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(2, 24, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S2F23R

S2F24Trace Initialize Acknowledge Sent by Equipment Only

using namespace std;

    // S2F24 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(2, 23, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect TIAACK
        // variables for data items and parsing
        int TIAACK;  	// B:1 (always)  trace acknowledgement code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        TIAACK = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S2F25RLoopback Diagnostic Request Sent by Host and Equipment

using namespace std;

    // S2F25R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 2, 25, ::recvS2F25R);

// receive method 
void recvS2F25R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect ABS
        // variables for data items and parsing
        int [] ABS;  	// B:n (always)  any binary string 
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0].find("B:") != 0 ) { ok = false; break; }
        vector<int> ABS;
        for(size_t i=0; i < ABS.size(); i++) {
            ABS.push_back(sp->binToInt(list0[1+i].c_str()));
            }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(2, 26, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S2F25R

S2F26Loopback Diagnostic Data Sent by Host and Equipment

using namespace std;

    // S2F26 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(2, 25, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect ABS
        // variables for data items and parsing
        int [] ABS;  	// B:n (always)  any binary string 
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0].find("B:") != 0 ) { ok = false; break; }
        vector<int> ABS;
        for(size_t i=0; i < ABS.size(); i++) {
            ABS.push_back(sp->binToInt(list0[1+i].c_str()));
            }
        return;  // parsed ok
        } // end while(ok)

S2F27RInitiate Processing Request Sent by Host Only

using namespace std;

    // S2F27R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 2, 27, ::recvS2F27R);

// receive method 
void recvS2F27R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:3 LOC PPID {L:n MID}
        // variables for data items and parsing
        int LOC;  	// B:1 (always)  material location code
        string PPID;  	// A:80 (varies)  process program ID
        string MID;  	// A:16 (varies)  material ID, E40 restricts to A:n
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        LOC = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { PPID = list1[1];} else { PPID = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { MID = list2[1];} else { MID = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(2, 28, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S2F27R

S2F28Initiate Processing Acknowledge Sent by Equipment Only

using namespace std;

    // S2F28 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(2, 27, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect CMDA
        // variables for data items and parsing
        int CMDA;  	// B:1 (always)  command acknowledge code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        CMDA = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S2F29REquipment Constant Namelist Request Sent by Host Only

using namespace std;

    // S2F29R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 2, 29, ::recvS2F29R);

// receive method 
void recvS2F29R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:n ECID
        // variables for data items and parsing
        string ECID;  	// U4:1 (varies)  equipment constant ID, GEM requires U4
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if (list1.size() < 1) { ok = false; break; }
            if ( list1.size() == 2) { ECID = list1[1];} else { ECID = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(2, 30, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S2F29R

S2F30Equipment Constant Namelist Sent by Equipment Only

using namespace std;

    // S2F30 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(2, 29, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:n {L:6 ECID ECNAME ECMIN ECMAX ECDEF UNITS}
        // variables for data items and parsing
        string ECID;  	// U4:1 (varies)  equipment constant ID, GEM requires U4
        string ECNAME;  	// A:n (always)  equipment constant name
        string ECMIN;  	// A:n (varies)  equipment constant minimum value, any scalar type
        string ECMAX;  	// A:n (varies)  equipment constant maximum value, any scalar type
        string ECDEF;  	// A:n (varies)  equipment constant default value
        string UNITS;  	// A:n (always)  units identifier (see E5 Section 9)
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if ( list1.size() != 7 || list1[0] != "L:6") { ok=false; break; }
            vector<string> list2;
            sp->listSplit(list1[1], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { ECID = list2[1];} else { ECID = ""; }
            list2.clear();
            sp->listSplit(list1[2], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { ECNAME = list2[1];} else { ECNAME = ""; }
            list2.clear();
            sp->listSplit(list1[3], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { ECMIN = list2[1];} else { ECMIN = ""; }
            list2.clear();
            sp->listSplit(list1[4], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { ECMAX = list2[1];} else { ECMAX = ""; }
            list2.clear();
            sp->listSplit(list1[5], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { ECDEF = list2[1];} else { ECDEF = ""; }
            list2.clear();
            sp->listSplit(list1[6], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { UNITS = list2[1];} else { UNITS = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S2F31RDate and Time Set Request Sent by Host Only

using namespace std;

    // S2F31R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 2, 31, ::recvS2F31R);

// receive method 
void recvS2F31R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect TIME
        // variables for data items and parsing
        string TIME;  	// A:32 (always)  ECV TimeFormat controls format, 0=A:12 YYMMDDHHMMSS, 1=A:16 YYYYMMDDHHMMSScc,2=YYYY-MM-DDTHH:MM:SS.s[s]*{Z|+hh:mm|-hh:mm}
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0].find("A:") != 0 ) { ok = false; break; }
        if ( list0.size() == 2) { TIME = list0[1];} else { TIME = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(2, 32, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S2F31R

S2F32Date and Time Set Acknowledge Sent by Equipment Only

using namespace std;

    // S2F32 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(2, 31, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect TIACK
        // variables for data items and parsing
        int TIACK;  	// B:1 (always)  time set acknowledge
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        TIACK = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S2F33RDefine Report Sent by Host Only

using namespace std;

    // S2F33R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 2, 33, ::recvS2F33R);

// receive method 
void recvS2F33R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 DATAID {L:a {L:2 RPTID {L:b VID}}}
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string RPTID;  	// U4:1 (varies)  report ID
        string VID;  	// A:n (varies)  A variable ID
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t a=1; a < list1.size(); a++) {
            vector<string> list2;
            sp->listSplit(list1[a], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { RPTID = list3[1];} else { RPTID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if ( list3.size() < 1) { ok=false; break; }
            for(size_t b=1; b < list3.size(); b++) {
                vector<string> list4;
                sp->listSplit(list3[b], list4);
                if (list4.size() < 1) { ok = false; break; }
                if ( list4.size() == 2) { VID = list4[1];} else { VID = ""; }
                }
            if (!ok) break;
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(2, 34, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S2F33R

S2F34Define Report Acknowledge Sent by Equipment Only

using namespace std;

    // S2F34 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(2, 33, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect DRACK
        // variables for data items and parsing
        int DRACK;  	// B:1 (always)  define report acknowledge
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        DRACK = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S2F35RLink Event Report Sent by Host Only

using namespace std;

    // S2F35R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 2, 35, ::recvS2F35R);

// receive method 
void recvS2F35R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 DATAID {L:a {L:2 CEID {L:b RPTID}}}
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string CEID;  	// U4:1 (varies)  collection event identifier, GEM requires type Un
        string RPTID;  	// U4:1 (varies)  report ID
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t a=1; a < list1.size(); a++) {
            vector<string> list2;
            sp->listSplit(list1[a], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { CEID = list3[1];} else { CEID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if ( list3.size() < 1) { ok=false; break; }
            for(size_t b=1; b < list3.size(); b++) {
                vector<string> list4;
                sp->listSplit(list3[b], list4);
                if (list4.size() < 1) { ok = false; break; }
                if ( list4.size() == 2) { RPTID = list4[1];} else { RPTID = ""; }
                }
            if (!ok) break;
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(2, 36, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S2F35R

S2F36Link Event Report Acknowledge Sent by Equipment Only

using namespace std;

    // S2F36 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(2, 35, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect LRACK
        // variables for data items and parsing
        int LRACK;  	// B:1 (always)  link report acknowledge
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        LRACK = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S2F37REnable/Disable Event Report Sent by Host Only

using namespace std;

    // S2F37R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 2, 37, ::recvS2F37R);

// receive method 
void recvS2F37R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 CEED {L:n CEID}
        // variables for data items and parsing
        int CEED;  	// TF:1 (always)  collection event or trace enablement, true is enabled
        string CEID;  	// U4:1 (varies)  collection event identifier, GEM requires type Un
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "TF:1" ) { ok = false; break; }
        CEED = atoi(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { CEID = list2[1];} else { CEID = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(2, 38, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S2F37R

S2F38Enable/Disable Event Report Acknowledge Sent by Equipment Only

using namespace std;

    // S2F38 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(2, 37, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect ERACK
        // variables for data items and parsing
        int ERACK;  	// B:1 (always)  enable/disable event report acknowledge
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        ERACK = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S2F39RMulti-block Inquire Sent by Host Only

using namespace std;

    // S2F39R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 2, 39, ::recvS2F39R);

// receive method 
void recvS2F39R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 DATAID DATALENGTH
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string DATALENGTH;  	// U4:1 (varies)  total bytes of the message body 
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATALENGTH = list1[1];} else { DATALENGTH = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(2, 40, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S2F39R

S2F40Multi-block Grant Sent by Equipment Only

using namespace std;

    // S2F40 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(2, 39, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect GRANT
        // variables for data items and parsing
        int GRANT;  	// B:1 (always)  multiblock grant code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        GRANT = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S2F41RHost Command Send Sent by Host Only

using namespace std;

    // S2F41R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 2, 41, ::recvS2F41R);

// receive method 
void recvS2F41R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 RCMD {L:n {L:2 CPNAME CPVAL}}
        // variables for data items and parsing
        string RCMD;  	// A:n (varies)  remote command, GEM requires a maximum length of 20 printable characters, taken from hex 21-7E (no spaces)
        string CPNAME;  	// A:n (varies)  command parameter name
        string CPVAL;  	// A:n (varies)  command parameter value, any scalar type
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { RCMD = list1[1];} else { RCMD = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { CPNAME = list3[1];} else { CPNAME = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { CPVAL = list3[1];} else { CPVAL = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(2, 42, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S2F41R

S2F42Host Command Acknowledge Sent by Equipment Only

using namespace std;

    // S2F42 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(2, 41, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 HCACK {L:n {L:2 CPNAME CPACK}}
        // variables for data items and parsing
        int HCACK;  	// B:1 (always)  remote command acknowledge
        string CPNAME;  	// A:n (varies)  command parameter name
        int CPACK;  	// B:1 (always)  remote command parameter acknowledge, only received if error
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        HCACK = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { CPNAME = list3[1];} else { CPNAME = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "B:1" ) { ok = false; break; }
            CPACK = sp->binToInt(list3[1].c_str());
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S2F43RConfigure Spooling Sent by Host Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S2F43R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 2, 43, ::recvS2F43R);

// receive method 
void recvS2F43R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:m {L:2 STRID {L:n FCNID}}
        // variables for data items and parsing
        unsigned long STRID;  	// U1:1 (always)  stream value
        unsigned long FCNID;  	// U1:1 (always)  message type function value
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t m=1; m < list0.size(); m++) {
            vector<string> list1;
            sp->listSplit(list0[m], list1);
            if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
            vector<string> list2;
            sp->listSplit(list1[1], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0] != "U1:1" ) { ok = false; break; }
            STRID = atoul(list2[1].c_str());
            list2.clear();
            sp->listSplit(list1[2], list2);
            if ( list2.size() < 1) { ok=false; break; }
            for(size_t n=1; n < list2.size(); n++) {
                vector<string> list3;
                sp->listSplit(list2[n], list3);
                if (list3.size() < 1) { ok = false; break; }
                if ( list3[0] != "U1:1" ) { ok = false; break; }
                FCNID = atoul(list3[1].c_str());
                }
            if (!ok) break;
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(2, 44, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S2F43R

S2F44Configure Spooling Acknowledge Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S2F44 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(2, 43, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 RSPACK {L:m {L:3 STRID STRACK {L:n FCNID}}}
        // variables for data items and parsing
        int RSPACK;  	// B:1 (always)  spooling response
        unsigned long STRID;  	// U1:1 (always)  stream value
        int STRACK;  	// B:1 (always)  spooling stream acknowledge
        unsigned long FCNID;  	// U1:1 (always)  message type function value
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        RSPACK = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t m=1; m < list1.size(); m++) {
            vector<string> list2;
            sp->listSplit(list1[m], list2);
            if ( list2.size() != 4 || list2[0] != "L:3") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "U1:1" ) { ok = false; break; }
            STRID = atoul(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "B:1" ) { ok = false; break; }
            STRACK = sp->binToInt(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[3], list3);
            if ( list3.size() < 1) { ok=false; break; }
            for(size_t n=1; n < list3.size(); n++) {
                vector<string> list4;
                sp->listSplit(list3[n], list4);
                if (list4.size() < 1) { ok = false; break; }
                if ( list4[0] != "U1:1" ) { ok = false; break; }
                FCNID = atoul(list4[1].c_str());
                }
            if (!ok) break;
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S2F45RDefine Variable Limit Attributes Sent by Host Only

using namespace std;

    // S2F45R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 2, 45, ::recvS2F45R);

// receive method 
void recvS2F45R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 DATAID {L:m {L:2 VID {L:n {L:2 LIMITID {L:2* UPPERDB LOWERDB}}}}}
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string VID;  	// A:n (varies)  A variable ID
        int LIMITID;  	// B:1 (always)  identifies a specific limit
        string UPPERDB;  	// F4:1 (varies)  the upper bound of a deadband limit
        string LOWERDB;  	// F4:1 (varies)  the lower bound of a deadband limit
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t m=1; m < list1.size(); m++) {
            vector<string> list2;
            sp->listSplit(list1[m], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { VID = list3[1];} else { VID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if ( list3.size() < 1) { ok=false; break; }
            for(size_t n=1; n < list3.size(); n++) {
                vector<string> list4;
                sp->listSplit(list3[n], list4);
                if ( list4.size() != 3 || list4[0] != "L:2") { ok=false; break; }
                vector<string> list5;
                sp->listSplit(list4[1], list5);
                if (list5.size() < 1) { ok = false; break; }
                if ( list5[0] != "B:1" ) { ok = false; break; }
                LIMITID = sp->binToInt(list5[1].c_str());
                list5.clear();
                sp->listSplit(list4[2], list5);
                if ( list5.size() == 3 ) {  // 2 optional items found
                    vector<string> list6;
                    sp->listSplit(list5[1], list6);
                    if (list6.size() < 1) { ok = false; break; }
                    if ( list6.size() == 2) { UPPERDB = list6[1];} else { UPPERDB = ""; }
                    list6.clear();
                    sp->listSplit(list5[2], list6);
                    if (list6.size() < 1) { ok = false; break; }
                    if ( list6.size() == 2) { LOWERDB = list6[1];} else { LOWERDB = ""; }
                    }
                }
            if (!ok) break;
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(2, 46, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S2F45R

S2F46Define Variable Limit Attributes Acknowledge Sent by Equipment Only

using namespace std;

    // S2F46 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(2, 45, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 VLAACK {L:m {L:3 VID LVACK {L:2* LIMITID LIMITACK}}}
        // variables for data items and parsing
        int VLAACK;  	// B:1 (always)  variable limit attribute acknowledge
        string VID;  	// A:n (varies)  A variable ID
        int LVACK;  	// B:1 (always)  variable limit error code
        int LIMITID;  	// B:1 (always)  identifies a specific limit
        int LIMITACK;  	// B:1 (always)  variable limit value error code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        VLAACK = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t m=1; m < list1.size(); m++) {
            vector<string> list2;
            sp->listSplit(list1[m], list2);
            if ( list2.size() != 4 || list2[0] != "L:3") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { VID = list3[1];} else { VID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "B:1" ) { ok = false; break; }
            LVACK = sp->binToInt(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[3], list3);
            if ( list3.size() == 3 ) {  // 2 optional items found
                vector<string> list4;
                sp->listSplit(list3[1], list4);
                if (list4.size() < 1) { ok = false; break; }
                if ( list4[0] != "B:1" ) { ok = false; break; }
                LIMITID = sp->binToInt(list4[1].c_str());
                list4.clear();
                sp->listSplit(list3[2], list4);
                if (list4.size() < 1) { ok = false; break; }
                if ( list4[0] != "B:1" ) { ok = false; break; }
                LIMITACK = sp->binToInt(list4[1].c_str());
                }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S2F47RVariable Limit Attribute Request Sent by Host Only

using namespace std;

    // S2F47R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 2, 47, ::recvS2F47R);

// receive method 
void recvS2F47R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:m VID
        // variables for data items and parsing
        string VID;  	// A:n (varies)  A variable ID
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t m=1; m < list0.size(); m++) {
            vector<string> list1;
            sp->listSplit(list0[m], list1);
            if (list1.size() < 1) { ok = false; break; }
            if ( list1.size() == 2) { VID = list1[1];} else { VID = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(2, 48, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S2F47R

S2F48Variable Limit Attribute Send Sent by Equipment Only

using namespace std;

    // S2F48 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(2, 47, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:m {L:2 VID {L:4* UNITS LIMITMIN LIMITMAX {L:n {L:3 LIMITID UPPERDB LOWERDB}}}}
        // variables for data items and parsing
        string VID;  	// A:n (varies)  A variable ID
        string UNITS;  	// A:n (always)  units identifier (see E5 Section 9)
        string LIMITMIN;  	// F4:1 (varies)  The minimum value allowed for the lower dead band limit
        string LIMITMAX;  	// F4:1 (varies)  The maximum value allowed for the upper dead band limit
        int LIMITID;  	// B:1 (always)  identifies a specific limit
        string UPPERDB;  	// F4:1 (varies)  the upper bound of a deadband limit
        string LOWERDB;  	// F4:1 (varies)  the lower bound of a deadband limit
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t m=1; m < list0.size(); m++) {
            vector<string> list1;
            sp->listSplit(list0[m], list1);
            if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
            vector<string> list2;
            sp->listSplit(list1[1], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { VID = list2[1];} else { VID = ""; }
            list2.clear();
            sp->listSplit(list1[2], list2);
            if ( list2.size() == 5 ) {  // 4 optional items found
                vector<string> list3;
                sp->listSplit(list2[1], list3);
                if (list3.size() < 1) { ok = false; break; }
                if ( list3[0].find("A:") != 0 ) { ok = false; break; }
                if ( list3.size() == 2) { UNITS = list3[1];} else { UNITS = ""; }
                list3.clear();
                sp->listSplit(list2[2], list3);
                if (list3.size() < 1) { ok = false; break; }
                if ( list3.size() == 2) { LIMITMIN = list3[1];} else { LIMITMIN = ""; }
                list3.clear();
                sp->listSplit(list2[3], list3);
                if (list3.size() < 1) { ok = false; break; }
                if ( list3.size() == 2) { LIMITMAX = list3[1];} else { LIMITMAX = ""; }
                list3.clear();
                sp->listSplit(list2[4], list3);
                if ( list3.size() < 1) { ok=false; break; }
                for(size_t n=1; n < list3.size(); n++) {
                    vector<string> list4;
                    sp->listSplit(list3[n], list4);
                    if ( list4.size() != 4 || list4[0] != "L:3") { ok=false; break; }
                    vector<string> list5;
                    sp->listSplit(list4[1], list5);
                    if (list5.size() < 1) { ok = false; break; }
                    if ( list5[0] != "B:1" ) { ok = false; break; }
                    LIMITID = sp->binToInt(list5[1].c_str());
                    list5.clear();
                    sp->listSplit(list4[2], list5);
                    if (list5.size() < 1) { ok = false; break; }
                    if ( list5.size() == 2) { UPPERDB = list5[1];} else { UPPERDB = ""; }
                    list5.clear();
                    sp->listSplit(list4[3], list5);
                    if (list5.size() < 1) { ok = false; break; }
                    if ( list5.size() == 2) { LOWERDB = list5[1];} else { LOWERDB = ""; }
                    }
                if (!ok) break;
                }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S2F49REnhanced Remote Command Sent by Host Only

using namespace std;

    // S2F49R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 2, 49, ::recvS2F49R);

// receive method 
void recvS2F49R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:4 DATAID OBJSPEC RCMD {L:m {L:2 CPNAME CEPVAL}}
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string OBJSPEC;  	// A:n (varies)  E39 structured text identifying an object, [object type:object id>]+
        string RCMD;  	// A:n (varies)  remote command, GEM requires a maximum length of 20 printable characters, taken from hex 21-7E (no spaces)
        string CPNAME;  	// A:n (varies)  command parameter name
        string CEPVAL;  	// A:n (varies)  an enhanced parameter value, may be a scalar of any type, a list of values of the same type, or a list of possibly nested {L:2 CPNAME CEPVAL}
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 5 || list0[0] != "L:4") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJSPEC = list1[1];} else { OBJSPEC = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { RCMD = list1[1];} else { RCMD = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t m=1; m < list1.size(); m++) {
            vector<string> list2;
            sp->listSplit(list1[m], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { CPNAME = list3[1];} else { CPNAME = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { CEPVAL = list3[1];} else { CEPVAL = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(2, 50, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S2F49R

S2F50Enhanced Remote Command Acknowledge Sent by Equipment Only

using namespace std;

    // S2F50 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(2, 49, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 HCACK {L:n {L:2 CPNAME CEPACK}}
        // variables for data items and parsing
        int HCACK;  	// B:1 (always)  remote command acknowledge
        string CPNAME;  	// A:n (varies)  command parameter name
        int CEPACK;  	// B:1 (always)  command enhanced parameter acknowledge, may be a list or nested list structure to mirror the input structure of a CEPVAL
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        HCACK = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { CPNAME = list3[1];} else { CPNAME = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "B:1" ) { ok = false; break; }
            CEPACK = sp->binToInt(list3[1].c_str());
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S2F51RRequest Report Identifiers Sent by Host Only

using namespace std;

    // S2F51R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 2, 51, ::recvS2F51R);

// receive method 
void recvS2F51R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // no data expected
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(2, 52, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S2F51R

S2F52Return Report Identifiers Sent by Equipment Only

using namespace std;

    // S2F52 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(2, 51, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:n RPTID
        // variables for data items and parsing
        string RPTID;  	// U4:1 (varies)  report ID
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if (list1.size() < 1) { ok = false; break; }
            if ( list1.size() == 2) { RPTID = list1[1];} else { RPTID = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S2F53RRequest Report Definitions Sent by Host Only

using namespace std;

    // S2F53R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 2, 53, ::recvS2F53R);

// receive method 
void recvS2F53R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:n RPTID
        // variables for data items and parsing
        string RPTID;  	// U4:1 (varies)  report ID
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if (list1.size() < 1) { ok = false; break; }
            if ( list1.size() == 2) { RPTID = list1[1];} else { RPTID = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(2, 54, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S2F53R

S2F54Return Report Definitions Sent by Equipment Only

using namespace std;

    // S2F54 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(2, 53, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:n {L:2 RPTID {L:a VID}} 
        // variables for data items and parsing
        string RPTID;  	// U4:1 (varies)  report ID
        string VID;  	// A:n (varies)  A variable ID
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
            vector<string> list2;
            sp->listSplit(list1[1], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { RPTID = list2[1];} else { RPTID = ""; }
            list2.clear();
            sp->listSplit(list1[2], list2);
            if ( list2.size() < 1) { ok=false; break; }
            for(size_t a=1; a < list2.size(); a++) {
                vector<string> list3;
                sp->listSplit(list2[a], list3);
                if (list3.size() < 1) { ok = false; break; }
                if ( list3.size() == 2) { VID = list3[1];} else { VID = ""; }
                }
            if (!ok) break;
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S2F55RRequest Event Report Links Sent by Host Only

using namespace std;

    // S2F55R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 2, 55, ::recvS2F55R);

// receive method 
void recvS2F55R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:n CEID
        // variables for data items and parsing
        string CEID;  	// U4:1 (varies)  collection event identifier, GEM requires type Un
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if (list1.size() < 1) { ok = false; break; }
            if ( list1.size() == 2) { CEID = list1[1];} else { CEID = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(2, 56, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S2F55R

S2F56Return Event Report Links Sent by Equipment Only

using namespace std;

    // S2F56 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(2, 55, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:n {L:3 CEID CENAME {L:a RPTID}}
        // variables for data items and parsing
        string CEID;  	// U4:1 (varies)  collection event identifier, GEM requires type Un
        string CENAME;  	// A:n (always)  a descriptive name for a Data Collection Event
        string RPTID;  	// U4:1 (varies)  report ID
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if ( list1.size() != 4 || list1[0] != "L:3") { ok=false; break; }
            vector<string> list2;
            sp->listSplit(list1[1], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { CEID = list2[1];} else { CEID = ""; }
            list2.clear();
            sp->listSplit(list1[2], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { CENAME = list2[1];} else { CENAME = ""; }
            list2.clear();
            sp->listSplit(list1[3], list2);
            if ( list2.size() < 1) { ok=false; break; }
            for(size_t a=1; a < list2.size(); a++) {
                vector<string> list3;
                sp->listSplit(list2[a], list3);
                if (list3.size() < 1) { ok = false; break; }
                if ( list3.size() == 2) { RPTID = list3[1];} else { RPTID = ""; }
                }
            if (!ok) break;
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S2F57RRequest Enabled Events Sent by Host Only

using namespace std;

    // S2F57R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 2, 57, ::recvS2F57R);

// receive method 
void recvS2F57R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // no data expected
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(2, 58, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S2F57R

S2F58Return Enabled Events Sent by Equipment Only

using namespace std;

    // S2F58 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(2, 57, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:n CEID
        // variables for data items and parsing
        string CEID;  	// U4:1 (varies)  collection event identifier, GEM requires type Un
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if (list1.size() < 1) { ok = false; break; }
            if ( list1.size() == 2) { CEID = list1[1];} else { CEID = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S2F59RRequest Spool Streams and Functions Sent by Host Only

using namespace std;

    // S2F59R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 2, 59, ::recvS2F59R);

// receive method 
void recvS2F59R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // no data expected
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(2, 60, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S2F59R

S2F60Return Spool Streams and Functions Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S2F60 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(2, 59, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:n {L:2 STRID {L:a FCNID}}
        // variables for data items and parsing
        unsigned long STRID;  	// U1:1 (always)  stream value
        unsigned long FCNID;  	// U1:1 (always)  message type function value
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
            vector<string> list2;
            sp->listSplit(list1[1], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0] != "U1:1" ) { ok = false; break; }
            STRID = atoul(list2[1].c_str());
            list2.clear();
            sp->listSplit(list1[2], list2);
            if ( list2.size() < 1) { ok=false; break; }
            for(size_t a=1; a < list2.size(); a++) {
                vector<string> list3;
                sp->listSplit(list2[a], list3);
                if (list3.size() < 1) { ok = false; break; }
                if ( list3[0] != "U1:1" ) { ok = false; break; }
                FCNID = atoul(list3[1].c_str());
                }
            if (!ok) break;
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S2F61RRequest Trace Identifiers Sent by Host Only

using namespace std;

    // S2F61R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 2, 61, ::recvS2F61R);

// receive method 
void recvS2F61R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // no data expected
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(2, 62, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S2F61R

S2F62Return Trace Identifiers Sent by Equipment Only

using namespace std;

    // S2F62 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(2, 61, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:n TRID
        // variables for data items and parsing
        string TRID;  	// A:n (varies)  trace request ID
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if (list1.size() < 1) { ok = false; break; }
            if ( list1.size() == 2) { TRID = list1[1];} else { TRID = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S2F63RRequest Trace Definitions Sent by Host Only

using namespace std;

    // S2F63R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 2, 63, ::recvS2F63R);

// receive method 
void recvS2F63R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:n TRID
        // variables for data items and parsing
        string TRID;  	// A:n (varies)  trace request ID
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if (list1.size() < 1) { ok = false; break; }
            if ( list1.size() == 2) { TRID = list1[1];} else { TRID = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(2, 64, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S2F63R

S2F64Return Trace Definitions Sent by Equipment Only

using namespace std;

    // S2F64 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(2, 63, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:n {L:5 TRID DSPER TOTSMP REPGSZ {L:a SVID}}
        // variables for data items and parsing
        string TRID;  	// A:n (varies)  trace request ID
        string DSPER;  	// A:6 (varies)  data sample period, hhmmss is always supported, A:8 hhmmsscc may be supported
        string TOTSMP;  	// U4:1 (varies)  total samples to be made, should be an even multiple of REPGSZ
        string REPGSZ;  	// U4:1 (varies)  reporting group size, TOTSMP modulo REPGSZ should be 0
        string SVID;  	// U4:1 (varies)  status variable ID
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if ( list1.size() != 6 || list1[0] != "L:5") { ok=false; break; }
            vector<string> list2;
            sp->listSplit(list1[1], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { TRID = list2[1];} else { TRID = ""; }
            list2.clear();
            sp->listSplit(list1[2], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { DSPER = list2[1];} else { DSPER = ""; }
            list2.clear();
            sp->listSplit(list1[3], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { TOTSMP = list2[1];} else { TOTSMP = ""; }
            list2.clear();
            sp->listSplit(list1[4], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { REPGSZ = list2[1];} else { REPGSZ = ""; }
            list2.clear();
            sp->listSplit(list1[5], list2);
            if ( list2.size() < 1) { ok=false; break; }
            for(size_t a=1; a < list2.size(); a++) {
                vector<string> list3;
                sp->listSplit(list2[a], list3);
                if (list3.size() < 1) { ok = false; break; }
                if ( list3.size() == 2) { SVID = list3[1];} else { SVID = ""; }
                }
            if (!ok) break;
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S3F1RMaterial Status Request Sent by Host Only

using namespace std;

    // S3F1R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 3, 1, ::recvS3F1R);

// receive method 
void recvS3F1R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // no data expected
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(3, 2, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S3F1R

S3F2Material Status Data Sent by Equipment Only

using namespace std;

    // S3F2 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(3, 1, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 MF {L:m {L:3 LOC QUA MID}} 
        // variables for data items and parsing
        string MF;  	// B:1 (varies)  material format code, ASCII indicates generic units, E40 restricts to B:1
        int LOC;  	// B:1 (always)  material location code
        int QUA;  	// B:1 (always)  quantity (format limits max to 255!)
        string MID;  	// A:16 (varies)  material ID, E40 restricts to A:n
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { MF = list1[1];} else { MF = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t m=1; m < list1.size(); m++) {
            vector<string> list2;
            sp->listSplit(list1[m], list2);
            if ( list2.size() != 4 || list2[0] != "L:3") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "B:1" ) { ok = false; break; }
            LOC = sp->binToInt(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "B:1" ) { ok = false; break; }
            QUA = sp->binToInt(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[3], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { MID = list3[1];} else { MID = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S3F3RTime to Completion Data Sent by Host Only

using namespace std;

    // S3F3R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 3, 3, ::recvS3F3R);

// receive method 
void recvS3F3R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // no data expected
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(3, 4, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S3F3R

S3F4Time to Completion Data Sent by Equipment Only

using namespace std;

    // S3F4 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(3, 3, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 MF {L:m {L:3 TTC QUA MID}}
        // variables for data items and parsing
        string MF;  	// B:1 (varies)  material format code, ASCII indicates generic units, E40 restricts to B:1
        string TTC;  	// U4:1 (varies)  time to completion, standard does not specify units, in seconds??
        int QUA;  	// B:1 (always)  quantity (format limits max to 255!)
        string MID;  	// A:16 (varies)  material ID, E40 restricts to A:n
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { MF = list1[1];} else { MF = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t m=1; m < list1.size(); m++) {
            vector<string> list2;
            sp->listSplit(list1[m], list2);
            if ( list2.size() != 4 || list2[0] != "L:3") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { TTC = list3[1];} else { TTC = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "B:1" ) { ok = false; break; }
            QUA = sp->binToInt(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[3], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { MID = list3[1];} else { MID = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S3F5[R]Material Found Send Sent by Equipment Only

using namespace std;

    // S3F5 C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 3, 5, ::recvS3F5);

// receive method 
void recvS3F5(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 MF QUA
        // variables for data items and parsing
        string MF;  	// B:1 (varies)  material format code, ASCII indicates generic units, E40 restricts to B:1
        int QUA;  	// B:1 (always)  quantity (format limits max to 255!)
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { MF = list1[1];} else { MF = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        QUA = sp->binToInt(list1[1].c_str());
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(3, 6, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S3F5

S3F6Material Found Acknowledge Sent by Host Only

using namespace std;

    // S3F6 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(3, 5, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect ACKC3
        // variables for data items and parsing
        int ACKC3;  	// B:1 (always)  acknowledge code, 0 ok 
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        ACKC3 = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S3F7[R]Material Lost Send Sent by Equipment Only

using namespace std;

    // S3F7 C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 3, 7, ::recvS3F7);

// receive method 
void recvS3F7(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:3 MF QUA MID
        // variables for data items and parsing
        string MF;  	// B:1 (varies)  material format code, ASCII indicates generic units, E40 restricts to B:1
        int QUA;  	// B:1 (always)  quantity (format limits max to 255!)
        string MID;  	// A:16 (varies)  material ID, E40 restricts to A:n
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { MF = list1[1];} else { MF = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        QUA = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { MID = list1[1];} else { MID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(3, 8, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S3F7

S3F8Material Lost Ack Sent by Host Only

using namespace std;

    // S3F8 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(3, 7, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect ACKC3
        // variables for data items and parsing
        int ACKC3;  	// B:1 (always)  acknowledge code, 0 ok 
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        ACKC3 = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S3F9RMatl ID Equate Send Sent by Equipment Only

using namespace std;

    // S3F9R C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 3, 9, ::recvS3F9R);

// receive method 
void recvS3F9R(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 MID EMID
        // variables for data items and parsing
        string MID;  	// A:16 (varies)  material ID, E40 restricts to A:n
        string EMID;  	// A:16 (varies)  equivalent material ID
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { MID = list1[1];} else { MID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { EMID = list1[1];} else { EMID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(3, 10, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S3F9R

S3F10Matl ID Equate Ack Sent by Host Only

using namespace std;

    // S3F10 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(3, 9, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect ACKC3
        // variables for data items and parsing
        int ACKC3;  	// B:1 (always)  acknowledge code, 0 ok 
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        ACKC3 = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S3F11RMatl ID Request Sent by Equipment Only

using namespace std;

    // S3F11R C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 3, 11, ::recvS3F11R);

// receive method 
void recvS3F11R(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect PTN
        // variables for data items and parsing
        string PTN;  	// U1:1 (varies)  material port number, E87 shows type U1:1 with data 1-255
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0.size() == 2) { PTN = list0[1];} else { PTN = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(3, 12, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S3F11R

S3F12Matl ID Request Ack Sent by Host Only

using namespace std;

    // S3F12 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(3, 11, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:3 PTN MIDRA MID
        // variables for data items and parsing
        string PTN;  	// U1:1 (varies)  material port number, E87 shows type U1:1 with data 1-255
        int MIDRA;  	// B:1 (always)  material ID Ack code
        string MID;  	// A:16 (varies)  material ID, E40 restricts to A:n
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { PTN = list1[1];} else { PTN = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        MIDRA = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { MID = list1[1];} else { MID = ""; }
        return;  // parsed ok
        } // end while(ok)

S3F13RMatl ID Send Sent by Host Only

using namespace std;

    // S3F13R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 3, 13, ::recvS3F13R);

// receive method 
void recvS3F13R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 PTN MID
        // variables for data items and parsing
        string PTN;  	// U1:1 (varies)  material port number, E87 shows type U1:1 with data 1-255
        string MID;  	// A:16 (varies)  material ID, E40 restricts to A:n
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { PTN = list1[1];} else { PTN = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { MID = list1[1];} else { MID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(3, 14, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S3F13R

S3F14Matl ID Ack Sent by Equipment Only

using namespace std;

    // S3F14 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(3, 13, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect MIDAC
        // variables for data items and parsing
        int MIDAC;  	// B:1 (always)  material ID ack
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        MIDAC = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S3F15RSECS-I Matls Multi-block Inquire, not required for HSMS Sent by Host Only

using namespace std;

    // S3F15R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 3, 15, ::recvS3F15R);

// receive method 
void recvS3F15R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 DATAID DATALENGTH
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string DATALENGTH;  	// U4:1 (varies)  total bytes of the message body 
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATALENGTH = list1[1];} else { DATALENGTH = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(3, 16, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S3F15R

S3F16Matls Multi-block Grant Sent by Equipment Only

using namespace std;

    // S3F16 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(3, 15, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect GRANT
        // variables for data items and parsing
        int GRANT;  	// B:1 (always)  multiblock grant code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        GRANT = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S3F17RCarrier Action Request Sent by Host Only

using namespace std;

    // S3F17R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 3, 17, ::recvS3F17R);

// receive method 
void recvS3F17R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:5 DATAID CARRIERACTION CARRIERID PTN {L:n {L:2 CATTRID CATTRDATA}}
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string CARRIERACTION;  	// A:n (always)  carrier action request
        string CARRIERID;  	// A:n (always)  carrier ID
        string PTN;  	// U1:1 (varies)  material port number, E87 shows type U1:1 with data 1-255
        string CATTRID;  	// A:n (varies)  carrier attribute identifier, E87 requires text per E39.1, Sec 6
        string CATTRDATA;  	// A:n (varies)  carrier attribute value (any data type)
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 6 || list0[0] != "L:5") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { CARRIERACTION = list1[1];} else { CARRIERACTION = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { CARRIERID = list1[1];} else { CARRIERID = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { PTN = list1[1];} else { PTN = ""; }
        list1.clear();
        sp->listSplit(list0[5], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { CATTRID = list3[1];} else { CATTRID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { CATTRDATA = list3[1];} else { CATTRDATA = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(3, 18, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S3F17R

S3F18Carrier Action Ack Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S3F18 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(3, 17, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 CAACK {L:n {L:2 ERRCODE ERRTEXT}}
        // variables for data items and parsing
        unsigned long CAACK;  	// U1:1 (always)  carrier action acknowledge 
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        CAACK = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ERRCODE = list3[1];} else { ERRCODE = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { ERRTEXT = list3[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S3F19RCancel All Carrier Out Req Sent by Host Only

using namespace std;

    // S3F19R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 3, 19, ::recvS3F19R);

// receive method 
void recvS3F19R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // no data expected
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(3, 20, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S3F19R

S3F20Cancel All Carrier Out Ack Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S3F20 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(3, 19, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 CAACK {L:n {L:2 ERRCODE ERRTEXT}}
        // variables for data items and parsing
        unsigned long CAACK;  	// U1:1 (always)  carrier action acknowledge 
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        CAACK = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ERRCODE = list3[1];} else { ERRCODE = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { ERRTEXT = list3[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S3F21RPort Group Defn Sent by Host Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S3F21R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 3, 21, ::recvS3F21R);

// receive method 
void recvS3F21R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:3 PORTGRPNAME ACCESSMODE {L:n PTN}
        // variables for data items and parsing
        string PORTGRPNAME;  	// A:n (always)  name of a group of ports
        unsigned long ACCESSMODE;  	// U1:1 (always)  load port access mode
        string PTN;  	// U1:1 (varies)  material port number, E87 shows type U1:1 with data 1-255
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { PORTGRPNAME = list1[1];} else { PORTGRPNAME = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        ACCESSMODE = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { PTN = list2[1];} else { PTN = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(3, 22, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S3F21R

S3F22Port Group Defn Ack Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S3F22 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(3, 21, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 CAACK {L:n {L:2 ERRCODE ERRTEXT}}
        // variables for data items and parsing
        unsigned long CAACK;  	// U1:1 (always)  carrier action acknowledge 
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        CAACK = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ERRCODE = list3[1];} else { ERRCODE = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { ERRTEXT = list3[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S3F23RPort Group Action Req Sent by Host Only

using namespace std;

    // S3F23R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 3, 23, ::recvS3F23R);

// receive method 
void recvS3F23R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:3 PGRPACTION PORTGRPNAME {L:m {L:2 PARAMNAME PARAMVAL}}
        // variables for data items and parsing
        string PGRPACTION;  	// A:n (always)  port group command, an alias for PORTACTION?
        string PORTGRPNAME;  	// A:n (always)  name of a group of ports
        string PARAMNAME;  	// A:n (always)  argument name
        string PARAMVAL;  	// U1:1 (varies)  argument value, only defined use is ServiceStatus, 0 = OUT OF SERVICE, 1 = IN SERVICE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { PGRPACTION = list1[1];} else { PGRPACTION = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { PORTGRPNAME = list1[1];} else { PORTGRPNAME = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t m=1; m < list1.size(); m++) {
            vector<string> list2;
            sp->listSplit(list1[m], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { PARAMNAME = list3[1];} else { PARAMNAME = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { PARAMVAL = list3[1];} else { PARAMVAL = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(3, 24, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S3F23R

S3F24Port Group Action Ack Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S3F24 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(3, 23, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 CAACK {L:n {L:2 ERRCODE ERRTEXT}}
        // variables for data items and parsing
        unsigned long CAACK;  	// U1:1 (always)  carrier action acknowledge 
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        CAACK = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ERRCODE = list3[1];} else { ERRCODE = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { ERRTEXT = list3[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S3F25RPort Action Req Sent by Host Only

using namespace std;

    // S3F25R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 3, 25, ::recvS3F25R);

// receive method 
void recvS3F25R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:3 PORTACTION PTN {L:m {L:2 PARAMNAME PARAMVAL}}
        // variables for data items and parsing
        string PORTACTION;  	// A:n (always)  ChangeServiceStatus, CancelReservationAtPort or ReserveAtPort
        string PTN;  	// U1:1 (varies)  material port number, E87 shows type U1:1 with data 1-255
        string PARAMNAME;  	// A:n (always)  argument name
        string PARAMVAL;  	// U1:1 (varies)  argument value, only defined use is ServiceStatus, 0 = OUT OF SERVICE, 1 = IN SERVICE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { PORTACTION = list1[1];} else { PORTACTION = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { PTN = list1[1];} else { PTN = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t m=1; m < list1.size(); m++) {
            vector<string> list2;
            sp->listSplit(list1[m], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { PARAMNAME = list3[1];} else { PARAMNAME = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { PARAMVAL = list3[1];} else { PARAMVAL = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(3, 26, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S3F25R

S3F26Port Action Ack Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S3F26 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(3, 25, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 CAACK {L:n {L:2 ERRCODE ERRTEXT}}
        // variables for data items and parsing
        unsigned long CAACK;  	// U1:1 (always)  carrier action acknowledge 
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        CAACK = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ERRCODE = list3[1];} else { ERRCODE = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { ERRTEXT = list3[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S3F27RChange Access Sent by Host Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S3F27R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 3, 27, ::recvS3F27R);

// receive method 
void recvS3F27R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 ACCESSMODE {L:n PTN}
        // variables for data items and parsing
        unsigned long ACCESSMODE;  	// U1:1 (always)  load port access mode
        string PTN;  	// U1:1 (varies)  material port number, E87 shows type U1:1 with data 1-255
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        ACCESSMODE = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { PTN = list2[1];} else { PTN = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(3, 28, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S3F27R

S3F28Change Access Ack Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S3F28 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(3, 27, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 CAACK {L:n {L:3 PTN ERRCODE ERRTEXT}}
        // variables for data items and parsing
        unsigned long CAACK;  	// U1:1 (always)  carrier action acknowledge 
        string PTN;  	// U1:1 (varies)  material port number, E87 shows type U1:1 with data 1-255
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        CAACK = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 4 || list2[0] != "L:3") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { PTN = list3[1];} else { PTN = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ERRCODE = list3[1];} else { ERRCODE = ""; }
            list3.clear();
            sp->listSplit(list2[3], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { ERRTEXT = list3[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S3F29RCarrier Tag Read Req Sent by Host Only

using namespace std;

    // S3F29R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 3, 29, ::recvS3F29R);

// receive method 
void recvS3F29R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:4 LOCID CARRIERSPEC DATASEG DATALENGTH
        // variables for data items and parsing
        string LOCID;  	// A:n (varies)  logical ID of carrier location, E87 requires text
        string CARRIERSPEC;  	// A:n (always)  carrier object specifier (OBJSPEC)
        string DATASEG;  	// A:n (varies)  identifies data requested, E87 requires text
        string DATALENGTH;  	// U4:1 (varies)  total bytes of the message body 
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 5 || list0[0] != "L:4") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { LOCID = list1[1];} else { LOCID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { CARRIERSPEC = list1[1];} else { CARRIERSPEC = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATASEG = list1[1];} else { DATASEG = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATALENGTH = list1[1];} else { DATALENGTH = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(3, 30, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S3F29R

S3F30Carrier Tag Read Data Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S3F30 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(3, 29, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 DATA {L:2 CAACK {L:s {L:2 ERRCODE ERRTEXT}}}
        // variables for data items and parsing
        string DATA;  	// A:n (varies)  unformatted data
        unsigned long CAACK;  	// U1:1 (always)  carrier action acknowledge 
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATA = list1[1];} else { DATA = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "U1:1" ) { ok = false; break; }
        CAACK = atoul(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if ( list2.size() < 1) { ok=false; break; }
        for(size_t s=1; s < list2.size(); s++) {
            vector<string> list3;
            sp->listSplit(list2[s], list3);
            if ( list3.size() != 3 || list3[0] != "L:2") { ok=false; break; }
            vector<string> list4;
            sp->listSplit(list3[1], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { ERRCODE = list4[1];} else { ERRCODE = ""; }
            list4.clear();
            sp->listSplit(list3[2], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0].find("A:") != 0 ) { ok = false; break; }
            if ( list4.size() == 2) { ERRTEXT = list4[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S3F31RCarrier Tag Write Data Sent by Host Only

using namespace std;

    // S3F31R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 3, 31, ::recvS3F31R);

// receive method 
void recvS3F31R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:5 LOCID CARRIERSPEC DATASEG DATALENGTH DATA
        // variables for data items and parsing
        string LOCID;  	// A:n (varies)  logical ID of carrier location, E87 requires text
        string CARRIERSPEC;  	// A:n (always)  carrier object specifier (OBJSPEC)
        string DATASEG;  	// A:n (varies)  identifies data requested, E87 requires text
        string DATALENGTH;  	// U4:1 (varies)  total bytes of the message body 
        string DATA;  	// A:n (varies)  unformatted data
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 6 || list0[0] != "L:5") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { LOCID = list1[1];} else { LOCID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { CARRIERSPEC = list1[1];} else { CARRIERSPEC = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATASEG = list1[1];} else { DATASEG = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATALENGTH = list1[1];} else { DATALENGTH = ""; }
        list1.clear();
        sp->listSplit(list0[5], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATA = list1[1];} else { DATA = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(3, 32, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S3F31R

S3F32Carrier Tag Write Ack Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S3F32 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(3, 31, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 CAACK {L:s {L:2 ERRCODE ERRTEXT}}
        // variables for data items and parsing
        unsigned long CAACK;  	// U1:1 (always)  carrier action acknowledge 
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        CAACK = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t s=1; s < list1.size(); s++) {
            vector<string> list2;
            sp->listSplit(list1[s], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ERRCODE = list3[1];} else { ERRCODE = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { ERRTEXT = list3[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S3F33Cancel All Pod Out Req Sent by Host and Equipment

using namespace std;

    // S3F33 C++ Receive message - add next line to setup
    sp->messageTypeAdd( 3, 33, ::recvS3F33);

// receive method 
void recvS3F33(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // no data expected
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(3, 34, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S3F33

S3F34Cancel All Pod Out Ack Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S3F34 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(3, 33, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 CAACK {L:n {L:2 ERRCODE ERRTEXT}}
        // variables for data items and parsing
        unsigned long CAACK;  	// U1:1 (always)  carrier action acknowledge 
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        CAACK = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ERRCODE = list3[1];} else { ERRCODE = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { ERRTEXT = list3[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S3F35Reticle Transfer Job Req Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S3F35 C++ Receive message - add next line to setup
    sp->messageTypeAdd( 3, 35, ::recvS3F35);

// receive method 
void recvS3F35(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:7 JOBACTION PODID INPTN OUTPTN {L:n {L:2 ATTRID ATTRDATA}} {L:m {L:3 RETICLEID RETREMOVEINSTR {L:r {L:2 ATTRID ATTRDATA}}}} {L:k {L:2 RETICLEID2 RETPLACEINSTR}}
        // variables for data items and parsing
        string JOBACTION;  	// A:n (always)  reticle transfer command
        string PODID;  	// A:n (always)  OBJSPEC for a Pod instance
        int INPTN;  	// B:1 (always)  input material port number
        string OUTPTN;  	// B:1 (varies)  output port (PTN)
        string ATTRID;  	// A:40 (varies)  identifies an attribute type, chars 0x20-0x7e but not >, :, ?, *, or ~.  Does not begin or end with space.
        string ATTRDATA;  	// A:n (varies)  a specific attribute value of any data type
        string RETICLEID;  	// A:n (always)  OBJSPEC value for a reticle
        unsigned long RETREMOVEINSTR;  	// U1:1 (always)  pod slot reticle remove instruction
        string ATTRID;  	// A:40 (varies)  identifies an attribute type, chars 0x20-0x7e but not >, :, ?, *, or ~.  Does not begin or end with space.
        string ATTRDATA;  	// A:n (varies)  a specific attribute value of any data type
        string RETICLEID2;  	// A:n (always)  OBJSPEC value for a second reticle
        unsigned long RETPLACEINSTR;  	// U1:1 (always)  pod slot reticle place instruction
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 8 || list0[0] != "L:7") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { JOBACTION = list1[1];} else { JOBACTION = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { PODID = list1[1];} else { PODID = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        INPTN = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OUTPTN = list1[1];} else { OUTPTN = ""; }
        list1.clear();
        sp->listSplit(list0[5], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ATTRID = list3[1];} else { ATTRID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ATTRDATA = list3[1];} else { ATTRDATA = ""; }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[6], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t m=1; m < list1.size(); m++) {
            vector<string> list2;
            sp->listSplit(list1[m], list2);
            if ( list2.size() != 4 || list2[0] != "L:3") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { RETICLEID = list3[1];} else { RETICLEID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "U1:1" ) { ok = false; break; }
            RETREMOVEINSTR = atoul(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[3], list3);
            if ( list3.size() < 1) { ok=false; break; }
            for(size_t r=1; r < list3.size(); r++) {
                vector<string> list4;
                sp->listSplit(list3[r], list4);
                if ( list4.size() != 3 || list4[0] != "L:2") { ok=false; break; }
                vector<string> list5;
                sp->listSplit(list4[1], list5);
                if (list5.size() < 1) { ok = false; break; }
                if ( list5.size() == 2) { ATTRID = list5[1];} else { ATTRID = ""; }
                list5.clear();
                sp->listSplit(list4[2], list5);
                if (list5.size() < 1) { ok = false; break; }
                if ( list5.size() == 2) { ATTRDATA = list5[1];} else { ATTRDATA = ""; }
                }
            if (!ok) break;
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[7], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t k=1; k < list1.size(); k++) {
            vector<string> list2;
            sp->listSplit(list1[k], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { RETICLEID2 = list3[1];} else { RETICLEID2 = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "U1:1" ) { ok = false; break; }
            RETPLACEINSTR = atoul(list3[1].c_str());
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(3, 36, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S3F35

S3F36Reticle Transfer Job Ack Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S3F36 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(3, 35, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 RPMACK {L:n {L:2 ERRCODE ERRTEXT}}
        // variables for data items and parsing
        unsigned long RPMACK;  	// U1:1 (always)  reticle pod management ack code
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        RPMACK = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ERRCODE = list3[1];} else { ERRCODE = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { ERRTEXT = list3[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S4F1RReady to Send Materials Sent by Host and Equipment

using namespace std;

    // S4F1R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 4, 1, ::recvS4F1R);

// receive method 
void recvS4F1R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 PTN MID
        // variables for data items and parsing
        string PTN;  	// U1:1 (varies)  material port number, E87 shows type U1:1 with data 1-255
        string MID;  	// A:16 (varies)  material ID, E40 restricts to A:n
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { PTN = list1[1];} else { PTN = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { MID = list1[1];} else { MID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(4, 2, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S4F1R

S4F2Ready to Send Ack Sent by Host and Equipment

using namespace std;

    // S4F2 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(4, 1, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect RSACK
        // variables for data items and parsing
        int RSACK;  	// B:1 (always)  ready to send acknowledge
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        RSACK = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S4F3Send Material Sent by Host and Equipment

using namespace std;

    // S4F3 C++ Receive message - add next line to setup
    sp->messageTypeAdd( 4, 3, ::recvS4F3);

// receive method 
void recvS4F3(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 PTN MID
        // variables for data items and parsing
        string PTN;  	// U1:1 (varies)  material port number, E87 shows type U1:1 with data 1-255
        string MID;  	// A:16 (varies)  material ID, E40 restricts to A:n
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { PTN = list1[1];} else { PTN = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { MID = list1[1];} else { MID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(4, 4, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S4F3

S4F5Handshake Complete Sent by Host and Equipment

using namespace std;

    // S4F5 C++ Receive message - add next line to setup
    sp->messageTypeAdd( 4, 5, ::recvS4F5);

// receive method 
void recvS4F5(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 PTN MID
        // variables for data items and parsing
        string PTN;  	// U1:1 (varies)  material port number, E87 shows type U1:1 with data 1-255
        string MID;  	// A:16 (varies)  material ID, E40 restricts to A:n
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { PTN = list1[1];} else { PTN = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { MID = list1[1];} else { MID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(4, 6, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S4F5

S4F7Not Ready to Send Sent by Host and Equipment

using namespace std;

    // S4F7 C++ Receive message - add next line to setup
    sp->messageTypeAdd( 4, 7, ::recvS4F7);

// receive method 
void recvS4F7(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 PTN MID
        // variables for data items and parsing
        string PTN;  	// U1:1 (varies)  material port number, E87 shows type U1:1 with data 1-255
        string MID;  	// A:16 (varies)  material ID, E40 restricts to A:n
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { PTN = list1[1];} else { PTN = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { MID = list1[1];} else { MID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(4, 8, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S4F7

S4F9Stuck in Sender Sent by Host and Equipment

using namespace std;

    // S4F9 C++ Receive message - add next line to setup
    sp->messageTypeAdd( 4, 9, ::recvS4F9);

// receive method 
void recvS4F9(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 PTN MID
        // variables for data items and parsing
        string PTN;  	// U1:1 (varies)  material port number, E87 shows type U1:1 with data 1-255
        string MID;  	// A:16 (varies)  material ID, E40 restricts to A:n
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { PTN = list1[1];} else { PTN = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { MID = list1[1];} else { MID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(4, 10, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S4F9

S4F11Stuck in Receiver Sent by Host and Equipment

using namespace std;

    // S4F11 C++ Receive message - add next line to setup
    sp->messageTypeAdd( 4, 11, ::recvS4F11);

// receive method 
void recvS4F11(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 PTN MID
        // variables for data items and parsing
        string PTN;  	// U1:1 (varies)  material port number, E87 shows type U1:1 with data 1-255
        string MID;  	// A:16 (varies)  material ID, E40 restricts to A:n
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { PTN = list1[1];} else { PTN = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { MID = list1[1];} else { MID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(4, 12, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S4F11

S4F13Send Incomplete Timeout Sent by Host and Equipment

using namespace std;

    // S4F13 C++ Receive message - add next line to setup
    sp->messageTypeAdd( 4, 13, ::recvS4F13);

// receive method 
void recvS4F13(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 PTN MID
        // variables for data items and parsing
        string PTN;  	// U1:1 (varies)  material port number, E87 shows type U1:1 with data 1-255
        string MID;  	// A:16 (varies)  material ID, E40 restricts to A:n
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { PTN = list1[1];} else { PTN = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { MID = list1[1];} else { MID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(4, 14, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S4F13

S4F15Material Received Sent by Host and Equipment

using namespace std;

    // S4F15 C++ Receive message - add next line to setup
    sp->messageTypeAdd( 4, 15, ::recvS4F15);

// receive method 
void recvS4F15(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 PTN MID
        // variables for data items and parsing
        string PTN;  	// U1:1 (varies)  material port number, E87 shows type U1:1 with data 1-255
        string MID;  	// A:16 (varies)  material ID, E40 restricts to A:n
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { PTN = list1[1];} else { PTN = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { MID = list1[1];} else { MID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(4, 16, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S4F15

S4F17RRequest to Receive Sent by Host and Equipment

using namespace std;

    // S4F17R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 4, 17, ::recvS4F17R);

// receive method 
void recvS4F17R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 PTN MID
        // variables for data items and parsing
        string PTN;  	// U1:1 (varies)  material port number, E87 shows type U1:1 with data 1-255
        string MID;  	// A:16 (varies)  material ID, E40 restricts to A:n
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { PTN = list1[1];} else { PTN = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { MID = list1[1];} else { MID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(4, 18, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S4F17R

S4F18Request to Receive Ack Sent by Host and Equipment

using namespace std;

    // S4F18 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(4, 17, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect RRACK
        // variables for data items and parsing
        int RRACK;  	// B:1 (always)  request to receive acknowledge
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        RRACK = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S4F19RTransfer Job Create Sent by Host Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S4F19R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 4, 19, ::recvS4F19R);

// receive method 
void recvS4F19R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 DATAID {L:2 TRJOBNAME {L:n {L:12 TRLINK TRPORT TROBJNAME TROBJTYPE TRROLE TRRCP TRPTNR TRPTPORT TRDIR TRTYPE TRLOCATION TRAUTOSTART}}}
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string TRJOBNAME;  	// A:80 (always)  host assigned id for transfer job
        string TRLINK;  	// U4:1 (varies)  task identifier correlation value
        string TRPORT;  	// U4:1 (varies)  port identifier
        string TROBJNAME;  	// A:n (varies)  identifies material to be transferred
        string TROBJTYPE;  	// U4:1 (varies)  identifies type of object to be transferred
        unsigned long TRROLE;  	// U1:1 (always)  indicates equipment transfer role
        string TRRCP;  	// A:80 (always)  name of transfer recipe for this handoff
        string TRPTNR;  	// A:n (always)  EQNAME of transfer partner equipment
        string TRPTPORT;  	// U4:1 (varies)  transfer partner port
        unsigned long TRDIR;  	// U1:1 (always)  transfer direction
        unsigned long TRTYPE;  	// U1:1 (always)  equipment is active or passive transfer participant
        string TRLOCATION;  	// U4:1 (varies)  material transfer location
        int TRAUTOSTART;  	// TF:1 (always)  if true material transfer is initiated by the primary when ready
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0].find("A:") != 0 ) { ok = false; break; }
        if ( list2.size() == 2) { TRJOBNAME = list2[1];} else { TRJOBNAME = ""; }
        list2.clear();
        sp->listSplit(list1[2], list2);
        if ( list2.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list2.size(); n++) {
            vector<string> list3;
            sp->listSplit(list2[n], list3);
            if ( list3.size() != 13 || list3[0] != "L:12") { ok=false; break; }
            vector<string> list4;
            sp->listSplit(list3[1], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { TRLINK = list4[1];} else { TRLINK = ""; }
            list4.clear();
            sp->listSplit(list3[2], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { TRPORT = list4[1];} else { TRPORT = ""; }
            list4.clear();
            sp->listSplit(list3[3], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { TROBJNAME = list4[1];} else { TROBJNAME = ""; }
            list4.clear();
            sp->listSplit(list3[4], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { TROBJTYPE = list4[1];} else { TROBJTYPE = ""; }
            list4.clear();
            sp->listSplit(list3[5], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0] != "U1:1" ) { ok = false; break; }
            TRROLE = atoul(list4[1].c_str());
            list4.clear();
            sp->listSplit(list3[6], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0].find("A:") != 0 ) { ok = false; break; }
            if ( list4.size() == 2) { TRRCP = list4[1];} else { TRRCP = ""; }
            list4.clear();
            sp->listSplit(list3[7], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0].find("A:") != 0 ) { ok = false; break; }
            if ( list4.size() == 2) { TRPTNR = list4[1];} else { TRPTNR = ""; }
            list4.clear();
            sp->listSplit(list3[8], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { TRPTPORT = list4[1];} else { TRPTPORT = ""; }
            list4.clear();
            sp->listSplit(list3[9], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0] != "U1:1" ) { ok = false; break; }
            TRDIR = atoul(list4[1].c_str());
            list4.clear();
            sp->listSplit(list3[10], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0] != "U1:1" ) { ok = false; break; }
            TRTYPE = atoul(list4[1].c_str());
            list4.clear();
            sp->listSplit(list3[11], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { TRLOCATION = list4[1];} else { TRLOCATION = ""; }
            list4.clear();
            sp->listSplit(list3[12], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0] != "TF:1" ) { ok = false; break; }
            TRAUTOSTART = atoi(list4[1].c_str());
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(4, 20, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S4F19R

S4F20Transfer Job Acknowledge Sent by Equipment Only

using namespace std;

    // S4F20 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(4, 19, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:3 TRJOBID {L:m TRATOMCID} {L:2 TRACK {L:n {L:2 ERRCODE ERRTEXT}}}
        // variables for data items and parsing
        int TRJOBID;  	// B:1 (always)  assigned identifier for transfer job
        string TRATOMCID;  	// U4:1 (varies)  assigned identifier for atomic transfer
        int TRACK;  	// TF:1 (always)  transfer activity success flag
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        TRJOBID = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t m=1; m < list1.size(); m++) {
            vector<string> list2;
            sp->listSplit(list1[m], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { TRATOMCID = list2[1];} else { TRATOMCID = ""; }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "TF:1" ) { ok = false; break; }
        TRACK = atoi(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if ( list2.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list2.size(); n++) {
            vector<string> list3;
            sp->listSplit(list2[n], list3);
            if ( list3.size() != 3 || list3[0] != "L:2") { ok=false; break; }
            vector<string> list4;
            sp->listSplit(list3[1], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { ERRCODE = list4[1];} else { ERRCODE = ""; }
            list4.clear();
            sp->listSplit(list3[2], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0].find("A:") != 0 ) { ok = false; break; }
            if ( list4.size() == 2) { ERRTEXT = list4[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S4F21RTransfer Job Command Sent by Host Only

using namespace std;

    // S4F21R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 4, 21, ::recvS4F21R);

// receive method 
void recvS4F21R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:3 TRJOBID TRCMDNAME {L:n {L:2 CPNAME CPVAL}}
        // variables for data items and parsing
        int TRJOBID;  	// B:1 (always)  assigned identifier for transfer job
        string TRCMDNAME;  	// A:n (always)  text enum, CANCEL, PAUSE, RESUME, ABORT, STOP, STARTHANDOFF
        string CPNAME;  	// A:n (varies)  command parameter name
        string CPVAL;  	// A:n (varies)  command parameter value, any scalar type
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        TRJOBID = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { TRCMDNAME = list1[1];} else { TRCMDNAME = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { CPNAME = list3[1];} else { CPNAME = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { CPVAL = list3[1];} else { CPVAL = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(4, 22, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S4F21R

S4F22Transfer Job Command Ack Sent by Equipment Only

using namespace std;

    // S4F22 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(4, 21, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 TRACK {L:n {L:2 ERRCODE ERRTEXT}}
        // variables for data items and parsing
        int TRACK;  	// TF:1 (always)  transfer activity success flag
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "TF:1" ) { ok = false; break; }
        TRACK = atoi(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ERRCODE = list3[1];} else { ERRCODE = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { ERRTEXT = list3[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S4F23[R]Transfer Command Alert Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S4F23 C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 4, 23, ::recvS4F23);

// receive method 
void recvS4F23(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:4 TRJOBID TRJOBNAME TRJOBMS {L:2 TRACK {L:n {L:2 ERRCODE  ERRTEXT}}}
        // variables for data items and parsing
        int TRJOBID;  	// B:1 (always)  assigned identifier for transfer job
        string TRJOBNAME;  	// A:80 (always)  host assigned id for transfer job
        unsigned long TRJOBMS;  	// U1:1 (always)  transfer job milestone
        int TRACK;  	// TF:1 (always)  transfer activity success flag
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 5 || list0[0] != "L:4") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        TRJOBID = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { TRJOBNAME = list1[1];} else { TRJOBNAME = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        TRJOBMS = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[4], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "TF:1" ) { ok = false; break; }
        TRACK = atoi(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if ( list2.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list2.size(); n++) {
            vector<string> list3;
            sp->listSplit(list2[n], list3);
            if ( list3.size() != 3 || list3[0] != "L:2") { ok=false; break; }
            vector<string> list4;
            sp->listSplit(list3[1], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { ERRCODE = list4[1];} else { ERRCODE = ""; }
            list4.clear();
            sp->listSplit(list3[2], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0].find("A:") != 0 ) { ok = false; break; }
            if ( list4.size() == 2) { ERRTEXT = list4[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(4, 24, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S4F23

S4F24Transfer Alert Ack Sent by Host Only

using namespace std;

    // S4F24 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(4, 23, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // no data expected
        return;  // parsed ok
        } // end while(ok)

S4F25RMulti-block Inquire Sent by Host Only

using namespace std;

    // S4F25R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 4, 25, ::recvS4F25R);

// receive method 
void recvS4F25R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 DATAID DATALENGTH
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string DATALENGTH;  	// U4:1 (varies)  total bytes of the message body 
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATALENGTH = list1[1];} else { DATALENGTH = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(4, 26, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S4F25R

S4F26Multi-block Grant Sent by Equipment Only

using namespace std;

    // S4F26 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(4, 25, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect GRANT
        // variables for data items and parsing
        int GRANT;  	// B:1 (always)  multiblock grant code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        GRANT = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S4F27Handoff Ready Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S4F27 C++ Receive message - add next line to setup
    sp->messageTypeAdd( 4, 27, ::recvS4F27);

// receive method 
void recvS4F27(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 EQNAME {L:11 TRLINK TRPORT TROBJNAME TROBJTYPE TRROLE TRPTNR TRPTPORT TRDIR TRTYPE TRLOCATION}
        // variables for data items and parsing
        string EQNAME;  	// A:80 (always)  factory assigned equipment identifier
        string TRLINK;  	// U4:1 (varies)  task identifier correlation value
        string TRPORT;  	// U4:1 (varies)  port identifier
        string TROBJNAME;  	// A:n (varies)  identifies material to be transferred
        string TROBJTYPE;  	// U4:1 (varies)  identifies type of object to be transferred
        unsigned long TRROLE;  	// U1:1 (always)  indicates equipment transfer role
        string TRPTNR;  	// A:n (always)  EQNAME of transfer partner equipment
        string TRPTPORT;  	// U4:1 (varies)  transfer partner port
        unsigned long TRDIR;  	// U1:1 (always)  transfer direction
        unsigned long TRTYPE;  	// U1:1 (always)  equipment is active or passive transfer participant
        string TRLOCATION;  	// U4:1 (varies)  material transfer location
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { EQNAME = list1[1];} else { EQNAME = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() != 12 || list1[0] != "L:11") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2.size() == 2) { TRLINK = list2[1];} else { TRLINK = ""; }
        list2.clear();
        sp->listSplit(list1[2], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2.size() == 2) { TRPORT = list2[1];} else { TRPORT = ""; }
        list2.clear();
        sp->listSplit(list1[3], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2.size() == 2) { TROBJNAME = list2[1];} else { TROBJNAME = ""; }
        list2.clear();
        sp->listSplit(list1[4], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2.size() == 2) { TROBJTYPE = list2[1];} else { TROBJTYPE = ""; }
        list2.clear();
        sp->listSplit(list1[5], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "U1:1" ) { ok = false; break; }
        TRROLE = atoul(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[6], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0].find("A:") != 0 ) { ok = false; break; }
        if ( list2.size() == 2) { TRPTNR = list2[1];} else { TRPTNR = ""; }
        list2.clear();
        sp->listSplit(list1[7], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2.size() == 2) { TRPTPORT = list2[1];} else { TRPTPORT = ""; }
        list2.clear();
        sp->listSplit(list1[8], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "U1:1" ) { ok = false; break; }
        TRDIR = atoul(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[9], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "U1:1" ) { ok = false; break; }
        TRTYPE = atoul(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[10], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2.size() == 2) { TRLOCATION = list2[1];} else { TRLOCATION = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(4, 28, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S4F27

S4F29Handoff Command Sent by Host and Equipment

using namespace std;

    // S4F29 C++ Receive message - add next line to setup
    sp->messageTypeAdd( 4, 29, ::recvS4F29);

// receive method 
void recvS4F29(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:4 TRLINK MCINDEX HOCMDNAME {L:n {L:2 CPNAME CPVAL}}
        // variables for data items and parsing
        string TRLINK;  	// U4:1 (varies)  task identifier correlation value
        string MCINDEX;  	// U4:1 (varies)  correlation value for handoff command 
        string HOCMDNAME;  	// A:n (varies)  handoff command identifier
        string CPNAME;  	// A:n (varies)  command parameter name
        string CPVAL;  	// A:n (varies)  command parameter value, any scalar type
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 5 || list0[0] != "L:4") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { TRLINK = list1[1];} else { TRLINK = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { MCINDEX = list1[1];} else { MCINDEX = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { HOCMDNAME = list1[1];} else { HOCMDNAME = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { CPNAME = list3[1];} else { CPNAME = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { CPVAL = list3[1];} else { CPVAL = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(4, 30, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S4F29

S4F31Handoff Command Complete Sent by Host and Equipment

using namespace std;

    // S4F31 C++ Receive message - add next line to setup
    sp->messageTypeAdd( 4, 31, ::recvS4F31);

// receive method 
void recvS4F31(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:3 TRLINK MCINDEX {L:2 HOACK {L:n {L:2 ERRCODE ERRTEXT}}}
        // variables for data items and parsing
        string TRLINK;  	// U4:1 (varies)  task identifier correlation value
        string MCINDEX;  	// U4:1 (varies)  correlation value for handoff command 
        int HOACK;  	// TF:1 (always)  handoff success flag
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { TRLINK = list1[1];} else { TRLINK = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { MCINDEX = list1[1];} else { MCINDEX = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "TF:1" ) { ok = false; break; }
        HOACK = atoi(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if ( list2.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list2.size(); n++) {
            vector<string> list3;
            sp->listSplit(list2[n], list3);
            if ( list3.size() != 3 || list3[0] != "L:2") { ok=false; break; }
            vector<string> list4;
            sp->listSplit(list3[1], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { ERRCODE = list4[1];} else { ERRCODE = ""; }
            list4.clear();
            sp->listSplit(list3[2], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0].find("A:") != 0 ) { ok = false; break; }
            if ( list4.size() == 2) { ERRTEXT = list4[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(4, 32, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S4F31

S4F33Handoff Verified Sent by Host and Equipment

using namespace std;

    // S4F33 C++ Receive message - add next line to setup
    sp->messageTypeAdd( 4, 33, ::recvS4F33);

// receive method 
void recvS4F33(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 TRLINK {L:2 HOACK {L:n ERRCODE ERRTEXT}} 
        // variables for data items and parsing
        string TRLINK;  	// U4:1 (varies)  task identifier correlation value
        int HOACK;  	// TF:1 (always)  handoff success flag
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { TRLINK = list1[1];} else { TRLINK = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "TF:1" ) { ok = false; break; }
        HOACK = atoi(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if ( list2.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list2.size(); n++) {
            vector<string> list3;
            sp->listSplit(list2[n], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ERRCODE = list3[1];} else { ERRCODE = ""; }
            list3.clear();
            sp->listSplit(list2[n], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { ERRTEXT = list3[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(4, 34, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S4F33

S4F35Handoff Cancel Ready Sent by Host and Equipment

using namespace std;

    // S4F35 C++ Receive message - add next line to setup
    sp->messageTypeAdd( 4, 35, ::recvS4F35);

// receive method 
void recvS4F35(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect TRLINK
        // variables for data items and parsing
        string TRLINK;  	// U4:1 (varies)  task identifier correlation value
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0.size() == 2) { TRLINK = list0[1];} else { TRLINK = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(4, 36, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S4F35

S4F37Handoff Cancel Ready Ack Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S4F37 C++ Receive message - add next line to setup
    sp->messageTypeAdd( 4, 37, ::recvS4F37);

// receive method 
void recvS4F37(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 TRLINK HOCANCELACK
        // variables for data items and parsing
        string TRLINK;  	// U4:1 (varies)  task identifier correlation value
        unsigned long HOCANCELACK;  	// U1:1 (always)  hand off cancel ack
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { TRLINK = list1[1];} else { TRLINK = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        HOCANCELACK = atoul(list1[1].c_str());
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(4, 38, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S4F37

S4F39Handoff Halt Sent by Host and Equipment

using namespace std;

    // S4F39 C++ Receive message - add next line to setup
    sp->messageTypeAdd( 4, 39, ::recvS4F39);

// receive method 
void recvS4F39(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect TRLINK
        // variables for data items and parsing
        string TRLINK;  	// U4:1 (varies)  task identifier correlation value
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0.size() == 2) { TRLINK = list0[1];} else { TRLINK = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(4, 40, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S4F39

S4F41Handoff Halt Ack Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S4F41 C++ Receive message - add next line to setup
    sp->messageTypeAdd( 4, 41, ::recvS4F41);

// receive method 
void recvS4F41(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 TRLINK HOHALTACK
        // variables for data items and parsing
        string TRLINK;  	// U4:1 (varies)  task identifier correlation value
        unsigned long HOHALTACK;  	// U1:1 (always)  hand off halt ack
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { TRLINK = list1[1];} else { TRLINK = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        HOHALTACK = atoul(list1[1].c_str());
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(4, 42, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S4F41

S5F1[R]Alarm Report Send Sent by Equipment Only

using namespace std;

    // S5F1 C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 5, 1, ::recvS5F1);

// receive method 
void recvS5F1(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:3 ALCD ALID ALTX
        // variables for data items and parsing
        int ALCD;  	// B:1 (always)  alarm code byte, >= 128 alarm is set, bit field use is deprecated
        string ALID;  	// U4:1 (varies)  Alarm type ID
        string ALTX;  	// A:120 (always)  alarm text, the length limit was recently raised from 40
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        ALCD = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { ALID = list1[1];} else { ALID = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { ALTX = list1[1];} else { ALTX = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(5, 2, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S5F1

S5F2Alarm Report Ack Sent by Host Only

using namespace std;

    // S5F2 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(5, 1, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect ACKC5
        // variables for data items and parsing
        int ACKC5;  	// B:1 (always)  acknowledge code, 0 ok
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        ACKC5 = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S5F3[R]Enable/Disable Alarm Send Sent by Host Only

using namespace std;

    // S5F3 C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 5, 3, ::recvS5F3);

// receive method 
void recvS5F3(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 ALED ALID
        // variables for data items and parsing
        int ALED;  	// B:1 (always)  enable/disable alarm, 128 means enable, 0 disable
        string ALID;  	// U4:1 (varies)  Alarm type ID
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        ALED = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { ALID = list1[1];} else { ALID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(5, 4, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S5F3

S5F4Enable/Disable Alarm Ack Sent by Equipment Only

using namespace std;

    // S5F4 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(5, 3, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect ACKC5
        // variables for data items and parsing
        int ACKC5;  	// B:1 (always)  acknowledge code, 0 ok
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        ACKC5 = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S5F5RList Alarms Request Sent by Host Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S5F5R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 5, 5, ::recvS5F5R);

// receive method 
void recvS5F5R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect ALIDVECTOR
        // variables for data items and parsing
        unsigned long [] ALIDVECTOR;  	// U4:n (varies)  alarm ID vector
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        vector<unsigned long> ALIDVECTOR;
        for(size_t i=0; i < ALIDVECTOR.size(); i++) {
            ALIDVECTOR.push_back(atoul(list0[1+i].c_str()));
            }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(5, 6, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S5F5R

S5F6List Alarm Data Sent by Equipment Only

using namespace std;

    // S5F6 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(5, 5, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:n {L:3 ALCD ALID ALTX}
        // variables for data items and parsing
        int ALCD;  	// B:1 (always)  alarm code byte, >= 128 alarm is set, bit field use is deprecated
        string ALID;  	// U4:1 (varies)  Alarm type ID
        string ALTX;  	// A:120 (always)  alarm text, the length limit was recently raised from 40
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if ( list1.size() != 4 || list1[0] != "L:3") { ok=false; break; }
            vector<string> list2;
            sp->listSplit(list1[1], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0] != "B:1" ) { ok = false; break; }
            ALCD = sp->binToInt(list2[1].c_str());
            list2.clear();
            sp->listSplit(list1[2], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { ALID = list2[1];} else { ALID = ""; }
            list2.clear();
            sp->listSplit(list1[3], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { ALTX = list2[1];} else { ALTX = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S5F7RList Enabled Alarm Request Sent by Host Only

using namespace std;

    // S5F7R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 5, 7, ::recvS5F7R);

// receive method 
void recvS5F7R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // no data expected
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(5, 8, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S5F7R

S5F8List Enabled Alarm Data Sent by Equipment Only

using namespace std;

    // S5F8 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(5, 7, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:n {L:3 ALCD ALID ALTX}
        // variables for data items and parsing
        int ALCD;  	// B:1 (always)  alarm code byte, >= 128 alarm is set, bit field use is deprecated
        string ALID;  	// U4:1 (varies)  Alarm type ID
        string ALTX;  	// A:120 (always)  alarm text, the length limit was recently raised from 40
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if ( list1.size() != 4 || list1[0] != "L:3") { ok=false; break; }
            vector<string> list2;
            sp->listSplit(list1[1], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0] != "B:1" ) { ok = false; break; }
            ALCD = sp->binToInt(list2[1].c_str());
            list2.clear();
            sp->listSplit(list1[2], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { ALID = list2[1];} else { ALID = ""; }
            list2.clear();
            sp->listSplit(list1[3], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { ALTX = list2[1];} else { ALTX = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S5F9[R]Exception Post Notify Sent by Equipment Only

using namespace std;

    // S5F9 C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 5, 9, ::recvS5F9);

// receive method 
void recvS5F9(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:5 TIMESTAMP EXID EXTYPE EXMESSAGE {L:n EXRECVRA}
        // variables for data items and parsing
        string TIMESTAMP;  	// A:32 (always)  ECV TimeFormat controls format, 0=A:12 YYMMDDHHMMSS, 1=A:16 YYYYMMDDHHMMSScc,2=YYYY-MM-DDTHH:MM:SS.s[s]*{Z|+hh:mm|-hh:mm}
        string EXID;  	// A:20 (always)  exception identifier
        string EXTYPE;  	// A:5 (always)  exception type, "ALARM" or "ERROR"
        string EXMESSAGE;  	// A:n (always)  exception description
        string EXRECVRA;  	// A:40 (always)  exception recovery action description
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 6 || list0[0] != "L:5") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { TIMESTAMP = list1[1];} else { TIMESTAMP = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { EXID = list1[1];} else { EXID = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { EXTYPE = list1[1];} else { EXTYPE = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { EXMESSAGE = list1[1];} else { EXMESSAGE = ""; }
        list1.clear();
        sp->listSplit(list0[5], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { EXRECVRA = list2[1];} else { EXRECVRA = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(5, 10, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S5F9

S5F10Exception Post Confirm Sent by Host Only

using namespace std;

    // S5F10 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(5, 9, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // no data expected
        return;  // parsed ok
        } // end while(ok)

S5F11[R]Exception Clear Notify Sent by Equipment Only

using namespace std;

    // S5F11 C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 5, 11, ::recvS5F11);

// receive method 
void recvS5F11(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:4 TIMESTAMP EXID EXTYPE EXMESSAGE
        // variables for data items and parsing
        string TIMESTAMP;  	// A:32 (always)  ECV TimeFormat controls format, 0=A:12 YYMMDDHHMMSS, 1=A:16 YYYYMMDDHHMMSScc,2=YYYY-MM-DDTHH:MM:SS.s[s]*{Z|+hh:mm|-hh:mm}
        string EXID;  	// A:20 (always)  exception identifier
        string EXTYPE;  	// A:5 (always)  exception type, "ALARM" or "ERROR"
        string EXMESSAGE;  	// A:n (always)  exception description
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 5 || list0[0] != "L:4") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { TIMESTAMP = list1[1];} else { TIMESTAMP = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { EXID = list1[1];} else { EXID = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { EXTYPE = list1[1];} else { EXTYPE = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { EXMESSAGE = list1[1];} else { EXMESSAGE = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(5, 12, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S5F11

S5F12Exception Clear Confirm Sent by Host Only

using namespace std;

    // S5F12 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(5, 11, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // no data expected
        return;  // parsed ok
        } // end while(ok)

S5F13RException Recover Request Sent by Host Only

using namespace std;

    // S5F13R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 5, 13, ::recvS5F13R);

// receive method 
void recvS5F13R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 EXID EXRECVRA
        // variables for data items and parsing
        string EXID;  	// A:20 (always)  exception identifier
        string EXRECVRA;  	// A:40 (always)  exception recovery action description
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { EXID = list1[1];} else { EXID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { EXRECVRA = list1[1];} else { EXRECVRA = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(5, 14, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S5F13R

S5F14Exception Recover Acknowledge Sent by Equipment Only

using namespace std;

    // S5F14 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(5, 13, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 EXID {L:2 ACKA {L:2* ERRCODE ERRTEXT}}
        // variables for data items and parsing
        string EXID;  	// A:20 (always)  exception identifier
        int ACKA;  	// TF:1 (always)  request success
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { EXID = list1[1];} else { EXID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "TF:1" ) { ok = false; break; }
        ACKA = atoi(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if ( list2.size() == 3 ) {  // 2 optional items found
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ERRCODE = list3[1];} else { ERRCODE = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { ERRTEXT = list3[1];} else { ERRTEXT = ""; }
            }
        return;  // parsed ok
        } // end while(ok)

S5F15[R]Exception Recovery Complete Notify Sent by Equipment Only

using namespace std;

    // S5F15 C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 5, 15, ::recvS5F15);

// receive method 
void recvS5F15(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:3 TIMESTAMP EXID {L:2 ACKA {L:2* ERRCODE ERRTEXT}}
        // variables for data items and parsing
        string TIMESTAMP;  	// A:32 (always)  ECV TimeFormat controls format, 0=A:12 YYMMDDHHMMSS, 1=A:16 YYYYMMDDHHMMSScc,2=YYYY-MM-DDTHH:MM:SS.s[s]*{Z|+hh:mm|-hh:mm}
        string EXID;  	// A:20 (always)  exception identifier
        int ACKA;  	// TF:1 (always)  request success
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { TIMESTAMP = list1[1];} else { TIMESTAMP = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { EXID = list1[1];} else { EXID = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "TF:1" ) { ok = false; break; }
        ACKA = atoi(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if ( list2.size() == 3 ) {  // 2 optional items found
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ERRCODE = list3[1];} else { ERRCODE = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { ERRTEXT = list3[1];} else { ERRTEXT = ""; }
            }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(5, 16, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S5F15

S5F16Exception Recovery Complete Confirm Sent by Host Only

using namespace std;

    // S5F16 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(5, 15, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // no data expected
        return;  // parsed ok
        } // end while(ok)

S5F17RException Recovery Abort Request Sent by Host Only

using namespace std;

    // S5F17R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 5, 17, ::recvS5F17R);

// receive method 
void recvS5F17R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect EXID
        // variables for data items and parsing
        string EXID;  	// A:20 (always)  exception identifier
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0].find("A:") != 0 ) { ok = false; break; }
        if ( list0.size() == 2) { EXID = list0[1];} else { EXID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(5, 18, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S5F17R

S5F18Exception Recovery Abort Ack Sent by Equipment Only

using namespace std;

    // S5F18 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(5, 17, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 EXID {L:2 ACKA {L:2* ERRCODE ERRTEXT}}
        // variables for data items and parsing
        string EXID;  	// A:20 (always)  exception identifier
        int ACKA;  	// TF:1 (always)  request success
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { EXID = list1[1];} else { EXID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "TF:1" ) { ok = false; break; }
        ACKA = atoi(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if ( list2.size() == 3 ) {  // 2 optional items found
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ERRCODE = list3[1];} else { ERRCODE = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { ERRTEXT = list3[1];} else { ERRTEXT = ""; }
            }
        return;  // parsed ok
        } // end while(ok)

S6F1[R]Trace Data Send Sent by Equipment Only

using namespace std;

    // S6F1 C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 6, 1, ::recvS6F1);

// receive method 
void recvS6F1(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:4 TRID SMPLN STIME {L:n SV}
        // variables for data items and parsing
        string TRID;  	// A:n (varies)  trace request ID
        string SMPLN;  	// U4:1 (varies)  sample number
        string STIME;  	// A:32 (always)  ECV TimeFormat controls format, 0=A:12 YYMMDDHHMMSS, 1=A:16 YYYYMMDDHHMMSScc,2=YYYY-MM-DDTHH:MM:SS.s[s]*{Z|+hh:mm|-hh:mm}
        string SV;  	// A:n (varies)  status variable value
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 5 || list0[0] != "L:4") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { TRID = list1[1];} else { TRID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { SMPLN = list1[1];} else { SMPLN = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { STIME = list1[1];} else { STIME = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { SV = list2[1];} else { SV = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(6, 2, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S6F1

S6F2Trace Data Ack Sent by Host Only

using namespace std;

    // S6F2 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(6, 1, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect ACKC6
        // variables for data items and parsing
        int ACKC6;  	// B:1 (always)  acknowledge code, 0 ok
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        ACKC6 = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S6F3[R]Discrete Variable Data Send Sent by Equipment Only

using namespace std;

    // S6F3 C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 6, 3, ::recvS6F3);

// receive method 
void recvS6F3(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:3 DATAID CEID {L:n {L:2 DSID {L:m {L:2 DVNAME DVVAL}}}}
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string CEID;  	// U4:1 (varies)  collection event identifier, GEM requires type Un
        string DSID;  	// A:n (varies)  data set ID, akin to a report type
        string DVNAME;  	// U4:1 (varies)  data value name, generically a VID, therefore GEM requires Un type
        string DVVAL;  	// A:n (varies)  data value, any format including list
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { CEID = list1[1];} else { CEID = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { DSID = list3[1];} else { DSID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if ( list3.size() < 1) { ok=false; break; }
            for(size_t m=1; m < list3.size(); m++) {
                vector<string> list4;
                sp->listSplit(list3[m], list4);
                if ( list4.size() != 3 || list4[0] != "L:2") { ok=false; break; }
                vector<string> list5;
                sp->listSplit(list4[1], list5);
                if (list5.size() < 1) { ok = false; break; }
                if ( list5.size() == 2) { DVNAME = list5[1];} else { DVNAME = ""; }
                list5.clear();
                sp->listSplit(list4[2], list5);
                if (list5.size() < 1) { ok = false; break; }
                if ( list5.size() == 2) { DVVAL = list5[1];} else { DVVAL = ""; }
                }
            if (!ok) break;
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(6, 4, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S6F3

S6F4Discrete Variable Data Send Ack Sent by Host Only

using namespace std;

    // S6F4 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(6, 3, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect ACKC6
        // variables for data items and parsing
        int ACKC6;  	// B:1 (always)  acknowledge code, 0 ok
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        ACKC6 = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S6F5RMulti-block Data Send Inquire Sent by Equipment Only

using namespace std;

    // S6F5R C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 6, 5, ::recvS6F5R);

// receive method 
void recvS6F5R(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 DATAID DATALENGTH
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string DATALENGTH;  	// U4:1 (varies)  total bytes of the message body 
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATALENGTH = list1[1];} else { DATALENGTH = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(6, 6, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S6F5R

S6F6Multi-block Grant Sent by Host Only

using namespace std;

    // S6F6 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(6, 5, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect GRANT6
        // variables for data items and parsing
        int GRANT6;  	// B:1 (always)  multblock permission grant
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        GRANT6 = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S6F7RData Transfer Request Sent by Host Only

using namespace std;

    // S6F7R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 6, 7, ::recvS6F7R);

// receive method 
void recvS6F7R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect DATAID
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0.size() == 2) { DATAID = list0[1];} else { DATAID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(6, 8, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S6F7R

S6F8Data Transfer Data Sent by Equipment Only

using namespace std;

    // S6F8 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(6, 7, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:3 DATAID CEID {L:n DSID {L:m {L:2 DVNAME DVVAL}}}
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string CEID;  	// U4:1 (varies)  collection event identifier, GEM requires type Un
        string DSID;  	// A:n (varies)  data set ID, akin to a report type
        string DVNAME;  	// U4:1 (varies)  data value name, generically a VID, therefore GEM requires Un type
        string DVVAL;  	// A:n (varies)  data value, any format including list
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { CEID = list1[1];} else { CEID = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { DSID = list2[1];} else { DSID = ""; }
            list2.clear();
            sp->listSplit(list1[n], list2);
            if ( list2.size() < 1) { ok=false; break; }
            for(size_t m=1; m < list2.size(); m++) {
                vector<string> list3;
                sp->listSplit(list2[m], list3);
                if ( list3.size() != 3 || list3[0] != "L:2") { ok=false; break; }
                vector<string> list4;
                sp->listSplit(list3[1], list4);
                if (list4.size() < 1) { ok = false; break; }
                if ( list4.size() == 2) { DVNAME = list4[1];} else { DVNAME = ""; }
                list4.clear();
                sp->listSplit(list3[2], list4);
                if (list4.size() < 1) { ok = false; break; }
                if ( list4.size() == 2) { DVVAL = list4[1];} else { DVVAL = ""; }
                }
            if (!ok) break;
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S6F9[R]Formatted Variable Send Sent by Equipment Only

using namespace std;

    // S6F9 C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 6, 9, ::recvS6F9);

// receive method 
void recvS6F9(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:4 PFCD DATAID CEID {L:n {L:2 DSID {L:m DVVAL}}}
        // variables for data items and parsing
        int PFCD;  	// B:1 (always)  predefined form selector
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string CEID;  	// U4:1 (varies)  collection event identifier, GEM requires type Un
        string DSID;  	// A:n (varies)  data set ID, akin to a report type
        string DVVAL;  	// A:n (varies)  data value, any format including list
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 5 || list0[0] != "L:4") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        PFCD = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { CEID = list1[1];} else { CEID = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { DSID = list3[1];} else { DSID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if ( list3.size() < 1) { ok=false; break; }
            for(size_t m=1; m < list3.size(); m++) {
                vector<string> list4;
                sp->listSplit(list3[m], list4);
                if (list4.size() < 1) { ok = false; break; }
                if ( list4.size() == 2) { DVVAL = list4[1];} else { DVVAL = ""; }
                }
            if (!ok) break;
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(6, 10, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S6F9

S6F10Formatted Variable Ack Sent by Host Only

using namespace std;

    // S6F10 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(6, 9, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect ACKC6
        // variables for data items and parsing
        int ACKC6;  	// B:1 (always)  acknowledge code, 0 ok
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        ACKC6 = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S6F11REvent Report Send Sent by Equipment Only

using namespace std;

    // S6F11R C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 6, 11, ::recvS6F11R);

// receive method 
void recvS6F11R(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:3 DATAID CEID {L:a {L:2 RPTID {L:b V}}}
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string CEID;  	// U4:1 (varies)  collection event identifier, GEM requires type Un
        string RPTID;  	// U4:1 (varies)  report ID
        string V;  	// A:n (varies)  variable value, any type including list
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { CEID = list1[1];} else { CEID = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t a=1; a < list1.size(); a++) {
            vector<string> list2;
            sp->listSplit(list1[a], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { RPTID = list3[1];} else { RPTID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if ( list3.size() < 1) { ok=false; break; }
            for(size_t b=1; b < list3.size(); b++) {
                vector<string> list4;
                sp->listSplit(list3[b], list4);
                if (list4.size() < 1) { ok = false; break; }
                if ( list4.size() == 2) { V = list4[1];} else { V = ""; }
                }
            if (!ok) break;
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(6, 12, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S6F11R

S6F12Event Report Ack Sent by Host Only

using namespace std;

    // S6F12 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(6, 11, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect ACKC6
        // variables for data items and parsing
        int ACKC6;  	// B:1 (always)  acknowledge code, 0 ok
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        ACKC6 = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S6F13RAnnotated Event Report Send Sent by Equipment Only

using namespace std;

    // S6F13R C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 6, 13, ::recvS6F13R);

// receive method 
void recvS6F13R(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:3 DATAID CEID {L:a {L:2 RPTID {L:b {L:2 VID V}}}}
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string CEID;  	// U4:1 (varies)  collection event identifier, GEM requires type Un
        string RPTID;  	// U4:1 (varies)  report ID
        string VID;  	// A:n (varies)  A variable ID
        string V;  	// A:n (varies)  variable value, any type including list
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { CEID = list1[1];} else { CEID = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t a=1; a < list1.size(); a++) {
            vector<string> list2;
            sp->listSplit(list1[a], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { RPTID = list3[1];} else { RPTID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if ( list3.size() < 1) { ok=false; break; }
            for(size_t b=1; b < list3.size(); b++) {
                vector<string> list4;
                sp->listSplit(list3[b], list4);
                if ( list4.size() != 3 || list4[0] != "L:2") { ok=false; break; }
                vector<string> list5;
                sp->listSplit(list4[1], list5);
                if (list5.size() < 1) { ok = false; break; }
                if ( list5.size() == 2) { VID = list5[1];} else { VID = ""; }
                list5.clear();
                sp->listSplit(list4[2], list5);
                if (list5.size() < 1) { ok = false; break; }
                if ( list5.size() == 2) { V = list5[1];} else { V = ""; }
                }
            if (!ok) break;
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(6, 14, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S6F13R

S6F14Annotated Event Report Ack Sent by Host Only

using namespace std;

    // S6F14 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(6, 13, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect ACKC6
        // variables for data items and parsing
        int ACKC6;  	// B:1 (always)  acknowledge code, 0 ok
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        ACKC6 = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S6F15REvent Report Request Sent by Host Only

using namespace std;

    // S6F15R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 6, 15, ::recvS6F15R);

// receive method 
void recvS6F15R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect CEID
        // variables for data items and parsing
        string CEID;  	// U4:1 (varies)  collection event identifier, GEM requires type Un
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0.size() == 2) { CEID = list0[1];} else { CEID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(6, 16, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S6F15R

S6F16Event Report Data Sent by Equipment Only

using namespace std;

    // S6F16 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(6, 15, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:3 DATAID CEID {L:a {L:2 RPTID {L:b V}}}
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string CEID;  	// U4:1 (varies)  collection event identifier, GEM requires type Un
        string RPTID;  	// U4:1 (varies)  report ID
        string V;  	// A:n (varies)  variable value, any type including list
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { CEID = list1[1];} else { CEID = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t a=1; a < list1.size(); a++) {
            vector<string> list2;
            sp->listSplit(list1[a], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { RPTID = list3[1];} else { RPTID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if ( list3.size() < 1) { ok=false; break; }
            for(size_t b=1; b < list3.size(); b++) {
                vector<string> list4;
                sp->listSplit(list3[b], list4);
                if (list4.size() < 1) { ok = false; break; }
                if ( list4.size() == 2) { V = list4[1];} else { V = ""; }
                }
            if (!ok) break;
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S6F17RAnnotated Event Report Request Sent by Host Only

using namespace std;

    // S6F17R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 6, 17, ::recvS6F17R);

// receive method 
void recvS6F17R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect CEID
        // variables for data items and parsing
        string CEID;  	// U4:1 (varies)  collection event identifier, GEM requires type Un
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0.size() == 2) { CEID = list0[1];} else { CEID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(6, 18, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S6F17R

S6F18Annotated Event Report Data Sent by Equipment Only

using namespace std;

    // S6F18 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(6, 17, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:3 DATAID CEID {L:a {L:2 RPTID {L:b {L:2 VID V}}}}
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string CEID;  	// U4:1 (varies)  collection event identifier, GEM requires type Un
        string RPTID;  	// U4:1 (varies)  report ID
        string VID;  	// A:n (varies)  A variable ID
        string V;  	// A:n (varies)  variable value, any type including list
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { CEID = list1[1];} else { CEID = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t a=1; a < list1.size(); a++) {
            vector<string> list2;
            sp->listSplit(list1[a], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { RPTID = list3[1];} else { RPTID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if ( list3.size() < 1) { ok=false; break; }
            for(size_t b=1; b < list3.size(); b++) {
                vector<string> list4;
                sp->listSplit(list3[b], list4);
                if ( list4.size() != 3 || list4[0] != "L:2") { ok=false; break; }
                vector<string> list5;
                sp->listSplit(list4[1], list5);
                if (list5.size() < 1) { ok = false; break; }
                if ( list5.size() == 2) { VID = list5[1];} else { VID = ""; }
                list5.clear();
                sp->listSplit(list4[2], list5);
                if (list5.size() < 1) { ok = false; break; }
                if ( list5.size() == 2) { V = list5[1];} else { V = ""; }
                }
            if (!ok) break;
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S6F19RIndividual Report Request Sent by Host Only

using namespace std;

    // S6F19R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 6, 19, ::recvS6F19R);

// receive method 
void recvS6F19R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect RPTID
        // variables for data items and parsing
        string RPTID;  	// U4:1 (varies)  report ID
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0.size() == 2) { RPTID = list0[1];} else { RPTID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(6, 20, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S6F19R

S6F20Individual Report Data Sent by Equipment Only

using namespace std;

    // S6F20 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(6, 19, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:n V
        // variables for data items and parsing
        string V;  	// A:n (varies)  variable value, any type including list
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if (list1.size() < 1) { ok = false; break; }
            if ( list1.size() == 2) { V = list1[1];} else { V = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S6F21RAnnotated Individual Report Request Sent by Host Only

using namespace std;

    // S6F21R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 6, 21, ::recvS6F21R);

// receive method 
void recvS6F21R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect RPTID
        // variables for data items and parsing
        string RPTID;  	// U4:1 (varies)  report ID
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0.size() == 2) { RPTID = list0[1];} else { RPTID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(6, 22, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S6F21R

S6F22Annotated Individual Report Data Sent by Equipment Only

using namespace std;

    // S6F22 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(6, 21, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:n {L:2 VID V}
        // variables for data items and parsing
        string VID;  	// A:n (varies)  A variable ID
        string V;  	// A:n (varies)  variable value, any type including list
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
            vector<string> list2;
            sp->listSplit(list1[1], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { VID = list2[1];} else { VID = ""; }
            list2.clear();
            sp->listSplit(list1[2], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { V = list2[1];} else { V = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S6F23RRequest or Purge Spooled Data Sent by Host Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S6F23R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 6, 23, ::recvS6F23R);

// receive method 
void recvS6F23R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect RSDC
        // variables for data items and parsing
        unsigned long RSDC;  	// U1:1 (always)  spool request code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "U1:1" ) { ok = false; break; }
        RSDC = atoul(list0[1].c_str());
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(6, 24, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S6F23R

S6F24Request or Purge Spooled Data Ack Sent by Equipment Only

using namespace std;

    // S6F24 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(6, 23, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect RSDA
        // variables for data items and parsing
        int RSDA;  	// B:1 (always)  spool request reply
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        RSDA = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S6F25[R]Notification Report Send Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S6F25 C++ Receive message - add next line to setup
    sp->messageTypeAdd( 6, 25, ::recvS6F25);

// receive method 
void recvS6F25(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:7 DATAID OPID LINKID RCPSPEC RMCHGSTAT {L:m {L:2 RCPATTRID RCPATTRDATA}} {L:2 RMACK {L:p {L:2 ERRCODE ERRTEXT}}}
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string OPID;  	// U4:1 (varies)  operation identifier
        unsigned long LINKID;  	// U4:1 (always)  correlates the RMOPID value in a request to a completion report
        string RCPSPEC;  	// A:n (always)  recipe specifier
        string RMCHGSTAT;  	// U4:1 (varies)  object change type
        string RCPATTRID;  	// A:n (always)  the name of a recipe attribute, but not used to indicate the recipe identifier
        string RCPATTRDATA;  	// A:n (varies)  the value of a recipe attribute, any type of data including list
        unsigned long RMACK;  	// U1:1 (always)  recipe managment completion code
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 8 || list0[0] != "L:7") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OPID = list1[1];} else { OPID = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U4:1" ) { ok = false; break; }
        LINKID = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { RCPSPEC = list1[1];} else { RCPSPEC = ""; }
        list1.clear();
        sp->listSplit(list0[5], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { RMCHGSTAT = list1[1];} else { RMCHGSTAT = ""; }
        list1.clear();
        sp->listSplit(list0[6], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t m=1; m < list1.size(); m++) {
            vector<string> list2;
            sp->listSplit(list1[m], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { RCPATTRID = list3[1];} else { RCPATTRID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { RCPATTRDATA = list3[1];} else { RCPATTRDATA = ""; }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[7], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "U1:1" ) { ok = false; break; }
        RMACK = atoul(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if ( list2.size() < 1) { ok=false; break; }
        for(size_t p=1; p < list2.size(); p++) {
            vector<string> list3;
            sp->listSplit(list2[p], list3);
            if ( list3.size() != 3 || list3[0] != "L:2") { ok=false; break; }
            vector<string> list4;
            sp->listSplit(list3[1], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { ERRCODE = list4[1];} else { ERRCODE = ""; }
            list4.clear();
            sp->listSplit(list3[2], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0].find("A:") != 0 ) { ok = false; break; }
            if ( list4.size() == 2) { ERRTEXT = list4[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(6, 26, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S6F25

S6F26Notification Report Send Ack Sent by Host and Equipment

using namespace std;

    // S6F26 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(6, 25, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect ACKC6
        // variables for data items and parsing
        int ACKC6;  	// B:1 (always)  acknowledge code, 0 ok
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        ACKC6 = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S6F27[R]Trace Report Send Sent by Equipment Only

using namespace std;

    // S6F27 C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 6, 27, ::recvS6F27);

// receive method 
void recvS6F27(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:3 DATAID TRID {L:n {L:p {L:2 RPTID {L:m V}}}}
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string TRID;  	// A:n (varies)  trace request ID
        string RPTID;  	// U4:1 (varies)  report ID
        string V;  	// A:n (varies)  variable value, any type including list
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { TRID = list1[1];} else { TRID = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() < 1) { ok=false; break; }
            for(size_t p=1; p < list2.size(); p++) {
                vector<string> list3;
                sp->listSplit(list2[p], list3);
                if ( list3.size() != 3 || list3[0] != "L:2") { ok=false; break; }
                vector<string> list4;
                sp->listSplit(list3[1], list4);
                if (list4.size() < 1) { ok = false; break; }
                if ( list4.size() == 2) { RPTID = list4[1];} else { RPTID = ""; }
                list4.clear();
                sp->listSplit(list3[2], list4);
                if ( list4.size() < 1) { ok=false; break; }
                for(size_t m=1; m < list4.size(); m++) {
                    vector<string> list5;
                    sp->listSplit(list4[m], list5);
                    if (list5.size() < 1) { ok = false; break; }
                    if ( list5.size() == 2) { V = list5[1];} else { V = ""; }
                    }
                if (!ok) break;
                }
            if (!ok) break;
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(6, 28, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S6F27

S6F28Trace Report Send Ack Sent by Host Only

using namespace std;

    // S6F28 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(6, 27, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect TRID
        // variables for data items and parsing
        string TRID;  	// A:n (varies)  trace request ID
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0.size() == 2) { TRID = list0[1];} else { TRID = ""; }
        return;  // parsed ok
        } // end while(ok)

S6F29RTrace Report Request Sent by Host Only

using namespace std;

    // S6F29R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 6, 29, ::recvS6F29R);

// receive method 
void recvS6F29R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect TRID
        // variables for data items and parsing
        string TRID;  	// A:n (varies)  trace request ID
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0.size() == 2) { TRID = list0[1];} else { TRID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(6, 30, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S6F29R

S6F30Trace Report Data Sent by Equipment Only

using namespace std;

    // S6F30 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(6, 29, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:3 TRID {L:n {L:2 RPTID {L:m V}}} ERRCODE
        // variables for data items and parsing
        string TRID;  	// A:n (varies)  trace request ID
        string RPTID;  	// U4:1 (varies)  report ID
        string V;  	// A:n (varies)  variable value, any type including list
        string ERRCODE;  	// U4:1 (varies)  error code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { TRID = list1[1];} else { TRID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { RPTID = list3[1];} else { RPTID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if ( list3.size() < 1) { ok=false; break; }
            for(size_t m=1; m < list3.size(); m++) {
                vector<string> list4;
                sp->listSplit(list3[m], list4);
                if (list4.size() < 1) { ok = false; break; }
                if ( list4.size() == 2) { V = list4[1];} else { V = ""; }
                }
            if (!ok) break;
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { ERRCODE = list1[1];} else { ERRCODE = ""; }
        return;  // parsed ok
        } // end while(ok)

S7F1RProcess Program Load Inquire Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S7F1R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 7, 1, ::recvS7F1R);

// receive method 
void recvS7F1R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 PPID LENGTH
        // variables for data items and parsing
        string PPID;  	// A:80 (varies)  process program ID
        unsigned long LENGTH;  	// U4:1 (always)  program length in bytes
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { PPID = list1[1];} else { PPID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U4:1" ) { ok = false; break; }
        LENGTH = atoul(list1[1].c_str());
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(7, 2, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S7F1R

S7F2Process Program Load Grant Sent by Host and Equipment

using namespace std;

    // S7F2 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(7, 1, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect PPGNT
        // variables for data items and parsing
        int PPGNT;  	// B:1 (always)  process program transfer grant status
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        PPGNT = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S7F3RProcess Program Send Sent by Host and Equipment

using namespace std;

    // S7F3R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 7, 3, ::recvS7F3R);

// receive method 
void recvS7F3R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 PPID PPBODY
        // variables for data items and parsing
        string PPID;  	// A:80 (varies)  process program ID
        int [] PPBODY;  	// B:n (varies)  process program data, any non-list type
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { PPID = list1[1];} else { PPID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        vector<int> PPBODY;
        for(size_t i=0; i < PPBODY.size(); i++) {
            PPBODY.push_back(sp->binToInt(list1[1+i].c_str()));
            }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(7, 4, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S7F3R

S7F4Process Program Send Acknowledge Sent by Host and Equipment

using namespace std;

    // S7F4 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(7, 3, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect ACKC7
        // variables for data items and parsing
        int ACKC7;  	// B:1 (always)  S7 acknowledge code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        ACKC7 = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S7F5RProcess Program Request Sent by Host and Equipment

using namespace std;

    // S7F5R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 7, 5, ::recvS7F5R);

// receive method 
void recvS7F5R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect PPID
        // variables for data items and parsing
        string PPID;  	// A:80 (varies)  process program ID
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0.size() == 2) { PPID = list0[1];} else { PPID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(7, 6, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S7F5R

S7F6Process Program Data Sent by Host and Equipment

using namespace std;

    // S7F6 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(7, 5, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 PPID PPBODY
        // variables for data items and parsing
        string PPID;  	// A:80 (varies)  process program ID
        int [] PPBODY;  	// B:n (varies)  process program data, any non-list type
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { PPID = list1[1];} else { PPID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        vector<int> PPBODY;
        for(size_t i=0; i < PPBODY.size(); i++) {
            PPBODY.push_back(sp->binToInt(list1[1+i].c_str()));
            }
        return;  // parsed ok
        } // end while(ok)

S7F7RProcess Program ID Request Sent by Equipment Only

using namespace std;

    // S7F7R C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 7, 7, ::recvS7F7R);

// receive method 
void recvS7F7R(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect MID
        // variables for data items and parsing
        string MID;  	// A:16 (varies)  material ID, E40 restricts to A:n
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0.size() == 2) { MID = list0[1];} else { MID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(7, 8, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S7F7R

S7F8Process Program ID Data Sent by Host Only

using namespace std;

    // S7F8 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(7, 7, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 PPID MID
        // variables for data items and parsing
        string PPID;  	// A:80 (varies)  process program ID
        string MID;  	// A:16 (varies)  material ID, E40 restricts to A:n
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { PPID = list1[1];} else { PPID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { MID = list1[1];} else { MID = ""; }
        return;  // parsed ok
        } // end while(ok)

S7F9RMatl/Process Matrix Request Sent by Host and Equipment

using namespace std;

    // S7F9R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 7, 9, ::recvS7F9R);

// receive method 
void recvS7F9R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // no data expected
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(7, 10, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S7F9R

S7F10Matl/Process Matrix Data Sent by Host and Equipment

using namespace std;

    // S7F10 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(7, 9, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:n {L:2 PPID {L:a MID}}
        // variables for data items and parsing
        string PPID;  	// A:80 (varies)  process program ID
        string MID;  	// A:16 (varies)  material ID, E40 restricts to A:n
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
            vector<string> list2;
            sp->listSplit(list1[1], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { PPID = list2[1];} else { PPID = ""; }
            list2.clear();
            sp->listSplit(list1[2], list2);
            if ( list2.size() < 1) { ok=false; break; }
            for(size_t a=1; a < list2.size(); a++) {
                vector<string> list3;
                sp->listSplit(list2[a], list3);
                if (list3.size() < 1) { ok = false; break; }
                if ( list3.size() == 2) { MID = list3[1];} else { MID = ""; }
                }
            if (!ok) break;
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S7F11[R]Matl/Process Matrix Update Send Sent by Host Only

using namespace std;

    // S7F11 C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 7, 11, ::recvS7F11);

// receive method 
void recvS7F11(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:n {L:2 PPID {L:a MID}}
        // variables for data items and parsing
        string PPID;  	// A:80 (varies)  process program ID
        string MID;  	// A:16 (varies)  material ID, E40 restricts to A:n
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
            vector<string> list2;
            sp->listSplit(list1[1], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { PPID = list2[1];} else { PPID = ""; }
            list2.clear();
            sp->listSplit(list1[2], list2);
            if ( list2.size() < 1) { ok=false; break; }
            for(size_t a=1; a < list2.size(); a++) {
                vector<string> list3;
                sp->listSplit(list2[a], list3);
                if (list3.size() < 1) { ok = false; break; }
                if ( list3.size() == 2) { MID = list3[1];} else { MID = ""; }
                }
            if (!ok) break;
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(7, 12, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S7F11

S7F12Matl/Process Matrix Update Ack Sent by Equipment Only

using namespace std;

    // S7F12 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(7, 11, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect ACKC7
        // variables for data items and parsing
        int ACKC7;  	// B:1 (always)  S7 acknowledge code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        ACKC7 = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S7F13[R]Matl/Process Matrix Delete Entry Send Sent by Host Only

using namespace std;

    // S7F13 C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 7, 13, ::recvS7F13);

// receive method 
void recvS7F13(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:n {L:2 PPID {L:a MID}}
        // variables for data items and parsing
        string PPID;  	// A:80 (varies)  process program ID
        string MID;  	// A:16 (varies)  material ID, E40 restricts to A:n
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
            vector<string> list2;
            sp->listSplit(list1[1], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { PPID = list2[1];} else { PPID = ""; }
            list2.clear();
            sp->listSplit(list1[2], list2);
            if ( list2.size() < 1) { ok=false; break; }
            for(size_t a=1; a < list2.size(); a++) {
                vector<string> list3;
                sp->listSplit(list2[a], list3);
                if (list3.size() < 1) { ok = false; break; }
                if ( list3.size() == 2) { MID = list3[1];} else { MID = ""; }
                }
            if (!ok) break;
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(7, 14, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S7F13

S7F14Delete Matl/Process Matrix Entry Acknowledge Sent by Equipment Only

using namespace std;

    // S7F14 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(7, 13, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect ACKC7
        // variables for data items and parsing
        int ACKC7;  	// B:1 (always)  S7 acknowledge code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        ACKC7 = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S7F15RMatrix Mode Select Send Sent by Host Only

using namespace std;

    // S7F15R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 7, 15, ::recvS7F15R);

// receive method 
void recvS7F15R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect MMODE
        // variables for data items and parsing
        int MMODE;  	// B:1 (always)  matrix mode selection
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        MMODE = sp->binToInt(list0[1].c_str());
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(7, 16, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S7F15R

S7F16Matrix Mode Select Ack Sent by Equipment Only

using namespace std;

    // S7F16 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(7, 15, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect ACKC7
        // variables for data items and parsing
        int ACKC7;  	// B:1 (always)  S7 acknowledge code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        ACKC7 = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S7F17RDelete Process Program Send Sent by Host Only

using namespace std;

    // S7F17R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 7, 17, ::recvS7F17R);

// receive method 
void recvS7F17R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:n PPID
        // variables for data items and parsing
        string PPID;  	// A:80 (varies)  process program ID
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if (list1.size() < 1) { ok = false; break; }
            if ( list1.size() == 2) { PPID = list1[1];} else { PPID = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(7, 18, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S7F17R

S7F18Delete Process Program Acknowledge Sent by Equipment Only

using namespace std;

    // S7F18 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(7, 17, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect ACKC7
        // variables for data items and parsing
        int ACKC7;  	// B:1 (always)  S7 acknowledge code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        ACKC7 = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S7F19RCurrent Process Program Dir Request Sent by Host Only

using namespace std;

    // S7F19R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 7, 19, ::recvS7F19R);

// receive method 
void recvS7F19R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // no data expected
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(7, 20, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S7F19R

S7F20Current Process Program Data Sent by Equipment Only

using namespace std;

    // S7F20 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(7, 19, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:n PPID
        // variables for data items and parsing
        string PPID;  	// A:80 (varies)  process program ID
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if (list1.size() < 1) { ok = false; break; }
            if ( list1.size() == 2) { PPID = list1[1];} else { PPID = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S7F21Process Capabilities Request Sent by Host Only

using namespace std;

    // S7F21 C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 7, 21, ::recvS7F21);

// receive method 
void recvS7F21(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // no data expected
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(7, 22, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S7F21

S7F22Process Capabilities Data Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S7F22 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(7, 21, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:5 MDLN SOFTREV CMDMAX BYTMAX {L:c {L:11 CCODE CNAME RQCMD BLKDEF BCDS IBCDS NBCDS ACDS IACDS NACDS {L:p L:x}}}
        // variables for data items and parsing
        string MDLN;  	// A:20 (always)  equipment model type
        string SOFTREV;  	// A:20 (always)  software revision
        string CMDMAX;  	// U1:1 (varies)  maximum number of commands allowed, 0=unlimited
        string BYTMAX;  	// U4:1 (varies)  process program maximum byte length, 0 means no limit
        string CCODE;  	// A:n (varies)  process operation command code
        string CNAME;  	// A:16 (always)  text name for a CCODE
        int RQCMD;  	// TF:1 (always)  flag that command is required
        int BLKDEF;  	// I1:1 (always)  command definition block relationship, standard incorrectly says type U1 is possible
        unsigned long [] BCDS;  	// U2:n (varies)  before command code vector
        unsigned long [] IBCDS;  	// U2:n (varies)  vector of immediately before command codes
        unsigned long [] NBCDS;  	// U2:n (varies)  vector of not before command codes
        string ACDS;  	// U2:1 (varies)  after command codes
        unsigned long [] IACDS;  	// U2:n (varies)  vector of immediately after command codes
        unsigned long [] NACDS;  	// U2:n (varies)  vector of not after command codes
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 6 || list0[0] != "L:5") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { MDLN = list1[1];} else { MDLN = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { SOFTREV = list1[1];} else { SOFTREV = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { CMDMAX = list1[1];} else { CMDMAX = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { BYTMAX = list1[1];} else { BYTMAX = ""; }
        list1.clear();
        sp->listSplit(list0[5], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t c=1; c < list1.size(); c++) {
            vector<string> list2;
            sp->listSplit(list1[c], list2);
            if ( list2.size() != 12 || list2[0] != "L:11") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { CCODE = list3[1];} else { CCODE = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { CNAME = list3[1];} else { CNAME = ""; }
            list3.clear();
            sp->listSplit(list2[3], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "TF:1" ) { ok = false; break; }
            RQCMD = atoi(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[4], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "I1:1" ) { ok = false; break; }
            BLKDEF = atoi(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[5], list3);
            if (list3.size() < 1) { ok = false; break; }
            vector<unsigned long> BCDS;
            for(size_t i=0; i < BCDS.size(); i++) {
                BCDS.push_back(atoul(list3[1+i].c_str()));
                }
            list3.clear();
            sp->listSplit(list2[6], list3);
            if (list3.size() < 1) { ok = false; break; }
            vector<unsigned long> IBCDS;
            for(size_t i=0; i < IBCDS.size(); i++) {
                IBCDS.push_back(atoul(list3[1+i].c_str()));
                }
            list3.clear();
            sp->listSplit(list2[7], list3);
            if (list3.size() < 1) { ok = false; break; }
            vector<unsigned long> NBCDS;
            for(size_t i=0; i < NBCDS.size(); i++) {
                NBCDS.push_back(atoul(list3[1+i].c_str()));
                }
            list3.clear();
            sp->listSplit(list2[8], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ACDS = list3[1];} else { ACDS = ""; }
            list3.clear();
            sp->listSplit(list2[9], list3);
            if (list3.size() < 1) { ok = false; break; }
            vector<unsigned long> IACDS;
            for(size_t i=0; i < IACDS.size(); i++) {
                IACDS.push_back(atoul(list3[1+i].c_str()));
                }
            list3.clear();
            sp->listSplit(list2[10], list3);
            if (list3.size() < 1) { ok = false; break; }
            vector<unsigned long> NACDS;
            for(size_t i=0; i < NACDS.size(); i++) {
                NACDS.push_back(atoul(list3[1+i].c_str()));
                }
            list3.clear();
            sp->listSplit(list2[11], list3);
            if ( list3.size() < 1) { ok=false; break; }
            for(size_t p=1; p < list3.size(); p++) {
                vector<string> list4;
                sp->listSplit(list3[p], list4);
                if (list4.size() != 1 || list4[0] != "L:x") { ok = false; break; }
                // single token data such as L:0 or U4:0 has been received as expected
                }
            if (!ok) break;
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S7F23RFormatted Process Program Send Sent by Host and Equipment

using namespace std;

    // S7F23R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 7, 23, ::recvS7F23R);

// receive method 
void recvS7F23R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:4 PPID MDLN SOFTREV {L:c {L:2 CCODE {L:p PPARM}}}
        // variables for data items and parsing
        string PPID;  	// A:80 (varies)  process program ID
        string MDLN;  	// A:20 (always)  equipment model type
        string SOFTREV;  	// A:20 (always)  software revision
        string CCODE;  	// A:n (varies)  process operation command code
        string PPARM;  	// A:n (varies)  process parameter, any scalar or vector
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 5 || list0[0] != "L:4") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { PPID = list1[1];} else { PPID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { MDLN = list1[1];} else { MDLN = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { SOFTREV = list1[1];} else { SOFTREV = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t c=1; c < list1.size(); c++) {
            vector<string> list2;
            sp->listSplit(list1[c], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { CCODE = list3[1];} else { CCODE = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if ( list3.size() < 1) { ok=false; break; }
            for(size_t p=1; p < list3.size(); p++) {
                vector<string> list4;
                sp->listSplit(list3[p], list4);
                if (list4.size() < 1) { ok = false; break; }
                if ( list4.size() == 2) { PPARM = list4[1];} else { PPARM = ""; }
                }
            if (!ok) break;
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(7, 24, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S7F23R

S7F24Formatted Process Program Acknowledge Sent by Host and Equipment

using namespace std;

    // S7F24 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(7, 23, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect ACKC7
        // variables for data items and parsing
        int ACKC7;  	// B:1 (always)  S7 acknowledge code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        ACKC7 = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S7F25RFormatted Process Program Request Sent by Host and Equipment

using namespace std;

    // S7F25R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 7, 25, ::recvS7F25R);

// receive method 
void recvS7F25R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect PPID
        // variables for data items and parsing
        string PPID;  	// A:80 (varies)  process program ID
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0.size() == 2) { PPID = list0[1];} else { PPID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(7, 26, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S7F25R

S7F26Formatted Process Program Data Sent by Host and Equipment

using namespace std;

    // S7F26 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(7, 25, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:4 PPID MDLN SOFTREV {L:c {L:2 CCODE {L:p PPARM}}}
        // variables for data items and parsing
        string PPID;  	// A:80 (varies)  process program ID
        string MDLN;  	// A:20 (always)  equipment model type
        string SOFTREV;  	// A:20 (always)  software revision
        string CCODE;  	// A:n (varies)  process operation command code
        string PPARM;  	// A:n (varies)  process parameter, any scalar or vector
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 5 || list0[0] != "L:4") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { PPID = list1[1];} else { PPID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { MDLN = list1[1];} else { MDLN = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { SOFTREV = list1[1];} else { SOFTREV = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t c=1; c < list1.size(); c++) {
            vector<string> list2;
            sp->listSplit(list1[c], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { CCODE = list3[1];} else { CCODE = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if ( list3.size() < 1) { ok=false; break; }
            for(size_t p=1; p < list3.size(); p++) {
                vector<string> list4;
                sp->listSplit(list3[p], list4);
                if (list4.size() < 1) { ok = false; break; }
                if ( list4.size() == 2) { PPARM = list4[1];} else { PPARM = ""; }
                }
            if (!ok) break;
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S7F27RProcess Program Verification Send Sent by Equipment Only

using namespace std;

    // S7F27R C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 7, 27, ::recvS7F27R);

// receive method 
void recvS7F27R(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 PPID {L:n {L:3 ACKC7A SEQNUM ERRW7}}
        // variables for data items and parsing
        string PPID;  	// A:80 (varies)  process program ID
        string ACKC7A;  	// U4:1 (varies)  process program check code
        string SEQNUM;  	// U4:1 (varies)  process program command number
        string ERRW7;  	// A:n (varies)  process program error description
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { PPID = list1[1];} else { PPID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 4 || list2[0] != "L:3") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ACKC7A = list3[1];} else { ACKC7A = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { SEQNUM = list3[1];} else { SEQNUM = ""; }
            list3.clear();
            sp->listSplit(list2[3], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ERRW7 = list3[1];} else { ERRW7 = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(7, 28, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S7F27R

S7F28Process Program Verification Acknowledge Sent by Host Only

using namespace std;

    // S7F28 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(7, 27, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // no data expected
        return;  // parsed ok
        } // end while(ok)

S7F29RProcess Program Verification Inquire Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S7F29R C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 7, 29, ::recvS7F29R);

// receive method 
void recvS7F29R(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect LENGTH
        // variables for data items and parsing
        unsigned long LENGTH;  	// U4:1 (always)  program length in bytes
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "U4:1" ) { ok = false; break; }
        LENGTH = atoul(list0[1].c_str());
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(7, 30, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S7F29R

S7F30Process Program Verification Grant Sent by Host Only

using namespace std;

    // S7F30 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(7, 29, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect PPGNT
        // variables for data items and parsing
        int PPGNT;  	// B:1 (always)  process program transfer grant status
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        PPGNT = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S7F31RVerification Request Send Sent by Host Only

using namespace std;

    // S7F31R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 7, 31, ::recvS7F31R);

// receive method 
void recvS7F31R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:4 PPID MDLN SOFTREV {L:c {L:2 CCODE {L:p PPARM}}}
        // variables for data items and parsing
        string PPID;  	// A:80 (varies)  process program ID
        string MDLN;  	// A:20 (always)  equipment model type
        string SOFTREV;  	// A:20 (always)  software revision
        string CCODE;  	// A:n (varies)  process operation command code
        string PPARM;  	// A:n (varies)  process parameter, any scalar or vector
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 5 || list0[0] != "L:4") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { PPID = list1[1];} else { PPID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { MDLN = list1[1];} else { MDLN = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { SOFTREV = list1[1];} else { SOFTREV = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t c=1; c < list1.size(); c++) {
            vector<string> list2;
            sp->listSplit(list1[c], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { CCODE = list3[1];} else { CCODE = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if ( list3.size() < 1) { ok=false; break; }
            for(size_t p=1; p < list3.size(); p++) {
                vector<string> list4;
                sp->listSplit(list3[p], list4);
                if (list4.size() < 1) { ok = false; break; }
                if ( list4.size() == 2) { PPARM = list4[1];} else { PPARM = ""; }
                }
            if (!ok) break;
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(7, 32, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S7F31R

S7F32Verification Request Acknowledge Sent by Equipment Only

using namespace std;

    // S7F32 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(7, 31, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect ACKC7
        // variables for data items and parsing
        int ACKC7;  	// B:1 (always)  S7 acknowledge code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        ACKC7 = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S7F33RProcess Program Available Request Sent by Host and Equipment

using namespace std;

    // S7F33R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 7, 33, ::recvS7F33R);

// receive method 
void recvS7F33R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect PPID
        // variables for data items and parsing
        string PPID;  	// A:80 (varies)  process program ID
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0.size() == 2) { PPID = list0[1];} else { PPID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(7, 34, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S7F33R

S7F34Process Program Availability Data Sent by Host and Equipment

using namespace std;

    // S7F34 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(7, 33, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:3 PPID UNFLEN FRMLEN
        // variables for data items and parsing
        string PPID;  	// A:80 (varies)  process program ID
        string UNFLEN;  	// U4:1 (varies)  unformatted process program length if available, else 0
        string FRMLEN;  	// U4:1 (varies)  formatted process program length if available, else 0
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { PPID = list1[1];} else { PPID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { UNFLEN = list1[1];} else { UNFLEN = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { FRMLEN = list1[1];} else { FRMLEN = ""; }
        return;  // parsed ok
        } // end while(ok)

S7F35RProcess Program for MID Request Sent by Host and Equipment

using namespace std;

    // S7F35R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 7, 35, ::recvS7F35R);

// receive method 
void recvS7F35R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect MID
        // variables for data items and parsing
        string MID;  	// A:16 (varies)  material ID, E40 restricts to A:n
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0.size() == 2) { MID = list0[1];} else { MID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(7, 36, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S7F35R

S7F36Process Program for MID Data Sent by Host and Equipment

using namespace std;

    // S7F36 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(7, 35, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:3 MID PPID PPBODY
        // variables for data items and parsing
        string MID;  	// A:16 (varies)  material ID, E40 restricts to A:n
        string PPID;  	// A:80 (varies)  process program ID
        int [] PPBODY;  	// B:n (varies)  process program data, any non-list type
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { MID = list1[1];} else { MID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { PPID = list1[1];} else { PPID = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        vector<int> PPBODY;
        for(size_t i=0; i < PPBODY.size(); i++) {
            PPBODY.push_back(sp->binToInt(list1[1+i].c_str()));
            }
        return;  // parsed ok
        } // end while(ok)

S7F37RLarge PP Send Sent by Host and Equipment

using namespace std;

    // S7F37R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 7, 37, ::recvS7F37R);

// receive method 
void recvS7F37R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect DSNAME
        // variables for data items and parsing
        string DSNAME;  	// A:50 (varies)  the name of a dataset such as a PPID
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0.size() == 2) { DSNAME = list0[1];} else { DSNAME = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(7, 38, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S7F37R

S7F38Large PP Send Ack Sent by Host and Equipment

using namespace std;

    // S7F38 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(7, 37, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect ACKC7
        // variables for data items and parsing
        int ACKC7;  	// B:1 (always)  S7 acknowledge code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        ACKC7 = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S7F39RLarge Formatted PP Send Sent by Host and Equipment

using namespace std;

    // S7F39R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 7, 39, ::recvS7F39R);

// receive method 
void recvS7F39R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect DSNAME
        // variables for data items and parsing
        string DSNAME;  	// A:50 (varies)  the name of a dataset such as a PPID
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0.size() == 2) { DSNAME = list0[1];} else { DSNAME = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(7, 40, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S7F39R

S7F40Large Formatted PP Ack Sent by Host and Equipment

using namespace std;

    // S7F40 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(7, 39, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect ACKC7
        // variables for data items and parsing
        int ACKC7;  	// B:1 (always)  S7 acknowledge code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        ACKC7 = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S7F41RLarge PP Req Sent by Host and Equipment

using namespace std;

    // S7F41R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 7, 41, ::recvS7F41R);

// receive method 
void recvS7F41R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect DSNAME
        // variables for data items and parsing
        string DSNAME;  	// A:50 (varies)  the name of a dataset such as a PPID
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0.size() == 2) { DSNAME = list0[1];} else { DSNAME = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(7, 42, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S7F41R

S7F42Large PP Req Ack Sent by Host and Equipment

using namespace std;

    // S7F42 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(7, 41, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect ACKC7
        // variables for data items and parsing
        int ACKC7;  	// B:1 (always)  S7 acknowledge code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        ACKC7 = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S7F43RLarge Formatted PP Req Sent by Host and Equipment

using namespace std;

    // S7F43R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 7, 43, ::recvS7F43R);

// receive method 
void recvS7F43R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect DSNAME
        // variables for data items and parsing
        string DSNAME;  	// A:50 (varies)  the name of a dataset such as a PPID
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0.size() == 2) { DSNAME = list0[1];} else { DSNAME = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(7, 44, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S7F43R

S7F44Large Formatted PP Req Ack Sent by Host and Equipment

using namespace std;

    // S7F44 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(7, 43, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect ACKC7
        // variables for data items and parsing
        int ACKC7;  	// B:1 (always)  S7 acknowledge code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        ACKC7 = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S8F1RBoot Program Request Sent by Host and Equipment

using namespace std;

    // S8F1R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 8, 1, ::recvS8F1R);

// receive method 
void recvS8F1R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // no data expected
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(8, 2, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S8F1R

S8F2Boot Program Data Sent by Host and Equipment

using namespace std;

    // S8F2 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(8, 1, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect BPD
        // variables for data items and parsing
        int [] BPD;  	// B:n (always)  boot program data,  the fantasy of using SECS for boot programs has been revived
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0].find("B:") != 0 ) { ok = false; break; }
        vector<int> BPD;
        for(size_t i=0; i < BPD.size(); i++) {
            BPD.push_back(sp->binToInt(list0[1+i].c_str()));
            }
        return;  // parsed ok
        } // end while(ok)

S8F3RExecutive Program Request Sent by Host and Equipment

using namespace std;

    // S8F3R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 8, 3, ::recvS8F3R);

// receive method 
void recvS8F3R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // no data expected
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(8, 4, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S8F3R

S8F4Executive Program Data Sent by Host and Equipment

using namespace std;

    // S8F4 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(8, 3, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect EPD
        // variables for data items and parsing
        int [] EPD;  	// B:n (always)  executive program data, the fantasy of using SECS for this has been revived
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0].find("B:") != 0 ) { ok = false; break; }
        vector<int> EPD;
        for(size_t i=0; i < EPD.size(); i++) {
            EPD.push_back(sp->binToInt(list0[1+i].c_str()));
            }
        return;  // parsed ok
        } // end while(ok)

S9F1Unknown Device ID Sent by Equipment Only

using namespace std;

    // S9F1 C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 9, 1, ::recvS9F1);

// receive method 
void recvS9F1(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect MHEAD
        // variables for data items and parsing
        int [] MHEAD;  	// B:10 (always)  message header of received block
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0].find("B:") != 0 ) { ok = false; break; }
        vector<int> MHEAD;
        for(size_t i=0; i < MHEAD.size(); i++) {
            MHEAD.push_back(sp->binToInt(list0[1+i].c_str()));
            }
        } // end while(ok)
    } // end recv_S9F1

S9F3Unknown Stream Sent by Equipment Only

using namespace std;

    // S9F3 C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 9, 3, ::recvS9F3);

// receive method 
void recvS9F3(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect MHEAD
        // variables for data items and parsing
        int [] MHEAD;  	// B:10 (always)  message header of received block
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0].find("B:") != 0 ) { ok = false; break; }
        vector<int> MHEAD;
        for(size_t i=0; i < MHEAD.size(); i++) {
            MHEAD.push_back(sp->binToInt(list0[1+i].c_str()));
            }
        } // end while(ok)
    } // end recv_S9F3

S9F5Unknown Function Sent by Equipment Only

using namespace std;

    // S9F5 C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 9, 5, ::recvS9F5);

// receive method 
void recvS9F5(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect MHEAD
        // variables for data items and parsing
        int [] MHEAD;  	// B:10 (always)  message header of received block
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0].find("B:") != 0 ) { ok = false; break; }
        vector<int> MHEAD;
        for(size_t i=0; i < MHEAD.size(); i++) {
            MHEAD.push_back(sp->binToInt(list0[1+i].c_str()));
            }
        } // end while(ok)
    } // end recv_S9F5

S9F7Illegal Data Sent by Equipment Only

using namespace std;

    // S9F7 C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 9, 7, ::recvS9F7);

// receive method 
void recvS9F7(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect MHEAD
        // variables for data items and parsing
        int [] MHEAD;  	// B:10 (always)  message header of received block
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0].find("B:") != 0 ) { ok = false; break; }
        vector<int> MHEAD;
        for(size_t i=0; i < MHEAD.size(); i++) {
            MHEAD.push_back(sp->binToInt(list0[1+i].c_str()));
            }
        } // end while(ok)
    } // end recv_S9F7

S9F9Transaction Timeout Sent by Equipment Only

using namespace std;

    // S9F9 C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 9, 9, ::recvS9F9);

// receive method 
void recvS9F9(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect SHEAD
        // variables for data items and parsing
        int [] SHEAD;  	// B:10 (always)  message header of sent block
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0].find("B:") != 0 ) { ok = false; break; }
        vector<int> SHEAD;
        for(size_t i=0; i < SHEAD.size(); i++) {
            SHEAD.push_back(sp->binToInt(list0[1+i].c_str()));
            }
        } // end while(ok)
    } // end recv_S9F9

S9F11Data Too Long Sent by Equipment Only

using namespace std;

    // S9F11 C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 9, 11, ::recvS9F11);

// receive method 
void recvS9F11(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect MHEAD
        // variables for data items and parsing
        int [] MHEAD;  	// B:10 (always)  message header of received block
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0].find("B:") != 0 ) { ok = false; break; }
        vector<int> MHEAD;
        for(size_t i=0; i < MHEAD.size(); i++) {
            MHEAD.push_back(sp->binToInt(list0[1+i].c_str()));
            }
        } // end while(ok)
    } // end recv_S9F11

S9F13Conversation Timeout Sent by Equipment Only

using namespace std;

    // S9F13 C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 9, 13, ::recvS9F13);

// receive method 
void recvS9F13(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 MEXP EDID
        // variables for data items and parsing
        string MEXP;  	// A:6 (always)  message expected in form of SxxFyy
        string EDID;  	// A:80 (varies)  expected data identification, PPID or SPID or PTN
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { MEXP = list1[1];} else { MEXP = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { EDID = list1[1];} else { EDID = ""; }
        } // end while(ok)
    } // end recv_S9F13

S10F1[R]Terminal Request Sent by Equipment Only

using namespace std;

    // S10F1 C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 10, 1, ::recvS10F1);

// receive method 
void recvS10F1(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 TID TEXT
        // variables for data items and parsing
        int TID;  	// B:1 (always)  terminal ID
        string TEXT;  	// A:120 (varies)  line of text for display, no standard max size
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        TID = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { TEXT = list1[1];} else { TEXT = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(10, 2, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S10F1

S10F2Terminal Request Acknowledge Sent by Host Only

using namespace std;

    // S10F2 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(10, 1, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect ACKC10
        // variables for data items and parsing
        int ACKC10;  	// B:1 (always)  acknowledge code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        ACKC10 = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S10F3[R]Terminal Display, Single Sent by Host Only

using namespace std;

    // S10F3 C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 10, 3, ::recvS10F3);

// receive method 
void recvS10F3(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 TID TEXT
        // variables for data items and parsing
        int TID;  	// B:1 (always)  terminal ID
        string TEXT;  	// A:120 (varies)  line of text for display, no standard max size
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        TID = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { TEXT = list1[1];} else { TEXT = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(10, 4, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S10F3

S10F4Terminal Display, Single Acknowledge Sent by Equipment Only

using namespace std;

    // S10F4 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(10, 3, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect ACKC10
        // variables for data items and parsing
        int ACKC10;  	// B:1 (always)  acknowledge code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        ACKC10 = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S10F5[R]Terminal Display, Multi-Block Sent by Host Only

using namespace std;

    // S10F5 C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 10, 5, ::recvS10F5);

// receive method 
void recvS10F5(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 TID {L:n TEXT}
        // variables for data items and parsing
        int TID;  	// B:1 (always)  terminal ID
        string TEXT;  	// A:120 (varies)  line of text for display, no standard max size
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        TID = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { TEXT = list2[1];} else { TEXT = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(10, 6, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S10F5

S10F6Terminal Display, Multi-Block Acknowledge Sent by Equipment Only

using namespace std;

    // S10F6 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(10, 5, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect ACKC10
        // variables for data items and parsing
        int ACKC10;  	// B:1 (always)  acknowledge code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        ACKC10 = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S10F7Multi-block Not Allowed Sent by Equipment Only

using namespace std;

    // S10F7 C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 10, 7, ::recvS10F7);

// receive method 
void recvS10F7(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect TID
        // variables for data items and parsing
        int TID;  	// B:1 (always)  terminal ID
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        TID = sp->binToInt(list0[1].c_str());
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(10, 8, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S10F7

S10F9Broadcast Sent by Host Only

using namespace std;

    // S10F9 C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 10, 9, ::recvS10F9);

// receive method 
void recvS10F9(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect TEXT
        // variables for data items and parsing
        string TEXT;  	// A:120 (varies)  line of text for display, no standard max size
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0.size() == 2) { TEXT = list0[1];} else { TEXT = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(10, 10, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S10F9

S10F10Broadcast Acknowledge Sent by Equipment Only

using namespace std;

    // S10F10 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(10, 9, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect ACKC10
        // variables for data items and parsing
        int ACKC10;  	// B:1 (always)  acknowledge code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        ACKC10 = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S12F1RMap Setup Data Send Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S12F1R C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 12, 1, ::recvS12F1R);

// receive method 
void recvS12F1R(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:15 MID IDTYP FNLOC FFROT ORLOC RPSEL {L:n REFP} DUTMS XDIES YDIES ROWCT COLCT NULBC PRDCT PRAXI
        // variables for data items and parsing
        string MID;  	// A:16 (varies)  material ID, E40 restricts to A:n
        int IDTYP;  	// B:1 (always)  ID type
        unsigned long FNLOC;  	// U2:1 (always)  flat/notch location in degrees clockwise from bottom
        unsigned long FFROT;  	// U2:1 (always)  film frame location in degrees clockwise from bottom
        int ORLOC;  	// B:1 (always)  origin location
        unsigned long RPSEL;  	// U1:1 (always)  reference point select 
        int [] REFP;  	// I4:2 (varies)  x y reference point
        string DUTMS;  	// A:n (always)  die units of measure (per E5 Section 12)
        string XDIES;  	// F4:1 (varies)  X-axis die size
        string YDIES;  	// F4:1 (varies)  Y-axis die size
        string ROWCT;  	// U4:1 (varies)  row count in die increments
        string COLCT;  	// U4:1 (varies)  column count in die increments
        string NULBC;  	// A:n (varies)  null bin code value
        string PRDCT;  	// U4:1 (varies)  process die count
        int PRAXI;  	// B:1 (always)  process access
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 16 || list0[0] != "L:15") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { MID = list1[1];} else { MID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        IDTYP = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U2:1" ) { ok = false; break; }
        FNLOC = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U2:1" ) { ok = false; break; }
        FFROT = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[5], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        ORLOC = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[6], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        RPSEL = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[7], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if (list2.size() < 1) { ok = false; break; }
            vector<int> REFP;
            for(size_t i=0; i < REFP.size(); i++) {
                REFP.push_back(atoi(list2[1+i].c_str()));
                }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[8], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { DUTMS = list1[1];} else { DUTMS = ""; }
        list1.clear();
        sp->listSplit(list0[9], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { XDIES = list1[1];} else { XDIES = ""; }
        list1.clear();
        sp->listSplit(list0[10], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { YDIES = list1[1];} else { YDIES = ""; }
        list1.clear();
        sp->listSplit(list0[11], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { ROWCT = list1[1];} else { ROWCT = ""; }
        list1.clear();
        sp->listSplit(list0[12], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { COLCT = list1[1];} else { COLCT = ""; }
        list1.clear();
        sp->listSplit(list0[13], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { NULBC = list1[1];} else { NULBC = ""; }
        list1.clear();
        sp->listSplit(list0[14], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { PRDCT = list1[1];} else { PRDCT = ""; }
        list1.clear();
        sp->listSplit(list0[15], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        PRAXI = sp->binToInt(list1[1].c_str());
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(12, 2, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S12F1R

S12F2Map Setup Data Acknowledge Sent by Host Only

using namespace std;

    // S12F2 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(12, 1, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect SDACK
        // variables for data items and parsing
        int SDACK;  	// B:1 (always)  setup data ack, 0 ok
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        SDACK = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S12F3RMap Setup Data Request Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S12F3R C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 12, 3, ::recvS12F3R);

// receive method 
void recvS12F3R(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:9 MID IDTYP MAPFT FNLOC FFROT ORLOC PRAXI BCEQU NULBC
        // variables for data items and parsing
        string MID;  	// A:16 (varies)  material ID, E40 restricts to A:n
        int IDTYP;  	// B:1 (always)  ID type
        int MAPFT;  	// B:1 (always)  map data format type
        unsigned long FNLOC;  	// U2:1 (always)  flat/notch location in degrees clockwise from bottom
        unsigned long FFROT;  	// U2:1 (always)  film frame location in degrees clockwise from bottom
        int ORLOC;  	// B:1 (always)  origin location
        int PRAXI;  	// B:1 (always)  process access
        unsigned long [] BCEQU;  	// U1:n (varies)  array of bin code equivalents
        string NULBC;  	// A:n (varies)  null bin code value
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 10 || list0[0] != "L:9") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { MID = list1[1];} else { MID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        IDTYP = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        MAPFT = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U2:1" ) { ok = false; break; }
        FNLOC = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[5], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U2:1" ) { ok = false; break; }
        FFROT = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[6], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        ORLOC = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[7], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        PRAXI = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[8], list1);
        if (list1.size() < 1) { ok = false; break; }
        vector<unsigned long> BCEQU;
        for(size_t i=0; i < BCEQU.size(); i++) {
            BCEQU.push_back(atoul(list1[1+i].c_str()));
            }
        list1.clear();
        sp->listSplit(list0[9], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { NULBC = list1[1];} else { NULBC = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(12, 4, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S12F3R

S12F4Map Setup Data Sent by Host Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S12F4 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(12, 3, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:15 MID IDTYP FNLOC ORLOC RPSEL {L:n REFP} DUTMS XDIES YDIES ROWCT COLCT PRDCT BCEQU NULBC MLCL
        // variables for data items and parsing
        string MID;  	// A:16 (varies)  material ID, E40 restricts to A:n
        int IDTYP;  	// B:1 (always)  ID type
        unsigned long FNLOC;  	// U2:1 (always)  flat/notch location in degrees clockwise from bottom
        int ORLOC;  	// B:1 (always)  origin location
        unsigned long RPSEL;  	// U1:1 (always)  reference point select 
        int [] REFP;  	// I4:2 (varies)  x y reference point
        string DUTMS;  	// A:n (always)  die units of measure (per E5 Section 12)
        string XDIES;  	// F4:1 (varies)  X-axis die size
        string YDIES;  	// F4:1 (varies)  Y-axis die size
        string ROWCT;  	// U4:1 (varies)  row count in die increments
        string COLCT;  	// U4:1 (varies)  column count in die increments
        string PRDCT;  	// U4:1 (varies)  process die count
        unsigned long [] BCEQU;  	// U1:n (varies)  array of bin code equivalents
        string NULBC;  	// A:n (varies)  null bin code value
        string MLCL;  	// U4:1 (varies)  message length in bytes
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 16 || list0[0] != "L:15") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { MID = list1[1];} else { MID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        IDTYP = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U2:1" ) { ok = false; break; }
        FNLOC = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        ORLOC = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[5], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        RPSEL = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[6], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if (list2.size() < 1) { ok = false; break; }
            vector<int> REFP;
            for(size_t i=0; i < REFP.size(); i++) {
                REFP.push_back(atoi(list2[1+i].c_str()));
                }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[7], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { DUTMS = list1[1];} else { DUTMS = ""; }
        list1.clear();
        sp->listSplit(list0[8], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { XDIES = list1[1];} else { XDIES = ""; }
        list1.clear();
        sp->listSplit(list0[9], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { YDIES = list1[1];} else { YDIES = ""; }
        list1.clear();
        sp->listSplit(list0[10], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { ROWCT = list1[1];} else { ROWCT = ""; }
        list1.clear();
        sp->listSplit(list0[11], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { COLCT = list1[1];} else { COLCT = ""; }
        list1.clear();
        sp->listSplit(list0[12], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { PRDCT = list1[1];} else { PRDCT = ""; }
        list1.clear();
        sp->listSplit(list0[13], list1);
        if (list1.size() < 1) { ok = false; break; }
        vector<unsigned long> BCEQU;
        for(size_t i=0; i < BCEQU.size(); i++) {
            BCEQU.push_back(atoul(list1[1+i].c_str()));
            }
        list1.clear();
        sp->listSplit(list0[14], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { NULBC = list1[1];} else { NULBC = ""; }
        list1.clear();
        sp->listSplit(list0[15], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { MLCL = list1[1];} else { MLCL = ""; }
        return;  // parsed ok
        } // end while(ok)

S12F5RMap Transmit Inquire Sent by Equipment Only

using namespace std;

    // S12F5R C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 12, 5, ::recvS12F5R);

// receive method 
void recvS12F5R(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:4 MID IDTYP MAPFT MLCL
        // variables for data items and parsing
        string MID;  	// A:16 (varies)  material ID, E40 restricts to A:n
        int IDTYP;  	// B:1 (always)  ID type
        int MAPFT;  	// B:1 (always)  map data format type
        string MLCL;  	// U4:1 (varies)  message length in bytes
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 5 || list0[0] != "L:4") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { MID = list1[1];} else { MID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        IDTYP = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        MAPFT = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { MLCL = list1[1];} else { MLCL = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(12, 6, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S12F5R

S12F6Map Transmit Grant Sent by Host Only

using namespace std;

    // S12F6 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(12, 5, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect GRNT1
        // variables for data items and parsing
        int GRNT1;  	// B:1 (always)  grant code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        GRNT1 = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S12F7RMap Data Send Type 1 Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S12F7R C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 12, 7, ::recvS12F7R);

// receive method 
void recvS12F7R(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:3 MID IDTYP {L:n {L:2 RSINF BINLT}}
        // variables for data items and parsing
        string MID;  	// A:16 (varies)  material ID, E40 restricts to A:n
        int IDTYP;  	// B:1 (always)  ID type
        int [] RSINF;  	// I4:3 (varies)  starting location for row or column, x,y,direction triplet
        unsigned long [] BINLT;  	// U1:n (varies)  array of bin values, text or U1 array
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { MID = list1[1];} else { MID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        IDTYP = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            vector<int> RSINF;
            for(size_t i=0; i < RSINF.size(); i++) {
                RSINF.push_back(atoi(list3[1+i].c_str()));
                }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            vector<unsigned long> BINLT;
            for(size_t i=0; i < BINLT.size(); i++) {
                BINLT.push_back(atoul(list3[1+i].c_str()));
                }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(12, 8, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S12F7R

S12F8Map Data Ack Type 1 Sent by Host Only

using namespace std;

    // S12F8 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(12, 7, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect MDACK
        // variables for data items and parsing
        int MDACK;  	// B:1 (always)  map data ack
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        MDACK = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S12F9RMap Data Send Type 2 Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S12F9R C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 12, 9, ::recvS12F9R);

// receive method 
void recvS12F9R(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:4 MID IDTYP STRP BINLT
        // variables for data items and parsing
        string MID;  	// A:16 (varies)  material ID, E40 restricts to A:n
        int IDTYP;  	// B:1 (always)  ID type
        int [] STRP;  	// I2:2 (varies)  x y die coordinate starting position
        unsigned long [] BINLT;  	// U1:n (varies)  array of bin values, text or U1 array
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 5 || list0[0] != "L:4") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { MID = list1[1];} else { MID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        IDTYP = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        vector<int> STRP;
        for(size_t i=0; i < STRP.size(); i++) {
            STRP.push_back(atoi(list1[1+i].c_str()));
            }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        vector<unsigned long> BINLT;
        for(size_t i=0; i < BINLT.size(); i++) {
            BINLT.push_back(atoul(list1[1+i].c_str()));
            }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(12, 10, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S12F9R

S12F10Map Data Ack Type 2 Sent by Host Only

using namespace std;

    // S12F10 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(12, 9, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect MDACK
        // variables for data items and parsing
        int MDACK;  	// B:1 (always)  map data ack
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        MDACK = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S12F11RMap Data Send Type 3 Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S12F11R C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 12, 11, ::recvS12F11R);

// receive method 
void recvS12F11R(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:3 MID IDTYP {L:n {L:2 XYPOS BINLT}}
        // variables for data items and parsing
        string MID;  	// A:16 (varies)  material ID, E40 restricts to A:n
        int IDTYP;  	// B:1 (always)  ID type
        int [] XYPOS;  	// I2:2 (varies)  x y coordinate position
        unsigned long [] BINLT;  	// U1:n (varies)  array of bin values, text or U1 array
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { MID = list1[1];} else { MID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        IDTYP = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            vector<int> XYPOS;
            for(size_t i=0; i < XYPOS.size(); i++) {
                XYPOS.push_back(atoi(list3[1+i].c_str()));
                }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            vector<unsigned long> BINLT;
            for(size_t i=0; i < BINLT.size(); i++) {
                BINLT.push_back(atoul(list3[1+i].c_str()));
                }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(12, 12, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S12F11R

S12F12Map Data Ack Type 3 Sent by Host Only

using namespace std;

    // S12F12 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(12, 11, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect MDACK
        // variables for data items and parsing
        int MDACK;  	// B:1 (always)  map data ack
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        MDACK = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S12F13RMap Data Request Type 1 Sent by Equipment Only

using namespace std;

    // S12F13R C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 12, 13, ::recvS12F13R);

// receive method 
void recvS12F13R(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 MID IDTYP
        // variables for data items and parsing
        string MID;  	// A:16 (varies)  material ID, E40 restricts to A:n
        int IDTYP;  	// B:1 (always)  ID type
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { MID = list1[1];} else { MID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        IDTYP = sp->binToInt(list1[1].c_str());
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(12, 14, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S12F13R

S12F14Map Data Type 1 Sent by Host Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S12F14 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(12, 13, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:3 MID IDTYP {L:n {L:2 RSINF BINLT}}
        // variables for data items and parsing
        string MID;  	// A:16 (varies)  material ID, E40 restricts to A:n
        int IDTYP;  	// B:1 (always)  ID type
        int [] RSINF;  	// I4:3 (varies)  starting location for row or column, x,y,direction triplet
        unsigned long [] BINLT;  	// U1:n (varies)  array of bin values, text or U1 array
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { MID = list1[1];} else { MID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        IDTYP = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            vector<int> RSINF;
            for(size_t i=0; i < RSINF.size(); i++) {
                RSINF.push_back(atoi(list3[1+i].c_str()));
                }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            vector<unsigned long> BINLT;
            for(size_t i=0; i < BINLT.size(); i++) {
                BINLT.push_back(atoul(list3[1+i].c_str()));
                }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S12F15RMap Data Request Type 2 Sent by Equipment Only

using namespace std;

    // S12F15R C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 12, 15, ::recvS12F15R);

// receive method 
void recvS12F15R(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 MID IDTYP
        // variables for data items and parsing
        string MID;  	// A:16 (varies)  material ID, E40 restricts to A:n
        int IDTYP;  	// B:1 (always)  ID type
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { MID = list1[1];} else { MID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        IDTYP = sp->binToInt(list1[1].c_str());
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(12, 16, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S12F15R

S12F16Map Data Type 2 Sent by Host Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S12F16 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(12, 15, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:4 MID IDTYP STRP BINLT
        // variables for data items and parsing
        string MID;  	// A:16 (varies)  material ID, E40 restricts to A:n
        int IDTYP;  	// B:1 (always)  ID type
        int [] STRP;  	// I2:2 (varies)  x y die coordinate starting position
        unsigned long [] BINLT;  	// U1:n (varies)  array of bin values, text or U1 array
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 5 || list0[0] != "L:4") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { MID = list1[1];} else { MID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        IDTYP = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        vector<int> STRP;
        for(size_t i=0; i < STRP.size(); i++) {
            STRP.push_back(atoi(list1[1+i].c_str()));
            }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        vector<unsigned long> BINLT;
        for(size_t i=0; i < BINLT.size(); i++) {
            BINLT.push_back(atoul(list1[1+i].c_str()));
            }
        return;  // parsed ok
        } // end while(ok)

S12F17RMap Data Request Type 3 Sent by Equipment Only

using namespace std;

    // S12F17R C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 12, 17, ::recvS12F17R);

// receive method 
void recvS12F17R(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:3 MID IDTYP SDBIN
        // variables for data items and parsing
        string MID;  	// A:16 (varies)  material ID, E40 restricts to A:n
        int IDTYP;  	// B:1 (always)  ID type
        int SDBIN;  	// B:1 (always)  send bin data flag, 0=send, else do not
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { MID = list1[1];} else { MID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        IDTYP = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        SDBIN = sp->binToInt(list1[1].c_str());
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(12, 18, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S12F17R

S12F18Map Data Type 3 Sent by Host Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S12F18 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(12, 17, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:3 MID IDTYP {L:n {L:2 XYPOS BINLT}}
        // variables for data items and parsing
        string MID;  	// A:16 (varies)  material ID, E40 restricts to A:n
        int IDTYP;  	// B:1 (always)  ID type
        int [] XYPOS;  	// I2:2 (varies)  x y coordinate position
        unsigned long [] BINLT;  	// U1:n (varies)  array of bin values, text or U1 array
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { MID = list1[1];} else { MID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        IDTYP = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            vector<int> XYPOS;
            for(size_t i=0; i < XYPOS.size(); i++) {
                XYPOS.push_back(atoi(list3[1+i].c_str()));
                }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            vector<unsigned long> BINLT;
            for(size_t i=0; i < BINLT.size(); i++) {
                BINLT.push_back(atoul(list3[1+i].c_str()));
                }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S12F19Map Error Report Send Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S12F19 C++ Receive message - add next line to setup
    sp->messageTypeAdd( 12, 19, ::recvS12F19);

// receive method 
void recvS12F19(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 MAPER DATLC
        // variables for data items and parsing
        int MAPER;  	// B:1 (always)  map error
        unsigned long DATLC;  	// U1:1 (always)  location of invalid data, offset in bytes in the SECS-II message body
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        MAPER = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        DATLC = atoul(list1[1].c_str());
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(12, 20, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S12F19

S13F1RSend Data Set Send Sent by Host and Equipment

using namespace std;

    // S13F1R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 13, 1, ::recvS13F1R);

// receive method 
void recvS13F1R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:1 DSNAME
        // variables for data items and parsing
        string DSNAME;  	// A:50 (varies)  the name of a dataset such as a PPID
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 2 || list0[0] != "L:1") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DSNAME = list1[1];} else { DSNAME = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(13, 2, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S13F1R

S13F2Send Data Set Ack Sent by Host and Equipment

using namespace std;

    // S13F2 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(13, 1, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 DSNAME ACKC13
        // variables for data items and parsing
        string DSNAME;  	// A:50 (varies)  the name of a dataset such as a PPID
        int ACKC13;  	// B:1 (always)  acknowledge code, 0 ok
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DSNAME = list1[1];} else { DSNAME = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        ACKC13 = sp->binToInt(list1[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S13F3ROpen Data Set Request Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S13F3R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 13, 3, ::recvS13F3R);

// receive method 
void recvS13F3R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:3 HANDLE DSNAME CKPNT
        // variables for data items and parsing
        unsigned long [] HANDLE;  	// U4 (varies)  logical unit or handle for a data set
        string DSNAME;  	// A:50 (varies)  the name of a dataset such as a PPID
        unsigned long CKPNT;  	// U4:1 (always)  data set checkpoint defined by sender
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        vector<unsigned long> HANDLE;
        for(size_t i=0; i < HANDLE.size(); i++) {
            HANDLE.push_back(atoul(list1[1+i].c_str()));
            }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DSNAME = list1[1];} else { DSNAME = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U4:1" ) { ok = false; break; }
        CKPNT = atoul(list1[1].c_str());
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(13, 4, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S13F3R

S13F4Open Data Set Data Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S13F4 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(13, 3, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:5 HANDLE DSNAME ACKC13 RTYPE RECLEN
        // variables for data items and parsing
        unsigned long [] HANDLE;  	// U4 (varies)  logical unit or handle for a data set
        string DSNAME;  	// A:50 (varies)  the name of a dataset such as a PPID
        int ACKC13;  	// B:1 (always)  acknowledge code, 0 ok
        string RTYPE;  	// U1:1 (varies)  type of data record
        string RECLEN;  	// U4:1 (varies)  maximum number of bytes or characters in a discrete record
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 6 || list0[0] != "L:5") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        vector<unsigned long> HANDLE;
        for(size_t i=0; i < HANDLE.size(); i++) {
            HANDLE.push_back(atoul(list1[1+i].c_str()));
            }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DSNAME = list1[1];} else { DSNAME = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        ACKC13 = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { RTYPE = list1[1];} else { RTYPE = ""; }
        list1.clear();
        sp->listSplit(list0[5], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { RECLEN = list1[1];} else { RECLEN = ""; }
        return;  // parsed ok
        } // end while(ok)

S13F5RRead Data Set Request Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S13F5R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 13, 5, ::recvS13F5R);

// receive method 
void recvS13F5R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 HANDLE READLN
        // variables for data items and parsing
        unsigned long [] HANDLE;  	// U4 (varies)  logical unit or handle for a data set
        string READLN;  	// U4:1 (varies)  maximum number of bytes or characters to read
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        vector<unsigned long> HANDLE;
        for(size_t i=0; i < HANDLE.size(); i++) {
            HANDLE.push_back(atoul(list1[1+i].c_str()));
            }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { READLN = list1[1];} else { READLN = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(13, 6, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S13F5R

S13F6Read Data Set Data Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S13F6 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(13, 5, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:4 HANDLE ACKC13 CKPNT {L:n FILDAT}
        // variables for data items and parsing
        unsigned long [] HANDLE;  	// U4 (varies)  logical unit or handle for a data set
        int ACKC13;  	// B:1 (always)  acknowledge code, 0 ok
        unsigned long CKPNT;  	// U4:1 (always)  data set checkpoint defined by sender
        int [] FILDAT;  	// B (varies)  Data Set Data, binary or ascii.  Max length is the RECLEN from open.
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 5 || list0[0] != "L:4") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        vector<unsigned long> HANDLE;
        for(size_t i=0; i < HANDLE.size(); i++) {
            HANDLE.push_back(atoul(list1[1+i].c_str()));
            }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        ACKC13 = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U4:1" ) { ok = false; break; }
        CKPNT = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[4], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if (list2.size() < 1) { ok = false; break; }
            vector<int> FILDAT;
            for(size_t i=0; i < FILDAT.size(); i++) {
                FILDAT.push_back(sp->binToInt(list2[1+i].c_str()));
                }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S13F7RClose Data Set Send Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S13F7R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 13, 7, ::recvS13F7R);

// receive method 
void recvS13F7R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:1 HANDLE
        // variables for data items and parsing
        unsigned long [] HANDLE;  	// U4 (varies)  logical unit or handle for a data set
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 2 || list0[0] != "L:1") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        vector<unsigned long> HANDLE;
        for(size_t i=0; i < HANDLE.size(); i++) {
            HANDLE.push_back(atoul(list1[1+i].c_str()));
            }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(13, 8, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S13F7R

S13F8Close Data Set Ack Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S13F8 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(13, 7, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 HANDLE ACKC13
        // variables for data items and parsing
        unsigned long [] HANDLE;  	// U4 (varies)  logical unit or handle for a data set
        int ACKC13;  	// B:1 (always)  acknowledge code, 0 ok
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        vector<unsigned long> HANDLE;
        for(size_t i=0; i < HANDLE.size(); i++) {
            HANDLE.push_back(atoul(list1[1+i].c_str()));
            }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        ACKC13 = sp->binToInt(list1[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S13F9RReset Data Set Send Sent by Host and Equipment

using namespace std;

    // S13F9R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 13, 9, ::recvS13F9R);

// receive method 
void recvS13F9R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // no data expected
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(13, 10, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S13F9R

S13F10Reset Data Set Ack Sent by Host and Equipment

using namespace std;

    // S13F10 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(13, 9, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // no data expected
        return;  // parsed ok
        } // end while(ok)

S13F11RData Set Obj Multi-Block Inquire Sent by Host and Equipment

using namespace std;

    // S13F11R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 13, 11, ::recvS13F11R);

// receive method 
void recvS13F11R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:3 DATAID OBJSPEC DATALENGTH
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string OBJSPEC;  	// A:n (varies)  E39 structured text identifying an object, [object type:object id>]+
        string DATALENGTH;  	// U4:1 (varies)  total bytes of the message body 
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJSPEC = list1[1];} else { OBJSPEC = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATALENGTH = list1[1];} else { DATALENGTH = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(13, 12, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S13F11R

S13F12Data Set Obj Multi-Block Grant Sent by Host and Equipment

using namespace std;

    // S13F12 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(13, 11, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect GRANT
        // variables for data items and parsing
        int GRANT;  	// B:1 (always)  multiblock grant code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        GRANT = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S13F13RTable Data Send Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S13F13R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 13, 13, ::recvS13F13R);

// receive method 
void recvS13F13R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:8 DATAID OBJSPEC TBLTYP TBLID TBLCMD {L:n {L:2 ATTRID ATTRDATA}} {L:c COLHDR} {L:r {L:m TBLELT}}
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string OBJSPEC;  	// A:n (varies)  E39 structured text identifying an object, [object type:object id>]+
        string TBLTYP;  	// A:n (always)  denotes the format and application of the table, conforms to OBJTYPE
        string TBLID;  	// A:80 (varies)  table identifier, a kind of OBJSPEC
        unsigned long TBLCMD;  	// U1:1 (always)  table command
        string ATTRID;  	// A:40 (varies)  identifies an attribute type, chars 0x20-0x7e but not >, :, ?, *, or ~.  Does not begin or end with space.
        string ATTRDATA;  	// A:n (varies)  a specific attribute value of any data type
        string COLHDR;  	// A:20 (always)  table column name
        string TBLELT;  	// A:n (varies)  table element any type, list types or array types are discouraged, first column type must be a primary key value and not be a list or array
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 9 || list0[0] != "L:8") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJSPEC = list1[1];} else { OBJSPEC = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { TBLTYP = list1[1];} else { TBLTYP = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { TBLID = list1[1];} else { TBLID = ""; }
        list1.clear();
        sp->listSplit(list0[5], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        TBLCMD = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[6], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ATTRID = list3[1];} else { ATTRID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ATTRDATA = list3[1];} else { ATTRDATA = ""; }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[7], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t c=1; c < list1.size(); c++) {
            vector<string> list2;
            sp->listSplit(list1[c], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { COLHDR = list2[1];} else { COLHDR = ""; }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[8], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t r=1; r < list1.size(); r++) {
            vector<string> list2;
            sp->listSplit(list1[r], list2);
            if ( list2.size() < 1) { ok=false; break; }
            for(size_t m=1; m < list2.size(); m++) {
                vector<string> list3;
                sp->listSplit(list2[m], list3);
                if (list3.size() < 1) { ok = false; break; }
                if ( list3.size() == 2) { TBLELT = list3[1];} else { TBLELT = ""; }
                }
            if (!ok) break;
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(13, 14, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S13F13R

S13F14Table Data Ack Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S13F14 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(13, 13, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 TBLACK {L:p {L:2 ERRCODE ERRTEXT}}
        // variables for data items and parsing
        unsigned long TBLACK;  	// U1:1 (always)  acknowledge code
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        TBLACK = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t p=1; p < list1.size(); p++) {
            vector<string> list2;
            sp->listSplit(list1[p], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ERRCODE = list3[1];} else { ERRCODE = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { ERRTEXT = list3[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S13F15RTable Data Request Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S13F15R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 13, 15, ::recvS13F15R);

// receive method 
void recvS13F15R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:7 DATAID OBJSPEC TBLTYP TBLID TBLCMD {L:p COLHDR} {L:q TBLELT}
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string OBJSPEC;  	// A:n (varies)  E39 structured text identifying an object, [object type:object id>]+
        string TBLTYP;  	// A:n (always)  denotes the format and application of the table, conforms to OBJTYPE
        string TBLID;  	// A:80 (varies)  table identifier, a kind of OBJSPEC
        unsigned long TBLCMD;  	// U1:1 (always)  table command
        string COLHDR;  	// A:20 (always)  table column name
        string TBLELT;  	// A:n (varies)  table element any type, list types or array types are discouraged, first column type must be a primary key value and not be a list or array
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 8 || list0[0] != "L:7") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJSPEC = list1[1];} else { OBJSPEC = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { TBLTYP = list1[1];} else { TBLTYP = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { TBLID = list1[1];} else { TBLID = ""; }
        list1.clear();
        sp->listSplit(list0[5], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        TBLCMD = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[6], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t p=1; p < list1.size(); p++) {
            vector<string> list2;
            sp->listSplit(list1[p], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { COLHDR = list2[1];} else { COLHDR = ""; }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[7], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t q=1; q < list1.size(); q++) {
            vector<string> list2;
            sp->listSplit(list1[q], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { TBLELT = list2[1];} else { TBLELT = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(13, 16, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S13F15R

S13F16Table Data Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S13F16 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(13, 15, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:6 TBLTYP TBLID {L:n {L:2 ATTRID ATTRDATA}} {L:c COLHDR} {L:r {L:c TBLELT}} {L:2 TBLACK {L:p ERRCODE ERRTEXT}}
        // variables for data items and parsing
        string TBLTYP;  	// A:n (always)  denotes the format and application of the table, conforms to OBJTYPE
        string TBLID;  	// A:80 (varies)  table identifier, a kind of OBJSPEC
        string ATTRID;  	// A:40 (varies)  identifies an attribute type, chars 0x20-0x7e but not >, :, ?, *, or ~.  Does not begin or end with space.
        string ATTRDATA;  	// A:n (varies)  a specific attribute value of any data type
        string COLHDR;  	// A:20 (always)  table column name
        string TBLELT;  	// A:n (varies)  table element any type, list types or array types are discouraged, first column type must be a primary key value and not be a list or array
        unsigned long TBLACK;  	// U1:1 (always)  acknowledge code
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 7 || list0[0] != "L:6") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { TBLTYP = list1[1];} else { TBLTYP = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { TBLID = list1[1];} else { TBLID = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ATTRID = list3[1];} else { ATTRID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ATTRDATA = list3[1];} else { ATTRDATA = ""; }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[4], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t c=1; c < list1.size(); c++) {
            vector<string> list2;
            sp->listSplit(list1[c], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { COLHDR = list2[1];} else { COLHDR = ""; }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[5], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t r=1; r < list1.size(); r++) {
            vector<string> list2;
            sp->listSplit(list1[r], list2);
            if ( list2.size() < 1) { ok=false; break; }
            for(size_t c=1; c < list2.size(); c++) {
                vector<string> list3;
                sp->listSplit(list2[c], list3);
                if (list3.size() < 1) { ok = false; break; }
                if ( list3.size() == 2) { TBLELT = list3[1];} else { TBLELT = ""; }
                }
            if (!ok) break;
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[6], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "U1:1" ) { ok = false; break; }
        TBLACK = atoul(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if ( list2.size() < 1) { ok=false; break; }
        for(size_t p=1; p < list2.size(); p++) {
            vector<string> list3;
            sp->listSplit(list2[p], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ERRCODE = list3[1];} else { ERRCODE = ""; }
            list3.clear();
            sp->listSplit(list2[p], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { ERRTEXT = list3[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S14F1RGet Attributes Request Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S14F1R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 14, 1, ::recvS14F1R);

// receive method 
void recvS14F1R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:5 OBJSPEC OBJTYPE {L:i OBJID} {L:q {L:3 ATTRID ATTRDATA ATTRRELN}} {L:a ATTRID}
        // variables for data items and parsing
        string OBJSPEC;  	// A:n (varies)  E39 structured text identifying an object, [object type:object id>]+
        string OBJTYPE;  	// A:40 (varies)  object class name, chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        string OBJID;  	// A:80 (varies)  E39 object identifier 1-80 chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        string ATTRID;  	// A:40 (varies)  identifies an attribute type, chars 0x20-0x7e but not >, :, ?, *, or ~.  Does not begin or end with space.
        string ATTRDATA;  	// A:n (varies)  a specific attribute value of any data type
        unsigned long ATTRRELN;  	// U1:1 (always)  relationship of a value to an attribute value of an object
        string ATTRID;  	// A:40 (varies)  identifies an attribute type, chars 0x20-0x7e but not >, :, ?, *, or ~.  Does not begin or end with space.
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 6 || list0[0] != "L:5") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJSPEC = list1[1];} else { OBJSPEC = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJTYPE = list1[1];} else { OBJTYPE = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t i=1; i < list1.size(); i++) {
            vector<string> list2;
            sp->listSplit(list1[i], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { OBJID = list2[1];} else { OBJID = ""; }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[4], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t q=1; q < list1.size(); q++) {
            vector<string> list2;
            sp->listSplit(list1[q], list2);
            if ( list2.size() != 4 || list2[0] != "L:3") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ATTRID = list3[1];} else { ATTRID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ATTRDATA = list3[1];} else { ATTRDATA = ""; }
            list3.clear();
            sp->listSplit(list2[3], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "U1:1" ) { ok = false; break; }
            ATTRRELN = atoul(list3[1].c_str());
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[5], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t a=1; a < list1.size(); a++) {
            vector<string> list2;
            sp->listSplit(list1[a], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { ATTRID = list2[1];} else { ATTRID = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(14, 2, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S14F1R

S14F2Attribute Data Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S14F2 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(14, 1, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 {L:n {L:2 OBJID {L:a {L:2 ATTRID ATTRDATA}}}} {L:2 OBJACK {L:p {L:2 ERRCODE ERRTEXT}}}
        // variables for data items and parsing
        string OBJID;  	// A:80 (varies)  E39 object identifier 1-80 chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        string ATTRID;  	// A:40 (varies)  identifies an attribute type, chars 0x20-0x7e but not >, :, ?, *, or ~.  Does not begin or end with space.
        string ATTRDATA;  	// A:n (varies)  a specific attribute value of any data type
        unsigned long OBJACK;  	// U1:1 (always)  acknowledge code, 0 ok, 1 error
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { OBJID = list3[1];} else { OBJID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if ( list3.size() < 1) { ok=false; break; }
            for(size_t a=1; a < list3.size(); a++) {
                vector<string> list4;
                sp->listSplit(list3[a], list4);
                if ( list4.size() != 3 || list4[0] != "L:2") { ok=false; break; }
                vector<string> list5;
                sp->listSplit(list4[1], list5);
                if (list5.size() < 1) { ok = false; break; }
                if ( list5.size() == 2) { ATTRID = list5[1];} else { ATTRID = ""; }
                list5.clear();
                sp->listSplit(list4[2], list5);
                if (list5.size() < 1) { ok = false; break; }
                if ( list5.size() == 2) { ATTRDATA = list5[1];} else { ATTRDATA = ""; }
                }
            if (!ok) break;
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "U1:1" ) { ok = false; break; }
        OBJACK = atoul(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if ( list2.size() < 1) { ok=false; break; }
        for(size_t p=1; p < list2.size(); p++) {
            vector<string> list3;
            sp->listSplit(list2[p], list3);
            if ( list3.size() != 3 || list3[0] != "L:2") { ok=false; break; }
            vector<string> list4;
            sp->listSplit(list3[1], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { ERRCODE = list4[1];} else { ERRCODE = ""; }
            list4.clear();
            sp->listSplit(list3[2], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0].find("A:") != 0 ) { ok = false; break; }
            if ( list4.size() == 2) { ERRTEXT = list4[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S14F3RSet Attributes Sent by Host and Equipment

using namespace std;

    // S14F3R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 14, 3, ::recvS14F3R);

// receive method 
void recvS14F3R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:4 OBJSPEC OBJTYPE {L:i OBJID} {L:n {L:2 ATTRID ATTRDATA}}
        // variables for data items and parsing
        string OBJSPEC;  	// A:n (varies)  E39 structured text identifying an object, [object type:object id>]+
        string OBJTYPE;  	// A:40 (varies)  object class name, chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        string OBJID;  	// A:80 (varies)  E39 object identifier 1-80 chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        string ATTRID;  	// A:40 (varies)  identifies an attribute type, chars 0x20-0x7e but not >, :, ?, *, or ~.  Does not begin or end with space.
        string ATTRDATA;  	// A:n (varies)  a specific attribute value of any data type
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 5 || list0[0] != "L:4") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJSPEC = list1[1];} else { OBJSPEC = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJTYPE = list1[1];} else { OBJTYPE = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t i=1; i < list1.size(); i++) {
            vector<string> list2;
            sp->listSplit(list1[i], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { OBJID = list2[1];} else { OBJID = ""; }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[4], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ATTRID = list3[1];} else { ATTRID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ATTRDATA = list3[1];} else { ATTRDATA = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(14, 4, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S14F3R

S14F4Set Attributes Reply Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S14F4 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(14, 3, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 {L:i {L:2 OBJID {L:n {L:2 ATTRID ATTRDATA}}}} {L:2 OBJACK {L:p {L:2 ERRCODE ERRTEXT}}}
        // variables for data items and parsing
        string OBJID;  	// A:80 (varies)  E39 object identifier 1-80 chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        string ATTRID;  	// A:40 (varies)  identifies an attribute type, chars 0x20-0x7e but not >, :, ?, *, or ~.  Does not begin or end with space.
        string ATTRDATA;  	// A:n (varies)  a specific attribute value of any data type
        unsigned long OBJACK;  	// U1:1 (always)  acknowledge code, 0 ok, 1 error
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t i=1; i < list1.size(); i++) {
            vector<string> list2;
            sp->listSplit(list1[i], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { OBJID = list3[1];} else { OBJID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if ( list3.size() < 1) { ok=false; break; }
            for(size_t n=1; n < list3.size(); n++) {
                vector<string> list4;
                sp->listSplit(list3[n], list4);
                if ( list4.size() != 3 || list4[0] != "L:2") { ok=false; break; }
                vector<string> list5;
                sp->listSplit(list4[1], list5);
                if (list5.size() < 1) { ok = false; break; }
                if ( list5.size() == 2) { ATTRID = list5[1];} else { ATTRID = ""; }
                list5.clear();
                sp->listSplit(list4[2], list5);
                if (list5.size() < 1) { ok = false; break; }
                if ( list5.size() == 2) { ATTRDATA = list5[1];} else { ATTRDATA = ""; }
                }
            if (!ok) break;
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "U1:1" ) { ok = false; break; }
        OBJACK = atoul(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if ( list2.size() < 1) { ok=false; break; }
        for(size_t p=1; p < list2.size(); p++) {
            vector<string> list3;
            sp->listSplit(list2[p], list3);
            if ( list3.size() != 3 || list3[0] != "L:2") { ok=false; break; }
            vector<string> list4;
            sp->listSplit(list3[1], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { ERRCODE = list4[1];} else { ERRCODE = ""; }
            list4.clear();
            sp->listSplit(list3[2], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0].find("A:") != 0 ) { ok = false; break; }
            if ( list4.size() == 2) { ERRTEXT = list4[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S14F5RGet Type Data Sent by Host and Equipment

using namespace std;

    // S14F5R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 14, 5, ::recvS14F5R);

// receive method 
void recvS14F5R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect OBJSPEC
        // variables for data items and parsing
        string OBJSPEC;  	// A:n (varies)  E39 structured text identifying an object, [object type:object id>]+
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0.size() == 2) { OBJSPEC = list0[1];} else { OBJSPEC = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(14, 6, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S14F5R

S14F6Type Data Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S14F6 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(14, 5, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 {L:n OBJTYPE} {L:2 OBJACK {L:p {L:2 ERRCODE ERRTEXT}}}
        // variables for data items and parsing
        string OBJTYPE;  	// A:40 (varies)  object class name, chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        unsigned long OBJACK;  	// U1:1 (always)  acknowledge code, 0 ok, 1 error
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { OBJTYPE = list2[1];} else { OBJTYPE = ""; }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "U1:1" ) { ok = false; break; }
        OBJACK = atoul(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if ( list2.size() < 1) { ok=false; break; }
        for(size_t p=1; p < list2.size(); p++) {
            vector<string> list3;
            sp->listSplit(list2[p], list3);
            if ( list3.size() != 3 || list3[0] != "L:2") { ok=false; break; }
            vector<string> list4;
            sp->listSplit(list3[1], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { ERRCODE = list4[1];} else { ERRCODE = ""; }
            list4.clear();
            sp->listSplit(list3[2], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0].find("A:") != 0 ) { ok = false; break; }
            if ( list4.size() == 2) { ERRTEXT = list4[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S14F7RGet Attribute Names for the types Sent by Host and Equipment

using namespace std;

    // S14F7R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 14, 7, ::recvS14F7R);

// receive method 
void recvS14F7R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 OBJSPEC {L:n OBJTYPE}
        // variables for data items and parsing
        string OBJSPEC;  	// A:n (varies)  E39 structured text identifying an object, [object type:object id>]+
        string OBJTYPE;  	// A:40 (varies)  object class name, chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJSPEC = list1[1];} else { OBJSPEC = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { OBJTYPE = list2[1];} else { OBJTYPE = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(14, 8, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S14F7R

S14F8Attribute Names of the object types Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S14F8 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(14, 7, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 {L:n {L:2 OBJTYPE {L:a ATTRID}}} {L:2 OBJACK {L:p {L:2 ERRCODE ERRTEXT}}}
        // variables for data items and parsing
        string OBJTYPE;  	// A:40 (varies)  object class name, chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        string ATTRID;  	// A:40 (varies)  identifies an attribute type, chars 0x20-0x7e but not >, :, ?, *, or ~.  Does not begin or end with space.
        unsigned long OBJACK;  	// U1:1 (always)  acknowledge code, 0 ok, 1 error
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { OBJTYPE = list3[1];} else { OBJTYPE = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if ( list3.size() < 1) { ok=false; break; }
            for(size_t a=1; a < list3.size(); a++) {
                vector<string> list4;
                sp->listSplit(list3[a], list4);
                if (list4.size() < 1) { ok = false; break; }
                if ( list4.size() == 2) { ATTRID = list4[1];} else { ATTRID = ""; }
                }
            if (!ok) break;
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "U1:1" ) { ok = false; break; }
        OBJACK = atoul(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if ( list2.size() < 1) { ok=false; break; }
        for(size_t p=1; p < list2.size(); p++) {
            vector<string> list3;
            sp->listSplit(list2[p], list3);
            if ( list3.size() != 3 || list3[0] != "L:2") { ok=false; break; }
            vector<string> list4;
            sp->listSplit(list3[1], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { ERRCODE = list4[1];} else { ERRCODE = ""; }
            list4.clear();
            sp->listSplit(list3[2], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0].find("A:") != 0 ) { ok = false; break; }
            if ( list4.size() == 2) { ERRTEXT = list4[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S14F9RCreate Obj Request Sent by Host and Equipment

using namespace std;

    // S14F9R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 14, 9, ::recvS14F9R);

// receive method 
void recvS14F9R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:3 OBJSPEC OBJTYPE {L:a {L:2 ATTRID ATTRDATA}}
        // variables for data items and parsing
        string OBJSPEC;  	// A:n (varies)  E39 structured text identifying an object, [object type:object id>]+
        string OBJTYPE;  	// A:40 (varies)  object class name, chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        string ATTRID;  	// A:40 (varies)  identifies an attribute type, chars 0x20-0x7e but not >, :, ?, *, or ~.  Does not begin or end with space.
        string ATTRDATA;  	// A:n (varies)  a specific attribute value of any data type
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJSPEC = list1[1];} else { OBJSPEC = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJTYPE = list1[1];} else { OBJTYPE = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t a=1; a < list1.size(); a++) {
            vector<string> list2;
            sp->listSplit(list1[a], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ATTRID = list3[1];} else { ATTRID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ATTRDATA = list3[1];} else { ATTRDATA = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(14, 10, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S14F9R

S14F10Create Obj Ack Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S14F10 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(14, 9, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:3 OBJSPEC {L:b {L:2 ATTRID ATTRDATA}} {L:2 OBJACK {L:p {L:2 ERRCODE ERRTEXT}}}
        // variables for data items and parsing
        string OBJSPEC;  	// A:n (varies)  E39 structured text identifying an object, [object type:object id>]+
        string ATTRID;  	// A:40 (varies)  identifies an attribute type, chars 0x20-0x7e but not >, :, ?, *, or ~.  Does not begin or end with space.
        string ATTRDATA;  	// A:n (varies)  a specific attribute value of any data type
        unsigned long OBJACK;  	// U1:1 (always)  acknowledge code, 0 ok, 1 error
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJSPEC = list1[1];} else { OBJSPEC = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t b=1; b < list1.size(); b++) {
            vector<string> list2;
            sp->listSplit(list1[b], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ATTRID = list3[1];} else { ATTRID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ATTRDATA = list3[1];} else { ATTRDATA = ""; }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "U1:1" ) { ok = false; break; }
        OBJACK = atoul(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if ( list2.size() < 1) { ok=false; break; }
        for(size_t p=1; p < list2.size(); p++) {
            vector<string> list3;
            sp->listSplit(list2[p], list3);
            if ( list3.size() != 3 || list3[0] != "L:2") { ok=false; break; }
            vector<string> list4;
            sp->listSplit(list3[1], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { ERRCODE = list4[1];} else { ERRCODE = ""; }
            list4.clear();
            sp->listSplit(list3[2], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0].find("A:") != 0 ) { ok = false; break; }
            if ( list4.size() == 2) { ERRTEXT = list4[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S14F11RDelete Obj Request Sent by Host and Equipment

using namespace std;

    // S14F11R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 14, 11, ::recvS14F11R);

// receive method 
void recvS14F11R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 OBJSPEC {L:a {L:2 ATTRID ATTRDATA}}
        // variables for data items and parsing
        string OBJSPEC;  	// A:n (varies)  E39 structured text identifying an object, [object type:object id>]+
        string ATTRID;  	// A:40 (varies)  identifies an attribute type, chars 0x20-0x7e but not >, :, ?, *, or ~.  Does not begin or end with space.
        string ATTRDATA;  	// A:n (varies)  a specific attribute value of any data type
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJSPEC = list1[1];} else { OBJSPEC = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t a=1; a < list1.size(); a++) {
            vector<string> list2;
            sp->listSplit(list1[a], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ATTRID = list3[1];} else { ATTRID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ATTRDATA = list3[1];} else { ATTRDATA = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(14, 12, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S14F11R

S14F12Delete Obj Ack Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S14F12 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(14, 11, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 {L:b {L:2 ATTRID ATTRDATA}} {L:2 OBJACK {L:p {L:2 ERRCODE ERRTEXT}}}
        // variables for data items and parsing
        string ATTRID;  	// A:40 (varies)  identifies an attribute type, chars 0x20-0x7e but not >, :, ?, *, or ~.  Does not begin or end with space.
        string ATTRDATA;  	// A:n (varies)  a specific attribute value of any data type
        unsigned long OBJACK;  	// U1:1 (always)  acknowledge code, 0 ok, 1 error
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t b=1; b < list1.size(); b++) {
            vector<string> list2;
            sp->listSplit(list1[b], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ATTRID = list3[1];} else { ATTRID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ATTRDATA = list3[1];} else { ATTRDATA = ""; }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "U1:1" ) { ok = false; break; }
        OBJACK = atoul(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if ( list2.size() < 1) { ok=false; break; }
        for(size_t p=1; p < list2.size(); p++) {
            vector<string> list3;
            sp->listSplit(list2[p], list3);
            if ( list3.size() != 3 || list3[0] != "L:2") { ok=false; break; }
            vector<string> list4;
            sp->listSplit(list3[1], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { ERRCODE = list4[1];} else { ERRCODE = ""; }
            list4.clear();
            sp->listSplit(list3[2], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0].find("A:") != 0 ) { ok = false; break; }
            if ( list4.size() == 2) { ERRTEXT = list4[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S14F13RObject Attach Request Sent by Host and Equipment

using namespace std;

    // S14F13R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 14, 13, ::recvS14F13R);

// receive method 
void recvS14F13R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 OBJSPEC {L:a {L:2 ATTRID ATTRDATA}}
        // variables for data items and parsing
        string OBJSPEC;  	// A:n (varies)  E39 structured text identifying an object, [object type:object id>]+
        string ATTRID;  	// A:40 (varies)  identifies an attribute type, chars 0x20-0x7e but not >, :, ?, *, or ~.  Does not begin or end with space.
        string ATTRDATA;  	// A:n (varies)  a specific attribute value of any data type
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJSPEC = list1[1];} else { OBJSPEC = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t a=1; a < list1.size(); a++) {
            vector<string> list2;
            sp->listSplit(list1[a], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ATTRID = list3[1];} else { ATTRID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ATTRDATA = list3[1];} else { ATTRDATA = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(14, 14, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S14F13R

S14F14Object Attach Ack Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S14F14 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(14, 13, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:3 OBJTOKEN {L:b {L:2 ATTRID ATTRDATA}} {L:2 OBJACK {L:p {L:2 ERRCODE ERRTEXT}}}
        // variables for data items and parsing
        unsigned long OBJTOKEN;  	// U4:1 (always)  token used for authorization
        string ATTRID;  	// A:40 (varies)  identifies an attribute type, chars 0x20-0x7e but not >, :, ?, *, or ~.  Does not begin or end with space.
        string ATTRDATA;  	// A:n (varies)  a specific attribute value of any data type
        unsigned long OBJACK;  	// U1:1 (always)  acknowledge code, 0 ok, 1 error
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U4:1" ) { ok = false; break; }
        OBJTOKEN = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t b=1; b < list1.size(); b++) {
            vector<string> list2;
            sp->listSplit(list1[b], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ATTRID = list3[1];} else { ATTRID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ATTRDATA = list3[1];} else { ATTRDATA = ""; }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "U1:1" ) { ok = false; break; }
        OBJACK = atoul(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if ( list2.size() < 1) { ok=false; break; }
        for(size_t p=1; p < list2.size(); p++) {
            vector<string> list3;
            sp->listSplit(list2[p], list3);
            if ( list3.size() != 3 || list3[0] != "L:2") { ok=false; break; }
            vector<string> list4;
            sp->listSplit(list3[1], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { ERRCODE = list4[1];} else { ERRCODE = ""; }
            list4.clear();
            sp->listSplit(list3[2], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0].find("A:") != 0 ) { ok = false; break; }
            if ( list4.size() == 2) { ERRTEXT = list4[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S14F15RAttached Obj Action Req. Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S14F15R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 14, 15, ::recvS14F15R);

// receive method 
void recvS14F15R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:4 OBJSPEC OBJCMD OBJTOKEN {L:a {L:2 ATTRID ATTRDATA}}
        // variables for data items and parsing
        string OBJSPEC;  	// A:n (varies)  E39 structured text identifying an object, [object type:object id>]+
        unsigned long OBJCMD;  	// U1:1 (always)  Specifies an action to be performed by an object
        unsigned long OBJTOKEN;  	// U4:1 (always)  token used for authorization
        string ATTRID;  	// A:40 (varies)  identifies an attribute type, chars 0x20-0x7e but not >, :, ?, *, or ~.  Does not begin or end with space.
        string ATTRDATA;  	// A:n (varies)  a specific attribute value of any data type
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 5 || list0[0] != "L:4") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJSPEC = list1[1];} else { OBJSPEC = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        OBJCMD = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U4:1" ) { ok = false; break; }
        OBJTOKEN = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[4], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t a=1; a < list1.size(); a++) {
            vector<string> list2;
            sp->listSplit(list1[a], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ATTRID = list3[1];} else { ATTRID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ATTRDATA = list3[1];} else { ATTRDATA = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(14, 16, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S14F15R

S14F16Attached Obj Action Ack Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S14F16 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(14, 15, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 {L:b {L:2 ATTRID ATTRDATA}} {L:2 OBJACK {L:p {L:2 ERRCODE ERRTEXT}}}
        // variables for data items and parsing
        string ATTRID;  	// A:40 (varies)  identifies an attribute type, chars 0x20-0x7e but not >, :, ?, *, or ~.  Does not begin or end with space.
        string ATTRDATA;  	// A:n (varies)  a specific attribute value of any data type
        unsigned long OBJACK;  	// U1:1 (always)  acknowledge code, 0 ok, 1 error
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t b=1; b < list1.size(); b++) {
            vector<string> list2;
            sp->listSplit(list1[b], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ATTRID = list3[1];} else { ATTRID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ATTRDATA = list3[1];} else { ATTRDATA = ""; }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "U1:1" ) { ok = false; break; }
        OBJACK = atoul(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if ( list2.size() < 1) { ok=false; break; }
        for(size_t p=1; p < list2.size(); p++) {
            vector<string> list3;
            sp->listSplit(list2[p], list3);
            if ( list3.size() != 3 || list3[0] != "L:2") { ok=false; break; }
            vector<string> list4;
            sp->listSplit(list3[1], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { ERRCODE = list4[1];} else { ERRCODE = ""; }
            list4.clear();
            sp->listSplit(list3[2], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0].find("A:") != 0 ) { ok = false; break; }
            if ( list4.size() == 2) { ERRTEXT = list4[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S14F17RSupervised Obj Action Req Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S14F17R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 14, 17, ::recvS14F17R);

// receive method 
void recvS14F17R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:4 OBJSPEC OBJCMD TARGETSPEC {L:a {L:2 ATTRID ATTRDATA}}
        // variables for data items and parsing
        string OBJSPEC;  	// A:n (varies)  E39 structured text identifying an object, [object type:object id>]+
        unsigned long OBJCMD;  	// U1:1 (always)  Specifies an action to be performed by an object
        string TARGETSPEC;  	// A:40 (always)  Specifier of target object
        string ATTRID;  	// A:40 (varies)  identifies an attribute type, chars 0x20-0x7e but not >, :, ?, *, or ~.  Does not begin or end with space.
        string ATTRDATA;  	// A:n (varies)  a specific attribute value of any data type
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 5 || list0[0] != "L:4") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJSPEC = list1[1];} else { OBJSPEC = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        OBJCMD = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { TARGETSPEC = list1[1];} else { TARGETSPEC = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t a=1; a < list1.size(); a++) {
            vector<string> list2;
            sp->listSplit(list1[a], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ATTRID = list3[1];} else { ATTRID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ATTRDATA = list3[1];} else { ATTRDATA = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(14, 18, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S14F17R

S14F18Supervised Obj Action Ack Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S14F18 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(14, 17, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 {L:b {L:2 ATTRID ATTRDATA}} {L:2 OBJACK {L:p {L:2 ERRCODE ERRTEXT}}}
        // variables for data items and parsing
        string ATTRID;  	// A:40 (varies)  identifies an attribute type, chars 0x20-0x7e but not >, :, ?, *, or ~.  Does not begin or end with space.
        string ATTRDATA;  	// A:n (varies)  a specific attribute value of any data type
        unsigned long OBJACK;  	// U1:1 (always)  acknowledge code, 0 ok, 1 error
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t b=1; b < list1.size(); b++) {
            vector<string> list2;
            sp->listSplit(list1[b], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ATTRID = list3[1];} else { ATTRID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ATTRDATA = list3[1];} else { ATTRDATA = ""; }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "U1:1" ) { ok = false; break; }
        OBJACK = atoul(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if ( list2.size() < 1) { ok=false; break; }
        for(size_t p=1; p < list2.size(); p++) {
            vector<string> list3;
            sp->listSplit(list2[p], list3);
            if ( list3.size() != 3 || list3[0] != "L:2") { ok=false; break; }
            vector<string> list4;
            sp->listSplit(list3[1], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { ERRCODE = list4[1];} else { ERRCODE = ""; }
            list4.clear();
            sp->listSplit(list3[2], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0].find("A:") != 0 ) { ok = false; break; }
            if ( list4.size() == 2) { ERRTEXT = list4[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S14F19RGeneric Service Req Sent by Host Only

using namespace std;

    // S14F19R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 14, 19, ::recvS14F19R);

// receive method 
void recvS14F19R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:5 DATAID OPID OBJSPEC SVCNAME {L:m {L:2 SPNAME SPVAL}}
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string OPID;  	// U4:1 (varies)  operation identifier
        string OBJSPEC;  	// A:n (varies)  E39 structured text identifying an object, [object type:object id>]+
        string SVCNAME;  	// A:n (always)  service name
        string SPNAME;  	// A:n (always)  service parameter name
        string SPVAL;  	// A:n (varies)  service parameter value, any format type
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 6 || list0[0] != "L:5") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OPID = list1[1];} else { OPID = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJSPEC = list1[1];} else { OBJSPEC = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { SVCNAME = list1[1];} else { SVCNAME = ""; }
        list1.clear();
        sp->listSplit(list0[5], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t m=1; m < list1.size(); m++) {
            vector<string> list2;
            sp->listSplit(list1[m], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { SPNAME = list3[1];} else { SPNAME = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { SPVAL = list3[1];} else { SPVAL = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(14, 20, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S14F19R

S14F20Generic Service Ack Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S14F20 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(14, 19, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:4 SVCACK LINKID {L:n {L:2 SPNAME SPVAL}} {L:2 SVCACK {L:p {L:2 ERRCODE ERRTEXT}}}
        // variables for data items and parsing
        int SVCACK;  	// B:1 (always)  service acknowledge code
        unsigned long LINKID;  	// U4:1 (always)  correlates the RMOPID value in a request to a completion report
        string SPNAME;  	// A:n (always)  service parameter name
        string SPVAL;  	// A:n (varies)  service parameter value, any format type
        int SVCACK;  	// B:1 (always)  service acknowledge code
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 5 || list0[0] != "L:4") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        SVCACK = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U4:1" ) { ok = false; break; }
        LINKID = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { SPNAME = list3[1];} else { SPNAME = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { SPVAL = list3[1];} else { SPVAL = ""; }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[4], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "B:1" ) { ok = false; break; }
        SVCACK = sp->binToInt(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if ( list2.size() < 1) { ok=false; break; }
        for(size_t p=1; p < list2.size(); p++) {
            vector<string> list3;
            sp->listSplit(list2[p], list3);
            if ( list3.size() != 3 || list3[0] != "L:2") { ok=false; break; }
            vector<string> list4;
            sp->listSplit(list3[1], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { ERRCODE = list4[1];} else { ERRCODE = ""; }
            list4.clear();
            sp->listSplit(list3[2], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0].find("A:") != 0 ) { ok = false; break; }
            if ( list4.size() == 2) { ERRTEXT = list4[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S14F21RGeneric Service Completion Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S14F21R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 14, 21, ::recvS14F21R);

// receive method 
void recvS14F21R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:5 DATAID OPID LINKID {L:n {L:2 SPNAME SPVAL}} {L:2 SVCACK {L:p {L:2 ERRCODE ERRTEXT}}}
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string OPID;  	// U4:1 (varies)  operation identifier
        unsigned long LINKID;  	// U4:1 (always)  correlates the RMOPID value in a request to a completion report
        string SPNAME;  	// A:n (always)  service parameter name
        string SPVAL;  	// A:n (varies)  service parameter value, any format type
        int SVCACK;  	// B:1 (always)  service acknowledge code
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 6 || list0[0] != "L:5") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OPID = list1[1];} else { OPID = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U4:1" ) { ok = false; break; }
        LINKID = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[4], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { SPNAME = list3[1];} else { SPNAME = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { SPVAL = list3[1];} else { SPVAL = ""; }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[5], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "B:1" ) { ok = false; break; }
        SVCACK = sp->binToInt(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if ( list2.size() < 1) { ok=false; break; }
        for(size_t p=1; p < list2.size(); p++) {
            vector<string> list3;
            sp->listSplit(list2[p], list3);
            if ( list3.size() != 3 || list3[0] != "L:2") { ok=false; break; }
            vector<string> list4;
            sp->listSplit(list3[1], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { ERRCODE = list4[1];} else { ERRCODE = ""; }
            list4.clear();
            sp->listSplit(list3[2], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0].find("A:") != 0 ) { ok = false; break; }
            if ( list4.size() == 2) { ERRTEXT = list4[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(14, 22, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S14F21R

S14F22Generic Service Comp Ack Sent by Host and Equipment

using namespace std;

    // S14F22 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(14, 21, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect DATAACK
        // variables for data items and parsing
        int DATAACK;  	// B:1 (always)  Acknowledgement code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        DATAACK = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S14F23RMulti-block Generic Service Inquire Sent by Host and Equipment

using namespace std;

    // S14F23R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 14, 23, ::recvS14F23R);

// receive method 
void recvS14F23R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 DATAID DATALENGTH
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string DATALENGTH;  	// U4:1 (varies)  total bytes of the message body 
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATALENGTH = list1[1];} else { DATALENGTH = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(14, 24, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S14F23R

S14F24Multi-block Generic Service Grant Sent by Host and Equipment

using namespace std;

    // S14F24 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(14, 23, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect GRANT
        // variables for data items and parsing
        int GRANT;  	// B:1 (always)  multiblock grant code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        GRANT = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S14F25RService Name Request Sent by Host and Equipment

using namespace std;

    // S14F25R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 14, 25, ::recvS14F25R);

// receive method 
void recvS14F25R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 OBJSPEC {L:n OBJTYPE}
        // variables for data items and parsing
        string OBJSPEC;  	// A:n (varies)  E39 structured text identifying an object, [object type:object id>]+
        string OBJTYPE;  	// A:40 (varies)  object class name, chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJSPEC = list1[1];} else { OBJSPEC = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { OBJTYPE = list2[1];} else { OBJTYPE = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(14, 26, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S14F25R

S14F26Service Name Data Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S14F26 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(14, 25, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 {L:n {L:2 OBJTYPE {L:a SVCNAME}}} {L:2 OBJACK {L:p {L:2 ERRCODE ERRTEXT}}}
        // variables for data items and parsing
        string OBJTYPE;  	// A:40 (varies)  object class name, chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        string SVCNAME;  	// A:n (always)  service name
        unsigned long OBJACK;  	// U1:1 (always)  acknowledge code, 0 ok, 1 error
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { OBJTYPE = list3[1];} else { OBJTYPE = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if ( list3.size() < 1) { ok=false; break; }
            for(size_t a=1; a < list3.size(); a++) {
                vector<string> list4;
                sp->listSplit(list3[a], list4);
                if (list4.size() < 1) { ok = false; break; }
                if ( list4[0].find("A:") != 0 ) { ok = false; break; }
                if ( list4.size() == 2) { SVCNAME = list4[1];} else { SVCNAME = ""; }
                }
            if (!ok) break;
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "U1:1" ) { ok = false; break; }
        OBJACK = atoul(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if ( list2.size() < 1) { ok=false; break; }
        for(size_t p=1; p < list2.size(); p++) {
            vector<string> list3;
            sp->listSplit(list2[p], list3);
            if ( list3.size() != 3 || list3[0] != "L:2") { ok=false; break; }
            vector<string> list4;
            sp->listSplit(list3[1], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { ERRCODE = list4[1];} else { ERRCODE = ""; }
            list4.clear();
            sp->listSplit(list3[2], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0].find("A:") != 0 ) { ok = false; break; }
            if ( list4.size() == 2) { ERRTEXT = list4[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S14F27RService Parameter Name Req Sent by Host and Equipment

using namespace std;

    // S14F27R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 14, 27, ::recvS14F27R);

// receive method 
void recvS14F27R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:3 OBJSPEC OBJTYPE {L:n SVCNAME}
        // variables for data items and parsing
        string OBJSPEC;  	// A:n (varies)  E39 structured text identifying an object, [object type:object id>]+
        string OBJTYPE;  	// A:40 (varies)  object class name, chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        string SVCNAME;  	// A:n (always)  service name
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJSPEC = list1[1];} else { OBJSPEC = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJTYPE = list1[1];} else { OBJTYPE = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { SVCNAME = list2[1];} else { SVCNAME = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(14, 28, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S14F27R

S14F28Service Parameter Name Data Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S14F28 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(14, 27, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 {L:n {L:2 SVCNAME {L:a SPNAME}}} {L:2 OBJACK {L:p {L:2 ERRCODE ERRTEXT}}}
        // variables for data items and parsing
        string SVCNAME;  	// A:n (always)  service name
        string SPNAME;  	// A:n (always)  service parameter name
        unsigned long OBJACK;  	// U1:1 (always)  acknowledge code, 0 ok, 1 error
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { SVCNAME = list3[1];} else { SVCNAME = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if ( list3.size() < 1) { ok=false; break; }
            for(size_t a=1; a < list3.size(); a++) {
                vector<string> list4;
                sp->listSplit(list3[a], list4);
                if (list4.size() < 1) { ok = false; break; }
                if ( list4[0].find("A:") != 0 ) { ok = false; break; }
                if ( list4.size() == 2) { SPNAME = list4[1];} else { SPNAME = ""; }
                }
            if (!ok) break;
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "U1:1" ) { ok = false; break; }
        OBJACK = atoul(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if ( list2.size() < 1) { ok=false; break; }
        for(size_t p=1; p < list2.size(); p++) {
            vector<string> list3;
            sp->listSplit(list2[p], list3);
            if ( list3.size() != 3 || list3[0] != "L:2") { ok=false; break; }
            vector<string> list4;
            sp->listSplit(list3[1], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { ERRCODE = list4[1];} else { ERRCODE = ""; }
            list4.clear();
            sp->listSplit(list3[2], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0].find("A:") != 0 ) { ok = false; break; }
            if ( list4.size() == 2) { ERRTEXT = list4[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S15F1RRecipe Management Multi-Block Inquire Sent by Host and Equipment

using namespace std;

    // S15F1R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 15, 1, ::recvS15F1R);

// receive method 
void recvS15F1R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:3 DATAID RCPSPEC RMDATASIZE
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string RCPSPEC;  	// A:n (always)  recipe specifier
        string RMDATASIZE;  	// U4:1 (varies)  the maximum total message body length of a SECS-II message
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { RCPSPEC = list1[1];} else { RCPSPEC = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { RMDATASIZE = list1[1];} else { RMDATASIZE = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(15, 2, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S15F1R

S15F2Recipe Management Multi-block Grant Sent by Host and Equipment

using namespace std;

    // S15F2 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(15, 1, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect RMGRNT
        // variables for data items and parsing
        int RMGRNT;  	// B:1 (always)  grant code, 0 ok
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        RMGRNT = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S15F3RRecipe Namespace Action Req Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S15F3R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 15, 3, ::recvS15F3R);

// receive method 
void recvS15F3R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 RMNSSPEC RMNSCMD
        // variables for data items and parsing
        string RMNSSPEC;  	// A:n (always)  object id of a recipe namespace
        unsigned long RMNSCMD;  	// U1:1 (always)  recipe namespace command
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { RMNSSPEC = list1[1];} else { RMNSSPEC = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        RMNSCMD = atoul(list1[1].c_str());
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(15, 4, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S15F3R

S15F4Recipe Namespace Action Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S15F4 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(15, 3, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 RMACK {L:p {L:2 ERRCODE ERRTEXT}}
        // variables for data items and parsing
        unsigned long RMACK;  	// U1:1 (always)  recipe managment completion code
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        RMACK = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t p=1; p < list1.size(); p++) {
            vector<string> list2;
            sp->listSplit(list1[p], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ERRCODE = list3[1];} else { ERRCODE = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { ERRTEXT = list3[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S15F5RRecipe Namespace Rename Req Sent by Host and Equipment

using namespace std;

    // S15F5R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 15, 5, ::recvS15F5R);

// receive method 
void recvS15F5R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 RMNSSPEC RMNEWNS
        // variables for data items and parsing
        string RMNSSPEC;  	// A:n (always)  object id of a recipe namespace
        string RMNEWNS;  	// A:n (always)  new name for a recipe namespace
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { RMNSSPEC = list1[1];} else { RMNSSPEC = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { RMNEWNS = list1[1];} else { RMNEWNS = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(15, 6, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S15F5R

S15F6Recipe Namespace Rename Ack Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S15F6 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(15, 5, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 RMACK {L:p {L:2 ERRCODE ERRTEXT}}
        // variables for data items and parsing
        unsigned long RMACK;  	// U1:1 (always)  recipe managment completion code
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        RMACK = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t p=1; p < list1.size(); p++) {
            vector<string> list2;
            sp->listSplit(list1[p], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ERRCODE = list3[1];} else { ERRCODE = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { ERRTEXT = list3[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S15F7RRecipe Space Req Sent by Host and Equipment

using namespace std;

    // S15F7R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 15, 7, ::recvS15F7R);

// receive method 
void recvS15F7R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect OBJSPEC
        // variables for data items and parsing
        string OBJSPEC;  	// A:n (varies)  E39 structured text identifying an object, [object type:object id>]+
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0.size() == 2) { OBJSPEC = list0[1];} else { OBJSPEC = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(15, 8, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S15F7R

S15F8Recipe Space Data Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S15F8 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(15, 7, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 RMSPACE {L:2 RMACK {L:p {L:2 ERRCODE ERRTEXT}}}
        // variables for data items and parsing
        string RMSPACE;  	// U4:1 (varies)  the amount of storage available in bytes for at least one recipe
        unsigned long RMACK;  	// U1:1 (always)  recipe managment completion code
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { RMSPACE = list1[1];} else { RMSPACE = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "U1:1" ) { ok = false; break; }
        RMACK = atoul(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if ( list2.size() < 1) { ok=false; break; }
        for(size_t p=1; p < list2.size(); p++) {
            vector<string> list3;
            sp->listSplit(list2[p], list3);
            if ( list3.size() != 3 || list3[0] != "L:2") { ok=false; break; }
            vector<string> list4;
            sp->listSplit(list3[1], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { ERRCODE = list4[1];} else { ERRCODE = ""; }
            list4.clear();
            sp->listSplit(list3[2], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0].find("A:") != 0 ) { ok = false; break; }
            if ( list4.size() == 2) { ERRTEXT = list4[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S15F9RRecipe Status Request Sent by Host and Equipment

using namespace std;

    // S15F9R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 15, 9, ::recvS15F9R);

// receive method 
void recvS15F9R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect RCPSPEC
        // variables for data items and parsing
        string RCPSPEC;  	// A:n (always)  recipe specifier
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0].find("A:") != 0 ) { ok = false; break; }
        if ( list0.size() == 2) { RCPSPEC = list0[1];} else { RCPSPEC = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(15, 10, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S15F9R

S15F10Recipe Status Data Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S15F10 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(15, 9, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:3 RCPSTAT RCPVERS {L:2 RMACK {L:p {L:2 ERRCODE ERRTEXT}}}
        // variables for data items and parsing
        unsigned long RCPSTAT;  	// U1:1 (always)  Recipe status code
        string RCPVERS;  	// A:n (always)  recipe version
        unsigned long RMACK;  	// U1:1 (always)  recipe managment completion code
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        RCPSTAT = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { RCPVERS = list1[1];} else { RCPVERS = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "U1:1" ) { ok = false; break; }
        RMACK = atoul(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if ( list2.size() < 1) { ok=false; break; }
        for(size_t p=1; p < list2.size(); p++) {
            vector<string> list3;
            sp->listSplit(list2[p], list3);
            if ( list3.size() != 3 || list3[0] != "L:2") { ok=false; break; }
            vector<string> list4;
            sp->listSplit(list3[1], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { ERRCODE = list4[1];} else { ERRCODE = ""; }
            list4.clear();
            sp->listSplit(list3[2], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0].find("A:") != 0 ) { ok = false; break; }
            if ( list4.size() == 2) { ERRTEXT = list4[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S15F11RRecipe Version Request Sent by Host and Equipment

using namespace std;

    // S15F11R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 15, 11, ::recvS15F11R);

// receive method 
void recvS15F11R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:4 RMNSSPEC RCPCLASS RCPNAME AGENT
        // variables for data items and parsing
        string RMNSSPEC;  	// A:n (always)  object id of a recipe namespace
        string RCPCLASS;  	// A:n (always)  Recipe class
        string RCPNAME;  	// A:n (always)  recipe name
        string AGENT;  	// A:n (always)  no description, no max length
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 5 || list0[0] != "L:4") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { RMNSSPEC = list1[1];} else { RMNSSPEC = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { RCPCLASS = list1[1];} else { RCPCLASS = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { RCPNAME = list1[1];} else { RCPNAME = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { AGENT = list1[1];} else { AGENT = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(15, 12, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S15F11R

S15F12Recipe Version Data Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S15F12 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(15, 11, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:3 AGENT RCPVERS {L:2 RMACK {L:p {L:2 ERRCODE ERRTEXT}}}
        // variables for data items and parsing
        string AGENT;  	// A:n (always)  no description, no max length
        string RCPVERS;  	// A:n (always)  recipe version
        unsigned long RMACK;  	// U1:1 (always)  recipe managment completion code
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { AGENT = list1[1];} else { AGENT = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { RCPVERS = list1[1];} else { RCPVERS = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "U1:1" ) { ok = false; break; }
        RMACK = atoul(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if ( list2.size() < 1) { ok=false; break; }
        for(size_t p=1; p < list2.size(); p++) {
            vector<string> list3;
            sp->listSplit(list2[p], list3);
            if ( list3.size() != 3 || list3[0] != "L:2") { ok=false; break; }
            vector<string> list4;
            sp->listSplit(list3[1], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { ERRCODE = list4[1];} else { ERRCODE = ""; }
            list4.clear();
            sp->listSplit(list3[2], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0].find("A:") != 0 ) { ok = false; break; }
            if ( list4.size() == 2) { ERRTEXT = list4[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S15F13RRecipe Create Req Sent by Host and Equipment

using namespace std;

    // S15F13R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 15, 13, ::recvS15F13R);

// receive method 
void recvS15F13R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:5 DATAID RCPUPDT RCPSPEC {L:m {L:2 RCPATTRID RCPATTRDATA}} RCPBODY
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        int RCPUPDT;  	// TF:1 (always)  true for a recipe update, false for create
        string RCPSPEC;  	// A:n (always)  recipe specifier
        string RCPATTRID;  	// A:n (always)  the name of a recipe attribute, but not used to indicate the recipe identifier
        string RCPATTRDATA;  	// A:n (varies)  the value of a recipe attribute, any type of data including list
        int [] RCPBODY;  	// B:n (varies)  Recipe body
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 6 || list0[0] != "L:5") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "TF:1" ) { ok = false; break; }
        RCPUPDT = atoi(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { RCPSPEC = list1[1];} else { RCPSPEC = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t m=1; m < list1.size(); m++) {
            vector<string> list2;
            sp->listSplit(list1[m], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { RCPATTRID = list3[1];} else { RCPATTRID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { RCPATTRDATA = list3[1];} else { RCPATTRDATA = ""; }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[5], list1);
        if (list1.size() < 1) { ok = false; break; }
        vector<int> RCPBODY;
        for(size_t i=0; i < RCPBODY.size(); i++) {
            RCPBODY.push_back(sp->binToInt(list1[1+i].c_str()));
            }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(15, 14, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S15F13R

S15F14Recipe Create Ack Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S15F14 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(15, 13, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 RMACK {L:p {L:2 ERRCODE ERRTEXT}}
        // variables for data items and parsing
        unsigned long RMACK;  	// U1:1 (always)  recipe managment completion code
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        RMACK = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t p=1; p < list1.size(); p++) {
            vector<string> list2;
            sp->listSplit(list1[p], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ERRCODE = list3[1];} else { ERRCODE = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { ERRTEXT = list3[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S15F15RRecipe Store Req Sent by Host and Equipment

using namespace std;

    // S15F15R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 15, 15, ::recvS15F15R);

// receive method 
void recvS15F15R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:4 DATAID RCPSPEC RCPSECCODE {L:3 {L:2* RCPSECNM {L:g {L:2 RCPATTRID RCPATTRDATA}}} RCPBODY {L:m {L:2 RCPSECNM {L:a {L:2 RCPATTRID RCPATTRDATA}}}}}
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string RCPSPEC;  	// A:n (always)  recipe specifier
        int RCPSECCODE;  	// B:1 (always)  indicates the sections of a recipe
        string RCPSECNM;  	// A:n (always)  Recipe section name, "Generic", "Body", "ASDS"
        string RCPATTRID;  	// A:n (always)  the name of a recipe attribute, but not used to indicate the recipe identifier
        string RCPATTRDATA;  	// A:n (varies)  the value of a recipe attribute, any type of data including list
        int [] RCPBODY;  	// B:n (varies)  Recipe body
        string RCPSECNM;  	// A:n (always)  Recipe section name, "Generic", "Body", "ASDS"
        string RCPATTRID;  	// A:n (always)  the name of a recipe attribute, but not used to indicate the recipe identifier
        string RCPATTRDATA;  	// A:n (varies)  the value of a recipe attribute, any type of data including list
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 5 || list0[0] != "L:4") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { RCPSPEC = list1[1];} else { RCPSPEC = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        RCPSECCODE = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[4], list1);
        if ( list1.size() != 4 || list1[0] != "L:3") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if ( list2.size() == 3 ) {  // 2 optional items found
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { RCPSECNM = list3[1];} else { RCPSECNM = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if ( list3.size() < 1) { ok=false; break; }
            for(size_t g=1; g < list3.size(); g++) {
                vector<string> list4;
                sp->listSplit(list3[g], list4);
                if ( list4.size() != 3 || list4[0] != "L:2") { ok=false; break; }
                vector<string> list5;
                sp->listSplit(list4[1], list5);
                if (list5.size() < 1) { ok = false; break; }
                if ( list5[0].find("A:") != 0 ) { ok = false; break; }
                if ( list5.size() == 2) { RCPATTRID = list5[1];} else { RCPATTRID = ""; }
                list5.clear();
                sp->listSplit(list4[2], list5);
                if (list5.size() < 1) { ok = false; break; }
                if ( list5.size() == 2) { RCPATTRDATA = list5[1];} else { RCPATTRDATA = ""; }
                }
            if (!ok) break;
            }
        list2.clear();
        sp->listSplit(list1[2], list2);
        if (list2.size() < 1) { ok = false; break; }
        vector<int> RCPBODY;
        for(size_t i=0; i < RCPBODY.size(); i++) {
            RCPBODY.push_back(sp->binToInt(list2[1+i].c_str()));
            }
        list2.clear();
        sp->listSplit(list1[3], list2);
        if ( list2.size() < 1) { ok=false; break; }
        for(size_t m=1; m < list2.size(); m++) {
            vector<string> list3;
            sp->listSplit(list2[m], list3);
            if ( list3.size() != 3 || list3[0] != "L:2") { ok=false; break; }
            vector<string> list4;
            sp->listSplit(list3[1], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0].find("A:") != 0 ) { ok = false; break; }
            if ( list4.size() == 2) { RCPSECNM = list4[1];} else { RCPSECNM = ""; }
            list4.clear();
            sp->listSplit(list3[2], list4);
            if ( list4.size() < 1) { ok=false; break; }
            for(size_t a=1; a < list4.size(); a++) {
                vector<string> list5;
                sp->listSplit(list4[a], list5);
                if ( list5.size() != 3 || list5[0] != "L:2") { ok=false; break; }
                vector<string> list6;
                sp->listSplit(list5[1], list6);
                if (list6.size() < 1) { ok = false; break; }
                if ( list6[0].find("A:") != 0 ) { ok = false; break; }
                if ( list6.size() == 2) { RCPATTRID = list6[1];} else { RCPATTRID = ""; }
                list6.clear();
                sp->listSplit(list5[2], list6);
                if (list6.size() < 1) { ok = false; break; }
                if ( list6.size() == 2) { RCPATTRDATA = list6[1];} else { RCPATTRDATA = ""; }
                }
            if (!ok) break;
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(15, 16, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S15F15R

S15F16Recipe Store Ack Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S15F16 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(15, 15, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 RCPSECCODE {L:2 RMACK {L:p {L:2 ERRCODE ERRTEXT}}}
        // variables for data items and parsing
        int RCPSECCODE;  	// B:1 (always)  indicates the sections of a recipe
        unsigned long RMACK;  	// U1:1 (always)  recipe managment completion code
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        RCPSECCODE = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "U1:1" ) { ok = false; break; }
        RMACK = atoul(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if ( list2.size() < 1) { ok=false; break; }
        for(size_t p=1; p < list2.size(); p++) {
            vector<string> list3;
            sp->listSplit(list2[p], list3);
            if ( list3.size() != 3 || list3[0] != "L:2") { ok=false; break; }
            vector<string> list4;
            sp->listSplit(list3[1], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { ERRCODE = list4[1];} else { ERRCODE = ""; }
            list4.clear();
            sp->listSplit(list3[2], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0].find("A:") != 0 ) { ok = false; break; }
            if ( list4.size() == 2) { ERRTEXT = list4[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S15F17RRecipe Retrieve Req Sent by Host and Equipment

using namespace std;

    // S15F17R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 15, 17, ::recvS15F17R);

// receive method 
void recvS15F17R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 RCPSPEC RCPSECCODE
        // variables for data items and parsing
        string RCPSPEC;  	// A:n (always)  recipe specifier
        int RCPSECCODE;  	// B:1 (always)  indicates the sections of a recipe
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { RCPSPEC = list1[1];} else { RCPSPEC = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        RCPSECCODE = sp->binToInt(list1[1].c_str());
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(15, 18, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S15F17R

S15F18Recipe Retrieve Data Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S15F18 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(15, 17, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 {L:q {L:r RCPSECNM {L:g {L:2 RCPATTRID RCPATTRDATA}}} RCPBODY {L:m {L:2 RCPSECNM {L:a {L:2 RCPATTRID RCPATTRDATA}}}}} {L:2 RMACK {L:p {L:2 ERRCODE ERRTEXT}}}
        // variables for data items and parsing
        string RCPSECNM;  	// A:n (always)  Recipe section name, "Generic", "Body", "ASDS"
        string RCPATTRID;  	// A:n (always)  the name of a recipe attribute, but not used to indicate the recipe identifier
        string RCPATTRDATA;  	// A:n (varies)  the value of a recipe attribute, any type of data including list
        int [] RCPBODY;  	// B:n (varies)  Recipe body
        string RCPSECNM;  	// A:n (always)  Recipe section name, "Generic", "Body", "ASDS"
        string RCPATTRID;  	// A:n (always)  the name of a recipe attribute, but not used to indicate the recipe identifier
        string RCPATTRDATA;  	// A:n (varies)  the value of a recipe attribute, any type of data including list
        unsigned long RMACK;  	// U1:1 (always)  recipe managment completion code
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t q=1; q < list1.size(); q++) {
            vector<string> list2;
            sp->listSplit(list1[q], list2);
            if ( list2.size() < 1) { ok=false; break; }
            for(size_t r=1; r < list2.size(); r++) {
                vector<string> list3;
                sp->listSplit(list2[r], list3);
                if (list3.size() < 1) { ok = false; break; }
                if ( list3[0].find("A:") != 0 ) { ok = false; break; }
                if ( list3.size() == 2) { RCPSECNM = list3[1];} else { RCPSECNM = ""; }
                list3.clear();
                sp->listSplit(list2[r], list3);
                if ( list3.size() < 1) { ok=false; break; }
                for(size_t g=1; g < list3.size(); g++) {
                    vector<string> list4;
                    sp->listSplit(list3[g], list4);
                    if ( list4.size() != 3 || list4[0] != "L:2") { ok=false; break; }
                    vector<string> list5;
                    sp->listSplit(list4[1], list5);
                    if (list5.size() < 1) { ok = false; break; }
                    if ( list5[0].find("A:") != 0 ) { ok = false; break; }
                    if ( list5.size() == 2) { RCPATTRID = list5[1];} else { RCPATTRID = ""; }
                    list5.clear();
                    sp->listSplit(list4[2], list5);
                    if (list5.size() < 1) { ok = false; break; }
                    if ( list5.size() == 2) { RCPATTRDATA = list5[1];} else { RCPATTRDATA = ""; }
                    }
                if (!ok) break;
                }
            if (!ok) break;
            list2.clear();
            sp->listSplit(list1[q], list2);
            if (list2.size() < 1) { ok = false; break; }
            vector<int> RCPBODY;
            for(size_t i=0; i < RCPBODY.size(); i++) {
                RCPBODY.push_back(sp->binToInt(list2[1+i].c_str()));
                }
            list2.clear();
            sp->listSplit(list1[q], list2);
            if ( list2.size() < 1) { ok=false; break; }
            for(size_t m=1; m < list2.size(); m++) {
                vector<string> list3;
                sp->listSplit(list2[m], list3);
                if ( list3.size() != 3 || list3[0] != "L:2") { ok=false; break; }
                vector<string> list4;
                sp->listSplit(list3[1], list4);
                if (list4.size() < 1) { ok = false; break; }
                if ( list4[0].find("A:") != 0 ) { ok = false; break; }
                if ( list4.size() == 2) { RCPSECNM = list4[1];} else { RCPSECNM = ""; }
                list4.clear();
                sp->listSplit(list3[2], list4);
                if ( list4.size() < 1) { ok=false; break; }
                for(size_t a=1; a < list4.size(); a++) {
                    vector<string> list5;
                    sp->listSplit(list4[a], list5);
                    if ( list5.size() != 3 || list5[0] != "L:2") { ok=false; break; }
                    vector<string> list6;
                    sp->listSplit(list5[1], list6);
                    if (list6.size() < 1) { ok = false; break; }
                    if ( list6[0].find("A:") != 0 ) { ok = false; break; }
                    if ( list6.size() == 2) { RCPATTRID = list6[1];} else { RCPATTRID = ""; }
                    list6.clear();
                    sp->listSplit(list5[2], list6);
                    if (list6.size() < 1) { ok = false; break; }
                    if ( list6.size() == 2) { RCPATTRDATA = list6[1];} else { RCPATTRDATA = ""; }
                    }
                if (!ok) break;
                }
            if (!ok) break;
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "U1:1" ) { ok = false; break; }
        RMACK = atoul(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if ( list2.size() < 1) { ok=false; break; }
        for(size_t p=1; p < list2.size(); p++) {
            vector<string> list3;
            sp->listSplit(list2[p], list3);
            if ( list3.size() != 3 || list3[0] != "L:2") { ok=false; break; }
            vector<string> list4;
            sp->listSplit(list3[1], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { ERRCODE = list4[1];} else { ERRCODE = ""; }
            list4.clear();
            sp->listSplit(list3[2], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0].find("A:") != 0 ) { ok = false; break; }
            if ( list4.size() == 2) { ERRTEXT = list4[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S15F19RRecipe Rename Req Sent by Host and Equipment

using namespace std;

    // S15F19R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 15, 19, ::recvS15F19R);

// receive method 
void recvS15F19R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:3 RCPSPEC RCPRENAME RCPNEWID
        // variables for data items and parsing
        string RCPSPEC;  	// A:n (always)  recipe specifier
        int RCPRENAME;  	// TF:1 (always)  whether a recipe is to be renamed (TRUE) or copied (FALSE)
        string RCPNEWID;  	// A:n (always)  the new recipe identifier
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { RCPSPEC = list1[1];} else { RCPSPEC = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "TF:1" ) { ok = false; break; }
        RCPRENAME = atoi(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { RCPNEWID = list1[1];} else { RCPNEWID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(15, 20, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S15F19R

S15F20Recipe Rename Ack Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S15F20 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(15, 19, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 RMACK {L:p {L:2 ERRCODE ERRTEXT}}
        // variables for data items and parsing
        unsigned long RMACK;  	// U1:1 (always)  recipe managment completion code
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        RMACK = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t p=1; p < list1.size(); p++) {
            vector<string> list2;
            sp->listSplit(list1[p], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ERRCODE = list3[1];} else { ERRCODE = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { ERRTEXT = list3[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S15F21RRecipe Action Req Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S15F21R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 15, 21, ::recvS15F21R);

// receive method 
void recvS15F21R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:6 DATAID RCPCMD RMNSSPEC OPID AGENT {L:n RCPID}
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        unsigned long RCPCMD;  	// U1:1 (always)  recipe action
        string RMNSSPEC;  	// A:n (always)  object id of a recipe namespace
        string OPID;  	// U4:1 (varies)  operation identifier
        string AGENT;  	// A:n (always)  no description, no max length
        string RCPID;  	// A:n (always)  recipe identifier conforming to OBJSPEC
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 7 || list0[0] != "L:6") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        RCPCMD = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { RMNSSPEC = list1[1];} else { RMNSSPEC = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OPID = list1[1];} else { OPID = ""; }
        list1.clear();
        sp->listSplit(list0[5], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { AGENT = list1[1];} else { AGENT = ""; }
        list1.clear();
        sp->listSplit(list0[6], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { RCPID = list2[1];} else { RCPID = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(15, 22, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S15F21R

S15F22Recipe Action Ack Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S15F22 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(15, 21, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:4 AGENT LINKID RCPCMD {L:2 RMACK {L:p {L:2 ERRCODE ERRTEXT}}}
        // variables for data items and parsing
        string AGENT;  	// A:n (always)  no description, no max length
        unsigned long LINKID;  	// U4:1 (always)  correlates the RMOPID value in a request to a completion report
        unsigned long RCPCMD;  	// U1:1 (always)  recipe action
        unsigned long RMACK;  	// U1:1 (always)  recipe managment completion code
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 5 || list0[0] != "L:4") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { AGENT = list1[1];} else { AGENT = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U4:1" ) { ok = false; break; }
        LINKID = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        RCPCMD = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[4], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "U1:1" ) { ok = false; break; }
        RMACK = atoul(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if ( list2.size() < 1) { ok=false; break; }
        for(size_t p=1; p < list2.size(); p++) {
            vector<string> list3;
            sp->listSplit(list2[p], list3);
            if ( list3.size() != 3 || list3[0] != "L:2") { ok=false; break; }
            vector<string> list4;
            sp->listSplit(list3[1], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { ERRCODE = list4[1];} else { ERRCODE = ""; }
            list4.clear();
            sp->listSplit(list3[2], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0].find("A:") != 0 ) { ok = false; break; }
            if ( list4.size() == 2) { ERRTEXT = list4[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S15F23RRecipe Descriptor Req Sent by Host and Equipment

using namespace std;

    // S15F23R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 15, 23, ::recvS15F23R);

// receive method 
void recvS15F23R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:3 DATAID OBJSPEC {L:n RCPID}
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string OBJSPEC;  	// A:n (varies)  E39 structured text identifying an object, [object type:object id>]+
        string RCPID;  	// A:n (always)  recipe identifier conforming to OBJSPEC
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJSPEC = list1[1];} else { OBJSPEC = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { RCPID = list2[1];} else { RCPID = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(15, 24, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S15F23R

S15F24Recipe Descriptor Data Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S15F24 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(15, 23, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 {L:n {L:a {L:3* RCPDESCNM RCPDESCTIME RCPDESCLTH}}} {L:2 RMACK {L:p {L:2 ERRCODE ERRTEXT}}}
        // variables for data items and parsing
        string RCPDESCNM;  	// A:n (always)  Identifies a descriptor type "ASDesc", "BodyDesc", "GenDesc"
        string RCPDESCTIME;  	// A:16 (always)  timestamp of a recipe section "YYYYMMDDhhmmsscc"
        string RCPDESCLTH;  	// U4:1 (varies)  the byte length of a recipe
        unsigned long RMACK;  	// U1:1 (always)  recipe managment completion code
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() < 1) { ok=false; break; }
            for(size_t a=1; a < list2.size(); a++) {
                vector<string> list3;
                sp->listSplit(list2[a], list3);
                if ( list3.size() == 4 ) {  // 3 optional items found
                    vector<string> list4;
                    sp->listSplit(list3[1], list4);
                    if (list4.size() < 1) { ok = false; break; }
                    if ( list4[0].find("A:") != 0 ) { ok = false; break; }
                    if ( list4.size() == 2) { RCPDESCNM = list4[1];} else { RCPDESCNM = ""; }
                    list4.clear();
                    sp->listSplit(list3[2], list4);
                    if (list4.size() < 1) { ok = false; break; }
                    if ( list4[0].find("A:") != 0 ) { ok = false; break; }
                    if ( list4.size() == 2) { RCPDESCTIME = list4[1];} else { RCPDESCTIME = ""; }
                    list4.clear();
                    sp->listSplit(list3[3], list4);
                    if (list4.size() < 1) { ok = false; break; }
                    if ( list4.size() == 2) { RCPDESCLTH = list4[1];} else { RCPDESCLTH = ""; }
                    }
                }
            if (!ok) break;
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "U1:1" ) { ok = false; break; }
        RMACK = atoul(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if ( list2.size() < 1) { ok=false; break; }
        for(size_t p=1; p < list2.size(); p++) {
            vector<string> list3;
            sp->listSplit(list2[p], list3);
            if ( list3.size() != 3 || list3[0] != "L:2") { ok=false; break; }
            vector<string> list4;
            sp->listSplit(list3[1], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { ERRCODE = list4[1];} else { ERRCODE = ""; }
            list4.clear();
            sp->listSplit(list3[2], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0].find("A:") != 0 ) { ok = false; break; }
            if ( list4.size() == 2) { ERRTEXT = list4[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S15F25RRecipe Parameter Update Req Sent by Host and Equipment

using namespace std;

    // S15F25R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 15, 25, ::recvS15F25R);

// receive method 
void recvS15F25R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:4 DATAID RMNSSPEC AGENT {L:n {L:3 RCPPARNM RCPPARVAL RCPPARRULE}}
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string RMNSSPEC;  	// A:n (always)  object id of a recipe namespace
        string AGENT;  	// A:n (always)  no description, no max length
        string RCPPARNM;  	// A:256 (always)  the name of a recipe variable parameter
        string RCPPARVAL;  	// A:80 (varies)  the value of a recipe variable parameter, any scalar format type
        string RCPPARRULE;  	// A:80 (always)  the restrictions applied to a recipe variable parameter setting
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 5 || list0[0] != "L:4") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { RMNSSPEC = list1[1];} else { RMNSSPEC = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { AGENT = list1[1];} else { AGENT = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 4 || list2[0] != "L:3") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { RCPPARNM = list3[1];} else { RCPPARNM = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { RCPPARVAL = list3[1];} else { RCPPARVAL = ""; }
            list3.clear();
            sp->listSplit(list2[3], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { RCPPARRULE = list3[1];} else { RCPPARRULE = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(15, 26, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S15F25R

S15F26Recipe Parameter Update Ack Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S15F26 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(15, 25, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 RMACK {L:p {L:2 ERRCODE ERRTEXT}}
        // variables for data items and parsing
        unsigned long RMACK;  	// U1:1 (always)  recipe managment completion code
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        RMACK = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t p=1; p < list1.size(); p++) {
            vector<string> list2;
            sp->listSplit(list1[p], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ERRCODE = list3[1];} else { ERRCODE = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { ERRTEXT = list3[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S15F27RRecipe Download Req Sent by Host Only

using namespace std;

    // S15F27R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 15, 27, ::recvS15F27R);

// receive method 
void recvS15F27R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:5 DATAID RCPOWCODE RCPSPEC {L:m {L:2 RCPATTRID RCPATTRDATA}} RCPBODY
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        int RCPOWCODE;  	// TF:1 (always)  recipe overwrite code, true=overwrite ok, false=do not overwrite
        string RCPSPEC;  	// A:n (always)  recipe specifier
        string RCPATTRID;  	// A:n (always)  the name of a recipe attribute, but not used to indicate the recipe identifier
        string RCPATTRDATA;  	// A:n (varies)  the value of a recipe attribute, any type of data including list
        int [] RCPBODY;  	// B:n (varies)  Recipe body
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 6 || list0[0] != "L:5") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "TF:1" ) { ok = false; break; }
        RCPOWCODE = atoi(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { RCPSPEC = list1[1];} else { RCPSPEC = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t m=1; m < list1.size(); m++) {
            vector<string> list2;
            sp->listSplit(list1[m], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { RCPATTRID = list3[1];} else { RCPATTRID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { RCPATTRDATA = list3[1];} else { RCPATTRDATA = ""; }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[5], list1);
        if (list1.size() < 1) { ok = false; break; }
        vector<int> RCPBODY;
        for(size_t i=0; i < RCPBODY.size(); i++) {
            RCPBODY.push_back(sp->binToInt(list1[1+i].c_str()));
            }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(15, 28, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S15F27R

S15F28Recipe Download Ack Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S15F28 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(15, 27, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:3 RCPID {L:n {L:2 RCPATTRID RCPATTRDATA}} {L:2 RMACK {L:p {L:2 ERRCODE ERRTEXT}}}
        // variables for data items and parsing
        string RCPID;  	// A:n (always)  recipe identifier conforming to OBJSPEC
        string RCPATTRID;  	// A:n (always)  the name of a recipe attribute, but not used to indicate the recipe identifier
        string RCPATTRDATA;  	// A:n (varies)  the value of a recipe attribute, any type of data including list
        unsigned long RMACK;  	// U1:1 (always)  recipe managment completion code
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { RCPID = list1[1];} else { RCPID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { RCPATTRID = list3[1];} else { RCPATTRID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { RCPATTRDATA = list3[1];} else { RCPATTRDATA = ""; }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "U1:1" ) { ok = false; break; }
        RMACK = atoul(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if ( list2.size() < 1) { ok=false; break; }
        for(size_t p=1; p < list2.size(); p++) {
            vector<string> list3;
            sp->listSplit(list2[p], list3);
            if ( list3.size() != 3 || list3[0] != "L:2") { ok=false; break; }
            vector<string> list4;
            sp->listSplit(list3[1], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { ERRCODE = list4[1];} else { ERRCODE = ""; }
            list4.clear();
            sp->listSplit(list3[2], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0].find("A:") != 0 ) { ok = false; break; }
            if ( list4.size() == 2) { ERRTEXT = list4[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S15F29RRecipe Verify Req Sent by Host Only

using namespace std;

    // S15F29R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 15, 29, ::recvS15F29R);

// receive method 
void recvS15F29R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:4 DATAID OPID RESPEC {L:m RCPID}
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string OPID;  	// U4:1 (varies)  operation identifier
        string RESPEC;  	// A:n (always)  object specifier for the recipe executor
        string RCPID;  	// A:n (always)  recipe identifier conforming to OBJSPEC
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 5 || list0[0] != "L:4") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OPID = list1[1];} else { OPID = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { RESPEC = list1[1];} else { RESPEC = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t m=1; m < list1.size(); m++) {
            vector<string> list2;
            sp->listSplit(list1[m], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { RCPID = list2[1];} else { RCPID = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(15, 30, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S15F29R

S15F30Recipe Verify Ack Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S15F30 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(15, 29, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:5 OPID LINKID RCPID {L:n {L:2 RCPATTRID RCPATTRDATA}} {L:2 RMACK {L:p {L:2 ERRCODE ERRTEXT}}}
        // variables for data items and parsing
        string OPID;  	// U4:1 (varies)  operation identifier
        unsigned long LINKID;  	// U4:1 (always)  correlates the RMOPID value in a request to a completion report
        string RCPID;  	// A:n (always)  recipe identifier conforming to OBJSPEC
        string RCPATTRID;  	// A:n (always)  the name of a recipe attribute, but not used to indicate the recipe identifier
        string RCPATTRDATA;  	// A:n (varies)  the value of a recipe attribute, any type of data including list
        unsigned long RMACK;  	// U1:1 (always)  recipe managment completion code
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 6 || list0[0] != "L:5") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OPID = list1[1];} else { OPID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U4:1" ) { ok = false; break; }
        LINKID = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { RCPID = list1[1];} else { RCPID = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { RCPATTRID = list3[1];} else { RCPATTRID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { RCPATTRDATA = list3[1];} else { RCPATTRDATA = ""; }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[5], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "U1:1" ) { ok = false; break; }
        RMACK = atoul(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if ( list2.size() < 1) { ok=false; break; }
        for(size_t p=1; p < list2.size(); p++) {
            vector<string> list3;
            sp->listSplit(list2[p], list3);
            if ( list3.size() != 3 || list3[0] != "L:2") { ok=false; break; }
            vector<string> list4;
            sp->listSplit(list3[1], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { ERRCODE = list4[1];} else { ERRCODE = ""; }
            list4.clear();
            sp->listSplit(list3[2], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0].find("A:") != 0 ) { ok = false; break; }
            if ( list4.size() == 2) { ERRTEXT = list4[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S15F31RRecipe Unload Req Sent by Host Only

using namespace std;

    // S15F31R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 15, 31, ::recvS15F31R);

// receive method 
void recvS15F31R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect RCPSPEC
        // variables for data items and parsing
        string RCPSPEC;  	// A:n (always)  recipe specifier
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0].find("A:") != 0 ) { ok = false; break; }
        if ( list0.size() == 2) { RCPSPEC = list0[1];} else { RCPSPEC = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(15, 32, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S15F31R

S15F32Recipe Unload Data Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S15F32 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(15, 31, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:4 RCPSPEC {L:m {L:2 RCPATTRID RCPATTRDATA}} RCPBODY {L:2 RMACK {L:p {L:2 ERRCODE ERRTEXT}}}
        // variables for data items and parsing
        string RCPSPEC;  	// A:n (always)  recipe specifier
        string RCPATTRID;  	// A:n (always)  the name of a recipe attribute, but not used to indicate the recipe identifier
        string RCPATTRDATA;  	// A:n (varies)  the value of a recipe attribute, any type of data including list
        int [] RCPBODY;  	// B:n (varies)  Recipe body
        unsigned long RMACK;  	// U1:1 (always)  recipe managment completion code
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 5 || list0[0] != "L:4") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { RCPSPEC = list1[1];} else { RCPSPEC = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t m=1; m < list1.size(); m++) {
            vector<string> list2;
            sp->listSplit(list1[m], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { RCPATTRID = list3[1];} else { RCPATTRID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { RCPATTRDATA = list3[1];} else { RCPATTRDATA = ""; }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        vector<int> RCPBODY;
        for(size_t i=0; i < RCPBODY.size(); i++) {
            RCPBODY.push_back(sp->binToInt(list1[1+i].c_str()));
            }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "U1:1" ) { ok = false; break; }
        RMACK = atoul(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if ( list2.size() < 1) { ok=false; break; }
        for(size_t p=1; p < list2.size(); p++) {
            vector<string> list3;
            sp->listSplit(list2[p], list3);
            if ( list3.size() != 3 || list3[0] != "L:2") { ok=false; break; }
            vector<string> list4;
            sp->listSplit(list3[1], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { ERRCODE = list4[1];} else { ERRCODE = ""; }
            list4.clear();
            sp->listSplit(list3[2], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0].find("A:") != 0 ) { ok = false; break; }
            if ( list4.size() == 2) { ERRTEXT = list4[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S15F33RRecipe Select Req Sent by Host Only

using namespace std;

    // S15F33R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 15, 33, ::recvS15F33R);

// receive method 
void recvS15F33R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:3 DATAID RESPEC {L:r {L:2 RCPID {L:p {L:2 RCPPARNM RCPPARVAL}}}} 
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string RESPEC;  	// A:n (always)  object specifier for the recipe executor
        string RCPID;  	// A:n (always)  recipe identifier conforming to OBJSPEC
        string RCPPARNM;  	// A:256 (always)  the name of a recipe variable parameter
        string RCPPARVAL;  	// A:80 (varies)  the value of a recipe variable parameter, any scalar format type
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { RESPEC = list1[1];} else { RESPEC = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t r=1; r < list1.size(); r++) {
            vector<string> list2;
            sp->listSplit(list1[r], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { RCPID = list3[1];} else { RCPID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if ( list3.size() < 1) { ok=false; break; }
            for(size_t p=1; p < list3.size(); p++) {
                vector<string> list4;
                sp->listSplit(list3[p], list4);
                if ( list4.size() != 3 || list4[0] != "L:2") { ok=false; break; }
                vector<string> list5;
                sp->listSplit(list4[1], list5);
                if (list5.size() < 1) { ok = false; break; }
                if ( list5[0].find("A:") != 0 ) { ok = false; break; }
                if ( list5.size() == 2) { RCPPARNM = list5[1];} else { RCPPARNM = ""; }
                list5.clear();
                sp->listSplit(list4[2], list5);
                if (list5.size() < 1) { ok = false; break; }
                if ( list5.size() == 2) { RCPPARVAL = list5[1];} else { RCPPARVAL = ""; }
                }
            if (!ok) break;
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(15, 34, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S15F33R

S15F34Recipe Select Ack Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S15F34 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(15, 33, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 RMACK {L:p {L:2 ERRCODE ERRTEXT}}
        // variables for data items and parsing
        unsigned long RMACK;  	// U1:1 (always)  recipe managment completion code
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        RMACK = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t p=1; p < list1.size(); p++) {
            vector<string> list2;
            sp->listSplit(list1[p], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ERRCODE = list3[1];} else { ERRCODE = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { ERRTEXT = list3[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S15F35RRecipe Delete Req Sent by Host Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S15F35R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 15, 35, ::recvS15F35R);

// receive method 
void recvS15F35R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:4 DATAID RESPEC RCPDEL {L:n RCPID}
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string RESPEC;  	// A:n (always)  object specifier for the recipe executor
        unsigned long RCPDEL;  	// U1:1 (always)  recipe action
        string RCPID;  	// A:n (always)  recipe identifier conforming to OBJSPEC
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 5 || list0[0] != "L:4") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { RESPEC = list1[1];} else { RESPEC = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        RCPDEL = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[4], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { RCPID = list2[1];} else { RCPID = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(15, 36, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S15F35R

S15F36Recipe Delete Ack Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S15F36 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(15, 35, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 RMACK {L:p {L:2 ERRCODE ERRTEXT}}
        // variables for data items and parsing
        unsigned long RMACK;  	// U1:1 (always)  recipe managment completion code
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        RMACK = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t p=1; p < list1.size(); p++) {
            vector<string> list2;
            sp->listSplit(list1[p], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ERRCODE = list3[1];} else { ERRCODE = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { ERRTEXT = list3[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S15F37RDRNS Segment Approve Action Req Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S15F37R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 15, 37, ::recvS15F37R);

// receive method 
void recvS15F37R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:6 RMSEGSPEC OBJTOKEN RMGRNT OPID RCPID RMCHGTYPE
        // variables for data items and parsing
        string RMSEGSPEC;  	// A:n (always)  The object ID of a distributed recipe namespace segment
        unsigned long OBJTOKEN;  	// U4:1 (always)  token used for authorization
        int RMGRNT;  	// B:1 (always)  grant code, 0 ok
        string OPID;  	// U4:1 (varies)  operation identifier
        string RCPID;  	// A:n (always)  recipe identifier conforming to OBJSPEC
        string RMCHGTYPE;  	// U4:1 (varies)  type of change for a recipe
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 7 || list0[0] != "L:6") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { RMSEGSPEC = list1[1];} else { RMSEGSPEC = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U4:1" ) { ok = false; break; }
        OBJTOKEN = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        RMGRNT = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OPID = list1[1];} else { OPID = ""; }
        list1.clear();
        sp->listSplit(list0[5], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { RCPID = list1[1];} else { RCPID = ""; }
        list1.clear();
        sp->listSplit(list0[6], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { RMCHGTYPE = list1[1];} else { RMCHGTYPE = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(15, 38, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S15F37R

S15F38DRNS Segment Approve Action Ack Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S15F38 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(15, 37, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 RMACK {L:p {L:2 ERRCODE ERRTEXT}}
        // variables for data items and parsing
        unsigned long RMACK;  	// U1:1 (always)  recipe managment completion code
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        RMACK = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t p=1; p < list1.size(); p++) {
            vector<string> list2;
            sp->listSplit(list1[p], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ERRCODE = list3[1];} else { ERRCODE = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { ERRTEXT = list3[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S15F39RDRNS Recorder Seg Req Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S15F39R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 15, 39, ::recvS15F39R);

// receive method 
void recvS15F39R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:5 DATAID RMNSCMD RMRECSPEC RMSEGSPEC OBJTOKEN
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        unsigned long RMNSCMD;  	// U1:1 (always)  recipe namespace command
        string RMRECSPEC;  	// A:n (always)  object id of a distributed recipe namespace recorder
        string RMSEGSPEC;  	// A:n (always)  The object ID of a distributed recipe namespace segment
        unsigned long OBJTOKEN;  	// U4:1 (always)  token used for authorization
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 6 || list0[0] != "L:5") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        RMNSCMD = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { RMRECSPEC = list1[1];} else { RMRECSPEC = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { RMSEGSPEC = list1[1];} else { RMSEGSPEC = ""; }
        list1.clear();
        sp->listSplit(list0[5], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U4:1" ) { ok = false; break; }
        OBJTOKEN = atoul(list1[1].c_str());
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(15, 40, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S15F39R

S15F40DRNS Recorder Seg Ack Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S15F40 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(15, 39, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 RMACK {L:p {L:2 ERRCODE ERRTEXT}}
        // variables for data items and parsing
        unsigned long RMACK;  	// U1:1 (always)  recipe managment completion code
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        RMACK = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t p=1; p < list1.size(); p++) {
            vector<string> list2;
            sp->listSplit(list1[p], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ERRCODE = list3[1];} else { ERRCODE = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { ERRTEXT = list3[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S15F41RDRNS Recorder Mod Req Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S15F41R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 15, 41, ::recvS15F41R);

// receive method 
void recvS15F41R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:5 DATAID RMRECSPEC OBJTOKEN RMNSCMD {L:c RCPID RCPNEWID RMSEGSPEC RMCHGTYPE OPID TIMESTAMP RMREQUESTOR}
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string RMRECSPEC;  	// A:n (always)  object id of a distributed recipe namespace recorder
        unsigned long OBJTOKEN;  	// U4:1 (always)  token used for authorization
        unsigned long RMNSCMD;  	// U1:1 (always)  recipe namespace command
        string RCPID;  	// A:n (always)  recipe identifier conforming to OBJSPEC
        string RCPNEWID;  	// A:n (always)  the new recipe identifier
        string RMSEGSPEC;  	// A:n (always)  The object ID of a distributed recipe namespace segment
        string RMCHGTYPE;  	// U4:1 (varies)  type of change for a recipe
        string OPID;  	// U4:1 (varies)  operation identifier
        string TIMESTAMP;  	// A:32 (always)  ECV TimeFormat controls format, 0=A:12 YYMMDDHHMMSS, 1=A:16 YYYYMMDDHHMMSScc,2=YYYY-MM-DDTHH:MM:SS.s[s]*{Z|+hh:mm|-hh:mm}
        int RMREQUESTOR;  	// TF:1 (always)  True when the initiator of a change request is an attached segment, otherwise false
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 6 || list0[0] != "L:5") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { RMRECSPEC = list1[1];} else { RMRECSPEC = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U4:1" ) { ok = false; break; }
        OBJTOKEN = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        RMNSCMD = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[5], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t c=1; c < list1.size(); c++) {
            vector<string> list2;
            sp->listSplit(list1[c], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { RCPID = list2[1];} else { RCPID = ""; }
            list2.clear();
            sp->listSplit(list1[c], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { RCPNEWID = list2[1];} else { RCPNEWID = ""; }
            list2.clear();
            sp->listSplit(list1[c], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { RMSEGSPEC = list2[1];} else { RMSEGSPEC = ""; }
            list2.clear();
            sp->listSplit(list1[c], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { RMCHGTYPE = list2[1];} else { RMCHGTYPE = ""; }
            list2.clear();
            sp->listSplit(list1[c], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { OPID = list2[1];} else { OPID = ""; }
            list2.clear();
            sp->listSplit(list1[c], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { TIMESTAMP = list2[1];} else { TIMESTAMP = ""; }
            list2.clear();
            sp->listSplit(list1[c], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0] != "TF:1" ) { ok = false; break; }
            RMREQUESTOR = atoi(list2[1].c_str());
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(15, 42, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S15F41R

S15F42DRNS Recorder Mod Ack Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S15F42 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(15, 41, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 RMACK {L:p {L:2 ERRCODE ERRTEXT}}
        // variables for data items and parsing
        unsigned long RMACK;  	// U1:1 (always)  recipe managment completion code
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        RMACK = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t p=1; p < list1.size(); p++) {
            vector<string> list2;
            sp->listSplit(list1[p], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ERRCODE = list3[1];} else { ERRCODE = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { ERRTEXT = list3[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S15F43RDRNS Get Change Req Sent by Host and Equipment

using namespace std;

    // S15F43R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 15, 43, ::recvS15F43R);

// receive method 
void recvS15F43R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:3 DATAID OBJSPEC TARGETSPEC
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string OBJSPEC;  	// A:n (varies)  E39 structured text identifying an object, [object type:object id>]+
        string TARGETSPEC;  	// A:40 (always)  Specifier of target object
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJSPEC = list1[1];} else { OBJSPEC = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { TARGETSPEC = list1[1];} else { TARGETSPEC = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(15, 44, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S15F43R

S15F44DRNS Get Change Ack Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S15F44 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(15, 43, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 {L:n {L:7 RCPID RCPNEWID RMSEGSPEC RMCHGTYPE OPID TIMESTAMP RMREQUESTOR}} {L:2 RMACK {L:p {L:2 ERRCODE ERRTEXT}}}
        // variables for data items and parsing
        string RCPID;  	// A:n (always)  recipe identifier conforming to OBJSPEC
        string RCPNEWID;  	// A:n (always)  the new recipe identifier
        string RMSEGSPEC;  	// A:n (always)  The object ID of a distributed recipe namespace segment
        string RMCHGTYPE;  	// U4:1 (varies)  type of change for a recipe
        string OPID;  	// U4:1 (varies)  operation identifier
        string TIMESTAMP;  	// A:32 (always)  ECV TimeFormat controls format, 0=A:12 YYMMDDHHMMSS, 1=A:16 YYYYMMDDHHMMSScc,2=YYYY-MM-DDTHH:MM:SS.s[s]*{Z|+hh:mm|-hh:mm}
        int RMREQUESTOR;  	// TF:1 (always)  True when the initiator of a change request is an attached segment, otherwise false
        unsigned long RMACK;  	// U1:1 (always)  recipe managment completion code
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 8 || list2[0] != "L:7") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { RCPID = list3[1];} else { RCPID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { RCPNEWID = list3[1];} else { RCPNEWID = ""; }
            list3.clear();
            sp->listSplit(list2[3], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { RMSEGSPEC = list3[1];} else { RMSEGSPEC = ""; }
            list3.clear();
            sp->listSplit(list2[4], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { RMCHGTYPE = list3[1];} else { RMCHGTYPE = ""; }
            list3.clear();
            sp->listSplit(list2[5], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { OPID = list3[1];} else { OPID = ""; }
            list3.clear();
            sp->listSplit(list2[6], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { TIMESTAMP = list3[1];} else { TIMESTAMP = ""; }
            list3.clear();
            sp->listSplit(list2[7], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "TF:1" ) { ok = false; break; }
            RMREQUESTOR = atoi(list3[1].c_str());
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "U1:1" ) { ok = false; break; }
        RMACK = atoul(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if ( list2.size() < 1) { ok=false; break; }
        for(size_t p=1; p < list2.size(); p++) {
            vector<string> list3;
            sp->listSplit(list2[p], list3);
            if ( list3.size() != 3 || list3[0] != "L:2") { ok=false; break; }
            vector<string> list4;
            sp->listSplit(list3[1], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { ERRCODE = list4[1];} else { ERRCODE = ""; }
            list4.clear();
            sp->listSplit(list3[2], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0].find("A:") != 0 ) { ok = false; break; }
            if ( list4.size() == 2) { ERRTEXT = list4[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S15F45RDRNS Mgr Seg Aprvl Req Sent by Host and Equipment

using namespace std;

    // S15F45R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 15, 45, ::recvS15F45R);

// receive method 
void recvS15F45R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:4 DATAID RCPSPEC RCPNEWID RMCHGTYPE
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string RCPSPEC;  	// A:n (always)  recipe specifier
        string RCPNEWID;  	// A:n (always)  the new recipe identifier
        string RMCHGTYPE;  	// U4:1 (varies)  type of change for a recipe
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 5 || list0[0] != "L:4") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { RCPSPEC = list1[1];} else { RCPSPEC = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { RCPNEWID = list1[1];} else { RCPNEWID = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { RMCHGTYPE = list1[1];} else { RMCHGTYPE = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(15, 46, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S15F45R

S15F46DRNS Mgr Seg Aprvl Ack Sent by Host and Equipment

using namespace std;

    // S15F46 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(15, 45, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:3 RMCHGTYPE RMGRNT OPID
        // variables for data items and parsing
        string RMCHGTYPE;  	// U4:1 (varies)  type of change for a recipe
        int RMGRNT;  	// B:1 (always)  grant code, 0 ok
        string OPID;  	// U4:1 (varies)  operation identifier
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { RMCHGTYPE = list1[1];} else { RMCHGTYPE = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        RMGRNT = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OPID = list1[1];} else { OPID = ""; }
        return;  // parsed ok
        } // end while(ok)

S15F47RDRNS Mgr Rebuild Req Sent by Host and Equipment

using namespace std;

    // S15F47R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 15, 47, ::recvS15F47R);

// receive method 
void recvS15F47R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:5 DATAID OBJSPEC RMNSSPEC RMRECSPEC {L:n RMSEGSPEC}
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string OBJSPEC;  	// A:n (varies)  E39 structured text identifying an object, [object type:object id>]+
        string RMNSSPEC;  	// A:n (always)  object id of a recipe namespace
        string RMRECSPEC;  	// A:n (always)  object id of a distributed recipe namespace recorder
        string RMSEGSPEC;  	// A:n (always)  The object ID of a distributed recipe namespace segment
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 6 || list0[0] != "L:5") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJSPEC = list1[1];} else { OBJSPEC = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { RMNSSPEC = list1[1];} else { RMNSSPEC = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { RMRECSPEC = list1[1];} else { RMRECSPEC = ""; }
        list1.clear();
        sp->listSplit(list0[5], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { RMSEGSPEC = list2[1];} else { RMSEGSPEC = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(15, 48, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S15F47R

S15F48DRNS Mgr Rebuild Ack Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S15F48 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(15, 47, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 RMACK {L:p {L:2 ERRCODE ERRTEXT}}
        // variables for data items and parsing
        unsigned long RMACK;  	// U1:1 (always)  recipe managment completion code
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        RMACK = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t p=1; p < list1.size(); p++) {
            vector<string> list2;
            sp->listSplit(list1[p], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ERRCODE = list3[1];} else { ERRCODE = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { ERRTEXT = list3[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S15F49RLarge Recipe Download Req Sent by Host Only

using namespace std;

    // S15F49R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 15, 49, ::recvS15F49R);

// receive method 
void recvS15F49R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 DSNAME RCPOWCODE
        // variables for data items and parsing
        string DSNAME;  	// A:50 (varies)  the name of a dataset such as a PPID
        int RCPOWCODE;  	// TF:1 (always)  recipe overwrite code, true=overwrite ok, false=do not overwrite
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DSNAME = list1[1];} else { DSNAME = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "TF:1" ) { ok = false; break; }
        RCPOWCODE = atoi(list1[1].c_str());
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(15, 50, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S15F49R

S15F50Large Recipe Download Ack Sent by Equipment Only

using namespace std;

    // S15F50 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(15, 49, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect ACKC15
        // variables for data items and parsing
        int ACKC15;  	// B:1 (always)  acknowledge code, 0 ok
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        ACKC15 = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S15F51RLarge Recipe Upload Req Sent by Host Only

using namespace std;

    // S15F51R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 15, 51, ::recvS15F51R);

// receive method 
void recvS15F51R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect DSNAME
        // variables for data items and parsing
        string DSNAME;  	// A:50 (varies)  the name of a dataset such as a PPID
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0.size() == 2) { DSNAME = list0[1];} else { DSNAME = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(15, 52, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S15F51R

S15F52Large Recipe Upload Ack Sent by Equipment Only

using namespace std;

    // S15F52 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(15, 51, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect ACKC15
        // variables for data items and parsing
        int ACKC15;  	// B:1 (always)  acknowledge code, 0 ok
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        ACKC15 = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S15F53RRecipe Verification Send Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S15F53R C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 15, 53, ::recvS15F53R);

// receive method 
void recvS15F53R(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:3 RCPSPEC RCPID {L:2 RMACK {L:n {L:2 ERRCODE ERRTEXT}}}
        // variables for data items and parsing
        string RCPSPEC;  	// A:n (always)  recipe specifier
        string RCPID;  	// A:n (always)  recipe identifier conforming to OBJSPEC
        unsigned long RMACK;  	// U1:1 (always)  recipe managment completion code
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { RCPSPEC = list1[1];} else { RCPSPEC = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { RCPID = list1[1];} else { RCPID = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "U1:1" ) { ok = false; break; }
        RMACK = atoul(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if ( list2.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list2.size(); n++) {
            vector<string> list3;
            sp->listSplit(list2[n], list3);
            if ( list3.size() != 3 || list3[0] != "L:2") { ok=false; break; }
            vector<string> list4;
            sp->listSplit(list3[1], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { ERRCODE = list4[1];} else { ERRCODE = ""; }
            list4.clear();
            sp->listSplit(list3[2], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0].find("A:") != 0 ) { ok = false; break; }
            if ( list4.size() == 2) { ERRTEXT = list4[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(15, 54, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S15F53R

S15F54Recipe Verification Ack Sent by Host Only

using namespace std;

    // S15F54 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(15, 53, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // no data expected
        return;  // parsed ok
        } // end while(ok)

S16F1RProcess Job Data MBI Sent by Host Only

using namespace std;

    // S16F1R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 16, 1, ::recvS16F1R);

// receive method 
void recvS16F1R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 DATAID DATALENGTH
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string DATALENGTH;  	// U4:1 (varies)  total bytes of the message body 
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATALENGTH = list1[1];} else { DATALENGTH = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(16, 2, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S16F1R

S16F2PJD MBI Grant Sent by Equipment Only

using namespace std;

    // S16F2 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(16, 1, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect GRANT
        // variables for data items and parsing
        int GRANT;  	// B:1 (always)  multiblock grant code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        GRANT = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S16F3RProcess Job Create Req Sent by Host Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S16F3R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 16, 3, ::recvS16F3R);

// receive method 
void recvS16F3R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:5 DATAID MF {L:n MID} {L:3 PRRECIPEMETHOD RCPSPEC {L:m {L:2 RCPPARNM RCPPARVAL}}} PRPROCESSSTART
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string MF;  	// B:1 (varies)  material format code, ASCII indicates generic units, E40 restricts to B:1
        string MID;  	// A:16 (varies)  material ID, E40 restricts to A:n
        unsigned long PRRECIPEMETHOD;  	// U1:1 (always)  recipe type
        string RCPSPEC;  	// A:n (always)  recipe specifier
        string RCPPARNM;  	// A:256 (always)  the name of a recipe variable parameter
        string RCPPARVAL;  	// A:80 (varies)  the value of a recipe variable parameter, any scalar format type
        int PRPROCESSSTART;  	// TF:1 (always)  automatic start flag, false implies manual start
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 6 || list0[0] != "L:5") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { MF = list1[1];} else { MF = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { MID = list2[1];} else { MID = ""; }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[4], list1);
        if ( list1.size() != 4 || list1[0] != "L:3") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "U1:1" ) { ok = false; break; }
        PRRECIPEMETHOD = atoul(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0].find("A:") != 0 ) { ok = false; break; }
        if ( list2.size() == 2) { RCPSPEC = list2[1];} else { RCPSPEC = ""; }
        list2.clear();
        sp->listSplit(list1[3], list2);
        if ( list2.size() < 1) { ok=false; break; }
        for(size_t m=1; m < list2.size(); m++) {
            vector<string> list3;
            sp->listSplit(list2[m], list3);
            if ( list3.size() != 3 || list3[0] != "L:2") { ok=false; break; }
            vector<string> list4;
            sp->listSplit(list3[1], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0].find("A:") != 0 ) { ok = false; break; }
            if ( list4.size() == 2) { RCPPARNM = list4[1];} else { RCPPARNM = ""; }
            list4.clear();
            sp->listSplit(list3[2], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { RCPPARVAL = list4[1];} else { RCPPARVAL = ""; }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[5], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "TF:1" ) { ok = false; break; }
        PRPROCESSSTART = atoi(list1[1].c_str());
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(16, 4, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S16F3R

S16F4Process Job Create Ack Sent by Equipment Only

using namespace std;

    // S16F4 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(16, 3, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 PRJOBID {L:2 ACKA {L:n {L:2 ERRCODE ERRTEXT}}}
        // variables for data items and parsing
        string PRJOBID;  	// A:n (always)  process job identifier
        int ACKA;  	// TF:1 (always)  request success
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { PRJOBID = list1[1];} else { PRJOBID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "TF:1" ) { ok = false; break; }
        ACKA = atoi(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if ( list2.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list2.size(); n++) {
            vector<string> list3;
            sp->listSplit(list2[n], list3);
            if ( list3.size() != 3 || list3[0] != "L:2") { ok=false; break; }
            vector<string> list4;
            sp->listSplit(list3[1], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { ERRCODE = list4[1];} else { ERRCODE = ""; }
            list4.clear();
            sp->listSplit(list3[2], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0].find("A:") != 0 ) { ok = false; break; }
            if ( list4.size() == 2) { ERRTEXT = list4[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S16F5RProcess Job Cmd Req Sent by Host Only

using namespace std;

    // S16F5R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 16, 5, ::recvS16F5R);

// receive method 
void recvS16F5R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:4 DATAID PRJOBID PRCMDNAME {L:n {L:2 CPNAME CPVAL}}
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string PRJOBID;  	// A:n (always)  process job identifier
        string PRCMDNAME;  	// A:6 (always)  process job commands, START, STOP, PAUSE, RESUME, ABORT, CANCEL
        string CPNAME;  	// A:n (varies)  command parameter name
        string CPVAL;  	// A:n (varies)  command parameter value, any scalar type
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 5 || list0[0] != "L:4") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { PRJOBID = list1[1];} else { PRJOBID = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { PRCMDNAME = list1[1];} else { PRCMDNAME = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { CPNAME = list3[1];} else { CPNAME = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { CPVAL = list3[1];} else { CPVAL = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(16, 6, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S16F5R

S16F6Process Job Cmd Ack Sent by Equipment Only

using namespace std;

    // S16F6 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(16, 5, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 PRJOBID {L:2 ACKA {L:n {L:2 ERRCODE ERRTEXT}}}
        // variables for data items and parsing
        string PRJOBID;  	// A:n (always)  process job identifier
        int ACKA;  	// TF:1 (always)  request success
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { PRJOBID = list1[1];} else { PRJOBID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "TF:1" ) { ok = false; break; }
        ACKA = atoi(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if ( list2.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list2.size(); n++) {
            vector<string> list3;
            sp->listSplit(list2[n], list3);
            if ( list3.size() != 3 || list3[0] != "L:2") { ok=false; break; }
            vector<string> list4;
            sp->listSplit(list3[1], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { ERRCODE = list4[1];} else { ERRCODE = ""; }
            list4.clear();
            sp->listSplit(list3[2], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0].find("A:") != 0 ) { ok = false; break; }
            if ( list4.size() == 2) { ERRTEXT = list4[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S16F7[R]Process Job Alert Notify Sent by Equipment Only

using namespace std;

    // S16F7 C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 16, 7, ::recvS16F7);

// receive method 
void recvS16F7(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:4 TIMESTAMP PRJOBID PRJOBMILESTONE {L:2 ACKA {L:n {L:2 ERRCODE ERRTEXT}}}
        // variables for data items and parsing
        string TIMESTAMP;  	// A:32 (always)  ECV TimeFormat controls format, 0=A:12 YYMMDDHHMMSS, 1=A:16 YYYYMMDDHHMMSScc,2=YYYY-MM-DDTHH:MM:SS.s[s]*{Z|+hh:mm|-hh:mm}
        string PRJOBID;  	// A:n (always)  process job identifier
        string PRJOBMILESTONE;  	// U1:1 (varies)  process job status 
        int ACKA;  	// TF:1 (always)  request success
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 5 || list0[0] != "L:4") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { TIMESTAMP = list1[1];} else { TIMESTAMP = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { PRJOBID = list1[1];} else { PRJOBID = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { PRJOBMILESTONE = list1[1];} else { PRJOBMILESTONE = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "TF:1" ) { ok = false; break; }
        ACKA = atoi(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if ( list2.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list2.size(); n++) {
            vector<string> list3;
            sp->listSplit(list2[n], list3);
            if ( list3.size() != 3 || list3[0] != "L:2") { ok=false; break; }
            vector<string> list4;
            sp->listSplit(list3[1], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { ERRCODE = list4[1];} else { ERRCODE = ""; }
            list4.clear();
            sp->listSplit(list3[2], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0].find("A:") != 0 ) { ok = false; break; }
            if ( list4.size() == 2) { ERRTEXT = list4[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(16, 8, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S16F7

S16F8Process Job Alert Ack Sent by Host Only

using namespace std;

    // S16F8 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(16, 7, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // no data expected
        return;  // parsed ok
        } // end while(ok)

S16F9[R]Process Job Event Notify Sent by Equipment Only

using namespace std;

    // S16F9 C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 16, 9, ::recvS16F9);

// receive method 
void recvS16F9(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:4 PREVENTID TIMESTAMP PRJOBID {L:n {L:2 VID V}}
        // variables for data items and parsing
        string PREVENTID;  	// U1:1 (varies)  process job event ID
        string TIMESTAMP;  	// A:32 (always)  ECV TimeFormat controls format, 0=A:12 YYMMDDHHMMSS, 1=A:16 YYYYMMDDHHMMSScc,2=YYYY-MM-DDTHH:MM:SS.s[s]*{Z|+hh:mm|-hh:mm}
        string PRJOBID;  	// A:n (always)  process job identifier
        string VID;  	// A:n (varies)  A variable ID
        string V;  	// A:n (varies)  variable value, any type including list
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 5 || list0[0] != "L:4") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { PREVENTID = list1[1];} else { PREVENTID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { TIMESTAMP = list1[1];} else { TIMESTAMP = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { PRJOBID = list1[1];} else { PRJOBID = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { VID = list3[1];} else { VID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { V = list3[1];} else { V = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(16, 10, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S16F9

S16F10Process Job Event Ack Sent by Host Only

using namespace std;

    // S16F10 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(16, 9, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // no data expected
        return;  // parsed ok
        } // end while(ok)

S16F11RPRJobCreateEnh Sent by Host Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S16F11R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 16, 11, ::recvS16F11R);

// receive method 
void recvS16F11R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:7 DATAID PRJOBID MF {L:n {L:2 CARRIERID {L:j SLOTID}}} {L:3 PRRECIPEMETHOD RCPSPEC {L:m {L:2 RCPPARNM RCPPARVAL}}} PRPROCESSSTART {L:p PRPAUSEEVENTID}
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string PRJOBID;  	// A:n (always)  process job identifier
        string MF;  	// B:1 (varies)  material format code, ASCII indicates generic units, E40 restricts to B:1
        string CARRIERID;  	// A:n (always)  carrier ID
        unsigned long SLOTID;  	// U1:1 (always)  slot position within a carrier
        unsigned long PRRECIPEMETHOD;  	// U1:1 (always)  recipe type
        string RCPSPEC;  	// A:n (always)  recipe specifier
        string RCPPARNM;  	// A:256 (always)  the name of a recipe variable parameter
        string RCPPARVAL;  	// A:80 (varies)  the value of a recipe variable parameter, any scalar format type
        int PRPROCESSSTART;  	// TF:1 (always)  automatic start flag, false implies manual start
        string PRPAUSEEVENTID;  	// U4:1 (varies)  an event identifier for which a process job should be paused
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 8 || list0[0] != "L:7") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { PRJOBID = list1[1];} else { PRJOBID = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { MF = list1[1];} else { MF = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { CARRIERID = list3[1];} else { CARRIERID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if ( list3.size() < 1) { ok=false; break; }
            for(size_t j=1; j < list3.size(); j++) {
                vector<string> list4;
                sp->listSplit(list3[j], list4);
                if (list4.size() < 1) { ok = false; break; }
                if ( list4[0] != "U1:1" ) { ok = false; break; }
                SLOTID = atoul(list4[1].c_str());
                }
            if (!ok) break;
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[5], list1);
        if ( list1.size() != 4 || list1[0] != "L:3") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "U1:1" ) { ok = false; break; }
        PRRECIPEMETHOD = atoul(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0].find("A:") != 0 ) { ok = false; break; }
        if ( list2.size() == 2) { RCPSPEC = list2[1];} else { RCPSPEC = ""; }
        list2.clear();
        sp->listSplit(list1[3], list2);
        if ( list2.size() < 1) { ok=false; break; }
        for(size_t m=1; m < list2.size(); m++) {
            vector<string> list3;
            sp->listSplit(list2[m], list3);
            if ( list3.size() != 3 || list3[0] != "L:2") { ok=false; break; }
            vector<string> list4;
            sp->listSplit(list3[1], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0].find("A:") != 0 ) { ok = false; break; }
            if ( list4.size() == 2) { RCPPARNM = list4[1];} else { RCPPARNM = ""; }
            list4.clear();
            sp->listSplit(list3[2], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { RCPPARVAL = list4[1];} else { RCPPARVAL = ""; }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[6], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "TF:1" ) { ok = false; break; }
        PRPROCESSSTART = atoi(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[7], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t p=1; p < list1.size(); p++) {
            vector<string> list2;
            sp->listSplit(list1[p], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { PRPAUSEEVENTID = list2[1];} else { PRPAUSEEVENTID = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(16, 12, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S16F11R

S16F12PRJobCreateEnh Ack Sent by Equipment Only

using namespace std;

    // S16F12 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(16, 11, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 PRJOBID {L:2 ACKA {L:n {L:2 ERRCODE ERRTEXT}}}
        // variables for data items and parsing
        string PRJOBID;  	// A:n (always)  process job identifier
        int ACKA;  	// TF:1 (always)  request success
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { PRJOBID = list1[1];} else { PRJOBID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "TF:1" ) { ok = false; break; }
        ACKA = atoi(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if ( list2.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list2.size(); n++) {
            vector<string> list3;
            sp->listSplit(list2[n], list3);
            if ( list3.size() != 3 || list3[0] != "L:2") { ok=false; break; }
            vector<string> list4;
            sp->listSplit(list3[1], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { ERRCODE = list4[1];} else { ERRCODE = ""; }
            list4.clear();
            sp->listSplit(list3[2], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0].find("A:") != 0 ) { ok = false; break; }
            if ( list4.size() == 2) { ERRTEXT = list4[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S16F15RPRJobMultiCreate Sent by Host Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S16F15R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 16, 15, ::recvS16F15R);

// receive method 
void recvS16F15R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 DATAID {L:p {L:6 PRJOBID MF {L:n {L:2 CARRIERID {L:j SLOTID}}} {L:3 PRRECIPEMETHOD RCPSPEC {L:m {L:2 RCPPARNM RCPPARVAL}}} PRPROCESSSTART {L:k PRPAUSEEVENTID}}}
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string PRJOBID;  	// A:n (always)  process job identifier
        string MF;  	// B:1 (varies)  material format code, ASCII indicates generic units, E40 restricts to B:1
        string CARRIERID;  	// A:n (always)  carrier ID
        unsigned long SLOTID;  	// U1:1 (always)  slot position within a carrier
        unsigned long PRRECIPEMETHOD;  	// U1:1 (always)  recipe type
        string RCPSPEC;  	// A:n (always)  recipe specifier
        string RCPPARNM;  	// A:256 (always)  the name of a recipe variable parameter
        string RCPPARVAL;  	// A:80 (varies)  the value of a recipe variable parameter, any scalar format type
        int PRPROCESSSTART;  	// TF:1 (always)  automatic start flag, false implies manual start
        string PRPAUSEEVENTID;  	// U4:1 (varies)  an event identifier for which a process job should be paused
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t p=1; p < list1.size(); p++) {
            vector<string> list2;
            sp->listSplit(list1[p], list2);
            if ( list2.size() != 7 || list2[0] != "L:6") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { PRJOBID = list3[1];} else { PRJOBID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { MF = list3[1];} else { MF = ""; }
            list3.clear();
            sp->listSplit(list2[3], list3);
            if ( list3.size() < 1) { ok=false; break; }
            for(size_t n=1; n < list3.size(); n++) {
                vector<string> list4;
                sp->listSplit(list3[n], list4);
                if ( list4.size() != 3 || list4[0] != "L:2") { ok=false; break; }
                vector<string> list5;
                sp->listSplit(list4[1], list5);
                if (list5.size() < 1) { ok = false; break; }
                if ( list5[0].find("A:") != 0 ) { ok = false; break; }
                if ( list5.size() == 2) { CARRIERID = list5[1];} else { CARRIERID = ""; }
                list5.clear();
                sp->listSplit(list4[2], list5);
                if ( list5.size() < 1) { ok=false; break; }
                for(size_t j=1; j < list5.size(); j++) {
                    vector<string> list6;
                    sp->listSplit(list5[j], list6);
                    if (list6.size() < 1) { ok = false; break; }
                    if ( list6[0] != "U1:1" ) { ok = false; break; }
                    SLOTID = atoul(list6[1].c_str());
                    }
                if (!ok) break;
                }
            if (!ok) break;
            list3.clear();
            sp->listSplit(list2[4], list3);
            if ( list3.size() != 4 || list3[0] != "L:3") { ok=false; break; }
            vector<string> list4;
            sp->listSplit(list3[1], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0] != "U1:1" ) { ok = false; break; }
            PRRECIPEMETHOD = atoul(list4[1].c_str());
            list4.clear();
            sp->listSplit(list3[2], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0].find("A:") != 0 ) { ok = false; break; }
            if ( list4.size() == 2) { RCPSPEC = list4[1];} else { RCPSPEC = ""; }
            list4.clear();
            sp->listSplit(list3[3], list4);
            if ( list4.size() < 1) { ok=false; break; }
            for(size_t m=1; m < list4.size(); m++) {
                vector<string> list5;
                sp->listSplit(list4[m], list5);
                if ( list5.size() != 3 || list5[0] != "L:2") { ok=false; break; }
                vector<string> list6;
                sp->listSplit(list5[1], list6);
                if (list6.size() < 1) { ok = false; break; }
                if ( list6[0].find("A:") != 0 ) { ok = false; break; }
                if ( list6.size() == 2) { RCPPARNM = list6[1];} else { RCPPARNM = ""; }
                list6.clear();
                sp->listSplit(list5[2], list6);
                if (list6.size() < 1) { ok = false; break; }
                if ( list6.size() == 2) { RCPPARVAL = list6[1];} else { RCPPARVAL = ""; }
                }
            if (!ok) break;
            list3.clear();
            sp->listSplit(list2[5], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "TF:1" ) { ok = false; break; }
            PRPROCESSSTART = atoi(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[6], list3);
            if ( list3.size() < 1) { ok=false; break; }
            for(size_t k=1; k < list3.size(); k++) {
                vector<string> list4;
                sp->listSplit(list3[k], list4);
                if (list4.size() < 1) { ok = false; break; }
                if ( list4.size() == 2) { PRPAUSEEVENTID = list4[1];} else { PRPAUSEEVENTID = ""; }
                }
            if (!ok) break;
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(16, 16, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S16F15R

S16F16PRJobMultiCreate Ack Sent by Equipment Only

using namespace std;

    // S16F16 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(16, 15, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 {L:m PRJOBID} {L:2 ACKA {L:n {L:2 ERRCODE ERRTEXT}}}
        // variables for data items and parsing
        string PRJOBID;  	// A:n (always)  process job identifier
        int ACKA;  	// TF:1 (always)  request success
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t m=1; m < list1.size(); m++) {
            vector<string> list2;
            sp->listSplit(list1[m], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { PRJOBID = list2[1];} else { PRJOBID = ""; }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "TF:1" ) { ok = false; break; }
        ACKA = atoi(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if ( list2.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list2.size(); n++) {
            vector<string> list3;
            sp->listSplit(list2[n], list3);
            if ( list3.size() != 3 || list3[0] != "L:2") { ok=false; break; }
            vector<string> list4;
            sp->listSplit(list3[1], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { ERRCODE = list4[1];} else { ERRCODE = ""; }
            list4.clear();
            sp->listSplit(list3[2], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0].find("A:") != 0 ) { ok = false; break; }
            if ( list4.size() == 2) { ERRTEXT = list4[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S16F17RPRJobDequeue Sent by Host Only

using namespace std;

    // S16F17R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 16, 17, ::recvS16F17R);

// receive method 
void recvS16F17R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:m PRJOBID
        // variables for data items and parsing
        string PRJOBID;  	// A:n (always)  process job identifier
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t m=1; m < list0.size(); m++) {
            vector<string> list1;
            sp->listSplit(list0[m], list1);
            if (list1.size() < 1) { ok = false; break; }
            if ( list1[0].find("A:") != 0 ) { ok = false; break; }
            if ( list1.size() == 2) { PRJOBID = list1[1];} else { PRJOBID = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(16, 18, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S16F17R

S16F18PRJobDequeue Ack Sent by Equipment Only

using namespace std;

    // S16F18 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(16, 17, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 {L:m PRJOBID} {L:2 ACKA {L:n {L:2 ERRCODE ERRTEXT}}}
        // variables for data items and parsing
        string PRJOBID;  	// A:n (always)  process job identifier
        int ACKA;  	// TF:1 (always)  request success
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t m=1; m < list1.size(); m++) {
            vector<string> list2;
            sp->listSplit(list1[m], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { PRJOBID = list2[1];} else { PRJOBID = ""; }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "TF:1" ) { ok = false; break; }
        ACKA = atoi(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if ( list2.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list2.size(); n++) {
            vector<string> list3;
            sp->listSplit(list2[n], list3);
            if ( list3.size() != 3 || list3[0] != "L:2") { ok=false; break; }
            vector<string> list4;
            sp->listSplit(list3[1], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { ERRCODE = list4[1];} else { ERRCODE = ""; }
            list4.clear();
            sp->listSplit(list3[2], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0].find("A:") != 0 ) { ok = false; break; }
            if ( list4.size() == 2) { ERRTEXT = list4[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S16F19RPRJob List Req Sent by Host Only

using namespace std;

    // S16F19R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 16, 19, ::recvS16F19R);

// receive method 
void recvS16F19R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // no data expected
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(16, 20, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S16F19R

S16F20PRJob List Data Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S16F20 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(16, 19, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:m {L:2 PRJOBID PRSTATE}
        // variables for data items and parsing
        string PRJOBID;  	// A:n (always)  process job identifier
        unsigned long PRSTATE;  	// U1:1 (always)  process job state, E40 definition
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t m=1; m < list0.size(); m++) {
            vector<string> list1;
            sp->listSplit(list0[m], list1);
            if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
            vector<string> list2;
            sp->listSplit(list1[1], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { PRJOBID = list2[1];} else { PRJOBID = ""; }
            list2.clear();
            sp->listSplit(list1[2], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0] != "U1:1" ) { ok = false; break; }
            PRSTATE = atoul(list2[1].c_str());
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S16F21RPRJob Create Limit Req Sent by Host Only

using namespace std;

    // S16F21R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 16, 21, ::recvS16F21R);

// receive method 
void recvS16F21R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // no data expected
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(16, 22, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S16F21R

S16F22PRJob Create Limit Data Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S16F22 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(16, 21, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect PRJOBSPACE
        // variables for data items and parsing
        unsigned long PRJOBSPACE;  	// U2:1 (always)  the number of process jobs that can be created
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "U2:1" ) { ok = false; break; }
        PRJOBSPACE = atoul(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S16F23RPRJob Recipe Variable Set Sent by Host Only

using namespace std;

    // S16F23R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 16, 23, ::recvS16F23R);

// receive method 
void recvS16F23R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 PRJOBID {L:m {L:2 RCPPARNM RCPPARVAL}}
        // variables for data items and parsing
        string PRJOBID;  	// A:n (always)  process job identifier
        string RCPPARNM;  	// A:256 (always)  the name of a recipe variable parameter
        string RCPPARVAL;  	// A:80 (varies)  the value of a recipe variable parameter, any scalar format type
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { PRJOBID = list1[1];} else { PRJOBID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t m=1; m < list1.size(); m++) {
            vector<string> list2;
            sp->listSplit(list1[m], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { RCPPARNM = list3[1];} else { RCPPARNM = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { RCPPARVAL = list3[1];} else { RCPPARVAL = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(16, 24, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S16F23R

S16F24PRJob Recipe Variable Ack Sent by Host Only

using namespace std;

    // S16F24 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(16, 23, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 ACKA {L:n {L:2 ERRCODE ERRTEXT}}
        // variables for data items and parsing
        int ACKA;  	// TF:1 (always)  request success
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "TF:1" ) { ok = false; break; }
        ACKA = atoi(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ERRCODE = list3[1];} else { ERRCODE = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { ERRTEXT = list3[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S16F25RPRJob Start Method Set Sent by Host Only

using namespace std;

    // S16F25R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 16, 25, ::recvS16F25R);

// receive method 
void recvS16F25R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 {L:m PRJOBID} PRPROCESSSTART
        // variables for data items and parsing
        string PRJOBID;  	// A:n (always)  process job identifier
        int PRPROCESSSTART;  	// TF:1 (always)  automatic start flag, false implies manual start
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t m=1; m < list1.size(); m++) {
            vector<string> list2;
            sp->listSplit(list1[m], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { PRJOBID = list2[1];} else { PRJOBID = ""; }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "TF:1" ) { ok = false; break; }
        PRPROCESSSTART = atoi(list1[1].c_str());
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(16, 26, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S16F25R

S16F26PRJob Start Method Ack Sent by Equipment Only

using namespace std;

    // S16F26 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(16, 25, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 {L:m PRJOBID} {L:2 ACKA {L:n {L:2 ERRCODE ERRTEXT}}}
        // variables for data items and parsing
        string PRJOBID;  	// A:n (always)  process job identifier
        int ACKA;  	// TF:1 (always)  request success
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t m=1; m < list1.size(); m++) {
            vector<string> list2;
            sp->listSplit(list1[m], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { PRJOBID = list2[1];} else { PRJOBID = ""; }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "TF:1" ) { ok = false; break; }
        ACKA = atoi(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[2], list2);
        if ( list2.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list2.size(); n++) {
            vector<string> list3;
            sp->listSplit(list2[n], list3);
            if ( list3.size() != 3 || list3[0] != "L:2") { ok=false; break; }
            vector<string> list4;
            sp->listSplit(list3[1], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4.size() == 2) { ERRCODE = list4[1];} else { ERRCODE = ""; }
            list4.clear();
            sp->listSplit(list3[2], list4);
            if (list4.size() < 1) { ok = false; break; }
            if ( list4[0].find("A:") != 0 ) { ok = false; break; }
            if ( list4.size() == 2) { ERRTEXT = list4[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S16F27RControl Job Command Sent by Host Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S16F27R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 16, 27, ::recvS16F27R);

// receive method 
void recvS16F27R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:3 CTLJOBID CTLJOBCMD {L:2 CPNAME CPVAL}
        // variables for data items and parsing
        string CTLJOBID;  	// A:n (always)  control job ID, an OBJID
        unsigned long CTLJOBCMD;  	// U1:1 (always)  control job command
        string CPNAME;  	// A:n (varies)  command parameter name
        string CPVAL;  	// A:n (varies)  command parameter value, any scalar type
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { CTLJOBID = list1[1];} else { CTLJOBID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        CTLJOBCMD = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2.size() == 2) { CPNAME = list2[1];} else { CPNAME = ""; }
        list2.clear();
        sp->listSplit(list1[2], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2.size() == 2) { CPVAL = list2[1];} else { CPVAL = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(16, 28, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S16F27R

S16F28Control Job Command Ack Sent by Equipment Only

using namespace std;

    // S16F28 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(16, 27, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 ACKA {L:2 ERRCODE ERRTEXT}
        // variables for data items and parsing
        int ACKA;  	// TF:1 (always)  request success
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "TF:1" ) { ok = false; break; }
        ACKA = atoi(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() != 3 || list1[0] != "L:2") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2.size() == 2) { ERRCODE = list2[1];} else { ERRCODE = ""; }
        list2.clear();
        sp->listSplit(list1[2], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0].find("A:") != 0 ) { ok = false; break; }
        if ( list2.size() == 2) { ERRTEXT = list2[1];} else { ERRTEXT = ""; }
        return;  // parsed ok
        } // end while(ok)

S16F29PRSetMtrlOrder Sent by Host Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S16F29 C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 16, 29, ::recvS16F29);

// receive method 
void recvS16F29(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect PRMTRLORDER
        // variables for data items and parsing
        unsigned long PRMTRLORDER;  	// U1:1 (always)  ordering method for pending process jobs
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "U1:1" ) { ok = false; break; }
        PRMTRLORDER = atoul(list0[1].c_str());
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(16, 30, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S16F29

S16F30PRSetMtrlOrder Ack Sent by Equipment Only

using namespace std;

    // S16F30 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(16, 29, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect ACKA
        // variables for data items and parsing
        int ACKA;  	// TF:1 (always)  request success
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "TF:1" ) { ok = false; break; }
        ACKA = atoi(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S17F1RData Report Create Req Sent by Host Only

using namespace std;

    // S17F1R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 17, 1, ::recvS17F1R);

// receive method 
void recvS17F1R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:4 DATAID RPTID DATASRC {L:n VID}
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string RPTID;  	// U4:1 (varies)  report ID
        string DATASRC;  	// A:n (always)  identifies a data source, use length 0 to mean the default
        string VID;  	// A:n (varies)  A variable ID
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 5 || list0[0] != "L:4") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { RPTID = list1[1];} else { RPTID = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { DATASRC = list1[1];} else { DATASRC = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { VID = list2[1];} else { VID = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(17, 2, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S17F1R

S17F2Data Report Create Ack Sent by Equipment Only

using namespace std;

    // S17F2 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(17, 1, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 RPTID ERRCODE
        // variables for data items and parsing
        string RPTID;  	// U4:1 (varies)  report ID
        string ERRCODE;  	// U4:1 (varies)  error code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { RPTID = list1[1];} else { RPTID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { ERRCODE = list1[1];} else { ERRCODE = ""; }
        return;  // parsed ok
        } // end while(ok)

S17F3RData Report Delete Req Sent by Host Only

using namespace std;

    // S17F3R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 17, 3, ::recvS17F3R);

// receive method 
void recvS17F3R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:n RPTID
        // variables for data items and parsing
        string RPTID;  	// U4:1 (varies)  report ID
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if (list1.size() < 1) { ok = false; break; }
            if ( list1.size() == 2) { RPTID = list1[1];} else { RPTID = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(17, 4, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S17F3R

S17F4Data Report Del Ack Sent by Equipment Only

using namespace std;

    // S17F4 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(17, 3, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 ACKA {L:m {L:3 RPTID ERRCODE ERRTEXT}}
        // variables for data items and parsing
        int ACKA;  	// TF:1 (always)  request success
        string RPTID;  	// U4:1 (varies)  report ID
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "TF:1" ) { ok = false; break; }
        ACKA = atoi(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t m=1; m < list1.size(); m++) {
            vector<string> list2;
            sp->listSplit(list1[m], list2);
            if ( list2.size() != 4 || list2[0] != "L:3") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { RPTID = list3[1];} else { RPTID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ERRCODE = list3[1];} else { ERRCODE = ""; }
            list3.clear();
            sp->listSplit(list2[3], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { ERRTEXT = list3[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S17F5RTrace Create Req Sent by Host Only

using namespace std;

    // S17F5R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 17, 5, ::recvS17F5R);

// receive method 
void recvS17F5R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:6 DATAID TRID CEED {L:n RPTID} {L:8* TOTSMP REPGSZ EVNTSRC CEIDSTART EVNTSRC2 CEIDSTOP TRAUTOD RPTOC}
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string TRID;  	// A:n (varies)  trace request ID
        int CEED;  	// TF:1 (always)  collection event or trace enablement, true is enabled
        string RPTID;  	// U4:1 (varies)  report ID
        string TOTSMP;  	// U4:1 (varies)  total samples to be made, should be an even multiple of REPGSZ
        string REPGSZ;  	// U4:1 (varies)  reporting group size, TOTSMP modulo REPGSZ should be 0
        string EVNTSRC;  	// A:n (always)  identifies an event source, use length 0 to specify the default
        string CEIDSTART;  	// U4:1 (varies)  the CEID of a start event
        string EVNTSRC2;  	// A:n (always)  a second event source EVNTSRC
        string CEIDSTOP;  	// U4:1 (varies)  the CEID of a stop event
        int TRAUTOD;  	// TF:1 (always)  delete upon completion flag
        int RPTOC;  	// TF:1 (always)  send only changed data trace report flag
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 7 || list0[0] != "L:6") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { TRID = list1[1];} else { TRID = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "TF:1" ) { ok = false; break; }
        CEED = atoi(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[4], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { RPTID = list2[1];} else { RPTID = ""; }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[5], list1);
        if ( list1.size() == 9 ) {  // 8 optional items found
            vector<string> list2;
            sp->listSplit(list1[1], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { TOTSMP = list2[1];} else { TOTSMP = ""; }
            list2.clear();
            sp->listSplit(list1[2], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { REPGSZ = list2[1];} else { REPGSZ = ""; }
            list2.clear();
            sp->listSplit(list1[3], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { EVNTSRC = list2[1];} else { EVNTSRC = ""; }
            list2.clear();
            sp->listSplit(list1[4], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { CEIDSTART = list2[1];} else { CEIDSTART = ""; }
            list2.clear();
            sp->listSplit(list1[5], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { EVNTSRC2 = list2[1];} else { EVNTSRC2 = ""; }
            list2.clear();
            sp->listSplit(list1[6], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { CEIDSTOP = list2[1];} else { CEIDSTOP = ""; }
            list2.clear();
            sp->listSplit(list1[7], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0] != "TF:1" ) { ok = false; break; }
            TRAUTOD = atoi(list2[1].c_str());
            list2.clear();
            sp->listSplit(list1[8], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0] != "TF:1" ) { ok = false; break; }
            RPTOC = atoi(list2[1].c_str());
            }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(17, 6, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S17F5R

S17F6Trace Create Ack Sent by Equipment Only

using namespace std;

    // S17F6 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(17, 5, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 TRID ERRCODE
        // variables for data items and parsing
        string TRID;  	// A:n (varies)  trace request ID
        string ERRCODE;  	// U4:1 (varies)  error code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { TRID = list1[1];} else { TRID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { ERRCODE = list1[1];} else { ERRCODE = ""; }
        return;  // parsed ok
        } // end while(ok)

S17F7RTrace Delete Req Sent by Host Only

using namespace std;

    // S17F7R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 17, 7, ::recvS17F7R);

// receive method 
void recvS17F7R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:n TRID
        // variables for data items and parsing
        string TRID;  	// A:n (varies)  trace request ID
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if (list1.size() < 1) { ok = false; break; }
            if ( list1.size() == 2) { TRID = list1[1];} else { TRID = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(17, 8, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S17F7R

S17F8Trace Delete Ack Sent by Equipment Only

using namespace std;

    // S17F8 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(17, 7, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 ACKA {L:m {L:3 TRID ERRCODE ERRTEXT}}
        // variables for data items and parsing
        int ACKA;  	// TF:1 (always)  request success
        string TRID;  	// A:n (varies)  trace request ID
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "TF:1" ) { ok = false; break; }
        ACKA = atoi(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t m=1; m < list1.size(); m++) {
            vector<string> list2;
            sp->listSplit(list1[m], list2);
            if ( list2.size() != 4 || list2[0] != "L:3") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { TRID = list3[1];} else { TRID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ERRCODE = list3[1];} else { ERRCODE = ""; }
            list3.clear();
            sp->listSplit(list2[3], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { ERRTEXT = list3[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S17F9RCollection Event Link Req Sent by Host Only

using namespace std;

    // S17F9R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 17, 9, ::recvS17F9R);

// receive method 
void recvS17F9R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:4 DATAID EVNTSRC CEID {L:n RPTID}
        // variables for data items and parsing
        string DATAID;  	// U4:1 (varies)  an identifier to correlate related messages
        string EVNTSRC;  	// A:n (always)  identifies an event source, use length 0 to specify the default
        string CEID;  	// U4:1 (varies)  collection event identifier, GEM requires type Un
        string RPTID;  	// U4:1 (varies)  report ID
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 5 || list0[0] != "L:4") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATAID = list1[1];} else { DATAID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { EVNTSRC = list1[1];} else { EVNTSRC = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { CEID = list1[1];} else { CEID = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { RPTID = list2[1];} else { RPTID = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(17, 10, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S17F9R

S17F10Collection Event Link Ack Sent by Equipment Only

using namespace std;

    // S17F10 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(17, 9, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:3 EVNTSRC CEID ERRCODE
        // variables for data items and parsing
        string EVNTSRC;  	// A:n (always)  identifies an event source, use length 0 to specify the default
        string CEID;  	// U4:1 (varies)  collection event identifier, GEM requires type Un
        string ERRCODE;  	// U4:1 (varies)  error code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { EVNTSRC = list1[1];} else { EVNTSRC = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { CEID = list1[1];} else { CEID = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { ERRCODE = list1[1];} else { ERRCODE = ""; }
        return;  // parsed ok
        } // end while(ok)

S17F11RCollection Event Unlink Sent by Host Only

using namespace std;

    // S17F11R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 17, 11, ::recvS17F11R);

// receive method 
void recvS17F11R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:3 EVNTSRC CEID RPTID
        // variables for data items and parsing
        string EVNTSRC;  	// A:n (always)  identifies an event source, use length 0 to specify the default
        string CEID;  	// U4:1 (varies)  collection event identifier, GEM requires type Un
        string RPTID;  	// U4:1 (varies)  report ID
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { EVNTSRC = list1[1];} else { EVNTSRC = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { CEID = list1[1];} else { CEID = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { RPTID = list1[1];} else { RPTID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(17, 12, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S17F11R

S17F12Collection Event Unlink Ack Sent by Equipment Only

using namespace std;

    // S17F12 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(17, 11, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:4 EVNTSRC CEID RPTID ERRCODE
        // variables for data items and parsing
        string EVNTSRC;  	// A:n (always)  identifies an event source, use length 0 to specify the default
        string CEID;  	// U4:1 (varies)  collection event identifier, GEM requires type Un
        string RPTID;  	// U4:1 (varies)  report ID
        string ERRCODE;  	// U4:1 (varies)  error code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 5 || list0[0] != "L:4") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { EVNTSRC = list1[1];} else { EVNTSRC = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { CEID = list1[1];} else { CEID = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { RPTID = list1[1];} else { RPTID = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { ERRCODE = list1[1];} else { ERRCODE = ""; }
        return;  // parsed ok
        } // end while(ok)

S17F13RTrace Reset Req Sent by Host Only

using namespace std;

    // S17F13R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 17, 13, ::recvS17F13R);

// receive method 
void recvS17F13R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:n TRID
        // variables for data items and parsing
        string TRID;  	// A:n (varies)  trace request ID
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if (list1.size() < 1) { ok = false; break; }
            if ( list1.size() == 2) { TRID = list1[1];} else { TRID = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(17, 14, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S17F13R

S17F14Trace Reset Ack Sent by Equipment Only

using namespace std;

    // S17F14 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(17, 13, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 ACKA {L:m {L:3 TRID ERRCODE ERRTEXT}}
        // variables for data items and parsing
        int ACKA;  	// TF:1 (always)  request success
        string TRID;  	// A:n (varies)  trace request ID
        string ERRCODE;  	// U4:1 (varies)  error code
        string ERRTEXT;  	// A:80 (always)  description of ERRCODE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "TF:1" ) { ok = false; break; }
        ACKA = atoi(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t m=1; m < list1.size(); m++) {
            vector<string> list2;
            sp->listSplit(list1[m], list2);
            if ( list2.size() != 4 || list2[0] != "L:3") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { TRID = list3[1];} else { TRID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ERRCODE = list3[1];} else { ERRCODE = ""; }
            list3.clear();
            sp->listSplit(list2[3], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { ERRTEXT = list3[1];} else { ERRTEXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S18F1RRead Attribute Req Sent by Host Only

using namespace std;

    // S18F1R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 18, 1, ::recvS18F1R);

// receive method 
void recvS18F1R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 TARGETID {L:n ATTRID}
        // variables for data items and parsing
        string TARGETID;  	// A:n (always)  the OBJSPEC for the target object
        string ATTRID;  	// A:40 (varies)  identifies an attribute type, chars 0x20-0x7e but not >, :, ?, *, or ~.  Does not begin or end with space.
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { TARGETID = list1[1];} else { TARGETID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { ATTRID = list2[1];} else { ATTRID = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(18, 2, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S18F1R

S18F2Read Attribute Data Sent by Equipment Only

using namespace std;

    // S18F2 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(18, 1, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:4 TARGETID SSACK {L:n ATTRDATA} {L:s STATUS}
        // variables for data items and parsing
        string TARGETID;  	// A:n (always)  the OBJSPEC for the target object
        string SSACK;  	// A:2 (always)  two character codes for success or failure, NO Normal, EE exec. err, CE comm. err, HE h/w err, TE tag err
        string ATTRDATA;  	// A:n (varies)  a specific attribute value of any data type
        string STATUS;  	// A:n (always)  subsystem status data
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 5 || list0[0] != "L:4") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { TARGETID = list1[1];} else { TARGETID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { SSACK = list1[1];} else { SSACK = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { ATTRDATA = list2[1];} else { ATTRDATA = ""; }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[4], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t s=1; s < list1.size(); s++) {
            vector<string> list2;
            sp->listSplit(list1[s], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { STATUS = list2[1];} else { STATUS = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S18F3RWrite Attribute Req Sent by Host Only

using namespace std;

    // S18F3R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 18, 3, ::recvS18F3R);

// receive method 
void recvS18F3R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 TARGETID {L:n {L:2 ATTRID ATTRDATA}}
        // variables for data items and parsing
        string TARGETID;  	// A:n (always)  the OBJSPEC for the target object
        string ATTRID;  	// A:40 (varies)  identifies an attribute type, chars 0x20-0x7e but not >, :, ?, *, or ~.  Does not begin or end with space.
        string ATTRDATA;  	// A:n (varies)  a specific attribute value of any data type
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { TARGETID = list1[1];} else { TARGETID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ATTRID = list3[1];} else { ATTRID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ATTRDATA = list3[1];} else { ATTRDATA = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(18, 4, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S18F3R

S18F4Write Attribute Ack Sent by Equipment Only

using namespace std;

    // S18F4 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(18, 3, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:3 TARGETID SSACK {L:s STATUS}
        // variables for data items and parsing
        string TARGETID;  	// A:n (always)  the OBJSPEC for the target object
        string SSACK;  	// A:2 (always)  two character codes for success or failure, NO Normal, EE exec. err, CE comm. err, HE h/w err, TE tag err
        string STATUS;  	// A:n (always)  subsystem status data
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { TARGETID = list1[1];} else { TARGETID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { SSACK = list1[1];} else { SSACK = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t s=1; s < list1.size(); s++) {
            vector<string> list2;
            sp->listSplit(list1[s], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { STATUS = list2[1];} else { STATUS = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S18F5RRead Request Sent by Host Only

using namespace std;

    // S18F5R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 18, 5, ::recvS18F5R);

// receive method 
void recvS18F5R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:3 TARGETID DATASEG DATALENGTH
        // variables for data items and parsing
        string TARGETID;  	// A:n (always)  the OBJSPEC for the target object
        string DATASEG;  	// A:n (varies)  identifies data requested, E87 requires text
        string DATALENGTH;  	// U4:1 (varies)  total bytes of the message body 
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { TARGETID = list1[1];} else { TARGETID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATASEG = list1[1];} else { DATASEG = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATALENGTH = list1[1];} else { DATALENGTH = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(18, 6, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S18F5R

S18F6Read Data Sent by Equipment Only

using namespace std;

    // S18F6 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(18, 5, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:4 TARGETID SSACK DATA {L:s STATUS}
        // variables for data items and parsing
        string TARGETID;  	// A:n (always)  the OBJSPEC for the target object
        string SSACK;  	// A:2 (always)  two character codes for success or failure, NO Normal, EE exec. err, CE comm. err, HE h/w err, TE tag err
        string DATA;  	// A:n (varies)  unformatted data
        string STATUS;  	// A:n (always)  subsystem status data
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 5 || list0[0] != "L:4") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { TARGETID = list1[1];} else { TARGETID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { SSACK = list1[1];} else { SSACK = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATA = list1[1];} else { DATA = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t s=1; s < list1.size(); s++) {
            vector<string> list2;
            sp->listSplit(list1[s], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { STATUS = list2[1];} else { STATUS = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S18F7RWrite Data Request Sent by Host Only

using namespace std;

    // S18F7R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 18, 7, ::recvS18F7R);

// receive method 
void recvS18F7R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:4 TARGETID DATASEG DATALENGTH DATA
        // variables for data items and parsing
        string TARGETID;  	// A:n (always)  the OBJSPEC for the target object
        string DATASEG;  	// A:n (varies)  identifies data requested, E87 requires text
        string DATALENGTH;  	// U4:1 (varies)  total bytes of the message body 
        string DATA;  	// A:n (varies)  unformatted data
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 5 || list0[0] != "L:4") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { TARGETID = list1[1];} else { TARGETID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATASEG = list1[1];} else { DATASEG = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATALENGTH = list1[1];} else { DATALENGTH = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { DATA = list1[1];} else { DATA = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(18, 8, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S18F7R

S18F8Write Data Ack Sent by Equipment Only

using namespace std;

    // S18F8 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(18, 7, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:3 TARGETID SSACK {L:s STATUS}
        // variables for data items and parsing
        string TARGETID;  	// A:n (always)  the OBJSPEC for the target object
        string SSACK;  	// A:2 (always)  two character codes for success or failure, NO Normal, EE exec. err, CE comm. err, HE h/w err, TE tag err
        string STATUS;  	// A:n (always)  subsystem status data
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { TARGETID = list1[1];} else { TARGETID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { SSACK = list1[1];} else { SSACK = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t s=1; s < list1.size(); s++) {
            vector<string> list2;
            sp->listSplit(list1[s], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { STATUS = list2[1];} else { STATUS = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S18F9RRead ID Req Sent by Host Only

using namespace std;

    // S18F9R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 18, 9, ::recvS18F9R);

// receive method 
void recvS18F9R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect TARGETID
        // variables for data items and parsing
        string TARGETID;  	// A:n (always)  the OBJSPEC for the target object
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0].find("A:") != 0 ) { ok = false; break; }
        if ( list0.size() == 2) { TARGETID = list0[1];} else { TARGETID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(18, 10, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S18F9R

S18F10Read ID Data Sent by Equipment Only

using namespace std;

    // S18F10 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(18, 9, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:4 TARGETID SSACK MID {L:s STATUS}
        // variables for data items and parsing
        string TARGETID;  	// A:n (always)  the OBJSPEC for the target object
        string SSACK;  	// A:2 (always)  two character codes for success or failure, NO Normal, EE exec. err, CE comm. err, HE h/w err, TE tag err
        string MID;  	// A:16 (varies)  material ID, E40 restricts to A:n
        string STATUS;  	// A:n (always)  subsystem status data
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 5 || list0[0] != "L:4") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { TARGETID = list1[1];} else { TARGETID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { SSACK = list1[1];} else { SSACK = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { MID = list1[1];} else { MID = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t s=1; s < list1.size(); s++) {
            vector<string> list2;
            sp->listSplit(list1[s], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { STATUS = list2[1];} else { STATUS = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S18F11RWrite ID Req Sent by Host Only

using namespace std;

    // S18F11R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 18, 11, ::recvS18F11R);

// receive method 
void recvS18F11R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 TARGETID MID
        // variables for data items and parsing
        string TARGETID;  	// A:n (always)  the OBJSPEC for the target object
        string MID;  	// A:16 (varies)  material ID, E40 restricts to A:n
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { TARGETID = list1[1];} else { TARGETID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { MID = list1[1];} else { MID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(18, 12, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S18F11R

S18F12Write ID Ack Sent by Equipment Only

using namespace std;

    // S18F12 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(18, 11, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:3 TARGETID SSACK {L:s STATUS}
        // variables for data items and parsing
        string TARGETID;  	// A:n (always)  the OBJSPEC for the target object
        string SSACK;  	// A:2 (always)  two character codes for success or failure, NO Normal, EE exec. err, CE comm. err, HE h/w err, TE tag err
        string STATUS;  	// A:n (always)  subsystem status data
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { TARGETID = list1[1];} else { TARGETID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { SSACK = list1[1];} else { SSACK = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t s=1; s < list1.size(); s++) {
            vector<string> list2;
            sp->listSplit(list1[s], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { STATUS = list2[1];} else { STATUS = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S18F13RSubsystem Command Sent by Host Only

using namespace std;

    // S18F13R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 18, 13, ::recvS18F13R);

// receive method 
void recvS18F13R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:3 TARGETID SSCMD {L:n CPVAL}
        // variables for data items and parsing
        string TARGETID;  	// A:n (always)  the OBJSPEC for the target object
        string SSCMD;  	// A:n (always)  subsystem action command
        string CPVAL;  	// A:n (varies)  command parameter value, any scalar type
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { TARGETID = list1[1];} else { TARGETID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { SSCMD = list1[1];} else { SSCMD = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { CPVAL = list2[1];} else { CPVAL = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(18, 14, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S18F13R

S18F14Subsystem Command Ack Sent by Equipment Only

using namespace std;

    // S18F14 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(18, 13, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:3 TARGETID SSACK {L:s STATUS}
        // variables for data items and parsing
        string TARGETID;  	// A:n (always)  the OBJSPEC for the target object
        string SSACK;  	// A:2 (always)  two character codes for success or failure, NO Normal, EE exec. err, CE comm. err, HE h/w err, TE tag err
        string STATUS;  	// A:n (always)  subsystem status data
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { TARGETID = list1[1];} else { TARGETID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { SSACK = list1[1];} else { SSACK = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t s=1; s < list1.size(); s++) {
            vector<string> list2;
            sp->listSplit(list1[s], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { STATUS = list2[1];} else { STATUS = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S18F15RRead 2D Code Cond Req Sent by Host Only

using namespace std;

    // S18F15R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 18, 15, ::recvS18F15R);

// receive method 
void recvS18F15R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect TARGETID
        // variables for data items and parsing
        string TARGETID;  	// A:n (always)  the OBJSPEC for the target object
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0].find("A:") != 0 ) { ok = false; break; }
        if ( list0.size() == 2) { TARGETID = list0[1];} else { TARGETID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(18, 16, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S18F15R

S18F16Read 2D Code Cond Data Sent by Equipment Only

using namespace std;

    // S18F16 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(18, 15, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:5 TARGETID SSACK MID {L:s STATUS} {L:c CONDITION}
        // variables for data items and parsing
        string TARGETID;  	// A:n (always)  the OBJSPEC for the target object
        string SSACK;  	// A:2 (always)  two character codes for success or failure, NO Normal, EE exec. err, CE comm. err, HE h/w err, TE tag err
        string MID;  	// A:16 (varies)  material ID, E40 restricts to A:n
        string STATUS;  	// A:n (always)  subsystem status data
        string CONDITION;  	// A:n (always)  sub-system condition info tag
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 6 || list0[0] != "L:5") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { TARGETID = list1[1];} else { TARGETID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { SSACK = list1[1];} else { SSACK = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { MID = list1[1];} else { MID = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t s=1; s < list1.size(); s++) {
            vector<string> list2;
            sp->listSplit(list1[s], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { STATUS = list2[1];} else { STATUS = ""; }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[5], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t c=1; c < list1.size(); c++) {
            vector<string> list2;
            sp->listSplit(list1[c], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { CONDITION = list2[1];} else { CONDITION = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S19F1RRequest Process Definition Element (PDE) Directory Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S19F1R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 19, 1, ::recvS19F1R);

// receive method 
void recvS19F1R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 {L:m {L:3 PDEATTRIBUTENAME COMPARISONOPERATOR PDEATTRIBUTEVALUE}} {L:n PDEATTRIBUTE}
        // variables for data items and parsing
        unsigned long PDEATTRIBUTENAME;  	// U1:1 (always)  identifies a PDE attribute type
        unsigned long COMPARISONOPERATOR;  	// U1:1 (always)  choice of comparison operators.  Interpreted as "target <op> <const>" where <op> is this value and <const> is supplied in the expression
        string PDEATTRIBUTEVALUE;  	// A (varies)  contains the value of a PDE Attribute, may be type L, A, TF, U1
        unsigned long PDEATTRIBUTE;  	// U1:1 (always)  a reportable PDE attribute type, not necessarily useable in a filter expression
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t m=1; m < list1.size(); m++) {
            vector<string> list2;
            sp->listSplit(list1[m], list2);
            if ( list2.size() != 4 || list2[0] != "L:3") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "U1:1" ) { ok = false; break; }
            PDEATTRIBUTENAME = atoul(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "U1:1" ) { ok = false; break; }
            COMPARISONOPERATOR = atoul(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[3], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { PDEATTRIBUTEVALUE = list3[1];} else { PDEATTRIBUTEVALUE = ""; }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0] != "U1:1" ) { ok = false; break; }
            PDEATTRIBUTE = atoul(list2[1].c_str());
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(19, 2, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S19F1R

S19F2PDE Directory Data Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S19F2 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(19, 1, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:3 DIRRSPSTAT STATUSTXT {L:m {L:2 UID {L:n {L:2 PDEATTRIBUTE PDEATTRIBUTEVALUE}}}}
        // variables for data items and parsing
        unsigned long DIRRSPSTAT;  	// U1:1 (always)  get dir status response
        string STATUSTXT;  	// A:80 (always)  status response description
        string UID;  	// A:36 (always)  See SEMI E139.  A unique identifier for a PDE consisting of a 36 character string with runs of 8, 4, 4, 4, and 12 characters separated by hyphens 
        unsigned long PDEATTRIBUTE;  	// U1:1 (always)  a reportable PDE attribute type, not necessarily useable in a filter expression
        string PDEATTRIBUTEVALUE;  	// A (varies)  contains the value of a PDE Attribute, may be type L, A, TF, U1
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        DIRRSPSTAT = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { STATUSTXT = list1[1];} else { STATUSTXT = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t m=1; m < list1.size(); m++) {
            vector<string> list2;
            sp->listSplit(list1[m], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { UID = list3[1];} else { UID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if ( list3.size() < 1) { ok=false; break; }
            for(size_t n=1; n < list3.size(); n++) {
                vector<string> list4;
                sp->listSplit(list3[n], list4);
                if ( list4.size() != 3 || list4[0] != "L:2") { ok=false; break; }
                vector<string> list5;
                sp->listSplit(list4[1], list5);
                if (list5.size() < 1) { ok = false; break; }
                if ( list5[0] != "U1:1" ) { ok = false; break; }
                PDEATTRIBUTE = atoul(list5[1].c_str());
                list5.clear();
                sp->listSplit(list4[2], list5);
                if (list5.size() < 1) { ok = false; break; }
                if ( list5.size() == 2) { PDEATTRIBUTEVALUE = list5[1];} else { PDEATTRIBUTEVALUE = ""; }
                }
            if (!ok) break;
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S19F3RPDE Delete Request Sent by Host Only

using namespace std;

    // S19F3R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 19, 3, ::recvS19F3R);

// receive method 
void recvS19F3R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:n UID
        // variables for data items and parsing
        string UID;  	// A:36 (always)  See SEMI E139.  A unique identifier for a PDE consisting of a 36 character string with runs of 8, 4, 4, 4, and 12 characters separated by hyphens 
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if (list1.size() < 1) { ok = false; break; }
            if ( list1[0].find("A:") != 0 ) { ok = false; break; }
            if ( list1.size() == 2) { UID = list1[1];} else { UID = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(19, 4, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S19F3R

S19F4PDE Delete Acknowledge Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S19F4 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(19, 3, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:n {L:3 UID DELRSPSTAT STATUSTXT}
        // variables for data items and parsing
        string UID;  	// A:36 (always)  See SEMI E139.  A unique identifier for a PDE consisting of a 36 character string with runs of 8, 4, 4, 4, and 12 characters separated by hyphens 
        unsigned long DELRSPSTAT;  	// U1:1 (always)  Response code for the PDE deletion request, non-zero means not deleted
        string STATUSTXT;  	// A:80 (always)  status response description
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if ( list1.size() != 4 || list1[0] != "L:3") { ok=false; break; }
            vector<string> list2;
            sp->listSplit(list1[1], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { UID = list2[1];} else { UID = ""; }
            list2.clear();
            sp->listSplit(list1[2], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0] != "U1:1" ) { ok = false; break; }
            DELRSPSTAT = atoul(list2[1].c_str());
            list2.clear();
            sp->listSplit(list1[3], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { STATUSTXT = list2[1];} else { STATUSTXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S19F5RPDE Header Data Request Sent by Host and Equipment

using namespace std;

    // S19F5R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 19, 5, ::recvS19F5R);

// receive method 
void recvS19F5R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:n UID
        // variables for data items and parsing
        string UID;  	// A:36 (always)  See SEMI E139.  A unique identifier for a PDE consisting of a 36 character string with runs of 8, 4, 4, 4, and 12 characters separated by hyphens 
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if (list1.size() < 1) { ok = false; break; }
            if ( list1[0].find("A:") != 0 ) { ok = false; break; }
            if ( list1.size() == 2) { UID = list1[1];} else { UID = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(19, 6, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S19F5R

S19F6PDE Header Data Reply Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S19F6 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(19, 5, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 TCID {L:n {L:3 UID GETRSPSTAT STATUSTXT}}
        // variables for data items and parsing
        string TCID;  	// A:36 (always)  The identity of a transfer container specified as a 36 character string with runs of 8, 4, 4, 4, and 12 characters joined by hyphens
        string UID;  	// A:36 (always)  See SEMI E139.  A unique identifier for a PDE consisting of a 36 character string with runs of 8, 4, 4, 4, and 12 characters separated by hyphens 
        unsigned long GETRSPSTAT;  	// U1:1 (always)  Response code for PDE queries, non-zero indicates failure
        string STATUSTXT;  	// A:80 (always)  status response description
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { TCID = list1[1];} else { TCID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 4 || list2[0] != "L:3") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { UID = list3[1];} else { UID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "U1:1" ) { ok = false; break; }
            GETRSPSTAT = atoul(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[3], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { STATUSTXT = list3[1];} else { STATUSTXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S19F7Rrequest the transfer of PDEs via Stream 13 Sent by Host and Equipment

using namespace std;

    // S19F7R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 19, 7, ::recvS19F7R);

// receive method 
void recvS19F7R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:n UID
        // variables for data items and parsing
        string UID;  	// A:36 (always)  See SEMI E139.  A unique identifier for a PDE consisting of a 36 character string with runs of 8, 4, 4, 4, and 12 characters separated by hyphens 
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if (list1.size() < 1) { ok = false; break; }
            if ( list1[0].find("A:") != 0 ) { ok = false; break; }
            if ( list1.size() == 2) { UID = list1[1];} else { UID = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(19, 8, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S19F7R

S19F8PDE Transfer Reply Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S19F8 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(19, 7, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 TCID {L:n {L:3 UID GETRSPSTAT STATUSTXT}}
        // variables for data items and parsing
        string TCID;  	// A:36 (always)  The identity of a transfer container specified as a 36 character string with runs of 8, 4, 4, 4, and 12 characters joined by hyphens
        string UID;  	// A:36 (always)  See SEMI E139.  A unique identifier for a PDE consisting of a 36 character string with runs of 8, 4, 4, 4, and 12 characters separated by hyphens 
        unsigned long GETRSPSTAT;  	// U1:1 (always)  Response code for PDE queries, non-zero indicates failure
        string STATUSTXT;  	// A:80 (always)  status response description
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { TCID = list1[1];} else { TCID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 4 || list2[0] != "L:3") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { UID = list3[1];} else { UID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "U1:1" ) { ok = false; break; }
            GETRSPSTAT = atoul(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[3], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { STATUSTXT = list3[1];} else { STATUSTXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S19F9RRequest to Send PDE Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S19F9R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 19, 9, ::recvS19F9R);

// receive method 
void recvS19F9R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 TCID TRANSFERSIZE
        // variables for data items and parsing
        string TCID;  	// A:36 (always)  The identity of a transfer container specified as a 36 character string with runs of 8, 4, 4, 4, and 12 characters joined by hyphens
        unsigned long TRANSFERSIZE;  	// U8:1 (always)  SIze in bytes of the TransferContainer.   An 8 byte value but HSMS uses 4 byte message lengths!!!
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { TCID = list1[1];} else { TCID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U8:1" ) { ok = false; break; }
        TRANSFERSIZE = atoul(list1[1].c_str());
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(19, 10, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S19F9R

S19F10Initiate PDE transfer Reply Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S19F10 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(19, 9, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:3 TCID RTSRSPSTAT STATUSTXT
        // variables for data items and parsing
        string TCID;  	// A:36 (always)  The identity of a transfer container specified as a 36 character string with runs of 8, 4, 4, 4, and 12 characters joined by hyphens
        unsigned long RTSRSPSTAT;  	// U1:1 (always)  PDE transfer request reply code, non-zero means denied
        string STATUSTXT;  	// A:80 (always)  status response description
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { TCID = list1[1];} else { TCID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        RTSRSPSTAT = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { STATUSTXT = list1[1];} else { STATUSTXT = ""; }
        return;  // parsed ok
        } // end while(ok)

S19F11RSend PDE Sent by Host and Equipment

using namespace std;

    // S19F11R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 19, 11, ::recvS19F11R);

// receive method 
void recvS19F11R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect TCID
        // variables for data items and parsing
        string TCID;  	// A:36 (always)  The identity of a transfer container specified as a 36 character string with runs of 8, 4, 4, 4, and 12 characters joined by hyphens
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0].find("A:") != 0 ) { ok = false; break; }
        if ( list0.size() == 2) { TCID = list0[1];} else { TCID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(19, 12, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S19F11R

S19F12Send PDE Acknowledge Sent by Host and Equipment

using namespace std;

    // S19F12 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(19, 11, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // no data expected
        return;  // parsed ok
        } // end while(ok)

S19F13RTransferContainer Report Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S19F13R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 19, 13, ::recvS19F13R);

// receive method 
void recvS19F13R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:n {L:4 UID SENDRSPSTAT VERIFYRSPSTAT STATUSTXT}
        // variables for data items and parsing
        string UID;  	// A:36 (always)  See SEMI E139.  A unique identifier for a PDE consisting of a 36 character string with runs of 8, 4, 4, 4, and 12 characters separated by hyphens 
        unsigned long SENDRSPSTAT;  	// U1:1 (always)  Return codes for the Send PDE request, non-zero means failure
        unsigned long VERIFYRSPSTAT;  	// U1:1 (always)  PDE verification result, 0 success, 10 none, other error
        string STATUSTXT;  	// A:80 (always)  status response description
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if ( list1.size() != 5 || list1[0] != "L:4") { ok=false; break; }
            vector<string> list2;
            sp->listSplit(list1[1], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { UID = list2[1];} else { UID = ""; }
            list2.clear();
            sp->listSplit(list1[2], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0] != "U1:1" ) { ok = false; break; }
            SENDRSPSTAT = atoul(list2[1].c_str());
            list2.clear();
            sp->listSplit(list1[3], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0] != "U1:1" ) { ok = false; break; }
            VERIFYRSPSTAT = atoul(list2[1].c_str());
            list2.clear();
            sp->listSplit(list1[4], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { STATUSTXT = list2[1];} else { STATUSTXT = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(19, 14, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S19F13R

S19F14TransferContainer Report Ack Sent by Host and Equipment

using namespace std;

    // S19F14 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(19, 13, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // no data expected
        return;  // parsed ok
        } // end while(ok)

S19F15RRequest PDE Resolution Sent by Host Only

using namespace std;

    // S19F15R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 19, 15, ::recvS19F15R);

// receive method 
void recvS19F15R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 TARGETPDE {L:n {L:2 PDEREF RESOLUTION}}
        // variables for data items and parsing
        string TARGETPDE;  	// A:36 (always)  the UID of the target PDE, a 36 character string with runs of 8,4,4,4, and 12 characters joined by hyphens.
        string PDEREF;  	// A:36 (always)  The UID of a PDE or of a PDE group formatted as a 36 character string with runs of 8, 4, 4, 4, and 12 characters joined by hyphens.
        string RESOLUTION;  	// A:36 (always)  the UID of a PDE
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { TARGETPDE = list1[1];} else { TARGETPDE = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { PDEREF = list3[1];} else { PDEREF = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { RESOLUTION = list3[1];} else { RESOLUTION = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(19, 16, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S19F15R

S19F16PDE Resolution Data Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S19F16 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(19, 15, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 {L:m {L:2 PDEREF RESOLUTION}} {L:n {L:3 UID RESPDESTAT STATUSTXT}}
        // variables for data items and parsing
        string PDEREF;  	// A:36 (always)  The UID of a PDE or of a PDE group formatted as a 36 character string with runs of 8, 4, 4, 4, and 12 characters joined by hyphens.
        string RESOLUTION;  	// A:36 (always)  the UID of a PDE
        string UID;  	// A:36 (always)  See SEMI E139.  A unique identifier for a PDE consisting of a 36 character string with runs of 8, 4, 4, 4, and 12 characters separated by hyphens 
        unsigned long RESPDESTAT;  	// U1:1 (always)  status codes for PDE resolution
        string STATUSTXT;  	// A:80 (always)  status response description
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t m=1; m < list1.size(); m++) {
            vector<string> list2;
            sp->listSplit(list1[m], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { PDEREF = list3[1];} else { PDEREF = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { RESOLUTION = list3[1];} else { RESOLUTION = ""; }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 4 || list2[0] != "L:3") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { UID = list3[1];} else { UID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "U1:1" ) { ok = false; break; }
            RESPDESTAT = atoul(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[3], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { STATUSTXT = list3[1];} else { STATUSTXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S19F17RVerify PDE Request Sent by Host Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S19F17R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 19, 17, ::recvS19F17R);

// receive method 
void recvS19F17R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:4 TARGETPDE {L:n {L:2 PDEREF RESOLUTION}} VERIFYTYPE VERIFYDEPTH
        // variables for data items and parsing
        string TARGETPDE;  	// A:36 (always)  the UID of the target PDE, a 36 character string with runs of 8,4,4,4, and 12 characters joined by hyphens.
        string PDEREF;  	// A:36 (always)  The UID of a PDE or of a PDE group formatted as a 36 character string with runs of 8, 4, 4, 4, and 12 characters joined by hyphens.
        string RESOLUTION;  	// A:36 (always)  the UID of a PDE
        unsigned long VERIFYTYPE;  	// U1:1 (always)  chooses the type of verification
        unsigned long VERIFYDEPTH;  	// U1:1 (always)  whether to check only the target, or the target and all referenced PDEs
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 5 || list0[0] != "L:4") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { TARGETPDE = list1[1];} else { TARGETPDE = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 3 || list2[0] != "L:2") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { PDEREF = list3[1];} else { PDEREF = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { RESOLUTION = list3[1];} else { RESOLUTION = ""; }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        VERIFYTYPE = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        VERIFYDEPTH = atoul(list1[1].c_str());
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(19, 18, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S19F17R

S19F18PDE Verification Result Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S19F18 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(19, 17, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 VERIFYSUCCESS {L:n {L:3 UID VERIFYRSPSTAT STATUSTXT}}
        // variables for data items and parsing
        int VERIFYSUCCESS;  	// TF:1 (always)  True if no errors were found
        string UID;  	// A:36 (always)  See SEMI E139.  A unique identifier for a PDE consisting of a 36 character string with runs of 8, 4, 4, 4, and 12 characters separated by hyphens 
        unsigned long VERIFYRSPSTAT;  	// U1:1 (always)  PDE verification result, 0 success, 10 none, other error
        string STATUSTXT;  	// A:80 (always)  status response description
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "TF:1" ) { ok = false; break; }
        VERIFYSUCCESS = atoi(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 4 || list2[0] != "L:3") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { UID = list3[1];} else { UID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "U1:1" ) { ok = false; break; }
            VERIFYRSPSTAT = atoul(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[3], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { STATUSTXT = list3[1];} else { STATUSTXT = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S19F19RS19 Multi-block Inquire Sent by Host and Equipment

using namespace std;

    // S19F19R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 19, 19, ::recvS19F19R);

// receive method 
void recvS19F19R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect DATALENGTH
        // variables for data items and parsing
        string DATALENGTH;  	// U4:1 (varies)  total bytes of the message body 
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0.size() == 2) { DATALENGTH = list0[1];} else { DATALENGTH = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(19, 20, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S19F19R

S19F20S19 Multi-block Grant Sent by Host and Equipment

using namespace std;

    // S19F20 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(19, 19, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect GRANT
        // variables for data items and parsing
        int GRANT;  	// B:1 (always)  multiblock grant code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "B:1" ) { ok = false; break; }
        GRANT = sp->binToInt(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S20F1RSetSRO Attributes Request Sent by Host Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S20F1R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 20, 1, ::recvS20F1R);

// receive method 
void recvS20F1R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:6 OBJID OBJTYPE AUTOPOST_DISABLE AUTOCLEAR_DISABLE RETAINRECIPE_DISABLE AUTOCLOSE
        // variables for data items and parsing
        string OBJID;  	// A:80 (varies)  E39 object identifier 1-80 chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        string OBJTYPE;  	// A:40 (varies)  object class name, chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        unsigned long AUTOPOST_DISABLE;  	// U1:1 (always)  Disable automatic posting of recipes to RMS preceeding SRO move to Local state (E171)
        unsigned long AUTOCLEAR_DISABLE;  	// U1:1 (always)  Disable automatic clear of recipes on SRO transition to Local (E171)
        unsigned long RETAINRECIPE_DISABLE;  	// U1:1 (always)  Disable automatic retention of recipes on disconnect
        unsigned long AUTOCLOSE;  	// U2:1 (always)  Interaction timeout for closing operator session, 0 is no limit
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 7 || list0[0] != "L:6") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJID = list1[1];} else { OBJID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJTYPE = list1[1];} else { OBJTYPE = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        AUTOPOST_DISABLE = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        AUTOCLEAR_DISABLE = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[5], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        RETAINRECIPE_DISABLE = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[6], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U2:1" ) { ok = false; break; }
        AUTOCLOSE = atoul(list1[1].c_str());
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(20, 2, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S20F1R

S20F2SetSRO Attributes Acknowledge Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S20F2 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(20, 1, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect SSAACK
        // variables for data items and parsing
        unsigned long SSAACK;  	// U1:1 (always)  service completion code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "U1:1" ) { ok = false; break; }
        SSAACK = atoul(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S20F3RGetOperationIDList Request Sent by Host Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S20F3R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 20, 3, ::recvS20F3R);

// receive method 
void recvS20F3R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:3 OBJID OBJTYPE OPETYPE
        // variables for data items and parsing
        string OBJID;  	// A:80 (varies)  E39 object identifier 1-80 chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        string OBJTYPE;  	// A:40 (varies)  object class name, chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        unsigned long OPETYPE;  	// U1:1 (always)  recipe operation type
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJID = list1[1];} else { OBJID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJTYPE = list1[1];} else { OBJTYPE = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        OPETYPE = atoul(list1[1].c_str());
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(20, 4, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S20F3R

S20F4GetOperationIDList Acknowledge Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S20F4 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(20, 3, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 {L:n OPEID} GOILACK
        // variables for data items and parsing
        string OPEID;  	// A:16 (always)  recipe operation identifier
        unsigned long GOILACK;  	// U1:1 (always)  completion code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { OPEID = list2[1];} else { OPEID = ""; }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        GOILACK = atoul(list1[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S20F5ROpenConnectionEvent Send Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S20F5R C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 20, 5, ::recvS20F5R);

// receive method 
void recvS20F5R(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:7 OBJID OBJTYPE OPETYPE RMSUSERID RMSPWD EQUSERID OPEID
        // variables for data items and parsing
        string OBJID;  	// A:80 (varies)  E39 object identifier 1-80 chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        string OBJTYPE;  	// A:40 (varies)  object class name, chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        unsigned long OPETYPE;  	// U1:1 (always)  recipe operation type
        string RMSUSERID;  	// A:64 (always)  SRO userID
        string RMSPWD;  	// A:64 (always)  password of SRO user 
        string EQUSERID;  	// A:64 (always)  Equipment userID for recipe use authentication
        string OPEID;  	// A:16 (always)  recipe operation identifier
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 8 || list0[0] != "L:7") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJID = list1[1];} else { OBJID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJTYPE = list1[1];} else { OBJTYPE = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        OPETYPE = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { RMSUSERID = list1[1];} else { RMSUSERID = ""; }
        list1.clear();
        sp->listSplit(list0[5], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { RMSPWD = list1[1];} else { RMSPWD = ""; }
        list1.clear();
        sp->listSplit(list0[6], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { EQUSERID = list1[1];} else { EQUSERID = ""; }
        list1.clear();
        sp->listSplit(list0[7], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { OPEID = list1[1];} else { OPEID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(20, 6, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S20F5R

S20F6OpenConnectionEvent Acknowledge Sent by Host Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S20F6 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(20, 5, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 OPEID OCEACK
        // variables for data items and parsing
        string OPEID;  	// A:16 (always)  recipe operation identifier
        unsigned long OCEACK;  	// U1:1 (always)  event completion code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { OPEID = list1[1];} else { OPEID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        OCEACK = atoul(list1[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S20F7RCloseConnectionEvent Send Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S20F7R C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 20, 7, ::recvS20F7R);

// receive method 
void recvS20F7R(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:4 OBJID OBJTYPE OPETYPE OPEID
        // variables for data items and parsing
        string OBJID;  	// A:80 (varies)  E39 object identifier 1-80 chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        string OBJTYPE;  	// A:40 (varies)  object class name, chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        unsigned long OPETYPE;  	// U1:1 (always)  recipe operation type
        string OPEID;  	// A:16 (always)  recipe operation identifier
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 5 || list0[0] != "L:4") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJID = list1[1];} else { OBJID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJTYPE = list1[1];} else { OBJTYPE = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        OPETYPE = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { OPEID = list1[1];} else { OPEID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(20, 8, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S20F7R

S20F8CloseConnectionEvent Acknowledge Sent by Host Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S20F8 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(20, 7, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 OPEID CCEACK
        // variables for data items and parsing
        string OPEID;  	// A:16 (always)  recipe operation identifier
        unsigned long CCEACK;  	// U1:1 (always)  event completion code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { OPEID = list1[1];} else { OPEID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        CCEACK = atoul(list1[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S20F9RClearOperation Request Sent by Host Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S20F9R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 20, 9, ::recvS20F9R);

// receive method 
void recvS20F9R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:4 OBJID OBJTYPE OPETYPE OPEID
        // variables for data items and parsing
        string OBJID;  	// A:80 (varies)  E39 object identifier 1-80 chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        string OBJTYPE;  	// A:40 (varies)  object class name, chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        unsigned long OPETYPE;  	// U1:1 (always)  recipe operation type
        string OPEID;  	// A:16 (always)  recipe operation identifier
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 5 || list0[0] != "L:4") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJID = list1[1];} else { OBJID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJTYPE = list1[1];} else { OBJTYPE = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        OPETYPE = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { OPEID = list1[1];} else { OPEID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(20, 10, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S20F9R

S20F10ClearOperation Acknowledge Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S20F10 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(20, 9, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect COACK
        // variables for data items and parsing
        unsigned long COACK;  	// U1:1 (always)  service completion code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "U1:1" ) { ok = false; break; }
        COACK = atoul(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S20F11RGetRecipeXIDList Request Sent by Host Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S20F11R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 20, 11, ::recvS20F11R);

// receive method 
void recvS20F11R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:4 OBJID OBJTYPE OPETYPE OPEID
        // variables for data items and parsing
        string OBJID;  	// A:80 (varies)  E39 object identifier 1-80 chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        string OBJTYPE;  	// A:40 (varies)  object class name, chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        unsigned long OPETYPE;  	// U1:1 (always)  recipe operation type
        string OPEID;  	// A:16 (always)  recipe operation identifier
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 5 || list0[0] != "L:4") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJID = list1[1];} else { OBJID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJTYPE = list1[1];} else { OBJTYPE = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        OPETYPE = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { OPEID = list1[1];} else { OPEID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(20, 12, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S20F11R

S20F12GetRecipeXIDList Acknowledge Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S20F12 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(20, 11, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 {L:n {L:9 TIMESTAMP OPEID ASSGNID COPYID REVID RecID VERID TYPEID EQID}} GRXLACK
        // variables for data items and parsing
        string TIMESTAMP;  	// A:32 (always)  ECV TimeFormat controls format, 0=A:12 YYMMDDHHMMSS, 1=A:16 YYYYMMDDHHMMSScc,2=YYYY-MM-DDTHH:MM:SS.s[s]*{Z|+hh:mm|-hh:mm}
        string OPEID;  	// A:16 (always)  recipe operation identifier
        unsigned long ASSGNID;  	// U1:1 (always)  Assigner of the RecipeXID Base Part
        unsigned long COPYID;  	// U1:1 (always)  Recipe copy type
        string REVID;  	// A:256 (always)  recipe revision information related to SRO
        string RecID;  	// A:n (always)  recipe spec or ppid
        string VERID;  	// A:n (always)  composite key with RecipeID to identify a unique recipe
        unsigned long TYPEID;  	// U1:1 (always)  recipe type
        string EQID;  	// A:256 (always)  recipe specification of compatible equipment
        unsigned long GRXLACK;  	// U1:1 (always)  service completion code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 10 || list2[0] != "L:9") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { TIMESTAMP = list3[1];} else { TIMESTAMP = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { OPEID = list3[1];} else { OPEID = ""; }
            list3.clear();
            sp->listSplit(list2[3], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "U1:1" ) { ok = false; break; }
            ASSGNID = atoul(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[4], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "U1:1" ) { ok = false; break; }
            COPYID = atoul(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[5], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { REVID = list3[1];} else { REVID = ""; }
            list3.clear();
            sp->listSplit(list2[6], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { RecID = list3[1];} else { RecID = ""; }
            list3.clear();
            sp->listSplit(list2[7], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { VERID = list3[1];} else { VERID = ""; }
            list3.clear();
            sp->listSplit(list2[8], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "U1:1" ) { ok = false; break; }
            TYPEID = atoul(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[9], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { EQID = list3[1];} else { EQID = ""; }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        GRXLACK = atoul(list1[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S20F13RDeleteRecipe Request Sent by Host Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S20F13R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 20, 13, ::recvS20F13R);

// receive method 
void recvS20F13R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:5 OBJID OBJTYPE OPETYPE OPEID {L:9 TIMESTAMP OPEID ASSGNID COPYID REVID RecID VERID TYPEID EQID}
        // variables for data items and parsing
        string OBJID;  	// A:80 (varies)  E39 object identifier 1-80 chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        string OBJTYPE;  	// A:40 (varies)  object class name, chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        unsigned long OPETYPE;  	// U1:1 (always)  recipe operation type
        string OPEID;  	// A:16 (always)  recipe operation identifier
        string TIMESTAMP;  	// A:32 (always)  ECV TimeFormat controls format, 0=A:12 YYMMDDHHMMSS, 1=A:16 YYYYMMDDHHMMSScc,2=YYYY-MM-DDTHH:MM:SS.s[s]*{Z|+hh:mm|-hh:mm}
        string OPEID;  	// A:16 (always)  recipe operation identifier
        unsigned long ASSGNID;  	// U1:1 (always)  Assigner of the RecipeXID Base Part
        unsigned long COPYID;  	// U1:1 (always)  Recipe copy type
        string REVID;  	// A:256 (always)  recipe revision information related to SRO
        string RecID;  	// A:n (always)  recipe spec or ppid
        string VERID;  	// A:n (always)  composite key with RecipeID to identify a unique recipe
        unsigned long TYPEID;  	// U1:1 (always)  recipe type
        string EQID;  	// A:256 (always)  recipe specification of compatible equipment
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 6 || list0[0] != "L:5") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJID = list1[1];} else { OBJID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJTYPE = list1[1];} else { OBJTYPE = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        OPETYPE = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { OPEID = list1[1];} else { OPEID = ""; }
        list1.clear();
        sp->listSplit(list0[5], list1);
        if ( list1.size() != 10 || list1[0] != "L:9") { ok=false; break; }
        vector<string> list2;
        sp->listSplit(list1[1], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0].find("A:") != 0 ) { ok = false; break; }
        if ( list2.size() == 2) { TIMESTAMP = list2[1];} else { TIMESTAMP = ""; }
        list2.clear();
        sp->listSplit(list1[2], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0].find("A:") != 0 ) { ok = false; break; }
        if ( list2.size() == 2) { OPEID = list2[1];} else { OPEID = ""; }
        list2.clear();
        sp->listSplit(list1[3], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "U1:1" ) { ok = false; break; }
        ASSGNID = atoul(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[4], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "U1:1" ) { ok = false; break; }
        COPYID = atoul(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[5], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0].find("A:") != 0 ) { ok = false; break; }
        if ( list2.size() == 2) { REVID = list2[1];} else { REVID = ""; }
        list2.clear();
        sp->listSplit(list1[6], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0].find("A:") != 0 ) { ok = false; break; }
        if ( list2.size() == 2) { RecID = list2[1];} else { RecID = ""; }
        list2.clear();
        sp->listSplit(list1[7], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0].find("A:") != 0 ) { ok = false; break; }
        if ( list2.size() == 2) { VERID = list2[1];} else { VERID = ""; }
        list2.clear();
        sp->listSplit(list1[8], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0] != "U1:1" ) { ok = false; break; }
        TYPEID = atoul(list2[1].c_str());
        list2.clear();
        sp->listSplit(list1[9], list2);
        if (list2.size() < 1) { ok = false; break; }
        if ( list2[0].find("A:") != 0 ) { ok = false; break; }
        if ( list2.size() == 2) { EQID = list2[1];} else { EQID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(20, 14, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S20F13R

S20F14DeleteRecipe Acknowledge Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S20F14 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(20, 13, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect DRRACK
        // variables for data items and parsing
        unsigned long DRRACK;  	// U1:1 (always)  service completion code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "U1:1" ) { ok = false; break; }
        DRRACK = atoul(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S20F15RWriteRecipe Request Sent by Host Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S20F15R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 20, 15, ::recvS20F15R);

// receive method 
void recvS20F15R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:5 OBJID OBJTYPE OPETYPE OPEID {L:n {L:10 TIMESTAMP OPEID ASSGNID COPYID REVID RecID VERID TYPEID EQID RCPBODYA}}
        // variables for data items and parsing
        string OBJID;  	// A:80 (varies)  E39 object identifier 1-80 chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        string OBJTYPE;  	// A:40 (varies)  object class name, chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        unsigned long OPETYPE;  	// U1:1 (always)  recipe operation type
        string OPEID;  	// A:16 (always)  recipe operation identifier
        string TIMESTAMP;  	// A:32 (always)  ECV TimeFormat controls format, 0=A:12 YYMMDDHHMMSS, 1=A:16 YYYYMMDDHHMMSScc,2=YYYY-MM-DDTHH:MM:SS.s[s]*{Z|+hh:mm|-hh:mm}
        string OPEID;  	// A:16 (always)  recipe operation identifier
        unsigned long ASSGNID;  	// U1:1 (always)  Assigner of the RecipeXID Base Part
        unsigned long COPYID;  	// U1:1 (always)  Recipe copy type
        string REVID;  	// A:256 (always)  recipe revision information related to SRO
        string RecID;  	// A:n (always)  recipe spec or ppid
        string VERID;  	// A:n (always)  composite key with RecipeID to identify a unique recipe
        unsigned long TYPEID;  	// U1:1 (always)  recipe type
        string EQID;  	// A:256 (always)  recipe specification of compatible equipment
        string RCPBODYA;  	// A:n (varies)  user defined recipe body, list allowed
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 6 || list0[0] != "L:5") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJID = list1[1];} else { OBJID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJTYPE = list1[1];} else { OBJTYPE = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        OPETYPE = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { OPEID = list1[1];} else { OPEID = ""; }
        list1.clear();
        sp->listSplit(list0[5], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 11 || list2[0] != "L:10") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { TIMESTAMP = list3[1];} else { TIMESTAMP = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { OPEID = list3[1];} else { OPEID = ""; }
            list3.clear();
            sp->listSplit(list2[3], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "U1:1" ) { ok = false; break; }
            ASSGNID = atoul(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[4], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "U1:1" ) { ok = false; break; }
            COPYID = atoul(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[5], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { REVID = list3[1];} else { REVID = ""; }
            list3.clear();
            sp->listSplit(list2[6], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { RecID = list3[1];} else { RecID = ""; }
            list3.clear();
            sp->listSplit(list2[7], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { VERID = list3[1];} else { VERID = ""; }
            list3.clear();
            sp->listSplit(list2[8], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "U1:1" ) { ok = false; break; }
            TYPEID = atoul(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[9], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { EQID = list3[1];} else { EQID = ""; }
            list3.clear();
            sp->listSplit(list2[10], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { RCPBODYA = list3[1];} else { RCPBODYA = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(20, 16, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S20F15R

S20F16WriteRecipe Acknowledge Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S20F16 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(20, 15, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect WRACK
        // variables for data items and parsing
        unsigned long WRACK;  	// U1:1 (always)  service completion code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "U1:1" ) { ok = false; break; }
        WRACK = atoul(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S20F17RReadRecipe Request Sent by Host Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S20F17R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 20, 17, ::recvS20F17R);

// receive method 
void recvS20F17R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:5 OBJID OBJTYPE OPETYPE OPEID {L:n {L:9 TIMESTAMP OPEID ASSGNID COPYID REVID RecID VERID TYPEID EQID}}
        // variables for data items and parsing
        string OBJID;  	// A:80 (varies)  E39 object identifier 1-80 chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        string OBJTYPE;  	// A:40 (varies)  object class name, chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        unsigned long OPETYPE;  	// U1:1 (always)  recipe operation type
        string OPEID;  	// A:16 (always)  recipe operation identifier
        string TIMESTAMP;  	// A:32 (always)  ECV TimeFormat controls format, 0=A:12 YYMMDDHHMMSS, 1=A:16 YYYYMMDDHHMMSScc,2=YYYY-MM-DDTHH:MM:SS.s[s]*{Z|+hh:mm|-hh:mm}
        string OPEID;  	// A:16 (always)  recipe operation identifier
        unsigned long ASSGNID;  	// U1:1 (always)  Assigner of the RecipeXID Base Part
        unsigned long COPYID;  	// U1:1 (always)  Recipe copy type
        string REVID;  	// A:256 (always)  recipe revision information related to SRO
        string RecID;  	// A:n (always)  recipe spec or ppid
        string VERID;  	// A:n (always)  composite key with RecipeID to identify a unique recipe
        unsigned long TYPEID;  	// U1:1 (always)  recipe type
        string EQID;  	// A:256 (always)  recipe specification of compatible equipment
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 6 || list0[0] != "L:5") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJID = list1[1];} else { OBJID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJTYPE = list1[1];} else { OBJTYPE = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        OPETYPE = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { OPEID = list1[1];} else { OPEID = ""; }
        list1.clear();
        sp->listSplit(list0[5], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 10 || list2[0] != "L:9") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { TIMESTAMP = list3[1];} else { TIMESTAMP = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { OPEID = list3[1];} else { OPEID = ""; }
            list3.clear();
            sp->listSplit(list2[3], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "U1:1" ) { ok = false; break; }
            ASSGNID = atoul(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[4], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "U1:1" ) { ok = false; break; }
            COPYID = atoul(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[5], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { REVID = list3[1];} else { REVID = ""; }
            list3.clear();
            sp->listSplit(list2[6], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { RecID = list3[1];} else { RecID = ""; }
            list3.clear();
            sp->listSplit(list2[7], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { VERID = list3[1];} else { VERID = ""; }
            list3.clear();
            sp->listSplit(list2[8], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "U1:1" ) { ok = false; break; }
            TYPEID = atoul(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[9], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { EQID = list3[1];} else { EQID = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(20, 18, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S20F17R

S20F18ReadRecipe Acknowledge Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S20F18 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(20, 17, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 {L:n {L:10 TIMESTAMP OPEID ASSGNID COPYID REVID RecID VERID TYPEID EQID RCPBODYA}} RRACK_S20
        // variables for data items and parsing
        string TIMESTAMP;  	// A:32 (always)  ECV TimeFormat controls format, 0=A:12 YYMMDDHHMMSS, 1=A:16 YYYYMMDDHHMMSScc,2=YYYY-MM-DDTHH:MM:SS.s[s]*{Z|+hh:mm|-hh:mm}
        string OPEID;  	// A:16 (always)  recipe operation identifier
        unsigned long ASSGNID;  	// U1:1 (always)  Assigner of the RecipeXID Base Part
        unsigned long COPYID;  	// U1:1 (always)  Recipe copy type
        string REVID;  	// A:256 (always)  recipe revision information related to SRO
        string RecID;  	// A:n (always)  recipe spec or ppid
        string VERID;  	// A:n (always)  composite key with RecipeID to identify a unique recipe
        unsigned long TYPEID;  	// U1:1 (always)  recipe type
        string EQID;  	// A:256 (always)  recipe specification of compatible equipment
        string RCPBODYA;  	// A:n (varies)  user defined recipe body, list allowed
        unsigned long RRACK_S20;  	// U1:1 (always)  service completion code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 11 || list2[0] != "L:10") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { TIMESTAMP = list3[1];} else { TIMESTAMP = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { OPEID = list3[1];} else { OPEID = ""; }
            list3.clear();
            sp->listSplit(list2[3], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "U1:1" ) { ok = false; break; }
            ASSGNID = atoul(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[4], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "U1:1" ) { ok = false; break; }
            COPYID = atoul(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[5], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { REVID = list3[1];} else { REVID = ""; }
            list3.clear();
            sp->listSplit(list2[6], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { RecID = list3[1];} else { RecID = ""; }
            list3.clear();
            sp->listSplit(list2[7], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { VERID = list3[1];} else { VERID = ""; }
            list3.clear();
            sp->listSplit(list2[8], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "U1:1" ) { ok = false; break; }
            TYPEID = atoul(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[9], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { EQID = list3[1];} else { EQID = ""; }
            list3.clear();
            sp->listSplit(list2[10], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { RCPBODYA = list3[1];} else { RCPBODYA = ""; }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        RRACK_S20 = atoul(list1[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S20F19RQueryRecipeXIDList Event Send Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S20F19R C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 20, 19, ::recvS20F19R);

// receive method 
void recvS20F19R(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:4 OBJID OBJTYPE OPETYPE OPEID 
        // variables for data items and parsing
        string OBJID;  	// A:80 (varies)  E39 object identifier 1-80 chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        string OBJTYPE;  	// A:40 (varies)  object class name, chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        unsigned long OPETYPE;  	// U1:1 (always)  recipe operation type
        string OPEID;  	// A:16 (always)  recipe operation identifier
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 5 || list0[0] != "L:4") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJID = list1[1];} else { OBJID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJTYPE = list1[1];} else { OBJTYPE = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        OPETYPE = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { OPEID = list1[1];} else { OPEID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(20, 20, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S20F19R

S20F20QueryRecipeXIDList Event Acknowledge Sent by Host Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S20F20 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(20, 19, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:3 OPEID {L:n {L:9 TIMESTAMP OPEID ASSGNID COPYID REVID RecID VERID TYPEID EQID}} QRXLEACK
        // variables for data items and parsing
        string OPEID;  	// A:16 (always)  recipe operation identifier
        string TIMESTAMP;  	// A:32 (always)  ECV TimeFormat controls format, 0=A:12 YYMMDDHHMMSS, 1=A:16 YYYYMMDDHHMMSScc,2=YYYY-MM-DDTHH:MM:SS.s[s]*{Z|+hh:mm|-hh:mm}
        string OPEID;  	// A:16 (always)  recipe operation identifier
        unsigned long ASSGNID;  	// U1:1 (always)  Assigner of the RecipeXID Base Part
        unsigned long COPYID;  	// U1:1 (always)  Recipe copy type
        string REVID;  	// A:256 (always)  recipe revision information related to SRO
        string RecID;  	// A:n (always)  recipe spec or ppid
        string VERID;  	// A:n (always)  composite key with RecipeID to identify a unique recipe
        unsigned long TYPEID;  	// U1:1 (always)  recipe type
        string EQID;  	// A:256 (always)  recipe specification of compatible equipment
        unsigned long QRXLEACK;  	// U1:1 (always)  event completion code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { OPEID = list1[1];} else { OPEID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 10 || list2[0] != "L:9") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { TIMESTAMP = list3[1];} else { TIMESTAMP = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { OPEID = list3[1];} else { OPEID = ""; }
            list3.clear();
            sp->listSplit(list2[3], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "U1:1" ) { ok = false; break; }
            ASSGNID = atoul(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[4], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "U1:1" ) { ok = false; break; }
            COPYID = atoul(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[5], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { REVID = list3[1];} else { REVID = ""; }
            list3.clear();
            sp->listSplit(list2[6], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { RecID = list3[1];} else { RecID = ""; }
            list3.clear();
            sp->listSplit(list2[7], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { VERID = list3[1];} else { VERID = ""; }
            list3.clear();
            sp->listSplit(list2[8], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "U1:1" ) { ok = false; break; }
            TYPEID = atoul(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[9], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { EQID = list3[1];} else { EQID = ""; }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        QRXLEACK = atoul(list1[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S20F21RQueryRecipe Event Send Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S20F21R C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 20, 21, ::recvS20F21R);

// receive method 
void recvS20F21R(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:5 OBJID OBJTYPE OPETYPE OPEID {L:n {L:9 TIMESTAMP OPEID ASSGNID COPYID REVID RecID VERID TYPEID EQID}}
        // variables for data items and parsing
        string OBJID;  	// A:80 (varies)  E39 object identifier 1-80 chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        string OBJTYPE;  	// A:40 (varies)  object class name, chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        unsigned long OPETYPE;  	// U1:1 (always)  recipe operation type
        string OPEID;  	// A:16 (always)  recipe operation identifier
        string TIMESTAMP;  	// A:32 (always)  ECV TimeFormat controls format, 0=A:12 YYMMDDHHMMSS, 1=A:16 YYYYMMDDHHMMSScc,2=YYYY-MM-DDTHH:MM:SS.s[s]*{Z|+hh:mm|-hh:mm}
        string OPEID;  	// A:16 (always)  recipe operation identifier
        unsigned long ASSGNID;  	// U1:1 (always)  Assigner of the RecipeXID Base Part
        unsigned long COPYID;  	// U1:1 (always)  Recipe copy type
        string REVID;  	// A:256 (always)  recipe revision information related to SRO
        string RecID;  	// A:n (always)  recipe spec or ppid
        string VERID;  	// A:n (always)  composite key with RecipeID to identify a unique recipe
        unsigned long TYPEID;  	// U1:1 (always)  recipe type
        string EQID;  	// A:256 (always)  recipe specification of compatible equipment
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 6 || list0[0] != "L:5") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJID = list1[1];} else { OBJID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJTYPE = list1[1];} else { OBJTYPE = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        OPETYPE = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { OPEID = list1[1];} else { OPEID = ""; }
        list1.clear();
        sp->listSplit(list0[5], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 10 || list2[0] != "L:9") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { TIMESTAMP = list3[1];} else { TIMESTAMP = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { OPEID = list3[1];} else { OPEID = ""; }
            list3.clear();
            sp->listSplit(list2[3], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "U1:1" ) { ok = false; break; }
            ASSGNID = atoul(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[4], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "U1:1" ) { ok = false; break; }
            COPYID = atoul(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[5], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { REVID = list3[1];} else { REVID = ""; }
            list3.clear();
            sp->listSplit(list2[6], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { RecID = list3[1];} else { RecID = ""; }
            list3.clear();
            sp->listSplit(list2[7], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { VERID = list3[1];} else { VERID = ""; }
            list3.clear();
            sp->listSplit(list2[8], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "U1:1" ) { ok = false; break; }
            TYPEID = atoul(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[9], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { EQID = list3[1];} else { EQID = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(20, 22, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S20F21R

S20F22QueryRecipe Event Acknowledge Sent by Host Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S20F22 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(20, 21, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect QREACK
        // variables for data items and parsing
        unsigned long QREACK;  	// U1:1 (always)  event completion code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "U1:1" ) { ok = false; break; }
        QREACK = atoul(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S20F23RPostRecipe Event Send Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S20F23R C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 20, 23, ::recvS20F23R);

// receive method 
void recvS20F23R(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:5 OBJID OBJTYPE OPETYPE OPEID {L:n {L:10 TIMESTAMP OPEID ASSGNID COPYID REVID RecID VERID TYPEID EQID RCPBODYA}}
        // variables for data items and parsing
        string OBJID;  	// A:80 (varies)  E39 object identifier 1-80 chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        string OBJTYPE;  	// A:40 (varies)  object class name, chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        unsigned long OPETYPE;  	// U1:1 (always)  recipe operation type
        string OPEID;  	// A:16 (always)  recipe operation identifier
        string TIMESTAMP;  	// A:32 (always)  ECV TimeFormat controls format, 0=A:12 YYMMDDHHMMSS, 1=A:16 YYYYMMDDHHMMSScc,2=YYYY-MM-DDTHH:MM:SS.s[s]*{Z|+hh:mm|-hh:mm}
        string OPEID;  	// A:16 (always)  recipe operation identifier
        unsigned long ASSGNID;  	// U1:1 (always)  Assigner of the RecipeXID Base Part
        unsigned long COPYID;  	// U1:1 (always)  Recipe copy type
        string REVID;  	// A:256 (always)  recipe revision information related to SRO
        string RecID;  	// A:n (always)  recipe spec or ppid
        string VERID;  	// A:n (always)  composite key with RecipeID to identify a unique recipe
        unsigned long TYPEID;  	// U1:1 (always)  recipe type
        string EQID;  	// A:256 (always)  recipe specification of compatible equipment
        string RCPBODYA;  	// A:n (varies)  user defined recipe body, list allowed
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 6 || list0[0] != "L:5") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJID = list1[1];} else { OBJID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJTYPE = list1[1];} else { OBJTYPE = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        OPETYPE = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { OPEID = list1[1];} else { OPEID = ""; }
        list1.clear();
        sp->listSplit(list0[5], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 11 || list2[0] != "L:10") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { TIMESTAMP = list3[1];} else { TIMESTAMP = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { OPEID = list3[1];} else { OPEID = ""; }
            list3.clear();
            sp->listSplit(list2[3], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "U1:1" ) { ok = false; break; }
            ASSGNID = atoul(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[4], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "U1:1" ) { ok = false; break; }
            COPYID = atoul(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[5], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { REVID = list3[1];} else { REVID = ""; }
            list3.clear();
            sp->listSplit(list2[6], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { RecID = list3[1];} else { RecID = ""; }
            list3.clear();
            sp->listSplit(list2[7], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { VERID = list3[1];} else { VERID = ""; }
            list3.clear();
            sp->listSplit(list2[8], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "U1:1" ) { ok = false; break; }
            TYPEID = atoul(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[9], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { EQID = list3[1];} else { EQID = ""; }
            list3.clear();
            sp->listSplit(list2[10], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { RCPBODYA = list3[1];} else { RCPBODYA = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(20, 24, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S20F23R

S20F24PostRecipe Event Acknowledge Sent by Host Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S20F24 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(20, 23, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect PREACK
        // variables for data items and parsing
        unsigned long PREACK;  	// U1:1 (always)  event completion code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "U1:1" ) { ok = false; break; }
        PREACK = atoul(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S20F25RSetPRC Attributes Request Sent by Host Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S20F25R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 20, 25, ::recvS20F25R);

// receive method 
void recvS20F25R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:5 OBJID OBJTYPE {L:n MAXNUMBER} MAXTIME PRCPREEXECHK
        // variables for data items and parsing
        string OBJID;  	// A:80 (varies)  E39 object identifier 1-80 chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        string OBJTYPE;  	// A:40 (varies)  object class name, chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        unsigned long MAXNUMBER;  	// U2:1 (always)  subspace maximum 
        unsigned long MAXTIME;  	// U2:1 (always)  maximum minutes for a PEM recipe to be preserved in PRC post use, 0 means NA
        unsigned long PRCPREEXECHK;  	// U1:1 (always)  Enable Pre-Execution checking
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 6 || list0[0] != "L:5") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJID = list1[1];} else { OBJID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJTYPE = list1[1];} else { OBJTYPE = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0] != "U2:1" ) { ok = false; break; }
            MAXNUMBER = atoul(list2[1].c_str());
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U2:1" ) { ok = false; break; }
        MAXTIME = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[5], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        PRCPREEXECHK = atoul(list1[1].c_str());
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(20, 26, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S20F25R

S20F26SetPRC Attributes Acknowledge Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S20F26 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(20, 25, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect SPAACK
        // variables for data items and parsing
        unsigned long SPAACK;  	// U1:1 (always)  service completion code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "U1:1" ) { ok = false; break; }
        SPAACK = atoul(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S20F27RPreSpecifyRecipe Request Sent by Host Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S20F27R C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 20, 27, ::recvS20F27R);

// receive method 
void recvS20F27R(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:6 OBJID OBJTYPE OPETYPE OPEID PRJOBID {L:n {L:9 TIMESTAMP OPEID ASSGNID COPYID REVID RecID VERID TYPEID EQID}}
        // variables for data items and parsing
        string OBJID;  	// A:80 (varies)  E39 object identifier 1-80 chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        string OBJTYPE;  	// A:40 (varies)  object class name, chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        unsigned long OPETYPE;  	// U1:1 (always)  recipe operation type
        string OPEID;  	// A:16 (always)  recipe operation identifier
        string PRJOBID;  	// A:n (always)  process job identifier
        string TIMESTAMP;  	// A:32 (always)  ECV TimeFormat controls format, 0=A:12 YYMMDDHHMMSS, 1=A:16 YYYYMMDDHHMMSScc,2=YYYY-MM-DDTHH:MM:SS.s[s]*{Z|+hh:mm|-hh:mm}
        string OPEID;  	// A:16 (always)  recipe operation identifier
        unsigned long ASSGNID;  	// U1:1 (always)  Assigner of the RecipeXID Base Part
        unsigned long COPYID;  	// U1:1 (always)  Recipe copy type
        string REVID;  	// A:256 (always)  recipe revision information related to SRO
        string RecID;  	// A:n (always)  recipe spec or ppid
        string VERID;  	// A:n (always)  composite key with RecipeID to identify a unique recipe
        unsigned long TYPEID;  	// U1:1 (always)  recipe type
        string EQID;  	// A:256 (always)  recipe specification of compatible equipment
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 7 || list0[0] != "L:6") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJID = list1[1];} else { OBJID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJTYPE = list1[1];} else { OBJTYPE = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        OPETYPE = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { OPEID = list1[1];} else { OPEID = ""; }
        list1.clear();
        sp->listSplit(list0[5], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { PRJOBID = list1[1];} else { PRJOBID = ""; }
        list1.clear();
        sp->listSplit(list0[6], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 10 || list2[0] != "L:9") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { TIMESTAMP = list3[1];} else { TIMESTAMP = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { OPEID = list3[1];} else { OPEID = ""; }
            list3.clear();
            sp->listSplit(list2[3], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "U1:1" ) { ok = false; break; }
            ASSGNID = atoul(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[4], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "U1:1" ) { ok = false; break; }
            COPYID = atoul(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[5], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { REVID = list3[1];} else { REVID = ""; }
            list3.clear();
            sp->listSplit(list2[6], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { RecID = list3[1];} else { RecID = ""; }
            list3.clear();
            sp->listSplit(list2[7], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { VERID = list3[1];} else { VERID = ""; }
            list3.clear();
            sp->listSplit(list2[8], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "U1:1" ) { ok = false; break; }
            TYPEID = atoul(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[9], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { EQID = list3[1];} else { EQID = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(20, 28, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S20F27R

S20F28PreSpecifyRecipe Acknowledge Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S20F28 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(20, 27, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect PSRACK
        // variables for data items and parsing
        unsigned long PSRACK;  	// U1:1 (always)  service completion code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "U1:1" ) { ok = false; break; }
        PSRACK = atoul(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S20F29RQueryPJRecipeXIDList Event Send Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S20F29R C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 20, 29, ::recvS20F29R);

// receive method 
void recvS20F29R(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:5 OBJID OBJTYPE OPETYPE OPEID PRJOBID 
        // variables for data items and parsing
        string OBJID;  	// A:80 (varies)  E39 object identifier 1-80 chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        string OBJTYPE;  	// A:40 (varies)  object class name, chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        unsigned long OPETYPE;  	// U1:1 (always)  recipe operation type
        string OPEID;  	// A:16 (always)  recipe operation identifier
        string PRJOBID;  	// A:n (always)  process job identifier
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 6 || list0[0] != "L:5") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJID = list1[1];} else { OBJID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJTYPE = list1[1];} else { OBJTYPE = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        OPETYPE = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { OPEID = list1[1];} else { OPEID = ""; }
        list1.clear();
        sp->listSplit(list0[5], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { PRJOBID = list1[1];} else { PRJOBID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(20, 30, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S20F29R

S20F30QueryPJRecipeXIDList Event Acknowledge Sent by Host Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S20F30 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(20, 29, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 {L:n {L:9 TIMESTAMP OPEID ASSGNID COPYID REVID RecID VERID TYPEID EQID}} QPRKEACK
        // variables for data items and parsing
        string TIMESTAMP;  	// A:32 (always)  ECV TimeFormat controls format, 0=A:12 YYMMDDHHMMSS, 1=A:16 YYYYMMDDHHMMSScc,2=YYYY-MM-DDTHH:MM:SS.s[s]*{Z|+hh:mm|-hh:mm}
        string OPEID;  	// A:16 (always)  recipe operation identifier
        unsigned long ASSGNID;  	// U1:1 (always)  Assigner of the RecipeXID Base Part
        unsigned long COPYID;  	// U1:1 (always)  Recipe copy type
        string REVID;  	// A:256 (always)  recipe revision information related to SRO
        string RecID;  	// A:n (always)  recipe spec or ppid
        string VERID;  	// A:n (always)  composite key with RecipeID to identify a unique recipe
        unsigned long TYPEID;  	// U1:1 (always)  recipe type
        string EQID;  	// A:256 (always)  recipe specification of compatible equipment
        unsigned long QPRKEACK;  	// U1:1 (always)  event completion code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 10 || list2[0] != "L:9") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { TIMESTAMP = list3[1];} else { TIMESTAMP = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { OPEID = list3[1];} else { OPEID = ""; }
            list3.clear();
            sp->listSplit(list2[3], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "U1:1" ) { ok = false; break; }
            ASSGNID = atoul(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[4], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "U1:1" ) { ok = false; break; }
            COPYID = atoul(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[5], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { REVID = list3[1];} else { REVID = ""; }
            list3.clear();
            sp->listSplit(list2[6], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { RecID = list3[1];} else { RecID = ""; }
            list3.clear();
            sp->listSplit(list2[7], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { VERID = list3[1];} else { VERID = ""; }
            list3.clear();
            sp->listSplit(list2[8], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "U1:1" ) { ok = false; break; }
            TYPEID = atoul(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[9], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { EQID = list3[1];} else { EQID = ""; }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        QPRKEACK = atoul(list1[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S20F31RPre-Exe Check Event Send Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S20F31R C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 20, 31, ::recvS20F31R);

// receive method 
void recvS20F31R(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:6 OBJID OBJTYPE OPETYPE OPEID PRJOBID CHKINFO
        // variables for data items and parsing
        string OBJID;  	// A:80 (varies)  E39 object identifier 1-80 chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        string OBJTYPE;  	// A:40 (varies)  object class name, chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        unsigned long OPETYPE;  	// U1:1 (always)  recipe operation type
        string OPEID;  	// A:16 (always)  recipe operation identifier
        string PRJOBID;  	// A:n (always)  process job identifier
        string CHKINFO;  	// A:n (varies)  User defined value, any type
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 7 || list0[0] != "L:6") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJID = list1[1];} else { OBJID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJTYPE = list1[1];} else { OBJTYPE = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        OPETYPE = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { OPEID = list1[1];} else { OPEID = ""; }
        list1.clear();
        sp->listSplit(list0[5], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { PRJOBID = list1[1];} else { PRJOBID = ""; }
        list1.clear();
        sp->listSplit(list0[6], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { CHKINFO = list1[1];} else { CHKINFO = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(20, 32, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S20F31R

S20F32Pre-Exe Check Event Acknowledge Sent by Host Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S20F32 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(20, 31, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:3 PECRSLT {L:n {L:10 TIMESTAMP OPEID ASSGNID COPYID REVID RecID VERID TYPEID EQID RCPBODYA}} PECEACK
        // variables for data items and parsing
        unsigned long PECRSLT;  	// U1:1 (always)  RMS result
        string TIMESTAMP;  	// A:32 (always)  ECV TimeFormat controls format, 0=A:12 YYMMDDHHMMSS, 1=A:16 YYYYMMDDHHMMSScc,2=YYYY-MM-DDTHH:MM:SS.s[s]*{Z|+hh:mm|-hh:mm}
        string OPEID;  	// A:16 (always)  recipe operation identifier
        unsigned long ASSGNID;  	// U1:1 (always)  Assigner of the RecipeXID Base Part
        unsigned long COPYID;  	// U1:1 (always)  Recipe copy type
        string REVID;  	// A:256 (always)  recipe revision information related to SRO
        string RecID;  	// A:n (always)  recipe spec or ppid
        string VERID;  	// A:n (always)  composite key with RecipeID to identify a unique recipe
        unsigned long TYPEID;  	// U1:1 (always)  recipe type
        string EQID;  	// A:256 (always)  recipe specification of compatible equipment
        string RCPBODYA;  	// A:n (varies)  user defined recipe body, list allowed
        unsigned long PECEACK;  	// U1:1 (always)  event completion code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        PECRSLT = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 11 || list2[0] != "L:10") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { TIMESTAMP = list3[1];} else { TIMESTAMP = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { OPEID = list3[1];} else { OPEID = ""; }
            list3.clear();
            sp->listSplit(list2[3], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "U1:1" ) { ok = false; break; }
            ASSGNID = atoul(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[4], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "U1:1" ) { ok = false; break; }
            COPYID = atoul(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[5], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { REVID = list3[1];} else { REVID = ""; }
            list3.clear();
            sp->listSplit(list2[6], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { RecID = list3[1];} else { RecID = ""; }
            list3.clear();
            sp->listSplit(list2[7], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { VERID = list3[1];} else { VERID = ""; }
            list3.clear();
            sp->listSplit(list2[8], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "U1:1" ) { ok = false; break; }
            TYPEID = atoul(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[9], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { EQID = list3[1];} else { EQID = ""; }
            list3.clear();
            sp->listSplit(list2[10], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { RCPBODYA = list3[1];} else { RCPBODYA = ""; }
            }
        if (!ok) break;
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        PECEACK = atoul(list1[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S20F33RPreSpecifyRecipe Event Send Sent by Equipment Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S20F33R C++ Receive message - add next line to setup
    //SecsHostCpp *sp=a pointer to your_SecsHostCpp;
    sp->messageTypeAdd( 20, 33, ::recvS20F33R);

// receive method 
void recvS20F33R(SecsHostCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:5 OBJID OBJTYPE OPETYPE OPEID PRJOBID
        // variables for data items and parsing
        string OBJID;  	// A:80 (varies)  E39 object identifier 1-80 chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        string OBJTYPE;  	// A:40 (varies)  object class name, chars 0x20-0x7e but not >, ?, *, or ~.  Does not begin or end with space.
        unsigned long OPETYPE;  	// U1:1 (always)  recipe operation type
        string OPEID;  	// A:16 (always)  recipe operation identifier
        string PRJOBID;  	// A:n (always)  process job identifier
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 6 || list0[0] != "L:5") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJID = list1[1];} else { OBJID = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { OBJTYPE = list1[1];} else { OBJTYPE = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U1:1" ) { ok = false; break; }
        OPETYPE = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { OPEID = list1[1];} else { OPEID = ""; }
        list1.clear();
        sp->listSplit(list0[5], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { PRJOBID = list1[1];} else { PRJOBID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(20, 34, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S20F33R

S20F34PreSpecifyRecipe Event Acknowledge Sent by Host Only

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S20F34 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(20, 33, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect PSREACK
        // variables for data items and parsing
        unsigned long PSREACK;  	// U1:1 (always)  event completion code
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0] != "U1:1" ) { ok = false; break; }
        PSREACK = atoul(list0[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S21F1RItem Load Inquire Sent by Host and Equipment

using namespace std;

    // S21F1R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 21, 1, ::recvS21F1R);

// receive method 
void recvS21F1R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:4 ITEMTYPE ITEMID ITEMLENGTH ITEMVERSION
        // variables for data items and parsing
        string ITEMTYPE;  	// A:n (always)  case-sensitve type of an item
        string ITEMID;  	// A:256 (always)  item identifier
        string ITEMLENGTH;  	// U4:1 (varies)  sum of item part lengths in bytes, not a message length, type U4 or U8
        string ITEMVERSION;  	// A:n (always)  version value, empty for unknown, default is time last modified YYYYMMDDhhmmsscc in the equipment timezone
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 5 || list0[0] != "L:4") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { ITEMTYPE = list1[1];} else { ITEMTYPE = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { ITEMID = list1[1];} else { ITEMID = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { ITEMLENGTH = list1[1];} else { ITEMLENGTH = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { ITEMVERSION = list1[1];} else { ITEMVERSION = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(21, 2, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S21F1R

S21F2Item Load Grant Sent by Host and Equipment

using namespace std;

    // S21F2 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(21, 1, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 ITEMACK ITEMERROR
        // variables for data items and parsing
        int ITEMACK;  	// B:1 (always)  item request return code
        string ITEMERROR;  	// A:1024 (always)  error description, empty on success
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        ITEMACK = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { ITEMERROR = list1[1];} else { ITEMERROR = ""; }
        return;  // parsed ok
        } // end while(ok)

S21F3RItem Send Sent by Host and Equipment

using namespace std;

    // S21F3R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 21, 3, ::recvS21F3R);

// receive method 
void recvS21F3R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:5 ITEMTYPE ITEMID ITEMLENGTH ITEMVERSION {L:n ITEMPART}
        // variables for data items and parsing
        string ITEMTYPE;  	// A:n (always)  case-sensitve type of an item
        string ITEMID;  	// A:256 (always)  item identifier
        string ITEMLENGTH;  	// U4:1 (varies)  sum of item part lengths in bytes, not a message length, type U4 or U8
        string ITEMVERSION;  	// A:n (always)  version value, empty for unknown, default is time last modified YYYYMMDDhhmmsscc in the equipment timezone
        string ITEMPART;  	// A:n (varies)  component part of an item, may be data type A:n or B:n
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 6 || list0[0] != "L:5") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { ITEMTYPE = list1[1];} else { ITEMTYPE = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { ITEMID = list1[1];} else { ITEMID = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { ITEMLENGTH = list1[1];} else { ITEMLENGTH = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { ITEMVERSION = list1[1];} else { ITEMVERSION = ""; }
        list1.clear();
        sp->listSplit(list0[5], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { ITEMPART = list2[1];} else { ITEMPART = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(21, 4, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S21F3R

S21F4Item Send Acknowledge Sent by Host and Equipment

using namespace std;

    // S21F4 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(21, 3, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 ITEMACK ITEMERROR
        // variables for data items and parsing
        int ITEMACK;  	// B:1 (always)  item request return code
        string ITEMERROR;  	// A:1024 (always)  error description, empty on success
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        ITEMACK = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { ITEMERROR = list1[1];} else { ITEMERROR = ""; }
        return;  // parsed ok
        } // end while(ok)

S21F5RItem Request Sent by Host and Equipment

using namespace std;

    // S21F5R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 21, 5, ::recvS21F5R);

// receive method 
void recvS21F5R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 ITEMTYPE ITEMID
        // variables for data items and parsing
        string ITEMTYPE;  	// A:n (always)  case-sensitve type of an item
        string ITEMID;  	// A:256 (always)  item identifier
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { ITEMTYPE = list1[1];} else { ITEMTYPE = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { ITEMID = list1[1];} else { ITEMID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(21, 6, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S21F5R

S21F6Item Data Sent by Host and Equipment

using namespace std;

    // S21F6 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(21, 5, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:7 ITEMACK ITEMERROR ITEMTYPE ITEMID ITEMLENGTH ITEMVERSION {L:n ITEMPART}
        // variables for data items and parsing
        int ITEMACK;  	// B:1 (always)  item request return code
        string ITEMERROR;  	// A:1024 (always)  error description, empty on success
        string ITEMTYPE;  	// A:n (always)  case-sensitve type of an item
        string ITEMID;  	// A:256 (always)  item identifier
        string ITEMLENGTH;  	// U4:1 (varies)  sum of item part lengths in bytes, not a message length, type U4 or U8
        string ITEMVERSION;  	// A:n (always)  version value, empty for unknown, default is time last modified YYYYMMDDhhmmsscc in the equipment timezone
        string ITEMPART;  	// A:n (varies)  component part of an item, may be data type A:n or B:n
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 8 || list0[0] != "L:7") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        ITEMACK = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { ITEMERROR = list1[1];} else { ITEMERROR = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { ITEMTYPE = list1[1];} else { ITEMTYPE = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { ITEMID = list1[1];} else { ITEMID = ""; }
        list1.clear();
        sp->listSplit(list0[5], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { ITEMLENGTH = list1[1];} else { ITEMLENGTH = ""; }
        list1.clear();
        sp->listSplit(list0[6], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { ITEMVERSION = list1[1];} else { ITEMVERSION = ""; }
        list1.clear();
        sp->listSplit(list0[7], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2.size() == 2) { ITEMPART = list2[1];} else { ITEMPART = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S21F7RItem Type List Request Sent by Host and Equipment

using namespace std;

    // S21F7R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 21, 7, ::recvS21F7R);

// receive method 
void recvS21F7R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect ITEMTYPE
        // variables for data items and parsing
        string ITEMTYPE;  	// A:n (always)  case-sensitve type of an item
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if (list0.size() < 1) { ok = false; break; }
        if ( list0[0].find("A:") != 0 ) { ok = false; break; }
        if ( list0.size() == 2) { ITEMTYPE = list0[1];} else { ITEMTYPE = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(21, 8, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S21F7R

S21F8Item Type List Results Sent by Host and Equipment

using namespace std;

    // S21F8 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(21, 7, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:7 ITEMACK ITEMERROR ITEMTYPE {L:n {L:3 ITEMID ITEMLENGTH ITEMVERSION}}
        // variables for data items and parsing
        int ITEMACK;  	// B:1 (always)  item request return code
        string ITEMERROR;  	// A:1024 (always)  error description, empty on success
        string ITEMTYPE;  	// A:n (always)  case-sensitve type of an item
        string ITEMID;  	// A:256 (always)  item identifier
        string ITEMLENGTH;  	// U4:1 (varies)  sum of item part lengths in bytes, not a message length, type U4 or U8
        string ITEMVERSION;  	// A:n (always)  version value, empty for unknown, default is time last modified YYYYMMDDhhmmsscc in the equipment timezone
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 8 || list0[0] != "L:7") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        ITEMACK = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { ITEMERROR = list1[1];} else { ITEMERROR = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { ITEMTYPE = list1[1];} else { ITEMTYPE = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 4 || list2[0] != "L:3") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { ITEMID = list3[1];} else { ITEMID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3.size() == 2) { ITEMLENGTH = list3[1];} else { ITEMLENGTH = ""; }
            list3.clear();
            sp->listSplit(list2[3], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { ITEMVERSION = list3[1];} else { ITEMVERSION = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S21F9RSupported Item Type List Request Sent by Host and Equipment

using namespace std;

    // S21F9R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 21, 9, ::recvS21F9R);

// receive method 
void recvS21F9R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // no data expected
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(21, 10, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S21F9R

S21F10Supported Item Type List Result Sent by Host and Equipment

using namespace std;

    // S21F10 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(21, 9, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:3 ITEMACK ITEMERROR {L:n ITEMTYPE} 
        // variables for data items and parsing
        int ITEMACK;  	// B:1 (always)  item request return code
        string ITEMERROR;  	// A:1024 (always)  error description, empty on success
        string ITEMTYPE;  	// A:n (always)  case-sensitve type of an item
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        ITEMACK = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { ITEMERROR = list1[1];} else { ITEMERROR = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { ITEMTYPE = list2[1];} else { ITEMTYPE = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S21F11Item Delete Sent by Host Only

using namespace std;

    // S21F11 C++ Receive message - add next line to setup
    //SecsEquipCpp *sp= a pointer to your_SecsEquipCpp;
    sp->messageTypeAdd( 21, 11, ::recvS21F11);

// receive method 
void recvS21F11(SecsEquipCpp *sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 ITEMTYPE {L:n ITEMID}
        // variables for data items and parsing
        string ITEMTYPE;  	// A:n (always)  case-sensitve type of an item
        string ITEMID;  	// A:256 (always)  item identifier
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { ITEMTYPE = list1[1];} else { ITEMTYPE = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { ITEMID = list2[1];} else { ITEMID = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(21, 12, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    // bad data 
    sp->sendS9(7, header);
    } // end recv_S21F11

S21F12Item Delete Acknowledge Sent by Host and Equipment

using namespace std;

    // S21F12 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(21, 11, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:3 ITEMACK ITEMTYPE {L:n {L:3 ITEMID ITEMACK ITEMERROR}} 
        // variables for data items and parsing
        int ITEMACK;  	// B:1 (always)  item request return code
        string ITEMTYPE;  	// A:n (always)  case-sensitve type of an item
        string ITEMID;  	// A:256 (always)  item identifier
        int ITEMACK;  	// B:1 (always)  item request return code
        string ITEMERROR;  	// A:1024 (always)  error description, empty on success
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 4 || list0[0] != "L:3") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        ITEMACK = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { ITEMTYPE = list1[1];} else { ITEMTYPE = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if ( list1.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list1.size(); n++) {
            vector<string> list2;
            sp->listSplit(list1[n], list2);
            if ( list2.size() != 4 || list2[0] != "L:3") { ok=false; break; }
            vector<string> list3;
            sp->listSplit(list2[1], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { ITEMID = list3[1];} else { ITEMID = ""; }
            list3.clear();
            sp->listSplit(list2[2], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0] != "B:1" ) { ok = false; break; }
            ITEMACK = sp->binToInt(list3[1].c_str());
            list3.clear();
            sp->listSplit(list2[3], list3);
            if (list3.size() < 1) { ok = false; break; }
            if ( list3[0].find("A:") != 0 ) { ok = false; break; }
            if ( list3.size() == 2) { ITEMERROR = list3[1];} else { ITEMERROR = ""; }
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)

S21F13RRequest Permission To Send Item Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S21F13R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 21, 13, ::recvS21F13R);

// receive method 
void recvS21F13R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:5 ITEMTYPE ITEMID ITEMLENGTH ITEMVERSION ITEMPARTCOUNT
        // variables for data items and parsing
        string ITEMTYPE;  	// A:n (always)  case-sensitve type of an item
        string ITEMID;  	// A:256 (always)  item identifier
        string ITEMLENGTH;  	// U4:1 (varies)  sum of item part lengths in bytes, not a message length, type U4 or U8
        string ITEMVERSION;  	// A:n (always)  version value, empty for unknown, default is time last modified YYYYMMDDhhmmsscc in the equipment timezone
        unsigned long ITEMPARTCOUNT;  	// U4:1 (always)  total number of item parts as split for transfer
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 6 || list0[0] != "L:5") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { ITEMTYPE = list1[1];} else { ITEMTYPE = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { ITEMID = list1[1];} else { ITEMID = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { ITEMLENGTH = list1[1];} else { ITEMLENGTH = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { ITEMVERSION = list1[1];} else { ITEMVERSION = ""; }
        list1.clear();
        sp->listSplit(list0[5], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U4:1" ) { ok = false; break; }
        ITEMPARTCOUNT = atoul(list1[1].c_str());
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(21, 14, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S21F13R

S21F14Grant Permission To Send Item Sent by Host and Equipment

using namespace std;

    // S21F14 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(21, 13, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 ITEMACK ITEMERROR
        // variables for data items and parsing
        int ITEMACK;  	// B:1 (always)  item request return code
        string ITEMERROR;  	// A:1024 (always)  error description, empty on success
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        ITEMACK = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { ITEMERROR = list1[1];} else { ITEMERROR = ""; }
        return;  // parsed ok
        } // end while(ok)

S21F15RItem Request Sent by Host and Equipment

using namespace std;

    // S21F15R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 21, 15, ::recvS21F15R);

// receive method 
void recvS21F15R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:2 ITEMTYPE ITEMID
        // variables for data items and parsing
        string ITEMTYPE;  	// A:n (always)  case-sensitve type of an item
        string ITEMID;  	// A:256 (always)  item identifier
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { ITEMTYPE = list1[1];} else { ITEMTYPE = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { ITEMID = list1[1];} else { ITEMID = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(21, 16, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S21F15R

S21F16Item Request Grant Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S21F16 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(21, 15, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:7 ITEMACK ITEMERROR ITEMTYPE ITEMID ITEMLENGTH ITEMVERSION ITEMPARTCOUNT
        // variables for data items and parsing
        int ITEMACK;  	// B:1 (always)  item request return code
        string ITEMERROR;  	// A:1024 (always)  error description, empty on success
        string ITEMTYPE;  	// A:n (always)  case-sensitve type of an item
        string ITEMID;  	// A:256 (always)  item identifier
        string ITEMLENGTH;  	// U4:1 (varies)  sum of item part lengths in bytes, not a message length, type U4 or U8
        string ITEMVERSION;  	// A:n (always)  version value, empty for unknown, default is time last modified YYYYMMDDhhmmsscc in the equipment timezone
        unsigned long ITEMPARTCOUNT;  	// U4:1 (always)  total number of item parts as split for transfer
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 8 || list0[0] != "L:7") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        ITEMACK = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { ITEMERROR = list1[1];} else { ITEMERROR = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { ITEMTYPE = list1[1];} else { ITEMTYPE = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { ITEMID = list1[1];} else { ITEMID = ""; }
        list1.clear();
        sp->listSplit(list0[5], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { ITEMLENGTH = list1[1];} else { ITEMLENGTH = ""; }
        list1.clear();
        sp->listSplit(list0[6], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { ITEMVERSION = list1[1];} else { ITEMVERSION = ""; }
        list1.clear();
        sp->listSplit(list0[7], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U4:1" ) { ok = false; break; }
        ITEMPARTCOUNT = atoul(list1[1].c_str());
        return;  // parsed ok
        } // end while(ok)

S21F17RSend Item Part Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S21F17R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 21, 17, ::recvS21F17R);

// receive method 
void recvS21F17R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:8 ITEMTYPE ITEMID ITEMLENGTH ITEMVERSION ITEMINDEX ITEMPARTCOUNT ITEMPARTLENGTH ITEMPART
        // variables for data items and parsing
        string ITEMTYPE;  	// A:n (always)  case-sensitve type of an item
        string ITEMID;  	// A:256 (always)  item identifier
        string ITEMLENGTH;  	// U4:1 (varies)  sum of item part lengths in bytes, not a message length, type U4 or U8
        string ITEMVERSION;  	// A:n (always)  version value, empty for unknown, default is time last modified YYYYMMDDhhmmsscc in the equipment timezone
        unsigned long ITEMINDEX;  	// U4:1 (always)  1-based index of a component part, 0 means done, 0xFFFFFFFF means abort
        unsigned long ITEMPARTCOUNT;  	// U4:1 (always)  total number of item parts as split for transfer
        unsigned long ITEMPARTLENGTH;  	// U4:1 (always)  length of a specific item part presumably in bytes
        string ITEMPART;  	// A:n (varies)  component part of an item, may be data type A:n or B:n
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 9 || list0[0] != "L:8") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { ITEMTYPE = list1[1];} else { ITEMTYPE = ""; }
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { ITEMID = list1[1];} else { ITEMID = ""; }
        list1.clear();
        sp->listSplit(list0[3], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { ITEMLENGTH = list1[1];} else { ITEMLENGTH = ""; }
        list1.clear();
        sp->listSplit(list0[4], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { ITEMVERSION = list1[1];} else { ITEMVERSION = ""; }
        list1.clear();
        sp->listSplit(list0[5], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U4:1" ) { ok = false; break; }
        ITEMINDEX = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[6], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U4:1" ) { ok = false; break; }
        ITEMPARTCOUNT = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[7], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "U4:1" ) { ok = false; break; }
        ITEMPARTLENGTH = atoul(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[8], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1.size() == 2) { ITEMPART = list1[1];} else { ITEMPART = ""; }
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(21, 18, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S21F17R

S21F18Send Item Part Acknowledge Sent by Host and Equipment

using namespace std;

    // S21F18 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(21, 17, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:2 ITEMACK ITEMERROR
        // variables for data items and parsing
        int ITEMACK;  	// B:1 (always)  item request return code
        string ITEMERROR;  	// A:1024 (always)  error description, empty on success
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() != 3 || list0[0] != "L:2") { ok=false; break; }
        vector<string> list1;
        sp->listSplit(list0[1], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0] != "B:1" ) { ok = false; break; }
        ITEMACK = sp->binToInt(list1[1].c_str());
        list1.clear();
        sp->listSplit(list0[2], list1);
        if (list1.size() < 1) { ok = false; break; }
        if ( list1[0].find("A:") != 0 ) { ok = false; break; }
        if ( list1.size() == 2) { ITEMERROR = list1[1];} else { ITEMERROR = ""; }
        return;  // parsed ok
        } // end while(ok)

S21F19RItem Type Feature Support Sent by Host and Equipment

using namespace std;

    // S21F19R C++ Receive message - add next line to setup
    sp->messageTypeAdd( 21, 19, ::recvS21F19R);

// receive method 
void recvS21F19R(SecsEquipCpp sp, int stream, int function, bool sendReply, int transID, const char *TSN_data, const char *header, void *clientData) {
    //change SecsEquipCpp above to SecsHostCpp for host receive
    bool ok=true;
    while (ok) {   // break out of loop on error
        // expect L:n ITEMTYPE
        // variables for data items and parsing
        string ITEMTYPE;  	// A:n (always)  case-sensitve type of an item
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if (list1.size() < 1) { ok = false; break; }
            if ( list1[0].find("A:") != 0 ) { ok = false; break; }
            if ( list1.size() == 2) { ITEMTYPE = list1[1];} else { ITEMTYPE = ""; }
            }
        if (!ok) break;
        if (sendReply) {
            string reply; // TBD create reply
            sp->sendReply(21, 20, transID, reply.c_str());
            }
        return; 
        } // end while(ok)
    } // end recv_S21F19R

S21F20Item Type Feature Support Results Sent by Host and Equipment

using namespace std;
#define atoul(s) strtoul(s, NULL, 10) 

    // S21F20 C++ Parse reply
    RcResult rcr = sp->sendSecsMsg(21, 19, true, sendData, true);
    const char * TSN_data;  
    bool ok=true;  
    while (ok) {   // break out of loop on error
        if (rcr.rc != 0) {ok=false; break;}
        TSN_data = rcr.result.c_str();
        // expect L:n {L:4 ITEMACK ITEMERROR ITEMTYPE ITEMTYPESUPPORT}
        // variables for data items and parsing
        int ITEMACK;  	// B:1 (always)  item request return code
        string ITEMERROR;  	// A:1024 (always)  error description, empty on success
        string ITEMTYPE;  	// A:n (always)  case-sensitve type of an item
        unsigned long ITEMTYPESUPPORT;  	// U4:1 (always)  bitfield to specify which S21Fx messages accepted 
        vector<string> list0;
        sp->listSplit(TSN_data, list0);
        if ( list0.size() < 1) { ok=false; break; }
        for(size_t n=1; n < list0.size(); n++) {
            vector<string> list1;
            sp->listSplit(list0[n], list1);
            if ( list1.size() != 5 || list1[0] != "L:4") { ok=false; break; }
            vector<string> list2;
            sp->listSplit(list1[1], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0] != "B:1" ) { ok = false; break; }
            ITEMACK = sp->binToInt(list2[1].c_str());
            list2.clear();
            sp->listSplit(list1[2], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { ITEMERROR = list2[1];} else { ITEMERROR = ""; }
            list2.clear();
            sp->listSplit(list1[3], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0].find("A:") != 0 ) { ok = false; break; }
            if ( list2.size() == 2) { ITEMTYPE = list2[1];} else { ITEMTYPE = ""; }
            list2.clear();
            sp->listSplit(list1[4], list2);
            if (list2.size() < 1) { ok = false; break; }
            if ( list2[0] != "U4:1" ) { ok = false; break; }
            ITEMTYPESUPPORT = atoul(list2[1].c_str());
            }
        if (!ok) break;
        return;  // parsed ok
        } // end while(ok)