Thursday, 24 September 2015

VART3492 :: Advanced Studio Technologies 2 - Bjorklund Algorithm for Arduino

int steps = 8;
int pulses = 5;

int remainder[16];
int count[16];
int level;
int stepstatus=0;
char pattern[16];
float currentmicroTime;
float currentmicroTime2;

char trackArray[8][16];


void setup() {
 Serial.begin(9600);
}

void loop() {
 
 delay (3000);
 
 currentmicroTime = (float)micros();
 
 compute_bitmap(steps,pulses);
 
 currentmicroTime2 = (float)micros();
 
 Serial.print("For ");Serial.print(steps);Serial.print(" steps and ");Serial.print(pulses);Serial.print(" pulses, "); Serial.print("the pattern is:");
 Serial.println();

 
 for (int i = steps-1; i >= 0 ; i--) {
     Serial.print(trackArray[1][i]);
 }
 
 
 Serial.println();Serial.println();
 Serial.print("Bjorklund took ");Serial.print(currentmicroTime2-currentmicroTime);Serial.print(" microseconds.");
 Serial.println();Serial.println();Serial.println();Serial.println();
 delay (5000);
 
     
}
void compute_bitmap (int num_slots,int num_pulses)  {
 
 //int remainder[16];
 
 if (num_pulses > num_slots) {num_pulses = num_slots;}         
 int divisor = num_slots - num_pulses;
 steps = num_slots; pulses = num_pulses;
 remainder[0] = num_pulses;
 level = 0;
 do {
   count[level] = divisor / remainder[level];
   remainder[level+1] = divisor % remainder[level];
   divisor = remainder[level];
   level = level +1; }
   while (remainder[level] > 1);

   count[level] = divisor;
   build_string (level);

}


void build_string (int level)  {
 if (level == -1) {

 //Serial.println('0');
   trackArray[1][stepstatus]='0';
   stepstatus=stepstatus+1;     
 }
 else if (level == -2)  {   

 //Serial.println('1');  // Debug
   trackArray[1][stepstatus]='1';
   stepstatus=stepstatus+1;    
 }
 else {
   for (int i = 0; i < count[level]; i++)
   build_string(level-1);
   if (remainder[level] !=0)
   build_string(level-2);
 }

}

No comments:

Post a Comment