From dee8e930ea0a6fa841d5ff9a5272aa0a1008249b Mon Sep 17 00:00:00 2001 From: Livio Merola Date: Fri, 24 Jul 2026 09:11:00 +0200 Subject: [PATCH] Initial LMEMoxaTransfer application --- .gitignore | 10 + README.md | 104 ++ .../Assets/app-icon.ico | Bin 0 -> 9868 bytes .../Assets/app-icon.png | Bin 0 -> 9846 bytes .../Form1.Designer.vb | 31 + TrasferimentoProgrammiOkuma.App/Form1.resx | 120 ++ TrasferimentoProgrammiOkuma.App/Form1.vb | 1220 +++++++++++++++++ TrasferimentoProgrammiOkuma.App/Program.vb | 14 + .../PublishProfiles/GiteaClickOnce.pubxml | 26 + TrasferimentoProgrammiOkuma.App/SplashForm.vb | 72 + .../TrasferimentoProgrammiOkuma.App.vbproj | 44 + .../moxa-okuma-settings.json | 129 ++ TrasferimentoProgrammiOkuma.sln | 34 + clickonce/Assets/app-icon.ico | Bin 0 -> 9868 bytes clickonce/Assets/app-icon.png | Bin 0 -> 9846 bytes clickonce/LMEMoxaTransfer.application | 28 + clickonce/LMEMoxaTransfer.deps.json | 23 + clickonce/LMEMoxaTransfer.dll | Bin 0 -> 70656 bytes clickonce/LMEMoxaTransfer.dll.manifest | 93 ++ clickonce/LMEMoxaTransfer.exe | Bin 0 -> 161280 bytes clickonce/LMEMoxaTransfer.pdb | Bin 0 -> 23004 bytes clickonce/LMEMoxaTransfer.runtimeconfig.json | 20 + clickonce/Launcher.exe | Bin 0 -> 16384 bytes clickonce/moxa-okuma-settings.json | 129 ++ tools/Compare-CncFiles.ps1 | 120 ++ 25 files changed, 2217 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 TrasferimentoProgrammiOkuma.App/Assets/app-icon.ico create mode 100644 TrasferimentoProgrammiOkuma.App/Assets/app-icon.png create mode 100644 TrasferimentoProgrammiOkuma.App/Form1.Designer.vb create mode 100644 TrasferimentoProgrammiOkuma.App/Form1.resx create mode 100644 TrasferimentoProgrammiOkuma.App/Form1.vb create mode 100644 TrasferimentoProgrammiOkuma.App/Program.vb create mode 100644 TrasferimentoProgrammiOkuma.App/Properties/PublishProfiles/GiteaClickOnce.pubxml create mode 100644 TrasferimentoProgrammiOkuma.App/SplashForm.vb create mode 100644 TrasferimentoProgrammiOkuma.App/TrasferimentoProgrammiOkuma.App.vbproj create mode 100644 TrasferimentoProgrammiOkuma.App/moxa-okuma-settings.json create mode 100644 TrasferimentoProgrammiOkuma.sln create mode 100644 clickonce/Assets/app-icon.ico create mode 100644 clickonce/Assets/app-icon.png create mode 100644 clickonce/LMEMoxaTransfer.application create mode 100644 clickonce/LMEMoxaTransfer.deps.json create mode 100644 clickonce/LMEMoxaTransfer.dll create mode 100644 clickonce/LMEMoxaTransfer.dll.manifest create mode 100644 clickonce/LMEMoxaTransfer.exe create mode 100644 clickonce/LMEMoxaTransfer.pdb create mode 100644 clickonce/LMEMoxaTransfer.runtimeconfig.json create mode 100644 clickonce/Launcher.exe create mode 100644 clickonce/moxa-okuma-settings.json create mode 100644 tools/Compare-CncFiles.ps1 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c37fc44 --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +bin/ +obj/ +.vs/ +build-check/ +build-check-latest/ +*.user +*.suo +*.userosscache +*.sln.docstates +RicezioniTemp/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..a718ef7 --- /dev/null +++ b/README.md @@ -0,0 +1,104 @@ +# LMEMoxaTransfer + +Solution VB.NET WinForms per inviare e ricevere programmi CNC tra PC e macchinario Okuma tramite dispositivo Moxa in modalita TCP Server. + +Prima della riorganizzazione e' stata creata una copia completa in: + +`C:\Users\livio\Documents\TrasferimentoProgrammiOkuma_backup_20260724_azienda_macchine` + +## Configurazione vista nella schermata Moxa + +- Operating mode: `TCP Server Mode` +- Local TCP port: `10001` +- Packing length: `0` +- Delimiter 1/2: `0 (Disable)` +- Force transmit: `0` +- Serial baud rate: `4800` +- Data bits: `7` +- Stop bits: `1` +- Parity: `Even` +- FIFO: `Disable` +- Flow ctrl: `None` +- Interface: `RS-232` + +Con questa configurazione il PC si collega come client TCP all'indirizzo IP del Moxa sulla porta `10001`. + +## Configurazione aziende e macchine + +All'avvio l'app legge `moxa-okuma-settings.json` dalla cartella dell'eseguibile. Il file contiene: + +- elenco aziende e macchine Okuma con IP Moxa; +- impostazioni predefinite di invio/ricezione; +- hash e salt della password amministratore. + +Le macchine SECUREX mantengono il numero originale dell'immagine, quindi sono `M4`, `M5`, `M8`, `M11`, `M12`. + +La password iniziale e' `moxa`. Se nel JSON si svuotano `AdminPasswordHash` e `AdminPasswordSalt`, al primo sblocco l'app chiede di impostare una nuova password senza richiedere la vecchia. + +## Uso + +1. Aprire `TrasferimentoProgrammiOkuma.sln` con Visual Studio. +2. Avviare il progetto `TrasferimentoProgrammiOkuma.App`. +3. Selezionare azienda e macchina dalle due tendine. +4. Per ricevere da Okuma: + - scegliere la cartella di destinazione sul PC; + - premere `Ricevi da Okuma`; + - dal controllo Okuma avviare l'uscita/invio programma. + - la ricezione viene salvata prima in una cartella temporanea dell'app; + - se nel file ricevuto e' presente un nome preceduto da `$`, l'app lo propone come nome finale nella cartella scelta; il nome e' modificabile prima del salvataggio definitivo. +5. Per inviare a Okuma: + - mettere il controllo Okuma in ricezione; + - scegliere il file programma dal PC; + - premere `Invia a Okuma`. + +I controlli di configurazione sono bloccati di default. Rimangono disponibili i bottoni operativi e le caselle dei file. Usare `Sblocca controlli` per modificarli. + +## Stato Moxa + +La scheda `Stato Moxa` mostra tutte le macchine Okuma divise per azienda. Il pallino verde indica che l'IP Moxa risponde sulla porta TCP configurata, il rosso indica che non e' raggiungibile, il grigio indica che non e' ancora stato controllato. + +Il pulsante `Aggiorna` e' sempre disponibile. Il controllo automatico usa l'intervallo `Intervallo s`, modificabile solo dopo lo sblocco con password. + +## Menu e informazioni + +I comandi generali sono nel menu `Strumenti`; la voce `? > Informazioni su` mostra azienda `Compomac SPA`, autore `Livio Merola` e versione dell'app. + +All'avvio viene mostrato uno splash screen con l'icona dell'app. + +## ClickOnce + +Profilo di pubblicazione: + +```powershell +& "C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exe" .\TrasferimentoProgrammiOkuma.App\TrasferimentoProgrammiOkuma.App.vbproj /target:Publish /p:Configuration=Release /p:PublishProfile=GiteaClickOnce /p:PublishDir=..\clickonce\ +``` + +La cartella `clickonce` contiene `LMEMoxaTransfer.application` e i file necessari. L'URL di aggiornamento configurato e': + +`https://gitea.lmcloud.it/livio/LMEMoxaTransfer/raw/branch/main/clickonce/LMEMoxaTransfer.application` + +## Note pratiche + +- Se la ricezione termina troppo presto, aumentare `Fine ricez. s`. +- Se la ricezione non finisce mai, ridurre `Fine ricez. s`. +- Se Okuma richiede un fine programma esplicito, provare `Terminatore invio` con `%` oppure `% + CRLF`. +- Per la procedura Okuma READ da `CN0:`, attivare `Invio a blocchi`, lasciare `Dim. blocco byte` a `32` e `Pausa blocco ms` a `100` come punto di partenza, avviare prima READ sulla macchina, attendere che sia in ricezione, poi premere `Invia a Okuma`. Questa modalita aggiunge automaticamente `% + CRLF` e mantiene il socket aperto almeno 1 secondo dopo l'invio. Se appare ancora `5239`, provare `16` byte con `250` ms, poi `8` byte con `300` ms. +- Il trasferimento e' byte-per-byte: il programma non modifica il contenuto del file selezionato, salvo il terminatore opzionale in invio. +- Se l'invio verso Okuma genera `5238 RS232C device not ready ERROR FF`, controllare prima il lato seriale Okuma-Moxa: baud rate, data bit, parita, stop bit, flow control e segnali DSR/CTS/DTR/RTS. L'app TCP puo collegarsi al Moxa, ma non puo forzare la porta RS232C della macchina a diventare pronta. +- Per controlli Okuma che non accettano un flusso troppo rapido, lasciare attivo `Invio riga per riga`, provare `Pausa riga ms` tra `200` e `500`, attivare `Invio carattere per carattere`, provare `Pausa carattere ms` tra `10` e `30`, e tenere `Attesa dopo invio s` almeno a `2`. +- Dalla schermata Moxa attuale il flow control e' `None`. Se sul parametro Okuma e' impostato `DC CODE`, provare `XON/XOFF` sul Moxa. Se invece Okuma usa handshake hardware, provare `RTS/CTS` e controllare il cablaggio dei segnali ready. +- Se l'errore corretto e' `5239 memoria lettura per canale RS232C troppo piena`, il flusso in ingresso e' troppo rapido per il buffer Okuma. Ridurre la velocita applicativa con `Invio carattere per carattere`, aumentare le pause, oppure far funzionare correttamente il flow control `XON/XOFF` o hardware. +- Se `5239` appare subito appena si preme invio, usare `Test connessione`: apre TCP verso il Moxa senza inviare dati. Se l'allarme non compare, il problema nasce al primo byte seriale. Se compare comunque, riavviare il Moxa con `Save/Restart`, azzerare l'allarme Okuma e controllare stato/cablaggio RS232. +- Dopo modifiche Moxa premere sempre `Submit` e poi `Save/Restart`; in caso di prove fallite, spegnere/riaccendere o riavviare il Moxa per svuotare eventuali dati rimasti nel buffer. + +## Build da terminale + +```powershell +dotnet build .\TrasferimentoProgrammiOkuma.sln +``` + +## Avvio da terminale + +```powershell +dotnet run --project .\TrasferimentoProgrammiOkuma.App\TrasferimentoProgrammiOkuma.App.vbproj +``` diff --git a/TrasferimentoProgrammiOkuma.App/Assets/app-icon.ico b/TrasferimentoProgrammiOkuma.App/Assets/app-icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..82808fb598907d5aee4194fd57e05d17a3369073 GIT binary patch literal 9868 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 MHE(K^U&BQH4{M37C;$Ke literal 0 HcmV?d00001 diff --git a/TrasferimentoProgrammiOkuma.App/Assets/app-icon.png b/TrasferimentoProgrammiOkuma.App/Assets/app-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2d249d7b67f0fd5cd8f80f4dd0e7e4d86fe94a0b GIT binary patch literal 9846 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 +Partial Class Form1 + Inherits System.Windows.Forms.Form + + 'Form overrides dispose to clean up the component list. + + Protected Overrides Sub Dispose(disposing As Boolean) + Try + If disposing AndAlso components IsNot Nothing Then + components.Dispose() + End If + Finally + MyBase.Dispose(disposing) + End Try + End Sub + + 'Required by the Windows Form Designer + Private components As System.ComponentModel.IContainer + + 'NOTE: The following procedure is required by the Windows Form Designer + 'It can be modified using the Windows Form Designer. + 'Do not modify it using the code editor. + + Private Sub InitializeComponent() + components = New System.ComponentModel.Container() + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(800, 450) + Me.Text = "Form1" + End Sub + +End Class diff --git a/TrasferimentoProgrammiOkuma.App/Form1.resx b/TrasferimentoProgrammiOkuma.App/Form1.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/TrasferimentoProgrammiOkuma.App/Form1.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TrasferimentoProgrammiOkuma.App/Form1.vb b/TrasferimentoProgrammiOkuma.App/Form1.vb new file mode 100644 index 0000000..1085728 --- /dev/null +++ b/TrasferimentoProgrammiOkuma.App/Form1.vb @@ -0,0 +1,1220 @@ +Imports System.IO +Imports System.Net.Sockets +Imports System.Reflection +Imports System.Security.Cryptography +Imports System.Text +Imports System.Text.Json +Imports System.Threading + +Public Class Form1 + Private Const ConfigFileName As String = "moxa-okuma-settings.json" + + Private ReadOnly cboAzienda As New ComboBox() + Private ReadOnly cboMacchina As New ComboBox() + Private ReadOnly txtIpMoxa As New TextBox() + Private ReadOnly nudPorta As New NumericUpDown() + Private ReadOnly nudTimeoutConnessione As New NumericUpDown() + Private ReadOnly nudTimeoutInattivita As New NumericUpDown() + Private ReadOnly nudPausaRiga As New NumericUpDown() + Private ReadOnly nudPausaCarattere As New NumericUpDown() + Private ReadOnly nudDimensioneBlocco As New NumericUpDown() + Private ReadOnly nudPausaBlocco As New NumericUpDown() + Private ReadOnly nudAttesaPrimaInvio As New NumericUpDown() + Private ReadOnly nudAttesaDopoInvio As New NumericUpDown() + Private ReadOnly chkInvioRigaPerRiga As New CheckBox() + Private ReadOnly chkInvioCaratterePerCarattere As New CheckBox() + Private ReadOnly chkInvioBlocchi As New CheckBox() + Private ReadOnly cboTerminatoreInvio As New ComboBox() + Private ReadOnly txtFileInvio As New TextBox() + Private ReadOnly txtFileRicezione As New TextBox() + Private ReadOnly btnSfogliaInvio As New Button() + Private ReadOnly btnSfogliaRicezione As New Button() + Private ReadOnly btnTestConnessione As New Button() + Private ReadOnly btnInvia As New Button() + Private ReadOnly btnRicevi As New Button() + Private ReadOnly btnAnnulla As New Button() + Private ReadOnly mnuSblocca As New ToolStripMenuItem("Sblocca controlli") + Private ReadOnly mnuCambiaPassword As New ToolStripMenuItem("Cambia password") + Private ReadOnly mnuPulisciLog As New ToolStripMenuItem("Pulisci log") + Private ReadOnly mnuInformazioni As New ToolStripMenuItem("Informazioni su") + Private ReadOnly btnAggiornaStatoMoxa As New Button() + Private ReadOnly chkMonitorStatoMoxa As New CheckBox() + Private ReadOnly nudIntervalloStatoMoxa As New NumericUpDown() + Private ReadOnly lstStatoMoxa As New ListView() + Private ReadOnly imgStatoMoxa As New ImageList() + Private ReadOnly statusTimer As New System.Windows.Forms.Timer() + Private ReadOnly txtLog As New TextBox() + Private ReadOnly progress As New ProgressBar() + Private ReadOnly lockedControls As New List(Of Control)() + + Private appConfig As AppConfig + Private cts As CancellationTokenSource + Private controlsUnlocked As Boolean + Private loadingSelection As Boolean + Private checkingMoxaStatus As Boolean + + Public Sub New() + InitializeComponent() + appConfig = LoadOrCreateConfig() + CleanupOldTemporaryReceives() + BuildInterface() + LoadCompanies() + SetControlsUnlocked(False) + End Sub + + Private Sub BuildInterface() + Text = "LMEMoxaTransfer" + Icon = New Icon(Path.Combine(Application.StartupPath, "Assets", "app-icon.ico")) + MinimumSize = New Size(1030, 690) + Size = New Size(1120, 760) + StartPosition = FormStartPosition.CenterScreen + + Dim mainMenu = BuildMainMenu() + MainMenuStrip = mainMenu + Controls.Add(mainMenu) + + Dim tabs As New TabControl With {.Dock = DockStyle.Fill} + Dim tabTrasferimento As New TabPage("Trasferimento programmi") + Dim tabStatoMoxa As New TabPage("Stato Moxa") + tabs.TabPages.Add(tabTrasferimento) + tabs.TabPages.Add(tabStatoMoxa) + Controls.Add(tabs) + + Dim root As New TableLayoutPanel With { + .Dock = DockStyle.Fill, + .ColumnCount = 1, + .RowCount = 4, + .Padding = New Padding(14) + } + root.RowStyles.Add(New RowStyle(SizeType.AutoSize)) + root.RowStyles.Add(New RowStyle(SizeType.AutoSize)) + root.RowStyles.Add(New RowStyle(SizeType.Percent, 100)) + root.RowStyles.Add(New RowStyle(SizeType.AutoSize)) + tabTrasferimento.Controls.Add(root) + + Dim grpConnessione As New GroupBox With { + .Text = "Connessione Moxa", + .Dock = DockStyle.Top, + .AutoSize = True, + .Padding = New Padding(12) + } + root.Controls.Add(grpConnessione, 0, 0) + + Dim conn As New TableLayoutPanel With {.Dock = DockStyle.Fill, .ColumnCount = 10, .AutoSize = True} + conn.ColumnStyles.Add(New ColumnStyle(SizeType.AutoSize)) + conn.ColumnStyles.Add(New ColumnStyle(SizeType.Absolute, 150)) + conn.ColumnStyles.Add(New ColumnStyle(SizeType.AutoSize)) + conn.ColumnStyles.Add(New ColumnStyle(SizeType.Absolute, 230)) + conn.ColumnStyles.Add(New ColumnStyle(SizeType.AutoSize)) + conn.ColumnStyles.Add(New ColumnStyle(SizeType.Absolute, 135)) + conn.ColumnStyles.Add(New ColumnStyle(SizeType.AutoSize)) + conn.ColumnStyles.Add(New ColumnStyle(SizeType.Absolute, 90)) + conn.ColumnStyles.Add(New ColumnStyle(SizeType.AutoSize)) + conn.ColumnStyles.Add(New ColumnStyle(SizeType.Absolute, 90)) + grpConnessione.Controls.Add(conn) + + cboAzienda.DropDownStyle = ComboBoxStyle.DropDownList + cboAzienda.Dock = DockStyle.Fill + cboMacchina.DropDownStyle = ComboBoxStyle.DropDownList + cboMacchina.Dock = DockStyle.Fill + txtIpMoxa.Dock = DockStyle.Fill + txtIpMoxa.ReadOnly = True + nudPorta.Minimum = 1 + nudPorta.Maximum = 65535 + nudTimeoutConnessione.Minimum = 1 + nudTimeoutConnessione.Maximum = 120 + nudTimeoutInattivita.Minimum = 1 + nudTimeoutInattivita.Maximum = 120 + + conn.Controls.Add(New Label With {.Text = "Azienda", .AutoSize = True, .Anchor = AnchorStyles.Left}, 0, 0) + conn.Controls.Add(cboAzienda, 1, 0) + conn.Controls.Add(New Label With {.Text = "Macchina", .AutoSize = True, .Anchor = AnchorStyles.Left, .Margin = New Padding(14, 0, 3, 0)}, 2, 0) + conn.Controls.Add(cboMacchina, 3, 0) + conn.Controls.Add(New Label With {.Text = "IP Moxa", .AutoSize = True, .Anchor = AnchorStyles.Left, .Margin = New Padding(14, 0, 3, 0)}, 4, 0) + conn.Controls.Add(txtIpMoxa, 5, 0) + conn.Controls.Add(New Label With {.Text = "Porta", .AutoSize = True, .Anchor = AnchorStyles.Left, .Margin = New Padding(14, 0, 3, 0)}, 6, 0) + conn.Controls.Add(nudPorta, 7, 0) + conn.Controls.Add(New Label With {.Text = "Timeout s", .AutoSize = True, .Anchor = AnchorStyles.Left, .Margin = New Padding(14, 0, 3, 0)}, 8, 0) + conn.Controls.Add(nudTimeoutConnessione, 9, 0) + + Dim grpTrasferimento As New GroupBox With { + .Text = "Invio e ricezione programmi", + .Dock = DockStyle.Top, + .AutoSize = True, + .Padding = New Padding(12), + .Margin = New Padding(0, 12, 0, 12) + } + root.Controls.Add(grpTrasferimento, 0, 1) + + Dim transfer As New TableLayoutPanel With {.Dock = DockStyle.Fill, .ColumnCount = 4, .RowCount = 10, .AutoSize = True} + transfer.ColumnStyles.Add(New ColumnStyle(SizeType.AutoSize)) + transfer.ColumnStyles.Add(New ColumnStyle(SizeType.Percent, 100)) + transfer.ColumnStyles.Add(New ColumnStyle(SizeType.AutoSize)) + transfer.ColumnStyles.Add(New ColumnStyle(SizeType.Absolute, 120)) + grpTrasferimento.Controls.Add(transfer) + + ConfigureButton(btnSfogliaInvio, "Sfoglia") + ConfigureButton(btnSfogliaRicezione, "Sfoglia") + ConfigureButton(btnTestConnessione, "Test connessione") + ConfigureButton(btnInvia, "Invia a Okuma") + ConfigureButton(btnRicevi, "Ricevi da Okuma") + ConfigureButton(btnAnnulla, "Annulla") + btnAnnulla.Enabled = False + + txtFileInvio.Dock = DockStyle.Fill + txtFileRicezione.Dock = DockStyle.Fill + cboTerminatoreInvio.DropDownStyle = ComboBoxStyle.DropDownList + cboTerminatoreInvio.Items.AddRange(New Object() {"Nessuno", "CR", "LF", "CRLF", "%", "% + CRLF"}) + chkInvioRigaPerRiga.Text = "Invio riga per riga" + chkInvioRigaPerRiga.AutoSize = True + chkInvioCaratterePerCarattere.Text = "Invio carattere per carattere" + chkInvioCaratterePerCarattere.AutoSize = True + chkInvioBlocchi.Text = "Invio a blocchi (% + CRLF)" + chkInvioBlocchi.AutoSize = True + ConfigureNumericDefaults() + + transfer.Controls.Add(New Label With {.Text = "File da inviare", .AutoSize = True, .Anchor = AnchorStyles.Left}, 0, 0) + transfer.Controls.Add(txtFileInvio, 1, 0) + transfer.Controls.Add(btnSfogliaInvio, 2, 0) + transfer.Controls.Add(btnInvia, 3, 0) + transfer.Controls.Add(New Label With {.Text = "Cartella ricezione", .AutoSize = True, .Anchor = AnchorStyles.Left}, 0, 1) + transfer.Controls.Add(txtFileRicezione, 1, 1) + transfer.Controls.Add(btnSfogliaRicezione, 2, 1) + transfer.Controls.Add(btnRicevi, 3, 1) + transfer.Controls.Add(New Label With {.Text = "Terminatore invio", .AutoSize = True, .Anchor = AnchorStyles.Left}, 0, 2) + transfer.Controls.Add(cboTerminatoreInvio, 1, 2) + transfer.Controls.Add(btnAnnulla, 3, 2) + transfer.Controls.Add(New Label With {.Text = "Pausa riga ms", .AutoSize = True, .Anchor = AnchorStyles.Left}, 0, 3) + transfer.Controls.Add(nudPausaRiga, 1, 3) + transfer.Controls.Add(chkInvioRigaPerRiga, 2, 3) + transfer.Controls.Add(New Label With {.Text = "Pausa carattere ms", .AutoSize = True, .Anchor = AnchorStyles.Left}, 0, 4) + transfer.Controls.Add(nudPausaCarattere, 1, 4) + transfer.Controls.Add(chkInvioCaratterePerCarattere, 2, 4) + transfer.Controls.Add(New Label With {.Text = "Modo Okuma READ", .AutoSize = True, .Anchor = AnchorStyles.Left}, 0, 5) + transfer.Controls.Add(chkInvioBlocchi, 1, 5) + transfer.Controls.Add(New Label With {.Text = "Dim. blocco byte", .AutoSize = True, .Anchor = AnchorStyles.Left}, 2, 5) + transfer.Controls.Add(nudDimensioneBlocco, 3, 5) + transfer.Controls.Add(New Label With {.Text = "Pausa blocco ms", .AutoSize = True, .Anchor = AnchorStyles.Left}, 0, 6) + transfer.Controls.Add(nudPausaBlocco, 1, 6) + transfer.Controls.Add(New Label With {.Text = "Fine ricez. s", .AutoSize = True, .Anchor = AnchorStyles.Left}, 2, 6) + transfer.Controls.Add(nudTimeoutInattivita, 3, 6) + transfer.Controls.Add(New Label With {.Text = "Attesa prima invio s", .AutoSize = True, .Anchor = AnchorStyles.Left}, 0, 7) + transfer.Controls.Add(nudAttesaPrimaInvio, 1, 7) + transfer.Controls.Add(btnTestConnessione, 3, 7) + transfer.Controls.Add(New Label With {.Text = "Attesa dopo invio s", .AutoSize = True, .Anchor = AnchorStyles.Left}, 0, 8) + transfer.Controls.Add(nudAttesaDopoInvio, 1, 8) + + Dim hint As New Label With { + .Text = "Prima di ricevere o inviare, selezionare azienda e macchina. I parametri Moxa vengono compilati dal file JSON nello start path.", + .AutoSize = True, + .Dock = DockStyle.Fill, + .ForeColor = Color.FromArgb(70, 70, 70), + .Margin = New Padding(0, 10, 0, 0) + } + transfer.SetColumnSpan(hint, 4) + transfer.Controls.Add(hint, 0, 9) + + txtLog.Dock = DockStyle.Fill + txtLog.Multiline = True + txtLog.ScrollBars = ScrollBars.Vertical + txtLog.ReadOnly = True + txtLog.Font = New Font("Consolas", 10.0F) + root.Controls.Add(txtLog, 0, 2) + + progress.Dock = DockStyle.Fill + progress.Style = ProgressBarStyle.Blocks + root.Controls.Add(progress, 0, 3) + + lockedControls.AddRange({nudPorta, nudTimeoutConnessione, nudTimeoutInattivita, cboTerminatoreInvio, nudPausaRiga, nudPausaCarattere, nudDimensioneBlocco, nudPausaBlocco, nudAttesaPrimaInvio, nudAttesaDopoInvio, chkInvioRigaPerRiga, chkInvioCaratterePerCarattere, chkInvioBlocchi}) + + AddHandler cboAzienda.SelectedIndexChanged, AddressOf CompanyChanged + AddHandler cboMacchina.SelectedIndexChanged, AddressOf MachineChanged + AddHandler mnuSblocca.Click, AddressOf UnlockClicked + AddHandler mnuCambiaPassword.Click, AddressOf ChangePasswordClicked + AddHandler mnuPulisciLog.Click, AddressOf ClearLogClicked + AddHandler mnuInformazioni.Click, AddressOf AboutClicked + AddHandler btnSfogliaInvio.Click, AddressOf SelectInputFile + AddHandler btnSfogliaRicezione.Click, AddressOf SelectOutputFile + AddHandler btnTestConnessione.Click, AddressOf TestConnectionClicked + AddHandler btnInvia.Click, AddressOf SendClicked + AddHandler btnRicevi.Click, AddressOf ReceiveClicked + AddHandler btnAnnulla.Click, Sub() cts?.Cancel() + + txtFileRicezione.Text = GetInitialReceiveDirectory() + BuildStatusTab(tabStatoMoxa) + Log($"Pronto. Configurazione: {ConfigPath()}") + End Sub + + Private Function BuildMainMenu() As MenuStrip + Dim menu As New MenuStrip() + Dim strumenti As New ToolStripMenuItem("Strumenti") + strumenti.DropDownItems.Add(mnuSblocca) + strumenti.DropDownItems.Add(mnuCambiaPassword) + strumenti.DropDownItems.Add(New ToolStripSeparator()) + strumenti.DropDownItems.Add(mnuPulisciLog) + + Dim aiuto As New ToolStripMenuItem("?") + aiuto.DropDownItems.Add(mnuInformazioni) + + menu.Items.Add(strumenti) + menu.Items.Add(aiuto) + Return menu + End Function + + Private Function GetInitialReceiveDirectory() As String + If Not String.IsNullOrWhiteSpace(appConfig.LastReceiveDirectory) AndAlso Directory.Exists(appConfig.LastReceiveDirectory) Then + Return appConfig.LastReceiveDirectory + End If + + Return Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + End Function + + Private Sub BuildStatusTab(tab As TabPage) + Dim root As New TableLayoutPanel With { + .Dock = DockStyle.Fill, + .ColumnCount = 1, + .RowCount = 2, + .Padding = New Padding(14) + } + root.RowStyles.Add(New RowStyle(SizeType.AutoSize)) + root.RowStyles.Add(New RowStyle(SizeType.Percent, 100)) + tab.Controls.Add(root) + + Dim actions As New FlowLayoutPanel With {.Dock = DockStyle.Fill, .AutoSize = True, .FlowDirection = FlowDirection.LeftToRight} + ConfigureButton(btnAggiornaStatoMoxa, "Aggiorna") + chkMonitorStatoMoxa.Text = "Controllo automatico" + chkMonitorStatoMoxa.AutoSize = True + chkMonitorStatoMoxa.Checked = True + chkMonitorStatoMoxa.Margin = New Padding(16, 8, 0, 3) + nudIntervalloStatoMoxa.Minimum = 5 + nudIntervalloStatoMoxa.Maximum = 3600 + nudIntervalloStatoMoxa.Value = Math.Max(nudIntervalloStatoMoxa.Minimum, Math.Min(nudIntervalloStatoMoxa.Maximum, appConfig.MonitorRefreshSeconds)) + nudIntervalloStatoMoxa.Width = 80 + + actions.Controls.Add(btnAggiornaStatoMoxa) + actions.Controls.Add(chkMonitorStatoMoxa) + actions.Controls.Add(New Label With {.Text = "Intervallo s", .AutoSize = True, .Margin = New Padding(16, 9, 3, 3)}) + actions.Controls.Add(nudIntervalloStatoMoxa) + root.Controls.Add(actions, 0, 0) + + imgStatoMoxa.ImageSize = New Size(16, 16) + imgStatoMoxa.ColorDepth = ColorDepth.Depth32Bit + imgStatoMoxa.Images.Add("unknown", CreateStatusIcon(Color.Gray)) + imgStatoMoxa.Images.Add("online", CreateStatusIcon(Color.FromArgb(0, 150, 70))) + imgStatoMoxa.Images.Add("offline", CreateStatusIcon(Color.FromArgb(210, 40, 40))) + + lstStatoMoxa.Dock = DockStyle.Fill + lstStatoMoxa.View = View.Details + lstStatoMoxa.FullRowSelect = True + lstStatoMoxa.GridLines = True + lstStatoMoxa.SmallImageList = imgStatoMoxa + lstStatoMoxa.Columns.Add("Macchina", 280) + lstStatoMoxa.Columns.Add("IP Moxa", 140) + lstStatoMoxa.Columns.Add("Porta", 70) + lstStatoMoxa.Columns.Add("Stato", 130) + lstStatoMoxa.Columns.Add("Ultimo controllo", 160) + lstStatoMoxa.Columns.Add("Note", 220) + root.Controls.Add(lstStatoMoxa, 0, 1) + + lockedControls.Add(chkMonitorStatoMoxa) + lockedControls.Add(nudIntervalloStatoMoxa) + + statusTimer.Interval = CInt(nudIntervalloStatoMoxa.Value) * 1000 + statusTimer.Enabled = chkMonitorStatoMoxa.Checked + AddHandler btnAggiornaStatoMoxa.Click, AddressOf RefreshMoxaStatusClicked + AddHandler statusTimer.Tick, AddressOf StatusTimerTick + AddHandler nudIntervalloStatoMoxa.ValueChanged, AddressOf StatusIntervalChanged + AddHandler chkMonitorStatoMoxa.CheckedChanged, AddressOf StatusMonitorChanged + + PopulateMoxaStatusList() + End Sub + + Private Shared Function CreateStatusIcon(color As Color) As Bitmap + Dim bitmap As New Bitmap(16, 16) + Using g = Graphics.FromImage(bitmap) + g.Clear(Color.Transparent) + Using brush As New SolidBrush(color) + g.FillEllipse(brush, 2, 2, 12, 12) + End Using + Using pen As New Pen(Color.FromArgb(80, 0, 0, 0)) + g.DrawEllipse(pen, 2, 2, 12, 12) + End Using + End Using + Return bitmap + End Function + + Private Sub ConfigureNumericDefaults() + nudPorta.Minimum = 1 + nudPorta.Maximum = 65535 + nudTimeoutConnessione.Minimum = 1 + nudTimeoutConnessione.Maximum = 120 + nudTimeoutInattivita.Minimum = 1 + nudTimeoutInattivita.Maximum = 120 + nudPausaRiga.Minimum = 0 + nudPausaRiga.Maximum = 2000 + nudPausaCarattere.Minimum = 0 + nudPausaCarattere.Maximum = 200 + nudDimensioneBlocco.Minimum = 1 + nudDimensioneBlocco.Maximum = 1024 + nudPausaBlocco.Minimum = 0 + nudPausaBlocco.Maximum = 5000 + nudAttesaPrimaInvio.Minimum = 0 + nudAttesaPrimaInvio.Maximum = 60 + nudAttesaDopoInvio.Minimum = 0 + nudAttesaDopoInvio.Maximum = 30 + End Sub + + Private Sub LoadCompanies() + loadingSelection = True + cboAzienda.Items.Clear() + For Each company In appConfig.Companies + cboAzienda.Items.Add(company.Name) + Next + loadingSelection = False + + If cboAzienda.Items.Count > 0 Then + Dim index = Math.Max(0, appConfig.Companies.FindIndex(Function(c) c.Name = appConfig.DefaultCompany)) + cboAzienda.SelectedIndex = index + End If + + PopulateMoxaStatusList() + End Sub + + Private Sub PopulateMoxaStatusList() + If lstStatoMoxa.Columns.Count = 0 Then + Return + End If + + lstStatoMoxa.BeginUpdate() + lstStatoMoxa.Items.Clear() + lstStatoMoxa.Groups.Clear() + + For Each company In appConfig.Companies + Dim group As New ListViewGroup(company.Name, HorizontalAlignment.Left) + lstStatoMoxa.Groups.Add(group) + + For Each machine In company.Machines + Dim item As New ListViewItem(machine.Name, "unknown") With { + .Group = group, + .Tag = New MoxaStatusTarget With {.Company = company.Name, .Machine = machine} + } + item.SubItems.Add(machine.IpMoxa) + item.SubItems.Add(appConfig.DefaultSettings.Port.ToString()) + item.SubItems.Add("Non controllato") + item.SubItems.Add("") + item.SubItems.Add(machine.Note) + lstStatoMoxa.Items.Add(item) + Next + Next + + lstStatoMoxa.EndUpdate() + End Sub + + Private Sub CompanyChanged(sender As Object, e As EventArgs) + If loadingSelection OrElse cboAzienda.SelectedIndex < 0 Then + Return + End If + + Dim company = CurrentCompany() + loadingSelection = True + cboMacchina.Items.Clear() + For Each machine In company.Machines + cboMacchina.Items.Add(machine.Name) + Next + loadingSelection = False + + If cboMacchina.Items.Count > 0 Then + cboMacchina.SelectedIndex = 0 + End If + End Sub + + Private Sub MachineChanged(sender As Object, e As EventArgs) + If loadingSelection Then + Return + End If + + ApplyCurrentMachineSettings() + End Sub + + Private Sub ApplyCurrentMachineSettings() + Dim machine = CurrentMachine() + If machine Is Nothing Then + Return + End If + + Dim defaults = appConfig.DefaultSettings + txtIpMoxa.Text = machine.IpMoxa + nudPorta.Value = defaults.Port + nudTimeoutConnessione.Value = defaults.ConnectionTimeoutSeconds + nudTimeoutInattivita.Value = defaults.ReceiveIdleTimeoutSeconds + cboTerminatoreInvio.SelectedItem = defaults.SendTerminator + nudPausaRiga.Value = defaults.LineDelayMs + nudPausaCarattere.Value = defaults.CharDelayMs + chkInvioRigaPerRiga.Checked = defaults.LinePaced + chkInvioCaratterePerCarattere.Checked = defaults.CharPaced + chkInvioBlocchi.Checked = defaults.BlockPaced + nudDimensioneBlocco.Value = defaults.BlockSizeBytes + nudPausaBlocco.Value = defaults.BlockDelayMs + nudAttesaPrimaInvio.Value = defaults.WaitBeforeSendSeconds + nudAttesaDopoInvio.Value = defaults.WaitAfterSendSeconds + Log($"Macchina selezionata: {CurrentCompany().Name} / {machine.Name} - IP Moxa {machine.IpMoxa}.") + End Sub + + Private Function CurrentCompany() As CompanyConfig + If cboAzienda.SelectedIndex < 0 OrElse cboAzienda.SelectedIndex >= appConfig.Companies.Count Then + Return Nothing + End If + Return appConfig.Companies(cboAzienda.SelectedIndex) + End Function + + Private Function CurrentMachine() As MachineConfig + Dim company = CurrentCompany() + If company Is Nothing OrElse cboMacchina.SelectedIndex < 0 OrElse cboMacchina.SelectedIndex >= company.Machines.Count Then + Return Nothing + End If + Return company.Machines(cboMacchina.SelectedIndex) + End Function + + Private Sub UnlockClicked(sender As Object, e As EventArgs) + If controlsUnlocked Then + SetControlsUnlocked(False) + Return + End If + + If String.IsNullOrWhiteSpace(appConfig.AdminPasswordHash) OrElse String.IsNullOrWhiteSpace(appConfig.AdminPasswordSalt) Then + Dim newPassword = PromptPassword("Password non configurata", "Inserire una nuova password amministratore:") + If String.IsNullOrEmpty(newPassword) Then + Return + End If + SetPassword(newPassword) + SaveConfig() + SetControlsUnlocked(True) + Return + End If + + Dim password = PromptPassword("Sblocca controlli", "Inserire la password:") + If password Is Nothing Then + Return + End If + + If VerifyPassword(password) Then + SetControlsUnlocked(True) + Else + MessageBox.Show(Me, "Password non corretta.", "Accesso negato", MessageBoxButtons.OK, MessageBoxIcon.Warning) + End If + End Sub + + Private Sub ChangePasswordClicked(sender As Object, e As EventArgs) + If Not String.IsNullOrWhiteSpace(appConfig.AdminPasswordHash) AndAlso Not String.IsNullOrWhiteSpace(appConfig.AdminPasswordSalt) Then + Dim oldPassword = PromptPassword("Cambia password", "Inserire la vecchia password:") + If oldPassword Is Nothing Then + Return + End If + If Not VerifyPassword(oldPassword) Then + MessageBox.Show(Me, "Vecchia password non corretta.", "Password", MessageBoxButtons.OK, MessageBoxIcon.Warning) + Return + End If + End If + + Dim newPassword = PromptPassword("Cambia password", "Inserire la nuova password:") + If String.IsNullOrEmpty(newPassword) Then + Return + End If + + SetPassword(newPassword) + SaveConfig() + MessageBox.Show(Me, "Password aggiornata.", "Password", MessageBoxButtons.OK, MessageBoxIcon.Information) + End Sub + + Private Sub ClearLogClicked(sender As Object, e As EventArgs) + txtLog.Clear() + End Sub + + Private Sub AboutClicked(sender As Object, e As EventArgs) + Dim version = Assembly.GetExecutingAssembly().GetName().Version + MessageBox.Show(Me, + $"LMEMoxaTransfer{Environment.NewLine}{Environment.NewLine}Azienda: Compomac SPA{Environment.NewLine}Autore: Livio Merola{Environment.NewLine}Versione: {version}", + "Informazioni su", + MessageBoxButtons.OK, + MessageBoxIcon.Information) + End Sub + + Private Async Sub RefreshMoxaStatusClicked(sender As Object, e As EventArgs) + Await RefreshMoxaStatusAsync() + End Sub + + Private Async Sub StatusTimerTick(sender As Object, e As EventArgs) + If chkMonitorStatoMoxa.Checked Then + Await RefreshMoxaStatusAsync() + End If + End Sub + + Private Sub StatusIntervalChanged(sender As Object, e As EventArgs) + statusTimer.Interval = CInt(nudIntervalloStatoMoxa.Value) * 1000 + appConfig.MonitorRefreshSeconds = CInt(nudIntervalloStatoMoxa.Value) + SaveConfig() + End Sub + + Private Sub StatusMonitorChanged(sender As Object, e As EventArgs) + statusTimer.Enabled = chkMonitorStatoMoxa.Checked + End Sub + + Private Async Function RefreshMoxaStatusAsync() As Task + If checkingMoxaStatus Then + Return + End If + + checkingMoxaStatus = True + btnAggiornaStatoMoxa.Enabled = False + Try + For Each item As ListViewItem In lstStatoMoxa.Items + Dim target = TryCast(item.Tag, MoxaStatusTarget) + If target Is Nothing Then + Continue For + End If + + item.ImageKey = "unknown" + item.SubItems(3).Text = "Controllo..." + item.SubItems(4).Text = DateTime.Now.ToString("HH:mm:ss") + Dim online = Await IsMoxaReachableAsync(target.Machine.IpMoxa, appConfig.DefaultSettings.Port, TimeSpan.FromMilliseconds(1200)) + item.ImageKey = If(online, "online", "offline") + item.SubItems(3).Text = If(online, "Raggiungibile", "Non raggiungibile") + item.SubItems(4).Text = DateTime.Now.ToString("HH:mm:ss") + Next + Finally + btnAggiornaStatoMoxa.Enabled = True + checkingMoxaStatus = False + End Try + End Function + + Private Shared Async Function IsMoxaReachableAsync(ip As String, port As Integer, timeout As TimeSpan) As Task(Of Boolean) + If String.IsNullOrWhiteSpace(ip) Then + Return False + End If + + Using client As New TcpClient() + Try + Dim connectTask = client.ConnectAsync(ip.Trim(), port) + Dim completed = Await Task.WhenAny(connectTask, Task.Delay(timeout)) + If completed IsNot connectTask Then + Return False + End If + Await connectTask + Return True + Catch + Return False + End Try + End Using + End Function + + Private Sub SetControlsUnlocked(unlocked As Boolean) + controlsUnlocked = unlocked + For Each control In lockedControls + control.Enabled = unlocked + Next + mnuSblocca.Text = If(unlocked, "Blocca controlli", "Sblocca controlli") + End Sub + + Private Async Sub TestConnectionClicked(sender As Object, e As EventArgs) + Await RunTransferAsync(Async Function(token) + Using client = Await ConnectAsync(token) + Log("Test OK: connessione TCP aperta, nessun dato inviato a Okuma.") + End Using + End Function) + End Sub + + Private Shared Sub ConfigureButton(button As Button, text As String) + button.Text = text + button.AutoSize = True + button.MinimumSize = New Size(110, 32) + button.Margin = New Padding(8, 3, 0, 3) + End Sub + + Private Sub SelectInputFile(sender As Object, e As EventArgs) + Using dlg As New OpenFileDialog() + dlg.Title = "Seleziona programma da inviare a Okuma" + dlg.Filter = "Programmi CNC|*.min;*.eia;*.iso;*.txt;*.nc|Tutti i file|*.*" + If dlg.ShowDialog(Me) = DialogResult.OK Then + txtFileInvio.Text = dlg.FileName + End If + End Using + End Sub + + Private Sub SelectOutputFile(sender As Object, e As EventArgs) + Using dlg As New FolderBrowserDialog() + dlg.Description = "Scegli la cartella dove salvare il programma ricevuto" + dlg.UseDescriptionForTitle = True + If Directory.Exists(txtFileRicezione.Text) Then + dlg.SelectedPath = txtFileRicezione.Text + End If + If dlg.ShowDialog(Me) = DialogResult.OK Then + txtFileRicezione.Text = dlg.SelectedPath + appConfig.LastReceiveDirectory = dlg.SelectedPath + SaveConfig() + End If + End Using + End Sub + + Private Async Sub SendClicked(sender As Object, e As EventArgs) + If CurrentMachine() Is Nothing Then + MessageBox.Show(Me, "Selezionare azienda e macchina.", "Macchina mancante", MessageBoxButtons.OK, MessageBoxIcon.Warning) + Return + End If + If Not File.Exists(txtFileInvio.Text) Then + MessageBox.Show(Me, "Selezionare un file esistente da inviare.", "File mancante", MessageBoxButtons.OK, MessageBoxIcon.Warning) + Return + End If + + Await RunTransferAsync(Async Function(token) + Dim fileBytes = Await File.ReadAllBytesAsync(txtFileInvio.Text, token) + fileBytes = RemoveUtf8BomIfPresent(fileBytes) + LogFirstBytes(fileBytes) + ValidateCncTextBytes(fileBytes) + Dim blockPaced = chkInvioBlocchi.Checked + Dim terminator = If(blockPaced, Encoding.ASCII.GetBytes("%" & vbCrLf), GetTerminatorBytes()) + + Using client = Await ConnectAsync(token) + Using stream = client.GetStream() + Dim waitBeforeSend = CInt(nudAttesaPrimaInvio.Value) + If waitBeforeSend > 0 Then + Log($"Attesa prima del primo byte: {waitBeforeSend} s.") + Await Task.Delay(TimeSpan.FromSeconds(waitBeforeSend), token) + End If + + If blockPaced Then + Dim blockSize = CInt(nudDimensioneBlocco.Value) + Dim blockDelayMs = CInt(nudPausaBlocco.Value) + Log($"Invio Okuma READ: blocchi da {blockSize} byte con pausa {blockDelayMs} ms.") + Await SendBlockPacedAsync(stream, fileBytes, blockSize, blockDelayMs, token) + ElseIf chkInvioRigaPerRiga.Checked Then + Await SendLinePacedAsync(stream, fileBytes, CInt(nudPausaRiga.Value), CInt(nudPausaCarattere.Value), chkInvioCaratterePerCarattere.Checked, token) + Else + Await stream.WriteAsync(fileBytes, token) + End If + + If terminator.Length > 0 Then + Await stream.WriteAsync(terminator, token) + End If + Await stream.FlushAsync(token) + + Dim waitAfterSend = CInt(nudAttesaDopoInvio.Value) + If blockPaced Then + waitAfterSend = Math.Max(waitAfterSend, 1) + End If + If waitAfterSend > 0 Then + Await Task.Delay(TimeSpan.FromSeconds(waitAfterSend), token) + End If + End Using + End Using + Log($"Inviati {fileBytes.Length:N0} byte a Okuma.") + End Function) + End Sub + + Private Async Sub ReceiveClicked(sender As Object, e As EventArgs) + If CurrentMachine() Is Nothing Then + MessageBox.Show(Me, "Selezionare azienda e macchina.", "Macchina mancante", MessageBoxButtons.OK, MessageBoxIcon.Warning) + Return + End If + If String.IsNullOrWhiteSpace(txtFileRicezione.Text) Then + MessageBox.Show(Me, "Scegliere una cartella di destinazione per la ricezione.", "Cartella mancante", MessageBoxButtons.OK, MessageBoxIcon.Warning) + Return + End If + + Await RunTransferAsync(Async Function(token) + Dim destinationDirectory = Path.GetFullPath(txtFileRicezione.Text) + Directory.CreateDirectory(destinationDirectory) + Dim temporaryPath = CreateTemporaryReceivePath() + Using client = Await ConnectAsync(token) + Using stream = client.GetStream() + Dim received = Await ReceiveUntilIdleAsync(stream, temporaryPath, token) + Log($"Ricevuti {received:N0} byte da Okuma.") + End Using + End Using + Dim finalPath = PromptAndSaveReceivedFile(temporaryPath, destinationDirectory) + Log($"File ricevuto salvato in: {finalPath}") + End Function) + End Sub + + Private Async Function RunTransferAsync(action As Func(Of CancellationToken, Task)) As Task + SetBusy(True) + cts = New CancellationTokenSource() + + Try + Await action(cts.Token) + Log("Operazione completata.") + Catch ex As OperationCanceledException + Log("Operazione annullata.") + Catch ex As Exception + Log("Errore: " & ex.Message) + MessageBox.Show(Me, ex.Message, "Errore trasferimento", MessageBoxButtons.OK, MessageBoxIcon.Error) + Finally + cts.Dispose() + cts = Nothing + SetBusy(False) + End Try + End Function + + Private Shared Async Function SendLinePacedAsync(stream As NetworkStream, data As Byte(), lineDelayMs As Integer, charDelayMs As Integer, charPaced As Boolean, token As CancellationToken) As Task + Dim start = 0 + For i = 0 To data.Length - 1 + If data(i) = 10 Then + Await WriteChunkAsync(stream, data, start, i - start + 1, charDelayMs, charPaced, token) + Await stream.FlushAsync(token) + start = i + 1 + If lineDelayMs > 0 Then + Await Task.Delay(lineDelayMs, token) + End If + End If + Next + If start < data.Length Then + Await WriteChunkAsync(stream, data, start, data.Length - start, charDelayMs, charPaced, token) + End If + End Function + + Private Shared Async Function WriteChunkAsync(stream As NetworkStream, data As Byte(), offset As Integer, count As Integer, charDelayMs As Integer, charPaced As Boolean, token As CancellationToken) As Task + If Not charPaced Then + Await stream.WriteAsync(data.AsMemory(offset, count), token) + Return + End If + + For i = offset To offset + count - 1 + Await stream.WriteAsync(data.AsMemory(i, 1), token) + If charDelayMs > 0 Then + Await Task.Delay(charDelayMs, token) + End If + Next + End Function + + Private Shared Async Function SendBlockPacedAsync(stream As NetworkStream, data As Byte(), blockSize As Integer, blockDelayMs As Integer, token As CancellationToken) As Task + Dim offset = 0 + While offset < data.Length + Dim count = Math.Min(blockSize, data.Length - offset) + Await stream.WriteAsync(data.AsMemory(offset, count), token) + Await stream.FlushAsync(token) + offset += count + If offset < data.Length AndAlso blockDelayMs > 0 Then + Await Task.Delay(blockDelayMs, token) + End If + End While + End Function + + Private Async Function ConnectAsync(token As CancellationToken) As Task(Of TcpClient) + Dim machine = CurrentMachine() + If machine Is Nothing Then + Throw New InvalidOperationException("Macchina non selezionata.") + End If + + Dim ip = machine.IpMoxa.Trim() + Dim port = CInt(nudPorta.Value) + Dim timeout = TimeSpan.FromSeconds(CInt(nudTimeoutConnessione.Value)) + Dim client As New TcpClient With {.NoDelay = True} + + Log($"Connessione a {ip}:{port}...") + Dim connectTask = client.ConnectAsync(ip, port, token).AsTask() + Dim completed = Await Task.WhenAny(connectTask, Task.Delay(timeout, token)) + If completed IsNot connectTask Then + client.Dispose() + Throw New TimeoutException($"Connessione non riuscita entro {timeout.TotalSeconds:N0} secondi.") + End If + + Await connectTask + Log("Connessione aperta.") + Return client + End Function + + Private Async Function ReceiveUntilIdleAsync(stream As NetworkStream, destinationPath As String, token As CancellationToken) As Task(Of Long) + Dim buffer(8191) As Byte + Dim total As Long = 0 + Dim idleTimeout = TimeSpan.FromSeconds(CInt(nudTimeoutInattivita.Value)) + + Log("In attesa dati. Avviare l'invio programma dal controllo Okuma.") + Using output As New FileStream(destinationPath, FileMode.Create, FileAccess.Write, FileShare.Read, 8192, useAsync:=True) + Do + Dim readTask = stream.ReadAsync(buffer.AsMemory(0, buffer.Length), token).AsTask() + Dim completed = Await Task.WhenAny(readTask, Task.Delay(idleTimeout, token)) + + If completed IsNot readTask Then + If total = 0 Then + Throw New TimeoutException("Nessun dato ricevuto prima del timeout di inattivita.") + End If + Exit Do + End If + + Dim count = Await readTask + If count = 0 Then + Exit Do + End If + + Await output.WriteAsync(buffer.AsMemory(0, count), token) + total += count + progress.Value = CInt(Math.Min(progress.Maximum, total Mod progress.Maximum)) + Log($"Ricevuti {total:N0} byte...") + Loop + End Using + + Return total + End Function + + Private Shared Function CreateTemporaryReceivePath() As String + Dim tempDirectory = Path.Combine(Application.StartupPath, "RicezioniTemp") + Directory.CreateDirectory(tempDirectory) + Return Path.Combine(tempDirectory, $"ricezione_okuma_{DateTime.Now:yyyyMMdd_HHmmss}_{Guid.NewGuid():N}.tmp") + End Function + + Private Shared Sub CleanupOldTemporaryReceives() + Dim tempDirectory = Path.Combine(Application.StartupPath, "RicezioniTemp") + If Not Directory.Exists(tempDirectory) Then + Return + End If + + For Each filePath In Directory.EnumerateFiles(tempDirectory, "*.tmp") + Try + If File.GetLastWriteTime(filePath) < DateTime.Now.AddDays(-7) Then + File.Delete(filePath) + End If + Catch + End Try + Next + End Sub + + Private Function PromptAndSaveReceivedFile(temporaryPath As String, destinationDirectory As String) As String + If Not File.Exists(temporaryPath) Then + Return temporaryPath + End If + + Dim suggestedName = ExtractProgramFileName(File.ReadAllBytes(temporaryPath)) + If String.IsNullOrWhiteSpace(suggestedName) Then + suggestedName = "programma_okuma.min" + Log("Nessun nome programma preceduto da $ trovato nel file ricevuto: propongo un nome predefinito.") + End If + + Dim chosenName As String = Nothing + Do + chosenName = PromptReceivedFileName(suggestedName) + If chosenName Is Nothing Then + Log($"Nome finale annullato: il file temporaneo resta in {temporaryPath}") + Return temporaryPath + End If + + chosenName = Path.GetFileName(chosenName.Trim()) + If Not String.IsNullOrWhiteSpace(chosenName) AndAlso chosenName.IndexOfAny(Path.GetInvalidFileNameChars()) < 0 Then + Exit Do + End If + + MessageBox.Show(Me, "Nome file non valido.", "Nome file", MessageBoxButtons.OK, MessageBoxIcon.Warning) + Loop + + Dim finalPath = Path.Combine(destinationDirectory, chosenName) + + If File.Exists(finalPath) Then + Dim overwrite = MessageBox.Show(Me, $"Il file {chosenName} esiste gia'. Sovrascriverlo?", "File esistente", MessageBoxButtons.YesNo, MessageBoxIcon.Question) + If overwrite <> DialogResult.Yes Then + Return PromptAndSaveReceivedFile(temporaryPath, destinationDirectory) + End If + End If + + File.Move(temporaryPath, finalPath, True) + Return finalPath + End Function + + Private Shared Function ExtractProgramFileName(data As Byte()) As String + Dim invalidChars = Path.GetInvalidFileNameChars() + + For i = 0 To data.Length - 1 + If data(i) <> AscW("$"c) Then + Continue For + End If + + Dim builder As New StringBuilder() + For j = i + 1 To data.Length - 1 + Dim value = data(j) + If value = 0 OrElse value = &HD OrElse value = &HA OrElse value = &H9 OrElse value = AscW("$"c) Then + Exit For + End If + If value < &H20 OrElse value > &H7E Then + Exit For + End If + + Dim ch = ChrW(value) + If Array.IndexOf(invalidChars, ch) >= 0 Then + Exit For + End If + + builder.Append(ch) + Next + + Dim candidate = builder.ToString().Trim() + If candidate.Length > 0 AndAlso candidate.Contains("."c) Then + Return candidate + End If + Next + + Return "" + End Function + + Private Function PromptReceivedFileName(suggestedName As String) As String + Using form As New Form With {.Text = "Nome file ricevuto", .StartPosition = FormStartPosition.CenterParent, .FormBorderStyle = FormBorderStyle.FixedDialog, .MinimizeBox = False, .MaximizeBox = False, .ClientSize = New Size(440, 140)} + Dim label As New Label With {.Text = "Conferma o modifica il nome file da salvare:", .Left = 12, .Top = 12, .Width = 410, .AutoSize = False} + Dim textBox As New TextBox With {.Left = 12, .Top = 42, .Width = 410, .Text = suggestedName} + Dim ok As New Button With {.Text = "Salva", .Left = 256, .Top = 88, .Width = 78, .DialogResult = DialogResult.OK} + Dim cancel As New Button With {.Text = "Annulla", .Left = 344, .Top = 88, .Width = 78, .DialogResult = DialogResult.Cancel} + form.Controls.AddRange({label, textBox, ok, cancel}) + form.AcceptButton = ok + form.CancelButton = cancel + textBox.SelectAll() + + If form.ShowDialog(Me) = DialogResult.OK Then + Return textBox.Text + End If + End Using + + Return Nothing + End Function + + Private Function GetTerminatorBytes() As Byte() + Select Case CStr(cboTerminatoreInvio.SelectedItem) + Case "CR" + Return Encoding.ASCII.GetBytes(vbCr) + Case "LF" + Return Encoding.ASCII.GetBytes(vbLf) + Case "CRLF" + Return Encoding.ASCII.GetBytes(vbCrLf) + Case "%" + Return Encoding.ASCII.GetBytes("%") + Case "% + CRLF" + Return Encoding.ASCII.GetBytes("%" & vbCrLf) + Case Else + Return Array.Empty(Of Byte)() + End Select + End Function + + Private Shared Function RemoveUtf8BomIfPresent(data As Byte()) As Byte() + If data.Length < 3 OrElse data(0) <> &HEF OrElse data(1) <> &HBB OrElse data(2) <> &HBF Then + Return data + End If + + Dim cleanLength = data.Length - 3 + If cleanLength = 0 Then + Return Array.Empty(Of Byte)() + End If + + Dim clean(cleanLength - 1) As Byte + Buffer.BlockCopy(data, 3, clean, 0, clean.Length) + Return clean + End Function + + Private Sub LogFirstBytes(data As Byte()) + If data.Length = 0 Then + Log("File vuoto: nessun byte da inviare prima del terminatore.") + Return + End If + + Dim previewLength = Math.Min(16, data.Length) + Dim preview As New StringBuilder() + For i = 0 To previewLength - 1 + If i > 0 Then + preview.Append(" ") + End If + preview.Append(data(i).ToString("X2")) + Next + + Log($"Primi byte inviati: {preview}") + If data(0) > &H7F Then + Log($"Attenzione: il primo byte e' > 7 bit ({data(0):X2}). Per Okuma 7E1 puo' essere un carattere non valido.") + End If + End Sub + + Private Shared Sub ValidateCncTextBytes(data As Byte()) + For i = 0 To data.Length - 1 + Dim value = data(i) + Dim isAllowedControl = value = &H9 OrElse value = &HA OrElse value = &HD + Dim isPrintableAscii = value >= &H20 AndAlso value <= &H7E + If Not isAllowedControl AndAlso Not isPrintableAscii Then + Throw New InvalidDataException($"Il file non sembra testo CNC ASCII/7 bit: byte non valido 0x{value:X2} alla posizione {i}.") + End If + Next + End Sub + + Private Sub SetBusy(isBusy As Boolean) + btnInvia.Enabled = Not isBusy + btnRicevi.Enabled = Not isBusy + btnTestConnessione.Enabled = Not isBusy + btnSfogliaInvio.Enabled = Not isBusy + btnSfogliaRicezione.Enabled = Not isBusy + mnuSblocca.Enabled = Not isBusy + mnuCambiaPassword.Enabled = Not isBusy + mnuPulisciLog.Enabled = Not isBusy + btnAnnulla.Enabled = isBusy + If Not isBusy Then + For Each control In lockedControls + control.Enabled = controlsUnlocked + Next + Else + For Each control In lockedControls + control.Enabled = False + Next + End If + progress.Style = If(isBusy, ProgressBarStyle.Marquee, ProgressBarStyle.Blocks) + If Not isBusy Then + progress.Value = 0 + End If + End Sub + + Private Sub Log(message As String) + If InvokeRequired Then + BeginInvoke(Sub() Log(message)) + Return + End If + txtLog.AppendText($"{DateTime.Now:HH:mm:ss} {message}{Environment.NewLine}") + End Sub + + Private Shared Function ConfigPath() As String + Return Path.Combine(Application.StartupPath, ConfigFileName) + End Function + + Private Function LoadOrCreateConfig() As AppConfig + Dim path = ConfigPath() + If File.Exists(path) Then + Dim loaded = JsonSerializer.Deserialize(Of AppConfig)(File.ReadAllText(path), JsonOptions()) + If loaded IsNot Nothing Then + Return loaded + End If + End If + + Dim created = CreateDefaultConfig() + appConfig = created + SetPassword("moxa") + SaveConfig() + Return appConfig + End Function + + Private Sub SaveConfig() + File.WriteAllText(ConfigPath(), JsonSerializer.Serialize(appConfig, JsonOptions())) + End Sub + + Private Shared Function JsonOptions() As JsonSerializerOptions + Return New JsonSerializerOptions With {.WriteIndented = True, .PropertyNameCaseInsensitive = True} + End Function + + Private Function VerifyPassword(password As String) As Boolean + Dim salt = Convert.FromBase64String(appConfig.AdminPasswordSalt) + Dim expected = Convert.FromBase64String(appConfig.AdminPasswordHash) + Using pbkdf2 As New Rfc2898DeriveBytes(password, salt, 100000, HashAlgorithmName.SHA256) + Dim actual = pbkdf2.GetBytes(expected.Length) + Return CryptographicOperations.FixedTimeEquals(actual, expected) + End Using + End Function + + Private Sub SetPassword(password As String) + Dim salt(15) As Byte + RandomNumberGenerator.Fill(salt) + Using pbkdf2 As New Rfc2898DeriveBytes(password, salt, 100000, HashAlgorithmName.SHA256) + appConfig.AdminPasswordSalt = Convert.ToBase64String(salt) + appConfig.AdminPasswordHash = Convert.ToBase64String(pbkdf2.GetBytes(32)) + End Using + End Sub + + Private Function PromptPassword(title As String, prompt As String) As String + Using form As New Form With {.Text = title, .StartPosition = FormStartPosition.CenterParent, .FormBorderStyle = FormBorderStyle.FixedDialog, .MinimizeBox = False, .MaximizeBox = False, .ClientSize = New Size(360, 130)} + Dim label As New Label With {.Text = prompt, .Left = 12, .Top = 12, .Width = 330, .AutoSize = False} + Dim textBox As New TextBox With {.Left = 12, .Top = 42, .Width = 330, .UseSystemPasswordChar = True} + Dim ok As New Button With {.Text = "OK", .Left = 176, .Top = 84, .Width = 78, .DialogResult = DialogResult.OK} + Dim cancel As New Button With {.Text = "Annulla", .Left = 264, .Top = 84, .Width = 78, .DialogResult = DialogResult.Cancel} + form.Controls.AddRange({label, textBox, ok, cancel}) + form.AcceptButton = ok + form.CancelButton = cancel + If form.ShowDialog(Me) = DialogResult.OK Then + Return textBox.Text + End If + End Using + Return Nothing + End Function + + Private Shared Function CreateDefaultConfig() As AppConfig + Return New AppConfig With { + .DefaultCompany = "SECUREX", + .MonitorRefreshSeconds = 30, + .DefaultSettings = New TransferSettings With { + .Port = 10001, + .ConnectionTimeoutSeconds = 10, + .ReceiveIdleTimeoutSeconds = 15, + .SendTerminator = "%", + .LineDelayMs = 100, + .CharDelayMs = 10, + .LinePaced = True, + .CharPaced = False, + .BlockPaced = False, + .BlockSizeBytes = 32, + .BlockDelayMs = 100, + .WaitBeforeSendSeconds = 2, + .WaitAfterSendSeconds = 2 + }, + .Companies = New List(Of CompanyConfig) From { + New CompanyConfig With {.Name = "SECUREX", .Machines = New List(Of MachineConfig) From { + New MachineConfig With {.Name = "M4 - N2LB 300", .IpMoxa = "192.168.0.101", .IpMachineWise = "192.168.0.214", .Note = "OSP-U100L"}, + New MachineConfig With {.Name = "M5 - N3LB 300", .IpMoxa = "192.168.0.146", .IpMachineWise = "192.168.0.47", .Note = "OSP-E100L"}, + New MachineConfig With {.Name = "M8 - CENTRO OKUMA", .IpMoxa = "192.168.0.113", .IpMachineWise = "192.168.0.68", .Note = "OSP-P200M"}, + New MachineConfig With {.Name = "M11 - TORNIO OKUMA LB25I-N", .IpMoxa = "192.168.0.88", .IpMachineWise = "192.168.0.223"}, + New MachineConfig With {.Name = "M12 - TORNIO OKUMA LB 400", .IpMoxa = "192.168.0.99", .IpMachineWise = "192.168.0.66"} + }}, + New CompanyConfig With {.Name = "EMILIA", .Machines = New List(Of MachineConfig) From { + New MachineConfig With {.Name = "M1", .IpMoxa = "192.168.30.8", .IpMachineWise = "192.168.30.221"}, + New MachineConfig With {.Name = "M2", .IpMoxa = "192.168.30.9", .IpMachineWise = "192.168.30.222"}, + New MachineConfig With {.Name = "M3", .IpMoxa = "192.168.30.10", .IpMachineWise = "192.168.30.223"}, + New MachineConfig With {.Name = "M4 - CENTRO LAVORO OKUMA", .IpMoxa = "192.168.30.11", .IpMachineWise = "192.168.30.224"}, + New MachineConfig With {.Name = "M5", .IpMoxa = "192.168.30.12", .IpMachineWise = "192.168.30.225"}, + New MachineConfig With {.Name = "M6", .IpMoxa = "192.168.30.13", .IpMachineWise = "192.168.30.226"} + }}, + New CompanyConfig With {.Name = "SMART", .Machines = New List(Of MachineConfig) From { + New MachineConfig With {.Name = "M1", .IpMoxa = "192.168.35.10", .IpMachineWise = "192.168.35.212"}, + New MachineConfig With {.Name = "M2", .IpMoxa = "192.168.35.11", .IpMachineWise = "192.168.35.211"}, + New MachineConfig With {.Name = "M3", .IpMoxa = "192.168.35.12", .IpMachineWise = "192.168.35.213"}, + New MachineConfig With {.Name = "M4 - CENTRO LAVORO OKUMA", .IpMoxa = "192.168.35.13", .IpMachineWise = "192.168.35.214"} + }} + } + } + End Function +End Class + +Public Class AppConfig + Public Property AdminPasswordHash As String = "" + Public Property AdminPasswordSalt As String = "" + Public Property DefaultCompany As String = "" + Public Property MonitorRefreshSeconds As Integer = 30 + Public Property LastReceiveDirectory As String = "" + Public Property DefaultSettings As New TransferSettings() + Public Property Companies As New List(Of CompanyConfig)() +End Class + +Public Class CompanyConfig + Public Property Name As String = "" + Public Property Machines As New List(Of MachineConfig)() +End Class + +Public Class MachineConfig + Public Property Name As String = "" + Public Property IpMoxa As String = "" + Public Property IpMachineWise As String = "" + Public Property Note As String = "" +End Class + +Friend Class MoxaStatusTarget + Public Property Company As String = "" + Public Property Machine As MachineConfig +End Class + +Public Class TransferSettings + Public Property Port As Integer = 10001 + Public Property ConnectionTimeoutSeconds As Integer = 10 + Public Property ReceiveIdleTimeoutSeconds As Integer = 15 + Public Property SendTerminator As String = "%" + Public Property LineDelayMs As Integer = 100 + Public Property CharDelayMs As Integer = 10 + Public Property LinePaced As Boolean = True + Public Property CharPaced As Boolean = False + Public Property BlockPaced As Boolean = False + Public Property BlockSizeBytes As Integer = 32 + Public Property BlockDelayMs As Integer = 100 + Public Property WaitBeforeSendSeconds As Integer = 2 + Public Property WaitAfterSendSeconds As Integer = 2 +End Class diff --git a/TrasferimentoProgrammiOkuma.App/Program.vb b/TrasferimentoProgrammiOkuma.App/Program.vb new file mode 100644 index 0000000..2076df5 --- /dev/null +++ b/TrasferimentoProgrammiOkuma.App/Program.vb @@ -0,0 +1,14 @@ +Friend Module Program + + + Friend Sub Main(args As String()) + Application.SetHighDpiMode(HighDpiMode.SystemAware) + Application.EnableVisualStyles() + Application.SetCompatibleTextRenderingDefault(False) + Using splash As New SplashForm() + splash.ShowDialog() + End Using + Application.Run(New Form1) + End Sub + +End Module diff --git a/TrasferimentoProgrammiOkuma.App/Properties/PublishProfiles/GiteaClickOnce.pubxml b/TrasferimentoProgrammiOkuma.App/Properties/PublishProfiles/GiteaClickOnce.pubxml new file mode 100644 index 0000000..c8aec92 --- /dev/null +++ b/TrasferimentoProgrammiOkuma.App/Properties/PublishProfiles/GiteaClickOnce.pubxml @@ -0,0 +1,26 @@ + + + + Release + Any CPU + ..\clickonce\ + ..\clickonce\ + true + Web + true + Foreground + 1 + Days + https://gitea.lmcloud.it/livio/LMEMoxaTransfer/raw/branch/main/clickonce/ + https://gitea.lmcloud.it/livio/LMEMoxaTransfer/raw/branch/main/clickonce/ + LMEMoxaTransfer + Compomac SPA + Compomac SPA + 1.0.0.%2a + true + false + false + true + true + + diff --git a/TrasferimentoProgrammiOkuma.App/SplashForm.vb b/TrasferimentoProgrammiOkuma.App/SplashForm.vb new file mode 100644 index 0000000..4d63065 --- /dev/null +++ b/TrasferimentoProgrammiOkuma.App/SplashForm.vb @@ -0,0 +1,72 @@ +Imports System.Reflection + +Public Class SplashForm + Inherits Form + + Private ReadOnly closeTimer As New System.Windows.Forms.Timer() + + Public Sub New() + FormBorderStyle = FormBorderStyle.None + StartPosition = FormStartPosition.CenterScreen + ClientSize = New Size(520, 260) + BackColor = Color.FromArgb(12, 18, 24) + ShowInTaskbar = False + + Dim iconPath = IO.Path.Combine(Application.StartupPath, "Assets", "app-icon.png") + Dim picture As New PictureBox With { + .SizeMode = PictureBoxSizeMode.Zoom, + .Left = 34, + .Top = 42, + .Width = 150, + .Height = 150 + } + If IO.File.Exists(iconPath) Then + picture.Image = Image.FromFile(iconPath) + End If + Controls.Add(picture) + + Dim title As New Label With { + .Text = "LMEMoxaTransfer", + .ForeColor = Color.White, + .Font = New Font("Segoe UI", 24.0F, FontStyle.Bold), + .Left = 205, + .Top = 62, + .Width = 290, + .Height = 44 + } + Controls.Add(title) + + Dim subtitle As New Label With { + .Text = "Trasferimento programmi Okuma via Moxa", + .ForeColor = Color.FromArgb(170, 225, 220), + .Font = New Font("Segoe UI", 10.5F), + .Left = 208, + .Top = 112, + .Width = 290, + .Height = 28 + } + Controls.Add(subtitle) + + Dim versionLabel As New Label With { + .Text = $"Compomac SPA - Livio Merola - v{Assembly.GetExecutingAssembly().GetName().Version}", + .ForeColor = Color.FromArgb(180, 190, 200), + .Font = New Font("Segoe UI", 9.0F), + .Left = 208, + .Top = 154, + .Width = 290, + .Height = 28 + } + Controls.Add(versionLabel) + + closeTimer.Interval = 1400 + AddHandler closeTimer.Tick, Sub() + closeTimer.Stop() + Close() + End Sub + End Sub + + Protected Overrides Sub OnShown(e As EventArgs) + MyBase.OnShown(e) + closeTimer.Start() + End Sub +End Class diff --git a/TrasferimentoProgrammiOkuma.App/TrasferimentoProgrammiOkuma.App.vbproj b/TrasferimentoProgrammiOkuma.App/TrasferimentoProgrammiOkuma.App.vbproj new file mode 100644 index 0000000..5523a0c --- /dev/null +++ b/TrasferimentoProgrammiOkuma.App/TrasferimentoProgrammiOkuma.App.vbproj @@ -0,0 +1,44 @@ + + + + WinExe + net8.0-windows + TrasferimentoProgrammiOkuma.App + LMEMoxaTransfer + LMEMoxaTransfer + LMEMoxaTransfer + Compomac SPA + Livio Merola + 1.0.0 + Assets\app-icon.ico + Sub Main + true + + + + + + + + + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + + + + + + + + + + diff --git a/TrasferimentoProgrammiOkuma.App/moxa-okuma-settings.json b/TrasferimentoProgrammiOkuma.App/moxa-okuma-settings.json new file mode 100644 index 0000000..8a2a882 --- /dev/null +++ b/TrasferimentoProgrammiOkuma.App/moxa-okuma-settings.json @@ -0,0 +1,129 @@ +{ + "AdminPasswordHash": "NZHINCSfx8Y4PePhYcXhbf/psJfiBfrDWRO0AgGnfE0=", + "AdminPasswordSalt": "QY9k9R4AmZvvj13geQ9N8A==", + "DefaultCompany": "SECUREX", + "MonitorRefreshSeconds": 30, + "LastReceiveDirectory": "", + "DefaultSettings": { + "Port": 10001, + "ConnectionTimeoutSeconds": 10, + "ReceiveIdleTimeoutSeconds": 15, + "SendTerminator": "%", + "LineDelayMs": 100, + "CharDelayMs": 10, + "LinePaced": true, + "CharPaced": false, + "BlockPaced": false, + "BlockSizeBytes": 32, + "BlockDelayMs": 100, + "WaitBeforeSendSeconds": 2, + "WaitAfterSendSeconds": 2 + }, + "Companies": [ + { + "Name": "SECUREX", + "Machines": [ + { + "Name": "M4 - N2LB 300", + "IpMoxa": "192.168.0.101", + "IpMachineWise": "192.168.0.214", + "Note": "OSP-U100L" + }, + { + "Name": "M5 - N3LB 300", + "IpMoxa": "192.168.0.146", + "IpMachineWise": "192.168.0.47", + "Note": "OSP-E100L" + }, + { + "Name": "M8 - CENTRO OKUMA", + "IpMoxa": "192.168.0.113", + "IpMachineWise": "192.168.0.68", + "Note": "OSP-P200M" + }, + { + "Name": "M11 - TORNIO OKUMA LB25I-N", + "IpMoxa": "192.168.0.88", + "IpMachineWise": "192.168.0.223", + "Note": "" + }, + { + "Name": "M12 - TORNIO OKUMA LB 400", + "IpMoxa": "192.168.0.99", + "IpMachineWise": "192.168.0.66", + "Note": "" + } + ] + }, + { + "Name": "EMILIA", + "Machines": [ + { + "Name": "M1", + "IpMoxa": "192.168.30.8", + "IpMachineWise": "192.168.30.221", + "Note": "" + }, + { + "Name": "M2", + "IpMoxa": "192.168.30.9", + "IpMachineWise": "192.168.30.222", + "Note": "" + }, + { + "Name": "M3", + "IpMoxa": "192.168.30.10", + "IpMachineWise": "192.168.30.223", + "Note": "" + }, + { + "Name": "M4 - CENTRO LAVORO OKUMA", + "IpMoxa": "192.168.30.11", + "IpMachineWise": "192.168.30.224", + "Note": "" + }, + { + "Name": "M5", + "IpMoxa": "192.168.30.12", + "IpMachineWise": "192.168.30.225", + "Note": "" + }, + { + "Name": "M6", + "IpMoxa": "192.168.30.13", + "IpMachineWise": "192.168.30.226", + "Note": "" + } + ] + }, + { + "Name": "SMART", + "Machines": [ + { + "Name": "M1", + "IpMoxa": "192.168.35.10", + "IpMachineWise": "192.168.35.212", + "Note": "" + }, + { + "Name": "M2", + "IpMoxa": "192.168.35.11", + "IpMachineWise": "192.168.35.211", + "Note": "" + }, + { + "Name": "M3", + "IpMoxa": "192.168.35.12", + "IpMachineWise": "192.168.35.213", + "Note": "" + }, + { + "Name": "M4 - CENTRO LAVORO OKUMA", + "IpMoxa": "192.168.35.13", + "IpMachineWise": "192.168.35.214", + "Note": "" + } + ] + } + ] +} diff --git a/TrasferimentoProgrammiOkuma.sln b/TrasferimentoProgrammiOkuma.sln new file mode 100644 index 0000000..496a181 --- /dev/null +++ b/TrasferimentoProgrammiOkuma.sln @@ -0,0 +1,34 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "TrasferimentoProgrammiOkuma.App", "TrasferimentoProgrammiOkuma.App\TrasferimentoProgrammiOkuma.App.vbproj", "{C8229DCA-6227-47F6-BE2B-8698EF104AB7}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {C8229DCA-6227-47F6-BE2B-8698EF104AB7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C8229DCA-6227-47F6-BE2B-8698EF104AB7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C8229DCA-6227-47F6-BE2B-8698EF104AB7}.Debug|x64.ActiveCfg = Debug|Any CPU + {C8229DCA-6227-47F6-BE2B-8698EF104AB7}.Debug|x64.Build.0 = Debug|Any CPU + {C8229DCA-6227-47F6-BE2B-8698EF104AB7}.Debug|x86.ActiveCfg = Debug|Any CPU + {C8229DCA-6227-47F6-BE2B-8698EF104AB7}.Debug|x86.Build.0 = Debug|Any CPU + {C8229DCA-6227-47F6-BE2B-8698EF104AB7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C8229DCA-6227-47F6-BE2B-8698EF104AB7}.Release|Any CPU.Build.0 = Release|Any CPU + {C8229DCA-6227-47F6-BE2B-8698EF104AB7}.Release|x64.ActiveCfg = Release|Any CPU + {C8229DCA-6227-47F6-BE2B-8698EF104AB7}.Release|x64.Build.0 = Release|Any CPU + {C8229DCA-6227-47F6-BE2B-8698EF104AB7}.Release|x86.ActiveCfg = Release|Any CPU + {C8229DCA-6227-47F6-BE2B-8698EF104AB7}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/clickonce/Assets/app-icon.ico b/clickonce/Assets/app-icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..82808fb598907d5aee4194fd57e05d17a3369073 GIT binary patch literal 9868 zcmch7c{G&a_xL*-W1p;JiLp!eB|;k6iwIf6SW>oZ*|$NF>`P3cNGSVG*~St>7`rT? zY(;})C%#jk&pE&E`ThMnznSx%dEfUw_qprb=XvhE001I?|9(IK3h)yG09NvStl>>< zI%*DT@-3aNj)u`+=-&%YLH@bp{nqL4laG=1HK2Tu>j(J(dQVMX4FIZ=Xin^48-AFGmZ6qk6OGjgonOXCe8goAQ7nN6+qExe^;JT*moK@>> zkI>_hOx31h;=8qSRrSgJ7^1zGfq#zbmzK6V*U570SBGvzgHI8RLa$Q7QI8%$VAy1A z9)Mt!Vg{~(qrqq$ydeOmLQ(^~AaxK*03!lCg3|uK9t71Zvg;gc<=1|Dvxk0CmER5x zf+LV2n=zShPqVn!b2mr#i~n@Tk0c5%M}rYasna)KZ_wjpbd_V$*{IRzpX2XK){YOp zycia~{P4>kmra|{Iv?H3c>q+SZ0@SlnJ!c9e;&IcY6i#SzjUdwg{muOrZbUo@s$Nt zS-AjNa1=@e(6|PI!>NH3LjW8JMhh@wvAF<(iVXT-eP}&?wyV9rHO(WpSOh$R!BD^+ zXZY*2nxJx}pPj+Jr`yW%n00k#EIJQJ#}R!u^Mb?b)KX7@LGjBr3By`ToZpcUZeUsdO z+oHr%T6d$55|;Z2b5hP;2MIO(Qd+0mM@4>-yMNRA#5it0vm`29&dN3IuOf4PC@nz8 z!!@#$Tt*D!5^9W?+@o2v~2he zG}a{Frj_FQew6mxH_Bjp5K?@$vR8m-##ZJ6%;-&i;*%gx=PuRzO@|P9`|c25G?90D zf8zD=?2R$30=Efd?j&@_!-VDjD0e5>mXt6&fAHqKKHb%0%Ypl8cz$H~ul(r)p7_>< zo4e0=uDr`hqi6eoOhMry3Eo|6-_~&C=0IdPX;`6J4!^LKPun4@14M>CX zB}9cWPy&Y45dki#p(#s z%?uE3Du*YU)4m_S?G%K+s$g%T`sa%>eEFxIoy*b*U{|^k#*~|(3-SXCg3MUYT)+`< z2yr$ioTl~2Gv3K(eut~sm@cGfskM|1p+*N70x~H6Gu(Dsj~or|QhLO7snFq=H9{TH zrP}}mC!3GLvD;Q=WG)_M6EQ_~0gUM?rX&Bs@&LuiQWa+ni3_a>U{J@eHuDl|W#lfQ zgaz!mRWLt1D7^d#ya2zm_U0Fg!IpbeXK!QNjHK-SNXc{J{o2Cin%l&t2S%ZK4&^j&w9qvh`!1i zB!yFx@!g(z;}+A|a`viNhY6L6!6x@2Au!X%pBkl~<2`kYf}uQZR=#Z;-gRehs8SXP zu6$(>82;RI-^nN6uLjxe5b7yBz#x46;~DvLiat{_Yg?JGh7v2Z$N@|PTuWS#beX*V zf|D8xL2BQK>TMb!X0#~z-=@@i&isC91gMdD_=iK@y-HQxb1-M~avYkr3+QABq9_Bw z@DUqPT4u=WS5m`=N;U_62G zl1k^5Rb)`kCYpe{zB6vmHi~5jLcaf}XEY@}e{S*$o?%DaVGGkN=2WT0j;#1n5 z%h8kh^UkA_0WV8iwBz2}TnXdYMSy@LEU0q@3tqtXm+i|#u(|9jvjur_k#gs7J6R2- zg>Y;1OK@b?c3AR}8psp4e5RXEu-c|+K?SKhBQ-%O?3IUA(<<*fM8E{5WcL-=W!P~7 zd%+h@BOVceo)B`Rasi)nFWcDMk!Q#JVQBhjl4Fh{L$n$LDm z4D%WL@v_D1??~5AdwQ6FR27CQdJ8+aJVi2+g@>s~SeT7_83ei(_^0bCGeB8Q4FowK zMm9yhJaxbgoOkUrR~+xD#5BQZ(-hMKJ@ycNinKkyj&w;mE#Ap^?(c zDl|x8Xx?b0-L$kb&QGBDHY;5x_0Gz6!*pZ;v92q&Q61!oE(AMxC96;@c^zBXsd7oQ z={*JG*pqv%qm(RKK=hO+f5&`iE3_f{73)VV zS$!q-JXx1g2TL@PW)P>GwKztM*y^@5(zD~CyyGl`x2)&RW6K#p8gW?`(v> z*&5&Fw4JokV-hY4(bTuxD}2%VonPK(j(!036thxBYVoxB*~}0XAfDVaW?$se6x#G6 zWMA23ho5tNf$i1EM*btUcJh+Um2$T|=8Aim?l17G-F5e3Qs&Eq(78l{2=V>e^4oot z)7dN+iuI7uRYLFi`M@Q!u-S8Q2m^6Z^m0P3s{!XVW)l(5B z9Yketr;c~+>%H02ls(2KM#?FSc~R)A?*sB)qKSGCA z))6SQId5eZfcb9NC3gLWxz;K^8r zA>dt`2@a^|kL}te1R?7}+-dx=ymxaTfs+v*p(5NrGcGdJtq1|7Qiiy(`0? zBxl5#bW$?fY*+Mf*i6~ANWtO$2_#d4@;+$l(;DviA9Y0WVGHR1=`^r^JZK)!x{o|Td(o@ z{y#{EGO^V8|@KNBdk)$0<_pb0VHUqiZXrke# zt(gahhB>NdhXlGSd+&CiNsi@gI!iiQzVNt@iv}-BhM6drv(|~S3$h>2n7tNLKcp2z z&eiqpxZHwX1Uz@oeNK~n3~hlix*1CGhqYG*C#p!i_hk*bSon4W z>tFy`ry2UBeLLI5(dHX_jFKGO2tdr1D0RPT;OC&nm?K{C|NgT)czKKZ8?n(yUt0*? zei7@BN-EJZdgKbK(s>z&Ml~yvEc`2FpZ+0iiYcp60fmo?KSclb(~yjaM`jiOczJ|( zWm)a^0(MS$DNjexc?b(-OjrEjv{#+y)b)W{UFvOU@iKCuCaAzf0n!c!81@>!n&z4$~BO&K;E>wI9Xl^r_8FQeo zbUcWgrZzy#8gw>q@{nEk#~Cg#su*NpqC3Xo&&&(``m zfe{}TH-g8Mc{U7r!i$X#*L%*4{3Y9L2b#BL){@mJUEG&HrgKU?oZYWmERHDaT&mIO zbjp%`$Own_tv`*}7a?AtDPRE_ced5)YhS zj=e?Bn~ggt#CJ)YQ2!fiTMfa)mc?#$?Zd;1$7XT8~ zl_PZx%eSszojN01^~s8N_j%MLCJBD$9{w2C9>{5vS{o=(y9c}W?Gr!xt{^+&;X8i# zNHs(dKKDVd*Ip5qahf1Fa5s)7{U$JS=kk+Cm3r3CD(bCw7>IVFVT6IoPgjW;M=4t|u^)F*mlXb)=Nm*#hB{8yh$#073PQWa-SoIJ2 zwgf(Xqe|BT`Yl40%fO+|pU28PGVJirCht_RyQE-rP!;Vg(6c33pXaQ#;uj>+BJW_~ zxNQn4z2u&Hz5)c$|D%r*x;&`-*kPtK`$~h%g|~B^SdXxM`vLTNd!52;sdXI97T7UC z(~-7saRmK3DTLLzu?r;Nd8p5ay{XMT<5JrU;0e1`(}T0!93(5~Abqj`BS`(5VTl>aB@l!U&{It>bvPBMXTOI_ z?AV@I+Haz$t&V&fatn0T3Z)uYM73PMF43!YW%Gk>u#iyYy?m8P7Fx>ML8rOIj6}-X zS|C@TUM|d*M#)X#Fn)dH6RpDJQid3&*nq>4|KN-IhOC&b)J7(8c!H)f0dgS9@iZuL z+cHI8G|834(iF)3Ama@AUAx^_`WXtS&DIbS)UAW6#Avzw+|;eZsiOI|IjoaQVD6jq zVGdf(#4e4O=v<8;G1O*q&8^x}0GApXq6#%WZHoShryJ_9)a4*8F`JRz!W zNe1edPr28lMh!SHvdR8xw@fARmk_uRQww%QlDGUuxx&~~$+PZ9%RKLR+3r;AspdBM z+0=}rf-xL1hy8!8d9xk8uqa}Wg8bHg{e7hsM(wNJdFCJLz@3I(d9myTHj zcUZk}=-W1jkvNy_Nk|&NRkguRItrnHNbgG~ls_jZa{_PJuxG2G9@R3Z&)ZzJNF8sA z&I;(~58g~X;MjsM{Sit1Kn=(=xQ)7wDxUVTiQ3ScET{C0CH2sSkJ3DDl<0d^nx z{(`DYcuBs=UX(-T`|xq?@f|tg=1NW3?_$~2ENo9K1GWksId$zJrjn#Y>*kR zPY&A->!L4U=nc*VSy{v30XZtDF)2@aRs#^MzjgiFtA_Rc%!=BMxHi>!$Pg-1u_*^Mqy z6S4${?KE4U(s(G)eis=eA82q#Em@z#TJ|eH1%khXBJU`*nW*VCOLLaT?!|rc&RHRO zngbp4>Vk4GuuTuC-1XZoz^CV`6tbfSlpMiA72|S6B=KumW%SU z+jclJqNE!zlYXaTX#`+rn?awVLNlCXRxOXz)kD&e#O##?^XM+T;(2u~g-8 z?(pzEoJA^8AVF+#-KMC2D1Q2}n(Q9|Ef&pB)aYR8q3ikEx9Mqf$1+1A^geG;{G6e= zUmuT;Te(wiop0bMB{gR`d#Q;zQevi7aNQ8IL|0N*{~{rS1;Fy5jG!U6Va4^r7)Ff; z%kPEsY|yiDcVWkSy6SGwz!K0DYLZf~?JG&d0uB~?6&u^==U_^obKoxjBQN~E)&uZ^ z@S6P-X>oBt1kAS%wij8*SA0UEuQi_)AnJEEuwh-AN06Km6{HRqURlU-(*2sfvFZ)_ z^fx|d`Qzy^r&h8D0%az&Q1ZF~xP1`|HvKuDp}>vBri8?f;7cP^<{$Oa5IAYD>*93P zFLPz8nhRei$KFP=e$IICyQ<%Bn}u}o7P0A%hs#m*nbGRpan+0F04oy;+JX*4d7YP| zKgla1_MlzhS5=PBImyf&Fk*PHNegrOt>A^-1cX*?sg9Y7I!a*kyiwUG8~nEY#Sv%R z)1jm9_c`=0Kmi62gSu+2^JH7fI%w)cX1y1Hd3t~Ki#jm8AJhYp+R*kg3KZAmj{#kJ z*Dld1$5d#}6#as7SJ_6neq7`+0K}8`(->?{RCPDh4WfsO@q2EcS}ta@*39|z8Z`L{ zKV2OhbtyqA4EsHNdoJ{_wQTx#awGg9<3sM1^F{v4(+}&PizEO*KY-H!fHkNj?T7pAAiJgNG^f_%{8e1NPA|HJuwQD@+$GYmz+ zF!6m*^TGbHX%%SZqmV?4KJ6Zzj!jy{h@CU0MU|D5`!ExF?Q4Fi|L{(BxU~tDXyAOb zTfp^T?%WA`@trm2IX;4no15TuNdS-tuZxL)tT`SHt9Nck&54b%3Q+bstJ#9uWf(nX zF8yloFrAe(Zb6GNWvuq#)#V0AJ^1DQXQp%gP+maV@VA@?fN7l+fW93TvMraZ4gh&u zA|e-jWK(1!(rsq%Sv+KkM7?_K{O2kyPv_O=*Iq(r!dH8FoCPBp0RWPDBUX?gmJZ^X zA$3HQuwkg-tW^c(B~f!%%STcEnAFh-T#N3C6NZ+@7r0H!1Nw#t`XkUzg{JjGMrR4z zMhd|Bx~0L$I=P*{l+8c$wViFHwU(b}lc_ezs^9OZSyxhxV>?3=hV#vSpKMK$Qxv1E zlF&#NEY5NRg*C(s58E+(hC$RarZ)<)xfSOhTb?&IVl6yN-FF@1uh0sQ$@J_fh236M zl}7G8lkf0Q-vT3|xKZvLB2<2S9ea-3cheoG76+IST~8GP?>xbmr0$z{g9clDvXt&! zsNOH$-NW2t256_Y97F)HV?@DSM$^h%YuZZVThkj|7T!Zuk8vjwvciF$O!2u@hQpa9sdUnzlg-MD9ZZ6t{N>9=RYhlMH-raXF> z)L9}s$CHgQtGVipW#x_CS^udSWi*ID@KPxE^j1&9XW@=&Ci647B%9ngAIUJ|*OdAz zF@58rdq$9Xn&Lis7>fVNR*x%m;dRGy=HZX>+~RYOK<8YLAFGVR%1KhQE|QAi2Z+l% zeFxT3J8y%G6W&c0i+yH^m9&@mdq6sH>oZVrnM9A|0ZaJWQRzr5jvY^{#=41*uBiyR zEF+rrSZ^1Y@@eGO_-wZX|L{D{+0l`l(Fh&ZcIns_U;AE1yglpTc-FhPyqofnoWOr~ zTfy^SbUmMq?TV=rL%WDTkkxk!2dOBK!w$@zr*}_(elr0^su4}gXtD5Fy*GB8<*mQ$ zM(1}ogBXh=GXd2^Z!z|<)o}2KpG7M94o0OYXV(>}%x^WALM<|eD_2K^$70DPhr(MW z5%E`l(mt}gRju#F$M=d!S{<|n*j$?#&`6W?s7}OWRC$*?!N$8U_zM-SCa1Ewn9gr zlV{g%Oqe-dfdz{I+*M^fB30s6kKeWLJ#(j8Y&wj3Yb2qnT|wO$7aQfRs#Cx2+ACHq zV0}dx>kH~Viu0bwBhm`1$(0kh%%tICt=7s*3o2Q!U%%ywPmoTNRN01v+-5GPY&7t) zV=$94Nq+vU+C(;X{YuQBCo1oQxj!9xXF%7>^fX?$T+YPmd`07O3Rg+&# z(w&2JX)djH(ZX`k$r9PViioJs*j`e?^n9CDZBr$4gv;**sW5Uj*X^F58-A0hG?7## z9fooh?IXsrQ={84ipfR$aqSZhLh4d5*l01egZZsb7kiC*br?CrGT`Bi#&}7(3z6GC z_R(NN%I$u7ouR~s<9C_4(9BEyXmT;L+vMg9MY;h|iA6MG)zS3?eHwOnnQZd6Oo4^1 zdb$1@l~R{d+Z~)-wXhg-BdA;2v!U|lQ@NoT{>DuIw`ova)l0^&b(cIcUonx@r4+T4 zS(>sXC)I`ZVtDn~+WjIO$k_h);g9p73ba-)U0-Ja=!b}lZ|e|!EVS(3c5KX+HZ%TV zQXpWISGr(&*?yZ&1IT1#6xPlZgdYM?FzmOQ((+!suRwhG=49ZXAVcUodt49IHnJ#% zBxc_PNoEzDcm0;E?D5o|&bzo$1SM83(WY@~^G}ZZQt<5E=5?U~k!>s=ds^7<3@7FT zEAQh{El5NPXh00}B<&;z$C&=l+Crcd{~33JyW+{R@YrSlwK|FyYEY?(hF-r~7z~}- zmhuiy&UwCoH?|{LmvXKqIcuFmFAUucB2rwY>-&iQ3qwGuhSiU7;`dq4;T7i_zV=|4 z#+N*l{}#ri|5`aVLK|xd3XGwMvau{9z2S@l$XS+6ngAI>C?U(joaVih%fZy7%RhEl zLDJwikQ@9pcggjccs^hg0P`jhA(1a|m-;!U8Z;-MOZ97HqL%S0&;6bGux)v*ttxY{ z=g-XzmMr0>u=*JAP)8SgpahlDcapwz1i74)|HW_lmorKglmxYZ^iD6(eHR?}GPMn2 zk4oYtr$Dc3h{18XSk9NM%J|0lbYW~Ljh5=3HYot9JiYEWo-J~FvR1U}76CxH2oM}} zl$fyqdYlIikvU0?{)@l7*jq`> z#Z&-#_p8(V6O#-ugzKzHjSNWxu#0AG_h;*AFVuaZOqiHco?oPoMZ5bIGjGT}S(uR3IdYT0(m5=$i(+Xf3+nK2 zv|GRekAMVo_igGth`U++S5rJ-V8NST0VS@3gzR&@dvDPNsCA!{U2$y*qs=@yiXhW( zg`y~0WDDnAs6g0B>`SglYzxhBu&`P;?`a}&6r2RiKQ_lUv!>FK$sMp_k#LZoP_eum zfyN$@kR2w*Pp*`TTnAEf{V%y&y`(JFT@Y=v&jsWj-5BdLcy?sIy;m`2PWo*5ruLcR zuHbOh9=NjBDa(pA>k^`_F~j6kTbwyM2?_2#%3irhPmNaBkxqXNT^N;L<6{Fg2G`^z zTtA_~`^oQr)6Rd%ElXzsj_Er8pJ5$P^t)$QYuT_o4_e05Z=v zEzbxyc3EdKTc?n0Jn{I}Jnl+MQl>^1&TFpy9d;ncY-}|%);B)0v)52zbdNngj3H}` z>07pV$>dw{YBFQaWYM9oqU~K=vn(qE66Q{el*i6n6$}eYHJ)8$J9`Q?v=;&B+KcjV z)6<2l@v?uc-<8cwu0^+T4*cn94B>+1_8S5mkp}A0buiHPQVE$Zkm~7@_-`r9x|K_b z3M-WcGuB9*ETSsi$1&3;AY?D5&<=k!p%YtEe`c)A`W~`!i3^60{N7Z%r!!2R>e|!1 z16E-19(k0dZ;$YH;$5Ylj7SG z_d?D|7yMAE+bZA{)0N_ z?@c=cZv+g*^@&%>Sp>r~kXt3U@|{d;SVY^QHMn?iB-c MHE(K^U&BQH4{M37C;$Ke literal 0 HcmV?d00001 diff --git a/clickonce/Assets/app-icon.png b/clickonce/Assets/app-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2d249d7b67f0fd5cd8f80f4dd0e7e4d86fe94a0b GIT binary patch literal 9846 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 + + + + + + + + + + + + + + + + + + + + + + + oi5lS/pRUXMeVYsdA+pak8lcLEA7jh6YsTIU0y/JugE= + + + + \ No newline at end of file diff --git a/clickonce/LMEMoxaTransfer.deps.json b/clickonce/LMEMoxaTransfer.deps.json new file mode 100644 index 0000000..66ccf38 --- /dev/null +++ b/clickonce/LMEMoxaTransfer.deps.json @@ -0,0 +1,23 @@ +{ + "runtimeTarget": { + "name": ".NETCoreApp,Version=v8.0", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETCoreApp,Version=v8.0": { + "LMEMoxaTransfer/1.0.0": { + "runtime": { + "LMEMoxaTransfer.dll": {} + } + } + } + }, + "libraries": { + "LMEMoxaTransfer/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + } + } +} \ No newline at end of file diff --git a/clickonce/LMEMoxaTransfer.dll b/clickonce/LMEMoxaTransfer.dll new file mode 100644 index 0000000000000000000000000000000000000000..14e363d641349de68ec1ccb3706bb6067957c360 GIT binary patch literal 70656 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 literal 0 HcmV?d00001 diff --git a/clickonce/LMEMoxaTransfer.dll.manifest b/clickonce/LMEMoxaTransfer.dll.manifest new file mode 100644 index 0000000..d39ae86 --- /dev/null +++ b/clickonce/LMEMoxaTransfer.dll.manifest @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 3v/2JePabKRfZ0iw+t9nxGWMYs3Sn5Xy0OtlTNlsovs= + + + + + + + + + + NM9t8/K8+c6z60ZCFceDhUGaGAJUWggXZzYw0ap3wbk= + + + + + + + + + vrKGEd9S1kba0lj1Dse7EraF35cGx7P3QeERgj0t9sQ= + + + + + + + + + jNXxFh3PRnxb5zDA++I58M/QVn1Fk7FQXBvcrYmB17w= + + + + + + + + + XHvEaaUXpCqo4cYw+kX/5yHnVAqbvb/DMqmvXo45vr8= + + + \ No newline at end of file diff --git a/clickonce/LMEMoxaTransfer.exe b/clickonce/LMEMoxaTransfer.exe new file mode 100644 index 0000000000000000000000000000000000000000..70e94e8ac5a24642c1081a61a73e40742396ea91 GIT binary patch literal 161280 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

