Mercurial > hg > beaglert
diff core/Utilities.cpp @ 67:472e892c6e41
Merge newapi into default
author | Andrew McPherson <a.mcpherson@qmul.ac.uk> |
---|---|
date | Fri, 17 Jul 2015 15:28:18 +0100 |
parents | a6d223473ea2 |
children | d837fb676977 |
line wrap: on
line diff
--- a/core/Utilities.cpp Sun Feb 08 00:20:01 2015 +0000 +++ b/core/Utilities.cpp Fri Jul 17 15:28:18 2015 +0100 @@ -7,6 +7,84 @@ #include "../include/Utilities.h" +// analogReadFrame() +// +// Returns the value of the given analog input at the given frame number. +float analogReadFrame(BeagleRTContext *context, int frame, int channel) { + return context->analogIn[frame * context->analogChannels + channel]; +} + +// analogWriteFrame() +// +// Sets a given channel to a value for the current frame and, if persistent outputs are +// enabled, for all subsequent frames +void analogWriteFrame(BeagleRTContext *context, int frame, int channel, float value) { + if(context->flags & BEAGLERT_FLAG_ANALOG_OUTPUTS_PERSIST) { + for(unsigned int f = frame; f < context->analogFrames; f++) + context->analogOut[frame * context->analogChannels + channel] = value; + } + else + context->analogOut[frame * context->analogChannels + channel] = value; +} + +// analogWriteFrameOnce() +// +// Sets a given channel to a value for only the current frame +void analogWriteFrameOnce(BeagleRTContext *context, int frame, int channel, float value) { + context->analogOut[frame * context->analogChannels + channel] = value; +} + +// digitalReadFrame() +// +// Returns the value of a given digital input at the given frame number +int digitalReadFrame(BeagleRTContext *context, int frame, int channel) { + return getBit(context->digital[frame], channel + 16); +} + +// digitalWriteFrame() +// +// Sets a given digital output channel to a value for the current frame and all subsequent frames +void digitalWriteFrame(BeagleRTContext *context, int frame, int channel, int value) { + for(unsigned int f = frame; f < context->digitalFrames; f++) { + if(value) + context->digital[f] |= 1 << (channel + 16); + else + context->digital[f] &= ~(1 << (channel + 16)); + } +} + +// digitalWriteFrameOnce() +// +// Sets a given digital output channel to a value for the current frame only +void digitalWriteFrameOnce(BeagleRTContext *context, int frame, int channel, int value) { + if(value) + context->digital[frame] |= 1 << (channel + 16); + else + context->digital[frame] &= ~(1 << (channel + 16)); +} + +// pinModeFrame() +// +// Sets the direction of a digital pin for the current frame and all subsequent frames +void pinModeFrame(BeagleRTContext *context, int frame, int channel, int mode) { + for(unsigned int f = frame; f < context->digitalFrames; f++) { + if(mode) + context->digital[f] |= (1 << channel); + else + context->digital[f] &= ~(1 << channel); + } +} + +// pinModeFrameOnce() +// +// Sets the direction of a digital pin for the current frame only +void pinModeFrameOnce(BeagleRTContext *context, int frame, int channel, int mode) { + if(mode) + context->digital[frame] |= (1 << channel); + else + context->digital[frame] &= ~(1 << channel); +} + // map() // // Scale an input value from one range to another. Works like its Wiring language equivalent.