Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
wisp
GitHub Repository: wisp/impinj-reader-app
Path: blob/master/ReaderLibrary/SettingsForm.cs
180 views
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.InteropServices;
using System.Threading;
using System.IO;
using System.Net;

using LLRP;
using LLRP.DataType;

using System.Diagnostics;

using ReaderLibrary;


namespace ReaderLibrary
{
    public partial class SettingsForm : Form
    {
        private ReaderManager reader;
        private ReaderManager.ReaderConfig readerConfigStruct;
        private ReaderManager.InventoryConfig invConfigStruct;

        public SettingsForm(ReaderManager readerRef)
        {
            reader = readerRef;
            InitializeComponent();
        }

        private void settings_Load_1(object sender, EventArgs e)
        {
            // set position of form
            base.Location = new Point(800, 250);

            if (reader.IsConnected())
            {
                // reader is our handle to the physical reader.
                readerConfigStruct = reader.getReaderConfig();
                invConfigStruct = reader.getInventoryConfig();
                PopulateReaderModeOptions();
                PopulateInvCmbBox();
                ApplySettingsToGUI(reader.getInventoryConfig());
                ApplySettingsToGUI(reader.getReaderConfig());
            }
            else
            {
                Error.message("Reader must be connected");
                this.Close();
            }

        }

        
        #region Reader and Inventory Settings

        // Transfer custom settings from the gui to the reader
        public bool ApplySettingsToReader()
        {
            bool error = false;
            bool[] ants = new bool[4];
            ants[0] = chkSettingsAnt1.Checked;
            ants[1] = chkSettingsAnt2.Checked;
            ants[2] = chkSettingsAnt3.Checked;
            ants[3] = chkSettingsAnt4.Checked;
            try
            {
                readerConfigStruct.antennaID = ants;
                readerConfigStruct.attenuation = (ushort)Convert.ToUInt16(txtSettingsAttenuation.Text);
                readerConfigStruct.channelIndex = (ushort)Convert.ToUInt16(txtSettingsChannelIdx.Text);
                readerConfigStruct.hopTableIndex = (ushort)Convert.ToUInt16(txtSettingsHopTableIdx.Text);
                
                //readerConfigStruct.periodicTriggerValue = (ushort)Convert.ToUInt16(txtSettingsPeriodicTriggerValue.Text);
                readerConfigStruct.readerSensitivity = (ushort)Convert.ToUInt16(txtSettingsReaderSensitivity.Text);
                readerConfigStruct.tagPopulation = (ushort)Convert.ToUInt16(txtSettingsTagPopulation.Text);
                readerConfigStruct.tagTransitTime = (ushort)Convert.ToUInt16(txtSettingsTagTransitTime.Text);
                readerConfigStruct.modeIndex = (ushort)((ReaderManager.ReaderMode)cmbSettingsMode.SelectedItem).GetModeIdentifier();

                invConfigStruct.startTrigger = (LLRP.ENUM_ROSpecStartTriggerType)(cmbSettingsROStartTrigger.SelectedItem);
                invConfigStruct.stopTrigger = (LLRP.ENUM_ROSpecStopTriggerType)(cmbSettingsROStopTrigger.SelectedItem);
                invConfigStruct.AITriggerType = (LLRP.ENUM_AISpecStopTriggerType)(cmbSettingsAIStopTrigger.SelectedItem);
                invConfigStruct.reportTrigger = (LLRP.ENUM_ROReportTriggerType)(cmbSettingsReportTrigger.SelectedItem);

                invConfigStruct.reportN = (ushort)Convert.ToUInt16(txtNumReports.Text);
                invConfigStruct.numAttempts = (ushort)Convert.ToUInt16(txtSettingsNumAttempts.Text);
                invConfigStruct.numTags = (ushort)Convert.ToUInt16(txtSettingsNumTags.Text);
                invConfigStruct.duration = (ushort)Convert.ToUInt16(txtSettingsDuration.Text);
                invConfigStruct.AITimeout = (uint)Convert.ToUInt16(txtSettingsAITimeout.Text);


            }
            catch (Exception e)
            {
                error = true;
                Error.message("Parse error: " + e.ToString());
            }
            try
            {
                reader.setReaderConfig(readerConfigStruct);
                reader.setInventoryConfig(invConfigStruct);
                //txtMessages.Text = "Config Set Successfully";
            }
            catch (Exception e)
            {
                Error.message("Parse error: " + e.ToString());
            }

            return error;
        // Transfer custom settings from the gui to the reader
        
            //AppendToDebugTextBox("Warning: Default Inventory settings are currently used.");
            //reader.SetDefaultInventoryConfig();
        }

