Why do code on a long weekend? Because I haven't done much coding in the past month and it makes me feel happy. Time to brush off some of that rust. Plus these relay boards that Robotics Connection help make were just sitting idle with no LEDs to turn on and off randomly.
And here is the code from the actual Relayboard object that does all that voodoo.
1: public class RoboticsConnection : IDisposable
2: {
3: //ComPortIO ComPort;
4: SerialPort comport;
5: ArrayList relayBoards;
6: Thread pourThread;
7:
8: private const string returnLine = "r";
9:
10:
11: private const string pour = "pour";
12: private const string pourFormat = " {0}:{1}:{2}";
13:
14: private const string ack = "ACK" + returnLine;
15: private const string firmwareVersion = "fw" + returnLine;
16: private const string reset = "reset" + returnLine;
17:
18: public delegate void DrinkCompleteEventHandler
(object sender, EventArgs e);
19: public event DrinkCompleteEventHandler DrinkCompleted;
20:
21: public void Dispose()
22: {
23: //ComPort.Dispose();
24: if (comport.IsOpen)
25: comport.Close();
26: }
27:
28: public RoboticsConnection(int ComPortNumber, int MasterBoardNumber,
bool DisableComWriting, params int[] AdditionalBoardsNumbers)
29: {
30: //ComPort = new ComPortIO("COM" + ComPortNumber, DisableComWriting);
31:
32: comport = new
SerialPort("COM" + ComPortNumber, 19200, Parity.None, 8, StopBits.One);
33: comport.Open();
34:
35: relayBoards = new ArrayList();
36: relayBoards.Add(MasterBoardNumber);
37: for (int i = 0; i < AdditionalBoardsNumbers.Length; i++)
38: {
39: if (relayBoards.Contains(AdditionalBoardsNumbers[i]))
40: throw new ArgumentException(string.Format(
"Duplicate RelayBoard Detected. Value: {0} has already been initialized", AdditionalBoardsNumbers[i]), "AdditionalBoardsNumbers");
41:
42: relayBoards.Add(AdditionalBoardsNumbers[i]);
43: }
44: }
45:
46: public string GetFirmwareVersion()
47: {
48: comport.Write(firmwareVersion);
49: return comport.ReadLine();
50: }
51:
52: public void ResetBoards()
53: {
54: comport.Write(reset);
55: }
56:
57: public void PourDrinks(params RelayBoardPourCommand[] Commands)
58: {
59: StringBuilder sb = new StringBuilder(pour);
60:
61: foreach (RelayBoardPourCommand command in Commands)
62: {
63: sb.AppendFormat(
pourFormat, command.BoardNumber, command.RelayNumber, command.Milliseconds);
64: }
65:
66: sb.Append(returnLine);
67: // ComPort.ComPort.DataReceived += dataReceivedEventHandler;
68: comport.Write(sb.ToString());
69: }
70:
71: private void dataReceivedEventHandler(object sender, SerialDataReceivedEventArgs e)
72: {
73: if (comport.ReadLine() == ack && DrinkCompleted != null)
74: {
75: DrinkCompleted(this, null);
76: }
77:
78: comport.DataReceived -= dataReceivedEventHandler;
79: }
80:
81: public struct RelayBoardPourCommand
82: {
83: public int BoardNumber;
84:
85: /// <summary>
86: /// The amount of time in milliseconds that the relayboard should fire
87: /// </summary>
88: public int Milliseconds
89: {
90: get { return _milliseconds; }
91: set
92: {
93: if (value < 0)
94: throw new ArgumentOutOfRangeException(
"Milliseconds", value,
"Value must be greater than zero");
95:
96: _milliseconds = value;
97: }
98: }
99: private int _milliseconds;
100:
101: /// <summary>
102: /// Which relay on the board should be fired, a value between 1 and 8
103: /// </summary>
104: public int RelayNumber
105: {
106: get { return _relayNumber; }
107: set
108: {
109: if (value < 1 || value > 8)
110: throw new ArgumentOutOfRangeException(
"RelayNumber", value,
"Value must be between 1 and 8");
111:
112: _relayNumber = value;
113: }
114: }
115: private int _relayNumber;
116: }
117: }