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 { /// /// tw基本类 /// 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; } /// /// 类基本实体 /// private static engine_twain32 current_object; /// /// tw所运行的消息循环线程 /// private static biz_thread universe; /// /// 外部调用窗体,废弃 /// private static Form main_window; /// /// 本实体对外引用 /// public static engine_twain32 Engine { get { return current_object; } } /// /// 刷新扫描仪列表(仅tw自身所见) /// 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 temp_list = new List(); 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); } } /// /// 添加一台扫描仪 /// /// /// private void add_scanner(List 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); } } } /// /// 调用第三方弹框扫描 /// /// 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); } }); } /// /// 普通扫描 /// /// /// public async Task 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) { 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; } /// /// 激活扫描仪 /// /// /// public async Task 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; } /// /// 激活扫描仪 具体业务 /// /// /// 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 check_online() //{ // ResponseEntity result = new ResponseEntity(); // 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 check_paper() //{ // ResponseEntity result = new ResponseEntity(); // 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; // } //} /// /// 检查是否卡纸 /// /// 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; } ///// ///// ///// ///// ///// //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; //} /// /// 初始化状态 /// public static bool first_state = false; /// /// 检查当前状态,心跳用 /// /// 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; } /// /// 检查当前状态,扫描用 /// /// public async Task 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; } /// /// 检查当前状态,界面用 /// /// public async Task 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; } /// /// 检查扫描仪激活情况 /// /// public bool check_online_v2() { return scanner_manager.Scanner_List.Count(x => x.isActive == 1) > 0; } } }