⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 decdirda.c

📁 收集到的orion_ep93xx_wince_bsp_1-3-507红外收发驱动源码,未作测试
💻 C
📖 第 1 页 / 共 2 页
字号:
            *ppOutStr += wsprintf(*ppOutStr, TEXT("Bad LM-PDU type: "));
            RawDump((BYTE *) pLMHeader, pEndBuf, ppOutStr);
    }
}
/*---------------------------------------------------------------------------*/
void
DumpPV(TCHAR *PVTable[], UINT PV, TCHAR **ppOutStr)
{
    int i;
    BOOL First = TRUE;
    UINT Mask = 1;
    
    for (i = 0; i < 16; i++)
    {
        if (PV & (Mask))
        {
            if (First)
            {
                *ppOutStr += wsprintf(*ppOutStr, PVTable[i]);
                First = FALSE;
            }
            else
                *ppOutStr += wsprintf(*ppOutStr, TEXT(",%s"), PVTable[i]);
        }
        Mask *= 2;
    }
    *(*ppOutStr)++ = '>';
}
/*---------------------------------------------------------------------------*/
void
DecodeNegParms(BYTE *pCurPos, BYTE *pEndBuf, TCHAR **ppOutStr)
{
	int		Len;
	UINT	Value;
	
    while (pCurPos+2 <= pEndBuf) {
		Len = *(pCurPos+1);
		switch (Len) {
		case 1 :
			Value = (UINT) *(pCurPos+2);
			break;
		case 2 :
			Value = (UINT) (((*(pCurPos+3)) << 8) | *(pCurPos+2));
			break;
		}
		
        switch (*pCurPos)
        {
            case NEG_PI_BAUD:
                *ppOutStr += wsprintf(*ppOutStr, TEXT("<baud:"));
                DumpPV(vBaud, Value, ppOutStr);
                BaudBitMask = Value;
                break;

            case NEG_PI_MAX_TAT:
                *ppOutStr += wsprintf(*ppOutStr, TEXT("<max TAT:"));
                DumpPV(vMaxTAT, Value, ppOutStr);
                break;

            case NEG_PI_DATA_SZ:
                *ppOutStr += wsprintf(*ppOutStr, TEXT("<data size:"));
                DumpPV(vDataSize, Value, ppOutStr);
                break;
                
            case NEG_PI_WIN_SZ:
                *ppOutStr += wsprintf(*ppOutStr, TEXT("<win size:"));
                DumpPV(vWinSize, Value, ppOutStr);
                break;
                
            case NEG_PI_BOFS:
                *ppOutStr += wsprintf(*ppOutStr, TEXT("<BOFs:"));
                DumpPV(vNumBofs, Value, ppOutStr);
                break;
                
            case NEG_PI_MIN_TAT:
                *ppOutStr += wsprintf(*ppOutStr, TEXT("<min TAT:"));
                DumpPV(vMinTAT, Value, ppOutStr);
                break;
            case NEG_PI_DISC_THRESH:
                *ppOutStr += wsprintf(*ppOutStr, TEXT("<disc thresh:"));
                DumpPV(vDiscThresh, Value, ppOutStr);
                break;
                
            default:
                *ppOutStr += wsprintf(*ppOutStr, TEXT("!!BAD PARM:%02X!!"),*pCurPos);
                break;
        }
		pCurPos += Len + 2;		
    }
}
 /*---------------------------------------------------------------------------*/
void
DecodeXID(BYTE *FormatID, BYTE *pEndBuf, TCHAR **ppOutStr)
{
    XID_DISCV_FORMAT *DiscvFormat=(XID_DISCV_FORMAT *)((BYTE *)FormatID + 1);
    BYTE *NegParms = FormatID + 1;
    BYTE *DiscvInfo = FormatID + sizeof(XID_DISCV_FORMAT);

    switch (*FormatID)
    {
      case XID_DISCV_FORMAT_ID:
        *ppOutStr += wsprintf(*ppOutStr, TEXT("dscv "));
        if (DiscvFormat->GenNewAddr)
            *ppOutStr += wsprintf(*ppOutStr, TEXT("new addr "));
        *ppOutStr += wsprintf(*ppOutStr, TEXT("sa:%02X%02X%02X%02X "),
                              DiscvFormat->SrcAddr[0],
                              DiscvFormat->SrcAddr[1],
                              DiscvFormat->SrcAddr[2],
                              DiscvFormat->SrcAddr[3]);
        *ppOutStr += wsprintf(*ppOutStr, TEXT("da:%02X%02X%02X%02X "),
                              DiscvFormat->DestAddr[0],
                              DiscvFormat->DestAddr[1],
                              DiscvFormat->DestAddr[2],
                              DiscvFormat->DestAddr[3]);
        *ppOutStr += wsprintf(*ppOutStr, TEXT("Slot:%02X/%X "),
                              DiscvFormat->SlotNo,
                              vSlotTable[DiscvFormat->NoOfSlots]);
        RawDump(DiscvInfo, pEndBuf, ppOutStr);
        break;

          case XID_NEGPARMS_FORMAT_ID:
            *ppOutStr += wsprintf(*ppOutStr, TEXT("Neg Parms "));
            DecodeNegParms(NegParms, pEndBuf, ppOutStr);        
            break;
    }
}
/*---------------------------------------------------------------------------*/
void
BadFrame(BYTE *pFrameBuf, BYTE *pEndBuf, TCHAR **ppOutStr)
{
    *ppOutStr += wsprintf(*ppOutStr, TEXT("Undefined Frame: "));
    RawDump(pFrameBuf, pEndBuf, ppOutStr);
}

