/// <summary> /// Executor that implements requesting and rendering sub grid information to create the cell datum /// </summary> public async Task <CellDatumResponse_ClusterCompute> ExecuteAsync(CellDatumRequestArgument_ClusterCompute arg, SubGridSpatialAffinityKey key) { Log.LogInformation($"Performing Execute for DataModel:{arg.ProjectID}, Mode={arg.Mode}"); var result = new CellDatumResponse_ClusterCompute { ReturnCode = CellDatumReturnCode.UnexpectedError }; var siteModel = DIContext.Obtain <ISiteModels>().GetSiteModel(arg.ProjectID); if (siteModel == null) { Log.LogError($"Failed to locate site model {arg.ProjectID}"); return(result); } IDesignWrapper cutFillDesign = null; if (arg.ReferenceDesign != null && arg.ReferenceDesign.DesignID != Guid.Empty) { var design = siteModel.Designs.Locate(arg.ReferenceDesign.DesignID); if (design == null) { throw new ArgumentException($"Design {arg.ReferenceDesign.DesignID} not a recognized design in project {arg.ProjectID}"); } cutFillDesign = new DesignWrapper(arg.ReferenceDesign, design); } await GetProductionData(siteModel, cutFillDesign, result, arg); return(result); }
public void Test_CellDatumResponse_ClusterCompute_MinimalContent() { var response = new CellDatumResponse_ClusterCompute { ReturnCode = CellDatumReturnCode.UnexpectedError }; SimpleBinarizableInstanceTester.TestClass(response, "Minimal CellDatumResponse_ClusterCompute not same after round trip serialisation"); }
public void Test_CellDatumResponse_ClusterCompute_WithContent() { var response = new CellDatumResponse_ClusterCompute { ReturnCode = CellDatumReturnCode.ValueFound, Value = 5, TimeStampUTC = DateTime.UtcNow.AddHours(-2.5) }; SimpleBinarizableInstanceTester.TestClass(response, "Custom CellDatumResponse_ClusterCompute not same after round trip serialisation"); }
public void Test_CellDatumResponse_ClusterCompute_Creation() { var response = new CellDatumResponse_ClusterCompute(); response.Should().NotBeNull(); }
/// <summary> /// Gets the production data values for the requested cell /// </summary> private async Task GetProductionData(ISiteModel siteModel, IDesignWrapper cutFillDesign, CellDatumResponse_ClusterCompute result, CellDatumRequestArgument_ClusterCompute arg) { var existenceMap = siteModel.ExistenceMap; var utilities = DIContext.Obtain <IRequestorUtilities>(); var requestors = utilities.ConstructRequestors(null, siteModel, arg.Overrides, arg.LiftParams, utilities.ConstructRequestorIntermediaries(siteModel, arg.Filters, true, GridDataType.CellProfile), AreaControlSet.CreateAreaControlSet(), existenceMap); // Get the sub grid relative cell location int cellX = arg.OTGCellX & SubGridTreeConsts.SubGridLocalKeyMask; int cellY = arg.OTGCellY & SubGridTreeConsts.SubGridLocalKeyMask; // Reach into the sub-grid request layer and retrieve an appropriate sub-grid var cellOverrideMask = new SubGridTreeBitmapSubGridBits(SubGridBitsCreationOptions.Unfilled); cellOverrideMask.SetBit(cellX, cellY); requestors[0].CellOverrideMask = cellOverrideMask; // using the cell address get the index of cell in clientGrid var thisSubGridOrigin = new SubGridCellAddress(arg.OTGCellX, arg.OTGCellY); var requestSubGridInternalResult = requestors[0].RequestSubGridInternal(thisSubGridOrigin, true, true); if (requestSubGridInternalResult.requestResult != ServerRequestResult.NoError) { if (requestSubGridInternalResult.requestResult == ServerRequestResult.SubGridNotFound) { result.ReturnCode = CellDatumReturnCode.NoValueFound; } else { Log.LogError($"Request for sub grid {thisSubGridOrigin} request failed with code {requestSubGridInternalResult.requestResult}"); } return; } var cell = ((ClientCellProfileLeafSubgrid)requestSubGridInternalResult.clientGrid).Cells[cellX, cellY]; if (cell.PassCount > 0) // Cell is not in our areaControlSet... { await ExtractRequiredValue(cutFillDesign, cell, result, arg); result.TimeStampUTC = cell.LastPassTime; } }
/// <summary> /// Gets the required datum from the cell according to the requested display mode /// </summary> private async Task ExtractRequiredValue(IDesignWrapper cutFillDesign, ClientCellProfileLeafSubgridRecord cell, CellDatumResponse_ClusterCompute result, CellDatumRequestArgument_ClusterCompute arg) { var success = false; int intValue; switch (arg.Mode) { case DisplayMode.Height: result.Value = cell.Height; success = result.Value != CellPassConsts.NullHeight; break; case DisplayMode.CCV: case DisplayMode.CompactionCoverage: result.Value = cell.LastPassValidCCV; success = result.Value != CellPassConsts.NullCCV; break; case DisplayMode.CCVPercent: case DisplayMode.CCVSummary: case DisplayMode.CCVPercentSummary: result.Value = 0; // default - no value... intValue = arg.Overrides.OverrideMachineCCV ? arg.Overrides.OverridingMachineCCV : cell.TargetCCV; if (intValue != 0) { success = cell.LastPassValidCCV != CellPassConsts.NullCCV && intValue != CellPassConsts.NullCCV; if (success) { result.Value = ((double)cell.LastPassValidCCV / intValue) * 100; } } break; case DisplayMode.PassCount: result.Value = cell.PassCount; success = result.Value != CellPassConsts.NullPassCountValue; break; case DisplayMode.PassCountSummary: result.Value = 0; // default - no value... if (arg.Overrides.OverrideTargetPassCount) { if (cell.PassCount > arg.Overrides.OverridingTargetPassCountRange.Max) { intValue = arg.Overrides.OverridingTargetPassCountRange.Max; } else if (cell.PassCount < arg.Overrides.OverridingTargetPassCountRange.Min) { intValue = arg.Overrides.OverridingTargetPassCountRange.Min; } else { intValue = cell.PassCount; } } else { intValue = cell.TargetPassCount; } if (intValue != 0) { success = cell.PassCount != CellPassConsts.NullPassCountValue; if (success) { result.Value = ((double)cell.PassCount / intValue) * 100; } } break; case DisplayMode.CutFill: result.Value = cell.Height; if (cutFillDesign != null) { var designSpotHeightResult = await cutFillDesign.Design.GetDesignSpotHeight(arg.ProjectID, cutFillDesign.Offset, arg.NEECoords.X, arg.NEECoords.Y); if (designSpotHeightResult.errorCode == DesignProfilerRequestResult.OK && designSpotHeightResult.spotHeight != CellPassConsts.NullHeight) { result.Value = result.Value - designSpotHeightResult.spotHeight; success = true; } } break; case DisplayMode.TemperatureSummary: case DisplayMode.TemperatureDetail: result.Value = cell.LastPassValidTemperature; success = cell.LastPassValidTemperature != CellPassConsts.NullMaterialTemperatureValue; if (success) { result.Value = cell.LastPassValidTemperature / 10.0; // temp is stored a int a 1 point precision } break; case DisplayMode.MDP: result.Value = cell.LastPassValidMDP; success = result.Value != CellPassConsts.NullMDP; break; case DisplayMode.MDPSummary: case DisplayMode.MDPPercent: case DisplayMode.MDPPercentSummary: result.Value = 0; // default - no value... intValue = arg.Overrides.OverrideMachineMDP ? arg.Overrides.OverridingMachineMDP : cell.TargetMDP; if (intValue != 0) { success = cell.LastPassValidMDP != CellPassConsts.NullMDP && intValue != CellPassConsts.NullMDP; if (success) { result.Value = ((double)cell.LastPassValidMDP / intValue) * 100; } } break; case DisplayMode.MachineSpeed: result.Value = cell.MachineSpeed; success = cell.MachineSpeed != Consts.NullMachineSpeed; break; case DisplayMode.CCVPercentChange: case DisplayMode.CMVChange: result.Value = cell.CCVChange; success = cell.CCVChange != CellPassConsts.NullCCV; break; case DisplayMode.Latency: case DisplayMode.RMV: case DisplayMode.Frequency: case DisplayMode.Amplitude: case DisplayMode.Moisture: case DisplayMode.GPSMode: case DisplayMode.VolumeCoverage: break; } result.ReturnCode = success ? CellDatumReturnCode.ValueFound : CellDatumReturnCode.NoValueFound; }