Skip to content

Commit 5387184

Browse files
committed
General improvements to the Can connection code
1 parent 3a27f95 commit 5387184

File tree

6 files changed

+51
-24
lines changed

6 files changed

+51
-24
lines changed

ArrowPoint-CANbus-Tools/Canbus/CanOverEthernet.cs

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,12 @@ public class CanOverEthernet : ICanTrafficInterface
2525
private const int DEFAULT_PORT = 4876;
2626

2727
private Thread UdpReceiverThread;
28-
private UdpClient udpConnection;
28+
private UdpClient udpReceiverConnection;
29+
private UdpClient udpSenderConnection;
2930
private Boolean isConnected;
30-
private IPAddress ipAddress;
31-
private IPEndPoint ipEndPoint;
31+
private IPAddress ipAddressMulticast;
32+
private IPEndPoint ipEndPointMulticast;
33+
private IPEndPoint localEndPoint;
3234

3335
public string Ip;
3436
public int Port;
@@ -61,16 +63,30 @@ internal void Close()
6163
public Boolean Connect()
6264
{
6365

64-
// Sender
65-
ipAddress = IPAddress.Parse(this.Ip);
66-
ipEndPoint = new IPEndPoint(this.ipAddress, this.Port);
66+
// Both the sender the receiver
67+
ipAddressMulticast = IPAddress.Parse(this.Ip);
68+
ipEndPointMulticast = new IPEndPoint(this.ipAddressMulticast, this.Port);
69+
localEndPoint = new IPEndPoint(IPAddress.Any, this.Port);
6770

68-
// Receiver
71+
// Setup sender and receiver
6972
try
7073
{
71-
this.udpConnection = new UdpClient(this.Port);
72-
this.udpConnection.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
73-
this.udpConnection.JoinMulticastGroup(ipAddress, 50);
74+
udpSenderConnection = new UdpClient()
75+
{
76+
ExclusiveAddressUse = false
77+
};
78+
udpSenderConnection.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
79+
udpSenderConnection.Client.Bind(localEndPoint);
80+
udpSenderConnection.JoinMulticastGroup(ipAddressMulticast);
81+
udpSenderConnection.Client.MulticastLoopback = true;
82+
83+
this.udpReceiverConnection = new UdpClient()
84+
{
85+
ExclusiveAddressUse = false
86+
};
87+
udpReceiverConnection.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
88+
udpReceiverConnection.Client.Bind(localEndPoint);
89+
udpReceiverConnection.JoinMulticastGroup(ipAddressMulticast, 50);
7490
}
7591
catch
7692
{
@@ -88,7 +104,8 @@ public Boolean Disconnect()
88104
{
89105
if (!isConnected) return false;
90106

91-
udpConnection.Close();
107+
udpReceiverConnection.Close();
108+
udpSenderConnection.Close();
92109
StopReceiver();
93110

94111
isConnected = false;
@@ -101,7 +118,7 @@ public int SendMessage(CanPacket canPacket)
101118
if (!isConnected) return -1;
102119

103120
var data = canPacket.RawBytes;
104-
return udpConnection.Send(data, data.Length, ipEndPoint);
121+
return udpSenderConnection.Send(data, data.Length, ipEndPointMulticast);
105122
}
106123

107124
public Boolean IsConnected()
@@ -137,15 +154,15 @@ private void UdpReceiverLoop()
137154
try
138155
{
139156
var ipEndPoint = new IPEndPoint(IPAddress.Any, this.Port);
140-
byte[] data = udpConnection.Receive(ref ipEndPoint);
157+
byte[] data = udpReceiverConnection.Receive(ref ipEndPoint);
141158
IPAddress sourceAddress = ipEndPoint.Address;
142159
int port = ipEndPoint.Port;
143160

144161
if (CheckIfTritiumDatagram(data)) {
145162
SplitCanPackets(data, sourceAddress, port);
146163
}
147164
}
148-
catch {
165+
catch (Exception ex) {
149166
Disconnect();
150167
}
151168
}
@@ -155,7 +172,8 @@ private bool CheckIfTritiumDatagram(byte[] data) {
155172
string dataString = MyExtensions.ByteArrayToText(data);
156173

157174
// Some tritium Can Bridges uses Tritiub rather that Tritium
158-
return dataString.Contains("Tritiu");
175+
// The latest release seems to just use Tri
176+
return dataString.Contains("Tri");
159177
}
160178

161179
private void SplitCanPackets(byte[] data, IPAddress sourceIPAddress, int sourcePort) {

ArrowPoint-CANbus-Tools/Canbus/CanPacket.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ namespace ArrowPointCANBusTool.Canbus
1010
{
1111
public class CanPacket
1212
{
13-
private string SamplePacket { get; set; } = "005472697469756d006508a8c0007f5d0000040400080000000000000000";
13+
private string SamplePacket { get; set; } = "00547269fdd6000d006508a8c0007f5d0000040400080000000000000000";
1414

1515
public Boolean IsLittleEndian { get; set; } = true;
1616
public int PacketIndex { get; set; } = 0;
@@ -161,7 +161,8 @@ public uint CanId {
161161
public uint CanIdBase10 {
162162
get
163163
{
164-
return uint.Parse(CanIdAsHex.TrimStart('0','x'), System.Globalization.NumberStyles.HexNumber);
164+
string trimmedValue = MyExtensions.Trim0x(CanIdAsHex);
165+
return uint.Parse(trimmedValue, System.Globalization.NumberStyles.HexNumber);
165166
}
166167

167168
set

ArrowPoint-CANbus-Tools/Canbus/MyExtensions.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,13 @@ public static String AlignLeft(String value, int stringPadSize, Boolean commaSpa
2727
return textString.Substring(0, stringPadSize);
2828
}
2929

30+
public static String Trim0x(String value)
31+
{
32+
if (value.Trim().Substring(0, 2).Equals("0x"))
33+
return value.Trim().Substring(2);
34+
return value;
35+
}
36+
3037
public static byte[] StringToByteArray(string hex)
3138
{
3239
int NumberChars = hex.Length;

ArrowPoint-CANbus-Tools/Forms/NetworkMessageForm.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System;
1+
using ArrowPointCANBusTool.Canbus;
2+
using System;
23
using System.Collections.Generic;
34
using System.ComponentModel;
45
using System.Data;
@@ -21,7 +22,7 @@ public Configuration.Message Message
2122
{
2223
if (message == null) message = new Configuration.Message();
2324
message.name = MessageNameTextBox.Text;
24-
message.id = "0x" + CanIdTextBox.Text.TrimStart('0','x');
25+
message.id = "0x" + MyExtensions.Trim0x(CanIdTextBox.Text);
2526
return message;
2627
}
2728
}

ArrowPoint-CANbus-Tools/Forms/SendPacketForm.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public partial class SendPacketForm : Form
1919
private Timer timer;
2020
private Boolean looping;
2121

22-
private string samplePacket = "005472697469756d006508a8c0007f5d0000040400080000000000000000";
22+
private string samplePacket = "00547269fdd6000d006508a8c0007f5d0000040400080000000000000000";
2323

2424
public SendPacketForm()
2525
{
@@ -127,8 +127,8 @@ private void TbId_Leave(object sender, EventArgs e)
127127
MessageBox.Show("ID is not hex");
128128
}
129129

130-
this.canPacket.CanIdBase10 = uint.Parse(this.tbId.Text, System.Globalization.NumberStyles.HexNumber);
131-
UpdateInputFields();
130+
this.canPacket.CanIdBase10 = uint.Parse(MyExtensions.Trim0x(this.tbId.Text), System.Globalization.NumberStyles.HexNumber);
131+
UpdateInputFields();
132132
}
133133

134134
private void TbIdBase10_Leave(object sender, EventArgs e)
@@ -233,7 +233,7 @@ private void TimerTick(object sender, EventArgs e)
233233

234234
private Boolean IsHexString(String text)
235235
{
236-
return System.Text.RegularExpressions.Regex.IsMatch(text, @"\A\b[0-9a-fA-F]+\b\Z");
236+
return System.Text.RegularExpressions.Regex.IsMatch(MyExtensions.Trim0x(text), @"\A\b[0-9a-fA-F]+\b\Z");
237237
}
238238

239239
private bool UpdateByte(int index, string byteString)

ArrowPoint-CANbus-Tools/Services/ConfigService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ public Configuration.Message AddMessage(string messageName, string canId, Config
209209
Configuration.Message message = new Configuration.Message
210210
{
211211
name = messageName,
212-
id = "0x" + canId.TrimStart('0','x')
212+
id = "0x" + MyExtensions.Trim0x(canId)
213213
};
214214

215215
NodeRef nodeRef = new NodeRef

0 commit comments

Comments
 (0)