engine_twain32.cs 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.IO;
  7. using System.Configuration;
  8. using System.Windows.Forms;
  9. using System.Threading;
  10. using System.Diagnostics;
  11. using Saraff.Twain;
  12. using HXX.Scanner.Common;
  13. using HXX.Scanner.Biz.Socket;
  14. using HXX.Scanner.Biz.twain32.form;
  15. namespace HXX.Scanner.Biz
  16. {
  17. /// <summary>
  18. /// tw基本类
  19. /// </summary>
  20. public class engine_twain32
  21. {
  22. public engine_twain32(Form _main, ApplicationSettingsBase config, del_change_sanner _method)
  23. {
  24. universe = new biz_thread();
  25. universe.start();
  26. biz_changeScan.change_scanner = _method;
  27. config_manager.Init(config);
  28. current_object = this;
  29. main_window = _main;
  30. }
  31. /// <summary>
  32. /// 类基本实体
  33. /// </summary>
  34. private static engine_twain32 current_object;
  35. /// <summary>
  36. /// tw所运行的消息循环线程
  37. /// </summary>
  38. private static biz_thread universe;
  39. /// <summary>
  40. /// 外部调用窗体,废弃
  41. /// </summary>
  42. private static Form main_window;
  43. /// <summary>
  44. /// 本实体对外引用
  45. /// </summary>
  46. public static engine_twain32 Engine
  47. {
  48. get
  49. {
  50. return current_object;
  51. }
  52. }
  53. /// <summary>
  54. /// 刷新扫描仪列表(仅tw自身所见)
  55. /// </summary>
  56. public void load_tw_scanner_list()
  57. {
  58. try
  59. {
  60. universe.frm_handler.Invoke(new Action(() =>
  61. {
  62. try
  63. {
  64. universe.engine.CloseDataSource();
  65. universe.engine.CloseDSM();
  66. var result_scan = universe.engine.OpenDSM();
  67. scanner_manager.Clear();
  68. List<Device_Scanner> temp_list = new List<Device_Scanner>();
  69. for (int i = 0; i < universe.engine.SourcesCount; i++)
  70. {
  71. //TODO 判断设备类型,有可能把摄像头给加载进来了// 支持2.0及以上的,才加载进来
  72. if (universe.engine.GetIsSourceTwain2Compatible(i))
  73. {
  74. var scanner = new Device_Scanner(universe.engine.GetSourceProductName(i))
  75. {
  76. dsIndex = i
  77. };
  78. biz_property_engine_to_scanner.Set(universe.engine, scanner);
  79. temp_list.Add(scanner);
  80. }
  81. }
  82. add_scanner(temp_list, "canon");
  83. add_scanner(temp_list, "panasonic");
  84. add_scanner(temp_list, "kodak");
  85. add_scanner(temp_list, "huago");
  86. add_scanner(temp_list, "epson");
  87. add_scanner(temp_list, "hp");
  88. add_scanner(temp_list, "fi");
  89. }
  90. catch (Exception ee)
  91. {
  92. LogManager.WriteLog(ee);
  93. }
  94. }));
  95. }
  96. catch (Exception ex)
  97. {
  98. LogManager.WriteLog(ex);
  99. }
  100. }
  101. /// <summary>
  102. /// 添加一台扫描仪
  103. /// </summary>
  104. /// <param name="list"></param>
  105. /// <param name="name"></param>
  106. private void add_scanner(List<Device_Scanner> list, string name)
  107. {
  108. if (name == "huago")
  109. {
  110. foreach (var scanner in list)
  111. {
  112. if (scanner.deviceName.ToLower().Contains(name))
  113. {
  114. scanner_manager.Add(scanner);
  115. }
  116. }
  117. }
  118. else
  119. {
  120. var scanner = list.FirstOrDefault(x => x.deviceName.ToLower().Contains(name));
  121. if (scanner != null)
  122. {
  123. scanner_manager.Add(scanner);
  124. }
  125. }
  126. }
  127. /// <summary>
  128. /// 调用第三方弹框扫描
  129. /// </summary>
  130. /// <param name="scanner"></param>
  131. public void Scan_pop(Device_Scanner scanner)
  132. {
  133. Task.Run(async () =>
  134. {
  135. try
  136. {
  137. biz_dynam.kill_process();
  138. var biz = new biz_pop();
  139. //var biz = new biz_pop2();
  140. try
  141. {
  142. config_environment.scan_state = true;
  143. config_environment.scan_state_socket = true;
  144. universe.engine.CloseDataSource();
  145. biz.scan(scanner.dsIndex);
  146. //biz.scan(scanner, main_window);
  147. }
  148. catch (Exception ee)
  149. {
  150. if (ee.Message.Contains("cancelled"))
  151. {
  152. biz_scanFinishBatch.Work(4, true);
  153. }
  154. else
  155. {
  156. LogManager.WriteLog(ee);
  157. }
  158. }
  159. biz.close();
  160. biz_dynam.kill_process();
  161. biz_scanFinishBatch.Work(5, true);
  162. scanner_manager.set_current(-1);
  163. await set_current(scanner);
  164. biz_scanFinishBatch.Work(6, true);
  165. config_environment.scan_state = false;
  166. config_environment.scan_state_socket = false;
  167. }
  168. catch (Exception ee)
  169. {
  170. LogManager.WriteLog(ee);
  171. }
  172. });
  173. }
  174. /// <summary>
  175. /// 普通扫描
  176. /// </summary>
  177. /// <param name="scanner"></param>
  178. /// <returns></returns>
  179. public async Task<ResponseEntity> Scan(Device_Scanner scanner)
  180. {
  181. ResponseEntity result = new ResponseEntity();
  182. biz_engine_side.check_all();
  183. biz_dynam.kill_process();
  184. result = biz_disk.check_disk_status();
  185. if (result.Status == 200 || result.Status == 510)
  186. {
  187. result = await check_status_scan();
  188. if (result.Status == 200)
  189. {
  190. result = await set_current(scanner);
  191. if (result.Status == 1)
  192. {
  193. if (!config_environment.use_source_ui)
  194. {
  195. biz_engine_prepare.prepare();
  196. biz_property_scanner_to_engine.Set(universe.engine, scanner);
  197. file_manager.temp_count = 0;
  198. universe.frm_handler.Invoke(new Action(() =>
  199. {
  200. universe.engine.Acquire();
  201. //if (config_environment.use_source_ui)
  202. //{
  203. // //biz_engine_side.active_3rd_form(main_window);
  204. // biz_engine_side.active_3rd_form(universe.frm_handler);
  205. //}
  206. }));
  207. }
  208. else
  209. {
  210. Scan_pop(scanner);
  211. }
  212. result.Status = 1;
  213. result.Message = "ok";
  214. }
  215. }
  216. }
  217. return result;
  218. }
  219. /// <summary>
  220. /// 激活扫描仪
  221. /// </summary>
  222. /// <param name="scanner"></param>
  223. /// <returns></returns>
  224. public async Task<ResponseEntity> set_current(Device_Scanner scanner)
  225. {
  226. ResponseEntity result = new ResponseEntity();
  227. biz_engine_side.check_all();
  228. biz_dynam.kill_process();
  229. try
  230. {
  231. if (scanner != null)
  232. {
  233. //if (!scanner.openSourceReady || !await check_online())
  234. if (!scanner.openSourceReady)
  235. {
  236. result = await Task.Run(() => { return set_current_method(scanner); });
  237. if (result.Status == 1)
  238. {
  239. scanner_manager.set_current(scanner.dsIndex);
  240. }
  241. }
  242. //if (scanner.openSourceReady && await check_online())
  243. if (scanner.openSourceReady)
  244. {
  245. result.Status = 1;
  246. result.Message = "ok";
  247. }
  248. else
  249. {
  250. scanner_manager.set_current(-1);
  251. result.Status = 0;
  252. result.Message = "未正常连接扫描设备";
  253. }
  254. }
  255. else
  256. {
  257. scanner_manager.set_current(-1);
  258. result.Status = 0;
  259. result.Message = "请选择扫描设备";
  260. }
  261. }
  262. catch (Exception ee)
  263. {
  264. scanner_manager.set_current(-1);
  265. if (!ee.Message.Contains("DS or DSM reported error, application shouldn't"))
  266. {
  267. LogManager.WriteLog(ee);
  268. }
  269. result.Status = 0;
  270. result.Message = "扫描设备连接失败";
  271. }
  272. return result;
  273. }
  274. /// <summary>
  275. /// 激活扫描仪 具体业务
  276. /// </summary>
  277. /// <param name="scanner"></param>
  278. /// <returns></returns>
  279. private ResponseEntity set_current_method(Device_Scanner scanner)
  280. {
  281. ResponseEntity result = new ResponseEntity();
  282. try
  283. {
  284. universe.frm_handler.Invoke(new Action(() =>
  285. {
  286. try
  287. {
  288. universe.engine.CloseDataSource();
  289. universe.engine.SourceIndex = scanner.dsIndex;
  290. if (universe.engine.OpenDataSource())
  291. {
  292. universe.engine.SetCap(TwCap.Indicators, false);
  293. result.Status = 1;
  294. result.Message = "ok";
  295. }
  296. }
  297. catch (Exception ee)
  298. {
  299. scanner_manager.set_current(-1);
  300. if (ee.Message.Contains("DG") || ee.Message.Contains("正在中止线程"))
  301. {
  302. result.Status = -1;
  303. }
  304. else
  305. {
  306. if (!ee.Message.Contains("DS or DSM reported error, application shouldn't"))
  307. {
  308. LogManager.WriteLog(ee);
  309. }
  310. result.Status = 0;
  311. result.Message = "扫描设备连接失败";
  312. }
  313. }
  314. }));
  315. }
  316. catch (Exception ee)
  317. {
  318. scanner_manager.set_current(-1);
  319. if (ee.Message.Contains("DG") || ee.Message.Contains("正在中止线程"))
  320. {
  321. result.Status = -1;
  322. }
  323. else
  324. {
  325. if (!ee.Message.Contains("DS or DSM reported error, application shouldn't"))
  326. {
  327. LogManager.WriteLog(ee);
  328. }
  329. result.Status = 0;
  330. result.Message = "扫描设备连接失败";
  331. }
  332. }
  333. return result;
  334. }
  335. //private async Task<bool> check_online()
  336. //{
  337. // ResponseEntity<bool> result = new ResponseEntity<bool>();
  338. // var timeout = 2000;
  339. // Thread t = new Thread(() =>
  340. // {
  341. // var r = check_online_method();
  342. // result.Status = 1;
  343. // result.Message = "ok";
  344. // result.Data = r;
  345. // });
  346. // t.Start();
  347. // Stopwatch sw = new Stopwatch();
  348. // sw.Start();
  349. // await Task.Run(() =>
  350. // {
  351. // while (true)
  352. // {
  353. // try
  354. // {
  355. // if (result.Status == 1)
  356. // {
  357. // break;
  358. // }
  359. // else
  360. // {
  361. // if (sw.ElapsedMilliseconds > timeout)
  362. // {
  363. // result.Status = 0;
  364. // result.Message = "timeout";
  365. // t.Abort();
  366. // break;
  367. // }
  368. // else
  369. // {
  370. // Thread.Sleep(100);
  371. // }
  372. // }
  373. // }
  374. // catch
  375. // {
  376. // result.Status = 0;
  377. // result.Message = "exception";
  378. // break;
  379. // }
  380. // }
  381. // });
  382. // bool f = false;
  383. // if (result.Status == 1)
  384. // {
  385. // f = result.Data;
  386. // }
  387. // else
  388. // {
  389. // f = false;
  390. // }
  391. // //if (!f)
  392. // //{
  393. // // scanner_manager.set_current(-1);
  394. // //}
  395. // return f;
  396. //}
  397. //private bool check_online_method()
  398. //{
  399. // //while (true) ;
  400. // bool result = false;
  401. // //frm_handler.Invoke(new Action(() =>
  402. // //{
  403. // try
  404. // {
  405. // var obj = universe.engine.GetCap(TwCap.DeviceOnline);
  406. // var r1 = obj as Twain32.Enumeration;
  407. // var r2 = obj as bool?;
  408. // if (r1 != null)
  409. // {
  410. // if ((bool)r1[r1.CurrentIndex])
  411. // {
  412. // result = true;
  413. // }
  414. // }
  415. // else
  416. // {
  417. // if (r2 == true)
  418. // {
  419. // result = true;
  420. // }
  421. // }
  422. // }
  423. // catch (Exception ee2) { }
  424. // //}));
  425. // return result;
  426. //}
  427. //private async Task<bool> check_paper()
  428. //{
  429. // ResponseEntity<bool> result = new ResponseEntity<bool>();
  430. // var timeout = 2000;
  431. // Thread t = new Thread(() =>
  432. // {
  433. // var r = check_paper_method();
  434. // result.Status = 1;
  435. // result.Message = "ok";
  436. // result.Data = r;
  437. // });
  438. // t.Start();
  439. // Stopwatch sw = new Stopwatch();
  440. // sw.Start();
  441. // await Task.Run(() =>
  442. // {
  443. // while (true)
  444. // {
  445. // try
  446. // {
  447. // if (result.Status == 1)
  448. // {
  449. // break;
  450. // }
  451. // else
  452. // {
  453. // if (sw.ElapsedMilliseconds > timeout)
  454. // {
  455. // result.Status = 0;
  456. // result.Message = "timeout";
  457. // t.Abort();
  458. // break;
  459. // }
  460. // else
  461. // {
  462. // Thread.Sleep(100);
  463. // }
  464. // }
  465. // }
  466. // catch
  467. // {
  468. // result.Status = 0;
  469. // result.Message = "exception";
  470. // break;
  471. // }
  472. // }
  473. // });
  474. // if (result.Status == 1)
  475. // {
  476. // return result.Data;
  477. // }
  478. // else
  479. // {
  480. // return false;
  481. // }
  482. //}
  483. /// <summary>
  484. /// 检查是否卡纸
  485. /// </summary>
  486. /// <returns></returns>
  487. private bool check_paper_method()
  488. {
  489. bool result = false;
  490. //frm_handler.Invoke(new Action(() =>
  491. //{
  492. try
  493. {
  494. var obj = universe.engine.GetCap(TwCap.FeederLoaded);
  495. var r1 = obj as Twain32.Enumeration;
  496. var r2 = obj as bool?;
  497. if (r1 != null)
  498. {
  499. if ((bool)r1[r1.CurrentIndex])
  500. {
  501. result = true;
  502. }
  503. }
  504. else
  505. {
  506. if (r2 == true)
  507. {
  508. result = true;
  509. }
  510. }
  511. }
  512. catch (Exception ee2) { }
  513. //}));
  514. return result;
  515. }
  516. ///// <summary>
  517. /////
  518. ///// </summary>
  519. ///// <param name="code"></param>
  520. ///// <returns></returns>
  521. //public ResponseEntity check_engine_status(bool is_heartbeat)
  522. //{
  523. // ResponseEntity result = new ResponseEntity();
  524. // if (config_environment.scan_state)
  525. // {
  526. // if (is_heartbeat)
  527. // {
  528. // if (!check_paper())
  529. // {
  530. // result.Status = 502;
  531. // result.Message = "未检测到纸张或卡纸";
  532. // }
  533. // else
  534. // {
  535. // result.Status = 201;
  536. // result.Message = "扫描仪正在使用中";
  537. // }
  538. // }
  539. // else
  540. // {
  541. // result.Status = 201;
  542. // result.Message = "扫描仪正在使用中";
  543. // }
  544. // }
  545. // else
  546. // {
  547. // try
  548. // {
  549. // if (!check_online())
  550. // {
  551. // result.Status = 501;
  552. // result.Message = "扫描仪未连接";
  553. // }
  554. // else
  555. // {
  556. // if (is_heartbeat)
  557. // {
  558. // result.Status = 200;
  559. // result.Message = "扫描仪就绪";
  560. // }
  561. // else
  562. // {
  563. // if (!check_paper())
  564. // {
  565. // result.Status = 502;
  566. // result.Message = "未检测到纸张或卡纸";
  567. // }
  568. // else
  569. // {
  570. // result.Status = 200;
  571. // result.Message = "扫描仪就绪";
  572. // }
  573. // }
  574. // }
  575. // }
  576. // catch (Exception ee)
  577. // {
  578. // if (ee.Message.Contains("Источник данных не открыт"))
  579. // {
  580. // result.Status = 501;
  581. // result.Message = "扫描仪未连接";
  582. // }
  583. // else
  584. // {
  585. // result.Status = 509;
  586. // result.Message = ee.Message;
  587. // }
  588. // }
  589. // }
  590. // return result;
  591. //}
  592. /// <summary>
  593. /// 初始化状态
  594. /// </summary>
  595. public static bool first_state = false;
  596. /// <summary>
  597. /// 检查当前状态,心跳用
  598. /// </summary>
  599. /// <returns></returns>
  600. public ResponseEntity check_status_heartbeat()
  601. {
  602. ResponseEntity result = new ResponseEntity();
  603. if (config_environment.on_error == null ||
  604. (config_environment.on_error.Status == 1 ||
  605. result.Status == -1 ||
  606. result.Status == 200))
  607. {
  608. if (config_environment.scan_state == false && config_environment.scan_state_socket == true && first_state)
  609. {
  610. Task.Run(() =>
  611. {
  612. Thread.Sleep(3000);
  613. config_environment.scan_state_socket = false;
  614. first_state = false;
  615. });
  616. }
  617. if (config_environment.scan_state_socket)
  618. {
  619. result.Status = 201;
  620. result.Message = "扫描仪正在使用中";
  621. }
  622. else
  623. {
  624. //result.Status = 200;
  625. //result.Message = "扫描仪就绪";
  626. //try
  627. {
  628. //if (!await check_online().ConfigureAwait(false))
  629. if (!check_online_v2())
  630. {
  631. result.Status = 501;
  632. result.Message = "扫描仪未连接";
  633. }
  634. else
  635. {
  636. result.Status = 200;
  637. result.Message = "扫描仪就绪";
  638. }
  639. }
  640. //catch (Exception ee)
  641. //{
  642. // if (ee.Message.Contains("Источник данных не открыт"))
  643. // {
  644. // result.Status = 501;
  645. // result.Message = "扫描仪未连接";
  646. // }
  647. // else
  648. // {
  649. // result.Status = 509;
  650. // result.Message = ee.Message;
  651. // }
  652. //}
  653. }
  654. }
  655. else
  656. {
  657. result.Status = 509;
  658. result.Message = config_environment.on_error.Message;
  659. config_environment.on_error = null;
  660. }
  661. return result;
  662. }
  663. /// <summary>
  664. /// 检查当前状态,扫描用
  665. /// </summary>
  666. /// <returns></returns>
  667. public async Task<ResponseEntity> check_status_scan()
  668. {
  669. ResponseEntity result = new ResponseEntity();
  670. if (config_environment.scan_state)
  671. {
  672. result.Status = 201;
  673. result.Message = "扫描仪正在使用中";
  674. }
  675. else
  676. {
  677. try
  678. {
  679. //if (!await check_online())
  680. //if (!check_online_method())
  681. //{
  682. // result.Status = 501;
  683. // result.Message = "扫描仪未连接";
  684. //}
  685. //else
  686. {
  687. //if (!await check_paper())
  688. if (!check_paper_method())
  689. {
  690. result.Status = 502;
  691. result.Message = "未检测到纸张或卡纸";
  692. }
  693. else
  694. {
  695. result.Status = 200;
  696. result.Message = "扫描仪就绪";
  697. }
  698. }
  699. }
  700. catch (Exception ee)
  701. {
  702. if (ee.Message.Contains("Источник данных не открыт"))
  703. {
  704. result.Status = 501;
  705. result.Message = "扫描仪未连接";
  706. }
  707. else
  708. {
  709. result.Status = 509;
  710. result.Message = ee.Message;
  711. }
  712. }
  713. }
  714. return result;
  715. }
  716. /// <summary>
  717. /// 检查当前状态,界面用
  718. /// </summary>
  719. /// <returns></returns>
  720. public async Task<ResponseEntity> check_status_ui()
  721. {
  722. ResponseEntity result = new ResponseEntity();
  723. if (config_environment.scan_state)
  724. {
  725. result.Status = 201;
  726. result.Message = "扫描仪正在使用中";
  727. }
  728. else
  729. {
  730. try
  731. {
  732. //if (!await check_online().ConfigureAwait(false))
  733. if (!check_online_v2())
  734. {
  735. result.Status = 501;
  736. result.Message = "扫描仪未连接";
  737. }
  738. else
  739. {
  740. result.Status = 200;
  741. result.Message = "扫描仪就绪";
  742. }
  743. }
  744. catch (Exception ee)
  745. {
  746. if (ee.Message.Contains("Источник данных не открыт"))
  747. {
  748. result.Status = 501;
  749. result.Message = "扫描仪未连接";
  750. }
  751. else
  752. {
  753. result.Status = 509;
  754. result.Message = ee.Message;
  755. }
  756. }
  757. }
  758. return result;
  759. }
  760. /// <summary>
  761. /// 检查扫描仪激活情况
  762. /// </summary>
  763. /// <returns></returns>
  764. public bool check_online_v2()
  765. {
  766. return scanner_manager.Scanner_List.Count(x => x.isActive == 1) > 0;
  767. }
  768. }
  769. }