/*---------------------------------------------------------------------------*/
TCHAR *DecodeIRDA(int  *pFrameType,// returned frame type (-1=bad frame)
                BYTE *pFrameBuf, // pointer to buffer containing IRLAP frame
                UINT FrameLen,   // length of buffer 
                TCHAR *pOutStr,  // string where decoded packet is placed   
                UINT DecodeLayer,// 1,LAP only, 2 LAP/LMP, 3, LAP/LMP/TTP
                BOOL fNoConnAddr,// TRUE->Don't show connection address in str
                int  DispMode 
)
{
    UINT CRBit;
    UINT PFBit;
    BYTE *Addr = pFrameBuf;
    BYTE *Cntl = pFrameBuf + 1;
    TCHAR CRStr[] = TEXT("   ");
    TCHAR PFChar = TEXT(' ');
    SNRM_FORMAT *SNRMFormat = (SNRM_FORMAT *) ((BYTE *) pFrameBuf + 2);
    UA_FORMAT *UAFormat = (UA_FORMAT *) ((BYTE *) pFrameBuf + 2);
    UINT Nr = IRLAP_GET_NR(*Cntl);
    UINT Ns = IRLAP_GET_NS(*Cntl);
    BYTE *pEndBuf = pFrameBuf + FrameLen - 1;
    TCHAR *First = pOutStr;

    vDispMode = DispMode;
    
    vDecodeLayer = DecodeLayer;

    if ( !fNoConnAddr)
        pOutStr += wsprintf(pOutStr, TEXT("ca:%02X "), IRLAP_GET_ADDR(*Addr));
    
    CRBit = IRLAP_GET_CRBIT(*Addr);
    _tcscpy(CRStr, CRBit == _IRLAP_CMD ? TEXT("cmd"):TEXT("rsp"));
    
    PFBit = IRLAP_GET_PFBIT(*Cntl);
    if (1 == PFBit)
    {
        if (CRBit == _IRLAP_CMD)
            PFChar = 'P';
        else
            PFChar ='F';
    }
    
    *pFrameType = IRLAP_FRAME_TYPE(*Cntl);

    switch (IRLAP_FRAME_TYPE(*Cntl))
    {
        case IRLAP_I_FRM:
            pOutStr += wsprintf(pOutStr, TEXT("I %s %c ns:%01d nr:%01d "),
                               CRStr, PFChar, Ns, Nr);
            DecodeIFrm(pFrameBuf + 2, pEndBuf, &pOutStr);
            break;
            
        case IRLAP_S_FRM:
            *pFrameType =  IRLAP_GET_SCNTL(*Cntl);
            
            switch (IRLAP_GET_SCNTL(*Cntl))
            {
                case IRLAP_RR:
                    pOutStr += wsprintf(pOutStr, TEXT("RR %s %c nr:%01d"),
                                        CRStr, PFChar, Nr);
                    break;
                    
                case IRLAP_RNR:
                    pOutStr += wsprintf(pOutStr, TEXT("RNR %s %c nr:%01d"),
                                        CRStr, PFChar, Nr);
                    break;
                    
                case IRLAP_REJ:
                    pOutStr += wsprintf(pOutStr, TEXT("REJ %s %c nr:%01d"),
                                        CRStr, PFChar, Nr);
                    break;

                case IRLAP_SREJ:
                    pOutStr += wsprintf(pOutStr, TEXT("SREJ %s %c nr:%01d"),
                                        CRStr, PFChar, Nr);
                    break;
                default:
                    BadFrame(pFrameBuf, pEndBuf, &pOutStr);
            }
            break;
            
        case IRLAP_U_FRM:
            *pFrameType =  IRLAP_GET_UCNTL(*Cntl);
            switch (IRLAP_GET_UCNTL(*Cntl))
            {
                case IRLAP_UI:
                    pOutStr += wsprintf(pOutStr,TEXT("UI %s %c "),
                                        CRStr, PFChar);
                    RawDump(pFrameBuf + 2, pEndBuf, &pOutStr);
                    break;
         
                case IRLAP_XID_CMD:
                case IRLAP_XID_RSP:
                    pOutStr += wsprintf(pOutStr,TEXT("XID %s %c "),
                                          CRStr, PFChar);
                    DecodeXID(pFrameBuf + 2, pEndBuf, &pOutStr);
                    break;

                case IRLAP_TEST:
                    pOutStr += wsprintf(pOutStr, TEXT("TEST %s %c "),
                                       CRStr, PFChar);
                    pOutStr += wsprintf(pOutStr, 
                              TEXT("sa:%02X%02X%02X%02X da:%02X%02X%02X%02X "),
                                         UAFormat->SrcAddr[0],
                                         UAFormat->SrcAddr[1],
                                         UAFormat->SrcAddr[2],
                                         UAFormat->SrcAddr[3],
                                         UAFormat->DestAddr[0],
                                         UAFormat->DestAddr[1],
                                         UAFormat->DestAddr[2],
                                         UAFormat->DestAddr[3]);
                    RawDump(pFrameBuf + 1 + sizeof(UA_FORMAT), pEndBuf,
                            &pOutStr);                    
                    break;
                    
                case IRLAP_SNRM:
                    if (CRBit == _IRLAP_CMD)
                    {
                        pOutStr += wsprintf(pOutStr,TEXT("SNRM %s %c "),
                                            CRStr,PFChar);
                        if ((BYTE *) SNRMFormat < pEndBuf)
                        {
                            pOutStr += wsprintf(pOutStr,
                     TEXT("sa:%02X%02X%02X%02X da:%02X%02X%02X%02X ca:%02X "),
                                            SNRMFormat->SrcAddr[0],
                                            SNRMFormat->SrcAddr[1],
                                            SNRMFormat->SrcAddr[2],
                                            SNRMFormat->SrcAddr[3],
                                            SNRMFormat->DestAddr[0],
                                            SNRMFormat->DestAddr[1],
                                            SNRMFormat->DestAddr[2],
                                            SNRMFormat->DestAddr[3],
                                            // CRBit stored in conn addr
                                            // according to spec...
                                            (SNRMFormat->ConnAddr) >>1);
                            DecodeNegParms(&(SNRMFormat->FirstPI), 
                                           pEndBuf, &pOutStr);
							if (vDispMode == DISP_HEX || vDispMode == DISP_BOTH)
							{
								RawDump(pFrameBuf + 2, pEndBuf, &pOutStr);
							}
                        }
                    }
                    else
                        pOutStr += wsprintf(pOutStr,
                                            TEXT("RNRM %s %c "),CRStr,PFChar);
                    break;
                    
                case IRLAP_DISC:
                    if (CRBit == _IRLAP_CMD)
                        pOutStr += wsprintf(pOutStr, TEXT("DISC %s %c "),
                                           CRStr, PFChar);
                    else
                        pOutStr += wsprintf(pOutStr, TEXT("RD %s %c "),
                                           CRStr, PFChar);
                    break;
                    
                case IRLAP_UA:
                    pOutStr += wsprintf(pOutStr,
                                        TEXT("UA %s %c "),CRStr,PFChar);

                    if ((BYTE *) UAFormat < pEndBuf)
                    {
                        pOutStr += wsprintf(pOutStr, 
                              TEXT("sa:%02X%02X%02X%02X da:%02X%02X%02X%02X "),
                                         UAFormat->SrcAddr[0],
                                         UAFormat->SrcAddr[1],
                                         UAFormat->SrcAddr[2],
                                         UAFormat->SrcAddr[3],
                                         UAFormat->DestAddr[0],
                                         UAFormat->DestAddr[1],
                                         UAFormat->DestAddr[2],
                                         UAFormat->DestAddr[3]);

                        DecodeNegParms(&(UAFormat->FirstPI), pEndBuf, 
                                       &pOutStr);
						if (vDispMode == DISP_HEX || vDispMode == DISP_BOTH)
						{
							RawDump(pFrameBuf + 2, pEndBuf, &pOutStr);
						}
                    }
                    break;
                    
                case IRLAP_FRMR:
                    pOutStr += wsprintf(pOutStr, TEXT("FRMR %s %c "),
                                       CRStr, PFChar);
                    RawDump(pFrameBuf + 2, pEndBuf, &pOutStr);
                    break;                    
                case IRLAP_DM:
                    pOutStr += wsprintf(pOutStr, TEXT("DM %s %c "),
                                       CRStr, PFChar);
                    break;                   
 
                default:
                    BadFrame(pFrameBuf, pEndBuf, &pOutStr);
            }
            break;
        default:
            *pFrameType = -1;
            BadFrame(pFrameBuf, pEndBuf, &pOutStr);
    }
    *pOutStr = 0;

    return (First);
}
    
#endif // DEBUG

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -