machines/firmware/legacy/arduino-libraries/Arduino-CmdMessenger/extras/CSharp/ArduinoController/ArduinoController.cs

157 lines
5.8 KiB
C#

// *** ArduinoController ***
// This example expands the SendandReceiveArguments example. The PC will now sends commands to the Arduino when the trackbar
// is pulled. Every TrackBarChanged events will queue a message to the Arduino to set the blink speed of the
// internal / pin 13 LED
//
// This example shows how to :
// - use in combination with WinForms
// - use in combination with ZedGraph
// - send queued commands
// - Use the CollapseCommandStrategy
using System;
using CommandMessenger;
using CommandMessenger.Queue;
using CommandMessenger.Transport.Serial;
namespace ArduinoController
{
enum Command
{
Acknowledge, // Command to acknowledge a received command
Error, // Command to message that an error has occurred
SetLed, // Command to turn led ON or OFF
SetLedFrequency, // Command to set led blink frequency
};
public class ArduinoController
{
// This class (kind of) contains presentation logic, and domain model.
// ChartForm.cs contains the view components
private SerialTransport _serialTransport;
private CmdMessenger _cmdMessenger;
private ControllerForm _controllerForm;
// ------------------ MAIN ----------------------
// Setup function
public void Setup(ControllerForm controllerForm)
{
// storing the controller form for later reference
_controllerForm = controllerForm;
// Create Serial Port object
// Note that for some boards (e.g. Sparkfun Pro Micro) DtrEnable may need to be true.
_serialTransport = new SerialTransport
{
CurrentSerialSettings = { PortName = "COM6", BaudRate = 115200, DtrEnable = false } // object initializer
};
// Initialize the command messenger with the Serial Port transport layer
// Set if it is communicating with a 16- or 32-bit Arduino board
_cmdMessenger = new CmdMessenger(_serialTransport, BoardType.Bit16);
// Tell CmdMessenger to "Invoke" commands on the thread running the WinForms UI
_cmdMessenger.ControlToInvokeOn = _controllerForm;
// Attach the callbacks to the Command Messenger
AttachCommandCallBacks();
// Attach to NewLinesReceived for logging purposes
_cmdMessenger.NewLineReceived += NewLineReceived;
// Attach to NewLineSent for logging purposes
_cmdMessenger.NewLineSent += NewLineSent;
// Start listening
_cmdMessenger.Connect();
_controllerForm.SetLedState(true);
_controllerForm.SetFrequency(2);
}
// Exit function
public void Exit()
{
// Stop listening
_cmdMessenger.Disconnect();
// Dispose Command Messenger
_cmdMessenger.Dispose();
// Dispose Serial Port object
_serialTransport.Dispose();
}
/// Attach command call backs.
private void AttachCommandCallBacks()
{
_cmdMessenger.Attach(OnUnknownCommand);
_cmdMessenger.Attach((int)Command.Acknowledge, OnAcknowledge);
_cmdMessenger.Attach((int)Command.Error, OnError);
}
// ------------------ CALLBACKS ---------------------
// Called when a received command has no attached function.
// In a WinForm application, console output gets routed to the output panel of your IDE
void OnUnknownCommand(ReceivedCommand arguments)
{
Console.WriteLine(@"Command without attached callback received");
}
// Callback function that prints that the Arduino has acknowledged
void OnAcknowledge(ReceivedCommand arguments)
{
Console.WriteLine(@" Arduino is ready");
}
// Callback function that prints that the Arduino has experienced an error
void OnError(ReceivedCommand arguments)
{
Console.WriteLine(@"Arduino has experienced an error");
}
// Log received line to console
private void NewLineReceived(object sender, CommandEventArgs e)
{
Console.WriteLine(@"Received > " + e.Command.CommandString());
}
// Log sent line to console
private void NewLineSent(object sender, CommandEventArgs e)
{
Console.WriteLine(@"Sent > " + e.Command.CommandString());
}
// Sent command to change led blinking frequency
public void SetLedFrequency(double ledFrequency)
{
// Create command to start sending data
var command = new SendCommand((int)Command.SetLedFrequency,ledFrequency);
// Put the command on the queue and wrap it in a collapse command strategy
// This strategy will avoid duplicates of this certain command on the queue: if a SetLedFrequency command is
// already on the queue when a new one is added, it will be replaced at its current queue-position.
// Otherwise the command will be added to the back of the queue.
//
// This will make sure that when the slider raises a lot of events that each send a new blink frequency, the
// embedded controller will not start lagging.
_cmdMessenger.QueueCommand(new CollapseCommandStrategy(command));
}
// Sent command to change led on/of state
public void SetLedState(bool ledState)
{
// Create command to start sending data
var command = new SendCommand((int)Command.SetLed, ledState);
// Send command
_cmdMessenger.SendCommand(new SendCommand((int)Command.SetLed, ledState));
}
}
}