Sic.Framework/MECF.Framework.RT.Equipment.../HardwareUnits/OcrReaders/IOSS/Wid110Lib.cs

1638 lines
62 KiB
C#

// ============================================================================
// Copyright (c) 2010 IOSS GmbH
// All Rights Reserved.
// ============================================================================
// ============================================================================
//
// Wid110Lib - WID110 C# based library
//
// ============================================================================
//
// File: Wid110Lib.cs Type: Implementation
//
// Date: 05.02.2010 Last Change: 09.11.2011
//
// Author: Thomas M. Schlageter
// Silvio Robel
//
// Methods: Wid110Lib - constructor
// ~Wid110Lib - destructor
//
// FCreateDll - create WID110Lib instance
// FDestroyDll - destroy WID110Lib instance
// FExit - terminate connection and exit
// FGetCodeQualityBCR - get code qualitiy for BCR codes
// FGetCodeQualityDMR - get code qualitiy for DMR codes
// FGetCodeQualityLast - get code qualitiy for LAST code
// FGetCodeQualityOCR - get code qualitiy for OCR codes
// FGetErrorDescription - get error description
// FGetLastError - get the last error number
// FGetVersionParam - return sensor/interface version
// FGetVersion - return library version
// FGetWaferId - get the last BCR/OCR decode result
// FInit - initialize library and connect
// FIsInitialized - check for initialized state
// FLiveGetImage - take single image with parameters
// FLiveRead - perform a live read
// FLoadRecipes - load parameters by sending a file
// FLoadRecipesToSlot - load parameters by sending a file
// FProcessGetImage - get image from process trigger
// FProcessRead - perform a process read
// FSwitchOverlay - switch overlay on/off
// FGetCodeTime - get certain time parameter
//
//
// Auxiliary methods:
//
// getErrno - get error number
// getLastExcp - get the last exception message
// getReadOK - get result read state
// getTmpImage - return temporary image name
// isException - return exception state
//
// ============================================================================
using System;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.Reflection;
using System.Text;
using System.Runtime.InteropServices;
using System.Net.NetworkInformation;
using System.Drawing.Imaging;
namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.OcrReaders.IOSS
{
public class Wid110Lib : IDisposable
{
#region [ Private Fields ]
// ====================================================================
/// <summary>
/// Private member variables.
/// </summary>
// ====================================================================
private string version;
private string versParam;
private string tmpImage = Wid110LibConst.tmpImage;
private string lastExcp;
private int errno = Wid110LibConst.ecNone;
private int readOK = Wid110LibConst.rcError;
private IntPtr dll;
#endregion
#region [ DLL Method Prototypes ]
// ====================================================================
/// <summary>
/// Imported method prototypes.
/// </summary>
// ====================================================================
[DllImport("wid110Lib.dll")]
private static extern IntPtr FuncCreateDll();
[DllImport("wid110Lib.dll")]
private static extern int FuncDestroyDll(IntPtr objptr);
[DllImport("wid110Lib.dll")]
private static extern int FuncInit(IntPtr objptr,
string cpIPAddress);
[DllImport("wid110Lib.dll")]
private static extern int FuncIsInitialized(IntPtr objptr);
[DllImport("wid110Lib.dll")]
private static extern int FuncCheckConnection(IntPtr objptr,
string cpIPAddress,
int timeout);
[DllImport("wid110Lib.dll")]
private static extern int FuncGetVersionParam(IntPtr objptr,
StringBuilder cVersion,
int nMaxLen);
[DllImport("wid110Lib.dll")]
private static extern int FuncGetVersion(IntPtr objptr,
StringBuilder cVersion,
int nMaxLen);
[DllImport("wid110Lib.dll")]
private static extern int FuncSwitchOverlay(IntPtr objptr,
int bOnOff);
[DllImport("wid110Lib.dll")]
private static extern int FuncExit(IntPtr objptr);
// exchange parameter functions
[DllImport("wid110Lib.dll")]
private static extern int FuncSetImageCapture(IntPtr objptr, IntPtr pCapture);
[DllImport("wid110Lib.dll")]
private static extern int FuncGetImageCapture(IntPtr objptr, IntPtr pCapture);
[DllImport("wid110Lib.dll")]
private static extern int FuncSetParamOCR(IntPtr objptr, IntPtr pOcr, IntPtr capture);
[DllImport("wid110Lib.dll")]
private static extern int FuncGetParamOCR(IntPtr objptr, IntPtr pOcr, IntPtr capture);
[DllImport("wid110Lib.dll")]
private static extern int FuncSetParamBCR(IntPtr objptr, IntPtr pBcr, IntPtr capture);
[DllImport("wid110Lib.dll")]
private static extern int FuncGetParamBCR(IntPtr objptr, IntPtr pBcr, IntPtr capture);
[DllImport("wid110Lib.dll")]
private static extern int FuncSetParamDMR(IntPtr objptr, IntPtr pDmr, IntPtr capture);
[DllImport("wid110Lib.dll")]
private static extern int FuncGetParamDMR(IntPtr objptr, IntPtr pDmr, IntPtr capture);
[DllImport("wid110Lib.dll")]
private static extern int FuncLiveGetImage(IntPtr objptr,
string cpFileName,
int nChannel,
int nIntensity,
int nColor);
[DllImport("wid110Lib.dll")]
private static extern int FuncLiveRead(IntPtr objptr);
[DllImport("wid110Lib.dll")]
private static extern int FuncLiveGetImageRead(IntPtr objptr,
string cpFileName,
int nChannel,
int nIntensity,
int nColor);
[DllImport("wid110Lib.dll")]
private static extern int FuncProcessRead(IntPtr objptr);
[DllImport("wid110Lib.dll")]
private static extern int FuncProcessGetImage(IntPtr objptr,
string cpFileName,
int nTypeImage);
[DllImport("wid110Lib.dll")]
private static extern int FuncGetWaferId(IntPtr objptr,
StringBuilder cReadId,
int nMaxLen,
IntPtr bReadSuccessful);
[DllImport("wid110Lib.dll")]
private static extern int FuncGetCodeQualityOCR(IntPtr objptr,
IntPtr pnQuality);
[DllImport("wid110Lib.dll")]
private static extern int FuncGetCodeQualityBCR(IntPtr objptr,
IntPtr pnQuality);
[DllImport("wid110Lib.dll")]
private static extern int FuncGetCodeQualityDMR(IntPtr objptr,
IntPtr pnQuality);
[DllImport("wid110Lib.dll")]
private static extern int FuncGetCodeQualityLast(IntPtr objptr,
IntPtr pnQuality);
[DllImport("wid110Lib.dll")]
private static extern int FuncGetCodeTime(IntPtr objptr,
IntPtr pnTime);
[DllImport("wid110Lib.dll")]
private static extern int FuncLoadRecipes(IntPtr objptr,
string cpFilePath,
string cpFilename);
[DllImport("wid110Lib.dll")]
private static extern int FuncLoadRecipesToSlot(IntPtr objptr,
string cpFilePath,
string cpFilename,
int nSlot);
[DllImport("wid110Lib.dll")]
private static extern int FuncSaveJob(IntPtr objptr,
string cpFilePath,
string cpFilename);
[DllImport("wid110Lib.dll")]
private static extern int FuncGetLastError(IntPtr objptr);
[DllImport("wid110Lib.dll")]
private static extern int FuncGetErrorDescription(IntPtr objptr,
int nError,
StringBuilder strText,
int nTextLength);
// teachin functions
[DllImport("wid110Lib.dll")]
private static extern int FuncTeachingBCR(IntPtr objptr);
[DllImport("wid110Lib.dll")]
private static extern int FuncTeachingOCR(IntPtr objptr);
[DllImport("wid110Lib.dll")]
private static extern int FuncTeachingDMR(IntPtr objptr);
[DllImport("wid110Lib.dll")]
private static extern int FuncConfigureBCR(IntPtr objptr, string cName);
[DllImport("wid110Lib.dll")]
private static extern int FuncConfigureOCR(IntPtr objptr, string cName);
[DllImport("wid110Lib.dll")]
private static extern int FuncConfigureDMR(IntPtr objptr, string cName);
[DllImport("wid110Lib.dll")]
private static extern int FuncConfigureDelete(IntPtr objptr, string cName);
[DllImport("wid110Lib.dll")]
private static extern int FuncConfigurePreset(IntPtr objptr, string cName);
// image handling functions
[DllImport("wid110Lib.dll")]
private static extern int FuncGetImageRawData(IntPtr objptr, IntPtr pImageData);
[DllImport("wid110Lib.dll")]
private static extern int FuncGetImageXSize(IntPtr objptr, IntPtr pXSize);
[DllImport("wid110Lib.dll")]
private static extern int FuncGetImageYSize(IntPtr objptr, IntPtr pYSize);
// further function for change configuration
[DllImport("wid110Lib.dll")]
private static extern int FuncSetFineScan(IntPtr objptr, IntPtr pMode);
[DllImport("wid110Lib.dll")]
private static extern int FuncGetFineScan(IntPtr objptr, IntPtr pMode);
[DllImport("wid110Lib.dll")]
private static extern int FuncGetFontName(IntPtr objptr, StringBuilder fName, int index);
[DllImport("wid110Lib.dll")]
private static extern int FuncGetConfigurationName(IntPtr objptr, StringBuilder cName, int index);
[DllImport("wid110Lib.dll")]
private static extern int FuncSaveJobToReader(IntPtr objptr);
[DllImport("wid110Lib.dll")]
private static extern int FuncGetROI(IntPtr objptr, string cName, IntPtr pWnd, IntPtr pCapture);
[DllImport("wid110Lib.dll")]
private static extern int FuncSetROI(IntPtr objptr, string cName, IntPtr pWnd, IntPtr pCapture);
#endregion
// ====================================================================
/// <summary>
/// Constructor: Initialize WID C# Library.
/// </summary>
// ====================================================================
public Wid110Lib()
{
dll = FCreateDll();
}
#region IDisposable Support
private bool disposedValue = false; // To detect redundant calls
// ====================================================================
/// <summary>
/// Dispose: Free WID C# Library.
/// </summary>
// ====================================================================
protected virtual void Dispose(bool disposing)
{
if (!disposedValue)
{
if (disposing)
{
// Dispose managed state (managed objects).
}
FDestroyDll(dll);
dll = IntPtr.Zero;
disposedValue = true;
}
}
// ====================================================================
/// <summary>
/// Finalizer: Free WID C# Library (Internal Implementation)
/// </summary>
// ====================================================================
~Wid110Lib()
{
// Do not change this code. Put cleanup code in Dispose(bool disposing) above.
Dispose(false);
}
// This code added to correctly implement the disposable pattern.
public void Dispose()
{
// Do not change this code. Put cleanup code in Dispose(bool disposing) above.
Dispose(true);
GC.SuppressFinalize(this);
}
#endregion
// ====================================================================
/// <summary>
/// Create WID C# Library instance.
/// </summary>
/// <return> DLL if created, NULL upon error.</return>
// ====================================================================
private IntPtr FCreateDll()
{
IntPtr d = IntPtr.Zero;
lastExcp = "";
errno = Wid110LibConst.ecNone;
try
{
d = FuncCreateDll();
}
catch (Exception e)
{
lastExcp = e.ToString();
}
return d;
}
// ====================================================================
/// <summary>
/// Destroy WID C# Library instance.
/// </summary>
/// <param name="dll"> DLL to destroy.</param>
/// <return> true if destroyed.</return>
// ====================================================================
private bool FDestroyDll(IntPtr dll)
{
try
{
if (HandleDLLStatus(FuncDestroyDll(dll))) return true;
}
catch (Exception e) { lastExcp = e.ToString(); }
return false;
}
// ====================================================================
/// <summary>
/// Initialize library and connect to IP.
/// </summary>
/// <param name="ip"> IP to connect.</param>
/// <return> true if connected.</return>
// ====================================================================
public bool FInit(string ip)
{
try
{
Ping PingHandler = new Ping();
PingReply reply = PingHandler.Send(ip, 1000);
if (reply.Status == IPStatus.Success)
{
if (HandleDLLStatus(FuncInit(dll, ip))) return true;
}
else throw new IOException("IP Address " + ip + " not reachable!");
}
catch (Exception e) { lastExcp = e.ToString(); }
return false;
}
// ====================================================================
/// <summary>
/// Check library state.
/// </summary>
/// <return> true if initialized.</return>
// ====================================================================
public bool FIsInitialized()
{
try
{
if (HandleDLLStatus(FuncIsInitialized(dll)))
return true;
}
catch (Exception e) { lastExcp = e.ToString(); }
return false;
}
// ====================================================================
/// <summary>
/// Check reader connection
/// </summary>
/// <param name="ip">Reader IP Address</param>
/// <param name="timeout_s">Timeout in seconds</param>
/// <return> true if connected.</return>
// ====================================================================
public bool FCheckConnection(string ip, int timeout_s)
{
try
{
if (HandleDLLStatus(FuncCheckConnection(dll, ip, timeout_s))) return true;
}
catch (Exception e) { lastExcp = e.ToString(); }
return false;
}
// ====================================================================
/// <summary>
/// Terminate connection.
/// </summary>
/// <return> true if disconnected.</return>
// ====================================================================
public bool FExit()
{
try
{
if (HandleDLLStatus(FuncExit(dll)))
return true;
}
catch (Exception e) { lastExcp = e.ToString(); }
return false;
}
// ====================================================================
/// <summary>
/// Set the image acquisition parameter to the reader.
/// </summary>
/// <param name="capture">Image capturing parameters. <see cref="WID_CAPTURE"/></param>
/// <returns>true if no error.</returns>
// ====================================================================
public bool FSetImageCapture(WID_CAPTURE capture)
{
IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(capture) + 1);
try
{
Marshal.StructureToPtr(capture, ptr, false);
if (HandleDLLStatus(FuncSetImageCapture(dll, ptr))) return true;
}
catch (Exception e) { lastExcp = e.ToString(); }
finally
{
Marshal.FreeHGlobal(ptr);
}
return false;
}
// ====================================================================
/// <summary>
/// Get the image acquisition parameter from reader.
/// </summary>
/// <returns>Image capturing parameters. <see cref="WID_CAPTURE"/></returns>
// ====================================================================
public WID_CAPTURE FGetImageCapture()
{
WID_CAPTURE capture = new WID_CAPTURE();
IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(capture) + 1);
try
{
Marshal.StructureToPtr(capture, ptr, false);
if (HandleDLLStatus(FuncGetImageCapture(dll, ptr)))
{
capture = (WID_CAPTURE)Marshal.PtrToStructure(ptr, typeof(WID_CAPTURE));
return capture;
}
}
catch (Exception e) { lastExcp = e.ToString(); }
finally
{
Marshal.FreeHGlobal(ptr);
}
return capture;
}
// ====================================================================
/// <summary>
/// Get library version.
/// </summary>
/// <param name="v"> WID110 library version.</param>
// ====================================================================
public string FGetVersion()
{
try
{
version = "";
StringBuilder sb = new StringBuilder("", Wid110LibConst.versLenCS);
if (HandleDLLStatus(FuncGetVersion(dll, sb, Wid110LibConst.versLenC)))
{
version = sb.ToString();
}
}
catch (Exception e) { lastExcp = e.ToString(); }
return version;
}
// ====================================================================
/// <summary>
/// Get sensor interface version.
/// </summary>
/// <return> WID110 interface version.</return>
// ====================================================================
public string FGetVersionParam()
{
try
{
versParam = "";
StringBuilder sb = new StringBuilder("", Wid110LibConst.versLenCS);
if (HandleDLLStatus(FuncGetVersionParam(dll, sb, Wid110LibConst.versLenC)))
{
versParam = sb.ToString();
}
}
catch (Exception e) { lastExcp = e.ToString(); }
return versParam;
}
// ====================================================================
/// <summary>
/// Change overlay flag.
/// </summary>
/// <param name="o"> overlay flag.</param>
/// <return> true if no error.</return>
// ====================================================================
public bool FSwitchOverlay(bool o)
{
try
{
if (HandleDLLStatus(FuncSwitchOverlay(dll, Convert.ToInt32(o)))) return true;
}
catch (Exception e) { lastExcp = e.ToString(); }
return false;
}
// ====================================================================
/// <summary>
/// Perform a live read using the temporary settings from an
/// earlier 'FLiveGetImage()' call.
/// </summary>
/// <return> true if done.</return>
// ====================================================================
public bool FLiveRead()
{
try
{
if (HandleDLLStatus(FuncLiveRead(dll))) return true;
}
catch (Exception e) { lastExcp = e.ToString(); }
return false;
}
// ====================================================================
/// <summary>
/// Perform a live read using the given parameters, and decode.
/// </summary>
/// <param name="name"> name to save image to.</param>
/// <param name="channel"> illumination channel.</param>
/// <param name="intensity"> illumination intensity.</param>
/// <param name="color"> illumination color.</param>
/// <return> true if done.</return>
// ====================================================================
public bool FLiveGetImageRead(string name,
int channel,
int intensity,
int color)
{
try
{
if (HandleDLLStatus(FuncLiveGetImageRead(dll, name, channel, intensity, color))) return true;
}
catch (Exception e) { lastExcp = e.ToString(); }
return false;
}
// ====================================================================
/// <summary>
/// Perform a process read..
/// </summary>
/// <return> true if done.</return>
// ====================================================================
public bool FProcessRead()
{
try
{
if (HandleDLLStatus(FuncProcessRead(dll))) return true;
}
catch (Exception e) { lastExcp = e.ToString(); }
return false;
}
// ====================================================================
/// <summary>
/// Get code quality for OCR codes.
/// </summary>
/// <return> code quality, or rsltNoCodeQuality upon failure.</return>
// ====================================================================
public int FGetCodeQualityOCR()
{
IntPtr q = Marshal.AllocHGlobal(sizeof(int));
int rc = Wid110LibConst.rsltNoCodeQuality;
try
{
if (HandleDLLStatus(FuncGetCodeQualityOCR(dll, q)))
{
rc = Marshal.ReadInt32(q);
}
}
catch (Exception e) { lastExcp = e.ToString(); }
finally { Marshal.FreeHGlobal(q); }
return rc;
}
// ====================================================================
/// <summary>
/// Get code quality for BCR codes.
/// </summary>
/// <return> code quality, or rsltNoCodeQuality upon failure.</return>
// ====================================================================
public int FGetCodeQualityBCR()
{
IntPtr q = Marshal.AllocHGlobal(sizeof(int));
int rc = Wid110LibConst.rsltNoCodeQuality;
try
{
if (HandleDLLStatus(FuncGetCodeQualityBCR(dll, q)))
{
rc = Marshal.ReadInt32(q);
}
}
catch (Exception e) { lastExcp = e.ToString(); }
finally { Marshal.FreeHGlobal(q); }
return rc;
}
// ====================================================================
/// <summary>
/// Get code quality for DMR codes.
/// </summary>
/// <return> code quality, or rsltNoCodeQuality upon failure.</return>
// ====================================================================
public int FGetCodeQualityDMR()
{
IntPtr q = Marshal.AllocHGlobal(sizeof(int));
int rc = Wid110LibConst.rsltNoCodeQuality;
try
{
if (HandleDLLStatus(FuncGetCodeQualityDMR(dll, q)))
{
rc = Marshal.ReadInt32(q);
}
}
catch (Exception e) { lastExcp = e.ToString(); }
finally { Marshal.FreeHGlobal(q); }
return rc;
}
// ====================================================================
/// <summary>
/// Get code quality for LAST code.
/// </summary>
/// <return> code quality, or rsltNoCodeQuality upon failure.</return>
// ====================================================================
public int FGetCodeQualityLast()
{
IntPtr q = Marshal.AllocHGlobal(sizeof(int));
int rc = Wid110LibConst.rsltNoCodeQuality;
try
{
if (HandleDLLStatus(FuncGetCodeQualityLast(dll, q)))
{
rc = Marshal.ReadInt32(q);
}
}
catch (Exception e) { lastExcp = e.ToString(); }
finally { Marshal.FreeHGlobal(q); }
return rc;
}
// ====================================================================
/// <summary>
/// Retrieve image from last process trigger.
/// </summary>
/// <param name="name"> file name to save image.</param>
/// <param name="type"> 'pvImgBest' or 'pvImgAll'.</param>
/// <return> true if OK.</return>
// ====================================================================
public bool FProcessGetImage(string name,
int type)
{
try
{
if (HandleDLLStatus(FuncProcessGetImage(dll, name, type))) return true;
}
catch (Exception e) { lastExcp = e.ToString(); }
return false;
}
// ====================================================================
/// <summary>
/// Get the last BCR/OCR/DMR decode result.
/// </summary>
/// <return> the latest read result.</return>
// ====================================================================
public string FGetWaferId()
{
StringBuilder sb = new StringBuilder(Wid110LibConst.rsltERROR, Wid110LibConst.rsltLenCS);
string res = Wid110LibConst.rsltERROR;
IntPtr pok = Marshal.AllocHGlobal(1);
try
{
if (HandleDLLStatus(FuncGetWaferId(dll, sb, Wid110LibConst.rsltLenC, pok)))
{
readOK = Marshal.ReadByte(pok, 0);
if (1 == readOK)
res = Wid110LibConst.rsltREAD + sb.ToString();
else
res = Wid110LibConst.rsltNOREAD + sb.ToString();
}
}
catch (Exception e) { lastExcp = e.ToString(); }
finally
{
Marshal.FreeHGlobal(pok);
}
return res;
}
// ====================================================================
/// <summary>
/// Take a single image using the given parameters.
/// </summary>
/// <param name="name"> name to save image to.</param>
/// <param name="channel"> illumination channel.</param>
/// <param name="intensity"> illumination intensity.</param>
/// <param name="color"> illumination color.</param>
/// <return> true if OK.</return>
// ====================================================================
public bool FLiveGetImage(string name,
int channel,
int intensity,
int color)
{
try
{
if (HandleDLLStatus(FuncLiveGetImage(dll, name, channel, intensity, color))) return true;
}
catch (Exception e) { lastExcp = e.ToString(); }
return false;
}
// ====================================================================
/// <summary>
/// Saves reader configuration into a *.wid file on the pc
/// </summary>
/// <param name="jobFilePath"> Full path to file.</param>
/// <return> true if OK.</return>
// ====================================================================
public bool FSaveJob(string jobFilePath)
{
string path = Path.GetDirectoryName(jobFilePath);
string file = Path.GetFileName(jobFilePath);
try
{
if (HandleDLLStatus(FuncSaveJob(dll, path, file))) return true;
}
catch (Exception e) { lastExcp = e.ToString(); }
return false;
}
// ====================================================================
/// <summary>
/// Load process parameter file
/// </summary>
/// <param name="jobFilePath"> Full path of job file</param>
/// <return> true if OK.</return>
// ====================================================================
public bool FLoadRecipes(string jobFilePath)
{
try
{
if (!File.Exists(jobFilePath)) throw new FileNotFoundException(jobFilePath);
string path = Path.GetDirectoryName(jobFilePath);
string file = Path.GetFileName(jobFilePath);
if (HandleDLLStatus(FuncLoadRecipes(dll, path, file))) return true;
}
catch (Exception e) { lastExcp = e.ToString(); }
return false;
}
// ====================================================================
/// <summary>
/// Load parameters to a certain parameter slot (if applicable)
/// </summary>
/// <param name="jobFilePathpath"> Full path to job file.</param>
/// <param name="slot"> slot (only for ocf and led files).</param>
/// <return> true if valid.</return>
// ====================================================================
public bool FLoadRecipesToSlot(string jobFilePath,
int slot)
{
try
{
if (!File.Exists(jobFilePath)) throw new FileNotFoundException(jobFilePath);
string path = Path.GetDirectoryName(jobFilePath);
string file = Path.GetFileName(jobFilePath);
if (HandleDLLStatus(FuncLoadRecipesToSlot(dll, path, file, slot))) return true;
}
catch (Exception e) { lastExcp = e.ToString(); }
return false;
}
// ====================================================================
/// <summary>
/// Save Job to Reader
/// </summary>
/// <return>true if valid.</return>
// ====================================================================
public bool FSaveJobToReader()
{
try
{
if (HandleDLLStatus(FuncSaveJobToReader(dll))) return true;
}
catch (Exception e) { lastExcp = e.ToString(); }
return false;
}
// ====================================================================
/// <summary>
/// Get code time parameter
/// </summary>
/// <return> overall process time or rsltNoCodeTime upon failure.</return>
// ====================================================================
public int FGetCodeTime()
{
IntPtr q = Marshal.AllocHGlobal(sizeof(int));
int rc = Wid110LibConst.rsltNoCodeTime;
try
{
if (HandleDLLStatus(FuncGetCodeTime(dll, q)))
{
rc = Marshal.ReadInt32(q);
}
}
catch (Exception e) { lastExcp = e.ToString(); }
finally { Marshal.FreeHGlobal(q); }
return rc;
}
// ====================================================================
/// <summary>
/// Get error description.
/// </summary>
/// <param name="eno"> error number to translate.</param>
/// <return> error description.</return>
// ====================================================================
public string FGetErrorDescription(int eno)
{
StringBuilder sb = new StringBuilder(Wid110LibConst.errDESC, Wid110LibConst.errLen);
int len = Wid110LibConst.errLen;
try // if lib handle is invalid, error text is generated as well
{
if (FuncGetErrorDescription(dll, eno, sb, len) == Wid110LibConst.rcNoError)
return sb.ToString();
}
catch (Exception e)
{
lastExcp = e.ToString();
}
return Wid110LibConst.errDESC;
}
// ====================================================================
/// <summary>
/// Get last error number.
/// </summary>
/// <return> last error number.</return>
// ====================================================================
public int FGetLastError()
{
try
{
return FuncGetLastError(dll); // get last internal lib error
}
catch (Exception e)
{
lastExcp = e.ToString();
}
return errno;
}
// ====================================================================
/// <summary>
/// Handle error from Wid110.dll (Internal use only)
/// </summary>
/// <param name="status">return status from DLL Function</param>
/// <returns></returns>
// ====================================================================
private bool HandleDLLStatus(int status)
{
lastExcp = "";
switch (status)
{
case Wid110LibConst.rcError:
errno = FuncGetLastError(dll);
return false;
case Wid110LibConst.rcInvObj:
errno = Wid110LibConst.ecInvObj;
return false;
case Wid110LibConst.rcNoError:
errno = Wid110LibConst.ecNone;
return true;
}
return false;
}
// ====================================================================
/// <summary>
/// Get the last error number.
/// </summary>
/// <return> last error number.</return>
// ====================================================================
public int getErrno()
{
return errno;
}
// ====================================================================
/// <summary>
/// Get the result read state.
/// </summary>
/// <return> result read state.</return>
// ====================================================================
public int getReadOK()
{
return readOK;
}
// ====================================================================
/// <summary>
/// Get the last exception message.
/// </summary>
/// <return> last exception message.</return>
// ====================================================================
public string getLastExcp()
{
return lastExcp;
}
// ====================================================================
/// <summary>
/// Get temporary image name.
/// </summary>
/// <return> temporary image name.</return>
// ====================================================================
public string getTmpImage()
{
return tmpImage;
}
// ====================================================================
/// <summary>
/// Get exception state.
/// </summary>
/// <return> true if exception.</return>
// ====================================================================
public bool isException()
{
return lastExcp.Length != 0;
}
// ====================================================================
/// <summary>
/// Check error for last function call
/// </summary>
/// <param name="errorMesage">Return error message from Wid110Lib.dll</param>
/// <returns>True if error raised.</returns>
// ====================================================================
public bool CheckError(out string errorMesage)
{
errorMesage = string.Empty;
if (isException())
{
errorMesage = getLastExcp();
return true;
}
if (errno == Wid110LibConst.ecNone) return false;
errorMesage = FGetErrorDescription(errno);
return true;
}
// ====================================================================
/// <summary>
/// Return font name on selected index
/// </summary>
/// <param name="index">Font index. [0 - 7]</param>
/// <returns>Font name</returns>
// ====================================================================
public string FGetFontName(int index)
{
try
{
StringBuilder sb = new StringBuilder("", 255);
if (HandleDLLStatus(FuncGetFontName(dll, sb, index)))
{
return sb.ToString();
}
}
catch (Exception e) { lastExcp = e.ToString(); }
return string.Empty;
}
// ====================================================================
/// <summary>
/// Set fine scanning mode flag
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
// ====================================================================
public bool FSetFineScan(bool value)
{
IntPtr q = Marshal.AllocHGlobal(sizeof(Int32));
try
{
Marshal.WriteInt32(q, Convert.ToInt32(value));
if (HandleDLLStatus(FuncSetFineScan(dll, q))) return true;
}
catch (Exception e) { lastExcp = e.ToString(); }
finally { Marshal.FreeHGlobal(q); }
return false;
}
// ====================================================================
/// <summary>
/// Get fine scanning mode flag
/// </summary>
/// <returns>True if fine scanning enabled, return false if error</returns>
// ====================================================================
public bool FGetFineScan()
{
IntPtr q = Marshal.AllocHGlobal(sizeof(Int32));
try
{
if (HandleDLLStatus(FuncGetFineScan(dll, q)))
{
return Convert.ToBoolean(Marshal.ReadInt32(q));
}
}
catch (Exception e) { lastExcp = e.ToString(); }
finally { Marshal.FreeHGlobal(q); }
return false;
}
// ====================================================================
/// <summary>
/// Retrieve name of saved configuration
/// </summary>
/// <param name="index">Slot index [1 -99]</param>
/// <returns>Configuration Name</returns>
// ====================================================================
public string FGetConfigurationName(int index)
{
try
{
StringBuilder sb = new StringBuilder("", 255);
if (HandleDLLStatus(FuncGetConfigurationName(dll, sb, index)))
{
return sb.ToString();
}
}
catch (Exception e) { lastExcp = e.ToString(); }
return string.Empty;
}
// ====================================================================
/// <summary>
/// Set OCR Parameter
/// </summary>
/// <param name="ocr">OCR Parameters</param>
/// <param name="capture">Image Capture Parameters</param>
/// <returns>true if no error</returns>
// ====================================================================
public bool FSetParamOCR(WID_OCR ocr, WID_CAPTURE capture)
{
WID_OCR_Unsafe unsafeOcr = ocr.ToUnsafeStruct();
IntPtr ptrOcr = Marshal.AllocHGlobal(Marshal.SizeOf(unsafeOcr) + 1);
IntPtr ptrCapture = Marshal.AllocHGlobal(Marshal.SizeOf(capture) + 1);
try
{
Marshal.StructureToPtr(capture, ptrCapture, false);
Marshal.StructureToPtr(unsafeOcr, ptrOcr, false);
if (HandleDLLStatus(FuncSetParamOCR(dll, ptrOcr, ptrCapture))) return true;
}
catch (Exception e) { lastExcp = e.ToString(); }
finally
{
Marshal.FreeHGlobal(ptrCapture);
Marshal.FreeHGlobal(ptrOcr);
}
return false;
}
// ====================================================================
/// <summary>
/// Get OCR Parameter
/// </summary>
/// <param name="ocr">OCR Parameters</param>
/// <param name="capture">Image Capture Parameters</param>
/// <returns>true if no error</returns>
// ====================================================================
public bool FGetParamOCR(out WID_OCR ocr, out WID_CAPTURE capture)
{
WID_OCR_Unsafe unsafeOcr = new WID_OCR_Unsafe();
IntPtr ptrOcr = Marshal.AllocHGlobal(Marshal.SizeOf(unsafeOcr) + 1);
capture = new WID_CAPTURE();
IntPtr ptrCapture = Marshal.AllocHGlobal(Marshal.SizeOf(capture) + 1);
try
{
Marshal.StructureToPtr(unsafeOcr, ptrOcr, false);
Marshal.StructureToPtr(capture, ptrCapture, false);
if (HandleDLLStatus(FuncGetParamOCR(dll, ptrOcr, ptrCapture)))
{
unsafeOcr = (WID_OCR_Unsafe)Marshal.PtrToStructure(ptrOcr, typeof(WID_OCR_Unsafe));
ocr = new WID_OCR(unsafeOcr);
capture = (WID_CAPTURE)Marshal.PtrToStructure(ptrCapture, typeof(WID_CAPTURE));
return true;
}
}
catch (Exception e) { lastExcp = e.ToString(); }
finally
{
Marshal.FreeHGlobal(ptrOcr);
Marshal.FreeHGlobal(ptrCapture);
}
ocr = new WID_OCR();
return false;
}
// ====================================================================
/// <summary>
/// Set BCR Parameter
/// </summary>
/// <param name="bcr">BCR Parameters</param>
/// <param name="capture">Image Capture Parameters</param>
/// <returns>true if no error</returns>
// ====================================================================
public bool FSetParamBCR(WID_BCR bcr, WID_CAPTURE capture)
{
WID_BCR_Unsafe unsafeBcr = bcr.ToUnsafeStruct();
IntPtr ptrBcr = Marshal.AllocHGlobal(Marshal.SizeOf(unsafeBcr) + 1);
IntPtr ptrCapture = Marshal.AllocHGlobal(Marshal.SizeOf(capture) + 1);
try
{
Marshal.StructureToPtr(capture, ptrCapture, false);
Marshal.StructureToPtr(unsafeBcr, ptrBcr, false);
if (HandleDLLStatus(FuncSetParamBCR(dll, ptrBcr, ptrCapture))) return true;
}
catch (Exception e) { lastExcp = e.ToString(); }
finally
{
Marshal.FreeHGlobal(ptrCapture);
Marshal.FreeHGlobal(ptrBcr);
}
return false;
}
// ====================================================================
/// <summary>
/// Get BCR Parameter
/// </summary>
/// <param name="bcr">BCR Parameters</param>
/// <param name="capture">Image Capture Parameters</param>
/// <returns>true if no error</returns>
// ====================================================================
public bool FGetParamBCR(out WID_BCR bcr, out WID_CAPTURE capture)
{
WID_BCR_Unsafe unsafebcr = new WID_BCR_Unsafe();
IntPtr ptrBcr = Marshal.AllocHGlobal(Marshal.SizeOf(unsafebcr) + 1);
capture = new WID_CAPTURE();
IntPtr ptrCapture = Marshal.AllocHGlobal(Marshal.SizeOf(capture) + 1);
try
{
Marshal.StructureToPtr(unsafebcr, ptrBcr, false);
Marshal.StructureToPtr(capture, ptrCapture, false);
if (HandleDLLStatus(FuncGetParamBCR(dll, ptrBcr, ptrCapture)))
{
unsafebcr = (WID_BCR_Unsafe)Marshal.PtrToStructure(ptrBcr, typeof(WID_BCR_Unsafe));
bcr = new WID_BCR(unsafebcr);
capture = (WID_CAPTURE)Marshal.PtrToStructure(ptrCapture, typeof(WID_CAPTURE));
return true;
}
}
catch (Exception e) { lastExcp = e.ToString(); }
finally
{
Marshal.FreeHGlobal(ptrBcr);
Marshal.FreeHGlobal(ptrCapture);
}
bcr = new WID_BCR();
return false;
}
// ====================================================================
/// <summary>
/// Set DMR Parameter
/// </summary>
/// <param name="dmr">DMR Parameters</param>
/// <param name="capture">Image Capture Parameters</param>
/// <returns>true if no error</returns>
// ====================================================================
public bool FSetParamDMR(WID_DMR dmr, WID_CAPTURE capture)
{
WID_DMR_Unsafe usafeDmr = dmr.ToUnsafeStruct();
IntPtr ptrDmr = Marshal.AllocHGlobal(Marshal.SizeOf(usafeDmr) + 1);
IntPtr ptrCapture = Marshal.AllocHGlobal(Marshal.SizeOf(capture) + 1);
try
{
Marshal.StructureToPtr(capture, ptrCapture, false);
Marshal.StructureToPtr(usafeDmr, ptrDmr, false);
if (HandleDLLStatus(FuncSetParamDMR(dll, ptrDmr, ptrCapture))) return true;
}
catch (Exception e) { lastExcp = e.ToString(); }
finally
{
Marshal.FreeHGlobal(ptrCapture);
Marshal.FreeHGlobal(ptrDmr);
}
return false;
}
// ====================================================================
/// <summary>
/// Get DMR Parameter
/// </summary>
/// <param name="dmr">DMR Parameters</param>
/// <param name="capture">Image Capture Parameters</param>
/// <returns>true if no error</returns>
// ====================================================================
public bool FGetParamDMR(out WID_DMR dmr, out WID_CAPTURE capture)
{
WID_DMR_Unsafe unsafedmr = new WID_DMR_Unsafe();
IntPtr ptrDmr = Marshal.AllocHGlobal(Marshal.SizeOf(unsafedmr) + 1);
capture = new WID_CAPTURE();
IntPtr ptrCapture = Marshal.AllocHGlobal(Marshal.SizeOf(capture) + 1);
try
{
Marshal.StructureToPtr(unsafedmr, ptrDmr, false);
Marshal.StructureToPtr(capture, ptrCapture, false);
if (HandleDLLStatus(FuncGetParamDMR(dll, ptrDmr, ptrCapture)))
{
unsafedmr = (WID_DMR_Unsafe)Marshal.PtrToStructure(ptrDmr, typeof(WID_DMR_Unsafe));
dmr = new WID_DMR(unsafedmr);
capture = (WID_CAPTURE)Marshal.PtrToStructure(ptrCapture, typeof(WID_CAPTURE));
return true;
}
}
catch (Exception e) { lastExcp = e.ToString(); }
finally
{
Marshal.FreeHGlobal(ptrDmr);
Marshal.FreeHGlobal(ptrCapture);
}
dmr = new WID_DMR();
return false;
}
// ====================================================================
/// <summary>
/// Set ROI of named configuration
/// </summary>
/// <param name="configName">Configuration name</param>
/// <param name="roi">ROI Parameters</param>
/// <param name="capture">Image Capture Parameters</param>
/// <returns>true if no error.</returns>
// ====================================================================
public bool FSetROI(string configName, WID_ROI roi, WID_CAPTURE capture)
{
IntPtr ptrRoi = Marshal.AllocHGlobal(Marshal.SizeOf(roi) + 1);
IntPtr ptrCapture = Marshal.AllocHGlobal(Marshal.SizeOf(capture) + 1);
try
{
Marshal.StructureToPtr(roi, ptrRoi, false);
Marshal.StructureToPtr(capture, ptrCapture, false);
if (HandleDLLStatus(FuncSetROI(dll, configName, ptrRoi, ptrCapture))) return true;
}
catch (Exception e) { lastExcp = e.ToString(); }
finally
{
Marshal.FreeHGlobal(ptrCapture);
Marshal.FreeHGlobal(ptrRoi);
}
return false;
}
// ====================================================================
/// <summary>
/// Get ROI of named configuration
/// </summary>
/// <param name="configName">Configuration name</param>
/// <param name="roi">ROI Parameters</param>
/// <param name="capture">Image Capture Parameters</param>
/// <returns>true if no error.</returns>
// ====================================================================
public bool FGetROI(string configName, out WID_ROI roi, out WID_CAPTURE capture)
{
roi = new WID_ROI();
IntPtr ptrRoi = Marshal.AllocHGlobal(Marshal.SizeOf(roi) + 1);
capture = new WID_CAPTURE();
IntPtr ptrCapture = Marshal.AllocHGlobal(Marshal.SizeOf(capture) + 1);
try
{
Marshal.StructureToPtr(roi, ptrRoi, false);
Marshal.StructureToPtr(capture, ptrCapture, false);
if (HandleDLLStatus(FuncGetROI(dll, configName, ptrRoi, ptrCapture)))
{
roi = (WID_ROI)Marshal.PtrToStructure(ptrRoi, typeof(WID_ROI));
capture = (WID_CAPTURE)Marshal.PtrToStructure(ptrCapture, typeof(WID_CAPTURE));
return true;
}
}
catch (Exception e) { lastExcp = e.ToString(); }
finally
{
Marshal.FreeHGlobal(ptrRoi);
Marshal.FreeHGlobal(ptrCapture);
}
return false;
}
// ====================================================================
/// <summary>
/// Get Image Width
/// </summary>
/// <returns>Image Width in pixels</returns>
// ====================================================================
public int FGetImageXSize()
{
IntPtr q = Marshal.AllocHGlobal(sizeof(Int32));
try
{
if (HandleDLLStatus(FuncGetImageXSize(dll, q)))
{
return Convert.ToInt32(Marshal.ReadInt32(q));
}
}
catch (Exception e) { lastExcp = e.ToString(); }
finally { Marshal.FreeHGlobal(q); }
return -1;
}
// ====================================================================
/// <summary>
/// Get Image Height
/// </summary>
/// <returns>Image height in pixels</returns>
// ====================================================================
public int FGetImageYSize()
{
IntPtr q = Marshal.AllocHGlobal(sizeof(Int32));
try
{
if (HandleDLLStatus(FuncGetImageYSize(dll, q)))
{
return Convert.ToInt32(Marshal.ReadInt32(q));
}
}
catch (Exception e) { lastExcp = e.ToString(); }
finally { Marshal.FreeHGlobal(q); }
return -1;
}
// ====================================================================
/// <summary>
/// Delete all configuration with the name.
/// </summary>
/// <param name="configName">Configuration Name</param>
/// <returns>true if no error</returns>
// ====================================================================
public bool FConfigureDelete(string configName)
{
try
{
if (HandleDLLStatus(FuncConfigureDelete(dll, configName))) return true;
}
catch (Exception e) { lastExcp = e.ToString(); }
return false;
}
// ====================================================================
/// <summary>
/// Preset Configuration with matching name.
/// </summary>
/// <param name="configName">Configuration name, leave empty to reset cycle</param>
/// <returns>true if no error</returns>
// ====================================================================
public bool FConfigurePreset(string configName = "")
{
try
{
if (HandleDLLStatus(FuncConfigurePreset(dll, configName))) return true;
}
catch (Exception e) { lastExcp = e.ToString(); }
return false;
}
// ====================================================================
/// <summary>
/// Tune OCR
/// </summary>
/// <returns>true if no error</returns>
// ====================================================================
public bool FTeachingOCR()
{
try
{
if (HandleDLLStatus(FuncTeachingOCR(dll))) return true;
}
catch (Exception e) { lastExcp = e.ToString(); }
return false;
}
// ====================================================================
/// <summary>
/// Tune Barcode (NOT IMPLEMENTED YET)
/// </summary>
/// <returns>true if no error</returns>
// ====================================================================
public bool FTeachingBCR()
{
try
{
if (HandleDLLStatus(FuncTeachingBCR(dll))) return true;
}
catch (Exception e) { lastExcp = e.ToString(); }
return false;
}
// ====================================================================
/// <summary>
/// Tune 2D Barcode (NOT IMPLEMENTED YET)
/// </summary>
/// <returns>true if no error</returns>
// ====================================================================
public bool FTeachingDMR()
{
try
{
if (HandleDLLStatus(FuncTeachingDMR(dll))) return true;
}
catch (Exception e) { lastExcp = e.ToString(); }
return false;
}
// ====================================================================
/// <summary>
/// OCR Configuration steps
/// </summary>
/// <param name="configName">null or configuration name</param>
/// <returns>true if no error</returns>
// ====================================================================
public bool FConfigureOCR(string configName = "\0")
{
try
{
if (HandleDLLStatus(FuncConfigureOCR(dll, configName))) return true;
}
catch (Exception e) { lastExcp = e.ToString(); }
return false;
}
// ====================================================================
/// <summary>
/// Barcode Configuration steps. (NOT IMPLEMENTED YET)
/// </summary>
/// <param name="configName">null or configuration name</param>
/// <returns>true if no error</returns>
// ====================================================================
public bool FConfigureBCR(string configName = "")
{
try
{
if (HandleDLLStatus(FuncConfigureBCR(dll, configName))) return true;
}
catch (Exception e) { lastExcp = e.ToString(); }
return false;
}
// ====================================================================
/// <summary>
/// 2D Barcode Configuration steps. (NOT IMPLEMENTED YET)
/// </summary>
/// <param name="configName">null or configuration name</param>
/// <returns>true if no error</returns>
// ====================================================================
public bool FConfigureDMR(string configName = "")
{
try
{
if (HandleDLLStatus(FuncConfigureDMR(dll, configName))) return true;
}
catch (Exception e) { lastExcp = e.ToString(); }
return false;
}
public bool FGetImageRawData(out Image image)
{
image = null;
int width = FGetImageXSize();
int height = FGetImageYSize();
int imageSize = width * height;
byte[] imageData = new byte[imageSize];
IntPtr ptrImage = Marshal.AllocHGlobal(imageData.Length);
try
{
if (HandleDLLStatus(FuncGetImageRawData(dll, ptrImage)))
{
Marshal.Copy(ptrImage, imageData, 0, imageSize);
byte[] flippedData = ImageDataFlipHorizontal(imageData, width, height);
image = CreateBMP(width, height, flippedData);
image.Save("BMPDump.bmp");
return true;
}
}
catch (Exception e) { lastExcp = e.ToString(); }
finally { Marshal.FreeHGlobal(ptrImage); }
return false;
}
private byte[] ImageDataFlipHorizontal(byte[] i, int w, int h)
{
byte[] d = new byte[i.Length];
for (int r = 0; r < h; r++)
{
Array.Copy(i, r * w, d, (h - 1 - r) * w, w);
}
return d;
}
private Bitmap CreateBMP(int width, int height, byte[] values)
{
Bitmap b = new Bitmap(width, height, PixelFormat.Format8bppIndexed);
ColorPalette ncp = b.Palette;
for (int i = 0; i < 256; i++)
ncp.Entries[i] = Color.FromArgb(255, i, i, i);
b.Palette = ncp;
var BoundsRect = new Rectangle(0, 0, width, height);
BitmapData bmpData = b.LockBits(BoundsRect,
ImageLockMode.WriteOnly,
b.PixelFormat);
IntPtr ptr = bmpData.Scan0;
int bytes = bmpData.Stride * b.Height;
Marshal.Copy(values, 0, ptr, bytes);
b.UnlockBits(bmpData);
return b;
}
}
}