annotate core/Utilities.cpp @ 151:e9c9404e3d1f ClockSync

Pff partially working. No PID. When setting the audio clock on the bbb to 44098 the master and slave clock keep diverging instead of converging ...
author Giulio Moro <giuliomoro@yahoo.it>
date Tue, 22 Sep 2015 04:10:07 +0100
parents 8bd351ca8b46
children f1012082f142
rev   line source
andrewm@0 1 /*
andrewm@0 2 * Utilities.cpp
andrewm@0 3 *
andrewm@0 4 * Created on: Oct 27, 2014
andrewm@0 5 * Author: parallels
andrewm@0 6 */
andrewm@0 7
andrewm@0 8 #include "../include/Utilities.h"
andrewm@0 9
andrewm@45 10 // analogReadFrame()
andrewm@45 11 //
andrewm@45 12 // Returns the value of the given analog input at the given frame number.
andrewm@52 13 float analogReadFrame(BeagleRTContext *context, int frame, int channel) {
andrewm@45 14 return context->analogIn[frame * context->analogChannels + channel];
andrewm@45 15 }
andrewm@45 16
andrewm@45 17 // analogWriteFrame()
andrewm@45 18 //
andrewm@45 19 // Sets a given channel to a value for the current frame and, if persistent outputs are
andrewm@45 20 // enabled, for all subsequent frames
andrewm@52 21 void analogWriteFrame(BeagleRTContext *context, int frame, int channel, float value) {
andrewm@45 22 if(context->flags & BEAGLERT_FLAG_ANALOG_OUTPUTS_PERSIST) {
andrewm@45 23 for(unsigned int f = frame; f < context->analogFrames; f++)
andrewm@45 24 context->analogOut[frame * context->analogChannels + channel] = value;
andrewm@45 25 }
andrewm@45 26 else
andrewm@45 27 context->analogOut[frame * context->analogChannels + channel] = value;
andrewm@45 28 }
andrewm@45 29
andrewm@45 30 // analogWriteFrameOnce()
andrewm@45 31 //
andrewm@45 32 // Sets a given channel to a value for only the current frame
andrewm@52 33 void analogWriteFrameOnce(BeagleRTContext *context, int frame, int channel, float value) {
andrewm@45 34 context->analogOut[frame * context->analogChannels + channel] = value;
andrewm@45 35 }
andrewm@45 36
andrewm@45 37 // digitalReadFrame()
andrewm@45 38 //
andrewm@45 39 // Returns the value of a given digital input at the given frame number
andrewm@52 40 int digitalReadFrame(BeagleRTContext *context, int frame, int channel) {
andrewm@45 41 return getBit(context->digital[frame], channel + 16);
andrewm@45 42 }
andrewm@45 43
andrewm@45 44 // digitalWriteFrame()
andrewm@45 45 //
andrewm@45 46 // Sets a given digital output channel to a value for the current frame and all subsequent frames
andrewm@52 47 void digitalWriteFrame(BeagleRTContext *context, int frame, int channel, int value) {
andrewm@45 48 for(unsigned int f = frame; f < context->digitalFrames; f++) {
andrewm@45 49 if(value)
andrewm@45 50 context->digital[f] |= 1 << (channel + 16);
andrewm@45 51 else
andrewm@45 52 context->digital[f] &= ~(1 << (channel + 16));
andrewm@45 53 }
andrewm@45 54 }
andrewm@45 55
andrewm@45 56 // digitalWriteFrameOnce()
andrewm@45 57 //
andrewm@45 58 // Sets a given digital output channel to a value for the current frame only
andrewm@52 59 void digitalWriteFrameOnce(BeagleRTContext *context, int frame, int channel, int value) {
andrewm@45 60 if(value)
andrewm@45 61 context->digital[frame] |= 1 << (channel + 16);
andrewm@45 62 else
andrewm@45 63 context->digital[frame] &= ~(1 << (channel + 16));
andrewm@45 64 }
andrewm@45 65
andrewm@45 66 // pinModeFrame()
andrewm@45 67 //
andrewm@45 68 // Sets the direction of a digital pin for the current frame and all subsequent frames
andrewm@52 69 void pinModeFrame(BeagleRTContext *context, int frame, int channel, int mode) {
andrewm@45 70 for(unsigned int f = frame; f < context->digitalFrames; f++) {
giuliomoro@75 71 if(mode == INPUT)
andrewm@45 72 context->digital[f] |= (1 << channel);
andrewm@45 73 else
andrewm@45 74 context->digital[f] &= ~(1 << channel);
andrewm@45 75 }
andrewm@45 76 }
andrewm@45 77
andrewm@45 78 // pinModeFrameOnce()
andrewm@45 79 //
andrewm@45 80 // Sets the direction of a digital pin for the current frame only
andrewm@52 81 void pinModeFrameOnce(BeagleRTContext *context, int frame, int channel, int mode) {
giuliomoro@75 82 if(mode == INPUT)
andrewm@45 83 context->digital[frame] |= (1 << channel);
andrewm@45 84 else
andrewm@45 85 context->digital[frame] &= ~(1 << channel);
andrewm@45 86 }
andrewm@45 87
andrewm@0 88 // map()
andrewm@0 89 //
andrewm@0 90 // Scale an input value from one range to another. Works like its Wiring language equivalent.
andrewm@0 91 // x is the value to scale; in_min and in_max are the input range; out_min and out_max
andrewm@0 92 // are the output range.
andrewm@0 93
andrewm@52 94 float map(float x, float in_min, float in_max, float out_min, float out_max)
andrewm@0 95 {
andrewm@0 96 return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
andrewm@0 97 }
andrewm@0 98
andrewm@0 99 // constrain()
andrewm@0 100 //
andrewm@0 101 // Clips an input value to be between two end points
andrewm@0 102 // x is the value to constrain; min_val and max_val are the range
andrewm@0 103
andrewm@52 104 float constrain(float x, float min_val, float max_val)
andrewm@0 105 {
andrewm@0 106 if(x < min_val) return min_val;
andrewm@0 107 if(x > max_val) return max_val;
andrewm@0 108 return x;
andrewm@0 109 }