robert@269
|
1 /*
|
robert@269
|
2 ____ _____ _ _
|
robert@269
|
3 | __ )| ____| | / \
|
robert@269
|
4 | _ \| _| | | / _ \
|
robert@269
|
5 | |_) | |___| |___ / ___ \
|
robert@269
|
6 |____/|_____|_____/_/ \_\.io
|
robert@269
|
7
|
robert@269
|
8 */
|
robert@269
|
9
|
robert@269
|
10 /*
|
robert@269
|
11 *
|
robert@269
|
12 * Andrew McPherson and Victor Zappi
|
robert@269
|
13 * Queen Mary, University of London
|
robert@269
|
14 */
|
robert@269
|
15
|
robert@269
|
16 /**
|
robert@269
|
17 \example 2_digital_blink
|
robert@269
|
18
|
robert@269
|
19 Blinking an LED
|
robert@269
|
20 ---------------
|
robert@269
|
21
|
robert@269
|
22 This sketch shows the simplest case of digital out. Connect an LED in series with
|
robert@269
|
23 a 470ohm resistor between P8_07 and ground. The led is blinked on and off by
|
robert@269
|
24 setting the digital pin `HIGH` and `LOW` every interval seconds (set it in the
|
robert@269
|
25 `render()` function).
|
robert@269
|
26
|
robert@269
|
27 Firstly the pin mode must be set to output mode:
|
robert@269
|
28 `pinModeFrame(context, 0, P8_07, OUTPUT);` in the `setup()` function. The output
|
robert@269
|
29 of the digital pins is set by the following code:
|
robert@269
|
30 `digitalWriteFrame(context, n, P8_07, status);` where status can be equal to
|
robert@269
|
31 either `HIGH` or `LOW`. When set `HIGH` the pin will give 3.3V, when set to
|
robert@269
|
32 `LOW` 0V.
|
robert@269
|
33
|
robert@269
|
34 To keep track of elapsed time we have a sample counter count. When count reaches
|
robert@269
|
35 a certain limit it switches state to either `HIGH` or `LOW` depending on its current
|
robert@269
|
36 value. In this case the limit is `context->digitalSampleRate*interval` which
|
robert@269
|
37 allows us to write the desired interval in seconds, stored in `interval`.
|
robert@269
|
38 */
|
robert@269
|
39
|
robert@269
|
40
|
robert@269
|
41
|
robert@269
|
42
|
robert@269
|
43
|
giuliomoro@74
|
44 #include <BeagleRT.h>
|
giuliomoro@74
|
45 #include <Utilities.h>
|
giuliomoro@74
|
46 #include <cmath>
|
giuliomoro@74
|
47 #include <rtdk.h>
|
giuliomoro@74
|
48
|
giuliomoro@74
|
49 // setup() is called once before the audio rendering starts.
|
giuliomoro@74
|
50 // Use it to perform any initialisation and allocation which is dependent
|
giuliomoro@74
|
51 // on the period size or sample rate.
|
giuliomoro@74
|
52 //
|
giuliomoro@74
|
53 // userData holds an opaque pointer to a data structure that was passed
|
giuliomoro@74
|
54 // in from the call to initAudio().
|
giuliomoro@74
|
55 //
|
giuliomoro@74
|
56 // Return true on success; returning false halts the program.
|
giuliomoro@74
|
57
|
giuliomoro@74
|
58 bool setup(BeagleRTContext *context, void *userData)
|
giuliomoro@74
|
59 {
|
andrewm@81
|
60 pinModeFrame(context, 0, P8_07, OUTPUT);
|
giuliomoro@74
|
61 return true;
|
giuliomoro@74
|
62 }
|
giuliomoro@74
|
63
|
giuliomoro@74
|
64 // render() is called regularly at the highest priority by the audio engine.
|
giuliomoro@74
|
65 // Input and output are given from the audio hardware and the other
|
giuliomoro@74
|
66 // ADCs and DACs (if available). If only audio is available, numAnalogFrames
|
giuliomoro@74
|
67 // will be 0.
|
giuliomoro@74
|
68
|
giuliomoro@75
|
69 /* basic_blink
|
giuliomoro@75
|
70 * Connect an LED in series with a 470ohm resistor between P8_07 and ground.
|
giuliomoro@75
|
71 * The LED will blink every @interval seconds.
|
giuliomoro@75
|
72 */
|
giuliomoro@75
|
73
|
giuliomoro@74
|
74 void render(BeagleRTContext *context, void *userData)
|
giuliomoro@74
|
75 {
|
giuliomoro@74
|
76 static int count=0; //counts elapsed samples
|
giuliomoro@74
|
77 float interval=0.5; //how often to toggle the LED (in seconds)
|
giuliomoro@74
|
78 static int status=GPIO_LOW;
|
giuliomoro@74
|
79 for(unsigned int n=0; n<context->digitalFrames; n++){
|
giuliomoro@74
|
80 if(count==context->digitalSampleRate*interval){ //if enough samples have elapsed
|
giuliomoro@74
|
81 count=0; //reset the counter
|
giuliomoro@74
|
82 // status=digitalReadFrame(context, 0, P8_07);
|
andrewm@81
|
83 if(status==GPIO_LOW) { //toggle the status
|
andrewm@81
|
84 digitalWriteFrame(context, n, P8_07, status); //write the status to the LED
|
andrewm@81
|
85 status=GPIO_HIGH;
|
andrewm@81
|
86 }
|
andrewm@81
|
87 else {
|
andrewm@81
|
88 digitalWriteFrame(context, n, P8_07, status); //write the status to the LED
|
andrewm@81
|
89 status=GPIO_LOW;
|
andrewm@81
|
90 }
|
giuliomoro@74
|
91 }
|
giuliomoro@74
|
92 count++;
|
giuliomoro@74
|
93 }
|
giuliomoro@74
|
94 }
|
giuliomoro@74
|
95
|
giuliomoro@74
|
96 // cleanup() is called once at the end, after the audio has stopped.
|
giuliomoro@74
|
97 // Release any resources that were allocated in setup().
|
giuliomoro@74
|
98
|
giuliomoro@74
|
99 void cleanup(BeagleRTContext *context, void *userData)
|
giuliomoro@74
|
100 {
|
giuliomoro@74
|
101 // Nothing to do here
|
giuliomoro@74
|
102 }
|