Task 1: Modifing Code to use Functions
Consider the following code
DigitalOut led(LED1);
int main() {
//Flash LED 5 times
for (int x=0; x<5; x++){
led != led;
wait(0.5)
}
//Flash LED 10 times
for (int x=0; x<5; x++){
led != led;
wait(0.5)
}
First lets break this into a function. This would let us reuse the code in different places in the program.
The questions we need to ask:
- What chunks of code are reused
- What variables are in the reused code?
- What parameters would we want to pass to the function?
The Reused code is the part in the loop
for (int x=0; x<5; x++){
led != led;
wait(0.5)
}
In this example, the number of times we blink the LED is a good candidate for a parameter
Function Definitions
Take for form Return Type Funtion Name (parameters)
- Return Type we dont need to return anything, so void is good
- Function Name Something sensible that descibes the functionaly
- Parameters Number of times to repeat (an integer)
void flash(int repeat){
// Function Body goes here
}
Therefore our function code ends up as
void flash(int repeat){
for (int x=0; x< repeat; x++){
led != led;
wait(0.5);
}
Calling the Function
We can now call the function by using its name and supplying any parameters.
int main() {
//Flash LED 5 times
flash(5);
//Flash LED 10 times
flash(10);
}
Your Task
- Extend the function to take the delay time as a parameter.
Task 2: Getting Classy
To turn the function into a class we need to consider the attributes and functions.
I this case we have a couple of potential pataeters
- pin electronic 'pin' the LED is connected to
- delay how long to wait betwen toggling modes.
There are also candidates for functions
- flash Actually do the blinking.
Implementing the class
Standard CPP class definition, note the use of initialisation list for the pin as it is an object.
#include "mbed.h"
class Flasher{
private:
float delay;
DigitalOut pin;
public:
//Constructor
Flasher(PinName thePin, float delayTime) : pin(thePin) {
delay = delayTime;
}
void flash(int times){
for (int x = 0; x< times; x++){
pin= !pin;
wait(delay);
}
}
};
int main() {
//Setup
Flasher ledOne = Flasher(LED1, 0.5);
Flasher ledTwo = Flasher(LED2, 0.25);
//Loop
while(1){
ledOne.flash(5);
ledTwo.flash(10);
}
}
Task
- Modify the Flasher class to take account of Multiple Lights.
- Add functions for the State to the Flasher Class
- If we have time, implement the button press to change state.
NOTE: Each set of lights will work independently. We need some form of multi tasking for both sets of lights to work together. We will be looking at Concurrency over the next couple of days.