engine_twain32.cs 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859
  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. http_manager.ready_list.Clear();
  194. if (!config_environment.use_source_ui)
  195. {
  196. biz_engine_prepare.prepare();
  197. biz_property_scanner_to_engine.Set(universe.engine, scanner);
  198. file_manager.temp_count = 0;
  199. universe.frm_handler.Invoke(new Action(() =>
  200. {
  201. universe.engine.Acquire();
  202. //if (config_environment.use_source_ui)
  203. //{
  204. // //biz_engine_side.active_3rd_form(main_window);
  205. // biz_engine_side.active_3rd_form(universe.frm_handler);
  206. //}
  207. }));
  208. }
  209. else
  210. {
  211. Scan_pop(scanner);
  212. }
  213. result.Status = 1;
  214. result.Message = "ok";
  215. }
  216. }
  217. }
  218. return result;
  219. }
  220. /// <summary>
  221. /// 激活扫描仪
  222. /// </summary>
  223. /// <param name="scanner"></param>
  224. /// <returns></returns>
  225. public async Task<ResponseEntity> set_current(Device_Scanner scanner)
  226. {
  227. ResponseEntity result = new ResponseEntity();
  228. biz_engine_side.check_all();
  229. biz_dynam.kill_process();
  230. try
  231. {
  232. if (scanner != null)
  233. {
  234. //if (!scanner.openSourceReady || !await check_online())
  235. if (!scanner.openSourceReady)
  236. {
  237. result = await Task.Run(() => { return set_current_method(scanner); });
  238. if (result.Status == 1)
  239. {
  240. scanner_manager.set_current(scanner.dsIndex);
  241. }
  242. }
  243. //if (scanner.openSourceReady && await check_online())
  244. if (scanner.openSourceReady)
  245. {
  246. result.Status = 1;
  247. result.Message = "ok";
  248. }
  249. else
  250. {
  251. scanner_manager.set_current(-1);
  252. result.Status = 0;
  253. result.Message = "未正常连接扫描设备";
  254. }
  255. }
  256. else
  257. {
  258. scanner_manager.set_current(-1);
  259. result.Status = 0;
  260. result.Message = "请选择扫描设备";
  261. }
  262. }
  263. catch (Exception ee)
  264. {
  265. scanner_manager.set_current(-1);
  266. if (!ee.Message.Contains("DS or DSM reported error, application shouldn't"))
  267. {
  268. LogManager.WriteLog(ee);
  269. }
  270. result.Status = 0;
  271. result.Message = "扫描设备连接失败";
  272. }
  273. return result;
  274. }
  275. /// <summary>
  276. /// 激活扫描仪 具体业务
  277. /// </summary>
  278. /// <param name="scanner"></param>
  279. /// <returns></returns>
  280. private ResponseEntity set_current_method(Device_Scanner scanner)
  281. {
  282. ResponseEntity result = new ResponseEntity();
  283. try
  284. {
  285. universe.frm_handler.Invoke(new Action(() =>
  286. {
  287. try
  288. {
  289. universe.engine.CloseDataSource();
  290. universe.engine.SourceIndex = scanner.dsIndex;
  291. if (universe.engine.OpenDataSource())
  292. {
  293. universe.engine.SetCap(TwCap.Indicators, false);
  294. result.Status = 1;
  295. result.Message = "ok";
  296. }
  297. }
  298. catch (Exception ee)
  299. {
  300. scanner_manager.set_current(-1);
  301. if (ee.Message.Contains("DG") || ee.Message.Contains("正在中止线程"))
  302. {
  303. result.Status = -1;
  304. }
  305. else
  306. {
  307. if (!ee.Message.Contains("DS or DSM reported error, application shouldn't"))
  308. {
  309. LogManager.WriteLog(ee);
  310. }
  311. result.Status = 0;
  312. result.Message = "扫描设备连接失败";
  313. }
  314. }
  315. }));
  316. }
  317. catch (Exception ee)
  318. {
  319. scanner_manager.set_current(-1);
  320. if (ee.Message.Contains("DG") || ee.Message.Contains("正在中止线程"))
  321. {
  322. result.Status = -1;
  323. }
  324. else
  325. {
  326. if (!ee.Message.Contains("DS or DSM reported error, application shouldn't"))
  327. {
  328. LogManager.WriteLog(ee);
  329. }
  330. result.Status = 0;
  331. result.Message = "扫描设备连接失败";
  332. }
  333. }
  334. return result;
  335. }
  336. //private async Task<bool> check_online()
  337. //{
  338. // ResponseEntity<bool> result = new ResponseEntity<bool>();
  339. // var timeout = 2000;
  340. // Thread t = new Thread(() =>
  341. // {
  342. // var r = check_online_method();
  343. // result.Status = 1;
  344. // result.Message = "ok";
  345. // result.Data = r;
  346. // });
  347. // t.Start();
  348. // Stopwatch sw = new Stopwatch();
  349. // sw.Start();
  350. // await Task.Run(() =>
  351. // {
  352. // while (true)
  353. // {
  354. // try
  355. // {
  356. // if (result.Status == 1)
  357. // {
  358. // break;
  359. // }
  360. // else
  361. // {
  362. // if (sw.ElapsedMilliseconds > timeout)
  363. // {
  364. // result.Status = 0;
  365. // result.Message = "timeout";
  366. // t.Abort();
  367. // break;
  368. // }
  369. // else
  370. // {
  371. // Thread.Sleep(100);
  372. // }
  373. // }
  374. // }
  375. // catch
  376. // {
  377. // result.Status = 0;
  378. // result.Message = "exception";
  379. // break;
  380. // }
  381. // }
  382. // });
  383. // bool f = false;
  384. // if (result.Status == 1)
  385. // {
  386. // f = result.Data;
  387. // }
  388. // else
  389. // {
  390. // f = false;
  391. // }
  392. // //if (!f)
  393. // //{
  394. // // scanner_manager.set_current(-1);
  395. // //}
  396. // return f;
  397. //}
  398. //private bool check_online_method()
  399. //{
  400. // //while (true) ;
  401. // bool result = false;
  402. // //frm_handler.Invoke(new Action(() =>
  403. // //{
  404. // try
  405. // {
  406. // var obj = universe.engine.GetCap(TwCap.DeviceOnline);
  407. // var r1 = obj as Twain32.Enumeration;
  408. // var r2 = obj as bool?;
  409. // if (r1 != null)
  410. // {
  411. // if ((bool)r1[r1.CurrentIndex])
  412. // {
  413. // result = true;
  414. // }
  415. // }
  416. // else
  417. // {
  418. // if (r2 == true)
  419. // {
  420. // result = true;
  421. // }
  422. // }
  423. // }
  424. // catch (Exception ee2) { }
  425. // //}));
  426. // return result;
  427. //}
  428. //private async Task<bool> check_paper()
  429. //{
  430. // ResponseEntity<bool> result = new ResponseEntity<bool>();
  431. // var timeout = 2000;
  432. // Thread t = new Thread(() =>
  433. // {
  434. // var r = check_paper_method();
  435. // result.Status = 1;
  436. // result.Message = "ok";
  437. // result.Data = r;
  438. // });
  439. // t.Start();
  440. // Stopwatch sw = new Stopwatch();
  441. // sw.Start();
  442. // await Task.Run(() =>
  443. // {
  444. // while (true)
  445. // {
  446. // try
  447. // {
  448. // if (result.Status == 1)
  449. // {
  450. // break;
  451. // }
  452. // else
  453. // {
  454. // if (sw.ElapsedMilliseconds > timeout)
  455. // {
  456. // result.Status = 0;
  457. // result.Message = "timeout";
  458. // t.Abort();
  459. // break;
  460. // }
  461. // else
  462. // {
  463. // Thread.Sleep(100);
  464. // }
  465. // }
  466. // }
  467. // catch
  468. // {
  469. // result.Status = 0;
  470. // result.Message = "exception";
  471. // break;
  472. // }
  473. // }
  474. // });
  475. // if (result.Status == 1)
  476. // {
  477. // return result.Data;
  478. // }
  479. // else
  480. // {
  481. // return false;
  482. // }
  483. //}
  484. /// <summary>
  485. /// 检查是否卡纸
  486. /// </summary>
  487. /// <returns></returns>
  488. private bool check_paper_method()
  489. {
  490. bool result = false;
  491. //frm_handler.Invoke(new Action(() =>
  492. //{
  493. try
  494. {
  495. var obj = universe.engine.GetCap(TwCap.FeederLoaded);
  496. var r1 = obj as Twain32.Enumeration;
  497. var r2 = obj as bool?;
  498. if (r1 != null)
  499. {
  500. if ((bool)r1[r1.CurrentIndex])
  501. {
  502. result = true;
  503. }
  504. }
  505. else
  506. {
  507. if (r2 == true)
  508. {
  509. result = true;
  510. }
  511. }
  512. }
  513. catch (Exception ee2) { }
  514. //}));
  515. return result;
  516. }
  517. ///// <summary>
  518. /////
  519. ///// </summary>
  520. ///// <param name="code"></param>
  521. ///// <returns></returns>
  522. //public ResponseEntity check_engine_status(bool is_heartbeat)
  523. //{
  524. // ResponseEntity result = new ResponseEntity();
  525. // if (config_environment.scan_state)
  526. // {
  527. // if (is_heartbeat)
  528. // {
  529. // if (!check_paper())
  530. // {
  531. // result.Status = 502;
  532. // result.Message = "未检测到纸张或卡纸";
  533. // }
  534. // else
  535. // {
  536. // result.Status = 201;
  537. // result.Message = "扫描仪正在使用中";
  538. // }
  539. // }
  540. // else
  541. // {
  542. // result.Status = 201;
  543. // result.Message = "扫描仪正在使用中";
  544. // }
  545. // }
  546. // else
  547. // {
  548. // try
  549. // {
  550. // if (!check_online())
  551. // {
  552. // result.Status = 501;
  553. // result.Message = "扫描仪未连接";
  554. // }
  555. // else
  556. // {
  557. // if (is_heartbeat)
  558. // {
  559. // result.Status = 200;
  560. // result.Message = "扫描仪就绪";
  561. // }
  562. // else
  563. // {
  564. // if (!check_paper())
  565. // {
  566. // result.Status = 502;
  567. // result.Message = "未检测到纸张或卡纸";
  568. // }
  569. // else
  570. // {
  571. // result.Status = 200;
  572. // result.Message = "扫描仪就绪";
  573. // }
  574. // }
  575. // }
  576. // }
  577. // catch (Exception ee)
  578. // {
  579. // if (ee.Message.Contains("Источник данных не открыт"))
  580. // {
  581. // result.Status = 501;
  582. // result.Message = "扫描仪未连接";
  583. // }
  584. // else
  585. // {
  586. // result.Status = 509;
  587. // result.Message = ee.Message;
  588. // }
  589. // }
  590. // }
  591. // return result;
  592. //}
  593. /// <summary>
  594. /// 初始化状态
  595. /// </summary>
  596. public static bool first_state = false;
  597. /// <summary>
  598. /// 检查当前状态,心跳用
  599. /// </summary>
  600. /// <returns></returns>
  601. public ResponseEntity check_status_heartbeat()
  602. {
  603. ResponseEntity result = new ResponseEntity();
  604. if (config_environment.on_error == null ||
  605. (config_environment.on_error.Status == 1 ||
  606. result.Status == -1 ||
  607. result.Status == 200))
  608. {
  609. if (config_environment.scan_state == false && config_environment.scan_state_socket == true && first_state)
  610. {
  611. Task.Run(() =>
  612. {
  613. Thread.Sleep(3000);
  614. config_environment.scan_state_socket = false;
  615. first_state = false;
  616. });
  617. }
  618. if (config_environment.scan_state_socket)
  619. {
  620. result.Status = 201;
  621. result.Message = "扫描仪正在使用中";
  622. }
  623. else
  624. {
  625. //result.Status = 200;
  626. //result.Message = "扫描仪就绪";
  627. //try
  628. {
  629. //if (!await check_online().ConfigureAwait(false))
  630. if (!check_online_v2())
  631. {
  632. result.Status = 501;
  633. result.Message = "扫描仪未连接";
  634. }
  635. else
  636. {
  637. result.Status = 200;
  638. result.Message = "扫描仪就绪";
  639. }
  640. }
  641. //catch (Exception ee)
  642. //{
  643. // if (ee.Message.Contains("Источник данных не открыт"))
  644. // {
  645. // result.Status = 501;
  646. // result.Message = "扫描仪未连接";
  647. // }
  648. // else
  649. // {
  650. // result.Status = 509;
  651. // result.Message = ee.Message;
  652. // }
  653. //}
  654. }
  655. }
  656. else
  657. {
  658. result.Status = 509;
  659. result.Message = config_environment.on_error.Message;
  660. config_environment.on_error = null;
  661. }
  662. return result;
  663. }
  664. /// <summary>
  665. /// 检查当前状态,扫描用
  666. /// </summary>
  667. /// <returns></returns>
  668. public async Task<ResponseEntity> check_status_scan()
  669. {
  670. ResponseEntity result = new ResponseEntity();
  671. if (config_environment.scan_state)
  672. {
  673. result.Status = 201;
  674. result.Message = "扫描仪正在使用中";
  675. }
  676. else
  677. {
  678. try
  679. {
  680. //if (!await check_online())
  681. //if (!check_online_method())
  682. //{
  683. // result.Status = 501;
  684. // result.Message = "扫描仪未连接";
  685. //}
  686. //else
  687. {
  688. //if (!await check_paper())
  689. if (!check_paper_method())
  690. {
  691. result.Status = 502;
  692. result.Message = "未检测到纸张或卡纸";
  693. }
  694. else
  695. {
  696. result.Status = 200;
  697. result.Message = "扫描仪就绪";
  698. }
  699. }
  700. }
  701. catch (Exception ee)
  702. {
  703. if (ee.Message.Contains("Источник данных не открыт"))
  704. {
  705. result.Status = 501;
  706. result.Message = "扫描仪未连接";
  707. }
  708. else
  709. {
  710. result.Status = 509;
  711. result.Message = ee.Message;
  712. }
  713. }
  714. }
  715. return result;
  716. }
  717. /// <summary>
  718. /// 检查当前状态,界面用
  719. /// </summary>
  720. /// <returns></returns>
  721. public async Task<ResponseEntity> check_status_ui()
  722. {
  723. ResponseEntity result = new ResponseEntity();
  724. if (config_environment.scan_state)
  725. {
  726. result.Status = 201;
  727. result.Message = "扫描仪正在使用中";
  728. }
  729. else
  730. {
  731. try
  732. {
  733. //if (!await check_online().ConfigureAwait(false))
  734. if (!check_online_v2())
  735. {
  736. result.Status = 501;
  737. result.Message = "扫描仪未连接";
  738. }
  739. else
  740. {
  741. result.Status = 200;
  742. result.Message = "扫描仪就绪";
  743. }
  744. }
  745. catch (Exception ee)
  746. {
  747. if (ee.Message.Contains("Источник данных не открыт"))
  748. {
  749. result.Status = 501;
  750. result.Message = "扫描仪未连接";
  751. }
  752. else
  753. {
  754. result.Status = 509;
  755. result.Message = ee.Message;
  756. }
  757. }
  758. }
  759. return result;
  760. }
  761. /// <summary>
  762. /// 检查扫描仪激活情况
  763. /// </summary>
  764. /// <returns></returns>
  765. public bool check_online_v2()
  766. {
  767. return scanner_manager.Scanner_List.Count(x => x.isActive == 1) > 0;
  768. }
  769. }
  770. }