using IOB_UT_NEXT; using IOB_UT_NEXT.Config; using MapoSDK; using System; using System.Collections.Generic; using System.IO; using System.Threading; using System.Threading.Tasks; namespace IOB_WIN_FILE.IobFile { /// /// Generica classe per implementare IOB basato su scambio FILE /// public class FileGen : Iob.GenericNext, IDisposable { /* -------------------------------------------------------------------------------- * Controlli dotati di GENERICA funzionalità scambio info tramite file * * -------------------------------------------------------------------------------- */ #region Public Constructors /// /// Estende l'init della classe base... /// /// Form chiamante /// Configurazione (v 4.x) public FileGen(AdapterFormNext caller, IobConfTree IobConfFull) : base(caller, IobConfFull) { lgInfo("INIT FileGen"); } #endregion Public Constructors #region Public Methods public void Dispose() { GC.SuppressFinalize(this); } /// /// Recupero dati dinamici in formato dictionary /// /// public override Dictionary getDynData() { lgInfo("Chiamata getDynData x IOB FILE!"); Dictionary outVal = new Dictionary(); #if false try { /* ---------------------------------------------------------- * Recupero dalla TUTTE le chiavi richieste... * */ string cKey = ""; string cVal = ""; // processo tutti i DynData... foreach (var item in monitoredItems.DynData) { // cerco elemento indicato element = driver.FindElement(By.Id(item.val)); cVal = element.Text; // verifico nome o key... if (!string.IsNullOrEmpty(item.name)) { cKey = item.name; } else { element = driver.FindElement(By.Id(item.key)); cKey = element.Text; } // controllo se devo inviare (per tipo di dato, x scadenza) if (monItem2Send(cVal, item)) { item.actVal = cVal; item.DTScad = DateTime.Now.AddSeconds(item.sPeriod); // accodo! outVal.Add(cKey, cVal); } } } catch (Exception exc) { lgError(exc, "Errore in getDynData x IOB FILE"); } #endif return outVal; } /// /// Effettua processing del recupero delle OVERRIDE (spindle, feedrate, rapid) /// public override void processOverride() { } /// /// Effettua lettura semafori principale /// Parametri da aggiornare x display in form /// public override void readSemafori(ref newDisplayData currDispData) { base.readSemafori(ref currDispData); // init a zero... B_input = 0; // ciclo! try { #if false // controllo SE il driver SIA attivo... if (driver != null) { string cKey = ""; string cVal = ""; // IPOTESI: un UNICO oggetto decodifica status if (monitoredItems.Status.Count == 1) { var item = monitoredItems.Status[0]; // cerco elemento indicato element = driver.FindElement(By.Id(item.val)); cKey = element.Text; // verifico se mancasse il mapping... if (!item.codeMapping.ContainsKey(cKey)) { processUnknStatus(cKey); } else { // ora decodifico da variabile status a valore secondo impostazione "codeMapping" cVal = item.codeMapping[cKey]; B_input = int.Parse(cVal, System.Globalization.NumberStyles.HexNumber); if (currDispData != null) { currDispData.semIn = Semaforo.SV; } } } } else { lgError("Errore: driver non pronto (null)"); } #endif // riporto bitmap... reportRawInput(ref currDispData); } catch (Exception exc) { lgError(exc, "Errore in readSemafori x IOB FILE"); if (currDispData != null) currDispData.semIn = Semaforo.SR; } } public override void startAdapter(bool resetQueue) { // in primis RICARICO conf specifica... reloadAdapterConf(); // pulizia preliminare folder cleanupFolder(); // continuo con start... base.startAdapter(resetQueue); } /// /// Override x chiusura driver... /// /// /// public override async Task stopAdapter(bool tryRestart, bool forceDequeue) { try { #if false // in primis chiudo driver... if (driver != null) { driver.Quit(); } #endif } catch (Exception exc) { lgError(exc, "Eccezione in tryDisconnect"); } // continuo await base.stopAdapter(tryRestart, forceDequeue); } /// /// Connessione /// public override void tryConnect() { // controllo ping --> segno connected... connectionOk = Directory.Exists(BaseDir); if (connectionOk) { queueInEnabCurr = true; #if false try { // modalità sincrona startDriver(); lgInfo("Completato start driver"); } catch (Exception exc) { lgError(exc, "Eccezione in tryConnect"); } #endif } else { // aspetto prima di riprovare... Thread.Sleep(200); } } /// /// Disconnessione /// public override void tryDisconnect() { connectionOk = false; queueInEnabCurr = false; try { #if false // in primis chiudo driver... if (driver != null) //if (driver != null && driver.WindowHandles.Count > 0) { driver.Quit(); } #endif } catch (Exception exc) { lgError(exc, "Eccezione in tryDisconnect"); } } #endregion Public Methods #region Internal Methods /// /// Pulizia preliminare folder comunicazione /// internal virtual void cleanupFolder() { } /// /// Ricarica conf adapter... /// internal virtual void reloadAdapterConf() { #if false // init obj display newDisplayData currDispData = new newDisplayData(); lgInfo("BEGIN reloadAdapterConf"); // inizializzo LUT decodifica string jsonConf = getOptPar("LUT_CONF"); if (!string.IsNullOrEmpty(jsonConf)) { string jsonFullPath = $"{Application.StartupPath}/DATA/CONF/{jsonConf}"; lgInfo($"Apertura file {jsonFullPath}"); StreamReader reader = new StreamReader(jsonFullPath); string jsonData = reader.ReadToEnd(); if (!string.IsNullOrEmpty(jsonData)) { try { monitoredItems = JsonConvert.DeserializeObject(jsonData); // salvo baseUri baseDir = monitoredItems.SrvData.baseUri; lgInfo($"baseUri = {baseDir}"); // imposto a zero la bitmap x riavvio! B_input = 0; // FORZO invio dati... accodaSigIN(ref currDispData); // loggo! lgInfo($"init input bitmap to zero: {B_input}"); } catch (Exception exc) { lgError(exc, "Eccezione in decodifica conf json"); } } reader.Dispose(); } lgInfo("DONE reloadAdapterConf"); raiseRefresh(currDispData); #endif } #endregion Internal Methods #region Protected Fields /// /// Cartella di base per interscambio /// protected string BaseDir = @"C:\Steamware"; /// /// Array di configurazione degli oggetti da cercare x decodifica e recupero info /// protected Dictionary dataLocatorLUT; /// /// Vettore della frequenza di ogni status trovato... invio ogni 100 rilevazioni (modulo /// 100, resto == 1) /// protected Dictionary freqUnknStatus = new Dictionary(); #endregion Protected Fields #region Private Methods /// /// Processo stati unknown... /// /// private void processUnknStatus(string cKey) { // cerco se avevo già una key nella dictionary... if (freqUnknStatus.ContainsKey(cKey)) { freqUnknStatus[cKey]++; // se è 1 ogni 100 (%100, resto ==1) --> loggo... if (freqUnknStatus[cKey] % 100 == 1) { lgInfo($"Errore in decodifica status: MAPPING non trovato per {cKey} | freq: {freqUnknStatus[cKey]}"); // accodo come invio di tipo FLOG... string sVal = string.Format("[UnknStatus] {0}, freq: {1}", cKey, freqUnknStatus); // chiamo accodamento... bool sent = accodaFLog("UnknStatus", sVal, qEncodeFLog("UnknStatus", sVal)); if (sent) { trackDynData("UnknStatus", sVal); } } } else { // creo chiave con freq = 1 freqUnknStatus.Add(cKey, 1); // log iniziale lgInfo($"Errore in decodifica status: MAPPING non trovato per {cKey}"); } } #endregion Private Methods } }