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

📄 probe_com.c

📁 ucos-ii 的完整代码
💻 C
📖 第 1 页 / 共 5 页
字号:
                     (void     *)s,
                     (CPU_SIZE_T)nbytes_wr);

            ProbeComStrBufWrIx  = wr_ix_n;                          /* Assign new global write index                        */
            s                  += nbytes_wr;                        /* Increase string pointer                              */
            len                -= nbytes_wr;                        /* Decrease string length                               */
        }
    }
}
#endif


/*
*********************************************************************************************************
*********************************************************************************************************
**                                  Static String-Handling Function
*********************************************************************************************************
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*                                            ProbeCom_StrRdy()
*
* Description : Check if a string is ready for transmission.
*
* Argument(s) : none.
*
* Return(s)   : DEF_TRUE   if a  string is in the buffer for transmission.
*               DEF_FALSE  if no string is in the buffer for transmission.
*
* Note(s)     : (1) See Notes for 'ProbeCom_TxStr()'.
*********************************************************************************************************
*/

#if (PROBE_COM_SUPPORT_STR == DEF_TRUE)
static  CPU_BOOLEAN  ProbeCom_StrRdy (void)
{
    CPU_BOOLEAN  rdy;
    CPU_INT16U   wr_ix;
    CPU_INT16U   rd_ix;


    wr_ix = ProbeComStrBufWrIx;
    rd_ix = ProbeComStrBufRdIx;

    if (wr_ix == rd_ix) {
        rdy = DEF_FALSE;
    } else {
        rdy = DEF_TRUE;
    }

    return (rdy);
}
#endif


/*
*********************************************************************************************************
*********************************************************************************************************
**                                  Static Packet-Handling Functions
*********************************************************************************************************
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*                                         ProbeCom_PktModifier()
*
* Description : Get packet modfier byte.
*
* Argument(s) : none.
*
* Return(s)   : The modifier byte.
*********************************************************************************************************
*/

static  CPU_INT08U  ProbeCom_PktModifier (void)
{
#if (PROBE_COM_SUPPORT_STR == DEF_TRUE)

    if (ProbeCom_StrRdy() == DEF_TRUE) {
        return (PROBE_COM_MODIFIER_STR_HAVE);
    } else {
        return (PROBE_COM_MODIFIER_NONE);
    }

#else

    return (PROBE_COM_MODIFIER_NONE);

#endif
}


/*
*********************************************************************************************************
*                                       ProbeCom_CmdError()
*
* Description : Formulate error response when the target receives a request it cannot handle.
*
* Argument(s) : tx_buf       Pointer to the transmit buffer
*
*               com_error    Error that occurred
*
* Return(s)   : The number of bytes written to the tx buffer.
*
* Note(s)     : (1) The TX format:
*
*                   (A) A 2-byte format  , indicating the data segment format;                      AND
*                   (B) A 1-byte constant, PROBE_RS232_OK,   if the location can    be read;        OR
*                       A 1-byte constant, PROBE_RS232_FAIL, if the location cannot be read.
*                   (C) A 1-byte modifier.
*
*                         +-------------------------+------------+------------+
*                         |          Format         |   Status   |  Modifier  |
*                         +-------------------------+------------+------------+

*
*********************************************************************************************************
*/

static  CPU_INT16U  ProbeCom_CmdError (CPU_INT08U  *tx_buf,
                                       CPU_INT08U   com_error)
{
#if (PROBE_COM_STAT_EN == DEF_ENABLED)
    ProbeCom_ErrPktCtr++;
#endif

    ProbeCom_StoINT16U(&tx_buf, PROBE_COM_FMT_TX_ERROR);            /*  (a) TX packet format                                */
    ProbeCom_StoINT8U( &tx_buf, com_error);                         /*  (b) Target status                                   */
    ProbeCom_StoINT8U( &tx_buf, ProbeCom_PktModifier());            /*  (c) Modifier                                        */
    return (PROBE_COM_SIZE_TX_HEADER);                              /*  (d) Return TX data segment size                     */
                                                                    /*        =  4      (= Tx header size)                  */
}


