|  | 
#include <assert.h>
#include "ClockMult.h"
#include <stdio.h>
void ClockMult::sampleClock()
{
    if (isFreeRun()) {
        sampleClockFreeRunMode();
    } else {
        sampleClockLockedMode();
    }
}
void ClockMult::sampleClockFreeRunMode()
{
    sawPhase += freeRunFreq;
    if (sawPhase >= 1) {
        sawPhase -= 1;
        // TODO: do we care about clock out? probably...
    }
}
void ClockMult::sampleClockLockedMode()
{
  //  printf("sampleClock: state=%d saw=%f\n", state, sawPhase);
    switch (state) {
        case State::INIT:
            break;
        case State::TRAINING:
            ++trainingCounter;
            break;
        case State::RUNNING: 
            ++trainingCounter;          // we are still training, even while running
            sawPhase += learnedFrequency;
            if (sawPhase >= 1) {
                sawPhase -= 1.f;
            }
            if (clockOutTimer > 0) {
                clockOutTimer--;
            } else {
                clockOutValue = false;
             //   printf("clock out one-shot timed out, going low\n");
            }
            break;
        default: 
            assert(false);
    }
 //   printf("leave sampleClock: state=%d saw=%f\n", state, sawPhase);
}
/**
* Sends one reference tick to the multiplier
*/
void ClockMult::refClock()
{
    if (isFreeRun()) {
        return;
    }
  //  printf("refClock: state=%d\n", state);
    switch (state) {
        case State::INIT://
            state = State::TRAINING;
            trainingCounter = 0;
       //     printf("refClock moved from INIT to TRAINIG\n");
            break;
        case State::TRAINING:
        case State::RUNNING:
        //    printf("got end train with ctr = %d\n", trainingCounter);
            learnedPeriod = trainingCounter;
            trainingCounter = 0;
            learnedFrequency = (float) freqMultFactor / learnedPeriod;
            state = State::RUNNING;
            
            startNewClock();
         // printf("refClock moved from TRAINING to RUNNING. period = %d freq=%f clockOut=%d\n",  learnedPeriod, learnedFrequency, clockOutValue);
            break;
       
        default:
            assert(0);
            
    }
    //printf("leave refClock: state=%d\n", state);
}
void ClockMult::startNewClock()
{
    sawPhase = 0;
    clockOutValue = true;
    clockOutTimer = 10;         // TODO: constants
}
void ClockMult::setMultiplier(int x)
{
    freqMultFactor = x;
}
 |