From fad3c82b46098091d3fe506b409bcf3489dac12e Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Fri, 23 Oct 2020 19:51:07 +0200 Subject: [PATCH] Proseguo configurazione livelli di accesso dati ThermoCam + refactor --- Thermo.Active.Core/ThreadsFunctions.cs | 8 +- .../DTOModels/ThWarmers/DTOWarmers.cs | 80 +- Thermo.Active.NC/NcAdapter.cs | 165 +- .../Controllers/WebApi/RecipeController.cs | 1398 ++++++++--------- .../Controllers/WebApi/WarmersController.cs | 276 ++-- 5 files changed, 976 insertions(+), 951 deletions(-) diff --git a/Thermo.Active.Core/ThreadsFunctions.cs b/Thermo.Active.Core/ThreadsFunctions.cs index 7a7001be..82be3e18 100644 --- a/Thermo.Active.Core/ThreadsFunctions.cs +++ b/Thermo.Active.Core/ThreadsFunctions.cs @@ -803,6 +803,8 @@ public static class ThreadsFunctions if (libraryError.errorCode != 0) ManageLibraryError(libraryError); + int readCount = 0; + bool useCache = false; while (true) { sw.Restart(); @@ -810,12 +812,16 @@ public static class ThreadsFunctions // Check if client is connected if (ncAdapter.numericalControl.NC_IsConnected()) { + // every 10 reads all data... + useCache = (readCount == 0); // Get new data from PLC - libraryError = ncAdapter.ReadWarmers(out Dictionary currWarmers); + libraryError = ncAdapter.ReadWarmers(useCache, out Dictionary currWarmers); if (libraryError.IsError()) ManageLibraryError(libraryError); // pubblico MessageServices.Current.Publish(SEND_THERMO_WARMERS_DATA, null, currWarmers); + readCount++; + readCount = readCount % 10; } else RestoreConnection(); diff --git a/Thermo.Active.Model/DTOModels/ThWarmers/DTOWarmers.cs b/Thermo.Active.Model/DTOModels/ThWarmers/DTOWarmers.cs index 570f9dea..4a802308 100644 --- a/Thermo.Active.Model/DTOModels/ThWarmers/DTOWarmers.cs +++ b/Thermo.Active.Model/DTOModels/ThWarmers/DTOWarmers.cs @@ -2,6 +2,20 @@ { public class DTOWarmers { + #region Properties + + /// + /// Actual value of current on channel + /// + public double ActualCurrent { get; set; } = 0; + /// + /// Actual value of channel (%) + /// + public int ActualPerc { get; set; } = 0; + /// + /// Channel status + /// + public int ChannelStatus { get; set; } = 0; /// /// Channel Unique ID (from risk2007) /// @@ -11,48 +25,80 @@ /// public int IdReflector { get; set; } = 0; /// + /// Max power for channel (W) + /// + public int MaxPower { get; set; } = 0; + /// /// Setpoint from HMI (%) /// public int SetpointHMI { get; set; } = 0; - public int SetpointTermocam { get; set; } = 0; + /// + /// Setpoint from PLC (%) + /// public int SetpointPLC { get; set; } = 0; - public int ChannelStatus { get; set; } = 0; - public double ActualCurrent { get; set; } = 0; - public int ActualPerc { get; set; } = 0; - public int MaxPower { get; set; } = 0; + /// + /// Define if camera is active for channel + /// + public bool ThermocamActive { get; set; } = false; + /// + /// Actual value from last ThermoCam image acquisition (° Celsius) + /// + public double ThermocamActualTemp { get; set; } = 0; + /// + /// Setpoint from HMI (° Celsius) + /// + public double ThermocamSetpointTemp { get; set; } = 0; + #endregion Properties + #region Methods + + /// + /// Equality test for class object + /// + /// + /// public override bool Equals(object obj) { if (!(obj is DTOWarmers item)) return false; - if (IdChannel != item.IdChannel) - return false; - if (IdReflector != item.IdReflector) - return false; - if (SetpointHMI != item.SetpointHMI) - return false; - if (SetpointTermocam != item.SetpointTermocam) - return false; - if (SetpointPLC != item.SetpointPLC) - return false; - if (ChannelStatus != item.ChannelStatus) - return false; if (ActualCurrent != item.ActualCurrent) return false; if (ActualPerc != item.ActualPerc) return false; + if (ChannelStatus != item.ChannelStatus) + return false; + if (IdChannel != item.IdChannel) + return false; + if (IdReflector != item.IdReflector) + return false; if (MaxPower != item.MaxPower) return false; + if (SetpointHMI != item.SetpointHMI) + return false; + if (SetpointPLC != item.SetpointPLC) + return false; + if (ThermocamActive != item.ThermocamActive) + return false; + if (ThermocamActualTemp != item.ThermocamActualTemp) + return false; + if (ThermocamSetpointTemp != item.ThermocamSetpointTemp) + return false; return true; } + /// + /// Hash gen + /// + /// public override int GetHashCode() { return base.GetHashCode(); } + + #endregion Methods } } diff --git a/Thermo.Active.NC/NcAdapter.cs b/Thermo.Active.NC/NcAdapter.cs index aebf986d..31212354 100644 --- a/Thermo.Active.NC/NcAdapter.cs +++ b/Thermo.Active.NC/NcAdapter.cs @@ -739,50 +739,6 @@ namespace Thermo.Active.NC } } -#if false - // Read selected axes - libraryError = numericalControl.AXES_RSelectedAxis(ref processesData.SelectedAxis); - if (libraryError.IsError()) - return libraryError; - - QueueStatusModel queueStatus = new QueueStatusModel(); - // Get queue data - libraryError = numericalControl.FILES_RQueueDataByProcess(ref queueStatus, processesData.SelectedProcess); - if (libraryError.IsError()) - return libraryError; - - // Get selectedProcessData - SelectedProcessData selectedData = new SelectedProcessData(); - libraryError = numericalControl.PROC_RSelectedProcessData(processesData.SelectedProcess, ref selectedData); - if (libraryError.IsError()) - return libraryError; - - String UMeas = "mm"; - // Get process status - libraryError = numericalControl.NC_RUnitOfMeasure(ref UMeas); - if (libraryError.IsError()) - return libraryError; - - // Set data - processesData.QueueStatus = queueStatus.Status; - processesData.StartStopQueueEnabled = queueStatus.StartStopQueueEnabled; - - // Selected process data - processesData.ActiveOrigin = selectedData.Origin; - processesData.ActiveOffsetId = selectedData.ActiveOffsetId; - processesData.ProcessMessage = selectedData.ProcessMessage; - - // Overrides - processesData.RapidOverride = selectedData.RapidOverride; - processesData.WorkOverride = selectedData.WorkOverride; - - processesData.offsetData = selectedData.OffsetData; - - // Measure - processesData.UnitMeasure = UMeas; - - processesData.FeedOverride = selectedData.FeedOverride; -#endif return libraryError; } @@ -2110,48 +2066,7 @@ namespace Thermo.Active.NC return NO_ERROR; } - /// - /// Vero metodo lettura Warmers data da memoria PLC - /// - /// - /// - public CmsError ReadWarmersData(out Dictionary currentWarmers) - { - // init obj - currentWarmers = new Dictionary(); - // solo x S7... - if (NcConfig.NcVendor == NC_VENDOR.S7NET) - { - CmsError libraryError = NO_ERROR; - // leggo stato ricetta da PLC - Dictionary currPlcWarmers = new Dictionary(); - libraryError = numericalControl.PLC_RWarmerChannelList(ref currPlcWarmers); - - if (libraryError.IsError()) - return libraryError; - - // compongo con il resto delle info da config... do x scontato di avere TUTIT i 1024 channels - List warmersConfig = RiskChannelConfig.Select(x => new DTOWarmers() - { - IdChannel = x.IdChannel, - IdReflector = x.IdReflector, - SetpointHMI = x.SetpointRecipe, - SetpointTermocam = 0, // FIXME TODO x.SetpointTer, - SetpointPLC = currPlcWarmers[x.IdChannel].SetpointPLC, - ChannelStatus = currPlcWarmers[x.IdChannel].ChStatus, - ActualCurrent = currPlcWarmers[x.IdChannel].CurrAct, - ActualPerc = currPlcWarmers[x.IdChannel].PercAct, - MaxPower = x.MaxPower - }).ToList(); - } - else - { - currentWarmers = new Dictionary(); - } - - return NO_ERROR; - } /// /// Gestione strobe richiesta cambio modo /// @@ -2783,49 +2698,50 @@ namespace Thermo.Active.NC } /// - /// GEt all warmers data by channel + /// Get all warmers data by channel /// + /// if true uises cached data, if false reads from PLC /// List of <= 1024 warmers channels /// - public CmsError ReadWarmers(out Dictionary currWarmers) + public CmsError ReadWarmers(bool useCache, out Dictionary currWarmers) { CmsError libraryError = NO_ERROR; currWarmers = new Dictionary(); - DTOWarmers currVal = new DTOWarmers(); - - // read and return warmers data + // solo x S7... if (NcConfig.NcVendor == NC_VENDOR.S7NET) { - Dictionary currPlcWarmChan = new Dictionary(); - libraryError = numericalControl.PLC_RWarmerChannelList(ref currPlcWarmChan); + // leggo stato ricetta da PLC + Dictionary currPlcWarmers = new Dictionary(); + libraryError = numericalControl.PLC_RWarmerChannelList(ref currPlcWarmers); - foreach (var item in RiskChannelConfig) + if (libraryError.IsError()) + return libraryError; + try { - try + // compongo con il resto delle info da config... do x scontato di avere TUTIT i 1024 channels + List warmersConfig = RiskChannelConfig.Select(x => new DTOWarmers() { - ThermoModels.WarmerChannel currWarm = currPlcWarmChan[item.IdChannel]; - currVal = new DTOWarmers() - { - IdChannel = item.IdChannel, - IdReflector = item.IdReflector, - SetpointHMI = currWarm.SetpointHMI, - SetpointTermocam = currWarm.SetpointThermoCam, - SetpointPLC = currWarm.SetpointPLC, - ChannelStatus = currWarm.ChStatus, - ActualCurrent = currWarm.CurrAct, - ActualPerc = currWarm.PercAct, - MaxPower = item.MaxPower - }; - currWarmers.Add(item.IdChannel, currVal); - } - catch - { } + IdChannel = x.IdChannel, + IdReflector = x.IdReflector, + //SetpointHMI = x.SetpointRecipe, + SetpointHMI = currPlcWarmers[x.IdChannel].SetpointHMI, + ThermocamActive = currPlcWarmers[x.IdChannel].ThermocamActive, + ThermocamActualTemp = currPlcWarmers[x.IdChannel].ThermocamActualTemp, + ThermocamSetpointTemp = currPlcWarmers[x.IdChannel].ThermocamSetpoint, + SetpointPLC = currPlcWarmers[x.IdChannel].SetpointPLC, + ChannelStatus = currPlcWarmers[x.IdChannel].ChStatus, + ActualCurrent = currPlcWarmers[x.IdChannel].CurrAct, + ActualPerc = currPlcWarmers[x.IdChannel].PercAct, + MaxPower = x.MaxPower + }).ToList(); } + catch + { } + } + else + { + currWarmers = new Dictionary(); } - - // gestione errore - if (libraryError.IsError()) - return libraryError; // restituisco cod errore se trovato return libraryError; @@ -2906,13 +2822,24 @@ namespace Thermo.Active.NC return libraryError; } /// - /// Write all warmers termocam data for recipe + /// Write all warmers termocam TEMP data for reference /// - /// Oggetto parametri da aggiornare (from HMI) + /// Oggetto temperature canali da aggiornare (from HMI) come reference /// - public CmsError WriteRecipeWarmChSetpTermoCam(Dictionary updtSetpTCam) + public CmsError WriteRecipeWarmChSetpThermoCam(Dictionary referenceTemp) { - CmsError libraryError = numericalControl.PLC_WWarmerChSetpTCam(updtSetpTCam); + CmsError libraryError = numericalControl.PLC_WWarmerChTCamSetp(referenceTemp); + + return libraryError; + } + /// + /// Write all warmers ACTUAL termocam TEMP data + /// + /// Oggetto temperature canali letto da ThermoCam + /// + public CmsError WriteRecipeWarmChThermoCamActual(Dictionary actualTemp) + { + CmsError libraryError = numericalControl.PLC_WWarmerChTCamActual(actualTemp); return libraryError; } diff --git a/Thermo.Active/Controllers/WebApi/RecipeController.cs b/Thermo.Active/Controllers/WebApi/RecipeController.cs index 41f05e73..1760a082 100644 --- a/Thermo.Active/Controllers/WebApi/RecipeController.cs +++ b/Thermo.Active/Controllers/WebApi/RecipeController.cs @@ -24,724 +24,724 @@ using static Thermo.Active.Model.Constants; namespace Thermo.Active.Controllers.WebApi { - [RoutePrefix("api/recipe")] - public class RecipeController : ApiController - { - /// - /// Oggetto adapter condiviso da WebAPI - /// - protected static NcAdapter ncAdapter = new NcAdapter(); - - [Route("overview"), HttpGet] - public IHttpActionResult GetOverview() + [RoutePrefix("api/recipe")] + public class RecipeController : ApiController { - // // Try connection - CmsError libraryError = ncAdapter.Connect(); - if (libraryError.IsError()) - { - ThermoActiveLogger.LogError($"ncAdapter Not connected! | GetOverview | {libraryError.exception}"); - } + /// + /// Oggetto adapter condiviso da WebAPI + /// + protected static NcAdapter ncAdapter = new NcAdapter(); - libraryError = ncAdapter.GetRecipeOverview(out Dictionary currOverview); - if (libraryError.IsError()) - { - ThermoActiveLogger.LogError($"GetRecipeOverview error | {libraryError.exception}"); - return BadRequest(libraryError.localizationKey); - } - - return Ok(currOverview); - } - [Route("current"), HttpGet] - public IHttpActionResult GetCurrentParameters() - { - // Try connection - CmsError libraryError = ncAdapter.Connect(); - if (libraryError.IsError()) - { - ThermoActiveLogger.LogError($"NC Not connected! | GetCurrentParameters | {libraryError.exception}"); - return BadRequest(libraryError.localizationKey); - } - - libraryError = ncAdapter.ReadFullRecipe(out Dictionary currRecipe); - if (libraryError.IsError()) - { - ThermoActiveLogger.LogError($"GetRecipeOverview error | {libraryError.exception}"); - return BadRequest(libraryError.localizationKey); - } - - return Ok(currRecipe); - } - [Route("recipeNotes"), HttpGet] - public IHttpActionResult GetRecipeNotes() - { - return Ok(NcAdapter.RecipeLiveData.recipeNotes); - } - [Route("recipeChanged"), HttpGet] - public IHttpActionResult GetChanged() - { - return Ok(NcAdapter.RecipeLiveData.hasChanged); - } - - [Route("update"), HttpPut] - [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.RECIPE_MANAGER, Action = ACTIONS.READ)] - public IHttpActionResult WriteParameters(Dictionary parametersList) - { - if (parametersList != null) - { - if (NcAdapter.RecipeLiveData != null) + [Route("overview"), HttpGet] + public IHttpActionResult GetOverview() { - // Try connection - CmsError libraryError = ncAdapter.Connect(); - if (libraryError.IsError()) - { - ThermoActiveLogger.LogError($"NC Not connected! | WriteParameters | {libraryError.exception}"); - return InternalServerError(); - } - - // read recipe! - libraryError = ncAdapter.ReadFullRecipe(out Dictionary prevRecipe); - if (libraryError.IsError()) - { - ThermoActiveLogger.LogError($"GetRecipeOverview error | {libraryError.exception}"); - return BadRequest(libraryError.localizationKey); - } - - Dictionary updtRecipe = new Dictionary(); - foreach (var item in parametersList) - { - if (prevRecipe.ContainsKey(item.Key)) + // // Try connection + CmsError libraryError = ncAdapter.Connect(); + if (libraryError.IsError()) { - // aggiorno il valore HMI nel parametro - var currParam = prevRecipe[item.Key]; - // se il parametro richiesto è DIVERSO dal precedente su HMI... - if (currParam.SetpointHMI != item.Value) - { - currParam.SetpointHMI = item.Value; - // salvo (1 parametro, potrei fare N...) - updtRecipe.Add(item.Key, currParam); - } + ThermoActiveLogger.LogError($"ncAdapter Not connected! | GetOverview | {libraryError.exception}"); + } + + libraryError = ncAdapter.GetRecipeOverview(out Dictionary currOverview); + if (libraryError.IsError()) + { + ThermoActiveLogger.LogError($"GetRecipeOverview error | {libraryError.exception}"); + return BadRequest(libraryError.localizationKey); + } + + return Ok(currOverview); + } + [Route("current"), HttpGet] + public IHttpActionResult GetCurrentParameters() + { + // Try connection + CmsError libraryError = ncAdapter.Connect(); + if (libraryError.IsError()) + { + ThermoActiveLogger.LogError($"NC Not connected! | GetCurrentParameters | {libraryError.exception}"); + return BadRequest(libraryError.localizationKey); + } + + libraryError = ncAdapter.ReadFullRecipe(out Dictionary currRecipe); + if (libraryError.IsError()) + { + ThermoActiveLogger.LogError($"GetRecipeOverview error | {libraryError.exception}"); + return BadRequest(libraryError.localizationKey); + } + + return Ok(currRecipe); + } + [Route("recipeNotes"), HttpGet] + public IHttpActionResult GetRecipeNotes() + { + return Ok(NcAdapter.RecipeLiveData.recipeNotes); + } + [Route("recipeChanged"), HttpGet] + public IHttpActionResult GetChanged() + { + return Ok(NcAdapter.RecipeLiveData.hasChanged); + } + + [Route("update"), HttpPut] + [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.RECIPE_MANAGER, Action = ACTIONS.READ)] + public IHttpActionResult WriteParameters(Dictionary parametersList) + { + if (parametersList != null) + { + if (NcAdapter.RecipeLiveData != null) + { + // Try connection + CmsError libraryError = ncAdapter.Connect(); + if (libraryError.IsError()) + { + ThermoActiveLogger.LogError($"NC Not connected! | WriteParameters | {libraryError.exception}"); + return InternalServerError(); + } + + // read recipe! + libraryError = ncAdapter.ReadFullRecipe(out Dictionary prevRecipe); + if (libraryError.IsError()) + { + ThermoActiveLogger.LogError($"GetRecipeOverview error | {libraryError.exception}"); + return BadRequest(libraryError.localizationKey); + } + + Dictionary updtRecipe = new Dictionary(); + foreach (var item in parametersList) + { + if (prevRecipe.ContainsKey(item.Key)) + { + // aggiorno il valore HMI nel parametro + var currParam = prevRecipe[item.Key]; + // se il parametro richiesto è DIVERSO dal precedente su HMI... + if (currParam.SetpointHMI != item.Value) + { + currParam.SetpointHMI = item.Value; + // salvo (1 parametro, potrei fare N...) + updtRecipe.Add(item.Key, currParam); + } + } + else + { + ThermoActiveLogger.LogError($"WriteParameters error | key not found: {item.Key}"); + return NotFound(); + } + } + + if (updtRecipe.Count > 0) + { + // scrivo sul PLC con i parametri specificati x ritardo/raggruppamento + ncAdapter.WriteRecipeParams(updtRecipe, ncAdapter.nMaxParamWrite, ncAdapter.delayParamWrite); + + + // verifico SE siano cambiati rispetto a versione originale... + var originalRecipe = NcFileAdapter.LoadRecipe($"{NcAdapter.RecipeLiveData.RecipeDir}{NcAdapter.RecipeLiveData.RecipeName}"); + // comparazione parametri... + bool isEqual = false; + ncAdapter.paramsComparer(originalRecipe.RecipeParameters, NcAdapter.RecipeLiveData.RecipeParameters, out isEqual); + // salvo se la ricetta SIA cambiata + NcAdapter.RecipeLiveData.hasChanged = !isEqual; + + // ora gestisco la lettura della overview di "modificata + DTORecipeStatus message = new DTORecipeStatus() + { + recipeName = NcAdapter.RecipeLiveData.RecipeName, + hasChanged = NcAdapter.RecipeLiveData.hasChanged, + forceSend = true + }; + MessageServices.Current.Publish(SEND_THERMO_RECIPE_CHANGED, null, message); + } + + // ritorno solo fatto! + return Ok(); + } + else + { + // non pronto! + ThermoActiveLogger.LogError($"RecipeLiveData null | WriteParameters"); + return InternalServerError(); + } } else { - ThermoActiveLogger.LogError($"WriteParameters error | key not found: {item.Key}"); - return NotFound(); + ThermoActiveLogger.LogError($"RecipeLiveData null | Empty Parameters"); + return BadRequest(); } - } + } + /// + /// Confirm recipe modification (parameters: HMI --> PLC) + /// + /// section confirmed (string as in overview) + /// + [Route("confirm"), HttpPut] + [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.RECIPE_MANAGER, Action = ACTIONS.READ)] + public IHttpActionResult ConfirmEdit(RecipeSection section) + { + if (NcAdapter.RecipeLiveData != null) + { + // Try connection + CmsError libraryError = ncAdapter.Connect(); + if (libraryError.IsError()) + { + ThermoActiveLogger.LogError($"NC Not connected! | Recipe ConfirmEdit | {libraryError.exception}"); + return InternalServerError(); + } - if (updtRecipe.Count > 0) - { - // scrivo sul PLC con i parametri specificati x ritardo/raggruppamento - ncAdapter.WriteRecipeParams(updtRecipe, ncAdapter.nMaxParamWrite, ncAdapter.delayParamWrite); + // scrivo sul PLC il comando conferma! + libraryError = ncAdapter.ConfirmRecipeData(true); + if (libraryError.IsError()) + { + ThermoActiveLogger.LogError($"ConfirmEdit error | {libraryError.errorCode} | {libraryError.exception} | {libraryError.localizationKey}"); + return BadRequest(libraryError.localizationKey); + } + // SE HO una section != null/empty --> salvo come modificata... + try + { + NcFileAdapter.upsRecipeOverview(section, RecipeCatStatus.ChangedOk); + } + catch (Exception exc) + { + ThermoActiveLogger.LogError($"Error on set recipe overview | section: {section}{Environment.NewLine}{exc}"); + } - // verifico SE siano cambiati rispetto a versione originale... - var originalRecipe = NcFileAdapter.LoadRecipe($"{NcAdapter.RecipeLiveData.RecipeDir}{NcAdapter.RecipeLiveData.RecipeName}"); - // comparazione parametri... - bool isEqual = false; - ncAdapter.paramsComparer(originalRecipe.RecipeParameters, NcAdapter.RecipeLiveData.RecipeParameters, out isEqual); - // salvo se la ricetta SIA cambiata - NcAdapter.RecipeLiveData.hasChanged = !isEqual; + // recupero i dati LIVE dei parametri HMI della ricetta... + libraryError = ncAdapter.ReadFullRecipe(out Dictionary currRecipe); + if (libraryError.IsError()) + { + ThermoActiveLogger.LogError($"ConfirmEdit error | {libraryError.exception}"); + return BadRequest(libraryError.localizationKey); + } - // ora gestisco la lettura della overview di "modificata + // rileggo la ricetta + var currParams = new Dictionary(); + foreach (var item in currRecipe) + { + currParams.Add(item.Key, item.Value.SetpointHMI); + } + + // salvo ricetta LIVE + SaveLiveRecipeParams(currParams); + + // ritorno solo fatto! + return Ok(); + } + else + { + // non pronto! + ThermoActiveLogger.LogError($"RecipeLiveData null | Empty"); + return InternalServerError(); + } + } + /// + /// Cancel recipe modification (parameters: PLC --> HMI) + /// + /// + [Route("cancel"), HttpPut] + [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.RECIPE_MANAGER, Action = ACTIONS.READ)] + public IHttpActionResult CancelEdit() + { + if (NcAdapter.RecipeLiveData != null) + { + // Try connection + CmsError libraryError = ncAdapter.Connect(); + if (libraryError.IsError()) + { + ThermoActiveLogger.LogError($"NC Not connected! | Recipe CancelEdit | {libraryError.exception}"); + return InternalServerError(); + } + + // scrivo sul PLC il comando annula! + libraryError = ncAdapter.ConfirmRecipeData(false); + if (libraryError.IsError()) + { + ThermoActiveLogger.LogError($"ConfirmEdit error | {libraryError.exception}"); + return BadRequest(libraryError.localizationKey); + } + + // recupero i dati LIVE dei parametri HMI della ricetta... + libraryError = ncAdapter.ReadFullRecipe(out Dictionary currRecipe); + + if (libraryError.IsError()) + { + ThermoActiveLogger.LogError($"ConfirmEdit error | {libraryError.exception}"); + return BadRequest(libraryError.localizationKey); + } + + var currParams = new Dictionary(); + foreach (var item in currRecipe) + { + currParams.Add(item.Key, item.Value.SetpointPLC); + } + + // ora salvo ANCHE i dati live... + SaveLiveRecipeParams(currParams); + + // ritorno solo fatto! + return Ok(); + } + else + { + // non pronto! + ThermoActiveLogger.LogError($"RecipeLiveData null | Empty"); + return InternalServerError(); + } + } + + /// + /// load recipe from file and send to PLC + /// + /// + [Route("load"), HttpPut] + [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.RECIPE_MANAGER, Action = ACTIONS.READ)] + public IHttpActionResult Load(string newName) + { + // chiamo metodo di lettura... + var dataRead = NcFileAdapter.LoadRecipe(newName); + if (dataRead == null) + { + ThermoActiveLogger.LogError($"LoadRecipe error"); + return NotFound(); + } + + // salvo in memoria ricetta live + NcAdapter.RecipeLiveData = dataRead; + // update current live data! + NcFileAdapter.SaveRecipeCurrent(); + + CmsError libraryError = WriteCurrentRecipeToPlc(); + if (libraryError.IsError()) + { + ThermoActiveLogger.LogError($"ConfirmEdit error | {libraryError.exception}"); + return BadRequest(libraryError.localizationKey); + } + // scrivo sul PLC il comando conferma! + libraryError = ncAdapter.ConfirmRecipeData(true); + if (libraryError.IsError()) + { + ThermoActiveLogger.LogError($"ConfirmEdit error | {libraryError.errorCode} | {libraryError.exception} | {libraryError.localizationKey}"); + return BadRequest(libraryError.localizationKey); + } + + // invio dati NUOVA ricetta (DOPO aver sistemato PLC) DTORecipeStatus message = new DTORecipeStatus() { - recipeName = NcAdapter.RecipeLiveData.RecipeName, - hasChanged = NcAdapter.RecipeLiveData.hasChanged, - forceSend = true + recipeName = NcAdapter.RecipeLiveData.RecipeName, + hasChanged = NcAdapter.RecipeLiveData.hasChanged, + forceSend = true }; MessageServices.Current.Publish(SEND_THERMO_RECIPE_CHANGED, null, message); - } - // ritorno solo fatto! - return Ok(); + // ritorno solo fatto! + return Ok(); } - else + + /// + /// Load tempalte recipe from file and save as new current... + /// + /// + [Route("new"), HttpPut] + [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.RECIPE_MANAGER, Action = ACTIONS.READ)] + public IHttpActionResult NewRecipe() { - // non pronto! - ThermoActiveLogger.LogError($"RecipeLiveData null | WriteParameters"); - return InternalServerError(); + // chiamo metodo di lettura... + bool fatto = NcFileAdapter.LoadTemplate(); + + if (!fatto) + { + ThermoActiveLogger.LogError($"LoadRecipe error"); + return NotFound(); + } + + CmsError libraryError = WriteCurrentRecipeToPlc(); + if (libraryError.IsError()) + { + ThermoActiveLogger.LogError($"ConfirmEdit error | {libraryError.exception}"); + return BadRequest(libraryError.localizationKey); + } + + // scrivo sul PLC il comando conferma! + libraryError = ncAdapter.ConfirmRecipeData(true); + if (libraryError.IsError()) + { + ThermoActiveLogger.LogError($"ConfirmEdit error | {libraryError.errorCode} | {libraryError.exception} | {libraryError.localizationKey}"); + return BadRequest(libraryError.localizationKey); + } + + // ritorno solo fatto! + return Ok(); + } + + /// + /// Save current recipe from PLC to default + /// + /// + [Route("save"), HttpPut] + [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.RECIPE_MANAGER, Action = ACTIONS.READ)] + public IHttpActionResult Save() + { + // recupero dati utente loggato + var identity = User.Identity as ClaimsIdentity; + // Find user id from the bearer token + var userId = identity.Claims.FirstOrDefault(c => c.Type == USER_ID_KEY); + if (userId == null) + return Unauthorized(); + // salvo utente! + using (UsersController usersController = new UsersController()) + { + var userData = usersController.GetUserInfo(Convert.ToInt32(userId.Value)); + NcAdapter.RecipeLiveData.UserSave = userData.Id.ToString(); + } + + // recupero i dati LIVE dei parametri HMI della ricetta... + CmsError libraryError = ncAdapter.ReadFullRecipe(out Dictionary currRecipe); + if (libraryError.IsError()) + return BadRequest(libraryError.localizationKey); + + var currParams = new Dictionary(); + foreach (var item in currRecipe) + { + currParams.Add(item.Key, item.Value.SetpointPLC); + } + + // salvo su disco ricetta corrente + NcFileAdapter.SaveRecipe($"{NcAdapter.RecipeLiveData.RecipeDir}{NcAdapter.RecipeLiveData.RecipeName}", NcAdapter.RecipeLiveData); + + // ora salvo ANCHE i dati live... + SaveLiveRecipeParams(currParams); + + // ritorno solo fatto! + return Ok(); + } + /// + /// Save current recipe from PLC with new name + /// + /// + [Route("saveAs"), HttpPut] + [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.RECIPE_MANAGER, Action = ACTIONS.READ)] + public IHttpActionResult SaveAs(string newName) + { + // recupero dati utente loggato + var identity = User.Identity as ClaimsIdentity; + // Find user id from the bearer token + var userId = identity.Claims.FirstOrDefault(c => c.Type == USER_ID_KEY); + if (userId == null) + return Unauthorized(); + // salvo utente! + using (UsersController usersController = new UsersController()) + { + var userData = usersController.GetUserInfo(Convert.ToInt32(userId.Value)); + NcAdapter.RecipeLiveData.UserSave = userData.Id.ToString(); + } + + // recupero i dati LIVE dei parametri HMI della ricetta... + CmsError libraryError = ncAdapter.ReadFullRecipe(out Dictionary currRecipe); + if (libraryError.IsError()) + { + ThermoActiveLogger.LogError($"SaveAs error | {libraryError.exception}"); + return BadRequest(libraryError.localizationKey); + } + + var currParams = new Dictionary(); + foreach (var item in currRecipe) + { + currParams.Add(item.Key, item.Value.SetpointPLC); + } + + // ora salvo ANCHE i dati live... + NcAdapter.RecipeLiveData.RecipeParameters = currParams; + // e salvo su disco + NcFileAdapter.SaveRecipe(newName, NcAdapter.RecipeLiveData); + + // invio dati + DTORecipeStatus message = new DTORecipeStatus() + { + recipeName = NcAdapter.RecipeLiveData.RecipeName, + hasChanged = NcAdapter.RecipeLiveData.hasChanged, + forceSend = true + }; + MessageServices.Current.Publish(SEND_THERMO_RECIPE_CHANGED, null, message); + + // ritorno solo fatto! + return Ok(); + } + /// + /// Save current recipe from PLC to Template + /// + /// + [Route("saveTemplate"), HttpPut] + [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.RECIPE_MANAGER, Action = ACTIONS.READ)] + public IHttpActionResult SaveTemplate() + { + // recupero i dati LIVE dei parametri HMI della ricetta... + CmsError libraryError = ncAdapter.ReadFullRecipe(out Dictionary currRecipe); + if (libraryError.IsError()) + { + ThermoActiveLogger.LogError($"SaveTemplate error | {libraryError.exception}"); + return BadRequest(libraryError.localizationKey); + } + + + // recupero i dati LIVE dei carichi load dei cahnnels di riscaldo... + libraryError = ncAdapter.ReadWarmers(false, out Dictionary currWarmers); + if (libraryError.IsError()) + { + ThermoActiveLogger.LogError($"ReadWarmers error | {libraryError.exception}"); + return BadRequest(libraryError.localizationKey); + } + + // uso i valopri HMI... + var currParams = new Dictionary(); + foreach (var item in currRecipe) + { + currParams.Add(item.Key, item.Value.SetpointHMI); + } + + // ora salvo nei dati live... + NcAdapter.RecipeLiveData.RecipeParameters = currParams; + + // carico i dati dei riscaldi... + var currChSet = new Dictionary(); + foreach (var item in currWarmers) + { + currChSet.Add(item.Key, item.Value.SetpointHMI); + } + NcAdapter.RecipeLiveData.ChannelSetpoints = currChSet; + + + // e salvo su disco + NcFileAdapter.SaveRecipeTemplate(); + + // ritorno solo fatto! + return Ok(); + } + + [Route("uploadImage"), HttpPost] + [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.RECIPE_MANAGER, Action = ACTIONS.READ)] + public async Task UpdloadImage() + { + bool imageUploaded = false; + + if (!Request.Content.IsMimeMultipartContent()) + { + throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); + } + + List formItems = await MultipartHandler.ManageMultiPartFileAsync(Request); + + foreach (FormItem item in formItems) + { + if (item.IsAFile) + { + if (item.ParameterName == "image" || item.MediaType.StartsWith("image/")) + { + string filePath = item.FileName; + imageUploaded = NcFileAdapter.SaveRecipeImage(item.FileName, item.Data); + } + } + } + + return Ok(); + } + + [Route("updateNote"), HttpPost] + [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.RECIPE_MANAGER, Action = ACTIONS.READ)] + public IHttpActionResult UpdateNote(string recipeNotes) + { + // salvo note... + if (!string.IsNullOrEmpty(recipeNotes)) + { + NcAdapter.RecipeLiveData.recipeNotes = recipeNotes.Trim(); + } + // e salvo su disco + NcFileAdapter.SaveRecipe($"{NcAdapter.RecipeLiveData.RecipeDir}{NcAdapter.RecipeLiveData.RecipeName}", NcAdapter.RecipeLiveData); + return Ok(); + } + + [Route("saveAll"), HttpPost] + [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.RECIPE_MANAGER, Action = ACTIONS.READ)] + public async Task SaveAll(string newName, string recipeNotes, double estimTimeSec) + { + // recupero dati utente loggato + var identity = User.Identity as ClaimsIdentity; + // Find user id from the bearer token + var userId = identity.Claims.FirstOrDefault(c => c.Type == USER_ID_KEY); + if (userId == null) + return Unauthorized(); + // salvo utente! + using (UsersController usersController = new UsersController()) + { + var userData = usersController.GetUserInfo(Convert.ToInt32(userId.Value)); + NcAdapter.RecipeLiveData.UserSave = userData.Id.ToString(); + } + + // salvo note... + if (!string.IsNullOrEmpty(recipeNotes)) + { + NcAdapter.RecipeLiveData.recipeNotes = recipeNotes.Trim(); + } + + bool imageUploaded = false; + + if (!Request.Content.IsMimeMultipartContent()) + { + throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); + } + + List formItems = await MultipartHandler.ManageMultiPartFileAsync(Request); + + foreach (FormItem item in formItems) + { + if (item.IsAFile) + { + if (item.ParameterName == "image" || item.MediaType.StartsWith("image/")) + { + string filePath = item.FileName; + imageUploaded = NcFileAdapter.SaveRecipeImage(item.FileName, item.Data); + } + } + } + if (!string.IsNullOrEmpty(newName)) + { + // recupero i dati LIVE dei parametri HMI della ricetta... + CmsError libraryError = ncAdapter.ReadFullRecipe(out Dictionary currRecipe); + if (libraryError.IsError()) + { + ThermoActiveLogger.LogError($"SaveAll error | {libraryError.exception}"); + return BadRequest(libraryError.localizationKey); + } + + var currParams = new Dictionary(); + foreach (var item in currRecipe) + { + currParams.Add(item.Key, item.Value.SetpointPLC); + } + // salvo parametri + NcAdapter.RecipeLiveData.RecipeParameters = currParams; + + // ora salvo il dato del TC stimato se presente + if (estimTimeSec > 0) + { + NcAdapter.RecipeLiveData.TC_last = estimTimeSec; + } + // indico che non è + modificata... + NcAdapter.RecipeLiveData.hasChanged = false; + // e salvo su disco + NcFileAdapter.SaveRecipe(newName, NcAdapter.RecipeLiveData); + } + return Ok(); + } + + /// + /// Do actual recipe parameters FileSave + /// + /// + private static void SaveLiveRecipeParams(Dictionary currParams) + { + try + { + // ora salvo ANCHE i dati live... + NcAdapter.RecipeLiveData.RecipeParameters = currParams; + // verifico SE siano cambiati rispetto a versione originale... + var originalRecipe = NcFileAdapter.LoadRecipe($"{NcAdapter.RecipeLiveData.RecipeDir}{NcAdapter.RecipeLiveData.RecipeName}"); + // comparazione parametri... + bool isEqual = false; + ncAdapter.paramsComparer(originalRecipe.RecipeParameters, currParams, out isEqual); + NcAdapter.RecipeLiveData.hasChanged = !isEqual; + // e salvo su disco + NcFileAdapter.SaveRecipeCurrent(); + // ora gestisco la lettura della overview di "modificata + DTORecipeStatus message = new DTORecipeStatus() + { + recipeName = NcAdapter.RecipeLiveData.RecipeName, + hasChanged = NcAdapter.RecipeLiveData.hasChanged, + forceSend = true + }; + MessageServices.Current.Publish(SEND_THERMO_RECIPE_CHANGED, null, message); + } + catch (Exception exc) + { + ThermoActiveLogger.LogError($"Recipe | SaveCurrentRecipeParams exception | {exc}"); + } + } + + /// + /// write current recipe to PLC + /// + /// + public static CmsError WriteCurrentRecipeToPlc() + { + CmsError checkError = NO_ERROR; + + // Try connection + CmsError libraryError = ncAdapter.Connect(); + if (libraryError.errorCode != 0) + { + ThermoActiveLogger.LogError($"NC Not connected! | Load | {libraryError.exception}"); + return libraryError; + } + + + // copy data to PLC + checkError = ncAdapter.ReadFullRecipe(out Dictionary prevRecipe); + if (checkError.IsError()) + { + ThermoActiveLogger.LogError($"WriteCurrentRecipeToPlc | ReadFullRecipe error | {checkError.exception}"); + return checkError; + } + + // save parameters to PLC!!! + Dictionary updtRecipe = new Dictionary(); + foreach (var item in NcAdapter.RecipeLiveData.RecipeParameters) + { + if (prevRecipe.ContainsKey(item.Key)) + { + // aggiorno il valore HMI nel parametro + var currParam = prevRecipe[item.Key]; + currParam.SetpointHMI = item.Value; + // salvo (1 parametro, potrei fare N...) + updtRecipe.Add(item.Key, currParam); + } + else + { + ThermoActiveLogger.LogError($"prevRecipe not found | key: {item.Key}"); + return NOT_FOUND_ERROR; + } + } + + // write to PLC + checkError = ncAdapter.WriteRecipeParams(updtRecipe, ncAdapter.nMaxParamWrite, ncAdapter.delayParamWrite); + if (checkError.IsError()) + { + ThermoActiveLogger.LogError($"WriteCurrentRecipeToPlc | WriteRecipeParams error | {checkError.exception}"); + return checkError; + } + + + // process ch load setup... + Dictionary newRisk = new Dictionary(); + foreach (var item in NcAdapter.RecipeLiveData.ChannelSetpoints) + { + newRisk.Add(item.Key, item.Value); + } + + // write to PLC + checkError = ncAdapter.WriteRecipeWarmChSetpHMI(newRisk); + if (checkError.IsError()) + { + ThermoActiveLogger.LogError($"WriteCurrentRecipeToPlc | WriteRecipeWarmChSetpHMI error | {checkError.exception}"); + return checkError; + } + + // enable recipe! scrivo sul PLC il comando conferma! + libraryError = ncAdapter.ConfirmRecipeData(true); + if (libraryError.IsError()) + { + ThermoActiveLogger.LogError($"ReadWarmers error | {libraryError.exception}"); + return checkError; + } + + return checkError; } - } - else - { - ThermoActiveLogger.LogError($"RecipeLiveData null | Empty Parameters"); - return BadRequest(); - } } - /// - /// Confirm recipe modification (parameters: HMI --> PLC) - /// - /// section confirmed (string as in overview) - /// - [Route("confirm"), HttpPut] - [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.RECIPE_MANAGER, Action = ACTIONS.READ)] - public IHttpActionResult ConfirmEdit(RecipeSection section) - { - if (NcAdapter.RecipeLiveData != null) - { - // Try connection - CmsError libraryError = ncAdapter.Connect(); - if (libraryError.IsError()) - { - ThermoActiveLogger.LogError($"NC Not connected! | Recipe ConfirmEdit | {libraryError.exception}"); - return InternalServerError(); - } - - // scrivo sul PLC il comando conferma! - libraryError = ncAdapter.ConfirmRecipeData(true); - if (libraryError.IsError()) - { - ThermoActiveLogger.LogError($"ConfirmEdit error | {libraryError.errorCode} | {libraryError.exception} | {libraryError.localizationKey}"); - return BadRequest(libraryError.localizationKey); - } - - // SE HO una section != null/empty --> salvo come modificata... - try - { - NcFileAdapter.upsRecipeOverview(section, RecipeCatStatus.ChangedOk); - } - catch (Exception exc) - { - ThermoActiveLogger.LogError($"Error on set recipe overview | section: {section}{Environment.NewLine}{exc}"); - } - - // recupero i dati LIVE dei parametri HMI della ricetta... - libraryError = ncAdapter.ReadFullRecipe(out Dictionary currRecipe); - if (libraryError.IsError()) - { - ThermoActiveLogger.LogError($"ConfirmEdit error | {libraryError.exception}"); - return BadRequest(libraryError.localizationKey); - } - - // rileggo la ricetta - var currParams = new Dictionary(); - foreach (var item in currRecipe) - { - currParams.Add(item.Key, item.Value.SetpointHMI); - } - - // salvo ricetta LIVE - SaveLiveRecipeParams(currParams); - - // ritorno solo fatto! - return Ok(); - } - else - { - // non pronto! - ThermoActiveLogger.LogError($"RecipeLiveData null | Empty"); - return InternalServerError(); - } - } - /// - /// Cancel recipe modification (parameters: PLC --> HMI) - /// - /// - [Route("cancel"), HttpPut] - [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.RECIPE_MANAGER, Action = ACTIONS.READ)] - public IHttpActionResult CancelEdit() - { - if (NcAdapter.RecipeLiveData != null) - { - // Try connection - CmsError libraryError = ncAdapter.Connect(); - if (libraryError.IsError()) - { - ThermoActiveLogger.LogError($"NC Not connected! | Recipe CancelEdit | {libraryError.exception}"); - return InternalServerError(); - } - - // scrivo sul PLC il comando annula! - libraryError = ncAdapter.ConfirmRecipeData(false); - if (libraryError.IsError()) - { - ThermoActiveLogger.LogError($"ConfirmEdit error | {libraryError.exception}"); - return BadRequest(libraryError.localizationKey); - } - - // recupero i dati LIVE dei parametri HMI della ricetta... - libraryError = ncAdapter.ReadFullRecipe(out Dictionary currRecipe); - - if (libraryError.IsError()) - { - ThermoActiveLogger.LogError($"ConfirmEdit error | {libraryError.exception}"); - return BadRequest(libraryError.localizationKey); - } - - var currParams = new Dictionary(); - foreach (var item in currRecipe) - { - currParams.Add(item.Key, item.Value.SetpointPLC); - } - - // ora salvo ANCHE i dati live... - SaveLiveRecipeParams(currParams); - - // ritorno solo fatto! - return Ok(); - } - else - { - // non pronto! - ThermoActiveLogger.LogError($"RecipeLiveData null | Empty"); - return InternalServerError(); - } - } - - /// - /// load recipe from file and send to PLC - /// - /// - [Route("load"), HttpPut] - [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.RECIPE_MANAGER, Action = ACTIONS.READ)] - public IHttpActionResult Load(string newName) - { - // chiamo metodo di lettura... - var dataRead = NcFileAdapter.LoadRecipe(newName); - if (dataRead == null) - { - ThermoActiveLogger.LogError($"LoadRecipe error"); - return NotFound(); - } - - // salvo in memoria ricetta live - NcAdapter.RecipeLiveData = dataRead; - // update current live data! - NcFileAdapter.SaveRecipeCurrent(); - - CmsError libraryError = WriteCurrentRecipeToPlc(); - if (libraryError.IsError()) - { - ThermoActiveLogger.LogError($"ConfirmEdit error | {libraryError.exception}"); - return BadRequest(libraryError.localizationKey); - } - // scrivo sul PLC il comando conferma! - libraryError = ncAdapter.ConfirmRecipeData(true); - if (libraryError.IsError()) - { - ThermoActiveLogger.LogError($"ConfirmEdit error | {libraryError.errorCode} | {libraryError.exception} | {libraryError.localizationKey}"); - return BadRequest(libraryError.localizationKey); - } - - // invio dati NUOVA ricetta (DOPO aver sistemato PLC) - DTORecipeStatus message = new DTORecipeStatus() - { - recipeName = NcAdapter.RecipeLiveData.RecipeName, - hasChanged = NcAdapter.RecipeLiveData.hasChanged, - forceSend = true - }; - MessageServices.Current.Publish(SEND_THERMO_RECIPE_CHANGED, null, message); - - // ritorno solo fatto! - return Ok(); - } - - /// - /// Load tempalte recipe from file and save as new current... - /// - /// - [Route("new"), HttpPut] - [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.RECIPE_MANAGER, Action = ACTIONS.READ)] - public IHttpActionResult NewRecipe() - { - // chiamo metodo di lettura... - bool fatto = NcFileAdapter.LoadTemplate(); - - if (!fatto) - { - ThermoActiveLogger.LogError($"LoadRecipe error"); - return NotFound(); - } - - CmsError libraryError = WriteCurrentRecipeToPlc(); - if (libraryError.IsError()) - { - ThermoActiveLogger.LogError($"ConfirmEdit error | {libraryError.exception}"); - return BadRequest(libraryError.localizationKey); - } - - // scrivo sul PLC il comando conferma! - libraryError = ncAdapter.ConfirmRecipeData(true); - if (libraryError.IsError()) - { - ThermoActiveLogger.LogError($"ConfirmEdit error | {libraryError.errorCode} | {libraryError.exception} | {libraryError.localizationKey}"); - return BadRequest(libraryError.localizationKey); - } - - // ritorno solo fatto! - return Ok(); - } - - /// - /// Save current recipe from PLC to default - /// - /// - [Route("save"), HttpPut] - [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.RECIPE_MANAGER, Action = ACTIONS.READ)] - public IHttpActionResult Save() - { - // recupero dati utente loggato - var identity = User.Identity as ClaimsIdentity; - // Find user id from the bearer token - var userId = identity.Claims.FirstOrDefault(c => c.Type == USER_ID_KEY); - if (userId == null) - return Unauthorized(); - // salvo utente! - using (UsersController usersController = new UsersController()) - { - var userData = usersController.GetUserInfo(Convert.ToInt32(userId.Value)); - NcAdapter.RecipeLiveData.UserSave = userData.Id.ToString(); - } - - // recupero i dati LIVE dei parametri HMI della ricetta... - CmsError libraryError = ncAdapter.ReadFullRecipe(out Dictionary currRecipe); - if (libraryError.IsError()) - return BadRequest(libraryError.localizationKey); - - var currParams = new Dictionary(); - foreach (var item in currRecipe) - { - currParams.Add(item.Key, item.Value.SetpointPLC); - } - - // salvo su disco ricetta corrente - NcFileAdapter.SaveRecipe($"{NcAdapter.RecipeLiveData.RecipeDir}{NcAdapter.RecipeLiveData.RecipeName}", NcAdapter.RecipeLiveData); - - // ora salvo ANCHE i dati live... - SaveLiveRecipeParams(currParams); - - // ritorno solo fatto! - return Ok(); - } - /// - /// Save current recipe from PLC with new name - /// - /// - [Route("saveAs"), HttpPut] - [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.RECIPE_MANAGER, Action = ACTIONS.READ)] - public IHttpActionResult SaveAs(string newName) - { - // recupero dati utente loggato - var identity = User.Identity as ClaimsIdentity; - // Find user id from the bearer token - var userId = identity.Claims.FirstOrDefault(c => c.Type == USER_ID_KEY); - if (userId == null) - return Unauthorized(); - // salvo utente! - using (UsersController usersController = new UsersController()) - { - var userData = usersController.GetUserInfo(Convert.ToInt32(userId.Value)); - NcAdapter.RecipeLiveData.UserSave = userData.Id.ToString(); - } - - // recupero i dati LIVE dei parametri HMI della ricetta... - CmsError libraryError = ncAdapter.ReadFullRecipe(out Dictionary currRecipe); - if (libraryError.IsError()) - { - ThermoActiveLogger.LogError($"SaveAs error | {libraryError.exception}"); - return BadRequest(libraryError.localizationKey); - } - - var currParams = new Dictionary(); - foreach (var item in currRecipe) - { - currParams.Add(item.Key, item.Value.SetpointPLC); - } - - // ora salvo ANCHE i dati live... - NcAdapter.RecipeLiveData.RecipeParameters = currParams; - // e salvo su disco - NcFileAdapter.SaveRecipe(newName, NcAdapter.RecipeLiveData); - - // invio dati - DTORecipeStatus message = new DTORecipeStatus() - { - recipeName = NcAdapter.RecipeLiveData.RecipeName, - hasChanged = NcAdapter.RecipeLiveData.hasChanged, - forceSend = true - }; - MessageServices.Current.Publish(SEND_THERMO_RECIPE_CHANGED, null, message); - - // ritorno solo fatto! - return Ok(); - } - /// - /// Save current recipe from PLC to Template - /// - /// - [Route("saveTemplate"), HttpPut] - [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.RECIPE_MANAGER, Action = ACTIONS.READ)] - public IHttpActionResult SaveTemplate() - { - // recupero i dati LIVE dei parametri HMI della ricetta... - CmsError libraryError = ncAdapter.ReadFullRecipe(out Dictionary currRecipe); - if (libraryError.IsError()) - { - ThermoActiveLogger.LogError($"SaveTemplate error | {libraryError.exception}"); - return BadRequest(libraryError.localizationKey); - } - - - // recupero i dati LIVE dei carichi load dei cahnnels di riscaldo... - libraryError = ncAdapter.ReadWarmers(out Dictionary currWarmers); - if (libraryError.IsError()) - { - ThermoActiveLogger.LogError($"ReadWarmers error | {libraryError.exception}"); - return BadRequest(libraryError.localizationKey); - } - - // uso i valopri HMI... - var currParams = new Dictionary(); - foreach (var item in currRecipe) - { - currParams.Add(item.Key, item.Value.SetpointHMI); - } - - // ora salvo nei dati live... - NcAdapter.RecipeLiveData.RecipeParameters = currParams; - - // carico i dati dei riscaldi... - var currChSet = new Dictionary(); - foreach (var item in currWarmers) - { - currChSet.Add(item.Key, item.Value.SetpointHMI); - } - NcAdapter.RecipeLiveData.ChannelSetpoints = currChSet; - - - // e salvo su disco - NcFileAdapter.SaveRecipeTemplate(); - - // ritorno solo fatto! - return Ok(); - } - - [Route("uploadImage"), HttpPost] - [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.RECIPE_MANAGER, Action = ACTIONS.READ)] - public async Task UpdloadImage() - { - bool imageUploaded = false; - - if (!Request.Content.IsMimeMultipartContent()) - { - throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); - } - - List formItems = await MultipartHandler.ManageMultiPartFileAsync(Request); - - foreach (FormItem item in formItems) - { - if (item.IsAFile) - { - if (item.ParameterName == "image" || item.MediaType.StartsWith("image/")) - { - string filePath = item.FileName; - imageUploaded = NcFileAdapter.SaveRecipeImage(item.FileName, item.Data); - } - } - } - - return Ok(); - } - - [Route("updateNote"), HttpPost] - [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.RECIPE_MANAGER, Action = ACTIONS.READ)] - public IHttpActionResult UpdateNote(string recipeNotes) - { - // salvo note... - if (!string.IsNullOrEmpty(recipeNotes)) - { - NcAdapter.RecipeLiveData.recipeNotes = recipeNotes.Trim(); - } - // e salvo su disco - NcFileAdapter.SaveRecipe($"{NcAdapter.RecipeLiveData.RecipeDir}{NcAdapter.RecipeLiveData.RecipeName}", NcAdapter.RecipeLiveData); - return Ok(); - } - - [Route("saveAll"), HttpPost] - [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.RECIPE_MANAGER, Action = ACTIONS.READ)] - public async Task SaveAll(string newName, string recipeNotes, double estimTimeSec) - { - // recupero dati utente loggato - var identity = User.Identity as ClaimsIdentity; - // Find user id from the bearer token - var userId = identity.Claims.FirstOrDefault(c => c.Type == USER_ID_KEY); - if (userId == null) - return Unauthorized(); - // salvo utente! - using (UsersController usersController = new UsersController()) - { - var userData = usersController.GetUserInfo(Convert.ToInt32(userId.Value)); - NcAdapter.RecipeLiveData.UserSave = userData.Id.ToString(); - } - - // salvo note... - if (!string.IsNullOrEmpty(recipeNotes)) - { - NcAdapter.RecipeLiveData.recipeNotes = recipeNotes.Trim(); - } - - bool imageUploaded = false; - - if (!Request.Content.IsMimeMultipartContent()) - { - throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); - } - - List formItems = await MultipartHandler.ManageMultiPartFileAsync(Request); - - foreach (FormItem item in formItems) - { - if (item.IsAFile) - { - if (item.ParameterName == "image" || item.MediaType.StartsWith("image/")) - { - string filePath = item.FileName; - imageUploaded = NcFileAdapter.SaveRecipeImage(item.FileName, item.Data); - } - } - } - if (!string.IsNullOrEmpty(newName)) - { - // recupero i dati LIVE dei parametri HMI della ricetta... - CmsError libraryError = ncAdapter.ReadFullRecipe(out Dictionary currRecipe); - if (libraryError.IsError()) - { - ThermoActiveLogger.LogError($"SaveAll error | {libraryError.exception}"); - return BadRequest(libraryError.localizationKey); - } - - var currParams = new Dictionary(); - foreach (var item in currRecipe) - { - currParams.Add(item.Key, item.Value.SetpointPLC); - } - // salvo parametri - NcAdapter.RecipeLiveData.RecipeParameters = currParams; - - // ora salvo il dato del TC stimato se presente - if (estimTimeSec > 0) - { - NcAdapter.RecipeLiveData.TC_last = estimTimeSec; - } - // indico che non è + modificata... - NcAdapter.RecipeLiveData.hasChanged = false; - // e salvo su disco - NcFileAdapter.SaveRecipe(newName, NcAdapter.RecipeLiveData); - } - return Ok(); - } - - /// - /// Do actual recipe parameters FileSave - /// - /// - private static void SaveLiveRecipeParams(Dictionary currParams) - { - try - { - // ora salvo ANCHE i dati live... - NcAdapter.RecipeLiveData.RecipeParameters = currParams; - // verifico SE siano cambiati rispetto a versione originale... - var originalRecipe = NcFileAdapter.LoadRecipe($"{NcAdapter.RecipeLiveData.RecipeDir}{NcAdapter.RecipeLiveData.RecipeName}"); - // comparazione parametri... - bool isEqual = false; - ncAdapter.paramsComparer(originalRecipe.RecipeParameters, currParams, out isEqual); - NcAdapter.RecipeLiveData.hasChanged = !isEqual; - // e salvo su disco - NcFileAdapter.SaveRecipeCurrent(); - // ora gestisco la lettura della overview di "modificata - DTORecipeStatus message = new DTORecipeStatus() - { - recipeName = NcAdapter.RecipeLiveData.RecipeName, - hasChanged = NcAdapter.RecipeLiveData.hasChanged, - forceSend = true - }; - MessageServices.Current.Publish(SEND_THERMO_RECIPE_CHANGED, null, message); - } - catch (Exception exc) - { - ThermoActiveLogger.LogError($"Recipe | SaveCurrentRecipeParams exception | {exc}"); - } - } - - /// - /// write current recipe to PLC - /// - /// - public static CmsError WriteCurrentRecipeToPlc() - { - CmsError checkError = NO_ERROR; - - // Try connection - CmsError libraryError = ncAdapter.Connect(); - if (libraryError.errorCode != 0) - { - ThermoActiveLogger.LogError($"NC Not connected! | Load | {libraryError.exception}"); - return libraryError; - } - - - // copy data to PLC - checkError = ncAdapter.ReadFullRecipe(out Dictionary prevRecipe); - if (checkError.IsError()) - { - ThermoActiveLogger.LogError($"WriteCurrentRecipeToPlc | ReadFullRecipe error | {checkError.exception}"); - return checkError; - } - - // save parameters to PLC!!! - Dictionary updtRecipe = new Dictionary(); - foreach (var item in NcAdapter.RecipeLiveData.RecipeParameters) - { - if (prevRecipe.ContainsKey(item.Key)) - { - // aggiorno il valore HMI nel parametro - var currParam = prevRecipe[item.Key]; - currParam.SetpointHMI = item.Value; - // salvo (1 parametro, potrei fare N...) - updtRecipe.Add(item.Key, currParam); - } - else - { - ThermoActiveLogger.LogError($"prevRecipe not found | key: {item.Key}"); - return NOT_FOUND_ERROR; - } - } - - // write to PLC - checkError = ncAdapter.WriteRecipeParams(updtRecipe, ncAdapter.nMaxParamWrite, ncAdapter.delayParamWrite); - if (checkError.IsError()) - { - ThermoActiveLogger.LogError($"WriteCurrentRecipeToPlc | WriteRecipeParams error | {checkError.exception}"); - return checkError; - } - - - // process ch load setup... - Dictionary newRisk = new Dictionary(); - foreach (var item in NcAdapter.RecipeLiveData.ChannelSetpoints) - { - newRisk.Add(item.Key, item.Value); - } - - // write to PLC - checkError = ncAdapter.WriteRecipeWarmChSetpHMI(newRisk); - if (checkError.IsError()) - { - ThermoActiveLogger.LogError($"WriteCurrentRecipeToPlc | WriteRecipeWarmChSetpHMI error | {checkError.exception}"); - return checkError; - } - - // enable recipe! scrivo sul PLC il comando conferma! - libraryError = ncAdapter.ConfirmRecipeData(true); - if (libraryError.IsError()) - { - ThermoActiveLogger.LogError($"ReadWarmers error | {libraryError.exception}"); - return checkError; - } - - return checkError; - } - } } \ No newline at end of file diff --git a/Thermo.Active/Controllers/WebApi/WarmersController.cs b/Thermo.Active/Controllers/WebApi/WarmersController.cs index c53d81e4..364cba46 100644 --- a/Thermo.Active/Controllers/WebApi/WarmersController.cs +++ b/Thermo.Active/Controllers/WebApi/WarmersController.cs @@ -14,11 +14,129 @@ namespace Thermo.Active.Controllers.WebApi [RoutePrefix("api/warmers")] public class WarmersController : ApiController { + #region Fields + /// /// Oggetto adapter condiviso da WebAPI /// protected static NcAdapter ncAdapter = new NcAdapter(); + #endregion Fields + + #region Methods + + /// + /// Cancel recipe modification (parameters: PLC --> HMI) + /// + /// + [Route("cancel"), HttpPut] + [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.RECIPE_MANAGER, Action = ACTIONS.READ)] + public IHttpActionResult CancelEdit() + { + // Try connection + CmsError libraryError = ncAdapter.Connect(); + if (libraryError.IsError()) + { + ThermoActiveLogger.LogError($"NC Not connected! | Recipe CancelEdit | {libraryError.exception}"); + return BadRequest(libraryError.localizationKey); + } + + // scrivo sul PLC il comando annula! + libraryError = ncAdapter.ConfirmRecipeData(false); + if (libraryError.IsError()) + { + ThermoActiveLogger.LogError($"Warmers CancelEdit error | ConfirmRecipeData | {libraryError.exception}"); + return BadRequest(libraryError.localizationKey); + } + + // recupero i dati LIVE dei parametri HMI dei riscaldi... + libraryError = ncAdapter.ReadWarmers(false, out Dictionary currWarmers); + if (libraryError.IsError()) + { + ThermoActiveLogger.LogError($"Warmers ConfirmEdit error | ReadWarmers | {libraryError.exception}"); + return BadRequest(libraryError.localizationKey); + } + + // rileggo la ricetta + var currParams = new Dictionary(); + foreach (var item in currWarmers) + { + currParams.Add(item.Key, item.Value.SetpointHMI); + } + + saveCurrentRecipeWarmers(currParams); + + // ritorno solo fatto! + return Ok(); + } + + /// + /// Confirm recipe modification (parameters: HMI --> PLC) + /// + /// + [Route("confirm"), HttpPut] + [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.RECIPE_MANAGER, Action = ACTIONS.READ)] + public IHttpActionResult ConfirmEdit() + { + // Try connection + CmsError libraryError = ncAdapter.Connect(); + if (libraryError.IsError()) + { + ThermoActiveLogger.LogError($"NC Not connected! | Warmers ConfirmEdit | {libraryError.exception}"); + return BadRequest(libraryError.localizationKey); + } + + // scrivo sul PLC il comando conferma! + libraryError = ncAdapter.ConfirmRecipeData(true); + if (libraryError.IsError()) + { + ThermoActiveLogger.LogError($"Warmers ConfirmEdit error | ConfirmRecipeData | {libraryError.exception}"); + return BadRequest(libraryError.localizationKey); + } + + // recupero i dati LIVE dei parametri HMI dei riscaldi... + libraryError = ncAdapter.ReadWarmers(false, out Dictionary currWarmers); + if (libraryError.IsError()) + { + ThermoActiveLogger.LogError($"Warmers ConfirmEdit error | ReadWarmers | {libraryError.exception}"); + return BadRequest(libraryError.localizationKey); + } + + // rileggo la ricetta + var currParams = new Dictionary(); + foreach (var item in currWarmers) + { + currParams.Add(item.Key, item.Value.SetpointHMI); + } + + saveCurrentRecipeWarmers(currParams); + + // ritorno solo fatto! + return Ok(); + } + + [Route("area"), HttpGet] + public IHttpActionResult GetCurrentAreaPerc() + { + // Try connection + CmsError libraryError = ncAdapter.Connect(); + if (libraryError.IsError()) + { + ThermoActiveLogger.LogError($"NC Not connected! | GetCurrentAreaPerc | {libraryError.exception}"); + return BadRequest(libraryError.localizationKey); + } + + // recupera aree % X / Y + libraryError = ncAdapter.GetWarmMaterialArea(out Dictionary currAreaPerc); + if (libraryError.IsError()) + { + ThermoActiveLogger.LogError($"GetCurrentAreaPerc error | {libraryError.exception}"); + return BadRequest(libraryError.localizationKey); + } + + return Ok(currAreaPerc); + } + [Route("channels"), HttpGet] public IHttpActionResult GetCurrentWarmersChannels() { @@ -30,7 +148,7 @@ namespace Thermo.Active.Controllers.WebApi return BadRequest(libraryError.localizationKey); } - libraryError = ncAdapter.ReadWarmers(out Dictionary currWarmers); + libraryError = ncAdapter.ReadWarmers(false, out Dictionary currWarmers); if (libraryError.IsError()) { ThermoActiveLogger.LogError($"GetRecipeOverview error | {libraryError.exception}"); @@ -59,29 +177,36 @@ namespace Thermo.Active.Controllers.WebApi return Ok(currWarmers); } - - [Route("area"), HttpGet] - public IHttpActionResult GetCurrentAreaPerc() + [Route("setConfig"), HttpPut] + [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.RECIPE_MANAGER, Action = ACTIONS.READ)] + public IHttpActionResult SetConfig() { + // scrive configurazioni RISK // Try connection CmsError libraryError = ncAdapter.Connect(); if (libraryError.IsError()) { - ThermoActiveLogger.LogError($"NC Not connected! | GetCurrentAreaPerc | {libraryError.exception}"); + ThermoActiveLogger.LogError($"NC Not connected! | SetConfig | {libraryError.exception}"); return BadRequest(libraryError.localizationKey); } - // recupera aree % X / Y - libraryError = ncAdapter.GetWarmMaterialArea(out Dictionary currAreaPerc); + // scrivo sul PLC + libraryError = ncAdapter.WriteRecipeWarmConfig(); if (libraryError.IsError()) { - ThermoActiveLogger.LogError($"GetCurrentAreaPerc error | {libraryError.exception}"); + ThermoActiveLogger.LogError($"Warmers SetConfig error | WriteRecipeWarmConfig | {libraryError.exception}"); return BadRequest(libraryError.localizationKey); } - return Ok(currAreaPerc); + // ritorno solo fatto! + return Ok(); } + /// + /// Write SetpointHMI (%) + /// + /// + /// [Route("update"), HttpPut] [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.RECIPE_MANAGER, Action = ACTIONS.READ)] public IHttpActionResult WriteSetpoints(Dictionary channelsLoad) @@ -114,121 +239,40 @@ namespace Thermo.Active.Controllers.WebApi } /// - /// Confirm recipe modification (parameters: HMI --> PLC) + /// Write TermocamSetpoint (%) /// + /// /// - [Route("confirm"), HttpPut] + [Route("updateThermocam"), HttpPut] [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.RECIPE_MANAGER, Action = ACTIONS.READ)] - public IHttpActionResult ConfirmEdit() + public IHttpActionResult WriteThermocamSetpoints(Dictionary channelsTemp) { - // Try connection - CmsError libraryError = ncAdapter.Connect(); - if (libraryError.IsError()) + // scrive su CHp da ricetta oppure da override x parametri utente... + if (channelsTemp != null) { - ThermoActiveLogger.LogError($"NC Not connected! | Warmers ConfirmEdit | {libraryError.exception}"); - return BadRequest(libraryError.localizationKey); - } + // Try connection + CmsError libraryError = ncAdapter.Connect(); + if (libraryError.IsError()) + { + ThermoActiveLogger.LogError($"NC Not connected! | WriteThermocamSetpoints | {libraryError.exception}"); + return BadRequest(libraryError.localizationKey); + } + // scrivo sul PLC + libraryError = ncAdapter.WriteRecipeWarmChSetpThermoCam(channelsTemp); + if (libraryError.IsError()) + { + ThermoActiveLogger.LogError($"WriteThermocamSetpoints error | {libraryError.exception}"); + return BadRequest(libraryError.localizationKey); + } - // scrivo sul PLC il comando conferma! - libraryError = ncAdapter.ConfirmRecipeData(true); - if (libraryError.IsError()) + // ritorno solo fatto! + return Ok(); + } + else { - ThermoActiveLogger.LogError($"Warmers ConfirmEdit error | ConfirmRecipeData | {libraryError.exception}"); - return BadRequest(libraryError.localizationKey); + return NotFound(); } - - // recupero i dati LIVE dei parametri HMI dei riscaldi... - libraryError = ncAdapter.ReadWarmers(out Dictionary currWarmers); - if (libraryError.IsError()) - { - ThermoActiveLogger.LogError($"Warmers ConfirmEdit error | ReadWarmers | {libraryError.exception}"); - return BadRequest(libraryError.localizationKey); - } - - // rileggo la ricetta - var currParams = new Dictionary(); - foreach (var item in currWarmers) - { - currParams.Add(item.Key, item.Value.SetpointHMI); - } - - saveCurrentRecipeWarmers(currParams); - - // ritorno solo fatto! - return Ok(); } - - /// - /// Cancel recipe modification (parameters: PLC --> HMI) - /// - /// - [Route("cancel"), HttpPut] - [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.RECIPE_MANAGER, Action = ACTIONS.READ)] - public IHttpActionResult CancelEdit() - { - // Try connection - CmsError libraryError = ncAdapter.Connect(); - if (libraryError.IsError()) - { - ThermoActiveLogger.LogError($"NC Not connected! | Recipe CancelEdit | {libraryError.exception}"); - return BadRequest(libraryError.localizationKey); - } - - // scrivo sul PLC il comando annula! - libraryError = ncAdapter.ConfirmRecipeData(false); - if (libraryError.IsError()) - { - ThermoActiveLogger.LogError($"Warmers CancelEdit error | ConfirmRecipeData | {libraryError.exception}"); - return BadRequest(libraryError.localizationKey); - } - - // recupero i dati LIVE dei parametri HMI dei riscaldi... - libraryError = ncAdapter.ReadWarmers(out Dictionary currWarmers); - if (libraryError.IsError()) - { - ThermoActiveLogger.LogError($"Warmers ConfirmEdit error | ReadWarmers | {libraryError.exception}"); - return BadRequest(libraryError.localizationKey); - } - - // rileggo la ricetta - var currParams = new Dictionary(); - foreach (var item in currWarmers) - { - currParams.Add(item.Key, item.Value.SetpointHMI); - } - - saveCurrentRecipeWarmers(currParams); - - // ritorno solo fatto! - return Ok(); - } - - [Route("setConfig"), HttpPut] - [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.RECIPE_MANAGER, Action = ACTIONS.READ)] - public IHttpActionResult SetConfig() - { - // scrive configurazioni RISK - // Try connection - CmsError libraryError = ncAdapter.Connect(); - if (libraryError.IsError()) - { - ThermoActiveLogger.LogError($"NC Not connected! | SetConfig | {libraryError.exception}"); - return BadRequest(libraryError.localizationKey); - } - - // scrivo sul PLC - libraryError = ncAdapter.WriteRecipeWarmConfig(); - if (libraryError.IsError()) - { - ThermoActiveLogger.LogError($"Warmers SetConfig error | WriteRecipeWarmConfig | {libraryError.exception}"); - return BadRequest(libraryError.localizationKey); - } - - // ritorno solo fatto! - return Ok(); - } - - /// /// Do actual recipe warmers setpoints FileSave /// @@ -247,5 +291,7 @@ namespace Thermo.Active.Controllers.WebApi ThermoActiveLogger.LogError($"Warmers | SaveCurrentRecipeParams exception | {exc}"); } } + + #endregion Methods } } \ No newline at end of file