-
Notifications
You must be signed in to change notification settings - Fork 1
/
frmIcStationRelay.cs
225 lines (171 loc) · 7.53 KB
/
frmIcStationRelay.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
// ICStation ICSE012A ICSE013A ICSE014A Tester - v1.01 26/8/2017 - © 2017 fabio.rossetti@gmail.com
// .net test program form icstation serial relay board model ICSE012A ICSE013A ICSE014A
namespace TestRelay
{
public partial class frmIcStationRelay : Form
{
private SerialPort port;
public frmIcStationRelay()
{
InitializeComponent();
}
private const int PORT_DELAY=500; //serial delay, I'm polling the serial port, could use the event support but it's unreliable
private SerialPort initcom()
{
return new SerialPort(cbSerialPorts.Text, 9600, Parity.None, 8, StopBits.One); //recommended settings
}
private void btnInit_Click(object sender, EventArgs e)
{
byte[] commandcode = new byte[] { (byte)'\x51' }; //put the board in operative mode
byte[] result = sendserial(commandcode); //should be nothing
txtOutput.Text += "Sent Hex Code 51 to setup board." + Environment.NewLine;
}
private void btnDeinit_Click(object sender, EventArgs e)
{
byte[] commandcode = new byte[] { (byte)'\x50' }; //ask board id, works only when first plugged and before the init command
byte[] boardid = sendserial(commandcode);
txtOutput.Text += "Sent Hex Code 50 (Request board id) : ";
if (boardid.Length == 0 )
{
txtOutput.Text += "Received no response - try unplugging the board." + Environment.NewLine; //board has already been used
return;
}
switch (boardid[0])
{
// one has to read individual bytes and not strings, otherwhise the .net encoding stuff will convert these codes to a '?' hex 3F
case (byte)'\xAD':
txtOutput.Text += "Received code Hex AD - ICSE013A 2 relay model" + Environment.NewLine;
break;
// untested with real hardware
case (byte)'\xAB':
txtOutput.Text += "Received code Hex AB - ICSE012A 4 relay model" + Environment.NewLine;
break;
case (byte)'\xAC':
txtOutput.Text += "Received code Hex AC - ICSE014A 8 relay model" + Environment.NewLine;
break;
default:
txtOutput.Text += "Received unkwnon code Hex" + String.Format("{0:X2}", Convert.ToInt32(boardid[0] )) + Environment.NewLine;;
break;
}
}
private void btnLoadSerialPorts_Click(object sender, EventArgs e)
{
setupserialportscombobox();
}
private void setupserialportscombobox()
{
cbSerialPorts.Items.Clear();
// Get a list of serial port names.
string[] serialports = SerialPort.GetPortNames();
// Put into combobox
foreach (string serialport in serialports)
{
cbSerialPorts.Items.Add(serialport);
}
if (cbSerialPorts.Items.Count >= 1) cbSerialPorts.SelectedIndex = 0;
}
private void frmIcStationRelay_Load(object sender, EventArgs e)
{
setupserialportscombobox();
}
private void btnSendRelays_Click(object sender, EventArgs e)
{
byte command = 0;
//setup individual bits
command += (byte)(cbRelay1.Checked ? 1 : 0);
command += (byte)(cbRelay2.Checked ? 2 : 0);
command += (byte)(cbRelay3.Checked ? 4 : 0);
command += (byte)(cbRelay4.Checked ? 8 : 0);
command += (byte)(cbRelay5.Checked ? 16 : 0);
command += (byte)(cbRelay6.Checked ? 32 : 0);
command += (byte)(cbRelay7.Checked ? 64 : 0);
byte[] commandcode = new byte[] { command };
byte[] result = sendserial(commandcode); //should be nothing
txtOutput.Text += "Sent relay switch command Hex " + String.Format("{0:X2}", Convert.ToInt32(command)) + Environment.NewLine;
}
//marshal winforms data for background worker
private struct bwarg
{
public string porta;
public int frequenza;
};
private void btnAlterna_Click(object sender, EventArgs e)
{
//todo: check for possible conflicts with other buttons opening the serial port
bwarg bwargument;
bwargument.porta = cbSerialPorts.Text;
bwargument.frequenza = (int) udFreq.Value;
if (bwAlterna.IsBusy != true)
{
bwAlterna.RunWorkerAsync(bwargument);
}
}
private void btnStopAlternate_Click(object sender, EventArgs e)
{
bwAlterna.CancelAsync();
}
byte[] sendserial(byte[] command)
{
try
{
port = initcom();
port.Open();
port.Write(command, 0, 1);
System.Threading.Thread.Sleep(PORT_DELAY);
byte[] buffer = new byte[port.ReadBufferSize];
int bytesRead = 0;
if (port.BytesToRead > 0) bytesRead = port.Read(buffer, 0, buffer.Length);
port.Close();
if (bytesRead == 0)
{
return new Byte[] {};
}
else
{
return buffer.Skip(0).Take(bytesRead).ToArray();
}
}
catch (Exception ex)
{
MessageBox.Show("Error! " + ex.Message);
return new Byte[] {};
}
}
private void bwAlterna_DoWork(object sender, DoWorkEventArgs e)
{
//set all possible states of a 2 relay board continuously until the thread is stopped
BackgroundWorker bw = (BackgroundWorker) sender;
port = new SerialPort(((bwarg)(e.Argument)).porta, 9600, Parity.None, 8, StopBits.One);
port.Open();
for (;;)
{
port.Write(new byte[] { 1 }, 0, 1);
System.Threading.Thread.Sleep(((bwarg)(e.Argument)).frequenza);
Application.DoEvents();
port.Write(new byte[] { 2 }, 0, 1);
System.Threading.Thread.Sleep(((bwarg)(e.Argument)).frequenza);
port.Write(new byte[] { 3 }, 0, 1);
System.Threading.Thread.Sleep(((bwarg)(e.Argument)).frequenza);
Application.DoEvents();
port.Write(new byte[] { 0 }, 0, 1);
System.Threading.Thread.Sleep(((bwarg) (e.Argument)).frequenza);
if ((bwAlterna.CancellationPending == true))
{
port.Close();
e.Cancel = true;
break;
}
}
port.Close();
}
}
}