Question

I'm developing an application to control cafeteria consumption for my company. Basically each employee has a badge id with a barcode, and they are entitled to a free meal every day. The application will scan the badge and log each employees' meals. It will run on a Motorola MK4000 device, which has an integrated scanner and runs on Windows CE.

I've got an issue with the device scanner. I can get it to run and scan fine, but if it stays idle for a few minutes, it goes to "Waiting" status, the laser turns off, and doesn't come back on. I've tried monitoring the status and starting a new read when it changes to that status, but then it just keeps scanning false reads indefinitely.

Can you guys help me figure out what im doing wrong?

This is the class I'm using for the scanner functionality. It wasn't developed by me, but its begin used for other applications on the same device (I made a few changes to it, mostly on the error messages).

using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

namespace MK4000
{
class BarCode
{
    #region Fields

    private Symbol.Barcode.Reader myReader = null;
    private Symbol.Barcode.ReaderData myReaderData = null;
    private System.EventHandler myReadNotifyHandler = null;
    private System.EventHandler myStatusNotifyHandler = null;

    #endregion Fields

    #region Properties

    /// <summary>
    /// Provides the access to the Symbol.Barcode.Reader reference.
    /// The user can use this reference for his additional Reader - related operations.
    /// </summary>
    public Symbol.Barcode.Reader Reader
    {
        get
        {
            return myReader;
        }
    }

    public String ErrorMessage
    {
        get
        {
            return "Error";
        }
    }

    #endregion Properties

    #region Methods

    /// <summary>
    /// Attach a ReadNotify handler.
    /// </summary>
    public void AttachReadNotify(System.EventHandler ReadNotifyHandler)
    {
        // If we have a reader
        if (myReader != null)
        {
            // Attach the read notification handler.
            myReader.ReadNotify += ReadNotifyHandler;
            myReadNotifyHandler = ReadNotifyHandler;
        }
    }

    /// <summary>
    /// Attach a StatusNotify handler.
    /// </summary>
    public void AttachStatusNotify(System.EventHandler StatusNotifyHandler)
    {
        // If we have a reader
        if (myReader != null)
        {
            // Attach status notification handler.
            myReader.StatusNotify += StatusNotifyHandler;
            myStatusNotifyHandler = StatusNotifyHandler;
        }
    }

    /// <summary>
    /// Detach the ReadNotify handler.
    /// </summary>
    public void DetachReadNotify()
    {
        if ((myReader != null) && (myReadNotifyHandler != null))
        {
            // Detach the read notification handler.
            myReader.ReadNotify -= myReadNotifyHandler;
            myReadNotifyHandler = null;
        }
    }

    /// <summary>
    /// Detach a StatusNotify handler.
    /// </summary>
    public void DetachStatusNotify()
    {
        // If we have a reader registered for receiving the status notifications
        if ((myReader != null) && (myStatusNotifyHandler != null))
        {
            // Detach the status notification handler.
            myReader.StatusNotify -= myStatusNotifyHandler;
            myStatusNotifyHandler = null;
        }
    }

    /// <summary>
    /// Initialize the reader.
    /// </summary>
    public bool InitReader()
    {
        // If the reader is already initialized then fail the initialization.
        if (myReader != null)
        {
            return false;
        }
        else // Else initialize the reader.
        {
            try
            {
                // Get the device selected by the user.
                Symbol.Generic.Device MyDevice =
                    Symbol.StandardForms.SelectDevice.Select(
                    Symbol.Barcode.Device.Title,
                    Symbol.Barcode.Device.AvailableDevices);

                if (MyDevice == null)
                {
                    MessageBox.Show(ErrorMessage);
                    return false;
                }

                // Create the reader, based on selected device.
                myReader = new Symbol.Barcode.Reader(MyDevice);

                // Create the reader data.
                myReaderData = new Symbol.Barcode.ReaderData(
                    Symbol.Barcode.ReaderDataTypes.Text,
                    Symbol.Barcode.ReaderDataLengths.MaximumLabel);

                // Enable the Reader.
                myReader.Actions.Enable();

                // In this sample, we are setting the aim type to trigger.
                switch (myReader.ReaderParameters.ReaderType)
                {
                    case Symbol.Barcode.READER_TYPE.READER_TYPE_IMAGER:
                        myReader.ReaderParameters.ReaderSpecific.ImagerSpecific.AimType = Symbol.Barcode.AIM_TYPE.AIM_TYPE_TRIGGER;
                        //myReader.Parameters.Feedback.Success.BeepTime = 0;
                        break;
                    case Symbol.Barcode.READER_TYPE.READER_TYPE_LASER:
                        myReader.ReaderParameters.ReaderSpecific.LaserSpecific.AimType = Symbol.Barcode.AIM_TYPE.AIM_TYPE_TRIGGER;
                        break;
                    case Symbol.Barcode.READER_TYPE.READER_TYPE_CONTACT:
                        // AimType is not supported by the contact readers.
                        break;
                }
                myReader.Actions.SetParameters();

            }

            catch (Symbol.Exceptions.OperationFailureException ex)
            {
                MessageBox.Show(ex.Message);

                return false;
            }
            catch (Symbol.Exceptions.InvalidRequestException ex)
            {
                MessageBox.Show(ex.Message);

                return false;
            }
            catch (Symbol.Exceptions.InvalidIndexerException ex)
            {
                MessageBox.Show(ex.Message);

                return false;
            };

            return true;
        }
    }

