Files
2020-06-25 16:46:01 +02:00

159 lines
5.4 KiB
C#

using CMS_CORE_Library.Models;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
using Thermo.Active.Model.DTOModels.Scada;
using Thermo.Active.NC;
using Thermo.Active.Utils;
using static CMS_CORE_Library.Models.DataStructures;
using static Thermo.Active.Config.ServerConfig;
using static Thermo.Active.Model.Constants;
namespace Thermo.Active.Controllers.WebApi
{
[RoutePrefix("api/scada")]
public class ScadaController : ApiController
{
/// <summary>
/// Oggetto adapter condiviso da WebAPI
/// </summary>
protected static NcAdapter ncAdapter = new NcAdapter();
[Route("list"), HttpGet]
public IHttpActionResult GetScadaList()
{
using (NcAdapter ncAdapter = new NcAdapter())
{
return Ok(ConfiguredScadaSchema);
}
}
[Route("subscribe/{scadaId:int}"), HttpGet]
public IHttpActionResult SubscribeScada(int scadaId)
{
// Find schema
ScadaSchemaModel selectedScadaSchema = ConfiguredScadaSchema
.Where(x => x.Id == scadaId)
.FirstOrDefault();
if (selectedScadaSchema == null)
return BadRequest();
ncAdapter.Connect();
// Read the selected scada data
CmsError libraryError = ncAdapter.ReadScadaData(selectedScadaSchema, out DTOScadaModel values);
if (libraryError.IsError())
return BadRequest(libraryError.localizationKey);
// Add to the subscriber list
SubscribedScada.Add(selectedScadaSchema);
return Ok(values);
}
[Route("unsubscribe/{scadaId:int}"), HttpGet]
public IHttpActionResult UnsubscribeScada(int scadaId)
{
// Find scada by id
ScadaSchemaModel scadaToRemove = SubscribedScada
.Where(x => x.Id == scadaId)
.FirstOrDefault();
if (scadaToRemove == null)
return BadRequest();
// Remove from the subiscriber list
SubscribedScada.Remove(scadaToRemove);
return Ok();
}
[Route("production"), HttpGet]
public IHttpActionResult GetProductionPageList()
{
ncAdapter.Connect();
CmsError libraryError = ncAdapter.ReadScadasData(ProductionScadaSchema, out List<DTOScadaModel> values);
if (libraryError.IsError())
return BadRequest(libraryError.localizationKey);
ScadaDataAndSchema data = new ScadaDataAndSchema()
{
schemes = ProductionScadaSchema,
values = values
};
return Ok(data);
}
[Route("write"), HttpPost]
public IHttpActionResult WriteScadaValue(int scadaId, SCADA_ELEMENT_TYPE elementType, int elementId, object value)
{
// Find scada in productions schemas
ScadaSchemaModel scada = ProductionScadaSchema.Where(x => x.Id == scadaId).FirstOrDefault();
if (scada == null)
{
// Find scada in configured schemas
scada = ConfiguredScadaSchema.Where(x => x.Id == scadaId).FirstOrDefault();
if (scada == null)
return NotFound();
}
string memIndex = "";
SCADA_MEM_TYPE memType = SCADA_MEM_TYPE.BOOL;
foreach (var layer in scada.Layers)
{
switch (elementType)
{
case SCADA_ELEMENT_TYPE.BUTTON:
{
// Find button
var button = layer.Buttons.Where(x => x.Id == elementId).FirstOrDefault();
if (button != null)
// Set index
memIndex = button.Status.MemClickIndex;
}
break;
case SCADA_ELEMENT_TYPE.IMAGE:
{
// Find button
var image = layer.Images.Where(x => x.Id == elementId).FirstOrDefault();
if (image != null)
memIndex = image.Status.MemClickIndex;
}
break;
case SCADA_ELEMENT_TYPE.INPUT:
{
// Find button
var input = layer.Inputs.Where(x => x.Id == elementId).FirstOrDefault();
if (input != null)
{
memIndex = input.Status.MemValueIndex;
memType = SupportFunctions.GetMemTypeFromString(input.Status.Type);
}
}
break;
}
}
ncAdapter.Connect();
if (memIndex == "")
return BadRequest(INCORRECT_PARAMETERS_ERROR.localizationKey);
CmsError libraryError = ncAdapter.WriteScada(memIndex, memType, value);
if (libraryError.IsError())
return BadRequest(libraryError.localizationKey);
return Ok();
}
public class ScadaDataAndSchema
{
public List<ScadaSchemaModel> schemes;
public List<DTOScadaModel> values;
}
}
}