You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
118 lines
4.5 KiB
118 lines
4.5 KiB
using System;
|
|
using System.Threading;
|
|
using System.Device.Gpio;
|
|
using System.Device.Gpio.Drivers;
|
|
using System.Net;
|
|
using System.Net.Sockets;
|
|
using System.Text;
|
|
|
|
namespace BAT_UdpLedTestApp {
|
|
|
|
internal class Program {
|
|
public static GpioController Ctrl { get; set; }
|
|
|
|
static void Main( string[] args ) {
|
|
Console.WriteLine( "Application started!" );
|
|
|
|
// Set up GPIO
|
|
|
|
int gpioBank = 0;
|
|
Console.WriteLine( "in Joystick() - create LibGpiodDriver" );
|
|
LibGpiodDriver libGpiodDriver = new LibGpiodDriver( gpioBank );
|
|
|
|
Console.WriteLine( "in Joystick() - create GpioController" );
|
|
GpioController ctrl = new GpioController( PinNumberingScheme.Logical, libGpiodDriver );
|
|
Ctrl = ctrl; // set in public property so joystick and leds can access it
|
|
|
|
Thread t = new Thread( Run );
|
|
// Background thread, ends when Main() ends
|
|
t.IsBackground = false;
|
|
t.Start();
|
|
// Program ends, but Run-Thread keeps working
|
|
}
|
|
protected static void Run() {
|
|
Joystick joystick = Joystick.GetInstance();
|
|
Leds leds = Leds.GetInstance();
|
|
JoystickButtons oldState = JoystickButtons.None;
|
|
JoystickButtons newState;
|
|
|
|
IPEndPoint ipEndpoint = new IPEndPoint(IPAddress.Any, 10001);
|
|
UdpClient udpClient = new UdpClient(ipEndpoint);
|
|
udpClient.Client.ReceiveTimeout = 100; // set timeout to 100ms
|
|
byte[] data = new byte[1024];
|
|
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
|
|
|
|
Console.WriteLine("Waiting for clients...");
|
|
while( true ) {
|
|
// reset array
|
|
data = Array.Empty<byte>();
|
|
// try receive data
|
|
try
|
|
{
|
|
data = udpClient.Receive(ref sender);
|
|
}
|
|
catch (SocketException sockEx)
|
|
{
|
|
// timeout = normal use case
|
|
if (sockEx.SocketErrorCode != SocketError.TimedOut)
|
|
{
|
|
throw;
|
|
}
|
|
}
|
|
|
|
// decode message, if any received => Handle it
|
|
string receivedMessage = Encoding.ASCII.GetString(data, 0, data.Length);
|
|
if(receivedMessage.Length > 0)
|
|
{
|
|
Console.WriteLine("Message received from {0}:", sender.ToString());
|
|
Console.WriteLine(receivedMessage);
|
|
|
|
if(receivedMessage.StartsWith("led on"))
|
|
{
|
|
leds.Set( LedColor.Green, true );
|
|
ReplyMessage(udpClient, sender, "Led turned on");
|
|
}
|
|
else if(receivedMessage.StartsWith("led off"))
|
|
{
|
|
leds.Set( LedColor.Green, false );
|
|
ReplyMessage(udpClient, sender, "Led turned off");
|
|
}
|
|
else if(receivedMessage.StartsWith("joystick state"))
|
|
{
|
|
JoystickButtons state = joystick.State;
|
|
ReplyMessage(udpClient, sender, $"Current Joystick state: {state}");
|
|
}
|
|
else
|
|
{
|
|
ReplyMessage(udpClient, sender, "Unknown command");
|
|
}
|
|
}
|
|
|
|
// check if the joystick state changed, send to last sender
|
|
newState = joystick.State;
|
|
if( oldState != newState ) {
|
|
Console.WriteLine($"New Joystick state detected: {newState}");
|
|
ReplyMessage(udpClient, sender, $"New Joystick state: {newState}");
|
|
oldState = newState;
|
|
}
|
|
Thread.Sleep( 50 );
|
|
}
|
|
}
|
|
|
|
public static void ReplyMessage(UdpClient client, IPEndPoint sender, string replyMessage)
|
|
{
|
|
// would lead to exception
|
|
if(sender.Address == IPAddress.Any) { return; }
|
|
|
|
// terminate message with LF
|
|
string terminatedMessage = $"{replyMessage}\n";
|
|
|
|
// send data
|
|
byte[] data = new byte[1024];
|
|
data = Encoding.ASCII.GetBytes(terminatedMessage);
|
|
client.Send(data, data.Length, sender);
|
|
Console.WriteLine($"Sent message: {replyMessage}");
|
|
}
|
|
} // end class Program
|
|
|
|
} // end namespace
|
|
|