using CMS_CORE_Library.Models; using Thermo.Active.Model.DTOModels; using Thermo.Active.NC; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Net.Http; using System.Threading.Tasks; using System.Web.Http; using static CMS_CORE_Library.Models.DataStructures; using static Thermo.Active.Config.ServerConfig; using static Thermo.Active.Model.Constants; using Thermo.Active.Model.DTOModels.Recipe; using Thermo.Active.Config; namespace Thermo.Active.Controllers.WebApi { [RoutePrefix("api/recipe")] public class RecipeController : ApiController { [Route("overview"), HttpGet] public IHttpActionResult GetOverview() { using (NcAdapter ncAdapter = new NcAdapter()) { // Try connection CmsError libraryError = ncAdapter.Connect(); if (libraryError.errorCode != 0) return NotFound(); CmsError cmsError = ncAdapter.GetRecipeOverview(out Dictionary currOverview); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); return Ok(currOverview); } } [Route("current"), HttpGet] public IHttpActionResult GetCurrentParameters() { using (NcAdapter ncAdapter = new NcAdapter()) { // Try connection CmsError libraryError = ncAdapter.Connect(); if (libraryError.errorCode != 0) return NotFound(); CmsError cmsError = ncAdapter.ReadFullRecipe(out Dictionary currRecipe); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); return Ok(currRecipe); } } [Route("update"), HttpPut] public IHttpActionResult WriteParameters(Dictionary parametersList) { if (parametersList != null) { if (RecipeLiveData != null) { using (NcAdapter ncAdapter = new NcAdapter()) { // Try connection CmsError libraryError = ncAdapter.Connect(); if (libraryError.errorCode != 0) return NotFound(); // read recipe! CmsError cmsError = ncAdapter.ReadFullRecipe(out Dictionary prevRecipe); if (cmsError.IsError()) return BadRequest(cmsError.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]; currParam.SetpointHMI = item.Value; // salvo (1 parametro, potrei fare N...) updtRecipe.Add(item.Key, currParam); } else { return NotFound(); } } // scrivo sul PLC ncAdapter.WriteRecipeParams(updtRecipe); // ritorno solo fatto! return Ok(); } } else { // non pronto! return InternalServerError(); } } else { return NotFound(); } } /// /// Confirm recipe modification (parameters: HMI --> PLC) /// /// [Route("confirm"), HttpPut] public IHttpActionResult ConfirmEdit() { if (RecipeLiveData != null) { using (NcAdapter ncAdapter = new NcAdapter()) { // Try connection CmsError libraryError = ncAdapter.Connect(); if (libraryError.errorCode != 0) return NotFound(); // scrivo sul PLC il comando conferma! CmsError cmsError = ncAdapter.ConfirmRecipeData(true); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); // recupero i dati LIVE dei parametri HMI della ricetta... cmsError = ncAdapter.ReadFullRecipe(out Dictionary currRecipe); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); // rileggo la ricetta var currParams = new Dictionary(); foreach (var item in currRecipe) { currParams.Add(item.Key, item.Value.SetpointHMI); } saveCurrentRecipeParams(currParams); // ritorno solo fatto! return Ok(); } } else { // non pronto! return InternalServerError(); } } /// /// Cancel recipe modification (parameters: PLC --> HMI) /// /// [Route("cancel"), HttpPut] public IHttpActionResult CancelEdit() { if (RecipeLiveData != null) { using (NcAdapter ncAdapter = new NcAdapter()) { // Try connection CmsError libraryError = ncAdapter.Connect(); if (libraryError.errorCode != 0) return NotFound(); // scrivo sul PLC il comando annula! CmsError cmsError = ncAdapter.ConfirmRecipeData(false); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); // recupero i dati LIVE dei parametri HMI della ricetta... cmsError = ncAdapter.ReadFullRecipe(out Dictionary currRecipe); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); var currParams = new Dictionary(); foreach (var item in currRecipe) { currParams.Add(item.Key, item.Value.SetpointPLC); } // ora salvo ANCHE i dati live... saveCurrentRecipeParams(currParams); // ritorno solo fatto! return Ok(); } } else { // non pronto! return InternalServerError(); } } /// /// load recipe from file and send to PLC /// /// [Route("load"), HttpPut] public IHttpActionResult Load(string newName) { using (NcFileAdapter ncAdapter = new NcFileAdapter()) { // Try connection CmsError libraryError = ncAdapter.Connect(); if (libraryError.errorCode != 0) return NotFound(); // chiamo metodo di lettura... //CmsError cmsError = ServerConfigController.LoadRecipe(newName); bool fatto = ServerConfigController.LoadRecipe(newName); if (!fatto) return NotFound(); CmsError cmsError = writeCurrentRecipeToPlc(); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); // ritorno solo fatto! return Ok(); } } /// /// Load tempalte recipe from file and save as new current... /// /// [Route("new"), HttpPut] public IHttpActionResult NewRecipe() { using (NcFileAdapter ncAdapter = new NcFileAdapter()) { // chiamo metodo di lettura... bool fatto = ServerConfigController.LoadTemplate(); if (!fatto) return NotFound(); CmsError cmsError = writeCurrentRecipeToPlc(); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); } // ritorno solo fatto! return Ok(); } /// /// Save current recipe from PLC to default /// /// [Route("save"), HttpPut] public IHttpActionResult Save() { using (NcFileAdapter ncAdapter = new NcFileAdapter()) { // recupero i dati LIVE dei parametri HMI della ricetta... CmsError cmsError = ncAdapter.ReadFullRecipe(out Dictionary currRecipe); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); var currParams = new Dictionary(); foreach (var item in currRecipe) { currParams.Add(item.Key, item.Value.SetpointPLC); } // ora salvo ANCHE i dati live... saveCurrentRecipeParams(currParams); // ritorno solo fatto! return Ok(); } } /// /// Save current recipe from PLC with new name /// /// [Route("saveAs"), HttpPut] public IHttpActionResult SaveAs(string newName) { using (NcFileAdapter ncAdapter = new NcFileAdapter()) { // recupero i dati LIVE dei parametri HMI della ricetta... CmsError cmsError = ncAdapter.ReadFullRecipe(out Dictionary currRecipe); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); var currParams = new Dictionary(); foreach (var item in currRecipe) { currParams.Add(item.Key, item.Value.SetpointPLC); } // ora salvo ANCHE i dati live... RecipeLiveData.RecipeParameters = currParams; // e salvo su disco ServerConfigController.SaveRecipe(newName); // ritorno solo fatto! return Ok(); } } /// /// Save current recipe from PLC to Template /// /// [Route("saveTemplate"), HttpPut] public IHttpActionResult SaveTemplate() { using (NcFileAdapter ncAdapter = new NcFileAdapter()) { // recupero i dati LIVE dei parametri HMI della ricetta... CmsError cmsError = ncAdapter.ReadFullRecipe(out Dictionary currRecipe); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); // recupero i dati LIVE dei carichi load dei cahnnels di riscaldo... cmsError = ncAdapter.ReadWarmers(out Dictionary currWarmers); if (cmsError.IsError()) return BadRequest(cmsError.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... RecipeLiveData.RecipeParameters = currParams; // carico i dati dei riscaldi... var currChSet = new Dictionary(); foreach (var item in currWarmers) { currChSet.Add(item.Key, item.Value.SetpointHMI); } RecipeLiveData.ChannelSetpoints = currChSet; // e salvo su disco ServerConfigController.SaveRecipeTemplate(); // ritorno solo fatto! return Ok(); } } /// /// Do actual recipe parameters FileSave /// /// private static void saveCurrentRecipeParams(Dictionary currParams) { try { // ora salvo ANCHE i dati live... RecipeLiveData.RecipeParameters = currParams; // e salvo su disco ServerConfigController.SaveRecipeCurrent(); } catch { } } protected static CmsError writeCurrentRecipeToPlc() { CmsError checkError = NO_ERROR; using (NcAdapter ncAdapter = new NcAdapter()) { // Try connection CmsError libraryError = ncAdapter.Connect(); if (libraryError.errorCode != 0) return libraryError; // copy data to PLC checkError = ncAdapter.ReadFullRecipe(out Dictionary prevRecipe); if (checkError.IsError()) return checkError; // save parameters to PLC!!! Dictionary updtRecipe = new Dictionary(); foreach (var item in 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 { return NOT_FOUND_ERROR; } } // write to PLC checkError = ncAdapter.WriteRecipeParams(updtRecipe); // process ch load setup... Dictionary newRisk = new Dictionary(); foreach (var item in RecipeLiveData.ChannelSetpoints) { newRisk.Add(item.Key, item.Value); } // write to PLC checkError = ncAdapter.WriteRecipeWarmChSetpHMI(newRisk); // enable recipe! scrivo sul PLC il comando conferma! CmsError cmsError = ncAdapter.ConfirmRecipeData(true); if (cmsError.IsError()) return checkError; } return checkError; } } }