Raunu
Raunu

Reputation: 3

Using multiple variables across multiple functions in C#

I'm trying to write a program to interface with an I/O card. The hardware's provided documentation is in C# and I have never used C# before. So, pardon me if this question seems very basic or elementary.

Using the manufacturer's functions calls for at least 3 variables per I/O pin and there are 55 pins. That means a lot of defined variables. As I am writing my code, I am finding that its very ugly. I am reusing snippets here and there that could easily be made a function. But making them a function, I lose the ability to access the multitude of variables. Is there some simple way to do this?

Here is an shortened version of what I am currently working with. The missing pieces look the same. I'm using VS2012. Thanks in advance.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;

/* Tool Changer Controller Program
 * In theory, this program will run the tool changer through a full cycle.
 * This includes:     removing the current tool, 
 *                    placing the current tool in its appropriate location on the carousel,
 *                    moving the carousel to the correct location of the new tool,
 *                    placing the new tool in the spindle so it is ready for use.
 */
namespace Tool_Changer
{

class Program
{
    static void Main(string[] args)
    {
        // Create PoKeys55 device object
        PoKeysDevice_DLL.PoKeysDevice device = new PoKeysDevice_DLL.PoKeysDevice();

        // Define all pins and correlate to correct pin
        // Pin: Pin #, Status: pass/fail returned, State: On/Off status
        // Swivel
        byte SwivelCCWA_Pin = 0; //Set*
        bool SwivelCCWA_Status = false;
        bool SwivelCCWA_State = false;

        byte SwivelCWA_Pin = 2; //Set*
        bool SwivelCWA_Status = false;
        bool SwivelCWA_State = false;

        // Telescope
        byte TeleExtA_Pin = 4; //Set*
        bool TeleExtA_Status = false;
        bool TeleExtA_State = false;

        byte TeleRetA_Pin = 6; //Set*
        bool TeleRetA_Status = false;
        bool TeleRetA_State = false;
        // Grabber
        byte GrabberOpen_Pin = 12; //Set*
        bool GrabberOpen_Status = false;
        bool GrabberOpen_State = false;

        byte ToolPresent_Pin = 13; //Get
        bool ToolPresent_Status = false;
        bool ToolPresent_State = false;

        // Begin Tool Change procedure.
        SwivelCWA_State = false;
        SwivelCCWA_State = true;
        SwivelCWA_Status = device.SetOutput(SwivelCWA_Pin, SwivelCWA_State); // Turn off CW
        SwivelCCWA_Status = device.SetOutput(SwivelCCWA_Pin, SwivelCCWA_State); // Turn on CCW
        Thread.Sleep(1000);

        GrabberOpen_State = true;
        GrabberOpen_Status = device.SetOutput(GrabberOpen_Pin, GrabberOpen_State); // Open Grabber

        TeleRetA_State = false;
        TeleExtA_State = true;
        TeleRetA_Status = device.SetOutput(TeleRetA_Pin, TeleRetA_State); // Turn off retract
        TeleExtA_Status = device.SetOutput(TeleExtA_Pin, TeleExtA_State); // Turn on extend
        Thread.Sleep(1000);

Upvotes: 0

Views: 1917

Answers (2)

Martin Mulder
Martin Mulder

Reputation: 12934

Create a dictionary with all output settings per pin:

 Dictionary<int, bool> pinStates = new Dictionary<int, bool> 
 {
     {0, false},
     {2, true},
     {12, false},
     {13, false}
 };

Then you could create a function so set all the output pins and retrieve the results in another dictionary:

Dictionary<int, bool> pinResults = new Dictionary<int, bool>();
foreach(KeyValuePair<int, bool> pinState in pinStates)
{
    pinResults[pinState.Key] = device.SetOutput(pinState.Key, pinState.Value); 
}

At this point, all outputs pins are set, and your second dictionary is filled with the results. You can retrieve the results this way:

bool resultOfPin12 = pinResults[12];

Upvotes: 0

Pavel Vladov
Pavel Vladov

Reputation: 4837

The code will become prettier and more compact if you use a struct to hold the common variables. For example:

public struct Item
{
    public Item(byte pin, bool status, bool state)
    {
        Pin = pin;
        Status = status;
        State = state;
    }

    public byte Pin;
    public bool Status;
    public bool State;
}

And then instead of setting each variable individually like this:

byte SwivelCCWA_Pin = 0; //Set*
bool SwivelCCWA_Status = false;
bool SwivelCCWA_State = false;

you will be able to use only one line of code like this:

Item swivelCCWA = new Item(0, false, false);

Upvotes: 2

Related Questions