    /// <summary>
    /// Start a read on the reader.
    /// </summary>
    public void StartRead(bool toggleSoftTrigger)
    {
        // If we have both a reader and a reader data
        if ((myReader != null) &&
            (myReaderData != null))

            try
            {
                if (!myReaderData.IsPending)
                {
                    // Submit a read.
                    myReader.Actions.Read(myReaderData);

                    if (toggleSoftTrigger && myReader.Info.SoftTrigger == false)
                    {
                        myReader.Info.SoftTrigger = true;
                    }
                }
            }

            catch (Symbol.Exceptions.OperationFailureException ex)
            {
                MessageBox.Show(ex.Message);
            }
            catch (Symbol.Exceptions.InvalidRequestException ex)
            {
                MessageBox.Show(ex.Message);

            }
            catch (Symbol.Exceptions.InvalidIndexerException ex)
            {
                MessageBox.Show(ex.Message);

            };
    }

    /// <summary>
    /// Stop all reads on the reader.
    /// </summary>
    public void StopRead()
    {
        //If we have a reader
        if (myReader != null)
        {
            try
            {
                // Flush (Cancel all pending reads).
                if (myReader.Info.SoftTrigger == true)
                {
                    myReader.Info.SoftTrigger = false;
                }
                myReader.Actions.Flush();
            }

            catch (Symbol.Exceptions.OperationFailureException ex)
            {
                MessageBox.Show(ex.Message);
            }
            catch (Symbol.Exceptions.InvalidRequestException ex)
            {
                MessageBox.Show(ex.Message);
            }
            catch (Symbol.Exceptions.InvalidIndexerException ex)
            {
                MessageBox.Show(ex.Message);
            };
        }
    }

    /// <summary>
    /// Stop reading and disable/close the reader.
    /// </summary>
    public void TermReader()
    {
        // If we have a reader
        if (myReader != null)
        {
            try
            {
                // stop all the notifications.
                StopRead();

                //Detach all the notification handler if the user has not done it already.
                DetachReadNotify();
                DetachStatusNotify();

                // Disable the reader.
                myReader.Actions.Disable();

                // Free it up.
                myReader.Dispose();

                // Make the reference null.
                myReader = null;
            }

            catch (Symbol.Exceptions.OperationFailureException ex)
            {
                MessageBox.Show(ex.Message);
            }
            catch (Symbol.Exceptions.InvalidRequestException ex)
            {
                MessageBox.Show(ex.Message);
            }
            catch (Symbol.Exceptions.InvalidIndexerException ex)
            {
                MessageBox.Show(ex.Message);
            };
        }

        // After disposing the reader, dispose the reader data.
        if (myReaderData != null)
        {
            try
            {
                // Free it up.
                myReaderData.Dispose();

                // Make the reference null.
                myReaderData = null;
            }

            catch (Symbol.Exceptions.OperationFailureException ex)
            {
                MessageBox.Show(ex.Message);
            }
            catch (Symbol.Exceptions.InvalidRequestException ex)
            {
                MessageBox.Show(ex.Message);
            }
            catch (Symbol.Exceptions.InvalidIndexerException ex)
            {
                MessageBox.Show(ex.Message);
            };
        }
    }

    #endregion Methods

}
}

And this is the code for the actual form:

