187 lines
4.9 KiB
C++
187 lines
4.9 KiB
C++
// *** ConsoleShell ***
|
|
|
|
// This example shows how to use CmdMessenger as a shell, and communicate with it using the Serial Console
|
|
// This example is different from all others:
|
|
// - there is no PC counterpart
|
|
// - it will only receive commands, instead of sending commands it will use Serial.Pring
|
|
//
|
|
// Below is an example of interacting with the sample:
|
|
//
|
|
// Available commands
|
|
// 0; - This command list
|
|
// 1,<led state>; - Set led. 0 = off, 1 = on
|
|
// 2,<led brightness>; - Set led brighness. 0 - 1000
|
|
// 3; - Show led state
|
|
//
|
|
// Command> 3;
|
|
//
|
|
// Led status: on
|
|
// Led brightness: 500
|
|
//
|
|
// Command> 2,1000;
|
|
//
|
|
// Led status: on
|
|
// Led brightness: 1000
|
|
//
|
|
// Command> 1,0;
|
|
//
|
|
// Led status: off
|
|
// Led brightness: 1000
|
|
|
|
|
|
#include <CmdMessenger.h> // CmdMessenger
|
|
|
|
// PWM timing variables
|
|
unsigned long intervalOn = 0;
|
|
unsigned long prevBlinkTime = 0;
|
|
const unsigned long PWMinterval = 1000;
|
|
|
|
// Blinking led variables
|
|
bool ledState = 1; // On/Off state of Led
|
|
int ledBrightness = prevBlinkTime /2 ; // 50 % Brightness
|
|
const int kBlinkLed = 13; // Pin of internal Led
|
|
|
|
// Attach a new CmdMessenger object to the default Serial port
|
|
CmdMessenger cmdMessenger = CmdMessenger(Serial);
|
|
|
|
// This is the list of recognized commands.
|
|
// In order to receive, attach a callback function to these events
|
|
enum
|
|
{
|
|
kCommandList , // Command to request list of available commands
|
|
kSetLed , // Command to request led to be set in specific state
|
|
kSetLedBrightness , // Command to request led to be set in to specific brightness
|
|
kStatus , // Command to request led status
|
|
};
|
|
|
|
// Callbacks define on which received commands we take action
|
|
void attachCommandCallbacks()
|
|
{
|
|
// Attach callback methods
|
|
cmdMessenger.attach(OnUnknownCommand);
|
|
cmdMessenger.attach(kCommandList, OnCommandList);
|
|
cmdMessenger.attach(kSetLed, OnSetLed);
|
|
cmdMessenger.attach(kSetLedBrightness, OnSetLedBrightness);
|
|
cmdMessenger.attach(kStatus, OnStatus);
|
|
}
|
|
|
|
// Called when a received command has no attached function
|
|
void OnUnknownCommand()
|
|
{
|
|
Serial.println("This command is unknown!");
|
|
ShowCommands();
|
|
}
|
|
|
|
// Callback function that shows a list of commands
|
|
void OnCommandList()
|
|
{
|
|
ShowCommands();
|
|
}
|
|
|
|
// Callback function that sets led on or off
|
|
void OnSetLed()
|
|
{
|
|
// Read led state argument, expects 0 or 1 and interprets as false or true
|
|
ledState = cmdMessenger.readBoolArg();
|
|
ShowLedState();
|
|
}
|
|
|
|
// Callback function that sets led on or off
|
|
void OnSetLedBrightness()
|
|
{
|
|
// Read led brightness argument, expects value between 0 to 255
|
|
ledBrightness = cmdMessenger.readInt16Arg();
|
|
// Set led brightness
|
|
SetBrightness();
|
|
// Show Led state
|
|
ShowLedState();
|
|
}
|
|
|
|
// Callback function that shows led status
|
|
void OnStatus()
|
|
{
|
|
// Send back status that describes the led state
|
|
ShowLedState();
|
|
}
|
|
|
|
// Show available commands
|
|
void ShowCommands()
|
|
{
|
|
Serial.println("Available commands");
|
|
Serial.println(" 0; - This command list");
|
|
Serial.println(" 1,<led state>; - Set led. 0 = off, 1 = on");
|
|
Serial.print (" 2,<led brightness>; - Set led brighness. 0 - ");
|
|
Serial.println(PWMinterval);
|
|
Serial.println(" 3; - Show led state");
|
|
}
|
|
|
|
// Show led state
|
|
void ShowLedState()
|
|
{
|
|
Serial.print("Led status: ");
|
|
Serial.println(ledState?"on":"off");
|
|
Serial.print("Led brightness: ");
|
|
Serial.println(ledBrightness);
|
|
}
|
|
|
|
// Set led state
|
|
void SetLedState()
|
|
{
|
|
if (ledState) {
|
|
// If led is turned on, go to correct brightness using analog write
|
|
analogWrite(kBlinkLed, ledBrightness);
|
|
} else {
|
|
// If led is turned off, use digital write to disable PWM
|
|
digitalWrite(kBlinkLed, LOW);
|
|
}
|
|
}
|
|
|
|
// Set led brightness
|
|
void SetBrightness()
|
|
{
|
|
// clamp value intervalOn on 0 and PWMinterval
|
|
intervalOn = 1;// max(min(ledBrightness,PWMinterval),0);
|
|
}
|
|
|
|
// Pulse Width Modulation to vary Led intensity
|
|
// turn on until intervalOn, then turn off until PWMinterval
|
|
bool blinkLed() {
|
|
if ( micros() - prevBlinkTime > PWMinterval ) {
|
|
// Turn led on at end of interval (if led state is on)
|
|
prevBlinkTime = micros();
|
|
digitalWrite(kBlinkLed, ledState?HIGH:LOW);
|
|
} else if ( micros() - prevBlinkTime > intervalOn ) {
|
|
// Turn led off at halfway interval
|
|
digitalWrite(kBlinkLed, LOW);
|
|
|
|
}
|
|
return true;
|
|
}
|
|
|
|
// Setup function
|
|
void setup()
|
|
{
|
|
// Listen on serial connection for messages from the PC
|
|
Serial.begin(115200);
|
|
|
|
// Adds newline to every command
|
|
cmdMessenger.printLfCr();
|
|
|
|
// Attach my application's user-defined callback methods
|
|
attachCommandCallbacks();
|
|
|
|
// set pin for blink LED
|
|
pinMode(kBlinkLed, OUTPUT);
|
|
|
|
// Show command list
|
|
ShowCommands();
|
|
}
|
|
|
|
// Loop function
|
|
void loop()
|
|
{
|
|
// Process incoming serial data, and perform callbacks
|
|
cmdMessenger.feedinSerialData();
|
|
blinkLed();
|
|
}
|