From ad27e6880f3b045c533b683912665e1bf362d4b8 Mon Sep 17 00:00:00 2001 From: handefeng <1030428966@qq.com> Date: Fri, 27 Dec 2024 13:41:05 +0800 Subject: [PATCH] =?UTF-8?q?fix=EF=BC=9A=E5=A4=96=E9=83=A8=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Language/en_US.xaml | 12 ++ Language/zh_CN.xaml | 11 ++ .../Entity/ApiEntity/AlgorithmResultEntity.cs | 5 + Model/Entity/ApiEntity/SocResultEntity.cs | 6 + Model/Entity/ApiEntity/StatusCodes.cs | 9 ++ Model/Services/AlgorithmServer.cs | 22 ++- Model/Services/SOCClientService.cs | 75 ++++++--- SparkClient.sln.DotSettings.user | 4 + SparkDB.db | Bin 172032 -> 172032 bytes ViewModel/Grading/DiamondSelectVM.cs | 149 +++++++----------- Views/Dialog/MsgDialog.xaml | 18 +-- Views/Dialog/MsgDialog.xaml.cs | 30 +++- 12 files changed, 216 insertions(+), 125 deletions(-) diff --git a/Language/en_US.xaml b/Language/en_US.xaml index 78eee89..31166bb 100644 --- a/Language/en_US.xaml +++ b/Language/en_US.xaml @@ -36,4 +36,16 @@ Button + + + Drawing is in progress + Cached images are cleared + Unable to send instructions tNo the SOC + Microcontroller access timeout + The microcontroller returns an error code + Camera not connected + Cutter not found + Algorithm call failed + Failed to read the image file + JSON parsing failed \ No newline at end of file diff --git a/Language/zh_CN.xaml b/Language/zh_CN.xaml index adf2446..1df8ea7 100644 --- a/Language/zh_CN.xaml +++ b/Language/zh_CN.xaml @@ -177,5 +177,16 @@ SYM等级 面1 + + 采图正在进行中 + 缓存图片被清理 + 无法向单片机发送指令 + 单片机访问超时 + 单片机返回错误码 + 摄像头未连接 + 未找到切工仪 + 算法调用失败 + 图片文件读取失败 + JSON解析失败 \ No newline at end of file diff --git a/Model/Entity/ApiEntity/AlgorithmResultEntity.cs b/Model/Entity/ApiEntity/AlgorithmResultEntity.cs index f399017..c850ac8 100644 --- a/Model/Entity/ApiEntity/AlgorithmResultEntity.cs +++ b/Model/Entity/ApiEntity/AlgorithmResultEntity.cs @@ -86,5 +86,10 @@ namespace SparkClient.Model.Entity.ApiEntity public string DiamondCode { get; set; } public string error_msg { get; set; } public string status { get; set; } + + /// + /// 机器号 + /// + public string DeviceId { get; set; } } } diff --git a/Model/Entity/ApiEntity/SocResultEntity.cs b/Model/Entity/ApiEntity/SocResultEntity.cs index 6e27429..0bc2ec0 100644 --- a/Model/Entity/ApiEntity/SocResultEntity.cs +++ b/Model/Entity/ApiEntity/SocResultEntity.cs @@ -12,4 +12,10 @@ public class SocResultEntity /// 图片名称列表 /// public List Images { get; set; } + + /// + /// 机器号 + /// + public string DeviceId { get; set; } + } \ No newline at end of file diff --git a/Model/Entity/ApiEntity/StatusCodes.cs b/Model/Entity/ApiEntity/StatusCodes.cs index 81abb75..56ae994 100644 --- a/Model/Entity/ApiEntity/StatusCodes.cs +++ b/Model/Entity/ApiEntity/StatusCodes.cs @@ -23,10 +23,19 @@ // 单片机返回错误码 public const string MicrocontrollerError = "S005"; + // 摄像头未连接 + public const string CameraNotConnected = "S006"; + // 未找到切工仪 public const string DeviceNotFound = "P001"; // 算法调用失败 public const string AlgorithmFailed = "P002"; + + // 图片文件读取失败 + public const string ImageFileReadFailure = "P003"; + + // JSON解析失败 + public const string JsonParseFailure = "P004"; } } \ No newline at end of file diff --git a/Model/Services/AlgorithmServer.cs b/Model/Services/AlgorithmServer.cs index db14aa3..295a382 100644 --- a/Model/Services/AlgorithmServer.cs +++ b/Model/Services/AlgorithmServer.cs @@ -1,8 +1,10 @@ -using System.Runtime.InteropServices; +using System.Data; +using System.Runtime.InteropServices; using System.Windows.Forms; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using SparkClient.Model.Entity.ApiEntity; +using SparkClient.Model.Helper; namespace SparkClient.Model.Services { @@ -17,10 +19,26 @@ namespace SparkClient.Model.Services private static extern void FreeString(IntPtr ptr); // 添加公共方法 - public AlgorithmResultEntity CallParseJsonAndReturnActions(string shape, string shape_mode, string image_file_base_path, string image_files, string algo_config, Boolean half_circle) + public AlgorithmResultEntity CallParseJsonAndReturnActions(string shape, string shape_mode, string image_files) { try { + //半圆 + string circleSql = $"SELECT VALUE FROM CUTTER_CONFIG WHERE KEY = 'half_circle'"; + DataTable circleTable = DataBaseHelper.ExecuteQuery(circleSql); + object halfCircleValue = circleTable.Rows[0][0]; + bool.TryParse(halfCircleValue.ToString(), out bool boolResult); + bool half_circle = boolResult; + + //算法配置参数 + string sql = $"SELECT JSON FROM ALGORITHM_CONFIG ORDER BY JSON_ORDER ASC"; + DataTable table = DataBaseHelper.ExecuteQuery(sql); + object lightLevelValue = table.Rows[0][0]; + string algo_config = lightLevelValue.ToString() ?? throw new InvalidOperationException(); + + //图片根目录 + string image_file_base_path = "D:\\diamond_images"; + // 将所有变量拼接成一个 JSON 对象 JObject jsonData = new JObject( new JProperty("shape", shape), diff --git a/Model/Services/SOCClientService.cs b/Model/Services/SOCClientService.cs index 99eb449..28f193d 100644 --- a/Model/Services/SOCClientService.cs +++ b/Model/Services/SOCClientService.cs @@ -1,5 +1,6 @@ using Newtonsoft.Json; using System; +using System.Data; using System.IO; using System.Net.Http; using System.Text; @@ -8,6 +9,7 @@ using System.Windows; using HandyControl.Tools.Extension; using SparkClient.Model.Common; using SparkClient.Model.Entity.ApiEntity; +using SparkClient.Model.Helper; namespace SparkClient.Model.Services { @@ -60,17 +62,43 @@ namespace SparkClient.Model.Services /// /// 光照级别 /// 任务状态 - public async Task CollectImagesAsync(int lightLevel) + public async Task CollectImagesAsync() { - string url = $"{_baseUrl}/collect_images?light_level={lightLevel}"; - try { + // 光照度和半圆 + int lightLevel = 0; + string halfCircle = string.Empty; + // 查询光照度和半圆配置 + string sql = $"SELECT KEY, VALUE FROM CUTTER_CONFIG WHERE KEY IN ('light_level', 'half_circle')"; + DataTable table = DataBaseHelper.ExecuteQuery(sql); + + if (table == null || table.Rows.Count == 0) + { + throw new Exception("No data found for the specified keys."); + } + foreach (DataRow row in table.Rows) + { + string key = row["Key"].ToString() ?? string.Empty; + string value = row["Value"].ToString() ?? string.Empty; + + if (key == "light_level" && int.TryParse(value, out int parsedLightLevel)) + { + lightLevel = parsedLightLevel; // 光照度 + } + else if (key == "half_circle") + { + halfCircle = value; // 半圆 + } + } + + string url = $"{_baseUrl}/collect_images?light_level={lightLevel}&half_circle={halfCircle}"; + var response = await SendGetRequestAsync(url); if (!response.IsSuccessStatusCode) { - return "P001"; + return new SocResultEntity { Status = StatusCodes.DeviceNotFound, Images = new List() , DeviceId = ""}; } var jsonResponse = await response.Content.ReadAsStringAsync(); @@ -78,16 +106,18 @@ namespace SparkClient.Model.Services if (result == null) { - return "P001"; + return new SocResultEntity { Status = StatusCodes.DeviceNotFound, Images = new List() , DeviceId = ""}; } - - return result.Status; + return new SocResultEntity { Status = result.Status, Images = new List() , DeviceId = result.device_id}; + } catch (Exception ex) { - // 记录异常信息 - Console.WriteLine($"An error occurred while collecting images: {ex.Message}"); - return "P001"; + // 记录日志或进行其他处理 + Console.WriteLine($"Error in DoSoc: {ex.Message}"); + // 或者使用日志框架记录日志 + // logger.LogError(ex, "Error in DoSoc method."); + return new SocResultEntity { Status = StatusCodes.DeviceNotFound, Images = new List() , DeviceId = ""}; } } @@ -186,15 +216,15 @@ namespace SparkClient.Model.Services } catch (HttpRequestException ex) { - return "P001"; + return StatusCodes.DeviceNotFound; } catch (JsonException ex) { - return "P001"; + return StatusCodes.DeviceNotFound; } catch (Exception ex) { - return "P001"; + return StatusCodes.DeviceNotFound; } } @@ -202,26 +232,28 @@ namespace SparkClient.Model.Services /// 处理图片收集、保存和状态检查。 /// /// 光照级别 + /// 是否半圆 /// 图片保存路径 /// 操作结果 - public async Task ProcessImageCollectionAsync(int lightLevel, string savePath) + public async Task ProcessImageCollectionAsync() { try { + // SOC接口 + string savePath = @"d:\diamond_images"; // 清理 savePath 文件夹 if (Directory.Exists(savePath)) { Directory.Delete(savePath, true); } Directory.CreateDirectory(savePath); - // 启动任务接口 - string startStatus = await CollectImagesAsync(lightLevel); + SocResultEntity entity = await CollectImagesAsync(); // 成功 - if (startStatus != StatusCodes.Success) + if (entity.Status != StatusCodes.Success) { // 启动任务失败 - return new SocResultEntity { Status = startStatus, Images = new List() }; + return new SocResultEntity { Status = entity.Status, Images = new List() }; } // 读取图片接口 @@ -238,7 +270,7 @@ namespace SparkClient.Model.Services } } // 按下载时间排序图片名称 - return new SocResultEntity { Status = StatusCodes.Success, Images = imageNames }; + return new SocResultEntity { Status = StatusCodes.Success, Images = imageNames, DeviceId = entity.DeviceId}; } catch (Exception e) { @@ -288,5 +320,10 @@ namespace SparkClient.Model.Services /// 状态消息 /// public string Message { get; set; } + + /// + /// 机器号 + /// + public string device_id { get; set; } } } diff --git a/SparkClient.sln.DotSettings.user b/SparkClient.sln.DotSettings.user index 2523794..194dd5b 100644 --- a/SparkClient.sln.DotSettings.user +++ b/SparkClient.sln.DotSettings.user @@ -16,6 +16,7 @@ ForceIncluded ForceIncluded ForceIncluded + ForceIncluded ForceIncluded ForceIncluded ForceIncluded @@ -23,6 +24,8 @@ ForceIncluded ForceIncluded ForceIncluded + ForceIncluded + ForceIncluded ForceIncluded ForceIncluded ForceIncluded @@ -32,6 +35,7 @@ ForceIncluded ForceIncluded ForceIncluded + ForceIncluded ForceIncluded ForceIncluded ForceIncluded diff --git a/SparkDB.db b/SparkDB.db index 808fa299363dd4acd5d87d07927f0d499be2f96d..2165e786406c373ea2ededc36540a45e2849c1b5 100644 GIT binary patch delta 20661 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 public async void StartGrading(object param) { - #if DEBUG - DoStartGrading(param); - #else + LoadingDialog loading = new LoadingDialog(); try { @@ -137,7 +136,7 @@ public class DiamondSelectVM : BaseViewModel } // 模拟耗时操作 //System.Threading.Thread.Sleep(50); // 休眠50毫秒 - await Task.Delay(400); + await Task.Delay(710); loading.setValue(i); progress = i; } @@ -154,38 +153,53 @@ public class DiamondSelectVM : BaseViewModel parameter.PavType = value.Split(" ")[2]; } + // 初始化SOC客户端服务,传入SOC端的地址和认证Token + _socClientService = new SOCClientService(); // 启动soc - // socResolt = await DoSoc(); - // if (socResolt.Status == "P001" || socResolt.Images.Count == 0) - // { - // // /*// 使用 Dispatcher 将 UI 操作调度到主线程 - // // Application.Current.Dispatcher.Invoke(() => - // // { - // // MsgDialog msgDialog = new MsgDialog(); - // // msgDialog.ShowDialog(); - // // }); - // // loading.Dispatcher.Invoke(() => loading.Close()); - // // return;*/ - // MessageBox.Show("未找到切工仪", "错误", MessageBoxButton.OK, MessageBoxImage.Error); - // loading.Dispatcher.Invoke(() => loading.Close()); - // return; - // } + socResolt = await _socClientService.ProcessImageCollectionAsync(); + switch (socResolt.Status) + { + case StatusCodes.DeviceNotFound: + ShowErrorMessage(MultilingualHelper.getString("DeviceNotFound"), loading); + return; + case StatusCodes.InProgress: + ShowErrorMessage(MultilingualHelper.getString("InProgress"), loading); + return; + case StatusCodes.CacheCleared: + ShowErrorMessage(MultilingualHelper.getString("CacheCleared"), loading); + return; + case StatusCodes.CannotSendCommand: + ShowErrorMessage(MultilingualHelper.getString("CannotSendCommand"), loading); + return; + case StatusCodes.MicrocontrollerTimeout: + ShowErrorMessage(MultilingualHelper.getString("MicrocontrollerTimeout"), loading); + return; + case StatusCodes.MicrocontrollerError: + ShowErrorMessage(MultilingualHelper.getString("MicrocontrollerError"), loading); + return; + case StatusCodes.CameraNotConnected: + ShowErrorMessage(MultilingualHelper.getString("CameraNotConnected"), loading); + return; + } + _algorithmServer = new AlgorithmServer(); + //图片集合 + string image_files = JsonConvert.SerializeObject(socResolt.Images, Formatting.Indented); + //string image_files =$"[ \"image_0.bmp\", \"image_1.bmp\", \"image_2.bmp\", \"image_3.bmp\", \"image_4.bmp\", \"image_5.bmp\", \"image_6.bmp\", \"image_7.bmp\", \"image_8.bmp\", \"image_9.bmp\", \"image_10.bmp\", \"image_11.bmp\", \"image_12.bmp\", \"image_13.bmp\", \"image_14.bmp\", \"image_15.bmp\", \"image_16.bmp\", \"image_17.bmp\", \"image_18.bmp\", \"image_19.bmp\", \"image_20.bmp\", \"image_21.bmp\", \"image_22.bmp\", \"image_23.bmp\", \"image_24.bmp\", \"image_25.bmp\", \"image_26.bmp\", \"image_27.bmp\", \"image_28.bmp\", \"image_29.bmp\", \"image_30.bmp\", \"image_31.bmp\", \"image_32.bmp\", \"image_33.bmp\", \"image_34.bmp\", \"image_35.bmp\", \"image_36.bmp\", \"image_37.bmp\", \"image_38.bmp\", \"image_39.bmp\", \"image_40.bmp\", \"image_41.bmp\", \"image_42.bmp\", \"image_43.bmp\", \"image_44.bmp\", \"image_45.bmp\", \"image_46.bmp\", \"image_47.bmp\", \"image_48.bmp\", \"image_49.bmp\" ]" ; + // 启动算法 - parameter = await DoAlgorithm(socResolt, parameter.Shape, parameter.CrownType); - MessageBox.Show(parameter.error_msg); + parameter = _algorithmServer.CallParseJsonAndReturnActions(parameter.Shape, parameter.CrownType, image_files); + //机器号 + parameter.DeviceId = socResolt.DeviceId; switch (parameter.status) { - case "P002": - MessageBox.Show("P002:调用算法失败", "错误", MessageBoxButton.OK, MessageBoxImage.Error); - loading.Dispatcher.Invoke(() => loading.Close()); + case StatusCodes.AlgorithmFailed: + ShowErrorMessage(MultilingualHelper.getString("AlgorithmFailed"), loading); return; - case "P003": - MessageBox.Show("P003:图片文件读取失败", "错误", MessageBoxButton.OK, MessageBoxImage.Error); - loading.Dispatcher.Invoke(() => loading.Close()); + case StatusCodes.ImageFileReadFailure: + ShowErrorMessage(MultilingualHelper.getString("ImageFileReadFailure"), loading); return; - case "P004": - MessageBox.Show("P004:JSON解析失败", "错误", MessageBoxButton.OK, MessageBoxImage.Error); - loading.Dispatcher.Invoke(() => loading.Close()); + case StatusCodes.JsonParseFailure: + ShowErrorMessage(MultilingualHelper.getString("JsonParseFailure"), loading); return; } parameter.Standard = "IGI 2024"; @@ -222,9 +236,21 @@ public class DiamondSelectVM : BaseViewModel finally { } - #endif } + + // 将 UI 操作调度到主线程并显示错误信息 + void ShowErrorMessage(string errorMessage, LoadingDialog loading) + { + Application.Current.Dispatcher.Invoke(() => + { + MsgDialog msgDialog = new MsgDialog(); + msgDialog.ErrorMessage = errorMessage; + msgDialog.ShowDialog(); + }); + loading.Dispatcher.Invoke(() => loading.Close()); + } + /// /// 开始检测(对soc和算法开始通讯) /// @@ -310,67 +336,6 @@ public class DiamondSelectVM : BaseViewModel WindowManager.openContent.Add(vm); } - - /// - /// 启动切工仪接口。 - /// - /// 图片的字节数组 - private async Task DoSoc() - { - // 光照度 - string sql = new CutterConfigEntity - { - ItemName = null, - Key = null, - Value = null - }.GenerateSelectSQL(new List { "Value" }, new Dictionary { { "Key", "light_level" } }); - SqliteParameter[] sqliteParameters = [new("@Key", "light_level")]; - DataTable table = DataBaseHelper.ExecuteQuery(sql,sqliteParameters); - object lightLevelValue = table.Rows[0][0]; - if (!int.TryParse(lightLevelValue.ToString(), out int lightLevel)) - { - throw new InvalidOperationException("Light level value is not a valid integer."); - } - // 初始化SOC客户端服务,传入SOC端的地址和认证Token - _socClientService = new SOCClientService(); - // SOC接口 - string savePath = @"d:\\diamond_images"; - SocResultEntity resultEntity = await _socClientService.ProcessImageCollectionAsync(lightLevel, savePath); - return resultEntity; - } - - /// - /// 启动算法接口。 - /// - /// 切工仪接口返回值 - /// - /// - /// 定级参数,3D模型参数 - private Task DoAlgorithm(SocResultEntity socResolt, String shape, String crownType) - { - _algorithmServer = new AlgorithmServer(); - //钻石形状:shape - //钻石子形状 - string shape_mode = crownType; - //图片根目录 - string image_file_base_path = "D:\\diamond_images"; - //图片集合 - //string image_files = JsonConvert.SerializeObject(socResolt.Images, Formatting.Indented); - string image_files =$"[ \"image_0.bmp\", \"image_1.bmp\", \"image_2.bmp\", \"image_3.bmp\", \"image_4.bmp\", \"image_5.bmp\", \"image_6.bmp\", \"image_7.bmp\", \"image_8.bmp\", \"image_9.bmp\", \"image_10.bmp\", \"image_11.bmp\", \"image_12.bmp\", \"image_13.bmp\", \"image_14.bmp\", \"image_15.bmp\", \"image_16.bmp\", \"image_17.bmp\", \"image_18.bmp\", \"image_19.bmp\", \"image_20.bmp\", \"image_21.bmp\", \"image_22.bmp\", \"image_23.bmp\", \"image_24.bmp\", \"image_25.bmp\", \"image_26.bmp\", \"image_27.bmp\", \"image_28.bmp\", \"image_29.bmp\", \"image_30.bmp\", \"image_31.bmp\", \"image_32.bmp\", \"image_33.bmp\", \"image_34.bmp\", \"image_35.bmp\", \"image_36.bmp\", \"image_37.bmp\", \"image_38.bmp\", \"image_39.bmp\", \"image_40.bmp\", \"image_41.bmp\", \"image_42.bmp\", \"image_43.bmp\", \"image_44.bmp\", \"image_45.bmp\", \"image_46.bmp\", \"image_47.bmp\", \"image_48.bmp\", \"image_49.bmp\" ]" ; - //半圆 - Boolean half_circle = false; - - //算法配置参数 - string sql = $"SELECT JSON FROM ALGORITHM_CONFIG ORDER BY JSON_ORDER ASC"; - DataTable table = DataBaseHelper.ExecuteQuery(sql); - object lightLevelValue = table.Rows[0][0]; - string algo_config = lightLevelValue.ToString() ?? throw new InvalidOperationException(); - - AlgorithmResultEntity algoResult = _algorithmServer.CallParseJsonAndReturnActions(shape, shape_mode, image_file_base_path, image_files, algo_config,half_circle); - - return Task.FromResult(algoResult); - } - } public class ButtonInfo { diff --git a/Views/Dialog/MsgDialog.xaml b/Views/Dialog/MsgDialog.xaml index b49866a..5d6883b 100644 --- a/Views/Dialog/MsgDialog.xaml +++ b/Views/Dialog/MsgDialog.xaml @@ -21,7 +21,7 @@ - @@ -33,13 +33,13 @@ BorderBrush="Transparent" Click="Skip_Click" /> + Fill="Azure" + Stroke="Black" + StrokeThickness="1" + HorizontalAlignment="Left" + VerticalAlignment="Top" + Margin="335,7,0,0" + Width="30" /> - + \ No newline at end of file diff --git a/Views/Dialog/MsgDialog.xaml.cs b/Views/Dialog/MsgDialog.xaml.cs index a46d98b..d3d117a 100644 --- a/Views/Dialog/MsgDialog.xaml.cs +++ b/Views/Dialog/MsgDialog.xaml.cs @@ -1,4 +1,5 @@ -using System.Windows; +using System.ComponentModel; +using System.Windows; using System.Windows.Input; using System.Windows.Media; @@ -7,13 +8,29 @@ namespace SparkClient.Views.Dialog /// /// MsgDialog.xaml 的交互逻辑 /// - public partial class MsgDialog : Window + public partial class MsgDialog : Window, INotifyPropertyChanged { + private string _errorMessage; + + public string ErrorMessage + { + get { return _errorMessage; } + set + { + if (_errorMessage != value) + { + _errorMessage = value; + OnPropertyChanged(nameof(ErrorMessage)); + } + } + } + public MsgDialog() { InitializeComponent(); this.Loaded += (s, e) => ApplyCornerRadiusClip(); this.SizeChanged += (s, e) => ApplyCornerRadiusClip(); + this.DataContext = this; // 设置 DataContext 以便绑定 } /// @@ -58,5 +75,12 @@ namespace SparkClient.Views.Dialog this.DragMove(); } } + + public event PropertyChangedEventHandler PropertyChanged; + + protected virtual void OnPropertyChanged(string propertyName) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } } -} \ No newline at end of file +}