Exemplo n.º 1
0
        protected override void OnHandledInternal(DataReceivedUnit ou)
        {
            ou.SetNextActionItems();
            byte nodeId = ReceivedAchData.SrcNodeId;

            byte[] command          = ReceivedAchData.Command;
            var    scheme           = (SecuritySchemes)ReceivedAchData.SecurityScheme;
            bool   isSuportedScheme = IsSupportedScheme(_network, command, scheme);

            if (command != null && command.Length > 1 && isSuportedScheme)
            {
                switch (command[1])
                {
                case (COMMAND_CLASS_FIRMWARE_UPDATE_MD_V5.FIRMWARE_MD_GET.ID):
                {
                    ou.SetNextActionItems(SendFwuMdReport(nodeId, scheme));
                }
                break;

                case (COMMAND_CLASS_FIRMWARE_UPDATE_MD_V5.FIRMWARE_UPDATE_MD_REQUEST_GET.ID):
                {
                    ou.SetNextActionItems(HandleCmdClassFirmwareUpdateMdReqGet(nodeId, command, scheme));
                    if (_pStatus == 0xFF)
                    {
                        _firmwareOffset = 0;
                        ou.AddNextActionItems(SendFwuMdGet(nodeId, START_REPORT_NUMBER, scheme));
                        _firmwareUpdateNvmInit.NewToken();
                        ou.AddNextActionItems(_firmwareUpdateNvmInit);
                        _firmwareUpdateNvmSetNewImageFalse.NewToken();
                        ou.AddNextActionItems(_firmwareUpdateNvmSetNewImageFalse);
                    }
                }
                break;

                case (COMMAND_CLASS_FIRMWARE_UPDATE_MD_V5.FIRMWARE_UPDATE_MD_REPORT.ID):
                {
                    HandleCmdClassFirmwareUpdateMdReport(ou, nodeId, command, scheme);
                }
                break;

                default:
                    break;
                }
            }
        }
Exemplo n.º 2
0
        /// <summary>handleCmdClassFirmwareUpdateMdReport</summary>
        private void HandleCmdClassFirmwareUpdateMdReport(DataReceivedUnit ou, byte nodeId, byte[] command, SecuritySchemes scheme)
        {
            var fwuMdReport      = (COMMAND_CLASS_FIRMWARE_UPDATE_MD_V5.FIRMWARE_UPDATE_MD_REPORT)command;
            var lastReportNumber = Tools.GetBytes(_lastUsedReportNumber);

            if (fwuMdReport.properties1.reportNumber1 == lastReportNumber[0] &&
                fwuMdReport.reportNumber2 == lastReportNumber[1])
            {
                var crc16Res = Tools.CalculateCrc16Array(command.Take(command.Length - 2));
                if (crc16Res.SequenceEqual(fwuMdReport.checksum))
                {
                    var    data    = fwuMdReport.data;
                    ushort dataLen = (ushort)data.Count;
                    var    _firmwareUpdateNvmWrite = new FirmwareUpdateNvmWriteOperation(_firmwareOffset, dataLen, data.ToArray());
                    ou.SetNextActionItems(_firmwareUpdateNvmWrite);
                    _firmwareOffset += dataLen;

                    if (fwuMdReport.properties1.last == 0x00)
                    {
                        ushort nextReportNumber = (ushort)(_lastUsedReportNumber + 1);
                        ou.AddNextActionItems(SendFwuMdGet(nodeId, nextReportNumber, scheme));
                    }
                    else
                    {
                        _firmwareUpdateNvmSetNewImageTrue.NewToken();
                        ou.AddNextActionItems(_firmwareUpdateNvmSetNewImageTrue);
                        ou.AddNextActionItems(SendFwuMdStatusReport(nodeId, 0xFF, scheme));
                    }
                }
                else //FW_EV_UPDATE_STATUS_UNABLE_TO_RECEIVE
                {
                    "invalid MD report"._DLOG();
                    //retransmit request on the previous frame
                    ou.SetNextActionItems(SendFwuMdGet(nodeId, _lastUsedReportNumber, scheme));
                }
            }
        }