using MConnectSDK; using QRCoder; using System; using System.Collections.Generic; using System.Drawing; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace TestClient { public partial class MainForm : Form { #region Private Fields /// /// Context x sync thread /// private readonly SynchronizationContext synchronizationContext; /// /// Token x cancellazione thread /// private CancellationTokenSource _cts; /// /// Timestamp precedente /// private DateTime previousTime = DateTime.Now; #endregion Private Fields #region Protected Fields /// /// Istanze classe MaestroConnectClient /// protected MConnectClient MCC; /// /// Risposta BASE della classe di comunicazione /// protected Result reqStatus; #endregion Protected Fields #region Public Constructors /// /// Form principale /// public MainForm() { InitializeComponent(); myInit(); synchronizationContext = SynchronizationContext.Current; } #endregion Public Constructors #region Protected Properties /// /// Password digitata /// protected string passwd { get { return txtPwd.Text.Trim(); } } /// /// Username digitato /// protected string username { get { return txtUser.Text.Trim(); } } #endregion Protected Properties #region Private Methods private async void btnDeleteUser_Click(object sender, EventArgs e) { await Task.Run(() => { var taskResult = MCC.setUserImported(SourceType.LOCAL, username, false); // salvo il risultato restituito... reqStatus = taskResult.Result; synchronizationContext.Post(new SendOrPostCallback(o => { refreshRequestStatus(); }), ""); }); } private async void btnDeleteUserCloud_Click(object sender, EventArgs e) { await Task.Run(() => { var taskResult = MCC.setUserImported(SourceType.CLOUD, username, false); // salvo il risultato restituito... reqStatus = taskResult.Result; synchronizationContext.Post(new SendOrPostCallback(o => { refreshRequestStatus(); }), ""); }); } private void btnFakeQR_Click(object sender, EventArgs e) { // testing di generazione QRCODE.... string usr_cod = "GJU17-2DCH"; string mach_id = "cjtfprjdv00i40xm76xmgu0ba"; string fullString = string.Format("https://stg.maestroconnect.scmgroup.com/scm/settings/machine-settings/?nav=activation&user_code={0}&machineID=", usr_cod, mach_id); QRCodeGenerator qrGenerator = new QRCodeGenerator(); QRCodeData qrCodeData = qrGenerator.CreateQrCode(fullString, QRCodeGenerator.ECCLevel.Q); QRCode qrCode = new QRCode(qrCodeData); Bitmap qrCodeImage = qrCode.GetGraphic(5); pictBox.Image = qrCodeImage; } private void btnFlush_Click(object sender, EventArgs e) { MCC.forceRedisFlush(); MCC = null; fixDisplay(); } private async void btnGetClientStatus_Click(object sender, EventArgs e) { // init in modalità Task based... await Task.Run(() => { var retObj = getClientStatus(); }); // aggiorno log console StringBuilder sb = new StringBuilder(); sb.AppendLine("--------------------------------------------------"); sb.AppendLine(string.Format("{0:HH.mm.ss.fff} | ClientStatus requested", DateTime.Now)); sb.AppendLine(""); lblConsole.Text = sb.ToString(); } private void btnGetLic_Click(object sender, EventArgs e) { var result = MCC.GetLicenseMConnect(); } /// /// recupera codice organizzazione /// /// /// private async void btnGetOrgCode_Click(object sender, EventArgs e) { // init in modalità Task based... await Task.Run(() => { var retObj = getOrgCode(); }); // aggiorno log console StringBuilder sb = new StringBuilder(); sb.AppendLine("--------------------------------------------------"); sb.AppendLine(string.Format("{0:HH.mm.ss.fff} | OrgCode requested", DateTime.Now)); sb.AppendLine(""); lblConsole.Text = sb.ToString(); } private async void btnGetUserCreatedList_Click(object sender, EventArgs e) { // init in modalità Task based... await Task.Run(() => { var retObj = getUserListCreated(); }); // aggiorno log console StringBuilder sb = new StringBuilder(); sb.AppendLine("--------------------------------------------------"); sb.AppendLine(string.Format("{0:HH.mm.ss.fff} | UserList CREATED requested", DateTime.Now)); sb.AppendLine(""); lblConsole.Text = sb.ToString(); } /// /// chiamata recupero elenco utenti /// /// /// private async void btnGetUserList_Click(object sender, EventArgs e) { // init in modalità Task based... await Task.Run(() => { var retObj = getUserList(); }); // aggiorno log console StringBuilder sb = new StringBuilder(); sb.AppendLine("--------------------------------------------------"); sb.AppendLine(string.Format("{0:HH.mm.ss.fff} | UserList requested", DateTime.Now)); sb.AppendLine(""); lblConsole.Text = sb.ToString(); } private async void btnImportUser_Click(object sender, EventArgs e) { await Task.Run(() => { var taskResult = MCC.setUserImported(SourceType.LOCAL, username, true); // salvo il risultato restituito... reqStatus = taskResult.Result; synchronizationContext.Post(new SendOrPostCallback(o => { refreshRequestStatus(); }), ""); }); } /// /// Simulazione INIT /// /// /// private async void btnInit_Click(object sender, EventArgs e) { // reset x iniziare... if (_cts != null) { _cts.Cancel(); } // init in modalità Task based... await Task.Run(() => { var initObj = doInitAsync(txtConfFile.Text.Trim()); }); // aggiorno log console StringBuilder sb = new StringBuilder(); sb.AppendLine("--------------------------------------------------"); sb.AppendLine(string.Format("{0:HH.mm.ss.fff} | START INIT", DateTime.Now)); sb.AppendLine(""); lblConsole.Text = sb.ToString(); // resetto aspetti grafici resetAuthData(); } /// /// Reset parametri... /// /// /// private void btnResetParam_Click(object sender, EventArgs e) { txtConfFile.Text = "mconnect.conf.yaml"; txtUploadFile.Text = "file2upload.zip"; reqStatus = new Result(); lblReqStatus.Text = ""; lblConsole.Text = ""; fixDisplay(); } private async void btnStartClient_Click(object sender, EventArgs e) { #if false // reset x iniziare... if (_cts != null) { _cts.Cancel(); } // init in modalità Task based... await Task.Run(() => { var initObj = doGetStatusAsync(); }); // aggiorno log console StringBuilder sb = new StringBuilder(); sb.AppendLine("--------------------------------------------------"); sb.AppendLine(string.Format("{0:HH.mm.ss.fff} | START INIT", DateTime.Now)); sb.AppendLine(""); lblConsole.Text = sb.ToString(); // resetto aspetti grafici resetAuthData(); #endif } /// /// Simulazione AUTH /// /// /// private async void btnTryAuth_Click(object sender, EventArgs e) { // init variabili accessorie x chiamata StringBuilder sb = new StringBuilder(); // elimino eventuali cancel presenti... if (_cts.IsCancellationRequested) { _cts = new CancellationTokenSource(); } CancellationToken token = _cts.Token; // gestione progress... var progressHandler = new Progress(value => { // aggiorno richiesta live... reqStatus = value; refreshRequestStatus(); // mostro i dati SPECIFICI x AUTH... updateAuthData((ActivationPayload)value.Payload); }); var progress = progressHandler as IProgress; try { // init in modalità Task based AUTH... await Task.Run(() => { var initObj = MCC.TryActivationAsync(token, progress); // recupero dati e aggiorno display... var taskResult = MCC.GetClientStatusAsync(); // salvo il risultato restituito... reqStatus = taskResult.Result; // aggiorno display synchronizationContext.Post(new SendOrPostCallback(o => { refreshRequestStatus(); }), ""); }); } catch (OperationCanceledException) { sb = new StringBuilder(); sb.AppendLine("--------------------------------------------------"); sb.AppendLine(string.Format("{0:HH.mm.ss.fff} | CANCELLED OAuth process", DateTime.Now)); sb.AppendLine("--------------------------------------------------"); lblConsole.Text = sb.ToString(); } catch { //label2.Text = ex.GetType().Name + ": " + ex.Message; } // aggiorno log console sb.AppendLine("--------------------------------------------------"); sb.AppendLine(string.Format("{0:HH.mm.ss.fff} | STARTING OAuth process", DateTime.Now)); sb.AppendLine("--------------------------------------------------"); lblConsole.Text = sb.ToString(); } /// /// Simulazione ENROLL /// /// /// private async void btnTryEnroll_Click(object sender, EventArgs e) { // init variabili accessorie x chiamata StringBuilder sb = new StringBuilder(); // elimino eventuali cancel presenti... if (_cts.IsCancellationRequested) { _cts = new CancellationTokenSource(); } CancellationToken token = _cts.Token; // gestione progress... var progressHandler = new Progress(value => { // aggiorno richeista live... reqStatus = value; refreshRequestStatus(); // mostro i dati SPECIFICI x AUTH... updateAuthData((ActivationPayload)value.Payload); }); var progress = progressHandler as IProgress; try { // init in modalità Task based AUTH... await Task.Run(() => { var initObj = MCC.EnrollMachineAsync(token, progress); // recupero dati e aggiorno display... var taskResult = MCC.GetClientStatusAsync(); // salvo il risultato restituito... reqStatus = taskResult.Result; // aggiorno display synchronizationContext.Post(new SendOrPostCallback(o => { refreshRequestStatus(); }), ""); }); } catch (OperationCanceledException) { sb = new StringBuilder(); sb.AppendLine("--------------------------------------------------"); sb.AppendLine(string.Format("{0:HH.mm.ss.fff} | CANCELLED ENROLL process", DateTime.Now)); sb.AppendLine("--------------------------------------------------"); lblConsole.Text = sb.ToString(); } catch { //label2.Text = ex.GetType().Name + ": " + ex.Message; } // aggiorno log console sb.AppendLine("--------------------------------------------------"); sb.AppendLine(string.Format("{0:HH.mm.ss.fff} | STARTING ENROLL process", DateTime.Now)); sb.AppendLine("--------------------------------------------------"); lblConsole.Text = sb.ToString(); } /// /// chiamata x login utente /// /// /// private async void btnTryUserLogin_Click(object sender, EventArgs e) { // init in modalità Task based... await Task.Run(() => { var retObj = doUserLogin(username, passwd); }); // aggiorno log console StringBuilder sb = new StringBuilder(); sb.AppendLine("--------------------------------------------------"); sb.AppendLine(string.Format("{0:HH.mm.ss.fff} | UserLogin requested", DateTime.Now)); sb.AppendLine(""); lblConsole.Text = sb.ToString(); } private async void btnUploadFile_Click(object sender, EventArgs e) { string startTime = $"Fileupload: start {DateTime.Now}{Environment.NewLine}"; synchronizationContext.Post(new SendOrPostCallback(o => { lblConsole.Text = startTime; }), ""); // elimino eventuali cancel presenti... if (_cts.IsCancellationRequested) { _cts = new CancellationTokenSource(); } CancellationToken token = _cts.Token; // gestione progress... var progressHandler = new Progress(value => { // aggiorno richeista live... reqStatus = value; refreshRequestStatus(); // mostro i dati SPECIFICI x AUTH... updateAuthData((ActivationPayload)value.Payload); }); var progress = progressHandler as IProgress; await Task.Run(() => { var taskResult = MCC.TryUpLoadFile(token, progress, txtUploadFile.Text.Trim()); try { // salvo il risultato restituito... reqStatus = taskResult.Result; } catch (Exception exc) { MConnectSDK.Log.Instance.Error(exc, "Eccezione in btnUploadFile_Click"); } synchronizationContext.Post(new SendOrPostCallback(o => { lblConsole.Text = startTime; refreshRequestStatus(); }), ""); }); } /// /// Task x get status /// /// private async Task doGetStatusAsync() { #if false // attendo init... await Task.Run(() => { // NUOVA istanza da file di conf... MCC = new MConnectClient(); // init async... var taskResult = MCC.InitSDKAsync(confFilePath, CancellationToken.None); // salvo il risultato restituito... reqStatus = taskResult.Result; synchronizationContext.Post(new SendOrPostCallback(o => { StringBuilder sb = new StringBuilder(); sb.AppendLine("--------------------------------------------------"); sb.AppendLine("InitSDKAsync"); sb.AppendLine("--------------------------------------------------"); lblConsole.Text = sb.ToString(); refreshRequestStatus(); }), ""); }); #endif // ora attendo get client... await Task.Run(() => { // init async... var taskResult = MCC.GetClientStatusAsync(); // salvo il risultato restituito... reqStatus = taskResult.Result; synchronizationContext.Post(new SendOrPostCallback(o => { StringBuilder sb = new StringBuilder(); sb.AppendLine("--------------------------------------------------"); sb.AppendLine("GetClientStatusAsync"); sb.AppendLine("--------------------------------------------------"); lblConsole.Text = sb.ToString(); refreshRequestStatus(); }), ""); }); // ora attendo get client... await Task.Run(() => { synchronizationContext.Post(new SendOrPostCallback(o => { fixDisplay(); }), ""); }); } /// /// Task x INIT da file di conf /// /// /// private async Task doInitAsync(string confFilePath) { // attendo init... await Task.Run(() => { // NUOVA istanza da file di conf... MCC = new MConnectClient(); // init async... var taskResult = MCC.InitSDKAsync(confFilePath, CancellationToken.None); // salvo il risultato restituito... reqStatus = taskResult.Result; synchronizationContext.Post(new SendOrPostCallback(o => { StringBuilder sb = new StringBuilder(); sb.AppendLine("--------------------------------------------------"); sb.AppendLine("InitSDKAsync"); sb.AppendLine("--------------------------------------------------"); lblConsole.Text = sb.ToString(); refreshRequestStatus(); }), ""); }); #if false // ora attendo get client... await Task.Run(() => { // init async... var taskResult = MCC.GetClientStatusAsync(); // salvo il risultato restituito... reqStatus = taskResult.Result; synchronizationContext.Post(new SendOrPostCallback(o => { StringBuilder sb = new StringBuilder(); sb.AppendLine("--------------------------------------------------"); sb.AppendLine("GetClientStatusAsync"); sb.AppendLine("--------------------------------------------------"); lblConsole.Text = sb.ToString(); refreshRequestStatus(); }), ""); }); #endif // ora attendo risposta... await Task.Run(() => { synchronizationContext.Post(new SendOrPostCallback(o => { fixDisplay(); }), ""); }); } /// /// Tento login utente /// /// private async Task doUserLogin(string user, string pwd) { StringBuilder sb; await Task.Run(() => { UserData userData = new UserData(); var userResult = MCC.TryUserLogin(user, pwd); userResult.Wait(); var currImage = pictBox.Image; //if (userData.Username != "") if (userResult.Result.Error.Reason == UserReason.AllOk) { List userList = ((UserPayload)userResult.Result.Payload).UserList; // controllo se ho risultato...) if (userList.Count == 1) { userData = userList[0]; } sb = new StringBuilder(); sb.AppendLine("--------------------------------------------------"); sb.AppendLine("USER AUTH OK"); sb.AppendLine("--------------------------------------------------"); sb.AppendLine(""); sb.AppendLine(string.Format("user_id: {0}", userData.UserId)); sb.AppendLine(string.Format("isAdmin: {0}", userData.IsAdmin)); sb.AppendLine(string.Format("UserName: {0}", userData.Username)); sb.AppendLine(string.Format("Email: {0}", userData.Email)); sb.AppendLine(string.Format("Cognome: {0}", userData.Cognome)); sb.AppendLine(string.Format("Nome: {0}", userData.Nome)); sb.AppendLine(string.Format("Status: {0}", userList[0].LoginStatus.ToString())); // aggiungo IMG user... se vuota default... if (userList[0].UserImage == null) { userList[0].UserImage = Image.FromFile(@"resources\userImg.png"); } currImage = userList[0].UserImage; } else { sb = new StringBuilder(); sb.AppendLine("--------------------------------------------------"); sb.AppendLine("USER AUTH KO"); sb.AppendLine("--------------------------------------------------"); sb.AppendLine(""); sb.AppendLine($"ERROR: {userResult.Result.Error.Reason}"); sb.AppendLine($"Message: {userResult.Result.Error.message}"); sb.AppendLine("User/Pwd NOT found"); } synchronizationContext.Post(new SendOrPostCallback(o => { pictBox.Image = currImage; lblConsole.Text = sb.ToString(); refreshRequestStatus(); }), ""); }); } private void fixDisplay() { // mostro init SOLO SE ho conf yaml... btnInit.Enabled = txtConfFile.Text.Trim() != ""; // verifico SE ho inizializzato x cui POSSO mostrare alcuni buttons... bool enableBtn = (MCC != null); btnFlush.Enabled = enableBtn; btnTryAuth.Enabled = enableBtn; btnTryEnroll.Enabled = enableBtn; btnGetClientStatus.Enabled = enableBtn; btnGetOrgCode.Enabled = enableBtn; btnGetUserList.Enabled = enableBtn; btnTryUserLogin.Enabled = enableBtn; btnGetUserCreatedList.Enabled = enableBtn; btnImportUser.Enabled = enableBtn; btnDeleteUserHMI.Enabled = enableBtn; btnGetLic.Enabled = enableBtn; // controllo se visualizzare parametri di testing... if (reqStatus != null) { // se NON enrolled --> abilita tryAuth... btnTryAuth.Enabled = !reqStatus.IsAuth; btnTryEnroll.Enabled = !reqStatus.IsHmiEnrolled; } } /// /// Recupero client status /// /// private async Task getClientStatus() { await Task.Run(() => { var taskResult = MCC.GetClientStatusAsync(); // salvo il risultato restituito... reqStatus = taskResult.Result; synchronizationContext.Post(new SendOrPostCallback(o => { StringBuilder sb = new StringBuilder(); sb.AppendLine("--------------------------------------------------"); sb.AppendLine("CLIENT INFO DATA REFRESHED"); sb.AppendLine("--------------------------------------------------"); lblConsole.Text = sb.ToString(); refreshRequestStatus(); }), ""); }); } /// /// Recupero OrgCode /// /// private async Task getOrgCode() { await Task.Run(() => { string orgCode = MCC.organizationCode; synchronizationContext.Post(new SendOrPostCallback(o => { StringBuilder sb = new StringBuilder(); sb.AppendLine("--------------------------------------------------"); sb.AppendLine("ORGANIZATION CODE: " + orgCode); sb.AppendLine("--------------------------------------------------"); lblConsole.Text = sb.ToString(); refreshRequestStatus(); }), ""); }); } /// /// Recupero UserList /// /// private async Task getUserList() { await Task.Run(() => { var userResult = MCC.getUserListAsync(chkGetImg.Checked); List userList = ((UserPayload)userResult.Result.Payload).UserList; synchronizationContext.Post(new SendOrPostCallback(o => { StringBuilder sb = new StringBuilder(); sb.AppendLine("--------------------------------------------------"); sb.AppendLine("USERS FOUND: " + userList.Count.ToString()); sb.AppendLine("--------------------------------------------------"); if (userList.Count > 0) { sb.AppendLine("first user::"); sb.AppendLine(string.Format("user_id: {0}", userList[0].UserId)); sb.AppendLine(string.Format("isAdmin: {0}", userList[0].IsAdmin)); sb.AppendLine(string.Format("UserName: {0}", userList[0].Username)); sb.AppendLine(string.Format("Email: {0}", userList[0].Email)); sb.AppendLine(string.Format("Cognome: {0}", userList[0].Cognome)); sb.AppendLine(string.Format("Nome: {0}", userList[0].Nome)); sb.AppendLine(string.Format("Status: {0}", userList[0].LoginStatus.ToString())); // aggiungo IMG user... se vuota default... if (userList[0].UserImage == null) { userList[0].UserImage = Image.FromFile(@"resources\userImg.png"); } pictBox.Image = userList[0].UserImage; lblConsole.Text = sb.ToString(); } // refresh! refreshRequestStatus(); }), ""); }); } /// /// Recupero UserList che risultano CREATI sulal piattaforma MConnect e su HMI /// /// private async Task getUserListCreated() { await Task.Run(() => { var userResult = MCC.getUserImportedListAsync(); userResult.Wait(); List userList = ((UserPayload)userResult.Result.Payload).UserList; synchronizationContext.Post(new SendOrPostCallback(o => { StringBuilder sb = new StringBuilder(); sb.AppendLine("--------------------------------------------------"); sb.AppendLine("USERS CREATED FOUND: " + userList.Count.ToString()); sb.AppendLine("--------------------------------------------------"); if (userList.Count > 0) { sb.AppendLine("first user:"); sb.AppendLine(string.Format("user_id: {0}", userList[0].UserId)); sb.AppendLine(string.Format("isAdmin: {0}", userList[0].IsAdmin)); sb.AppendLine(string.Format("UserName: {0}", userList[0].Username)); sb.AppendLine(string.Format("Email: {0}", userList[0].Email)); sb.AppendLine(string.Format("Cognome: {0}", userList[0].Cognome)); sb.AppendLine(string.Format("Nome: {0}", userList[0].Nome)); sb.AppendLine(string.Format("Status: {0}", userList[0].LoginStatus.ToString())); // aggiungo IMG user... se vuota default... if (userList[0].UserImage == null) { userList[0].UserImage = Image.FromFile(@"resources\userImg.png"); } pictBox.Image = userList[0].UserImage; } lblConsole.Text = sb.ToString(); // refresh! refreshRequestStatus(); }), ""); }); } private void LblMachineId_Click(object sender, EventArgs e) { Clipboard.SetText(lblMachineId.Text); MessageBox.Show("COPIED current MACHINE_ID to Clipboard!\r\n" + lblMachineId.Text, "MACHINE_ID ACQUIRED", MessageBoxButtons.OK); } private void lblUrl_Click(object sender, EventArgs e) { Clipboard.SetText(lblUrl.Text); MessageBox.Show("COPIED current AUTH URL to Clipboard!\r\n" + lblUrl.Text, "AUTH URL ACQUIRED", MessageBoxButtons.OK); } private void lblUserCode_Click(object sender, EventArgs e) { Clipboard.SetText(lblUserCode.Text); MessageBox.Show("COPIED current user_code to Clipboard!\r\n" + lblUserCode.Text, "USER_CODE ACQUIRED", MessageBoxButtons.OK); } private void resetAuthData() { Bitmap bitmap = new Bitmap(200, 200, System.Drawing.Imaging.PixelFormat.Format24bppRgb); using (Graphics graphics = Graphics.FromImage(bitmap)) { using (System.Drawing.SolidBrush myBrush = new System.Drawing.SolidBrush(System.Drawing.Color.LightGray)) { graphics.FillRectangle(myBrush, new Rectangle(0, 0, 200, 200)); } } // graphics will be disposed at this line pictBox.Image = bitmap; StringBuilder sb = new StringBuilder(); sb.AppendLine("RESET DATA done!"); lblRetData.Text = sb.ToString(); } /// /// Mostra info x USER AUTH /// /// private void updateAuthData(ActivationPayload authData) { // aggiorno console... lblConsole.Text = authData.Message; // verifico se sia AUTH (altrimenti NON mostro codice e QR...) if (authData.HasAuth || reqStatus.IsAuth) { var currColor = Color.Orange; // se fosse ANCHE enrolled cambio colore... if (authData.IsEnrolled || reqStatus.IsHmiEnrolled) { currColor = Color.Green; } Bitmap bitmap = new Bitmap(200, 200, System.Drawing.Imaging.PixelFormat.Format24bppRgb); using (Graphics graphics = Graphics.FromImage(bitmap)) { using (SolidBrush myBrush = new SolidBrush(currColor)) { graphics.FillRectangle(myBrush, new Rectangle(0, 0, 200, 200)); } } // graphics will be disposed at this line pictBox.Image = bitmap; StringBuilder sb = new StringBuilder(); sb.AppendLine("AUTH DONE!"); if (authData.IsEnrolled || reqStatus.IsHmiEnrolled) { sb.AppendLine("------"); sb.AppendLine("ENROLLED!"); } lblRetData.Text = sb.ToString(); } else { // mostro info SE disponibili... if (authData.UserCode != null && authData.UserCode != "") { // salvo in label specifica lblUserCode.Text = authData.UserCode.ToString(); lblMachineId.Text = MCC.MachineID; // salvo output StringBuilder sb = new StringBuilder(); sb.AppendLine("device_code:"); sb.AppendLine(authData.DeviceCode.ToString()); sb.AppendLine(""); sb.AppendLine("user_code:"); sb.AppendLine(authData.UserCode.ToString()); sb.AppendLine(""); lblRetData.Text = sb.ToString(); // genero QRCode QRCodeGenerator qrGenerator = new QRCodeGenerator(); QRCodeData qrCodeData = qrGenerator.CreateQrCode(authData.QrCode, QRCodeGenerator.ECCLevel.Q); QRCode qrCode = new QRCode(qrCodeData); Bitmap qrCodeImage = qrCode.GetGraphic(5); pictBox.Image = qrCodeImage; // aggiungo link! lblUrl.Text = authData.QrCode; } } } private async Task updateClockAsync() { await Task.Run(() => { while (true) { Thread.Sleep(50); UpdateUI(); } }); } #endregion Private Methods #region Protected Methods protected void myInit() { var clockTask = updateClockAsync(); _cts = new CancellationTokenSource(); fixDisplay(); lblConsole.Text = ""; } #endregion Protected Methods #region Public Methods public void refreshRequestStatus() { // mostro risultato StringBuilder sb = new StringBuilder(); sb.AppendLine("-------------------------"); sb.AppendLine("- Request Status"); sb.AppendLine("-------------------------"); if (reqStatus != null) { sb.AppendLine("isAuth: " + reqStatus.IsAuth); sb.AppendLine("isHmiEnrolled: " + reqStatus.IsHmiEnrolled); sb.AppendLine("cloudConnection: " + reqStatus.CloudStatusOk); sb.AppendLine("localConnection: " + reqStatus.LocalStatusOk); sb.AppendLine("callSuccess: " + reqStatus.CallResultOk); sb.AppendLine(""); if (reqStatus.Payload != null) { sb.AppendLine("message: " + reqStatus.Payload.Message); sb.AppendLine(""); // se contiene risultato... try { var fileUploadRes = (FilePayload)reqStatus.Payload; if (fileUploadRes != null) { sb.AppendLine("file link: " + fileUploadRes.uploadResults.result.link); sb.AppendLine(""); } } catch { } //if(reqStatus.Payload.) } sb.AppendLine(string.Format("{0:HH.mm.ss.fff}", DateTime.Now)); sb.AppendLine("-------------------------"); } lblReqStatus.Text = sb.ToString(); sb.AppendLine(""); sb.AppendLine(string.Format("{0:HH.mm.ss.fff} | END", DateTime.Now)); sb.AppendLine("--------------------------------------------------"); lblConsole.Text += sb.ToString(); if (reqStatus != null) { // se NON enrolled --> abilita tryAuth... btnTryAuth.Enabled = !reqStatus.IsAuth; btnTryEnroll.Enabled = !reqStatus.IsHmiEnrolled; } } public void UpdateUI() { var timeNow = DateTime.Now; if ((DateTime.Now - previousTime).Milliseconds <= 250) { return; } try { synchronizationContext.Post(new SendOrPostCallback(o => { lblClock.Text = timeNow.ToString("ddd dd.MM.yyyy HH:mm:ss"); }), ""); } catch { } previousTime = timeNow; } #endregion Public Methods } }