using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace MK4000
{
public partial class Form1 : Form
{

    private bool isReaderInitiated;        
    private BarCode myScanner;
    private EventHandler myStatusNotifyHandler = null;
    private EventHandler myReadNotifyHandler = null;
    private String MacAddress = "00-00-00-00-00-00";
    private String strIPAddress = "000.000.000.000";
    private String version = "0.0.0.1";
    public static int TaskbarHeight = Screen.PrimaryScreen.Bounds.Height - Screen.PrimaryScreen.WorkingArea.Height;
    private int counter = 0;
    private int itemLimit = 10;

    public String ErrorMessage
    {
        get
        {
            return "Error";
        }
    }

    public Form1()
    {
        InitializeComponent();

        this.Width = Screen.PrimaryScreen.Bounds.Width;
        this.Height = Screen.PrimaryScreen.Bounds.Height - TaskbarHeight;
        this.FormBorderStyle = FormBorderStyle.None;
        this.ControlBox = false;
        this.MinimizeBox = false;
        this.EmpID.Visible = false;
        this.EmpName.Visible = false;
        this.messageLabel.Visible = false;
        this.lblCounter.Text = counter.ToString();
        this.lblCounter.Visible = false;
        this.statusBar1.Text = "Initializing.. Reticulating Splines            " + MacAddress + " | " + strIPAddress + " | " + version;
        this.listView1.View = View.Details;
        this.listView1.Columns.Add("EmployeeID", 150, HorizontalAlignment.Left);
        this.listView1.Columns.Add("EmployeeName", 330, HorizontalAlignment.Left);
        this.listView1.Columns.Add("Time", 250, HorizontalAlignment.Left);


        this.Closing += new CancelEventHandler(Form1_OnClosing);

        this.myScanner = new BarCode();
        this.isReaderInitiated = this.myScanner.InitReader();

        if (!(this.isReaderInitiated))// If the reader has not been initialized
        {
            // Display a message & exit the application.
            MessageBox.Show(ErrorMessage);
            Application.Exit();
        }
        else // If the reader has been initialized
        {
            // Attach a status natification handler.
            myScanner.AttachStatusNotify(myScanner_StatusNotify);
            // Start a read operation & attach a handler.
            myScanner.StartRead(true);
            myScanner.AttachReadNotify(myScanner_ReadNotify);
        }
    }

    private void myScanner_ReadNotify(object Sender, EventArgs e)
    {

        // Get ReaderData
        Symbol.Barcode.ReaderData TheReaderData = this.myScanner.Reader.GetNextReaderData();
        processData(TheReaderData.ToString());


        this.myScanner.StopRead();

        System.Threading.Thread.Sleep(1000);

        this.myScanner.StartRead(true);

    }

    private void processData(string readerData)
    {
        string EmployeeName = "";
        string EmployeeID = readerData;

        hideMessage();


        //This will query the employee database and proceed if employee exists, right now i just give it a random name
        EmployeeName = "John Doe";

        if (EmployeeName != "")
        {
            addToList(EmployeeID, EmployeeName);
            counter += 1;
            this.lblCounter.Text = counter.ToString();
            this.EmpID.Visible = true
            this.EmpName.Visible = true
            this.lblCounter.Visible = true;
            showMessage("Thank You!", System.Drawing.Color.LimeGreen);

        }

    }

    private void showMessage(string messageText, System.Drawing.Color messageColor)
    {
        this.messageLabel.Text = messageText;
        this.messageLabel.BackColor = messageColor;
        this.messageLabel.Visible = true;

    }

    private void hideMessage()
    {
        this.messageLabel.Text = "";
        this.messageLabel.BackColor = System.Drawing.Color.Black;
        this.messageLabel.Visible = false;
    }

    private void addToList(string EmployeeID, string EmployeeName)
    {
        if (this.listView1.Items.Count >= itemLimit)
        {
            this.listView1.Items.RemoveAt(0);
        }
        ListViewItem item = new ListViewItem(EmployeeID);
        //item.Text = EmployeeID;
        item.SubItems.Add(EmployeeName);
        item.SubItems.Add(DateTime.Now.ToString());

        this.listView1.Items.Add(item);
        this.listView1.Refresh();    
    }

    private void myScanner_StatusNotify(object Sender, EventArgs e)
    {
        // Get ReaderData
        Symbol.Barcode.BarcodeStatus TheStatusData = this.myScanner.Reader.GetNextStatus();

        switch (TheStatusData.State)
        {
            case Symbol.Barcode.States.IDLE:
                this.statusBar1.Text = "Idle - Scan ID Barcode                      " + MacAddress + " | " + strIPAddress + " | " + version;
                break;
            case Symbol.Barcode.States.READY:
                this.statusBar1.Text = "Ready - Scan ID Barcode                     " + MacAddress + " | " + strIPAddress + " | " + version;
                break;                
            case Symbol.Barcode.States.WAITING:
                //this.myScanner.StopRead();
                //this.myScanner.StartRead(true);                    
                this.statusBar1.Text = "Waiting- Scan ID Barcode                    " + MacAddress + " | " + strIPAddress + " | " + version;
                break;
            default:
                this.statusBar1.Text = TheStatusData.Text + "                     " + MacAddress + " | " + strIPAddress + " | " + version;
                break;
        }
    }

    private void Form1_OnClosing(object Sender, EventArgs e)
    {
        if (isReaderInitiated)
        {
            myScanner.DetachReadNotify();
            myScanner.DetachStatusNotify();
            myScanner.TermReader();
        }
    }

    private void pictureBox1_Click(object sender, EventArgs e)
    {
        this.Close();
    }

    private void pictureBox2_Click(object sender, EventArgs e)
    {
        this.myScanner.StopRead();
        this.myScanner.StartRead(true); 
    }



}
}

This is still a work in progress, mind you, so there is some functionality missing, but I want to have the scanner workingfull before moving forward. Any help will be greatly appreciated, thank you.

Was it helpful?

Solution

Ok, I figured out that the scanner goes into a cycle of switching between Idle and Waiting status, this is why my StatusNotify event handler was making the scanner laser turn on and off repeatedly.

I solved it by saving the previous status, and only restarting the scanner when the previous status is not one of those two.

case Symbol.Barcode.States.WAITING:
                if (lastScannerStatus != "WAITING" && lastScannerStatus != "INIT" && lastScannerStatus != "IDLE")
                {
                    this.myScanner.StopRead();
                    this.myScanner.StartRead(true);
                }
                this.statusBar1.Text = "Waiting- Scan ID Barcode                    " + MacAddress + " | " + strIPAddress + " | " + version;

                break;
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top