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.