-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%0AcH6ECrJf-X12xB%aR5h#6Y64+!=s&q2 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 literal 0 HcmV?d00001 diff --git a/clickonce/LMEMoxaTransfer.pdb b/clickonce/LMEMoxaTransfer.pdb new file mode 100644 index 0000000000000000000000000000000000000000..2714e934be3ff1a5da48f0e19933dfe7f4305e87 GIT binary patch literal 23004 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 literal 0 HcmV?d00001 diff --git a/clickonce/LMEMoxaTransfer.runtimeconfig.json b/clickonce/LMEMoxaTransfer.runtimeconfig.json new file mode 100644 index 0000000..ad83f36 --- /dev/null +++ b/clickonce/LMEMoxaTransfer.runtimeconfig.json @@ -0,0 +1,20 @@ +{ + "runtimeOptions": { + "tfm": "net8.0", + "frameworks": [ + { + "name": "Microsoft.NETCore.App", + "version": "8.0.0" + }, + { + "name": "Microsoft.WindowsDesktop.App", + "version": "8.0.0" + } + ], + "configProperties": { + "System.Reflection.Metadata.MetadataUpdater.IsSupported": false, + "System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": true, + "CSWINRT_USE_WINDOWS_UI_XAML_PROJECTIONS": false + } + } +} \ No newline at end of file diff --git a/clickonce/Launcher.exe b/clickonce/Launcher.exe new file mode 100644 index 0000000000000000000000000000000000000000..5ffcb19c23120df9487b7a5fbead019eefe0a10a GIT binary patch literal 16384 zcmeHueRLbwaqrv(umAxPCa5p!83vv7I`7P1EGm$#Ha&llZ(OFKya1 zCp~FhyT6&;1we^T-9O$R@4POxvv=msojWsk?%cbJtD)OJKmj5O;(p@|qA%jf*Fk~5 z9xR|bzVWFzU8?)5O>U|P&RRJm z-Ov!d))RfCk7!T@=!F}<@si)$_h>W4R69`@C=r)>;3%F++;`z-?UHzCuHGn-&Va8! zzzsTI8r^jtQKS5;K0VZBp`VTujd1xcq7SeWuDlkA>Os2}eE9d)uVh7aX%hi{xTba5 zG0r)_dv^n%PHgq`1}0Y$TBYrhodqVk-Gu@hx)*oNbr23o+eY33BkM{FxLMW#+%?xh zqC+*P6qD>%T&$Z$A!^e{%ow45lq00F@kqGj!hzT`EuK`Sl< zP+>p7CAd3ie}PLOF8zc{FfVAgD3ron`XrYS0zvyVF4b|VsG$_)(xT)M=iCN4!oC@n*2)dFk?CVvE77gnIu0y{MN zJ=g&g5?Ttn=}~=t6{=FGkG6*O6g1ac^!a9=*4CiUulAAF<*Ak6Ym+w77N6VRg&tiA z2U%J)mV#6C)|lIpMaIG@h>U_Hl50q9TDZkkLAsXqEo<8Yv<-S<_!BE+B$`wcr7#kD zYrUS#eTJwrxT^kg_;O&|Wm?%1L5+e#_}aLU0VR!(*!v$0od#(5lX83#{6%Rz~#{Mpcj5C(yE9Z(XBRUDMj&nyK6OaHVHqSS;8c z4o6b!&{0EOYCZSuxvZ{**tTKx2NxxTH~Mu9xt7`hwiJRyk7-RRwHpP8>GhG;hRAaJ zF?3-elju<~Sr>P`EqTQiSg;W%}Dpi_Gn1wc~E(AO691sf9D*AX2`x>=b@qLssV zRJSleqNU9&=2J3~3oOk3COTZ;(6C?O5)YgGBQ9|?v~18)kQ;5;tOZina$&y~2&T58 z5se}`Fz2H@(0WVS{slC3%kT7Ltl|LGUBqgw>2oc{{|3myY)H%_ zHi8!S*%r~qzC9ynBQ>4K}o zL82nt5Tc!EgCS37tKJXkYU|34(T`ba=_j_be*3a;S8>^PIwVTsIG|SD5B8lEL@EP0E!fIM0~q<;UiusCx@qa0joisgBtW zitM3#dCp9^+NQc7uPrvu>9_BskFZ)E<`$4)C~mUg#-IC;jqrOfEKu z6M=qNrmX%-ivq?oa>EvibAP;EwRX5mKaZn{TJ(qfyccb)eE{_lJFfdFwoywVRq0WU z=a(Ma-Wsu+E0s|#Dmf*#eZ@RRqT({`6D1g;pXUhF^>7KvMsKL&3RwYiVa|& zYSct4Q-q=6OQW5;syXn(Fbu0{LWXPKt-w+}kQTK!!*jaTi}KdC;I`%4LslQkDd-oq zN2TtjCF|ZLb%&R%yCii3sH<<%Qa9u2%DXJ|TYxt-1>9^U{cH%c4uea|nvuGpCF>rR zIxHnu>z*2^P}ir9RLY6et(9^pHHtF)-5-9S^^pBF2t#IB7HkTp#!w+DuUr<|p0uM8 zDkefQ-%{hK3MWDjOLZc&>cp~8BE%W#+jcM5#J`KJzK6*YQb*C&ItFl+t6Tc*C%~o& zOdSVHOTRXcQNp%{n`4R4WlsQyQyk+se*!#Sq-%mSr!doaH^Vil+W=bYbgV(waj;%q zQA@`z2boCU_DZ;g^RV1iiVX zg;U6ldVOROC)B-)Gm=7L#Qa;th(51kgvfSqE(<1t@5kIy%R-SvXk{YwfSJ03?K}zK z5v)5=j_U40V*LgX%!@-~Hy={63wHO^XLhCA)1B>|9mp!2gYtl{A=zx1Cz`>8d>@q9 zGUnK3VYw;bi4z=(nEtY-PvXg4AHoe4d0#@SaU)f*&$+$a$OrO-O46QjzKQZW%i|XHp{9DB zE(lzwbNTm!Ux+QE9yHSFd%?$bodWu&>U5e6G5n^$jRLP1_=vzi4RY-^f%gP=Le9m8 z$09nF6~jXCpJO_GH^A_#QvP}!(|;lG^#GTD7Gk(9dOzg!#u<(US)T*3k3o}<0pqdfx)#BTh}>@Q z?WRv4FgJ4m0qerw2Vy7Gv4y|Z+EE@1F#M&?@YppB-xp@MTguPZbNPh^h9`vH80T`2 zV%RK{fRslfO!=E=G?98WA1;DA+}MD5?-O*C6AteaGOJMp`S_1!@d(-SvV!L?72Rt&u+L zVGrpq!{eXyunp0$mY_=&Ow*Rp&pphEg*9w7u{~n%Ix$UKNrwe<$6*!SE*Se|1+AiU zE=HsE3K?v08@Ibap$5ig1bdL4j=Zc^(~BOq5Z1KSbP&5Iw&6$NxVDBK_ptTqWwnOZ zVV&c;`|BBd21^%XU8)cB<{N^2h~6FOqqX!yukLxhNn1yUk?EQ9Z}im~c67KF=tIdQ zB{dmz!Tyl0(?k)$9;Y3ebSBt~YQL7Qv^%XG#JusPd`b0bSk-W`%ZxF# zfp@Fe-vwMu(VvAI8x_3=tFWT~5oWjstCXTZkl|L1;XSC;=vk}=E=8jV@&)$qNI@DM zMK)73r86u@*=^;@scmb4f3dWCMNS!Qefi%M9Wo-vmB3IFeFF4wfF-;Dtu*>~lmm1i zKuI=|^Jr6p2KtKuaMM%583okn$BOGWz#@%alU6qX2B{5lLi7)4tB?cQHT1|z^$}TO*eGXlk|`_0nQIM zOw)k+Rj`OTGp0||{gB*9evI20w{yD%`wQ0a>(eIzoYLw^HT=Xfrpw`9zg6h=msugv_J2gJi~WR@IvxKR;GOy}=@GROI@GCu zZHTBkwJ{P`7eu#BYFJwi%9gq{fPWjG2G2FoqNO>d{QfIXA~yoF8zj!^;d4!Q)G6?lrCLmAuHU;yjUf)-To z1-z*4rdaTzx=6c&-%}5PLK?$fjcY$C@Irto$>2u;p9yl?K6(o6o>uqLm*LwlqxF~7 zeYiK_YrxHPoKDeu=!5iexfQAgJ!7(;C-L(3gPsstkQco>}^1c^XI) zOrNF~;`}t}X|xZiQ}kKxb7Ap!eEdp+On}rDTFhk}W7H^F zWjkver$H-|8#E{Fj6K(P?l@&9doxakrVVGJJL{NdGLC5#gfxRTQb79*&6cv3oi`_G ze8x61IqI`*%l4)AXUx2j8@E_CjX4?H8MLO+_w>M2k5!m5r^~jHqh6~#nKy1NTMiIu z?>T7La-|jVIMd(F>xr9J%uj%O(UP9 zsa~^`&Dc2_&deI6VkT=~C`wMIfC6jfYfAlQp^Eesa*N$VW9E6onyPT;jJ)9(edo-Q zgRUy%K`VQzg0RX*3uYF-k%{_481l@tLC`~$!NLYn6t+CT+#3-;9#uZwq`xbOg{#N`|K{2jM>Tj z+&~V!n$8^aNZpJplLj;8LUzWmCw!aOiDC=02~u+GN*N+6M!T>Qk^f#15)JK1BO#07$P(E2K898ll&||movstCOg9ze)QxC>Z3h*%VotZHtZ<`5xbOK$gwvv zC0M>F4~J_YwV1K-%v&XNE8}I*jB7mkx(^vnhUZYXgD(w}Wd|cZ-tA7KDv3owfBPn* zVA#+YkXb5;X0Fb@0*5WhrG$xV6tHIa$rVx;Eee%2MUoS;`IO}?7g%Rp zS_Z49+h&O@&?5&K1`64HIcIdUvXohzD}=@g%&+tXbE*;=M@zMhPwKbwIl~r=wesB} zgd+FDV_98HkJ=^`OQujcD~(JIW=f8mBYI|x>?zj--~Sc6vBuC)#xBid^0H4DDw%nL z3;39Z2pcHLmcfk)kJ7d4km-yRIfcOYUe&m5&e9>v${U#iM4AP5ey=slCDyg4Y}-h? z9z_Q6XrWXt7A+fzs4~H2{qkqKH1vW=%3j8=C3$jvk{7(yJfE&{uE@Z;Dl@r8;35)M z%5t$LaaowX4rF0c#2rIK;OC|5Oq~L|Q zY>9+mvb5U`8zS?DQLK)h_=9?8GPc{PyWu&Ed2QI3-tLx=9e+~f@s*g2QrQQhCx44dx~G7DI&I3{@&J#6F=cjOH^lAJA$aW`zliO(y-e@153 zL&kBU#w&{7Tod{&Y!Yqa9pzb;nHPm5GRfebC#88804NV%Aw)7SPQK;5P#jLAY>9fYc+4F#uo7X1j2IX~x-J=6tB@;UCn;M6!wI(Px&ZGVM{cRAE=8;18PC!cd5`ntR+17{}Q&$}!6A)^mLF^6~S zVJy!hwu|9ieBr%gI1Jd2gMP>H@okj)=p;UsAn-v!L3bounZg zJjkMKq28@KiS{NHC*T{0^{5q2VnOeK_bLO?2ab)`qpuqMtHs zV2K&rMXyJ+pX*uFgM~gEP`DNIy55=vHIM$1ptBUV+!PIx@F4qZR=A5|JNu9=a(%*D zvo!Yc9PJ0+-S{EsUZUdzpq>FeFH(~j5AN9pJR&l)=!yI15n%s}0(V48imrnkw!+5E zo^o*WIKZOPmEK<3i?)nN61tbsnn%#}50AU+C5{)isc*#k?pDxtOO1(w6{!j`g+eSahoiLOVIVl~&_66;txLiRH;$@(K=*y@SB`g%Yu`#sXw?=5K2nSs zMb$Q@)b?HzA!k`W`~R)W=b6VX-dsLMEc+{o+tr1mbGp{9k*ntv-V>l@Qep-xCPt(v zQaJ9|8ukyD3*d6&zQ&HNS4X5j18caB9v6S{ykUL(d6GnYb7Zmi4cNwcCMUXZHgIj> z7-4JN+2OWNV=iEHudD65YUvWuST`%W=W!arjh|`AopK_T%Qi6X z0bhDowctnb7WkqM)atCDx-|In_~VkN<&LXo_XPUp{!GbAe*QWNNhVRpQv5xl8+-oh zwSboFp%)(I`P~bd+>ZNWtLHFMOZ6~-G2v+B+~!~&@G3$#F2y+xF3yA_hzTBZ=0A!k z%}I~=93{Dg=LQWd)xMTD2Tv@O%lpwk`*9dDxv!YBjX?h$#z-aMMI1mnNI;nVK;deoa$MtX!Jj@Ch4hQ0izNYptsir#<3y+|e zcrdJ*24WOwT6nZ+;nPibqBU68uhY4=rrS`RDC36`05F~w9kfU|xIVr<9*OHog+hSU z(?Ve_0)B$hEPvtIra5kMTR0p<*G=m}L`@4{iBKRChjw4pVL{Wvg`f@qF@SN1Sr@Ml zgL2>cxRxkKBGTr*P!cV_1rx-4l)nwdwO|rT3B&h=;Z=b@26??}?m8j-Jx)fUf7q!t z$2Gl~oz~o37uMs=c&raa@Pkt`9&TU13MT_`!IBDwMgHvk$z!W`eeeFr6E{x$X5w4X z{f$?SUQomMq0{h!mir8T@=6tdFURXQf7);2 zHpxm&61-~^t*E^HCVMO!U!&abI)qaaVSM&AGWh6Dor==WeLA@$YdYDT&nM+;ZYgOS z_#|=0$YG^SD5~F!qk%g+(;XeV+i~EdPtif9w6_&)8v%oBWF1U!`YFmyiB$^_)v$Rad8AFWE9$P5|OS`bZwWB znc9tCB--}u>)6w_YpOHbHrcUrUz^dst1Gi_Py4PtU05(N4m@oBb?z@7{V1uSBRn=k zxX+E_c8{%B4;qVDM@zA3NozOT$R#^4J#OdSfdk4@&9( zbr2K-G#RHP-h{DjAKShYijcct)@UPT)C=79*%9`t#t=UgsSi z|APPbtvK-RT{t)|7kA0EwO20?1*yD6^f&Ya*c9-VnXhY!TaBZZU$INr*3@h|gyV_e za!$9Y<+Edhv=VgQity_?_b~^Hyp0p;um0GO6mHvl zwW!r*KTe9^Bm{Ke4+g!sOV~QHPW&Ojec@o0uiR!ZZ9h)^SKD5(@j(4vye72c-ia-K z8ZV|DI7`|NSZ&K*b6>FeHNIy1cU6Ct?KK)NK$-#ve#Vkk?1>_Lz*eLQTE<&xem%0Wb>~eO(mBpov)v;eCyyTM?)#82*~0!>8+MA{-PfTU zwv@bGuN}js{QW8DsJu@Yew!=3?)$u*+Tat`{tUcgU{lE>;Eshm5{z%hh-5J)U9fB? zN_!B)d%!(~zYgG2h`3ISBe$5svmLY!sow`HyKn|=AKL9gISbAlzbxU}i@Btr>y@8) z-dtCX6OJ+7oDN|$&p~2!{!F1qe0&F#*FZYb-P?;pC?`&Mh5yF?@A?BFC;z|T;BFb- L{|5h`dEh?)Yb(+_ literal 0 HcmV?d00001 diff --git a/clickonce/moxa-okuma-settings.json b/clickonce/moxa-okuma-settings.json new file mode 100644 index 0000000..8a2a882 --- /dev/null +++ b/clickonce/moxa-okuma-settings.json @@ -0,0 +1,129 @@ +{ + "AdminPasswordHash": "NZHINCSfx8Y4PePhYcXhbf/psJfiBfrDWRO0AgGnfE0=", + "AdminPasswordSalt": "QY9k9R4AmZvvj13geQ9N8A==", + "DefaultCompany": "SECUREX", + "MonitorRefreshSeconds": 30, + "LastReceiveDirectory": "", + "DefaultSettings": { + "Port": 10001, + "ConnectionTimeoutSeconds": 10, + "ReceiveIdleTimeoutSeconds": 15, + "SendTerminator": "%", + "LineDelayMs": 100, + "CharDelayMs": 10, + "LinePaced": true, + "CharPaced": false, + "BlockPaced": false, + "BlockSizeBytes": 32, + "BlockDelayMs": 100, + "WaitBeforeSendSeconds": 2, + "WaitAfterSendSeconds": 2 + }, + "Companies": [ + { + "Name": "SECUREX", + "Machines": [ + { + "Name": "M4 - N2LB 300", + "IpMoxa": "192.168.0.101", + "IpMachineWise": "192.168.0.214", + "Note": "OSP-U100L" + }, + { + "Name": "M5 - N3LB 300", + "IpMoxa": "192.168.0.146", + "IpMachineWise": "192.168.0.47", + "Note": "OSP-E100L" + }, + { + "Name": "M8 - CENTRO OKUMA", + "IpMoxa": "192.168.0.113", + "IpMachineWise": "192.168.0.68", + "Note": "OSP-P200M" + }, + { + "Name": "M11 - TORNIO OKUMA LB25I-N", + "IpMoxa": "192.168.0.88", + "IpMachineWise": "192.168.0.223", + "Note": "" + }, + { + "Name": "M12 - TORNIO OKUMA LB 400", + "IpMoxa": "192.168.0.99", + "IpMachineWise": "192.168.0.66", + "Note": "" + } + ] + }, + { + "Name": "EMILIA", + "Machines": [ + { + "Name": "M1", + "IpMoxa": "192.168.30.8", + "IpMachineWise": "192.168.30.221", + "Note": "" + }, + { + "Name": "M2", + "IpMoxa": "192.168.30.9", + "IpMachineWise": "192.168.30.222", + "Note": "" + }, + { + "Name": "M3", + "IpMoxa": "192.168.30.10", + "IpMachineWise": "192.168.30.223", + "Note": "" + }, + { + "Name": "M4 - CENTRO LAVORO OKUMA", + "IpMoxa": "192.168.30.11", + "IpMachineWise": "192.168.30.224", + "Note": "" + }, + { + "Name": "M5", + "IpMoxa": "192.168.30.12", + "IpMachineWise": "192.168.30.225", + "Note": "" + }, + { + "Name": "M6", + "IpMoxa": "192.168.30.13", + "IpMachineWise": "192.168.30.226", + "Note": "" + } + ] + }, + { + "Name": "SMART", + "Machines": [ + { + "Name": "M1", + "IpMoxa": "192.168.35.10", + "IpMachineWise": "192.168.35.212", + "Note": "" + }, + { + "Name": "M2", + "IpMoxa": "192.168.35.11", + "IpMachineWise": "192.168.35.211", + "Note": "" + }, + { + "Name": "M3", + "IpMoxa": "192.168.35.12", + "IpMachineWise": "192.168.35.213", + "Note": "" + }, + { + "Name": "M4 - CENTRO LAVORO OKUMA", + "IpMoxa": "192.168.35.13", + "IpMachineWise": "192.168.35.214", + "Note": "" + } + ] + } + ] +} diff --git a/tools/Compare-CncFiles.ps1 b/tools/Compare-CncFiles.ps1 new file mode 100644 index 0000000..540558a --- /dev/null +++ b/tools/Compare-CncFiles.ps1 @@ -0,0 +1,120 @@ +param( + [Parameter(Mandatory = $true)] + [string]$GoodFile, + + [Parameter(Mandatory = $true)] + [string]$BadFile, + + [int]$ContextBytes = 32, + + [int]$MaxDifferences = 200 +) + +Set-StrictMode -Version Latest +$ErrorActionPreference = "Stop" + +function Format-Byte { + param([byte]$Value) + + if ($Value -eq 0x0D) { return "CR" } + if ($Value -eq 0x0A) { return "LF" } + if ($Value -eq 0x09) { return "TAB" } + if ($Value -eq 0x12) { return "DC2" } + if ($Value -eq 0x14) { return "DC4" } + if ($Value -eq 0x20) { return "SPACE" } + if ($Value -ge 32 -and $Value -le 126) { return [char]$Value } + return "." +} + +function Format-Bytes { + param( + [byte[]]$Bytes, + [int]$Start, + [int]$Count + ) + + if ($Bytes.Length -eq 0) { return "" } + $safeStart = [Math]::Max(0, $Start) + $safeEnd = [Math]::Min($Bytes.Length - 1, $safeStart + $Count - 1) + if ($safeStart -gt $safeEnd) { return "" } + + $hex = New-Object System.Collections.Generic.List[string] + $txt = New-Object System.Collections.Generic.List[string] + + for ($i = $safeStart; $i -le $safeEnd; $i++) { + $hex.Add($Bytes[$i].ToString("X2")) + $txt.Add((Format-Byte $Bytes[$i])) + } + + return ("HEX: " + ($hex -join " ") + [Environment]::NewLine + "TXT: " + ($txt -join " ")) +} + +$goodPath = (Resolve-Path -LiteralPath $GoodFile).Path +$badPath = (Resolve-Path -LiteralPath $BadFile).Path + +$good = [System.IO.File]::ReadAllBytes($goodPath) +$bad = [System.IO.File]::ReadAllBytes($badPath) + +Write-Host "GOOD: $goodPath" +Write-Host "BAD : $badPath" +Write-Host "GOOD length: $($good.Length) bytes" +Write-Host "BAD length: $($bad.Length) bytes" +Write-Host "" + +$limit = [Math]::Min($good.Length, $bad.Length) +$diffCount = 0 + +for ($i = 0; $i -lt $limit; $i++) { + if ($good[$i] -ne $bad[$i]) { + $diffCount++ + if ($diffCount -le $MaxDifferences) { + Write-Host ("Difference #{0} at byte {1} / 0x{1:X}" -f $diffCount, $i) + Write-Host (" GOOD: 0x{0} [{1}]" -f $good[$i].ToString("X2"), (Format-Byte $good[$i])) + Write-Host (" BAD : 0x{0} [{1}]" -f $bad[$i].ToString("X2"), (Format-Byte $bad[$i])) + Write-Host " GOOD context:" + Write-Host (Format-Bytes $good ($i - $ContextBytes) (($ContextBytes * 2) + 1)) + Write-Host " BAD context:" + Write-Host (Format-Bytes $bad ($i - $ContextBytes) (($ContextBytes * 2) + 1)) + Write-Host "" + } + } +} + +if ($good.Length -ne $bad.Length) { + Write-Host "Files have different length." + if ($good.Length -gt $bad.Length) { + Write-Host "GOOD has extra bytes from offset $($bad.Length) / 0x$($bad.Length.ToString("X")):" + Write-Host (Format-Bytes $good $bad.Length ([Math]::Min(256, $good.Length - $bad.Length))) + } else { + Write-Host "BAD has extra bytes from offset $($good.Length) / 0x$($good.Length.ToString("X")):" + Write-Host (Format-Bytes $bad $good.Length ([Math]::Min(256, $bad.Length - $good.Length))) + } + Write-Host "" +} + +Write-Host "Total differing byte positions in common length: $diffCount" + +$badControls = @{} +for ($i = 0; $i -lt $bad.Length; $i++) { + $b = $bad[$i] + $allowed = $b -eq 0x09 -or $b -eq 0x0A -or $b -eq 0x0D -or ($b -ge 0x20 -and $b -le 0x7E) + if (-not $allowed) { + $key = "0x" + $b.ToString("X2") + " " + (Format-Byte $b) + if (-not $badControls.ContainsKey($key)) { + $badControls[$key] = New-Object System.Collections.Generic.List[int] + } + if ($badControls[$key].Count -lt 20) { + $badControls[$key].Add($i) + } + } +} + +Write-Host "" +Write-Host "Suspicious bytes in BAD file, excluding TAB/CR/LF/ASCII printable:" +if ($badControls.Count -eq 0) { + Write-Host " none" +} else { + foreach ($entry in $badControls.GetEnumerator() | Sort-Object Name) { + Write-Host (" {0}: offsets {1}" -f $entry.Key, (($entry.Value | ForEach-Object { "$_ / 0x$($_.ToString("X"))" }) -join ", ")) + } +}