- // *** 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 = 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);
- }
- }
-
- // 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();
- }