gccDppConsole Test C++ SDK  1.0.0.0
DPP C++ Console Demonstration
DeviceIO/ParsePacket.cpp
Go to the documentation of this file.
00001 #include "ParsePacket.h"
00002 
00003 CParsePacket::CParsePacket(void)
00004 {
00005 }
00006 
00007 CParsePacket::~CParsePacket(void)
00008 {
00009 }
00010 
00011 void CParsePacket::ParsePacketStatus(unsigned char P[], Packet_In *PIN)
00012 {
00013     short X;
00014     long CSum;
00015 
00016     CSum = 0;
00017     if (P[0] == SYNC1_) {
00018         if (P[1] == SYNC2_) {
00019             if (P[4] < 128) {  // LEN MSB < 128, i.e. LEN < 32768
00020                 PIN->LEN = (P[4] * 256) + P[5];
00021                 PIN->PID1 = P[2];
00022                 PIN->PID2 = P[3];
00023                                 for (X=0;X <=(PIN->LEN+5);X++) {        // add up all the bytes except checksum
00024                     CSum = CSum + P[X];
00025                 }
00026                 CSum = CSum + 256 * (long)(P[PIN->LEN + 6]) + (long)(P[PIN->LEN + 7]);
00027                 PIN->CheckSum = CSum;
00028                 if ((CSum & 0xFFFF) == 0) {
00029                     PIN->STATUS = 0;      // packet is OK
00030                     if (PIN->LEN > 0) {
00031                                                 for (X=6;X <=(PIN->LEN+5);X++) {        
00032                             PIN->DATA[X - 6] = P[X];
00033                                                 }
00034                     }
00035                 } else {
00036                     PIN->STATUS = PID2_ACK_CHECKSUM_ERROR;    // checksum error
00037                 }
00038             } else {
00039                 PIN->STATUS = PID2_ACK_LEN_ERROR;        // length error
00040             }
00041         } else {
00042             PIN->STATUS = PID2_ACK_SYNC_ERROR;            // sync error
00043         }
00044     } else {
00045         PIN->STATUS = PID2_ACK_SYNC_ERROR ;               // sync error
00046     }
00047 }
00048 
00049 string CParsePacket::PID2_TextToString(string strPacketSource, unsigned char PID2)
00050 {
00051         string cstrPID2;
00052         cstrPID2 = "";
00053         switch (PID2) {
00054                 case PID2_ACK_OK:    // ACK OK
00055             //PID2_TextToString = strPacketSource + ": OK\t";
00056             //cstrPID2 = "ACK_OK";
00057                         cstrPID2 = "";
00058             //ACK_Received = True
00059                         break;
00060         case PID2_ACK_SYNC_ERROR:
00061             cstrPID2 = strPacketSource + ": Sync Error\t";
00062                         break;
00063         case PID2_ACK_PID_ERROR:
00064             cstrPID2 = strPacketSource + ": PID Error\t";
00065                         break;
00066         case PID2_ACK_LEN_ERROR:
00067             cstrPID2 = strPacketSource + ": Length Error\t";
00068                         break;
00069         case PID2_ACK_CHECKSUM_ERROR:
00070             cstrPID2 = strPacketSource + ": Checksum Error\t";
00071                         break;
00072         case PID2_ACK_BAD_PARAM:        // now msg includes bad parameter
00073                         // put the error extractor in a new function
00074                 //[] If PIN.LEN > 0 Then ' BAD CMD (PID2=7), BAD PARAM (PID2=5), NO PC5 (PID2=11) errors return offending command string
00075       //        [] T$ = ""
00076       //        [] For X = 0 To PIN.LEN - 1
00077       //                [] T$ = T$ + Chr(PIN.DATA(X))
00078       //        [] Next X
00079       //        [] End If
00080             cstrPID2 = strPacketSource + ": Bad Parameter\t";
00081                         break;
00082         case PID2_ACK_BAD_HEX_REC:
00083             cstrPID2 = strPacketSource + ": Bad HEX Record\t";
00084                         break;
00085 
00086 
00087 
00088 
00089         case PID2_ACK_FPGA_ERROR:
00090             cstrPID2 = strPacketSource + ": FPGA not initialized\t";
00091                         break;
00092         case PID2_ACK_CP2201_NOT_FOUND:
00093             cstrPID2 = strPacketSource + ": CP2201 not found\t";
00094                         break;
00095         case PID2_ACK_SCOPE_DATA_NOT_AVAIL:
00096             cstrPID2 = strPacketSource + ": No scope data\t";
00097                         break;
00098         case PID2_ACK_PC5_NOT_PRESENT:
00099             cstrPID2 = strPacketSource + ": PC5 not present\t";
00100                         break;
00101         case PID2_ACK_OK_ETHERNET_SHARE_REQ:
00102             cstrPID2 = strPacketSource + ": Ethernet sharing request\t";
00103                         break;
00104         case PID2_ACK_ETHERNET_BUSY:
00105             cstrPID2 = strPacketSource + ": Ethernet sharing request\t";
00106                         break;
00107                 //[] Case :TextLog "ACK: PC5 NOT DETECTED '" + T$ + "'" + vbCrLf
00108         case PID2_ACK_CAL_DATA_NOT_PRESENT:
00109             cstrPID2 = strPacketSource + ": Calibration data not present\t";
00110                         break;
00111         case PID2_ACK_UNRECOG:
00112             cstrPID2 = strPacketSource + ": Unrecognized Command\t";
00113                         break;
00114                 default:
00115                         cstrPID2 = strPacketSource + ": Unrecognized Error\t";
00116                         break;
00117         }
00118         return cstrPID2;
00119 }
00120 
00121 long CParsePacket::ParsePacket(unsigned char P[], Packet_In *PIN)
00122 {
00123         long ParsePkt;
00124     ParsePkt = preqProcessNone;
00125     ParsePacketStatus (P, PIN);
00126     if (PIN->STATUS == PID2_ACK_OK) { // no errors
00127         if ((PIN->PID1 == PID1_RCV_STATUS) && (PIN->PID2 == PID2_SEND_DP4_STYLE_STATUS)) { // DP4-style status
00128             ParsePkt = preqProcessStatus;
00129         } else if ((PIN->PID1 == PID1_RCV_SPECTRUM) && ((PIN->PID2 >= RCVPT_256_CHANNEL_SPECTRUM) && (PIN->PID2 <= RCVPT_8192_CHANNEL_SPECTRUM_STATUS))) { // spectrum / spectrum+status
00130             ParsePkt = preqProcessSpectrum;
00131         //} else if ((PIN->PID1 == PID1_RCV_SCOPE_MISC) && (PIN->PID2 == PID2_SEND_SCOPE_DATA)) { //scope data packet
00132         //    ParsePkt = preqProcessScopeData;
00133         //} else if ((PIN->PID1 == PID1_RCV_SCOPE_MISC) && (PIN->PID2 == PID2_SEND_512_BYTE_MISC_DATA)) { //text data packet
00134         //    ParsePkt = preqProcessTextData;
00135         } else if ((PIN->PID1 == PID1_RCV_SCOPE_MISC) && (PIN->PID2 == RCVPT_SCOPE_DATA)) { //scope data packet
00136             //ScopeOverFlow = false;
00137             ParsePkt = preqProcessScopeData;
00138         } else if ((PIN->PID1 == PID1_RCV_SCOPE_MISC) && (PIN->PID2 == RCVPT_512_BYTE_MISC_DATA)) { //text data packet
00139             ParsePkt = preqProcessTextData;
00140         } else if ((PIN->PID1 == PID1_RCV_SCOPE_MISC) && (PIN->PID2 == RCVPT_SCOPE_DATA_WITH_OVERFLOW)) { //scope data with overflow packet
00141             //ScopeOverFlow = true;
00142             //ParsePkt = preqProcessScopeData;
00143             ParsePkt = preqProcessScopeDataOverFlow;
00144         } else if ((PIN->PID1 == PID1_RCV_SCOPE_MISC) && (PIN->PID2 == RCVPT_ETHERNET_SETTINGS)) { //ethernet settings packet
00145             //ParsePkt = preqProcessInetSettings;
00146         } else if ((PIN->PID1 == PID1_RCV_SCOPE_MISC) && (PIN->PID2 == RCVPT_DIAGNOSTIC_DATA)) { //diagnostic data  packet
00147             ParsePkt = preqProcessDiagData;
00148         //} else if ((PIN->PID1 == PID1_RCV_SCOPE_MISC) && (PIN->PID2 == RCVPT_HARDWARE_DESCRIPTION)) { //hardware description packet
00149             //ParsePkt = preqProcessHwDesc;
00150         } else if ((PIN->PID1 == PID1_RCV_SCOPE_MISC) && (PIN->PID2 == RCVPT_CONFIG_READBACK)) {
00151             ParsePkt = preqProcessCfgRead;
00152         //} else if ((PIN->PID1 == PID1_RCV_SCOPE_MISC) && (PIN->PID2 == RCVPT_NETFINDER_READBACK)) {
00153             //ParsePkt = preqProcessNetFindRead;
00154         } else if ((PIN->PID1 == PID1_RCV_SCOPE_MISC) && (PIN->PID2 == RCVPT_OPTION_PA_CALIBRATION)) {
00155             ParsePkt = preqProcessPaCal;
00156         } else if (PIN->PID1 == PID1_ACK) {
00157             ParsePkt = preqProcessAck;
00158         } else {
00159             PIN->STATUS = PID2_ACK_PID_ERROR;  // unknown PID
00160             ParsePkt = preqProcessError;
00161         }
00162     } else {
00163         ParsePkt = preqProcessError;
00164     }
00165 
00166     //PIN->PID1 = 0;    // overwrite the PIDs so packet can't be erroneously processed again
00167     //PIN->PID2 = 0;
00168 
00169         return ParsePkt;
00170 }
00171 
00172 //ElseIf PIN.PID2 = 7 Then ' Config readback response packet
00173 //    txtConfig.Text = ""
00174 //    For X = 0 To PIN.LEN - 1
00175 //        txtConfig.Text = txtConfig.Text + Chr(PIN.DATA(X))
00176 //        If Chr(PIN.DATA(X)) = ";" Then
00177 //            txtConfig.Text = txtConfig.Text + vbCrLf
00178 //        End If
00179 //    Next X
00180 
00181 
00182 
00183 
00184 
00185 
00186 
00187