예제 #1
0
        public static async Task PerformStmDfTest(IUsbDevice stmDfuDevice)
        {
            ////////////////////////////////////////////////////////////
            // required to perform a DFU Clear Status request beforehand
            await stmDfuDevice.ClearStatusAsync();

            // this sequence aims to test the "send data to device" using the Control Transfer
            // executes a DFU "Set Address Pointer" command through the DFU DNLOAD request
            ////////////////////////////////////
            // 1st step: send DFU_DNLOAD request
            var dfuRequestResult = await stmDfuDevice.PerformControlTransferWithRetry(ud => ud.SendDownloadRequestAsync());

            // Assert that the bytes transfered match the buffer lenght
            Assert.IsTrue(dfuRequestResult.BytesTransferred == StmDfuExtensions.DownloadRequestLength);

            ///////////////////////////////////////
            // 2nd step: send DFU_GETSTATUS request
            dfuRequestResult = await stmDfuDevice.PerformControlTransferWithRetry(ud => ud.GetStatusAsync());

            // Assert that the received buffer has the requested lenght
            Assert.IsTrue(dfuRequestResult.BytesTransferred == StmDfuExtensions.GetStatusPacketLength);

            // check DFU status
            Assert.IsTrue(dfuRequestResult.Data[4] != STATE_DFU_IDLE);

            ///////////////////////////////////////////////////////////////
            // 3rd step: send new DFU_GETSTATUS request to check execution
            dfuRequestResult = await stmDfuDevice.PerformControlTransferWithRetry(ud => stmDfuDevice.GetStatusAsync());

            // Assert that the received buffer has the requested lenght
            Assert.IsTrue(dfuRequestResult.BytesTransferred == StmDfuExtensions.GetStatusPacketLength);

            // check DFU status
            // status has to be different from STATUS_errTARGET
            // state has to be different from STATE_DFU_ERROR
            Assert.IsTrue(
                dfuRequestResult.Data[0] != STATUS_errTARGET &&
                dfuRequestResult.Data[4] != STATE_DFU_ERROR);
        }