ZKuP/ZKuP/signoPad.cs
2021-03-11 12:12:05 +01:00

869 lines
33 KiB
C#

using signotec.STPadLibNet;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows.Media.Imaging;
using static ZKuP.signoPad;
namespace ZKuP
{
public class signoPad
{
public enum PadModel
{
Sigma,
Zeta,
Omega,
Gamma,
Delta,
Alpha
}
//private static STPadLibControl _stPad = new STPadLibControl();
private static STPadLibControl sTPad = new STPadLibControl();
public static STPadLibControl _stPad
{
get { return sTPad; }
set { sTPad = value; }
}
private static SignPad[] _signPads = null;
private static DisplayTarget _storeIdSigning = DisplayTarget.NewStandardStore;
private static DisplayTarget _storeIdOverlay = DisplayTarget.NewStandardStore;
private static int _buttonCancelId = -1;
private static int _buttonRetryId = -1;
private static int _buttonConfirmId = -1;
static string _disclaimer = "";
private static void GetDevices()
{
try
{
//sTPad = new STPadLibControl();
// get number of connected devices
int deviceCount = _stPad.DeviceGetCount();
// erase all entries
//ListOfDevices.Items.Clear();
// build list
if (deviceCount <= 0)
{ // no devices detected
_signPads = null;
System.Windows.MessageBox.Show("Kein Unterschriftenpad gefunden!", "Fehler", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error);
//ListOfDevices.Items.Add("No Devices");
//ListOfDevices.Items.Add("detected");
//ListOfDevices.IsEnabled = false;
//ButtonOpenClose.Content = "Open";
//ButtonOpenClose.IsEnabled = false;
//ButtonStartCancel.IsEnabled = false;
//ButtonRetry.IsEnabled = false;
//ButtonConfirm.IsEnabled = false;
//ImagePad.Source = GetBitmapFromResource(STPadLibNet_Demo_App.Properties.Resources.Welcome, System.Drawing.Imaging.ImageFormat.Png);
//ImagePad.Visibility = Visibility.Visible;
//ImageLed.Visibility = Visibility.Hidden;
//STPadLibControlHost.Visibility = Visibility.Hidden;
//LabelType.Content = "Type: -";
//LabelPort.Content = "Port: -";
//LabelFirmware.Content = "Firmware: -";
//LabelSerial.Content = "Serial: -";
//LabelDisplay.Content = "Display: -";
}
else
{ // build device list
_signPads = new SignPad[deviceCount];
for (int i = 0; i < deviceCount; i++)
{
_signPads[i] = new SignPad(_stPad, i);
//ListOfDevices.Items.Add(String.Format("Device {0}", i + 1));
}
//ListOfDevices.IsEnabled = true;
// select first element of list
//if (deviceCount > 0)
// 0 = 0;
_stPad.SensorHotSpotPressed += new SensorHotSpotPressedEventHandler(STPad_SensorHotSpotPressed);
_stPad.ControlMirrorDisplay = MirrorMode.Signature;
}
}
catch (STPadException exc)
{
Log.WriteLog(exc.ToString());
MessageBox.Show(exc.Message);
throw;
}
}
public static bool ShowDisclaimer(string Name = "", string Firma = "", string Kennzeichen = "", bool showDisclaimer = true)
{
// display disclaimer and two buttons "Cancel" and "Confirm"
GetDevices();
try
{
_stPad.DeviceOpen(0,true);
_stPad.DisplaySetStandbyImage(Helper.LoadBitmapFromResource("Resources/db-logo.png"));
// clear all hot spots
ClearHotSpots();
// clear signature window
_stPad.SensorClearSignRect();
// erase LCD and background buffer
_stPad.DisplayErase();
// set font
float fontSize = 0;
switch (_signPads[0].PadModel)
{
case PadModel.Sigma:
case PadModel.Zeta:
fontSize = 20;
break;
case PadModel.Omega:
fontSize = 40;
break;
case PadModel.Gamma:
fontSize = 45;
break;
case PadModel.Delta:
case PadModel.Alpha:
fontSize = 60;
break;
}
_stPad.DisplaySetFont(new System.Drawing.Font("Arial", fontSize));
switch (_signPads[0].PadModel)
{
case PadModel.Sigma:
case PadModel.Zeta:
// do all the following drawing operations in the background buffer
_stPad.DisplaySetTarget(DisplayTarget.BackgroundBuffer);
// load button bitmaps and set hot spots
// "Cancel" button
System.Drawing.Bitmap button = Helper.LoadBitmapFromResource("Resources/Cancel BW.png");
int x = 20;
int y = _stPad.DisplayHeight - button.Height - 7;
_stPad.DisplaySetImage(x, y, button);
_buttonCancelId = _stPad.SensorAddHotSpot(x, y, button.Width, button.Height);
// "Confirm" button
button = Helper.LoadBitmapFromResource("Resources/OK BW.png");
x = _stPad.DisplayWidth - button.Width - 20;
_stPad.DisplaySetImage(x, y, button);
_buttonConfirmId = _stPad.SensorAddHotSpot(x, y, button.Width, button.Height);
if (showDisclaimer) // display disclaimer
{
if (Firma != "" && Name != "" && Kennzeichen != "")
_stPad.DisplaySetTextInRect(10, 10, _stPad.DisplayWidth - 20, _stPad.DisplayHeight - 60, signotec.STPadLibNet.TextAlignment.Left, $"Ich bestätige hiermit dass ich eine Einweisung inkl. Flyer vom Pförtner erhalten habe\n\nFirma / Besucher: {Firma}\nVerantwortlicher: {Name}\nKennzeichen: {Kennzeichen}");
else if (Firma != "" && Name != "" && Kennzeichen == "")
_stPad.DisplaySetTextInRect(10, 10, _stPad.DisplayWidth - 20, _stPad.DisplayHeight - 60, signotec.STPadLibNet.TextAlignment.Left, $"Ich bestätige hiermit dass ich eine Einweisung inkl. Flyer vom Pförtner erhalten habe\n\nFirma / Besucher: {Firma}\nVerantwortlicher: {Name}");
else
_stPad.DisplaySetTextInRect(10, 10, _stPad.DisplayWidth - 20, _stPad.DisplayHeight - 60, signotec.STPadLibNet.TextAlignment.Left, $"Ich bestätige hiermit dass ich eine Einweisung inkl. Flyer vom Pförtner erhalten habe\n\nFirma / Besucher: {Firma}");
}
else
{
if (Firma != "" && Name != "" && Kennzeichen != "")
_stPad.DisplaySetTextInRect(10, 10, _stPad.DisplayWidth - 20, _stPad.DisplayHeight - 60, signotec.STPadLibNet.TextAlignment.Left, $"Firma / Besucher: {Firma}\nVerantwortlicher: {Name}\nKennzeichen: {Kennzeichen}");
else if (Firma != "" && Name != "" && Kennzeichen == "")
_stPad.DisplaySetTextInRect(10, 10, _stPad.DisplayWidth - 20, _stPad.DisplayHeight - 60, signotec.STPadLibNet.TextAlignment.Left, $"Firma / Besucher: {Firma}\nVerantwortlicher: {Name}");
else
_stPad.DisplaySetTextInRect(10, 10, _stPad.DisplayWidth - 20, _stPad.DisplayHeight - 60, signotec.STPadLibNet.TextAlignment.Left, $"Firma / Besucher: {Firma}");
}
break;
case PadModel.Omega:
case PadModel.Gamma:
case PadModel.Delta:
if (_signPads[0].FastConnection)
// fast connection: do all drawing operations in the overlay buffer
_storeIdOverlay = _stPad.DisplaySetTarget(DisplayTarget.OverlayBuffer);
else
// do all the following drawing operations in the permanent memory
_storeIdOverlay = _stPad.DisplaySetTarget(_storeIdOverlay);
// load button bitmaps and set hot spots for toolbar
// "Cancel" button
button = Helper.LoadBitmapFromResource("Resources/Cancel RGB.png");
switch (_signPads[0].PadModel)
{
case PadModel.Omega:
x = 24;
break;
default:
x = 45;
break;
}
y = _stPad.DisplayHeight - button.Height - 14;
_stPad.DisplaySetImage(x, y, button);
_buttonCancelId = _stPad.SensorAddHotSpot(x, y, button.Width, button.Height);
// "Confirm" button
button = Helper.LoadBitmapFromResource("Resources/OK RGB.png");
switch (_signPads[0].PadModel)
{
case PadModel.Omega:
x = 234;
break;
case PadModel.Gamma:
x = 315;
break;
case PadModel.Delta:
x = 555;
break;
}
_stPad.DisplaySetImage(x, y, button);
_buttonConfirmId = _stPad.SensorAddHotSpot(x, y, button.Width, button.Height);
// Scroll buttons
button = Helper.LoadBitmapFromResource("Resources/Scroll RGB.png");
switch (_signPads[0].PadModel)
{
case PadModel.Omega:
x = 444;
break;
case PadModel.Gamma:
x = 585;
break;
case PadModel.Delta:
x = 1065;
break;
}
_stPad.DisplaySetImage(x, y, button);
_stPad.SensorAddScrollHotSpot(x, y, 66, 66, ScrollOption.ScrollDown);
x += 104;
_stPad.SensorAddScrollHotSpot(x, y, 66, 66, ScrollOption.ScrollUp);
if (!_signPads[0].FastConnection)
{
// do all the following drawing operations in the overlay buffer
_stPad.DisplaySetTarget(DisplayTarget.OverlayBuffer);
// copy stored image to overlay buffer
_stPad.DisplaySetImageFromStore(_storeIdOverlay);
}
// do all the following drawing operations in the background buffer
_stPad.DisplaySetTarget(DisplayTarget.BackgroundBuffer);
// draw disclaimer
x = 10;
y = 10;
int size = _stPad.DisplaySetTextInRect(x, y, _stPad.DisplayWidth - 20, _stPad.DisplayHeight - 80, signotec.STPadLibNet.TextAlignment.Left, _disclaimer);
// use font size of the disclaimer text
if (size != (int)fontSize)
_stPad.DisplaySetFont(new System.Drawing.Font("Arial", size, System.Drawing.FontStyle.Regular));
// set scroll text
y = _stPad.DisplayHeight - 80;
_stPad.DisplaySetTextInRect(x, y, _stPad.DisplayWidth - 20, 100, signotec.STPadLibNet.TextAlignment.Left, "Congratulations! If you can read this text you have found the scroll buttons!");
if (_signPads[0].PadModel == PadModel.Delta)
{
y += _stPad.DisplayHeight;
_stPad.DisplaySetTextInRect(x, y, _stPad.DisplayWidth - 20, 200, 0, "Doesn't the Delta have an impressive large image buffer?");
const int x2 = 320;
while ((y + _stPad.DisplayHeight) < _stPad.DisplayTargetHeight)
{
y += _stPad.DisplayHeight;
_stPad.DisplaySetTextInRect(x, y, _stPad.DisplayWidth - 20, 200, 0, String.Format("You've reached line {0} of {1}!", y, _stPad.DisplayTargetHeight));
if ((y + _stPad.DisplayHeight) < _stPad.DisplayTargetHeight)
{
y += _stPad.DisplayHeight;
_stPad.DisplaySetTextInRect(x2, y, _stPad.DisplayWidth - 2 * x2, 200, signotec.STPadLibNet.TextAlignment.CenterCenteredVertically, "Click me, I'm a scrollable button!");
_stPad.SensorAddScrollHotSpot(x2, y, _stPad.DisplayWidth - 2 * x2, 200, ScrollOption.Scrollable);
}
}
}
// set end text
switch (_signPads[0].PadModel)
{
case PadModel.Omega:
y = _stPad.DisplayTargetHeight - 120;
break;
case PadModel.Gamma:
y = _stPad.DisplayTargetHeight - 140;
break;
case PadModel.Delta:
y = _stPad.DisplayTargetHeight - 160;
break;
}
_stPad.DisplaySetTextInRect(x, y, _stPad.DisplayWidth - 20, 60, signotec.STPadLibNet.TextAlignment.Left, "You have scrolled to the end of this text!");
// set overlay rect
y = _stPad.DisplayHeight - 80;
_stPad.DisplaySetOverlayRect(0, y, _stPad.DisplayWidth, 80);
break;
}
// do all drawing operations on the LCD
_stPad.DisplaySetTarget(DisplayTarget.ForegroundBuffer);
// draw buffered image
_stPad.DisplaySetImageFromStore(DisplayTarget.BackgroundBuffer);
// set complete buffer for scrolling
_stPad.SensorSetScrollArea(0, 0, 0, 0);
if (_signPads[0].SupportsPenScrolling)
// enable pen scrolling
_stPad.SensorSetPenScrollingEnabled(true);
//ButtonRetry.IsEnabled = false;
}
catch (STPadException exc)
{
Log.WriteLog(exc.ToString());
MessageBox.Show(exc.Message);
//throw;
return false;
}
finally
{
//this.Cursor = Cursors.Arrow;
}
return true;
}
private void CancelProcess()
{
try
{
if (_stPad.SignatureState)
// cancel capturing (this clears the LCD, too)
_stPad.SignatureCancel();
else
{
// disable pen scrolling
_stPad.SensorSetPenScrollingEnabled(false);
// erase LCD
_stPad.DisplayErase();
}
// clear all hot spots
ClearHotSpots();
}
catch (STPadException exc)
{
Log.WriteLog(exc.ToString());
MessageBox.Show(exc.Message);
//throw;
return;
}
finally
{
//this.Cursor = Cursors.Arrow;
}
//ButtonStartCancel.Content = "Start";
//ButtonStartCancel.IsEnabled = true;
//ButtonRetry.IsEnabled = false;
//ButtonConfirm.IsEnabled = false;
try
{
// ImageLed.Source = GetBitmapFromResource(STPadLibNet_Demo_App.Properties.Resources.LED_Yellow, System.Drawing.Imaging.ImageFormat.Png);
}
catch { }
}
private static void STPad_SensorHotSpotPressed(object sender, SensorHotSpotPressedEventArgs e)
{
SensorHotSpotPressedEventHandler handler = new SensorHotSpotPressedEventHandler(SensorHotSpotPressed);
System.Windows.Threading.Dispatcher.CurrentDispatcher.Invoke(handler, new object[] { sender, e });
}
private static void SensorHotSpotPressed(object sender, SensorHotSpotPressedEventArgs e)
{
if (e.hotSpotId == _buttonCancelId) System.Diagnostics.Debug.WriteLine("test");
//ButtonStartCancel_Click(this, new System.Windows.RoutedEventArgs());
else if (e.hotSpotId == _buttonRetryId)
ButtonRetry_Click(sender, new System.Windows.RoutedEventArgs());
else if (e.hotSpotId == _buttonConfirmId)
ButtonConfirm_Click(sender, new System.Windows.RoutedEventArgs());
else
MessageBox.Show(String.Format("Hot Spot {0} clicked.", e.hotSpotId + 1));
}
public static void CloseConnection()
{
try
{
// erase display
_stPad.DisplayErase();
// clear hot spots
ClearHotSpots();
_stPad.DeviceClose(0);
//_signPads = null;
//_stPad = null;
}
catch (Exception)
{
}
}
private static void ButtonRetry_Click(object sender, System.Windows.RoutedEventArgs e)
{
try
{
if (_stPad.SignatureState == true)
_stPad.SignatureRetry();
else
StartDefaultCapturing();
}
catch (STPadException exc)
{
Log.WriteLog(exc.ToString());
MessageBox.Show(exc.Message);
//throw;
}
}
private static void ButtonConfirm_Click(object sender, System.Windows.RoutedEventArgs e)
{
if (_stPad.SignatureState == false)
// accept disclaimer and start capturing
StartDefaultCapturing();
else
ConfirmCapturing();
}
private static bool StartDefaultCapturing()
{
try
{
// disable pen scrolling
_stPad.SensorSetPenScrollingEnabled(false);
// erase display
_stPad.DisplayErase();
// clear hot spots
ClearHotSpots();
if (_signPads[0].HasDisplay)
{
if (_signPads[0].FastConnection)
{ // "fast" pad or connection
// do all drawing operations in the background buffer
_stPad.DisplaySetTarget(DisplayTarget.BackgroundBuffer);
}
else
{ // "slow" pad or connection: do all drawing operations in the permanent memory
// make sure that always the second permanent memory is used
if (_storeIdOverlay < 0)
_storeIdOverlay = _stPad.DisplaySetTarget(_storeIdOverlay);
// set permanent memory as target
_storeIdSigning = _stPad.DisplaySetTarget(_storeIdSigning);
}
// draw the bitmaps
System.Drawing.Bitmap bitmap = null;
switch (_signPads[0].PadModel)
{
case PadModel.Sigma:
bitmap = Helper.LoadBitmapFromResource("Resources/Capture Sigma.png");
break;
}
_stPad.DisplaySetImage(0, 0, bitmap);
if (!_signPads[0].FastConnection)
{
// do all drawing operations in the background buffer
_stPad.DisplaySetTarget(DisplayTarget.BackgroundBuffer);
// draw stored image
_stPad.DisplaySetImageFromStore(_storeIdSigning);
}
if (_signPads[0].PadModel == PadModel.Alpha)
// draw disclaimer
_stPad.DisplaySetTextInRect(50, 250, _stPad.DisplayWidth - 100, 300, signotec.STPadLibNet.TextAlignment.Left, "With my signature, I certify that I'm excited about the signotec LCD Signature Pad and the signotec Pad Capture Control. This demo application has blown me away and I can't wait to integrate all these great features in my own application.");
// do all drawing operations on the LCD directly
_stPad.DisplaySetTarget(DisplayTarget.ForegroundBuffer);
// draw buffered image
_stPad.DisplaySetImageFromStore(DisplayTarget.BackgroundBuffer);
// set default signature window
int x = 0;
int y = 0;
int width = 0;
int height = 0;
switch (_signPads[0].PadModel)
{
case PadModel.Sigma:
case PadModel.Zeta:
y = 50;
break;
case PadModel.Omega:
case PadModel.Gamma:
case PadModel.Delta:
y = 100;
break;
case PadModel.Alpha:
x = 90;
y = 600;
width = 590;
height = 370;
break;
}
_stPad.SensorSetSignRect(x, y, width, height);
// add default hotspots
switch (_signPads[0].PadModel)
{
case PadModel.Sigma:
case PadModel.Zeta:
x = 12;
y = 9;
width = 85;
height = 33;
break;
case PadModel.Omega:
case PadModel.Gamma:
x = 24;
y = 18;
width = 170;
height = 66;
break;
case PadModel.Delta:
x = 150;
y = 18;
width = 170;
height = 66;
break;
case PadModel.Alpha:
x = 30;
y = 30;
width = 80;
height = 80;
break;
}
_buttonCancelId = _stPad.SensorAddHotSpot(x, y, width, height);
switch (_signPads[0].PadModel)
{
case PadModel.Sigma:
case PadModel.Zeta:
x = 117;
break;
case PadModel.Omega:
x = 234;
break;
case PadModel.Gamma:
x = 315;
break;
case PadModel.Delta:
x = 555;
break;
case PadModel.Alpha:
x = 344;
break;
}
_buttonRetryId = _stPad.SensorAddHotSpot(x, y, width, height);
switch (_signPads[0].PadModel)
{
case PadModel.Sigma:
case PadModel.Zeta:
x = 222;
break;
case PadModel.Omega:
x = 444;
break;
case PadModel.Gamma:
x = 605;
break;
case PadModel.Delta:
x = 960;
break;
case PadModel.Alpha:
x = 658;
break;
}
_buttonConfirmId = _stPad.SensorAddHotSpot(x, y, width, height);
}
// start capturing
_stPad.SignatureStart();
}
catch (STPadException exc)
{
Log.WriteLog(exc.ToString());
MessageBox.Show(exc.Message);
//throw;
return false;
}
finally
{
}
return true;
}
private static void ConfirmCapturing()
{
try
{
// confirm capturing
_stPad.SignatureConfirm();
// clear hot spots
ClearHotSpots();
}
catch (STPadException exc)
{
Log.WriteLog(exc.ToString());
MessageBox.Show(exc.Message);
//throw;
}
}
#region helper methods
private static void ClearHotSpots()
{
try
{
_stPad.SensorClearHotSpots();
}
catch (STPadException exc)
{
Log.WriteLog(exc.ToString());
if (exc.ErrorCode != -22)
throw exc;
}
//_buttonCancelId = -1;
//_buttonRetryId = -1;
//_buttonConfirmId = -1;
}
private System.Windows.Media.Imaging.BitmapImage GetBitmapFromResource(System.Drawing.Bitmap bitmap, System.Drawing.Imaging.ImageFormat imageFormat)
{
System.IO.MemoryStream ms = new System.IO.MemoryStream();
bitmap.Save(ms, imageFormat);
System.Windows.Media.Imaging.BitmapImage bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.StreamSource = ms;
bitmapImage.EndInit();
return bitmapImage;
}
#endregion
}
public class SignPad
{
private STPadLibControl _stPad = null;
private int _index = -1;
private int _padType = 0;
private int _connectionType = 0;
private string _serial = "";
private int _fwMajor = 0;
private int _fwMinor = 0;
public SignPad()
{
}
public SignPad(STPadLibControl stPad, int index)
{
_stPad = stPad;
_index = index;
// get serial and type of selected device
_stPad.DeviceGetInfo(out _serial, out _padType, index);
// get connection type
_connectionType = _stPad.DeviceGetConnectionType(index);
// get firmware version
string version = _stPad.DeviceGetVersion(index);
string[] versionArray = version.Split('.');
if ((versionArray != null) && (versionArray.Length > 1))
{
_fwMajor = Int32.Parse(versionArray[0]);
_fwMinor = Int32.Parse(versionArray[1]);
}
}
public int PadType
{
get { return _padType; }
}
public PadModel PadModel
{
get
{
switch (PadType)
{
case 1:
case 2:
return PadModel.Sigma;
case 5:
case 6:
return PadModel.Zeta;
case 11:
case 12:
return PadModel.Omega;
case 15:
case 16:
return PadModel.Gamma;
case 21:
case 22:
case 23:
return PadModel.Delta;
case 31:
case 32:
case 33:
return PadModel.Alpha;
default:
throw new Exception("This pad type is not supported by this demo application!");
};
}
}
public string PadName
{
get
{
switch (_padType)
{
case 1:
return "Sigma USB";
case 2:
return "Sigma Serial";
case 5:
return "Zeta USB";
case 6:
return "Zeta Serial";
case 11:
return "Omega USB";
case 12:
return "Omega Serial";
case 15:
return "Gamma USB";
case 16:
return "Gamma Serial";
case 21:
return "Delta USB";
case 22:
return "Delta Serial";
case 23:
return "Delta IP";
case 31:
return "Alpha USB";
case 32:
return "Alpha Serial";
case 33:
return "Alpha IP";
default:
return "Unkown pad type " + _padType;
}
}
}
public string ConnectionName
{
get
{
switch (_connectionType)
{
case 0:
return "HID";
case 1:
return "USB";
case 2:
return String.Format("COM{0}", _stPad.DeviceGetComPort(_index));
case 3:
return _stPad.DeviceGetIPAddress(_index);
default:
return "Unkown connection type " + _connectionType;
}
}
}
public bool USB
{
get { return (_connectionType == 1); }
}
public string Serial
{
get { return _serial; }
}
public bool FastConnection
{
get { return (USB || (PadModel == PadModel.Sigma)); }
}
public string Firmware
{
get { return String.Format("{0}.{1}", _fwMajor, _fwMinor); }
}
public bool HasDisplay
{
get
{
if (_stPad == null)
return false;
else
return _stPad.DeviceGetCapabilities(_index).HasDisplay;
}
}
public bool SupportsPenScrolling
{
get
{
if (_stPad == null)
return false;
else
return _stPad.DeviceGetCapabilities(_index).SupportsPenScrolling;
}
}
}
}