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; } } }
/// <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)); } } }