robert@269: /* robert@269: ____ _____ _ _ robert@269: | __ )| ____| | / \ robert@269: | _ \| _| | | / _ \ robert@269: | |_) | |___| |___ / ___ \ robert@269: |____/|_____|_____/_/ \_\.io robert@269: robert@269: */ robert@269: robert@269: /* robert@269: * robert@269: * Andrew McPherson and Victor Zappi robert@269: * Queen Mary, University of London robert@269: */ robert@269: robert@269: /** robert@269: \example 2_digital_blink robert@269: robert@269: Blinking an LED robert@269: --------------- robert@269: robert@269: This sketch shows the simplest case of digital out. Connect an LED in series with robert@269: a 470ohm resistor between P8_07 and ground. The led is blinked on and off by robert@269: setting the digital pin `HIGH` and `LOW` every interval seconds (set it in the robert@269: `render()` function). robert@269: robert@269: Firstly the pin mode must be set to output mode: robert@269: `pinModeFrame(context, 0, P8_07, OUTPUT);` in the `setup()` function. The output robert@269: of the digital pins is set by the following code: robert@269: `digitalWriteFrame(context, n, P8_07, status);` where status can be equal to robert@269: either `HIGH` or `LOW`. When set `HIGH` the pin will give 3.3V, when set to robert@269: `LOW` 0V. robert@269: robert@269: To keep track of elapsed time we have a sample counter count. When count reaches robert@269: a certain limit it switches state to either `HIGH` or `LOW` depending on its current robert@269: value. In this case the limit is `context->digitalSampleRate*interval` which robert@269: allows us to write the desired interval in seconds, stored in `interval`. robert@269: */ robert@269: robert@269: robert@269: robert@269: robert@269: giuliomoro@74: #include giuliomoro@74: #include giuliomoro@74: #include giuliomoro@74: #include giuliomoro@74: giuliomoro@74: // setup() is called once before the audio rendering starts. giuliomoro@74: // Use it to perform any initialisation and allocation which is dependent giuliomoro@74: // on the period size or sample rate. giuliomoro@74: // giuliomoro@74: // userData holds an opaque pointer to a data structure that was passed giuliomoro@74: // in from the call to initAudio(). giuliomoro@74: // giuliomoro@74: // Return true on success; returning false halts the program. giuliomoro@74: giuliomoro@74: bool setup(BeagleRTContext *context, void *userData) giuliomoro@74: { andrewm@81: pinModeFrame(context, 0, P8_07, OUTPUT); giuliomoro@74: return true; giuliomoro@74: } giuliomoro@74: giuliomoro@74: // render() is called regularly at the highest priority by the audio engine. giuliomoro@74: // Input and output are given from the audio hardware and the other giuliomoro@74: // ADCs and DACs (if available). If only audio is available, numAnalogFrames giuliomoro@74: // will be 0. giuliomoro@74: giuliomoro@75: /* basic_blink giuliomoro@75: * Connect an LED in series with a 470ohm resistor between P8_07 and ground. giuliomoro@75: * The LED will blink every @interval seconds. giuliomoro@75: */ giuliomoro@75: giuliomoro@74: void render(BeagleRTContext *context, void *userData) giuliomoro@74: { giuliomoro@74: static int count=0; //counts elapsed samples giuliomoro@74: float interval=0.5; //how often to toggle the LED (in seconds) giuliomoro@74: static int status=GPIO_LOW; giuliomoro@74: for(unsigned int n=0; ndigitalFrames; n++){ giuliomoro@74: if(count==context->digitalSampleRate*interval){ //if enough samples have elapsed giuliomoro@74: count=0; //reset the counter giuliomoro@74: // status=digitalReadFrame(context, 0, P8_07); andrewm@81: if(status==GPIO_LOW) { //toggle the status andrewm@81: digitalWriteFrame(context, n, P8_07, status); //write the status to the LED andrewm@81: status=GPIO_HIGH; andrewm@81: } andrewm@81: else { andrewm@81: digitalWriteFrame(context, n, P8_07, status); //write the status to the LED andrewm@81: status=GPIO_LOW; andrewm@81: } giuliomoro@74: } giuliomoro@74: count++; giuliomoro@74: } giuliomoro@74: } giuliomoro@74: giuliomoro@74: // cleanup() is called once at the end, after the audio has stopped. giuliomoro@74: // Release any resources that were allocated in setup(). giuliomoro@74: giuliomoro@74: void cleanup(BeagleRTContext *context, void *userData) giuliomoro@74: { giuliomoro@74: // Nothing to do here giuliomoro@74: }