using Logic.ProductionToProductMapper.Cordonel; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.ComponentModel; using System.IO.Ports; using System.Linq; using System.Runtime.CompilerServices; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows; using LaaPackages.Features.Cordonel.Models; using Xylem.Common.CommonCore.Configuration; using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore; using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile; using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisStatus; using Xylem.Common.Hardware.WaterMeter.Genesis.Registers; using Xylem.Common.Hardware.WaterMeter.WaterMeterCore; using Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts; using Xylem.Common.Logic.ProductionOrderCore.OrderData; using Xylem.Common.Logic.SoftwareAccessHelper; using static Ui.ProductionControls.ctlPictureProgressBar; // ReSharper disable UnusedMember.Global this is used for unimplemented members namespace CordonelAssemblyLine.Model { internal class PickingViewModel : INotifyPropertyChanged { private String _stateMsg = "Warte auf Scanner"; private String _scannerMsg = "Keine Verbindung"; private String _slot = "-"; private String _result = "-"; private System.Windows.Media.Brush _resultColor; /// /// Color setting for result display in assembly process /// public System.Windows.Media.Brush ResultColor { get => _resultColor; set { _resultColor = value; NotifyPropertyChanged(); } } /// /// State text for logging and display as user interface /// public String State { get => _stateMsg; set { _stateMsg = value; NotifyPropertyChanged(); } } public String Scanner { get => _scannerMsg; set { _scannerMsg = value; NotifyPropertyChanged(); } } public void UpdateLogText(String text, Boolean forceGuiUpdate = true) { _logText = $"{text}{Environment.NewLine}{_logText}"; if (_logText.Length > 2503) { _logText = $"{_logText.Substring(0, 2500)}..."; } if (forceGuiUpdate) { LogText = _logText; } } private String _historyText = "-"; public String HistoryText { get => _historyText; set { _historyText = value; NotifyPropertyChanged(); } } private String _logText = "Start"; public String LogText { get => _logText; set { _logText = value; NotifyPropertyChanged(); } } public String Slot { get => _slot; set { _slot = value; NotifyPropertyChanged(); } } public String Result { get => _result; set { _result = value; NotifyPropertyChanged(); } } private String _pLblS01Text; public String lblS01Text { get => _pLblS01Text; set { _pLblS01Text = value; NotifyPropertyChanged(); } } private String _pLblS02Text; public String lblS02Text { get => _pLblS02Text; set { _pLblS02Text = value; NotifyPropertyChanged(); } } private String _pLblS03Text; public String lblS03Text { get => _pLblS03Text; set { _pLblS03Text = value; NotifyPropertyChanged(); } } private String _pLblS04Text; public String lblS04Text { get => _pLblS04Text; set { _pLblS04Text = value; NotifyPropertyChanged(); } } private String _pLblS05Text; public String lblS05Text { get => _pLblS05Text; set { _pLblS05Text = value; NotifyPropertyChanged(); } } private String _pLblS06Text; public String lblS06Text { get => _pLblS06Text; set { _pLblS06Text = value; NotifyPropertyChanged(); } } private String _pLblS07Text; public String lblS07Text { get => _pLblS07Text; set { _pLblS07Text = value; NotifyPropertyChanged(); } } private String _pLblS08Text; public String lblS08Text { get => _pLblS08Text; set { _pLblS08Text = value; NotifyPropertyChanged(); } } private String _pLblS09Text; public String lblS09Text { get => _pLblS09Text; set { _pLblS09Text = value; NotifyPropertyChanged(); } } private String _pLblS10Text; public String lblS10Text { get => _pLblS10Text; set { _pLblS10Text = value; NotifyPropertyChanged(); } } private String _pLblS11Text; public String lblS11Text { get => _pLblS11Text; set { _pLblS11Text = value; NotifyPropertyChanged(); } } private readonly System.Windows.Media.Brush _progressWaiting = (System.Windows.Media.Brush)new System.Windows.Media.BrushConverter().ConvertFromString("Aquamarine"); private readonly System.Windows.Media.Brush _progressCurrent = (System.Windows.Media.Brush)new System.Windows.Media.BrushConverter().ConvertFromString("yellow"); private readonly System.Windows.Media.Brush _progressDone = (System.Windows.Media.Brush)new System.Windows.Media.BrushConverter().ConvertFromString("green"); private readonly System.Windows.Media.Brush _progressError = (System.Windows.Media.Brush)new System.Windows.Media.BrushConverter().ConvertFromString("red"); private System.Windows.Media.Brush _lblS01Color; public System.Windows.Media.Brush lblS01Color { get => _lblS01Color; set { _lblS01Color = value; NotifyPropertyChanged(); } } private System.Windows.Media.Brush _lblS02Color; public System.Windows.Media.Brush lblS02Color { get => _lblS02Color; set { _lblS02Color = value; NotifyPropertyChanged(); } } private System.Windows.Media.Brush _lblS03Color; public System.Windows.Media.Brush lblS03Color { get => _lblS03Color; set { _lblS03Color = value; NotifyPropertyChanged(); } } private System.Windows.Media.Brush _lblS04Color; public System.Windows.Media.Brush lblS04Color { get => _lblS04Color; set { _lblS04Color = value; NotifyPropertyChanged(); } } private System.Windows.Media.Brush _lblS05Color; public System.Windows.Media.Brush lblS05Color { get => _lblS05Color; set { _lblS05Color = value; NotifyPropertyChanged(); } } private System.Windows.Media.Brush _lblS06Color; public System.Windows.Media.Brush lblS06Color { get => _lblS06Color; set { _lblS06Color = value; NotifyPropertyChanged(); } } private System.Windows.Media.Brush _lblS07Color; public System.Windows.Media.Brush lblS07Color { get => _lblS07Color; set { _lblS07Color = value; NotifyPropertyChanged(); } } private System.Windows.Media.Brush _lblS08Color; public System.Windows.Media.Brush lblS08Color { get => _lblS08Color; set { _lblS08Color = value; NotifyPropertyChanged(); } } private System.Windows.Media.Brush _lblS09Color; public System.Windows.Media.Brush lblS09Color { get => _lblS09Color; set { _lblS09Color = value; NotifyPropertyChanged(); } } private System.Windows.Media.Brush _lblS10Color; public System.Windows.Media.Brush lblS10Color { get => _lblS10Color; set { _lblS10Color = value; NotifyPropertyChanged(); } } private System.Windows.Media.Brush _lblS11Color; public System.Windows.Media.Brush lblS11Color { get => _lblS11Color; set { _lblS11Color = value; NotifyPropertyChanged(); } } public PickingViewModel() { lblS01Text = "-"; lblS02Text = "-"; lblS03Text = "-"; lblS04Text = "-"; lblS05Text = "-"; lblS06Text = "-"; lblS07Text = "-"; lblS08Text = "-"; lblS09Text = "-"; lblS10Text = "-"; lblS11Text = "-"; lblS01Color = _progressCurrent; lblS02Color = _progressWaiting; lblS03Color = _progressWaiting; lblS04Color = _progressWaiting; lblS05Color = _progressWaiting; lblS06Color = _progressWaiting; lblS07Color = _progressWaiting; lblS08Color = _progressWaiting; lblS09Color = _progressWaiting; lblS10Color = _progressWaiting; lblS11Color = _progressWaiting; InitProgressBar(); } private void InitProgressBar() { ProgressBar = new List { new ImageElement { Name = "Init", Image = Ui.ProductionControls.Enums.Img.Waiting }, new ImageElement { Name = "Scan", Image = Ui.ProductionControls.Enums.Img.BarcodeScanner }, new ImageElement { Name = "Connect", Image = Ui.ProductionControls.Enums.Img.Plugin }, new ImageElement { Name = "Order data", Image = Ui.ProductionControls.Enums.Img.Cloud }, new ImageElement { Name = "Compare", Image = Ui.ProductionControls.Enums.Img.Compare }, new ImageElement { Name = "Compare Result", Image = Ui.ProductionControls.Enums.Img.Default }, new ImageElement { Name = "Scan Build", Image = Ui.ProductionControls.Enums.Img.BarcodeScanner }, new ImageElement { Name = "Scan Build Pressure", Image = Ui.ProductionControls.Enums.Img.BarcodeScanner } }; } public List ProgressBar { get; internal set; } public event PropertyChangedEventHandler PropertyChanged; protected virtual void NotifyPropertyChanged([CallerMemberName] String propertyName = "") { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } private Task _s; /// /// Initial start of assembling /// /// /// /// public void StartPicking(CancellationToken cancel, String scannerPort, Int32 slotNr) { _scannerPort = scannerPort; _slotNr = slotNr; _closeTask = false; _s = new Task(() => { PickingLoop(cancel); }, cancel); _s.Start(); } /// /// States for assembly line, picking of single parts /// public enum PickingStateMachine { Init, WaitForScanning, ScanningDone, WaitForDetect, GetOrderDetails, Compare, MeterDone, MeterError, StartCom, WaitForBuildingMeterReady, WaitForBuildingPressureReady, LutUpdate, JustSapProgress, } private PickingStateMachine _state = PickingStateMachine.Init; private class BarScanner : IDisposable { private Boolean _isRunning; public String Input = ""; private readonly String _port; private CancellationToken _cancellation; private Task _waitForScannerTask; public BarScanner(String port, CancellationToken cancellation) { _port = port; _cancellation = cancellation; } public void Start() { if (!_isRunning) { if (_port == null) { return; } _waitForScannerTask = new Task(() => { using (var a = new SerialPort(_port)) { try { a.Open(); a.NewLine = "\r"; while (true) { if (_cancellation.IsCancellationRequested) { _isRunning = false; break; } Input = a.ReadLine(); a.Close(); _isRunning = false; break; } } catch (Exception ex) { Input = ex.Message; _isRunning = false; } } }, _cancellation); _waitForScannerTask.Start(); } } public void Dispose() { if (_waitForScannerTask.Status != TaskStatus.Faulted && _waitForScannerTask.Status != TaskStatus.RanToCompletion && _waitForScannerTask.Status != TaskStatus.Canceled) { _waitForScannerTask.Dispose(); } } } public void SetState(String state) { State = state; UpdateLogText($"Status:{State}"); } private Boolean _closeTask; public void Dispose() { while (!_s.IsCompleted) { _closeTask = true; } } public class PickingInfo { public string Error { get; set; } public string Warning { get; set; } public string Info { get; set; } } public Boolean Compare(Dictionary checkAppsIdVersion, UInt32 frequency, UInt32 meterSize, Boolean pressurePresent) { using (var batch = new MeterBatch()) { using (var meter = new GenesisMeter()) { meter.SetupFromConfigFile(_slotNr); batch.AddMeter(meter); SetState("Am Zähler anmelden"); if (meter.Login()) { meter.SetProcessState(DisplayCodes.PickingStarted); var ret = RunCheck(checkAppsIdVersion, frequency, meterSize, pressurePresent, meter); lblS08Color = _progressWaiting; var sbMSG = new StringBuilder(); if (ret) { if (!meter.WriteRegister("POWERMON_BatteryQuantity", 2, true, true)) { lblS08Text = "1"; lblS08Color = _progressError; ret = false; } meter.WriteRegister("POWERMON_StoreConfiguration", 1, true); var genesisStatus = new GenesisStatus(); var requirements = new CordonelRequirements(); if (GenesisStatusHandler.GetCordonelRequirementInfoFromDbByFANr(_order, requirements, out var error)) { genesisStatus.QuiescentCurrent_uA = requirements.QuiescentCurrent_uA; genesisStatus.EstimatedProductionBatteryLoadPercent = requirements.EstimatedProductionBatteryLoadPercent; if (GenesisStatusHandler.BuildLifeTimeInformation(meter, genesisStatus, out _)) { sbMSG.AppendLine($"Pcb = {meter.PcbId}"); sbMSG.AppendLine($"POWERMON_TotalUsedSeconds = {genesisStatus.ExceededLifeTime_s}"); sbMSG.AppendLine($"POWERMON_TotalUsedCharge = {genesisStatus.DrainedBatteryLoad_uAs}"); sbMSG.AppendLine($"POWERMON_BatteryQuantity = {genesisStatus.BatteryQuantity}"); sbMSG.AppendLine($"POWERMON_BatteryMilliAHrRating = {genesisStatus.InitialBatteryLoad_mAh}"); sbMSG.AppendLine(""); sbMSG.AppendLine($"Remaining life time in years {genesisStatus.RemainingLifeTimeYears:F2}"); sbMSG.AppendLine($"Totally drained battery load in % {genesisStatus.DrainedBatteryLoadPercent:F2}"); //restlaufzeit monate -RequiredLifeTimeYearsAssembly // var hasFehlern = false; // restlaufzeit monate - RequiredLifeTimeYearsAssembly if (genesisStatus.RemainingLifeTimeYears < requirements.RequiredLifeTimeYearsAssembly) { lblS08Text = $"{nameof(genesisStatus.RemainingLifeTimeYears)}: " + $"{genesisStatus.RemainingLifeTimeYears} < " + $"{requirements.RequiredLifeTimeYearsAssembly}"; lblS08Color = _progressError; ret = false; sbMSG.AppendLine($"{nameof(genesisStatus.RemainingLifeTimeYears)}: " + $"{genesisStatus.RemainingLifeTimeYears} < " + $"{requirements.RequiredLifeTimeYearsAssembly}"); } else sbMSG.AppendLine($"Restlaufzeit i.O."); //0,5% if (genesisStatus.AlternativeRequiredBatteryLoadPercent != null && genesisStatus.AlternativeRequiredBatteryLoadPercent > requirements.MaxDrainedBatteryLoadPercentAssembly) { sbMSG.AppendLine($"{nameof(genesisStatus.AlternativeRequiredBatteryLoadPercent)}: " + $"{genesisStatus.AlternativeRequiredBatteryLoadPercent} > " + $"{requirements.MaxDrainedBatteryLoadPercentAssembly}"); ret = false; } //else sbMSG.AppendLine($"Alternative Batterieverbrauch Montage i.O."); // max bat verbrauch - MaxDrainedBatteryLoadPercentAssembly if (genesisStatus.DrainedBatteryLoadPercent > requirements.MaxDrainedBatteryLoadPercentAssembly) { lblS08Text = $"{nameof(genesisStatus.DrainedBatteryLoadPercent)}: " + $"{genesisStatus.DrainedBatteryLoadPercent} > " + $"{requirements.MaxDrainedBatteryLoadPercentAssembly}"; lblS08Color = _progressError; ret = false; sbMSG.AppendLine($"{nameof(genesisStatus.DrainedBatteryLoadPercent)}: " + $"{genesisStatus.DrainedBatteryLoadPercent} > " + $"{requirements.MaxDrainedBatteryLoadPercentAssembly}"); } else sbMSG.AppendLine($"Maximaler Batterieverbrauch Montage i.O."); // lagerzeit - MaxStorageMonths if (genesisStatus.StorageMonths > requirements.MaxStorageMonths) { lblS08Text = $"{nameof(genesisStatus.StorageMonths)}: " + $"{genesisStatus.StorageMonths} > " + $"{requirements.MaxStorageMonths}"; lblS08Color = _progressError; ret = false; sbMSG.AppendLine($"{nameof(genesisStatus.StorageMonths)}: " + $"{genesisStatus.StorageMonths} > " + $"{requirements.MaxStorageMonths}"); } else sbMSG.AppendLine($"Maximallagerzeit i.O."); meter.WriteLog(sbMSG.ToString()); } else { meter.WriteLog("Batterie nicht lesbar"); lblS08Text = "Batterie nicht lesbar"; lblS08Color = _progressError; ret = false; } } else { if (string.IsNullOrWhiteSpace(error)) error = "Fehler beim laden von Cordonel Freigaben"; meter.WriteLog(error); lblS08Text = error; lblS08Color = _progressError; ret = false; } // this calculates all life time values } if (!ret) sbMSG.AppendLine($"Battery lifetime limits sind Übreschritten"); else sbMSG.AppendLine($"Battery lifetime limits sind OK"); if (_skipProcessSteps == null || !_skipProcessSteps.SkipLUT) { if (ret) { lblS08Text = "2"; lblS08Color = _progressDone; lblS10Color = _progressCurrent; StringBuilder sbUrl = new StringBuilder(); sbUrl.Append(ServiceUrls.GetLutUrl()); sbUrl.Append($"?Metersize={_orderDetails.MeterSize}"); sbUrl.Append("&ForProd=true"); //?Metersize=2&Region=EMEA& if (_orderDetails.FrequencyIndicator != 0) { //get ema sbUrl.Append("&Region=EMEA"); } else { //get na sbUrl.Append("&Region=NA"); } try { var retLut = LocalWebRequest.GetRequest(sbUrl.ToString(), 80000); var a = JsonConvert.DeserializeObject>(retLut); if (a.Count == 1) { SetState($"Vergleich abgeschlossen:{State}"); var lut = a.First(); lblS10Text = $"Update {lut.FileCrc:0x8}"; var meterLutUpdate = new MeterLutUpdate(meter); var loadResult = meterLutUpdate.LoadLutFromStream(lut.FileName, lut.FileContent.ToList()); var updateResult = meterLutUpdate.UpdateMeterLut(); if (loadResult && updateResult) { lblS10Text = $"{lut.FileName} in meter"; lblS10Color = _progressDone; } else { Result = "Fehler beim Update"; SetState(Result); lblS10Text = Result; lblS10Color = _progressError; ret = false; } } else { Result = "Keine eindeutige LUT gefunden"; SetState(Result); lblS10Color = _progressError; lblS10Text = Result; ret = false; } } catch (Exception) { Result = "Fehler beim LUT Update"; SetState(Result); lblS10Color = _progressError; lblS10Text = Result; return false; } } } else { SetState($"LUT wird nicht überprüft Sonderfreigabe#{_skipProcessSteps.Id} von {_skipProcessSteps.Name}"); } if (ret) { if (!meter.IsLoggedOn) { meter.ReLogin(); } meter.SetProcessState(DisplayCodes.PickingTested); var url = $"{ServiceUrls.MeterProcessStateUrl()}SetPickingState?PcbID={meter.PcbId}&FertigungsauftragsNr={_order}&successful=1"; var retString = LocalWebRequest.PostRequestAsyncAndGetContent(url); if (bool.TryParse(retString, out var result)) { return result; } } else { meter.SetProcessState(DisplayCodes.PickingFailed); } } } } return false; } private Boolean RunCheck(Dictionary checkAppsIdVersion, UInt32 frequency, UInt32 meterSize, Boolean pressurePresent, GenesisMeter meter) { lblS04Color = _progressWaiting; SetState("Überprüfe Parameter"); if (frequency == 0) { lblS04Text = "NA"; } else { var frequencyReadOut = RegisterConverter.ByteArrayToValue(meter.ReadRegister("SENSUSRADIO_FrequencyIndicator")); if (frequencyReadOut != frequency) { SetState($"Falsche Frequenz! Soll {frequency} MHz - Ist {frequencyReadOut} MHz"); meter.WriteLog(State); lblS04Color = _progressError; return false; } lblS04Text = "EMEA \\" + frequency; lblS04Color = _progressDone; lblS05Color = _progressWaiting; } //TODO: metersize check for bigger dn sizes!!! var meterSizeReadOut = RegisterConverter.ByteArrayToValue(meter.ReadRegister("GENESISFLOW_MeterSize")); if (meterSizeReadOut != meterSize) { // setState($"Meter Dn falsch! soll {MeterSize}DN ist {MeterSizeReadOut}DN"); // meter.WriteLog(State); // return false; } //meter.WriteRegister("METROLOGYASST_PressurePresent", 1,true); var pressureReadOut = RegisterConverter.ByteArrayToValue(meter.ReadRegister("METROLOGYASST_PressurePresent")); if (pressureReadOut == pressurePresent) { if (!pressurePresent) { lblS05Text = "Kein Drucksensor"; } else { lblS05Text = "Drucksensor vorhanden"; } lblS05Color = _progressDone; lblS06Color = _progressCurrent; } else { if (!pressurePresent) { SetState("Pcb mit Drucksensor. Laut Auftrag keiner verbaut"); lblS05Text = "Drucksensor vorhanden!"; meter.WriteLog(State); } else { SetState("Pcb ohne Drucksensor. Laut Auftrag soll einer verbaut werden"); lblS05Text = "Ohne Drucksensor!"; meter.WriteLog(State); } lblS05Color = _progressError; return false; } if (_skipProcessSteps == null || !_skipProcessSteps.SkipFWCheck) { if (!meter.InstalledFwVersion.HasValue || !checkAppsIdVersion.Any()) { SetState("Fehler beim auslesen der FW"); meter.WriteLog(State); lblS06Text = State; lblS06Color = _progressError; return false; } if (meter.InstalledFwVersion.Value != checkAppsIdVersion.FirstOrDefault().Value) { SetState($"Falsche FW, bitte Updaten! FW sollte {checkAppsIdVersion.FirstOrDefault().Value} haben, hat aber {meter.InstalledFwVersion.Value}"); meter.WriteLog(State); lblS06Color = _progressError; return false; } } else { SetState($"Produktionsdatum wird nicht überprüft Sonderfreigabe Nr.:{_skipProcessSteps.Id} von {_skipProcessSteps.Name}"); } lblS06Color = _progressDone; lblS07Color = _progressCurrent; try { meter.WriteRegister("METROLOGYASST_StoreConfiguration", 1); Thread.Sleep(2500); meter.Logout(); Thread.Sleep(2500); meter.ReLogin(); var storeRet = meter.ReadRegister("METROLOGYASST_StoreConfiguration"); if (!storeRet.All(a => a.Equals(0))) { lblS07Text = "Filesystem corrupt"; SetState("Filesystem corrupt"); meter.WriteLog(State); lblS07Color = _progressError; return false; } } catch (Exception) { SetState("Fehler beim überprüfen des Filesystems"); meter.WriteLog(State); lblS07Color = _progressError; lblS07Text = State; return false; } lblS07Color = _progressDone; lblS07Text = "Filesystem i.O"; return true; } private PickingCompareItem _orderDetails; private OrderOverViewCordonelWithPicking _orderOverview; private BarScanner _barScanner; private String _order; private String _pcbId; private SkipProcess _skipProcessSteps; private String _scannerPort = "COM20"; private Int32 _slotNr = 1; //PickingState,PickingScanner,PickingSlot,PickingResult private void PickingLoop(CancellationToken token) { var converter = new System.Windows.Media.BrushConverter(); while (!token.IsCancellationRequested && !_closeTask) { try { switch (_state) { case PickingStateMachine.Init: SetState("Initialisierung"); Slot = $"Inaktiv EP {_slotNr}"; Scanner = $"Geschlossen {_scannerPort}"; //CheckAllPorts? _state = PickingStateMachine.StartCom; InitProgressBar(); break; case PickingStateMachine.StartCom: _orderDetails = null; _orderOverview = null; Scanner = $"Öfffne {_scannerPort}"; //CheckAllPorts? _barScanner = new BarScanner(_scannerPort, token); _barScanner.Start(); _state = PickingStateMachine.WaitForScanning; var c = (System.Windows.Media.Brush)converter.ConvertFromString("Aquamarine"); c.Freeze(); ResultColor = c; lblS01Text = "-"; lblS02Text = "-"; lblS03Text = "-"; lblS04Text = "-"; lblS05Text = "-"; lblS06Text = "-"; lblS07Text = "-"; lblS08Text = "-"; lblS09Text = "-"; lblS10Text = "-"; lblS11Text = "-"; lblS01Color = _progressWaiting; lblS02Color = _progressWaiting; lblS03Color = _progressWaiting; lblS04Color = _progressWaiting; lblS05Color = _progressWaiting; lblS06Color = _progressWaiting; lblS07Color = _progressWaiting; lblS08Color = _progressWaiting; lblS09Color = _progressWaiting; lblS10Color = _progressWaiting; lblS11Color = _progressWaiting; break; case PickingStateMachine.WaitForScanning: Scanner = $"Offen {_scannerPort}"; if (State != $"Warte auf Scannereingabe({_scannerPort})") { SetState($"Warte auf Scannereingabe({_scannerPort})"); } // _barScanner.Input = "3243258"; if (_barScanner != null && !string.IsNullOrEmpty(_barScanner.Input)) { if (_barScanner.Input == "%Cordonel_SAP_100%" || _barScanner.Input == "%Cordonel_SAP_101%") { _state = PickingStateMachine.JustSapProgress; } else { if (int.TryParse(_barScanner.Input, out _)) { _order = _barScanner.Input; Scanner = $"Geschlossen {_scannerPort}"; _barScanner = null; _state = PickingStateMachine.WaitForDetect; lblS01Text = _order; lblS01Color = _progressDone; lblS02Color = _progressWaiting; } } } break; case PickingStateMachine.JustSapProgress: using (var batch = new MeterBatch()) { using (var tryMeter = new GenesisMeter()) { try { SetState("Warte auf Pcb"); Slot = $"Öffne EP {_slotNr}"; tryMeter.SetupFromConfigFile(_slotNr); batch.AddMeter(tryMeter); tryMeter.Logout(); Log("Try to get PcbID"); // _pcbId = "250310014"; _pcbId = tryMeter.GetPcbId(); var hasDetect = !string.IsNullOrEmpty(_pcbId); if (hasDetect) { SetState($"Pcb gefunden {_pcbId}"); Log($"New PcbID detected {_pcbId}"); //barScanner.Input = "%Cordonel_SAP_100%"; _state = PickingStateMachine.WaitForBuildingMeterReady; } else { Slot = $"Keine Konnektivität EP {_slotNr}"; lblS02Text = Slot; Log($"No Meter found"); } } catch (Exception e) { Log($"Error occur.{Environment.NewLine} {e.Message}"); } } } break; case PickingStateMachine.WaitForDetect: using (var batch = new MeterBatch()) { using (var tryMeter = new GenesisMeter()) { try { SetState("Warte auf Pcb"); Slot = $"Öffne EP {_slotNr}"; tryMeter.SetupFromConfigFile(_slotNr); batch.AddMeter(tryMeter); tryMeter.Logout(); Log("Try to get PcbID"); // _pcbId = "250639533"; // // _pcbId = "221520009"; _pcbId = tryMeter.GetPcbId(); var hasDetect = !string.IsNullOrEmpty(_pcbId); if (hasDetect) { SetState($"Pcb gefunden {_pcbId}"); Log($"New PcbID detected {_pcbId}"); var retWanring = LocalWebRequest.GetRequest(ServiceUrls.PickingURL_GetPcbInfoPicking + _pcbId, 4000); var PickingINfo = JsonConvert.DeserializeObject(retWanring); if (!String.IsNullOrEmpty(PickingINfo.Error)) { lblS08Text = PickingINfo.Error; lblS08Color = _progressError; MessageBox.Show(PickingINfo.Error); _state = PickingStateMachine.MeterError; } if (!String.IsNullOrEmpty(PickingINfo.Warning)) { SetState(PickingINfo.Warning); } try { for (var i = 0; i < 3; i++) { if (tryMeter.Login()) { var frequencyBytes = tryMeter.ReadRegister("SENSUSRADIO_FrequencyIndicator"); var frequencyValue = RegisterConverter.ByteArrayToValue(frequencyBytes); if (frequencyValue != 0) { var rebootBytes = tryMeter.ReadRegister("CUSTOMER_RebootCount"); var rebootsCount = RegisterConverter.ByteArrayToValue(rebootBytes); if (rebootsCount > 0) { var messageBoxResult = MessageBox.Show( $"{_pcbId} hat {rebootsCount}-mal neu gestartet!" + $"{Environment.NewLine}" + $"{Environment.NewLine}Möchten Sie fortfahren?" , $"PcbId: {_pcbId}" , MessageBoxButton.YesNo , MessageBoxImage.Error , MessageBoxResult.Yes , MessageBoxOptions.ServiceNotification); if (messageBoxResult == MessageBoxResult.No) { Log($"{_pcbId} hat {rebootsCount} mal neuegestarted!"); } } } break; } } lblS02Text = _pcbId; if (_state != PickingStateMachine.MeterError) { lblS02Color = _progressDone; lblS03Color = _progressWaiting; _state = PickingStateMachine.GetOrderDetails; } else { lblS02Color = _progressError; lblS03Color = _progressError; _state = PickingStateMachine.MeterError; } } catch (Exception e) { Log(e.Message); _state = PickingStateMachine.MeterError; } } else { Slot = $"Keine Konnektivität EP {_slotNr}"; lblS02Text = Slot; Log($"No Meter found"); } } catch (Exception e) { Log($"Error occur.{Environment.NewLine} {e.Message}"); } } } break; case PickingStateMachine.GetOrderDetails: SetState($"Lade Auftragsdaten {_order}"); var str = LocalWebRequest.GetRequestWithError($"{ServiceUrls.GenesisFinalCheckServiceUrl()}" + $"GetOrderOverview?ProductionOrderNumber={_order}" + // 3238370 $"&CheckPcbId={_pcbId}", out var retCode, 50000); // 251019003 Log($"GetOrderOverview {retCode}"); if (str.Contains("The request is invalid")) { Result = "Auftrag nicht gefunden"; lblS03Text = Result; lblS03Color = _progressError; _state = PickingStateMachine.MeterError; break; } if (retCode == 417) { _state = PickingStateMachine.MeterError; Result = "Keine Funkparameter"; lblS03Text = Result; UpdateLogText(Result); lblS03Color = _progressError; } else { _orderOverview = JsonConvert.DeserializeObject(str); _orderDetails = _orderOverview.PickingCompareItem; if (_orderOverview.OrderOverViewCordonel.Count == _orderOverview.OrderOverViewCordonel.AssignedPicking) { Result = "Auftrag schon komplett"; lblS03Text = Result; lblS03Color = _progressError; UpdateLogText(Result); _state = PickingStateMachine.MeterError; } else { SetState($"Auftragsdaten geladen {_order}"); var url = ServiceUrls.MeterProcessStateUrl(); url += $"GetCordonelSkipProcessStates?OrderNumber={_order}&PcbId={_pcbId}"; var retStr = LocalWebRequest.GetRequestWithError(url, out var tmp, 10000); _skipProcessSteps = new SkipProcess(); if (tmp == 200) { _skipProcessSteps = JsonConvert.DeserializeObject(retStr); } else { MessageBox.Show($"Auftragsdaten geladen {_order} Fehler ({tmp})"); } _state = PickingStateMachine.Compare; lblS03Text = $"Nr {_orderOverview.OrderOverViewCordonel.AssignedPicking + 1} von {_orderOverview.OrderOverViewCordonel.Count}"; lblS03Color = _progressDone; lblS04Color = _progressCurrent; } } break; case PickingStateMachine.Compare: //Compare SetState($"Vergleiche Auftragsdaten {_order} mit Pcb Eigenschaften"); var minDate = DateTime.Now; lblS09Color = _progressCurrent; ////Rule from J.Schulz, 9 months for customers with immediately usage here temporary decided on order volume ////minDate = minDate.AddMonths(_orderOverview.OrderOverViewCordonel.Count < 5 ? -9 : -3); //// The production date has to be at least within the last 3 months from now backwards //minDate = minDate.AddMonths(-3); //SetState($"Register wurde am {_orderOverview.KitronProductionDate } hergestellt, für diesen Auftrag " + // $"muss das Register nach dem {minDate} hergestellt worden sein"); //lblS09Text = $"{_orderOverview.KitronProductionDate}"; ////TODO may be useful to introduce SkipRegisterOldness instead of SkipBatteyCheck will be used for oldness of register //if (_skipProcessSteps == null || !_skipProcessSteps.SkipBatteyCheck) //{ // if (_orderOverview.KitronProductionDate <= minDate) // { // SetState($"Fehlgeschlagen Register ist zu alt! Bitte QS informieren. Kitron-Produktionsdatum: {_orderOverview.KitronProductionDate }"); // _state = PickingStateMachine.MeterError; // lblS09Color = _progressError; // var b = (System.Windows.Media.Brush)converter.ConvertFromString("#FFFF00"); // b.Freeze(); // ResultColor = b; // break; // } //} //else //{ // SetState($"Produktionsdatum wird nicht überprüft Sonderfreigabe Nr.:{_skipProcessSteps.Id} von {_skipProcessSteps.Name}"); //} lblS09Color = _progressDone; if (Compare(_orderDetails.CheckAppsIdVersion, _orderDetails.FrequencyIndicator, _orderDetails.MeterSize, _orderDetails.PressurePresent)) { _state = PickingStateMachine.MeterDone; } else { _state = PickingStateMachine.MeterError; var b = (System.Windows.Media.Brush)converter.ConvertFromString("#FF8000"); b.Freeze(); ResultColor = b; } break; case PickingStateMachine.MeterError: _orderDetails = null; _orderOverview = null; SetState($"Vergleich abgeschlossen:{State}"); Result = "Vergleich fehlgeschlagen"; Thread.Sleep(10000); _state = PickingStateMachine.StartCom; break; case PickingStateMachine.MeterDone: SetState("Vergleich abgeschlossen, warte auf manuelle Montagerückmeldung"); Result = $"Pcb {_pcbId} wurde dem Auftrag {_order} hinzugefügt"; Scanner = $"Öffne {_scannerPort}"; _barScanner = new BarScanner(_scannerPort, token); HistoryText = $"{HistoryText} {Environment.NewLine}{_order}({_orderOverview.OrderOverViewCordonel.AssignedPicking + 1}/{_orderOverview.OrderOverViewCordonel.Count})"; _barScanner.Start(); _state = PickingStateMachine.WaitForBuildingMeterReady; Thread.Sleep(10000); //CheckAllPorts? ProgressBar.First(n => n.Name == "Scan Build").State = Ui.ProductionControls.Enums.ImgStatus.InProgress; break; case PickingStateMachine.WaitForBuildingMeterReady: if (_barScanner != null && !string.IsNullOrEmpty(_barScanner.Input)) { if (_barScanner.Input == "%Cordonel_SAP_100%") { _barScanner = null; ProgressBar.First(n => n.Name == "Scan Build").State = Ui.ProductionControls.Enums.ImgStatus.Success; var url = ServiceUrls.MeterProcessStateUrl(); url += $"setSapState?PcbID={_pcbId}&code=100&version=1"; try { LocalWebRequest.PostRequestAsync(url); } catch (Exception) { // ignored } if (_orderDetails != null && _orderDetails.PressurePresent) { _barScanner = new BarScanner(_scannerPort, token); _barScanner.Start(); SetState("Montage Rückmeldung erhalten, Montage des Drucksensors bestätigen"); _state = PickingStateMachine.WaitForBuildingPressureReady; ProgressBar.First(n => n.Name == "Scan Build Pressure").State = Ui.ProductionControls.Enums.ImgStatus.InProgress; } else { SetState("Montage Rückmeldung erhalten, Auftrag Scannen"); _state = PickingStateMachine.StartCom; Thread.Sleep(5000); var b = (System.Windows.Media.Brush)converter.ConvertFromString("#419C14"); b.Freeze(); ResultColor = b; } } } break; case PickingStateMachine.WaitForBuildingPressureReady: if (_barScanner != null && !string.IsNullOrEmpty(_barScanner.Input)) { if (_barScanner.Input == "%Cordonel_SAP_101%") { _barScanner = null; var url = ServiceUrls.MeterProcessStateUrl(); url += $"setSapState?PcbID={_pcbId}&code=101&version=1"; try { LocalWebRequest.PostRequestAsync(url); } catch (Exception) { // ignored } var b = (System.Windows.Media.Brush)converter.ConvertFromString("#419C14"); b.Freeze(); ResultColor = b; Thread.Sleep(5000); SetState("Montage Rückmeldung erhalten, Auftrag Scannen"); _state = PickingStateMachine.StartCom; } } break; } Thread.Sleep(1000); } catch (Exception ex) { Log(ex.Message); } } } // ReSharper disable once UnusedParameter.Local private void Log(String v) { } } }