[chronojump] rdotnet encoder curves found, reduced by speed ok



commit 2fbd087607f0e92e68568bdc19096a6365380ec1
Author: Xavier de Blas <xaviblas gmail com>
Date:   Wed Oct 23 20:56:54 2013 +0200

    rdotnet encoder curves found, reduced by speed ok

 encoder/graph.R    |    5 ++-
 src/encoder.cs     |   21 +++++++-
 src/gui/encoder.cs |  141 +++++++++++++++++++++++++++++++--------------------
 3 files changed, 110 insertions(+), 57 deletions(-)
---
diff --git a/encoder/graph.R b/encoder/graph.R
index 1a9a0f1..9d16208 100644
--- a/encoder/graph.R
+++ b/encoder/graph.R
@@ -1743,6 +1743,9 @@ doProcess <- function(options) {
        
                #find SmoothingsEC
                SmoothingsEC = findSmoothingsEC(rawdata, curves, Eccon, SmoothingOneC)
+               
+               print("curves before reduceCurveBySpeed")
+               print(curves)
 
                #reduceCurveBySpeed
                for(i in 1:n) {
@@ -1782,7 +1785,7 @@ doProcess <- function(options) {
                                #     side=1,text=myLabel, cex=.8, col="blue")
                                abline(v=c(curves[i,1],curves[i,2])/1000, lty=3, col="gray")
                        }
-
+                       
                        #plot speed
                        par(new=T)      
                        speed <- smooth.spline( 1:length(rawdata), rawdata, spar=smoothingAll)
diff --git a/src/encoder.cs b/src/encoder.cs
index 11e22e1..c7ed171 100644
--- a/src/encoder.cs
+++ b/src/encoder.cs
@@ -22,7 +22,7 @@ using System;
 using System.Data;
 using System.Text; //StringBuilder
 using System.IO;   //for Path
-
+using System.Collections; //ArrayList
 using Mono.Unix;
 
 public class EncoderParams
@@ -542,5 +542,24 @@ public class EncoderCaptureCurve {
                this.endFrame = endFrame;
        }
 
+       public string DirectionAsString() {
+               if(up)
+                       return "UP";
+               else
+                       return "DOWN";
+       }
+
        ~EncoderCaptureCurve() {}
 }
+
+public class EncoderCaptureCurveArray {
+       public ArrayList ecc;   //each of the EncoderCaptureCurve
+       public int curvesDone;  //starts at int 0. How many ecc have been calculated by R
+       
+       public EncoderCaptureCurveArray() {
+               ecc = new ArrayList();
+               curvesDone = 0;
+       }
+       
+       ~EncoderCaptureCurveArray() {}
+}
diff --git a/src/gui/encoder.cs b/src/gui/encoder.cs
index 9d496ac..a4d6a26 100644
--- a/src/gui/encoder.cs
+++ b/src/gui/encoder.cs
@@ -153,6 +153,11 @@ public partial class ChronoJumpWindow
        private static Gdk.Point [] encoderCapturePoints;               //stored to be realtime displayed
        private static int encoderCapturePointsCaptured;                //stored to be realtime displayed
        private static int encoderCapturePointsPainted;                 //stored to be realtime displayed
+       
+       //Contains curves captured to be analyzed by R
+       private static EncoderCaptureCurveArray ecca;
+       private static bool eccaCreated = false;
+
        private static bool encoderProcessCancel;
        private static bool encoderProcessProblems;
        private static bool encoderProcessFinish;
@@ -1808,8 +1813,15 @@ public partial class ChronoJumpWindow
                int directionLastMSecond = 1;   // +1 or -1 (direction on last millisecond)
                int directionCompleted = -1;    // +1 or -1
                int previousFrameChange = 0;
+               int lastNonZero = 0;
                bool firstCurve = true;
 
+               //create ecca if needed
+               if(! eccaCreated) {
+                       ecca = new EncoderCaptureCurveArray();
+                       eccaCreated = true;
+               }
+
 
                do {
                        byteReaded = sp.ReadByte();
@@ -1848,68 +1860,40 @@ public partial class ChronoJumpWindow
                                if(byteReaded != 0)
                                        //store the direction
                                        directionNow = byteReaded / Math.Abs(byteReaded); //1 (up) or -1 
(down)
+                                       
+                               if(directionNow == directionLastMSecond) {
+                                       //check which is the last non-zero value
+                                       //this is suitable to find where starts the only-zeros previous to 
the change
+                                       if(byteReaded != 0)
+                                               lastNonZero = i;
+                               }
+
                                //if it's different than the last direction, mark the start of change
                                if(directionNow != directionLastMSecond) {
                                        directionLastMSecond = directionNow;
                                        directionChangeCount = 0;
                                } 
-                               
-                               //we are in a different direction than the last completed
-                               if(directionNow != directionCompleted) {
+                               else if(directionNow != directionCompleted) {
+                                       //we are in a different direction than the last completed
+                                       
                                        //we cannot add byteReaded because then is difficult to come back n 
frames to know the max point
                                        //directionChangeCount += byteReaded
-                                       directionChangeCount += 1;
+                                       directionChangeCount ++;
 
                                        //count >= than change_period
                                        if(directionChangeCount > directionChangePeriod)
                                        { 
                                                EncoderCaptureCurve ecc = new EncoderCaptureCurve(
-                                                               Util.IntToBool(byteReaded),
+                                                               ! Util.IntToBool(directionNow), //if we go 
now UP, then record previous DOWN phase
                                                                previousFrameChange,
-                                                               i - directionChangePeriod
+                                                               ( (i + lastNonZero)/2 ) //end between i and 
start of the zeros (end at 1/2 of zeros)
+                                                               - directionChangePeriod //and obviously - 
directionChangePeriod
                                                                );
+                                               ecca.ecc.Add(ecc);
 
                                                previousFrameChange = i;
                                                directionChangeCount = 0;
                                                directionCompleted = directionNow;
-
-                                               if(firstCurve)
-                                                       firstCurve = false;
-                                               else {
-                                                       Log.WriteLine(ecc.up.ToString());
-                                                       sep = "";
-                                                       Log.Write(" A ");
-                                                       Log.WriteLine(ecc.startFrame.ToString());
-                                                       Log.WriteLine(ecc.endFrame.ToString());
-                                                       int [] curve = new int[ecc.endFrame - ecc.startFrame];
-                                                       Log.Write(" A2 ");
-                                                       int k=0;
-                                                       for(int j=ecc.startFrame; j < ecc.endFrame ; j ++) {
-                                                               Log.Write(sep + encoderReaded[j]);
-                                                               sep = ", ";
-
-                                                               curve[k]=encoderReaded[j];
-                                                               k++;
-                                                       }
-                                                       
-                                                       /*
-                                                        * TODO
-                                                        * do not call it here
-                                                        * make ecc object public
-                                                        * call in the other thread
-                                                        * manage to find if it has been calculated in R or 
not
- 
-                                                       IntegerVector curveToR = 
rengine.CreateIntegerVector(new int[] {2,8,12,15,19});
-                                                       rengine.SetSymbol("curveToR", curveToR);
-                                                       rengine.Evaluate("print(length(curveToR))");
-                                                       rengine.Evaluate("print(mean(curveToR))");
-                                                       //IntegerVector curveToR = 
rengine.CreateIntegerVector(curve);
-                                                       
-                                                       //var length = 
rengine.GetSymbol("length").AsFunction();
-                                                       //var lengthNums = length.Invoke(new[] { curveToR 
}).AsNumeric();
-                                                       //Console.WriteLine(string.Join(" ", lengthNums));
-                                                       */
-                                               }
                                        }
                                }
 
@@ -3698,17 +3682,64 @@ Log.WriteLine(str);
 
                        encoderCapturePointsPainted = encoderCapturePointsCaptured;
 
-                       Log.WriteLine("calling rdotnet");
-/*
-                       CharacterVector charVec = rengine.CreateCharacterVector(new[] { "Hello, R world!, 
.NET speaking" });
-                       rengine.SetSymbol("greetings", charVec);
-                       rengine.Evaluate("str(greetings)"); // print out in the console
-                       */
-                       IntegerVector curveToR = rengine.CreateIntegerVector(new int[] {2,8,12,15,19});
-                       rengine.SetSymbol("curveToR", curveToR);
-                       rengine.Evaluate("print(length(curveToR))");
-                       rengine.Evaluate("print(mean(curveToR))");
-                       //IntegerVector curveToR = rengine.CreateIntegerVector(curve);
+                       if(ecca.ecc.Count > ecca.curvesDone) {
+                               Log.WriteLine("calling rdotnet: direction, start, end");
+                               EncoderCaptureCurve ecc = (EncoderCaptureCurve) ecca.ecc[ecca.curvesDone];
+                               Log.WriteLine(ecc.DirectionAsString());
+                               Log.WriteLine(ecc.startFrame.ToString());
+                               Log.WriteLine(ecc.endFrame.ToString());
+               
+                               //evaluate only concentric curves       
+                               if(ecc.up && (ecc.endFrame - ecc.startFrame) > 0) {
+                                       int [] curve = new int[ecc.endFrame - ecc.startFrame];
+                                       for(int k=0, j=ecc.startFrame; j < ecc.endFrame ; j ++) {
+                                               curve[k]=encoderReaded[j];
+                                               k++;
+                                       }
+
+                                       IntegerVector curveToR = rengine.CreateIntegerVector(curve);
+                                       rengine.SetSymbol("curveToR", curveToR);
+                                       rengine.Evaluate("print(length(curveToR))");
+                                       rengine.Evaluate("print(mean(curveToR))");
+                                       rengine.Evaluate("speedCut <- smooth.spline( 1:length(curveToR), 
curveToR, spar=0.7)");
+
+                                       //reduce curve by speed, the same way as graph.R
+                                       rengine.Evaluate("b=extrema(speedCut$y)");
+                                       rengine.Evaluate("maxSpeedT <- min(which(speedCut$y == 
max(speedCut$y)))");
+
+                                       int maxSpeedT = rengine.GetSymbol("maxSpeedT").AsInteger().First();
+
+                                       rengine.Evaluate("bcrossLen <- length(b$cross[,2])");
+                                       int bcrossLen = rengine.GetSymbol("bcrossLen").AsInteger().First();
+
+                                       rengine.Evaluate("bcross <- b$cross[,2]");
+                                       IntegerVector bcross = rengine.GetSymbol("bcross").AsInteger();
+
+                                       int x_ini = 0;  
+                                       if(bcrossLen == 0)
+                                               x_ini = 0;
+                                       else if(bcrossLen == 1) {
+                                               if(bcross[0] < maxSpeedT)
+                                                       x_ini = bcross[0];
+                                       } else {
+                                               x_ini = bcross[0];      //not 1, we are in C# now
+                                               for(int i=0; i < bcross.Length; i++) {
+                                                       if(bcross[i] < maxSpeedT)
+                                                               x_ini = bcross[i];      //left adjust
+                                               }
+                                       }
+
+                                       rengine.Evaluate("curveToRcumsum = cumsum(curveToR)");
+                                       rengine.Evaluate("firstFrameAtTop <- min(which(curveToRcumsum == max 
(curveToRcumsum)))");
+                                       int x_end = rengine.GetSymbol("firstFrameAtTop").AsInteger().First();
+
+                                       Log.WriteLine("reducedCurveBySpeed (start, end)");
+                                       Log.WriteLine((ecc.startFrame + x_ini).ToString());
+                                       Log.WriteLine((ecc.startFrame + x_end).ToString());
+                               }
+
+                               ecca.curvesDone ++;
+                       }
                }
        }
        


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]