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 { /// /// Oggetto adapter condiviso da WebAPI /// 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 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 schemes; public List values; } } }