Simplified sense conversion
authorGraham <dev@netlinux.org.uk>
Wed, 6 Sep 2017 21:03:14 +0000 (22:03 +0100)
committerGraham <dev@netlinux.org.uk>
Wed, 6 Sep 2017 21:03:14 +0000 (22:03 +0100)
UnoBLDC.cpp

index 2c345a3..79d4613 100644 (file)
@@ -8,6 +8,8 @@ static const unsigned char TRITS = 3;
 static const int MARKCONTROL = A0;
 static const int SPACECONTROL = A1;
 static const unsigned long DELAY = 100;
+static const unsigned char NOSTEP = 127;
+
 
 static const unsigned char SENSORMASK = 0b11111100;
 
@@ -22,6 +24,16 @@ static const char TrinaryStep[][TRITS + 1] = {
     "+- "
 };
 
+static const unsigned char SensePattern[] =
+{
+    0b001000,
+    0b010000,
+    0b100000,
+    0b000001,
+    0b000010,
+    0b000100
+};
+
 #elif STEP == 12
 
 static const char TrinaryStep[][TRITS + 1] = {
@@ -39,6 +51,22 @@ static const char TrinaryStep[][TRITS + 1] = {
     "+-+"
 };
 
+static const unsigned char SensePattern[] =
+{
+    0b001000,
+    0b011000,
+    0b010000,
+    0b110000,
+    0b100000,
+    0b100001,
+    0b000001,
+    0b000011,
+    0b000010,
+    0b000110,
+    0b000100,
+    0b001100
+};
+
 #endif
 
 static const unsigned char StepNumber = sizeof (TrinaryStep) / (TRITS + 1);
@@ -51,7 +79,6 @@ static bool Single = false;
 static bool Manual = false;
 
 static unsigned char Sense = 0;
-static bool Blank = false;
 static unsigned int SenseCount = 0;
 
 static unsigned char P[StepNumber];
@@ -112,6 +139,13 @@ void Gap (const int CONTROL, int &Input)
     for (volatile unsigned long intCount = DELAY * Input; intCount > 0; intCount--);
 }
 
+typedef struct
+{
+    unsigned char Pattern;
+    unsigned char Step;
+}
+PatternSpec;
+
 void SensorChange()
 {
     SenseCount++;
@@ -120,79 +154,23 @@ void SensorChange()
     
     if (!Single)
     {
-        Blank = false;
-
-#if STEP == 12
-        if      ((Sense & 0b010000) == 0)
-            StepCount = 2;
-
-        else if ((Sense & 0b011000) == 0)
-            StepCount = 1;
-
-        else if ((Sense & 0b001000) == 0)
-            StepCount = 0;
-
-        else if ((Sense & 0b001100) == 0)
-            StepCount = 11;
-
-        else if ((Sense & 0b000100) == 0)
-            StepCount = 10;
+        StepCount = NOSTEP;
 
-        else if ((Sense & 0b000110) == 0)
-            StepCount = 9;
-
-        else if ((Sense & 0b000010) == 0)
-            StepCount = 8;
-
-        else if ((Sense & 0b000011) == 0)
-            StepCount = 7;
-
-        else if ((Sense & 0b000001) == 0)
-            StepCount = 6;
-
-        else if ((Sense & 0b100001) == 0)
-            StepCount = 5;
-
-        else if ((Sense & 0b100000) == 0)
-            StepCount = 4;
-
-        else if ((Sense & 0b110000) == 0)
-            StepCount = 3;
-#elif STEP == 6
-        if      ((Sense & 0b010000) == 0)
-            StepCount = 1;
-
-        else if ((Sense & 0b001000) == 0)
-            StepCount = 0;
-
-        else if ((Sense & 0b000100) == 0)
-            StepCount = 5;
-
-        else if ((Sense & 0b000010) == 0)
-            StepCount = 4;
-
-        else if ((Sense & 0b000001) == 0)
-            StepCount = 3;
-
-        else if ((Sense & 0b100000) == 0)
-            StepCount = 2;
-#endif
-        else
-            Blank = true;
+        for (unsigned char StepIndex = 0; StepIndex < StepNumber; StepIndex++)
+        {
+            if ((Sense & SensePattern[StepIndex]) == 0)
+            {
+                StepCount = StepIndex;
+                break;
+            }
+        }
     }
     
-    if (Run && (!Blank || Single))
+    if (Run && (StepCount != NOSTEP))
     {
         DDRB = (D[StepCount] << 3); // set the direction
         PORTB = (~P[StepCount] << 3) | 0b111;  // set the bits (including the pullups)
     }
-#if 0
-    else if (!Manual)
-    {
-        DDRB = 0b00000000;     // set the direction
-        PORTB = 0b00000111;    // set the bits
-    }
-#endif
 }
 
 void setup ()
@@ -258,65 +236,16 @@ void loop ()
 
     if (!Single)
     {
-        Blank = false;
-
-# if STEP == 12
-        if      ((Sense & 0b010000) == 0)
-            StepCount = 2;
-
-        else if ((Sense & 0b011000) == 0)
-            StepCount = 1;
-
-        else if ((Sense & 0b001000) == 0)
-            StepCount = 0;
-
-        else if ((Sense & 0b001100) == 0)
-            StepCount = 11;
-
-        else if ((Sense & 0b000100) == 0)
-            StepCount = 10;
-
-        else if ((Sense & 0b000110) == 0)
-            StepCount = 9;
-
-        else if ((Sense & 0b000010) == 0)
-            StepCount = 8;
-
-        else if ((Sense & 0b000011) == 0)
-            StepCount = 7;
+        StepCount = NOSTEP;
 
-        else if ((Sense & 0b000001) == 0)
-            StepCount = 6;
-
-        else if ((Sense & 0b100001) == 0)
-            StepCount = 5;
-
-        else if ((Sense & 0b100000) == 0)
-            StepCount = 4;
-
-        else if ((Sense & 0b110000) == 0)
-            StepCount = 3;
-# elif STEP == 6
-        if      ((Sense & 0b010000) == 0)
-            StepCount = 1;
-
-        else if ((Sense & 0b001000) == 0)
-            StepCount = 0;
-
-        else if ((Sense & 0b000100) == 0)
-            StepCount = 5;
-
-        else if ((Sense & 0b000010) == 0)
-            StepCount = 4;
-
-        else if ((Sense & 0b000001) == 0)
-            StepCount = 3;
-
-        else if ((Sense & 0b100000) == 0)
-            StepCount = 2;
-# endif
-        else
-            Blank = true;
+        for (unsigned char StepIndex = 0; StepIndex < StepNumber; StepIndex++)
+        {
+            if ((Sense & SensePattern[StepIndex]) == 0)
+            {
+                StepCount = StepIndex;
+                break;
+            }
+        }
     }
 # if 1
     if (StepCount >= StepNumber)
@@ -325,7 +254,7 @@ void loop ()
     if (Single && !Run && StepCount == 0)
         Run = true;
 # endif
-    if (Run && (!Blank || Single))
+    if (Run && ((StepCount != NOSTEP) || Single))
     {
         DDRB = (D[StepCount] << 3); // set the direction
         PORTB = (~P[StepCount] << 3) | 0b111;  // set the bits (including the pullups)