        // Transfer reader's settings to the GUI
        public void ApplySettingsToGUI(ReaderManager.ReaderConfig config)
        {
            bool[] ants = config.antennaID;
            chkSettingsAnt1.Checked = ants[0];
            chkSettingsAnt2.Checked = ants[1];
            chkSettingsAnt3.Checked = ants[2];
            chkSettingsAnt4.Checked = ants[3];
            txtSettingsAttenuation.Text = config.attenuation.ToString();
            txtSettingsChannelIdx.Text = config.channelIndex.ToString();
            txtSettingsHopTableIdx.Text = config.hopTableIndex.ToString();
            for (int idx = 0; idx < cmbSettingsMode.Items.Count; idx++)
            {
                uint id = ((ReaderManager.ReaderMode)cmbSettingsMode.Items[idx]).GetModeIdentifier();
                if (id == config.modeIndex)
                    cmbSettingsMode.SelectedIndex = idx;
            }

            // todo: config.modeIndex;

            //txtSettingsPeriodicTriggerValue.Text = config.periodicTriggerValue.ToString();
            txtSettingsReaderSensitivity.Text = config.readerSensitivity.ToString();
            txtSettingsTagPopulation.Text = config.tagPopulation.ToString();
            txtSettingsTagTransitTime.Text = config.tagTransitTime.ToString();
        }

        // Transfer reader's settings to the GUI
        public void ApplySettingsToGUI(ReaderManager.InventoryConfig config)
        {
            // this sets the cmb box to show the new set values
            cmbSettingsROStartTrigger.SelectedItem = config.startTrigger;
            cmbSettingsROStopTrigger.SelectedItem = config.stopTrigger;
            cmbSettingsReportTrigger.SelectedItem = config.reportTrigger;
            cmbSettingsAIStopTrigger.SelectedItem = config.AITriggerType;

            txtNumReports.Text = config.reportN.ToString();
            txtSettingsNumAttempts.Text = config.numAttempts.ToString();
            txtSettingsNumTags.Text = config.numTags.ToString();
            txtSettingsDuration.Text = config.duration.ToString();
            txtSettingsAITimeout.Text = config.AITimeout.ToString();
        }

        private void PopulateInvCmbBox()
        {
            cmbSettingsROStartTrigger.DataSource = Enum.GetValues(typeof(LLRP.ENUM_ROSpecStartTriggerType));
            cmbSettingsROStopTrigger.DataSource = Enum.GetValues(typeof(LLRP.ENUM_ROSpecStopTriggerType));
            cmbSettingsReportTrigger.DataSource = Enum.GetValues(typeof(LLRP.ENUM_ROReportTriggerType));
            cmbSettingsAIStopTrigger.DataSource = Enum.GetValues(typeof(LLRP.ENUM_AISpecStopTriggerType));
        }

        public void PopulateReaderModeOptions()
        {
            cmbSettingsMode.Items.Clear();

            ReaderManager.ReaderMode[] modes = reader.GetReaderModulationModes();
            if (modes == null)
                return;
            for (int i = 0; i < modes.Length && modes[i] != null; i++)
                cmbSettingsMode.Items.Add(modes[i]);
        }

        #endregion

        

        private void groupBox1_Enter(object sender, EventArgs e)
        {

        }

        private void btnSettingsDefault_Click(object sender, EventArgs e)
        {
            reader.SetDefaultReaderConfig();
            ApplySettingsToGUI(reader.getReaderConfig());
            reader.SetDefaultInventoryConfig();
            ApplySettingsToGUI(reader.getInventoryConfig());
            PopulateInvCmbBox();
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            // only hides it
            this.Close();
        }

        private void btnSettingsApply_Click(object sender, EventArgs e)
        {
            bool error = ApplySettingsToReader();
            reader.setReaderConfig(readerConfigStruct);
            reader.setInventoryConfig(invConfigStruct);
            //ApplySettingsToGUI(reader.getInventoryConfig());
            //ApplySettingsToGUI(reader.getReaderConfig());
            if (reader.IsInventoryRunning())
            {
                Error.message("Inventory needs to be restarted, for setting change to apply");
            }
            
            if (!error)
            {
                this.Close();
            }
        }

        private void cmbSettingsROStartTrigger_SelectedIndexChanged(object sender, EventArgs e)
        {

        }
    }

    #region Message Box

    public class Error
    {
        public static int message(string msg)
        {
            MessageBox.Show(msg,
                            "Error",
                            MessageBoxButtons.OK,
                            MessageBoxIcon.Error);
            return 0;
        }
    }


    #endregion
}