annotate projects/analogDigitalDemo/render.cpp @ 269:ac8eb07afcf5

Oxygen text added to each render.cpp file for the default projects. Text includes project explanation from Wiki, edited in places. Empty project added as a default project. Doxyfile updated. Each of the project locations added to INPUT configuration option. Consider just watching the whole project file so all new projects are automatically pulled through.
author Robert Jack <robert.h.jack@gmail.com>
date Tue, 17 May 2016 15:40:16 +0100
parents 567bd8f76714
children
rev   line source
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 /*
giuliomoro@19 11 *
giuliomoro@19 12 * Andrew McPherson and Victor Zappi
giuliomoro@19 13 * Queen Mary, University of London
giuliomoro@19 14 */
giuliomoro@19 15
robert@269 16 /**
robert@269 17 \example 3_analogDigitalDemo
robert@269 18
robert@269 19 Analog digital workout
robert@269 20 ----------------------
robert@269 21
robert@269 22 This sketch showcases many different ways to write and read digital pins,
robert@269 23 including generating clocks and creating binary counters.
robert@269 24
robert@269 25 The code as it is will not work properly, as the direction of the pins is not
robert@269 26 set. As an exercise, you will need to set the pin mode before writing or reading
robert@269 27 the digital pins.
robert@269 28
robert@269 29 This is for advanced users only.
robert@269 30
robert@269 31 */
robert@269 32
andrewm@56 33 #include <BeagleRT.h>
andrewm@56 34 #include <Utilities.h>
giuliomoro@19 35 #include <cmath>
giuliomoro@19 36 #include <rtdk.h>
giuliomoro@19 37
andrewm@56 38 // setup() is called once before the audio rendering starts.
giuliomoro@19 39 // Use it to perform any initialisation and allocation which is dependent
giuliomoro@19 40 // on the period size or sample rate.
giuliomoro@19 41 //
giuliomoro@19 42 // userData holds an opaque pointer to a data structure that was passed
giuliomoro@19 43 // in from the call to initAudio().
giuliomoro@19 44 //
giuliomoro@19 45 // Return true on success; returning false halts the program.
andrewm@52 46
andrewm@56 47 bool setup(BeagleRTContext *context, void *userData)
giuliomoro@19 48 {
giuliomoro@19 49 return true;
giuliomoro@19 50 }
giuliomoro@19 51
giuliomoro@19 52 // render() is called regularly at the highest priority by the audio engine.
giuliomoro@19 53 // Input and output are given from the audio hardware and the other
giuliomoro@20 54 // ADCs and DACs (if available). If only audio is available, numAnalogFrames
giuliomoro@19 55 // will be 0.
giuliomoro@19 56
andrewm@52 57 void render(BeagleRTContext *context, void *userData)
giuliomoro@19 58 /*
giuliomoro@23 59 we assume that gNumAnalogChannels=8, numAnalogFrames==8 and numDigitalFrames==numAudioFrames
giuliomoro@19 60 * */
giuliomoro@19 61 {
giuliomoro@87 62 /*
giuliomoro@87 63 * TODO: as an exercise, you will need to set the pin mode before writing or reading the digital pins.
giuliomoro@87 64 */
andrewm@52 65 if((context->audioSampleCount&31)==0){ //every 32 frames...
giuliomoro@23 66 //ANALOG channels
andrewm@52 67 analogWriteFrame(context, 0, 0, analogReadFrame(context, 0,0));
andrewm@52 68 // read the input0 at frame0 and write it to output0 frame0. Using analogWrite will fill the rest of the buffer with the same value
giuliomoro@23 69 // The value at the last frame will persist through the successive buffers until is set again.
giuliomoro@23 70 // This effectively is a pass-through with downsampling by 32 times
andrewm@52 71 analogWriteFrame(context, 0, 3, 1.0); // write 1.0 to channel3 from frame0 to the end of the buffer
andrewm@52 72 analogWriteFrame(context, 4, 3, 0.1); // write 0.1 to channel3 from frame4 to the end of the buffer
andrewm@52 73 analogWriteFrameOnce(context, 6, 3, 0.2); //write 0.2 to channel3 only on frame 6
giuliomoro@23 74 //this buffer for channel 3 will look like this: 1 1 1 1 0.1 0.1 0.2 0.1
giuliomoro@23 75 //the next buffers for channel 3 will be filled up with 0.1 ....
giuliomoro@23 76 //DIGITAL channels
andrewm@52 77 digitalWriteFrame(context, 0, P8_07, GPIO_HIGH); //sets all the frames to HIGH for channel 0
andrewm@52 78 digitalWriteFrameOnce(context, 4, P8_07, GPIO_LOW); //only frame 4 will be LOW for channel 0
giuliomoro@23 79 // in this buffer the frames of channel 0 will look like this: 1 1 1 1 0 1 1 1 ...... 1
giuliomoro@23 80 // in the next buffer each frame of channel 0 will be initialized to 1 (the last value of this buffer)
andrewm@52 81 digitalWriteFrame(context, 0, P8_08, GPIO_HIGH);
andrewm@52 82 digitalWriteFrame(context, 2, P8_08, GPIO_LOW);
andrewm@52 83 digitalWriteFrame(context, 4, P8_08, GPIO_HIGH);
andrewm@52 84 digitalWriteFrame(context, 5, P8_08, GPIO_LOW);
andrewm@52 85 pinModeFrame(context, 0, P9_16, GPIO_INPUT); // set channel 10 to input
giuliomoro@23 86 // in this buffer the frames of channel 1 will look like this: 1 1 0 0 1 0 0 0 .... 0
giuliomoro@23 87 // in the next buffer each frame of channel 1 will be initialized to 0 (the last value of this buffer)
giuliomoro@19 88 }
andrewm@52 89 for(unsigned int n=0; n<context->audioFrames; n++){
andrewm@52 90 for(unsigned int c=0; c<context->audioChannels; c++){
andrewm@52 91 context->audioOut[n*context->audioChannels + c]=context->audioIn[n*context->audioChannels + c];
giuliomoro@23 92 }
giuliomoro@33 93 //use digital channels 2-8 to create a 7 bit binary counter
andrewm@52 94 context->digital[n]=context->digital[n] & (~0b111111100); // set to zero (GPIO_OUTPUT) the bits in the lower word
andrewm@52 95 context->digital[n]=context->digital[n] & ((~0b111111100<<16) | 0xffff ); //initialize to zero the bits in the higher word (output value)
andrewm@52 96 context->digital[n]=context->digital[n] | ( ((context->audioSampleCount&0b1111111)<<(16+2)) ) ; // set the bits in the higher word to the desired output value, keeping the lower word unchanged
andrewm@52 97 digitalWriteFrame(context, n, P8_29, digitalReadFrame(context, n, P8_30)); // echo the input from from channel 15 to channel 14
andrewm@52 98 digitalWriteFrame(context, n, P8_28, digitalReadFrame(context, n, P9_16)); // echo the input from from channel 10 to channel 13
andrewm@52 99 pinModeFrame(context, 0, P8_30, 0); //set channel 15 to input
giuliomoro@19 100 }
giuliomoro@23 101
andrewm@52 102 for(unsigned int n=0; n<context->analogFrames; n++){
andrewm@52 103 analogWriteFrame(context, n, 1, (context->audioSampleCount&8191)/8192.0); // writes a single frame. channel 1 is a ramp that follows gCountFrames
andrewm@52 104 analogWriteFrame(context, n, 2, analogReadFrame(context, n, 2)); // writes a single frame. channel2 is just a passthrough
giuliomoro@23 105 // rt_printf("Analog out frame %d :",n);
giuliomoro@23 106 // for(int c=0; c<gNumAnalogChannels; c++)
giuliomoro@23 107 // rt_printf("%.1f ",analogOut[n*gNumAnalogChannels + c]);
giuliomoro@23 108 // rt_printf("\n");
giuliomoro@19 109 }
giuliomoro@23 110 return;
giuliomoro@23 111
giuliomoro@19 112 }
giuliomoro@19 113
andrewm@56 114 // cleanup() is called once at the end, after the audio has stopped.
andrewm@56 115 // Release any resources that were allocated in setup().
andrewm@56 116
andrewm@56 117 void cleanup(BeagleRTContext *context, void *userData)
giuliomoro@19 118 {
andrewm@56 119 // Nothing to do here
giuliomoro@19 120 }