| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.IO;
- using System.Configuration;
- using System.Windows.Forms;
- using System.Threading;
- using System.Diagnostics;
- using Saraff.Twain;
- using HXX.Scanner.Common;
- using HXX.Scanner.Biz.Socket;
- using HXX.Scanner.Biz.twain32.form;
- namespace HXX.Scanner.Biz
- {
- /// <summary>
- /// tw基本类
- /// </summary>
- public class engine_twain32
- {
- public engine_twain32(Form _main, ApplicationSettingsBase config, del_change_sanner _method)
- {
- universe = new biz_thread();
- universe.start();
- biz_changeScan.change_scanner = _method;
- config_manager.Init(config);
- current_object = this;
- main_window = _main;
- }
- /// <summary>
- /// 类基本实体
- /// </summary>
- private static engine_twain32 current_object;
- /// <summary>
- /// tw所运行的消息循环线程
- /// </summary>
- private static biz_thread universe;
- /// <summary>
- /// 外部调用窗体,废弃
- /// </summary>
- private static Form main_window;
- /// <summary>
- /// 本实体对外引用
- /// </summary>
- public static engine_twain32 Engine
- {
- get
- {
- return current_object;
- }
- }
- /// <summary>
- /// 刷新扫描仪列表(仅tw自身所见)
- /// </summary>
- public void load_tw_scanner_list()
- {
- try
- {
- universe.frm_handler.Invoke(new Action(() =>
- {
- try
- {
- universe.engine.CloseDataSource();
- universe.engine.CloseDSM();
- var result_scan = universe.engine.OpenDSM();
- scanner_manager.Clear();
- List<Device_Scanner> temp_list = new List<Device_Scanner>();
- for (int i = 0; i < universe.engine.SourcesCount; i++)
- {
- //TODO 判断设备类型,有可能把摄像头给加载进来了// 支持2.0及以上的,才加载进来
- if (universe.engine.GetIsSourceTwain2Compatible(i))
- {
- var scanner = new Device_Scanner(universe.engine.GetSourceProductName(i))
- {
- dsIndex = i
- };
- biz_property_engine_to_scanner.Set(universe.engine, scanner);
- temp_list.Add(scanner);
- }
- }
- add_scanner(temp_list, "canon");
- add_scanner(temp_list, "panasonic");
- add_scanner(temp_list, "kodak");
- add_scanner(temp_list, "huago");
- add_scanner(temp_list, "epson");
- add_scanner(temp_list, "hp");
- add_scanner(temp_list, "fi");
- }
- catch (Exception ee)
- {
- LogManager.WriteLog(ee);
- }
- }));
- }
- catch (Exception ex)
- {
- LogManager.WriteLog(ex);
- }
- }
- /// <summary>
- /// 添加一台扫描仪
- /// </summary>
- /// <param name="list"></param>
- /// <param name="name"></param>
- private void add_scanner(List<Device_Scanner> list, string name)
- {
- if (name == "huago")
- {
- foreach (var scanner in list)
- {
- if (scanner.deviceName.ToLower().Contains(name))
- {
- scanner_manager.Add(scanner);
- }
- }
- }
- else
- {
- var scanner = list.FirstOrDefault(x => x.deviceName.ToLower().Contains(name));
- if (scanner != null)
- {
- scanner_manager.Add(scanner);
- }
- }
- }
- /// <summary>
- /// 调用第三方弹框扫描
- /// </summary>
- /// <param name="scanner"></param>
- public void Scan_pop(Device_Scanner scanner)
- {
- Task.Run(async () =>
- {
- try
- {
- biz_dynam.kill_process();
- //var biz = new biz_pop();
- var biz = new biz_pop2();
- try
- {
- config_environment.scan_state = true;
- config_environment.scan_state_socket = true;
- universe.engine.CloseDataSource();
- //biz.scan(scanner.dsIndex);
- biz.scan(scanner, main_window);
- }
- catch (Exception ee)
- {
- if (ee.Message.Contains("cancelled"))
- {
- biz_scanFinishBatch.Work(4, true);
- }
- else
- {
- LogManager.WriteLog(ee);
- }
- }
- //biz.close();
- //biz_dynam.kill_process();
- biz_scanFinishBatch.Work(5, true);
- scanner_manager.set_current(-1);
- await set_current(scanner);
- biz_scanFinishBatch.Work(6, true);
- config_environment.scan_state = false;
- config_environment.scan_state_socket = false;
- }
- catch (Exception ee)
- {
- LogManager.WriteLog(ee);
- }
- });
- }
- /// <summary>
- /// 普通扫描
- /// </summary>
- /// <param name="scanner"></param>
- /// <returns></returns>
- public async Task<ResponseEntity> Scan(Device_Scanner scanner)
- {
- ResponseEntity result = new ResponseEntity();
- biz_engine_side.check_all();
- biz_dynam.kill_process();
- result = biz_disk.check_disk_status();
- if (result.Status == 200 || result.Status == 510)
- {
- result = await check_status_scan();
- if (result.Status == 200)
- {
- result = await set_current(scanner);
- if (result.Status == 1)
- {
- http_manager.ready_list.Clear();
- if (!config_environment.use_source_ui)
- {
- biz_engine_prepare.prepare();
- biz_property_scanner_to_engine.Set(universe.engine, scanner);
- file_manager.temp_count = 0;
- universe.frm_handler.Invoke(new Action(() =>
- {
- universe.engine.Acquire();
- //if (config_environment.use_source_ui)
- //{
- // //biz_engine_side.active_3rd_form(main_window);
- // biz_engine_side.active_3rd_form(universe.frm_handler);
- //}
- }));
- }
- else
- {
- Scan_pop(scanner);
- }
- result.Status = 1;
- result.Message = "ok";
- }
- }
- }
- return result;
- }
- /// <summary>
- /// 激活扫描仪
- /// </summary>
- /// <param name="scanner"></param>
- /// <returns></returns>
- public async Task<ResponseEntity> set_current(Device_Scanner scanner)
- {
- ResponseEntity result = new ResponseEntity();
- biz_engine_side.check_all();
- biz_dynam.kill_process();
- try
- {
- if (scanner != null)
- {
- //if (!scanner.openSourceReady || !await check_online())
- if (!scanner.openSourceReady)
- {
- result = await Task.Run(() => { return set_current_method(scanner); });
- if (result.Status == 1)
- {
- scanner_manager.set_current(scanner.dsIndex);
- }
- }
- //if (scanner.openSourceReady && await check_online())
- if (scanner.openSourceReady)
- {
- result.Status = 1;
- result.Message = "ok";
- }
- else
- {
- scanner_manager.set_current(-1);
- result.Status = 0;
- result.Message = "未正常连接扫描设备";
- }
- }
- else
- {
- scanner_manager.set_current(-1);
- result.Status = 0;
- result.Message = "请选择扫描设备";
- }
- }
- catch (Exception ee)
- {
- scanner_manager.set_current(-1);
- if (!ee.Message.Contains("DS or DSM reported error, application shouldn't"))
- {
- LogManager.WriteLog(ee);
- }
- result.Status = 0;
- result.Message = "扫描设备连接失败";
- }
- return result;
- }
- /// <summary>
- /// 激活扫描仪 具体业务
- /// </summary>
- /// <param name="scanner"></param>
- /// <returns></returns>
- private ResponseEntity set_current_method(Device_Scanner scanner)
- {
- ResponseEntity result = new ResponseEntity();
- try
- {
- universe.frm_handler.Invoke(new Action(() =>
- {
- try
- {
- universe.engine.CloseDataSource();
- universe.engine.SourceIndex = scanner.dsIndex;
- if (universe.engine.OpenDataSource())
- {
- universe.engine.SetCap(TwCap.Indicators, false);
- result.Status = 1;
- result.Message = "ok";
- }
- }
- catch (Exception ee)
- {
- scanner_manager.set_current(-1);
- if (ee.Message.Contains("DG") || ee.Message.Contains("正在中止线程"))
- {
- result.Status = -1;
- }
- else
- {
- if (!ee.Message.Contains("DS or DSM reported error, application shouldn't"))
- {
- LogManager.WriteLog(ee);
- }
- result.Status = 0;
- result.Message = "扫描设备连接失败";
- }
- }
- }));
- }
- catch (Exception ee)
- {
- scanner_manager.set_current(-1);
- if (ee.Message.Contains("DG") || ee.Message.Contains("正在中止线程"))
- {
- result.Status = -1;
- }
- else
- {
- if (!ee.Message.Contains("DS or DSM reported error, application shouldn't"))
- {
- LogManager.WriteLog(ee);
- }
- result.Status = 0;
- result.Message = "扫描设备连接失败";
- }
- }
- return result;
- }
- //private async Task<bool> check_online()
- //{
- // ResponseEntity<bool> result = new ResponseEntity<bool>();
- // var timeout = 2000;
- // Thread t = new Thread(() =>
- // {
- // var r = check_online_method();
- // result.Status = 1;
- // result.Message = "ok";
- // result.Data = r;
- // });
- // t.Start();
- // Stopwatch sw = new Stopwatch();
- // sw.Start();
- // await Task.Run(() =>
- // {
- // while (true)
- // {
- // try
- // {
- // if (result.Status == 1)
- // {
- // break;
- // }
- // else
- // {
- // if (sw.ElapsedMilliseconds > timeout)
- // {
- // result.Status = 0;
- // result.Message = "timeout";
- // t.Abort();
- // break;
- // }
- // else
- // {
- // Thread.Sleep(100);
- // }
- // }
- // }
- // catch
- // {
- // result.Status = 0;
- // result.Message = "exception";
- // break;
- // }
- // }
- // });
- // bool f = false;
- // if (result.Status == 1)
- // {
- // f = result.Data;
- // }
- // else
- // {
- // f = false;
- // }
- // //if (!f)
- // //{
- // // scanner_manager.set_current(-1);
- // //}
- // return f;
- //}
- //private bool check_online_method()
- //{
- // //while (true) ;
- // bool result = false;
- // //frm_handler.Invoke(new Action(() =>
- // //{
- // try
- // {
- // var obj = universe.engine.GetCap(TwCap.DeviceOnline);
- // var r1 = obj as Twain32.Enumeration;
- // var r2 = obj as bool?;
- // if (r1 != null)
- // {
- // if ((bool)r1[r1.CurrentIndex])
- // {
- // result = true;
- // }
- // }
- // else
- // {
- // if (r2 == true)
- // {
- // result = true;
- // }
- // }
- // }
- // catch (Exception ee2) { }
- // //}));
- // return result;
- //}
- //private async Task<bool> check_paper()
- //{
- // ResponseEntity<bool> result = new ResponseEntity<bool>();
- // var timeout = 2000;
- // Thread t = new Thread(() =>
- // {
- // var r = check_paper_method();
- // result.Status = 1;
- // result.Message = "ok";
- // result.Data = r;
- // });
- // t.Start();
- // Stopwatch sw = new Stopwatch();
- // sw.Start();
- // await Task.Run(() =>
- // {
- // while (true)
- // {
- // try
- // {
- // if (result.Status == 1)
- // {
- // break;
- // }
- // else
- // {
- // if (sw.ElapsedMilliseconds > timeout)
- // {
- // result.Status = 0;
- // result.Message = "timeout";
- // t.Abort();
- // break;
- // }
- // else
- // {
- // Thread.Sleep(100);
- // }
- // }
- // }
- // catch
- // {
- // result.Status = 0;
- // result.Message = "exception";
- // break;
- // }
- // }
- // });
- // if (result.Status == 1)
- // {
- // return result.Data;
- // }
- // else
- // {
- // return false;
- // }
- //}
- /// <summary>
- /// 检查是否卡纸
- /// </summary>
- /// <returns></returns>
- private bool check_paper_method()
- {
- bool result = false;
- //frm_handler.Invoke(new Action(() =>
- //{
- try
- {
- var obj = universe.engine.GetCap(TwCap.FeederLoaded);
- var r1 = obj as Twain32.Enumeration;
- var r2 = obj as bool?;
- if (r1 != null)
- {
- if ((bool)r1[r1.CurrentIndex])
- {
- result = true;
- }
- }
- else
- {
- if (r2 == true)
- {
- result = true;
- }
- }
- }
- catch (Exception ee2) { }
- //}));
- return result;
- }
- ///// <summary>
- /////
- ///// </summary>
- ///// <param name="code"></param>
- ///// <returns></returns>
- //public ResponseEntity check_engine_status(bool is_heartbeat)
- //{
- // ResponseEntity result = new ResponseEntity();
- // if (config_environment.scan_state)
- // {
- // if (is_heartbeat)
- // {
- // if (!check_paper())
- // {
- // result.Status = 502;
- // result.Message = "未检测到纸张或卡纸";
- // }
- // else
- // {
- // result.Status = 201;
- // result.Message = "扫描仪正在使用中";
- // }
- // }
- // else
- // {
- // result.Status = 201;
- // result.Message = "扫描仪正在使用中";
- // }
- // }
- // else
- // {
- // try
- // {
- // if (!check_online())
- // {
- // result.Status = 501;
- // result.Message = "扫描仪未连接";
- // }
- // else
- // {
- // if (is_heartbeat)
- // {
- // result.Status = 200;
- // result.Message = "扫描仪就绪";
- // }
- // else
- // {
- // if (!check_paper())
- // {
- // result.Status = 502;
- // result.Message = "未检测到纸张或卡纸";
- // }
- // else
- // {
- // result.Status = 200;
- // result.Message = "扫描仪就绪";
- // }
- // }
- // }
- // }
- // catch (Exception ee)
- // {
- // if (ee.Message.Contains("Источник данных не открыт"))
- // {
- // result.Status = 501;
- // result.Message = "扫描仪未连接";
- // }
- // else
- // {
- // result.Status = 509;
- // result.Message = ee.Message;
- // }
- // }
- // }
- // return result;
- //}
- /// <summary>
- /// 初始化状态
- /// </summary>
- public static bool first_state = false;
- /// <summary>
- /// 检查当前状态,心跳用
- /// </summary>
- /// <returns></returns>
- public ResponseEntity check_status_heartbeat()
- {
- ResponseEntity result = new ResponseEntity();
- if (config_environment.on_error == null ||
- (config_environment.on_error.Status == 1 ||
- result.Status == -1 ||
- result.Status == 200))
- {
- if (config_environment.scan_state == false && config_environment.scan_state_socket == true && first_state)
- {
- Task.Run(() =>
- {
- Thread.Sleep(3000);
- config_environment.scan_state_socket = false;
- first_state = false;
- });
- }
- if (config_environment.scan_state_socket)
- {
- result.Status = 201;
- result.Message = "扫描仪正在使用中";
- }
- else
- {
- //result.Status = 200;
- //result.Message = "扫描仪就绪";
- //try
- {
- //if (!await check_online().ConfigureAwait(false))
- if (!check_online_v2())
- {
- result.Status = 501;
- result.Message = "扫描仪未连接";
- }
- else
- {
- result.Status = 200;
- result.Message = "扫描仪就绪";
- }
- }
- //catch (Exception ee)
- //{
- // if (ee.Message.Contains("Источник данных не открыт"))
- // {
- // result.Status = 501;
- // result.Message = "扫描仪未连接";
- // }
- // else
- // {
- // result.Status = 509;
- // result.Message = ee.Message;
- // }
- //}
- }
- }
- else
- {
- result.Status = 509;
- result.Message = config_environment.on_error.Message;
- config_environment.on_error = null;
- }
- return result;
- }
- /// <summary>
- /// 检查当前状态,扫描用
- /// </summary>
- /// <returns></returns>
- public async Task<ResponseEntity> check_status_scan()
- {
- ResponseEntity result = new ResponseEntity();
- if (config_environment.scan_state)
- {
- result.Status = 201;
- result.Message = "扫描仪正在使用中";
- }
- else
- {
- try
- {
- //if (!await check_online())
- //if (!check_online_method())
- //{
- // result.Status = 501;
- // result.Message = "扫描仪未连接";
- //}
- //else
- {
- //if (!await check_paper())
- if (!check_paper_method())
- {
- result.Status = 502;
- result.Message = "未检测到纸张或卡纸";
- }
- else
- {
- result.Status = 200;
- result.Message = "扫描仪就绪";
- }
- }
- }
- catch (Exception ee)
- {
- if (ee.Message.Contains("Источник данных не открыт"))
- {
- result.Status = 501;
- result.Message = "扫描仪未连接";
- }
- else
- {
- result.Status = 509;
- result.Message = ee.Message;
- }
- }
- }
- return result;
- }
- /// <summary>
- /// 检查当前状态,界面用
- /// </summary>
- /// <returns></returns>
- public async Task<ResponseEntity> check_status_ui()
- {
- ResponseEntity result = new ResponseEntity();
- if (config_environment.scan_state)
- {
- result.Status = 201;
- result.Message = "扫描仪正在使用中";
- }
- else
- {
- try
- {
- //if (!await check_online().ConfigureAwait(false))
- if (!check_online_v2())
- {
- result.Status = 501;
- result.Message = "扫描仪未连接";
- }
- else
- {
- result.Status = 200;
- result.Message = "扫描仪就绪";
- }
- }
- catch (Exception ee)
- {
- if (ee.Message.Contains("Источник данных не открыт"))
- {
- result.Status = 501;
- result.Message = "扫描仪未连接";
- }
- else
- {
- result.Status = 509;
- result.Message = ee.Message;
- }
- }
- }
- return result;
- }
- /// <summary>
- /// 检查扫描仪激活情况
- /// </summary>
- /// <returns></returns>
- public bool check_online_v2()
- {
- return scanner_manager.Scanner_List.Count(x => x.isActive == 1) > 0;
- }
- }
- }
|