changeset 71:53e57276ac1a

Added Scope.h file
author andrewm
date Fri, 17 Jul 2015 17:53:40 +0100
parents f3251851c718
children d837fb676977
files include/Scope.h
diffstat 1 files changed, 90 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/Scope.h	Fri Jul 17 17:53:40 2015 +0100
@@ -0,0 +1,90 @@
+//scope.cpp
+#include <BeagleRT.h> 
+#include <rtdk.h>
+#include <cmath>
+#include <UdpClient.h>
+
+#define NETWORK_AUDIO_BUFFER_SIZE 2048 
+struct networkAudio{
+	int timestamp;
+	int currentBuffer;
+	int index;
+	float buffers[2][NETWORK_AUDIO_BUFFER_SIZE]; 
+	int doneOnTime;
+	bool toBeSent;
+	UdpClient udpClient;
+};
+
+#define NUM_SCOPE_CHANNELS 6
+
+static void SendScopeData();
+
+class Scope {
+    int sampleCount; 
+    float sampleRate;
+    AuxiliaryTask scopeTask;
+  public:
+    int numChannels;
+    networkAudio channel[NUM_SCOPE_CHANNELS];
+    Scope(){
+        numChannels = NUM_SCOPE_CHANNELS;
+        sampleCount = 0;
+        
+        for(int n=0; n<numChannels; n++){
+            channel[n].doneOnTime=1;
+            channel[n].index=2;
+            channel[n].timestamp=0;
+            channel[n].currentBuffer=0;
+            channel[n].toBeSent=false;
+            channel[n].udpClient.setPort(9999);
+            channel[n].udpClient.setServer("127.0.0.1");
+    	}
+    }
+    void setup(float _sampleRate);
+    void log(float channel1=0.0, float channel2=0.0, float channel3=0.0, float channel4=0.0, float channel5=0.0, float channel6=0.0){
+        
+        for(int j=0; j<numChannels; j++){
+			if(channel[j].index==(NETWORK_AUDIO_BUFFER_SIZE)){ // when the buffer is ready ...
+              channel[j].buffers[channel[j].currentBuffer][0] = (float)j;
+              channel[j].buffers[channel[j].currentBuffer][1] = (float)channel[j].timestamp;
+				channel[j].toBeSent=true;
+				channel[j].index=2; //reset the counter
+				if(channel[j].doneOnTime==0)
+					rt_printf("Network buffer underrun :-{\n");
+				channel[j].timestamp=sampleCount;
+				channel[j].currentBuffer=!channel[j].currentBuffer; //switch buffer
+				channel[j].doneOnTime=0;
+				BeagleRT_scheduleAuxiliaryTask(scopeTask); //send the buffer
+			}
+		}
+      
+      	channel[0].buffers[channel[0].currentBuffer][channel[0].index++]=channel1;
+      	channel[1].buffers[channel[1].currentBuffer][channel[1].index++]=channel2;
+      	channel[2].buffers[channel[2].currentBuffer][channel[2].index++]=channel3;
+      	channel[3].buffers[channel[3].currentBuffer][channel[3].index++]=channel4;
+      	channel[4].buffers[channel[4].currentBuffer][channel[4].index++]=channel5;
+      	channel[5].buffers[channel[5].currentBuffer][channel[5].index++]=channel6;
+
+	sampleCount++;
+    }
+};
+
+Scope* gOscilloscopeInstance;
+
+void Scope::setup(float _sampleRate){
+    sampleRate = _sampleRate;
+    gOscilloscopeInstance = this;
+    scopeTask = BeagleRT_createAuxiliaryTask(*SendScopeData, 98, "transmit-receive-audio");
+}
+
+//Scope scope; 
+
+static void SendScopeData(){
+    for(int n=0; n<gOscilloscopeInstance->numChannels; n++){
+		if(gOscilloscopeInstance->channel[n].toBeSent){
+			gOscilloscopeInstance->channel[n].toBeSent=false;
+			gOscilloscopeInstance->channel[n].udpClient.send(gOscilloscopeInstance->channel[n].buffers[!gOscilloscopeInstance->channel[n].currentBuffer],NETWORK_AUDIO_BUFFER_SIZE*sizeof(float));
+			gOscilloscopeInstance->channel[n].doneOnTime=1;
+		}
+	}
+}