Files
cms_thermo_active/Thermo.Active/Controllers/WebApi/RecipeController.cs
T
2020-06-12 17:17:05 +02:00

439 lines
16 KiB
C#

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<string, RecipeCatStatus> 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<string, DTORecipeParam> currRecipe);
if (cmsError.IsError())
return BadRequest(cmsError.localizationKey);
return Ok(currRecipe);
}
}
[Route("update"), HttpPut]
public IHttpActionResult WriteParameters(Dictionary<string, double> 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<string, DTORecipeParam> prevRecipe);
if (cmsError.IsError())
return BadRequest(cmsError.localizationKey);
Dictionary<string, DTORecipeParam> updtRecipe = new Dictionary<string, DTORecipeParam>();
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();
}
}
/// <summary>
/// Confirm recipe modification (parameters: HMI --> PLC)
/// </summary>
/// <returns></returns>
[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<string, DTORecipeParam> currRecipe);
if (cmsError.IsError())
return BadRequest(cmsError.localizationKey);
// rileggo la ricetta
var currParams = new Dictionary<string, double>();
foreach (var item in currRecipe)
{
currParams.Add(item.Key, item.Value.SetpointHMI);
}
saveCurrentRecipeParams(currParams);
// ritorno solo fatto!
return Ok();
}
}
else
{
// non pronto!
return InternalServerError();
}
}
/// <summary>
/// Cancel recipe modification (parameters: PLC --> HMI)
/// </summary>
/// <returns></returns>
[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<string, DTORecipeParam> currRecipe);
if (cmsError.IsError())
return BadRequest(cmsError.localizationKey);
var currParams = new Dictionary<string, double>();
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();
}
}
/// <summary>
/// load recipe from file and send to PLC
/// </summary>
/// <returns></returns>
[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();
}
}
/// <summary>
/// Load tempalte recipe from file and save as new current...
/// </summary>
/// <returns></returns>
[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();
}
/// <summary>
/// Save current recipe from PLC to default
/// </summary>
/// <returns></returns>
[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<string, DTORecipeParam> currRecipe);
if (cmsError.IsError())
return BadRequest(cmsError.localizationKey);
var currParams = new Dictionary<string, double>();
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();
}
}
/// <summary>
/// Save current recipe from PLC with new name
/// </summary>
/// <returns></returns>
[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<string, DTORecipeParam> currRecipe);
if (cmsError.IsError())
return BadRequest(cmsError.localizationKey);
var currParams = new Dictionary<string, double>();
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();
}
}
/// <summary>
/// Save current recipe from PLC to Template
/// </summary>
/// <returns></returns>
[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<string, DTORecipeParam> currRecipe);
if (cmsError.IsError())
return BadRequest(cmsError.localizationKey);
// recupero i dati LIVE dei carichi load dei cahnnels di riscaldo...
cmsError = ncAdapter.ReadWarmers(out Dictionary<int, DTOWarmers> currWarmers);
if (cmsError.IsError())
return BadRequest(cmsError.localizationKey);
// uso i valopri HMI...
var currParams = new Dictionary<string, double>();
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<int, int>();
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();
}
}
/// <summary>
/// Do actual recipe parameters FileSave
/// </summary>
/// <param name="currParams"></param>
private static void saveCurrentRecipeParams(Dictionary<string, double> 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<string, DTORecipeParam> prevRecipe);
if (checkError.IsError())
return checkError;
// save parameters to PLC!!!
Dictionary<string, DTORecipeParam> updtRecipe = new Dictionary<string, DTORecipeParam>();
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<int, int> newRisk = new Dictionary<int, int>();
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;
}
}
}