/*
*********************************************************************************************************
*                                       ProbeCom_CmdQuery()
*
* Description : Parse the FMT_QUERY command & formulate response.  This command asks the target
*               about its capabilities, which are returned in response.
*
* Argument(s) : rx_buf      Pointer to the receive  buffer
*
*               tx_buf      Pointer to the transmit buffer
*
*               rx_pkt_sz   Size  of the receive  packet
*
*               tx_buf_sz   Size  of the transmit buffer
*
* Return(s)   : The number of bytes written to the tx buffer.
*
* Note(s)     : (1) The RX format:
*
*                   (A) A 2-byte format  , indicating the data segment format;                      AND
*                   (B) A 2-byte query   , indicating the length of the remaining data.
*
*                         +-------------------------+-------------------------+
*                         |          Format         |          Query          |
*                         +-------------------------+-------------------------+
*
*              (2) The TX format:
*
*                   (A) A 2-byte format  , indicating the data segment format;                      AND
*                   (B) A 1-byte status  , indicating the status after the request;                 AND
*                   (C) A 1-byte modifier;                                                          AND
*                   (E) A n-byte answer  , the answer to the query.
*
*                         +-------------------------+------------+------------+
*                         |          Format         |   Status   |  Modifier  |
*                         +-------------------------+------------+------------+
*                         |                       Answer                      |
*                         |                         .                         |
*                         |                         .                         |
*                         |                         .                         |
*                         +---------------------------------------------------+
*
*********************************************************************************************************
*/

static  CPU_INT16U  ProbeCom_CmdQuery (CPU_INT08U  *rx_buf,
                                       CPU_INT08U  *tx_buf,
                                       CPU_INT16U   rx_pkt_sz,
                                       CPU_INT16U   tx_buf_sz)
{
    CPU_INT16U  query;
    CPU_INT16U  nbytes;


    query  = 0;
    nbytes = 0;

    if (rx_pkt_sz == 4) {                                           /* If RX data segment is the expected size              */
                                                                    /*        =  2      (= Rx header size)                  */
                                                                    /*        +  2      (= Query         )                  */

        query = ProbeCom_GetINT16U(&rx_buf);                        /*  (a) Read the query                                  */

        switch (query) {
            case PROBE_COM_QUERY_MAX_RX_SIZE:
            case PROBE_COM_QUERY_MAX_TX_SIZE:
            case PROBE_COM_QUERY_FMT_SUPPORT:
            case PROBE_COM_QUERY_ENDIANNESS_TEST:
                 break;

            default:
                 return (ProbeCom_CmdError(tx_buf, PROBE_COM_STATUS_QUERY_NOT_SUPPORTED));
        }

    } else {                                                        /* If RX data segment is NOT the expected size          */

        return (ProbeCom_CmdError(tx_buf, PROBE_COM_STATUS_RX_PKT_WRONG_SIZE));
    }

                                                                    /* No error                                             */
    ProbeCom_StoINT16U(&tx_buf, PROBE_COM_FMT_TX_QUERY);            /*  (a) TX packet format                                */
    ProbeCom_StoINT8U( &tx_buf, PROBE_COM_STATUS_OK);               /*  (b) Target status                                   */
    ProbeCom_StoINT8U( &tx_buf, ProbeCom_PktModifier());            /*  (c) Modifier                                        */

                                                                    /*  (d) Save TX data segment data                       */
    switch (query) {

        case PROBE_COM_QUERY_MAX_RX_SIZE:
             ProbeCom_StoINT16U(&tx_buf, PROBE_COM_RX_MAX_SIZE);
             ProbeCom_StoINT16U(&tx_buf, 0);
             nbytes  = 4;
             break;

        case PROBE_COM_QUERY_MAX_TX_SIZE:
             ProbeCom_StoINT16U(&tx_buf, PROBE_COM_TX_MAX_SIZE);
             ProbeCom_StoINT16U(&tx_buf, 0);
             nbytes  = 4;
             break;

        case PROBE_COM_QUERY_FMT_SUPPORT:
             ProbeCom_StoINT16U(&tx_buf, PROBE_COM_FMT_RX_QUERY      );
             ProbeCom_StoINT16U(&tx_buf, PROBE_COM_FMT_RX_SIMPLE_RD  );
             nbytes  = 4;
#if (PROBE_COM_SUPPORT_WR == DEF_TRUE)
             ProbeCom_StoINT16U(&tx_buf, PROBE_COM_FMT_RX_SIMPLE_WR  );
             nbytes += 2;
#endif
             ProbeCom_StoINT16U(&tx_buf, PROBE_COM_FMT_RX_MULTIPLE_RD);
             nbytes += 2;
#if (PROBE_COM_SUPPORT_STR == DEF_TRUE)
             ProbeCom_StoINT16U(&tx_buf, PROBE_COM_FMT_RX_STR_GET);
             nbytes += 2;
#endif
             break;

        case PROBE_COM_QUERY_ENDIANNESS_TEST:
             ProbeComEndiannessTest = 0x12345678;
             Mem_Copy((void     *)tx_buf,
                      (void     *)&ProbeComEndiannessTest,
                      (CPU_SIZE_T)4);
             nbytes  = 4;
             break;

        default:
             break;
    }

    return ((CPU_INT16U)(nbytes + PROBE_COM_SIZE_TX_HEADER));       /*  (e) Return TX data segment size                     */
                                                                    /*        =  nbytes (= Tx data   size)                  */
                                                                    /*        +  4      (= Tx header size)                  */
}


⌨️ 快捷键说明

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