IConfigService.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.Threading.Tasks;
  5. using TeamAAS_VP.Models;
  6. using TeamAAS_VP.Models.Calibration;
  7. using TeamAAS_VP.Models.Feeder;
  8. using TeamAAS_VP.Models.Lights;
  9. using TeamAAS_VP.Models.PLC;
  10. using TeamAAS_VP.Models.ScrewDriver;
  11. namespace TeamAAS_VP.Interfaces
  12. {
  13. /// <summary>
  14. /// 配置管理服务:管理系统设置、相机、机器人、Feeder、PLC、后台通讯等配置的增删改查与持久化。
  15. /// 实现类负责在内存与持久化存储(例如文件或数据库)之间同步数据,并提供同步与异步的加载/保存接口。
  16. /// </summary>
  17. public interface IConfigService : IDisposable
  18. {
  19. // Load/Save
  20. /// <summary>
  21. /// 同步加载所有配置(从持久化存储读取并更新内存中的配置)。
  22. /// </summary>
  23. /// <remarks>
  24. /// 该方法为阻塞调用,适用于应用启动时或明确需要同步加载的场景。
  25. /// 实现应保证在发生错误时记录日志并在必要时抛出异常以通知调用方。
  26. /// </remarks>
  27. void LoadAll();
  28. /// <summary>
  29. /// 异步加载所有配置(从持久化存储读取并更新内存中的配置)。
  30. /// </summary>
  31. /// <returns>一个表示异步加载操作的任务。</returns>
  32. Task LoadAllAsync();
  33. /// <summary>
  34. /// 同步保存所有当前内存中的配置到持久化存储。
  35. /// </summary>
  36. /// <remarks>
  37. /// 该方法为阻塞调用,适用于需要立即保证配置持久化的场景。
  38. /// </remarks>
  39. void SaveAll();
  40. /// <summary>
  41. /// 异步保存所有当前内存中的配置到持久化存储。
  42. /// </summary>
  43. /// <returns>表示保存操作完成的任务。</returns>
  44. Task SaveAllAsync();
  45. // Cameras
  46. /// <summary>
  47. /// 获取所有已注册的相机信息的只读集合。
  48. /// </summary>
  49. /// <returns>相机信息的只读集合快照。</returns>
  50. IReadOnlyCollection<CameraInfo> GetAllCameras();
  51. /// <summary>
  52. /// 根据标识获取单个相机信息。
  53. /// </summary>
  54. /// <param name="id">相机的唯一标识符。</param>
  55. /// <returns>对应的 <see cref="CameraInfo"/> 实例;若未找到则返回 null。</returns>
  56. CameraInfo GetCamera(Guid id);
  57. /// <summary>
  58. /// 新增或更新指定的相机信息。
  59. /// </summary>
  60. /// <param name="camera">要新增或更新的相机信息,不能为 null。</param>
  61. /// <exception cref="ArgumentNullException">当 <paramref name="camera"/> 为 null 时抛出。</exception>
  62. CameraInfo AddOrUpdateCamera(CameraInfo camera);
  63. /// <summary>
  64. /// 移除指定标识的相机信息。
  65. /// </summary>
  66. /// <param name="id">要移除的相机的唯一标识符。</param>
  67. /// <returns>如果找到并移除成功则返回 true;否则返回 false。</returns>
  68. bool RemoveCamera(Guid id);
  69. /// <summary>
  70. /// 判断是否包含指定标识的相机配置。
  71. /// </summary>
  72. /// <param name="id">相机唯一标识符。</param>
  73. /// <returns>存在则返回 true,否则返回 false。</returns>
  74. bool ContainsCamera(Guid id);
  75. // Robots
  76. /// <summary>
  77. /// 获取所有已注册的机器人信息的只读集合。
  78. /// </summary>
  79. /// <returns>机器人信息的只读集合快照。</returns>
  80. IReadOnlyCollection<RobotInfo> GetAllRobots();
  81. /// <summary>
  82. /// 根据标识获取单个机器人信息。
  83. /// </summary>
  84. /// <param name="id">机器人的唯一标识符。</param>
  85. /// <returns>对应的 <see cref="RobotInfo"/> 实例;若未找到则返回 null。</returns>
  86. RobotInfo GetRobot(Guid id);
  87. /// <summary>
  88. /// 新增或更新指定的机器人信息。
  89. /// </summary>
  90. /// <param name="robot">要新增或更新的机器人信息,不能为 null。</param>
  91. /// <exception cref="ArgumentNullException">当 <paramref name="robot"/> 为 null 时抛出。</exception>
  92. RobotInfo AddOrUpdateRobot(RobotInfo robot);
  93. /// <summary>
  94. /// 移除指定标识的机器人信息。
  95. /// </summary>
  96. /// <param name="id">要移除的机器人的唯一标识符。</param>
  97. /// <returns>如果找到并移除成功则返回 true;否则返回 false。</returns>
  98. bool RemoveRobot(Guid id);
  99. /// <summary>
  100. /// 判断是否包含指定标识的机器人配置。
  101. /// </summary>
  102. /// <param name="id">机器人唯一标识符。</param>
  103. /// <returns>存在则返回 true,否则返回 false。</returns>
  104. bool ContainsRobot(Guid id);
  105. /// <summary>
  106. /// 修改指定机器人id的步进距离
  107. /// </summary>
  108. /// <param name="id">机器人唯一标识符。</param>
  109. /// <param name="stepDistance">步进距离</param>
  110. /// <returns></returns>
  111. bool UpdateRobotStepDistance(Guid id, double stepDistance);
  112. /// <summary>
  113. /// 获取指定机器人Id的步进距离
  114. /// </summary>
  115. /// <param name="id"></param>
  116. /// <returns></returns>
  117. double GetRobotStepDistance(Guid id);
  118. // Feeders
  119. /// <summary>
  120. /// 获取所有已注册的 Feeder 信息的只读集合。
  121. /// </summary>
  122. /// <returns>Feeder 信息的只读集合快照。</returns>
  123. IReadOnlyCollection<FeederInfo> GetAllFeeders();
  124. /// <summary>
  125. /// 根据标识获取单个 Feeder 信息。
  126. /// </summary>
  127. /// <param name="id">Feeder 的唯一标识符。</param>
  128. /// <returns>对应的 <see cref="FeederInfo"/> 实例;若未找到则返回 null。</returns>
  129. FeederInfo GetFeeder(Guid id);
  130. /// <summary>
  131. /// 新增或更新指定的 Feeder 信息。
  132. /// </summary>
  133. /// <param name="feeder">要新增或更新的 Feeder 信息,不能为 null。</param>
  134. /// <exception cref="ArgumentNullException">当 <paramref name="feeder"/> 为 null 时抛出。</exception>
  135. FeederInfo AddOrUpdateFeeder(FeederInfo feeder);
  136. /// <summary>
  137. /// 移除指定标识的 Feeder 信息。
  138. /// </summary>
  139. /// <param name="id">要移除的 Feeder 的唯一标识符。</param>
  140. /// <returns>如果找到并移除成功则返回 true;否则返回 false。</returns>
  141. bool RemoveFeeder(Guid id);
  142. /// <summary>
  143. /// 判断是否包含指定标识的 Feeder 配置。
  144. /// </summary>
  145. /// <param name="id">Feeder 唯一标识符。</param>
  146. /// <returns>存在则返回 true,否则返回 false。</returns>
  147. bool ContainsFeeder(Guid id);
  148. // PLCs
  149. /// <summary>
  150. /// 获取所有已注册的 PLC 信息的只读集合。
  151. /// </summary>
  152. /// <returns>PLC 信息的只读集合快照。</returns>
  153. IReadOnlyCollection<PlcInfo> GetAllPlcs();
  154. /// <summary>
  155. /// 根据标识获取单个 PLC 信息。
  156. /// </summary>
  157. /// <param name="id">PLC 的唯一标识符。</param>
  158. /// <returns>对应的 <see cref="PlcInfo"/> 实例;若未找到则返回 null。</returns>
  159. PlcInfo GetPlc(Guid id);
  160. /// <summary>
  161. /// 新增或更新指定的 PLC 信息。
  162. /// </summary>
  163. /// <param name="plc">要新增或更新的 PLC 信息,不能为 null。</param>
  164. /// <exception cref="ArgumentNullException">当 <paramref name="plc"/> 为 null 时抛出。</exception>
  165. PlcInfo AddOrUpdatePlc(PlcInfo plc);
  166. /// <summary>
  167. /// 移除指定标识的 PLC 信息。
  168. /// </summary>
  169. /// <param name="id">要移除的 PLC 的唯一标识符。</param>
  170. /// <returns>如果找到并移除成功则返回 true;否则返回 false。</returns>
  171. bool RemovePlc(Guid id);
  172. /// <summary>
  173. /// 判断是否包含指定标识的 PLC 配置。
  174. /// </summary>
  175. /// <param name="id">PLC 唯一标识符。</param>
  176. /// <returns>存在则返回 true,否则返回 false。</returns>
  177. bool ContainsPlc(Guid id);
  178. // Plc Addresses
  179. /// <summary>
  180. /// Get all PlcAddress entries
  181. /// </summary>
  182. /// <returns></returns>
  183. PlcAddressConfig GetPlcAddresses();
  184. // Background TCP
  185. /// <summary>
  186. /// 获取后台通讯(TCP/IP)配置。
  187. /// </summary>
  188. /// <returns>当前后台 TCP 配置快照。</returns>
  189. BgTcpIP GetBgTcp();
  190. /// <summary>
  191. /// 设置后台通讯(TCP/IP)配置(仅更新内存)。
  192. /// </summary>
  193. /// <param name="cfg">新的后台 TCP 配置,不能为 null。</param>
  194. /// <exception cref="ArgumentNullException">当 <paramref name="cfg"/> 为 null 时抛出。</exception>
  195. void SetBgTcp(BgTcpIP cfg);
  196. /// <summary>
  197. /// 将当前内存中的后台 TCP 配置保存到持久化存储。
  198. /// </summary>
  199. void SaveBgTcp();
  200. // Background Modbus
  201. /// <summary>
  202. /// 获取后台 Modbus TCP 配置。
  203. /// </summary>
  204. /// <returns>当前后台 Modbus TCP 配置快照。</returns>
  205. BgModbusTcp GetBgModbusTcp();
  206. /// <summary>
  207. /// 设置后台 Modbus TCP 配置(仅更新内存)。
  208. /// </summary>
  209. /// <param name="cfg">新的后台 Modbus TCP 配置,不能为 null。</param>
  210. /// <exception cref="ArgumentNullException">当 <paramref name="cfg"/> 为 null 时抛出。</exception>
  211. void SetBgModbusTcp(BgModbusTcp cfg);
  212. /// <summary>
  213. /// 将当前内存中的后台 Modbus TCP 配置保存到持久化存储。
  214. /// </summary>
  215. void SaveBgModbusTcp();
  216. //系统设置
  217. /// <summary>
  218. /// 获取系统设置
  219. /// </summary>
  220. /// <returns></returns>
  221. SystemConfiguration GetSystemConfiguration();
  222. /// <summary>
  223. /// 保存系统设置
  224. /// </summary>
  225. void SaveSystemConfiguration(SystemConfiguration systemConfiguration);
  226. //清料任务
  227. /// <summary>
  228. /// 获取所有清料任务
  229. /// </summary>
  230. /// <returns></returns>
  231. IReadOnlyCollection<FeederClearWork> GetAllClearanceTasks();
  232. /// <summary>
  233. /// 新增或更新清料任务
  234. /// </summary>
  235. /// <param name="task"></param>
  236. /// <returns></returns>
  237. FeederClearWork AddOrUpdateClearanceTask(FeederClearWork task);
  238. /// <summary>
  239. /// 移除清料任务
  240. /// </summary>
  241. /// <param name="id"></param>
  242. /// <returns></returns>
  243. bool RemoveClearanceTask(Guid id);
  244. /// <summary>
  245. /// 清除所有清料任务
  246. /// </summary>
  247. void ClearAllClearanceTasks();
  248. /// <summary>
  249. /// 判断是否包含指定标识的清料任务
  250. /// </summary>
  251. /// <param name="id"></param>
  252. /// <returns></returns>
  253. bool ContainsClearanceTask(Guid id);
  254. /// <summary>
  255. /// 根据标识获取单个清料任务信息
  256. /// </summary>
  257. /// <param name="id"></param>
  258. /// <returns></returns>
  259. FeederClearWork GetClearanceTask(Guid id);
  260. /// <summary>
  261. /// 判断是否包含指定编号的清料任务
  262. /// </summary>
  263. /// <param name="taskNumber"></param>
  264. /// <returns></returns>
  265. bool ContainsClearanceTaskByNumber(int taskNumber);
  266. /// <summary>
  267. /// 根据编号获取单个清料任务信息
  268. /// </summary>
  269. /// <param name="taskNumber"></param>
  270. /// <returns></returns>
  271. FeederClearWork GetClearanceTaskByNumber(int taskNumber);
  272. // Light controllers and channels
  273. /// <summary>
  274. /// 获取所有已注册的灯光控制器信息的只读集合。
  275. /// </summary>
  276. /// <returns>灯光控制器信息的只读集合快照。</returns>
  277. IReadOnlyCollection<LightControllerConfig> GetAllLightControllers();
  278. /// <summary>
  279. /// 根据标识获取单个灯光控制器信息。
  280. /// </summary>
  281. /// <param name="id">灯光控制器的唯一标识符。</param>
  282. /// <returns>对应的 <see cref="LightControllerConfig"/> 实例;若未找到则返回 null。</returns>
  283. LightControllerConfig GetLightController(int id);
  284. /// <summary>
  285. /// 新增或更新指定的灯光控制器信息。
  286. /// </summary>
  287. /// <param name="controller">要新增或更新的灯光控制器信息,不能为 null。</param>
  288. /// <exception cref="ArgumentNullException">当 <paramref name="controller"/> 为 null 时抛出。</exception>
  289. LightControllerConfig AddOrUpdateLightController(LightControllerConfig controller);
  290. /// <summary>
  291. /// 移除指定标识的灯光控制器信息。
  292. /// </summary>
  293. /// <param name="id">要移除的灯光控制器的唯一标识符。</param>
  294. /// <returns>如果找到并移除成功则返回 true;否则返回 false。</returns>
  295. bool RemoveLightController(int id);
  296. /// <summary>
  297. /// 判断是否包含指定标识的灯光控制器配置。
  298. /// </summary>
  299. /// <param name="id">灯光控制器唯一标识符。</param>
  300. /// <returns>存在则返回 true,否则返回 false。</returns>
  301. bool ContainsLightController(int id);
  302. /// <summary>
  303. /// 获取所有已注册的灯光通道信息的只读集合。
  304. /// </summary>
  305. /// <returns>灯光通道信息的只读集合快照。</returns>
  306. IReadOnlyCollection<ChannelConfig> GetAllLightChannels();
  307. /// <summary>
  308. /// 根据全局索引获取单个灯光通道信息。
  309. /// </summary>
  310. /// <param name="globalIndex">灯光通道的全局索引。</param>
  311. /// <returns>对应的 <see cref="ChannelConfig"/> 实例;若未找到则返回 null。</returns>
  312. ChannelConfig GetLightChannelByGlobalIndex(int globalIndex);
  313. /// <summary>
  314. /// 判断是否包含指定全局索引的灯光通道配置。
  315. /// </summary>
  316. /// <param name="globalIndex">灯光通道的全局索引。</param>
  317. /// <returns>存在则返回 true,否则返回 false。</returns>
  318. bool ContainsLightChannelByGlobalIndex(int globalIndex);
  319. /// <summary>
  320. /// 更新指定灯光通道的默认亮度值并保存到持久化存储。
  321. /// </summary>
  322. /// <param name="globalIndex">灯光通道的全局索引。</param>
  323. /// <param name="brightness">新的默认亮度值,范围应在合适的区间内。</param>
  324. /// <returns>如果找到并更新成功则返回 true;否则返回 false。</returns>
  325. bool UpdateChannelDefaultBrightness(int globalIndex, int brightness);
  326. // Screw driver (single device) configuration accessors
  327. /// <summary>
  328. /// 获取电批配置(单设备)。
  329. /// </summary>
  330. /// <returns>当前的 <see cref="ScrewDriverConfig"/>,若未加载则返回 null。</returns>
  331. ScrewDriverConfig GetScrewDriverConfig();
  332. /// <summary>
  333. /// 设置并持久化电批配置(单设备)。
  334. /// </summary>
  335. /// <param name="cfg">新的配置对象,不能为空。</param>
  336. void SetScrewDriverConfig(ScrewDriverConfig cfg);
  337. // Device info
  338. /// <summary>
  339. /// 获取或创建设备信息配置
  340. /// </summary>
  341. DeviceInfo GetDeviceInfo();
  342. /// <summary>
  343. /// 保存设备信息配置
  344. /// </summary>
  345. void SaveDeviceInfo(DeviceInfo deviceInfo);
  346. /// <summary>
  347. /// 仅将当前内存中的电批配置保存到文件。
  348. /// </summary>
  349. void SaveScrewDriverConfig();
  350. // Screw feeder (material) management
  351. /// <summary>
  352. /// 获取所有已注册的螺丝供料器信息的只读集合。
  353. /// </summary>
  354. IReadOnlyCollection<ScrewFeederInfo> GetAllScrewFeeders();
  355. /// <summary>
  356. /// 根据标识获取单个螺丝供料器信息。
  357. /// </summary>
  358. ScrewFeederInfo GetScrewFeeder(Guid id);
  359. /// <summary>
  360. /// 新增或更新指定的螺丝供料器信息。
  361. /// </summary>
  362. ScrewFeederInfo AddOrUpdateScrewFeeder(ScrewFeederInfo feeder);
  363. /// <summary>
  364. /// 移除指定标识的螺丝供料器信息。
  365. /// </summary>
  366. bool RemoveScrewFeeder(Guid id);
  367. /// <summary>
  368. /// 判断是否包含指定标识的螺丝供料器配置。
  369. /// </summary>
  370. bool ContainsScrewFeeder(Guid id);
  371. /// <summary>
  372. /// 为指定供料器编号递减指定数量(通常为 1),若数量不足返回 false
  373. /// </summary>
  374. int DecrementScrewCountByFeederNumber(int feederNumber, int decrement = 1);
  375. /// <summary>
  376. /// 清除指定供料器编号的螺丝信息(批次号与剩余数量置空/置0)
  377. /// </summary>
  378. void ClearScrewFeederByNumber(int feederNumber);
  379. /// <summary>
  380. /// 为指定供料器编号设置螺丝批次号,并在原有剩余数量上增加一包的数量(PackSize)
  381. /// </summary>
  382. void SetBatchForFeederNumber(int feederNumber, string batchNumber);
  383. /// <summary>
  384. /// 获取指定供料器编号的剩余螺丝数量(找不到返回 -1)
  385. /// </summary>
  386. int GetRemainingCountByFeederNumber(int feederNumber);
  387. /// <summary>
  388. /// 获取指定供料器编号的低量报警状态(找不到返回 false)
  389. /// </summary>
  390. bool GetLowLevelAlarmStatusByFeederNumber(int feederNumber);
  391. /// <summary>
  392. /// 当某个螺丝供料器触发低量报警时会触发此事件,订阅者可用于上报或 UI 提示。
  393. /// </summary>
  394. event Action<ScrewFeederInfo> ScrewFeederLowLevelAlarmTriggered;
  395. /// <summary>
  396. /// 检查剩余螺丝是否报警
  397. /// </summary>
  398. bool CheckAlarm(int feederNumber);
  399. //刷卡登录
  400. /// <summary>
  401. /// 获取刷卡器配置
  402. /// </summary>
  403. /// <returns></returns>
  404. SerialPortConfig GetCardReaderConfig();
  405. /// <summary>
  406. /// 保存刷卡器配置
  407. /// </summary>
  408. /// <param name="config"></param>
  409. void SaveCardReaderConfig(SerialPortConfig config);
  410. }
  411. }