Files
cms_thermo_active/Thermo.Active.Config/ServerConfigController.cs
T
2020-06-19 19:28:07 +02:00

1037 lines
40 KiB
C#

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Security.Cryptography;
using System.Xml;
using System.Xml.Linq;
using System.Xml.Schema;
using System.Xml.Serialization;
using Thermo.Active.Model.ConfigModels;
using Thermo.Active.Model.DTOModels.Scada;
using Thermo.Active.Utils;
using static Thermo.Active.Config.ServerConfig;
using static Thermo.Active.Model.Constants;
using static Thermo.Active.Utils.SupportFunctions;
namespace Thermo.Active.Config
{
public static class ServerConfigController
{
private static string actualFileName;
public static void ReadStartupConfig()
{
try
{
ReadServerConfig();
ReadAreaConfig();
ReadMaintenancesConfig();
ReadNcSoftKeys();
ReadUserSoftKeysConfig();
ReadAlarmsConfig();
ReadHeadsConfig();
ReadRecipeConfig();
ReadModBlockConfig();
ReadRiskConfig();
// ReadCMSConnectConfig();
ReadMacros();
ReadScadaFile();
}
catch (XmlException ex)
{
ExceptionManager.ManageError(ERROR_LEVEL.FATAL,
"Error while reading file: " + ex.SourceUri +
"\n Error: " + ex.Message,
true
);
}
catch (Exception ex)
{
var message = ex.Message;
if (ex.InnerException != null)
message += "\n" + ex.InnerException.Message;
ExceptionManager.ManageError(ERROR_LEVEL.FATAL, message, true);
}
}
public static void ReadLastRecipe()
{
try
{
ReadLiveData();
}
catch (XmlException ex)
{
ExceptionManager.ManageError(ERROR_LEVEL.FATAL,
"Error while reading file: " + ex.SourceUri +
"\n Error: " + ex.Message,
true
);
}
catch (Exception ex)
{
var message = ex.Message;
if (ex.InnerException != null)
message += "\n" + ex.InnerException.Message;
ExceptionManager.ManageError(ERROR_LEVEL.FATAL, message, true);
}
}
private static XDocument GetXmlHandlerWithValidator(string configSchemaFilePath, string configFilePath, bool isFullPath = false)
{
// Create new instance
XmlSchemaSet readerSettings = new XmlSchemaSet();
// Add Schema from Assembly
Assembly myAssembly = Assembly.GetExecutingAssembly();
using (Stream schemaStream = myAssembly.GetManifestResourceStream(configSchemaFilePath))
{
using (XmlReader schemaReader = XmlReader.Create(schemaStream))
{
readerSettings.Add(null, schemaReader);
}
}
actualFileName = configFilePath;
// Open file reader
XDocument xmlConfigFile = XDocument.Load((!isFullPath ? BASE_PATH + "\\" : "") + configFilePath);
// Validate file
xmlConfigFile.Validate(readerSettings, ValidationHandler);
return xmlConfigFile;
}
private static void validateScada(string configSchemaFilePath, string configFilePath)
{
// Create new instance
XmlSchemaSet readerSettings = new XmlSchemaSet();
// Add Schema from Assembly
Assembly myAssembly = Assembly.GetExecutingAssembly();
using (Stream schemaStream = myAssembly.GetManifestResourceStream(configSchemaFilePath))
{
using (XmlReader schemaReader = XmlReader.Create(schemaStream))
{
readerSettings.Add(null, schemaReader);
}
}
actualFileName = Path.GetFileName(configFilePath);
// Open file reader
XDocument xmlConfigFile = XDocument.Load(configFilePath);
// Validate file
xmlConfigFile.Validate(readerSettings, ValidationHandler);
}
private static void SetAreaValueByName(XElement element)
{
// Choose which area to be set
switch (element.Name.ToString())
{
case AREAS.PRODUCTION_KEY:
SetAreaValue(ref ProductionConfig, element);
break;
case AREAS.REPORT_KEY:
SetAreaValue(ref ReportConfig, element);
break;
case AREAS.ALARMS_KEY:
SetAreaValue(ref AlarmsConfig, element);
break;
case AREAS.MAINTENANCE_KEY:
SetAreaValue(ref MaintenanceConfig, element);
break;
case AREAS.UTILITIES_KEY:
SetAreaValue(ref UtilitiesConfig, element);
break;
case AREAS.SCADA_KEY:
SetAreaValue(ref ScadaConfig, element);
break;
case AREAS.JOBEDITOR_KEY:
SetAreaValue(ref JobEditorConfig, element);
break;
case AREAS.USERS_KEY:
SetAreaValue(ref UsersConfig, element);
break;
}
}
private static void SetAreaValue(ref AreasConfigModel areasConfig, XElement element)
{
// Set area model with xml data
areasConfig = new AreasConfigModel()
{
Name = element.Name.ToString(),
Enabled = Convert.ToBoolean(element.Element("enabled").Value),
AllowExternalBrowser = Convert.ToBoolean(element.Element("allowExternalBrowser").Value),
NcNeeded = Convert.ToBoolean(element.Element("ncNeeded").Value)
};
}
private static void ValidationHandler(object sender, ValidationEventArgs e)
{
if (e.Severity == XmlSeverityType.Warning)
{
ExceptionManager.ManageError(ERROR_LEVEL.WARNING, e.Message, true);
}
else if (e.Severity == XmlSeverityType.Error)
{
ExceptionManager.ManageError(ERROR_LEVEL.FATAL,
// "Error while reading file: " + e.Exception.SourceUri +
"Error while reading XML file \"" + actualFileName + "\" \n\n" + e.Message,
true
);
}
}
public static bool CheckAreaStatus(string areaName)
{ // Get Area status ( enabled field) by name
switch (areaName)
{
case AREAS.PRODUCTION_KEY:
return ProductionConfig.Enabled;
case AREAS.REPORT_KEY:
return ProductionConfig.Enabled;
case AREAS.ALARMS_KEY:
return AlarmsConfig.Enabled;
case AREAS.MAINTENANCE_KEY:
return MaintenanceConfig.Enabled;
case AREAS.UTILITIES_KEY:
return UtilitiesConfig.Enabled;
case AREAS.SCADA_KEY:
return ScadaConfig.Enabled;
case AREAS.JOBEDITOR_KEY:
return ScadaConfig.Enabled;
case AREAS.GENERAL_KEY:
case AREAS.UNDER_HOOD:
return true;
default:
return false;
}
}
private static void ReadScadaFile()
{
DirectoryInfo d = new DirectoryInfo(SCADA_DIRECTORY);
FileInfo[] files = d.GetFiles("*.xml");
int i = 1;
// Cycle inside xml files
foreach (var file in files)
{
validateScada(SCADA_PAGES_SCHEMA_PATH, SCADA_DIRECTORY + file.Name);
StreamReader sr = new StreamReader(SCADA_DIRECTORY + file.Name);
XmlSerializer xmlSerializer = new XmlSerializer(typeof(ScadaSchemaModel));
ScadaSchemaModel schema = xmlSerializer.Deserialize(sr) as ScadaSchemaModel;
// Setup incremental ids
schema.Id = i++;
var name = Path.GetFileNameWithoutExtension(file.Name);
schema.BackgroundImage = GetImageBase64String(SCADA_DIRECTORY + name, schema.BackgroundImage);
schema.Layers = schema.Layers.Select(x => new ScadaSchemaLayerModel()
{
Id = i++,
Buttons = x.Buttons.Select(y => { y.Id = i++; return y; }).ToArray(),
Images = x.Images.Select(y =>
{
y.Id = i++;
y.Name = GetImageBase64String(SCADA_DIRECTORY + name, y.Name);
return y;
})
.ToArray(),
Labels = x.Labels.Select(y => { y.Id = i++; return y; }).ToArray(),
ProgressBars = x.ProgressBars.Select(y => { y.Id = i++; return y; }).ToArray(),
Inputs = x.Inputs.Select(y => { y.Id = i++; return y; }).ToArray()
})
.ToArray();
if (schema.IsInProductionPage == true)
ProductionScadaSchema.Add(schema);
else
ConfiguredScadaSchema.Add(schema);
}
}
#region Read config from file from configuration
public static void ReadServerConfig()
{
// Get server file handler
XDocument xmlConfigFile = GetXmlHandlerWithValidator(SERVER_CONFIG_SCHEMA_PATH, SERVER_CONFIG_PATH);
// Read nc Config with LINQ
NcConfig = xmlConfigFile
.Root
.Descendants(NC_CONFIG_KEY)
.Select(x => new NcConfigModel()
{
NcVendor = x.Element("ncVendor").Value,
ShowNcHMI = Convert.ToBoolean(x.Element("showNcHMI").Value),
NcIpAddress = x.Element("ncIpAddress").Value,
NcPort = Convert.ToUInt16(x.Element("ncPort").Value),
NcName = x.Element("machineModel").Value,
SharedPath = x.Element("sharedPath").Value,
SharedName = x.Element("sharedName").Value,
InstallationDate = x.Element("installationDate").Value,
MgiOption = Convert.ToBoolean(x.Element("mgiOption").Value),
SiemensKeyboardOption = Convert.ToBoolean(x.Element("siemensKeyboardOption").Value),
MachineNumberHasLetters = Convert.ToBoolean(x.Element("machineNumberHasLetters").Value)
}).FirstOrDefault();
// Read Prod Software Config with LINQ
SoftwareProdConfig = xmlConfigFile
.Root
.Descendants(PROD_SFT_CONFIG_KEY)
.Select(x => new SoftwareProdConfigModel()
{
Enabled = Convert.ToBoolean(x.Element("enabled").Value),
Path = x.Element("path").Value
}).FirstOrDefault();
// Read server config with LINQ and save into static config
ServerStartupConfig = xmlConfigFile
.Root
.Descendants(SERVER_CONFIG_KEY)
.Select(x => new ServerConfigModel()
{ // Set server config model data
Language = CultureInfo.CreateSpecificCulture(x.Element("language").Value),
ServerAddress = x.Element("serverAddress").Value,
ServerPort = Convert.ToInt32(x.Element("serverPort").Value),
EnableDirectoryBrowsing = Convert.ToBoolean(x.Element("enableDirectoryBrowsing").Value),
DatabaseAddress = x.Element("databaseAddress").Value,
AutoOpenCmsClient = Convert.ToBoolean(x.Element("autoOpenCmsClient").Value),
TextEditorPath = x.Element("textEditorPath").Value,
MTCFolderPath = x.Element("MTCFolderPath").Value,
MTCApplicationName = x.Element("MTCApplicationName").Value,
MaxAlarmsRows = Convert.ToInt32(x.Element("maxAlarmsRows").Value),
AlarmToDelete = Convert.ToInt32(x.Element("alarmToDelete").Value),
CmsConnectReady = Convert.ToBoolean(x.Element("CMSConnectReady").Value)
}).FirstOrDefault();
int softwareId = 0;
ExtSoftwaresConfig = xmlConfigFile
.Descendants("extSoftwares")
.Elements("software")
.Select(x => new ExtSoftwareModel()
{
Path = x.Element("path").Value,
Arguments = x.Element("arguments").Value,
LongName = x.Element("longName").Value,
ShortName = x.Element("shortName").Value,
IconBase64 = ExtractBase64ProgIcon(x.Element("path").Value),
InMainMenuBar = Convert.ToBoolean(x.Element("inMainMenuBar").Value),
Id = softwareId++.ToString()
}).ToList();
}
private static void ReadAreaConfig()
{
// Get Areas file handler
XDocument xmlConfigFile = GetXmlHandlerWithValidator(AREAS_CONFIG_SCHEMA_PATH, AREAS_CONFIG_PATH);
// Read areas config with LINQ
xmlConfigFile
.Root // Get areas config node
.Elements()
.ToList()
.ForEach(x => SetAreaValueByName(x)); // Loop through elements
}
public static void ReadMaintenancesConfig()
{
// Get Maintenances file handler
XDocument xmlConfigFile = GetXmlHandlerWithValidator(MAINTENANCES_CONFIG_SCHEMA_PATH, MAINTENANCES_CONFIG_PATH);
ReadAssistanceConfig();
MaintenancesConfig = xmlConfigFile
.Descendants("maintenances")
.Elements("maintenance")
.Select(x =>
new MaintenanceConfigModel()
{
Id = Convert.ToInt32(x.Element("id").Value),
LocalizedName = x.Element("localizedName").Elements().ToDictionary( // Read localized names
y => y.Attribute("langKey").Value, y => y.Value
),
Intervall = TimeSpan.FromMinutes(Convert.ToDouble(x.Element("interval").Value)),
Deadline = DateTime.ParseExact(x.Element("deadline").Value, DATE_TIME_FORMATS, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal),
Type = x.Element("type").Value,
CouterId = Convert.ToInt32(x.Element("counterId").Value),
LocalizedDescription = x.Element("localizedDescription").Elements().ToDictionary( // Read localization of description
y => y.Attribute("langKey").Value, y => y.Value
),
UnitOfMeasure = x.Element("unitOfMeasure").Value
})
.ToList();
}
public static void ReadAssistanceConfig()
{
//Read Standard CMS Configuration
XDocument xmlConfigFile = GetXmlHandlerWithValidator(MAINTENANCES_CONFIG_SCHEMA_PATH, MAINTENANCES_CONFIG_PATH);
ReadAssistanceConfigFromXml(
xmlConfigFile.Root.Descendants("cmsContacts").FirstOrDefault(),
out CmsContactConfig,
out CmsAuxContact1,
out CmsAuxContact2
);
xmlConfigFile = GetXmlHandlerWithValidator(MAINTENANCES_CONFIG_SCHEMA_PATH, MAINTENANCES_CONFIG_PATH);
ReadAssistanceConfigFromXml(
xmlConfigFile.Root.Descendants("scmContacts").FirstOrDefault(),
out ScmContactConfig,
out ScmAuxContact1,
out ScmAuxContact2
);
}
public static bool ReadAssistanceCustomConfig()
{
DealerContactConfig = null;
DealerAuxContact1 = null;
DealerAuxContact2 = null;
//Read Dealer Configuration
if (File.Exists(CUSTOMER_CONTACTS))
{
// Open file reader
XmlDocument xmlContactFile = new XmlDocument();
xmlContactFile.Load(CUSTOMER_CONTACTS);
// Create new instance
XmlSchemaSet readerSettings = new XmlSchemaSet();
// Add Schema from Assembly
Assembly myAssembly = Assembly.GetExecutingAssembly();
using (Stream schemaStream = myAssembly.GetManifestResourceStream(CUSTOMER_CONTACTS_CONFIG_SCHEMA_PATH))
{
using (XmlReader schemaReader = XmlReader.Create(schemaStream))
{
readerSettings.Add(null, schemaReader);
}
}
xmlContactFile.Schemas.Add(readerSettings);
// Validate file
try
{
xmlContactFile.Validate(null);
}
catch (XmlSchemaValidationException)
{
ReadAssistanceConfig();
return false;
}
ReadAssistanceConfigFromXml(
XDocument.Parse(xmlContactFile.OuterXml).Root,
out DealerContactConfig,
out DealerAuxContact1,
out DealerAuxContact2
);
}
return true;
}
public static void ReadAssistanceConfigFromXml(XElement xmlRoot, out ContactModel MainContact, out ContactModel AuxContact1, out ContactModel AuxContact2)
{
MainContact = xmlRoot
.Descendants("MainOffice")
.Select(x =>
new ContactModel()
{
Company = x.Element("company").Value,
Email = x.Element("email").Value,
PhoneNumber = x.Element("phoneNumber").Value,
WebSite = x.Element("moreInfoUrl").Value,
})
.FirstOrDefault();
AuxContact1 = xmlRoot
.Descendants("AuxOffice1")
.Select(x =>
new ContactModel()
{
Visible = Convert.ToBoolean(x.Element("visible").Value),
Name = x.Element("name").Value,
Email = x.Element("email").Value,
PhoneNumber = x.Element("phoneNumber").Value
})
.FirstOrDefault();
AuxContact2 = xmlRoot
.Descendants("AuxOffice2")
.Select(x =>
new ContactModel()
{
Visible = Convert.ToBoolean(x.Element("visible").Value),
Name = x.Element("name").Value,
Email = x.Element("email").Value,
PhoneNumber = x.Element("phoneNumber").Value
})
.FirstOrDefault();
}
private static void ReadNcSoftKeys()
{
XDocument xmlConfigFile = GetXmlHandlerWithValidator(NC_SOFTKEYS_CONFIG_SCHEMA_PATH, NC_SOFTKEYS_CONFIG_PATH);
// Read Nc softkey configuration from XML
NcSoftKeysConfig = xmlConfigFile
.Root
.Elements()
.Where(x => Convert.ToBoolean(x.Element("enabled").Value) == true) // Filter for active softkey
.Select(x => new NcSoftKeysModel()
{
Id = GetPlcIdFromNcSoftKey(x.Name.ToString()),
Name = x.Name.ToString(),
VisualizedName = x.Element("visualizedName").Value,
IsActive = Convert.ToBoolean(x.Element("enabled").Value),
IsReadOnly = Convert.ToBoolean(x.Element("readOnly").Value)
})
.ToList();
}
private static void ReadUserSoftKeysConfig()
{
// Get softkey file content
XDocument xmlConfigFile = GetXmlHandlerWithValidator(USER_SOFTKEYS_CONFIG_SCHEMA_PATH, USER_SOFTKEYS_CONFIG_PATH);
int id = 1;
// Read softkey configuration from XML with LINQ
SoftKeysConfig = xmlConfigFile
.Root
.Elements()
.Where(x => Convert.ToBoolean(x.Element("active").Value) == true) // Filter for active softkey
.Select(x => new UserSoftKeyConfigModel()
{
Id = id++, // autoincrement Id
PlcId = Convert.ToInt32(x.Element("plcId")?.Value), // If exists
IsActive = Convert.ToBoolean(x.Element("active").Value),
IsVisible = Convert.ToBoolean(x.Element("visible").Value),
Category = Convert.ToInt32(x.Element("category").Value),
LocalizedNames = x.Element("localizedNames").Elements().ToDictionary( // Read localized names and convert into a dictionary
y => y.Attribute("langKey").Value, y => y.Value
),
SubKeys = x.Element("subKeys")?.Elements().Where(y => Convert.ToBoolean(y.Attribute("active").Value) == true) // Filter for active softkey
.Select(y => new SubKeysModel() // Populate subkeys if exist
{
Id = id++,
IsActive = Convert.ToBoolean(y.Attribute("active").Value),
PlcId = Convert.ToInt32(y.Attribute("plcId").Value),
Text = y.Value
}).ToList(),
Type = GetSoftKeyType(x.Name.ToString()),
OperatorConfirmationNeeded = Convert.ToBoolean(x.Element("operatorConfirmationNeeded").Value)
})
.ToList();
}
private static void ReadAlarmsConfig()
{
XDocument xmlConfigFile = GetXmlHandlerWithValidator(ALARMS_CONFIG_SCHEMA_PATH, ALARMS_CONFIG_PATH);
// Read alarms config from XML file
InitialAlarmsConfig = xmlConfigFile
.Root
.Elements()
.Select(x => new AlarmsConfigModel()
{
AlarmId = Convert.ToInt32(x.Element("alarmId").Value),
PlcId = Convert.ToInt32(x.Element("plcId").Value),
RestoreIsActive = Convert.ToBoolean(x.Element("restoreIsActive").Value)
})
.ToList();
}
private static void ReadHeadsConfig()
{
XDocument xmlConfigFile = GetXmlHandlerWithValidator(HEADS_CONFIG_SCHEMA_PATH, HEADS_CONFIG_PATH);
int i = 1;
// Read head config from XML file
HeadsConfig = xmlConfigFile
.Root
.Elements()
.Select(x => new HeadsConfigModel()
{
Id = i++, // Autoincrement Id
Type = GetHeadType(x.Element("type").Value),
WarningLimit = Convert.ToInt16(x.Element("warningLimit").Value),
AlarmLimit = Convert.ToInt16(x.Element("alarmLimit").Value),
FixedHead = Convert.ToBoolean(x.Element("fixedHead").Value),
LocalizedNames = x.Element("localizedNames").Elements().ToDictionary( // Read localized names and convert into a dictionary
y => y.Attribute("langKey").Value, y => y.Value
),
})
.ToList();
}
/// <summary>
/// Recipe Config setup from file
/// </summary>
private static void ReadRecipeConfig()
{
XDocument xmlConfigFile = GetXmlHandlerWithValidator(RECIPE_CONFIG_SCHEMA_PATH, RECIPE_CONFIG_PATH);
// Read Recipe config from XML file
RecipeConfig = xmlConfigFile
.Root
.Elements()
.Select(x => new RecipeConfigModel()
{
Id = Convert.ToInt16(x.Element("id").Value),
Category = GetTActParamType(x.Element("category").Value),
SubCategory_1 = x.Element("subCategory_1").Value,
SubCategory_2 = x.Element("subCategory_2").Value,
Name = x.Element("name").Value,
Description = x.Element("description").Value,
Format = x.Element("format").Value,
ScaleFactor = Convert.ToInt16(x.Element("scaleFactor").Value)
})
.ToList();
}
/// <summary>
/// Module config setup from file
/// </summary>
private static void ReadModBlockConfig()
{
XDocument xmlConfigFile = GetXmlHandlerWithValidator(MODBLOCK_CONFIG_SCHEMA_PATH, MODBLOCK_CONFIG_PATH);
// Read head config from XML file
ModBlockConfig = xmlConfigFile
.Root
.Elements()
.Select(x => new ModBlockConfigModel()
{
Id = Convert.ToInt16(x.Element("id").Value),
LocalizedLabels = x.Element("localizedLabels").Elements().ToDictionary(
y => y.Attribute("langKey").Value, y => y.Value
),
Type = GetTActMB_Type(x.Element("type").Value),
Section = GetTActMB_Section(x.Element("section").Value),
IdParam = Convert.ToInt16(x.Element("idParam").Value),
ShowDelay = Convert.ToBoolean(x.Element("showDelay").Value),
Priority = Convert.ToInt16(x.Element("priority").Value)
})
.ToList();
}
/// <summary>
/// Warmers config setup from file
/// </summary>
private static void ReadRiskConfig()
{
XDocument xmlConfigFile = GetXmlHandlerWithValidator(RISK_CONFIG_SCHEMA_PATH, RISK_CONFIG_PATH);
int i = 0;
List<RiskRiflettore> Riflettori = new List<RiskRiflettore>();
List<RiskResistenza> Resistenze = new List<RiskResistenza>();
List<RiskRiferimenti> Riferimenti = new List<RiskRiferimenti>();
// carico gli oggetti "nativi"
Riferimenti = xmlConfigFile
.Root
.Elements("riferimenti")
.Select(x => new RiskRiferimenti()
{
Id = Convert.ToInt16(x.Value),
Dimensione = Convert.ToInt16(x.Attribute("dimensione").Value),
Potenza = Convert.ToInt16(x.Attribute("potenza").Value),
Modello = x.Attribute("modello").Value
})
.ToList();
Riflettori = xmlConfigFile
.Root
.Elements("riflettore")
.Select(x => new RiskRiflettore()
{
Tipo = Convert.ToInt16(x.Attribute("tipo").Value),
Resistenze = x.Elements("resistenza")
.Select(y => new RiskResistenza()
{
Canale = Convert.ToInt16(y.Attribute("canale").Value),
Riga = Convert.ToInt16(y.Attribute("riga").Value),
Tipo = Convert.ToInt16(y.Attribute("tipo").Value)
}
)
.ToList()
})
.ToList();
// conversione da modelli RISK a modello Thermo...
int numCol = -1;
int ResistId = 0;
int oldRow = 0;
int currIdBoard = 0;
RiskBoardConfig = new List<RiskBoardModel>();
RiskResistConfig = new List<RiskResistModel>();
RiskChannelConfig = new List<RiskChannelModel>();
// inizializzo le 64 schede a 0 canali...
for (int idxBoard = 0; idxBoard < 64; idxBoard++)
{
RiskBoardConfig.Add(new RiskBoardModel()
{
IdBoard = idxBoard,
NumChannels = 0
});
}
// ciclo x calcolare i canali
foreach (var riflettore in Riflettori)
{
// ciclo sulle resistenze
foreach (var resistenza in riflettore.Resistenze)
{
// cerco la scheda dato il canale... 16 ch x ogni scheda
currIdBoard = (resistenza.Canale - 1) / 16;
// cerco se ho già la scheda
var boardFound = RiskBoardConfig.Find(item => item.IdBoard == currIdBoard);
if (boardFound == null)
{
RiskBoardConfig.Add(new RiskBoardModel()
{
IdBoard = currIdBoard,
NumChannels = 1
});
}
else
{
boardFound.NumChannels += 1;
}
// cerco se ho già il canale
var chanFound = RiskChannelConfig.Find(item => item.IdChannel == resistenza.Canale);
if (chanFound == null)
{
// cerco il TIPO...
var riferimento = Riferimenti.Find(x => x.Id == resistenza.Tipo);
if (riferimento != null)
{
RiskChannelConfig.Add(new RiskChannelModel()
{
IdChannel = resistenza.Canale,
IdReflector = riflettore.Tipo,
SetpointRecipe = 0,
SetpointThermo = 0,
MaxPower = riferimento.Potenza,
NumResist = 1,
CalcIchMin = riferimento.Modello.Contains("Quarzo")
});
}
else
{
chanFound.NumResist += 1;
}
}
}
}
// ciclo sui riflettori x recuperare le resistenze...
foreach (var riflettore in Riflettori)
{
// ciclo sulle resistente
foreach (var resistenza in riflettore.Resistenze)
{
if (oldRow != resistenza.Riga)
{
numCol = 0;
oldRow = resistenza.Riga;
}
else
{
numCol++;
}
// cerco il TIPO...
var riferimento = Riferimenti.Find(x => x.Id == resistenza.Tipo);
RiskResistConfig.Add(new RiskResistModel()
{
Id = ResistId++,
Row = resistenza.Riga,
Column = numCol,
IdChannel = resistenza.Canale,
Dimension = riferimento.Dimensione
}); ;
}
}
}
private static void ReadCMSConnectConfig()
{
String _tempUSR, _tempPSW;
XDocument xmlConfigFile = GetXmlHandlerWithValidator(CMS_CONNECT_CONFIG_SCHEMA_PATH, CMS_CONNECT_CONFIG_PATH);
XElement l = xmlConfigFile
.Root
.Descendants("cmsConnectConfig")
.FirstOrDefault();
// Read config from XML file
CmsConnectConfig = xmlConfigFile
.Root
.Descendants("cmsConnectConfig")
.Select(x => new CmsConnectConfigModel()
{
Enabled = Convert.ToBoolean(x.Element("enabled").Value)
})
.FirstOrDefault();
// Read config from XML file for Gateway
GatewayConfigModel tempGatewayConfigModel = xmlConfigFile
.Root
.Descendants("gateway")
.Select(x => new GatewayConfigModel()
{
Address = x.Element("address").Value,
Token = x.Element("token").Value
})
.FirstOrDefault();
if (DecodeCMSConnectGatewayLogin(tempGatewayConfigModel.Token, out _tempUSR, out _tempPSW))
{
tempGatewayConfigModel.Username = _tempUSR;
tempGatewayConfigModel.Password = _tempPSW;
}
else
throw new Exception("Error while reading \"" + CMS_CONNECT_CONFIG_PATH + "\": Gateway Token not valid");
CmsConnectConfig.Gateway = tempGatewayConfigModel;
}
public static void ReadMacros()
{
XDocument xmlConfigFile = GetXmlHandlerWithValidator(MACROS_CONFIG_SCHEMA_PATH, MACROS_CONFIG_PATH);
// Read config from XML file
MacrosConfig = xmlConfigFile
.Descendants("macros")
.Elements()
.Select(x => x.Value)
.ToList();
}
/// <summary>
/// Try to load live data from json persistence file
/// </summary>
public static bool ReadLiveData()
{
bool answ = false;
if (File.Exists(LIVE_RECIPE_PATH))
{
// load all text data
var rawData = File.ReadAllText(LIVE_RECIPE_PATH);
try
{
// deserialize to object
RecipeLiveData = JsonConvert.DeserializeObject<LiveData>(rawData);
}
catch
{ }
answ = true;
}
else
{
// reload from template...
var rawData = File.ReadAllText(RECIPE_TEMPLATE_PATH);
try
{
// deserialize to object
RecipeLiveData = JsonConvert.DeserializeObject<LiveData>(rawData);
}
catch
{ }
// salva current
SaveRecipeCurrent();
answ = true;
}
// rendo se fatto
return answ;
}
/// <summary>
/// Try to load selected recipe to live data (memory and json persistence file)
/// </summary>
public static bool LoadRecipe(string filePath)
{
bool answ = false;
// check file extension
string fileName = Path.GetFileName(filePath);
if (!fileName.EndsWith(".json"))
{
fileName += ".json";
filePath += ".json";
}
// check filePath...
if (!filePath.Contains(RECIPE_DIRECTORY) && filePath != RECIPE_TEMPLATE_PATH)
{
// aggiungo base path!
filePath = RECIPE_DIRECTORY + filePath;
}
if (File.Exists(filePath))
{
answ = true;
// load all text data
var rawData = File.ReadAllText(filePath);
try
{
// deserialize to object
RecipeLiveData = JsonConvert.DeserializeObject<LiveData>(rawData);
}
catch
{ }
// update current live data!
SaveRecipeCurrent();
}
// rendo se fatto
return answ;
}
/// <summary>
/// Try to load template recipe
/// </summary>
public static bool LoadTemplate()
{
bool answ = false;
// check filePath...
if (File.Exists(RECIPE_TEMPLATE_PATH))
{
answ = true;
// load all text data
var rawData = File.ReadAllText(RECIPE_TEMPLATE_PATH);
try
{
// deserialize to object
RecipeLiveData = JsonConvert.DeserializeObject<LiveData>(rawData);
// update NAME
RecipeLiveData.RecipeName = $"{DateTime.Now:yyyyMMss_HHmmss}.json";
}
catch
{ }
// update current live data!
SaveRecipeCurrent();
}
// rendo se fatto
return answ;
}
/// <summary>
/// Try to write live data to json persistence file
/// </summary>
public static bool SaveRecipeCurrent()
{
bool answ = false;
try
{
answ = true;
// serialize
string rawData = JsonConvert.SerializeObject(RecipeLiveData);
// save live!
var dir = Path.GetDirectoryName(LIVE_RECIPE_PATH);
if (!Directory.Exists(dir))
{
Directory.CreateDirectory(dir);
}
File.WriteAllText(LIVE_RECIPE_PATH, rawData);
}
catch
{ }
// rendo se fatto
return answ;
}
/// <summary>
/// Try to save live recipe as NEW template
/// </summary>
public static bool SaveRecipeTemplate()
{
RecipeLiveData.RecipeName = "template.json";
return SaveRecipe(RECIPE_TEMPLATE_PATH);
}
/// <summary>
/// Try to save live recipe to selected filePath
/// </summary>
public static bool SaveRecipe(string filePath)
{
bool answ = false;
try
{
answ = true;
string fileName = Path.GetFileName(filePath);
if (!fileName.EndsWith(".json"))
{
fileName += ".json";
filePath += ".json";
}
// fix name!
RecipeLiveData.RecipeName = fileName;
// serialize
string rawData = JsonConvert.SerializeObject(RecipeLiveData);
// save live!
File.WriteAllText(LIVE_RECIPE_PATH, rawData);
// check filePath...
if (!filePath.Contains(RECIPE_DIRECTORY) && filePath != RECIPE_TEMPLATE_PATH)
{
// aggiungo base path!
filePath = RECIPE_DIRECTORY + filePath;
}
// save!
File.WriteAllText(filePath, rawData);
}
catch
{ }
// rendo se fatto
return answ;
}
public static string CalculateHash(string filename)
{
using (var sha = SHA1.Create())
{
using (var stream = File.OpenRead(filename))
{
var hash = sha.ComputeHash(stream);
return BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant();
}
}
}
#endregion Read config from file from configuration
}
}