view core/ClockSyncThread.cpp @ 149:134bff10e561 ClockSync

Added simple one-variable one-measurement Kalman filter, Pid controller(which output is not used). Virtual clock is now much more precise and reactive for period. Still it is lagging behind a bit on the overall offset.
author Giulio Moro <giuliomoro@yahoo.it>
date Mon, 21 Sep 2015 03:12:21 +0100
parents 44d07fa9bd03
children 8f98b32d0e23
line wrap: on
line source
#include "ClockSyncThread.h"
#ifdef USE_JUCE
#else //declare static members TODO: rather refactor this similar to other threads so that only run and clockSyncTask are static
	myClock_t ClockSyncThread::lastTime; // Used for clock synchronization
	bool ClockSyncThread::listening;
	ClockSync ClockSyncThread::clockSync;
	VirtualClock* ClockSyncThread::virtualClock;
	bool ClockSyncThread::threadIsExiting;
	AuxiliaryTask ClockSyncThread::clockSyncTask;
#endif
#ifdef USE_JUCE
ClockSyncThread::ClockSyncThread(const String &threadName) :
			Thread(threadName)
#else
ClockSyncThread::ClockSyncThread()
#endif /* USE_JUCE */
{
};
ClockSyncThread::~ClockSyncThread(){
#ifdef USE_JUCE
	stopThread(1000);
#else
	stopThread();
#endif /* USE_JUCE */
}
void ClockSyncThread::init(bool isSlave, int aPort, VirtualClock &aVirtualClock){
	setVirtualClock(aVirtualClock);
	listening=false;
	clockSync.init(isSlave, aPort, *virtualClock);
#ifdef USE_JUCE
	startThread(5);
#else
	threadIsExiting=false;
	clockSyncTask=BeagleRT_createAuxiliaryTask(&ClockSyncThread::run,60, "clockSyncTask");
	//TODO: the thread cannot be started here at the moment because init() is called in setup(), where tasks cannot be scheduled
#endif /* USE_JUCE */
}

#ifdef USE_JUCE
#else
void ClockSyncThread::startThread(){
	BeagleRT_scheduleAuxiliaryTask(clockSyncTask);
}
void ClockSyncThread::stopThread(){
	threadIsExiting=true;
}
bool ClockSyncThread::threadShouldExit(){
	return(gShouldStop || threadIsExiting );
}
#endif /* USE_JUCE */

void ClockSyncThread::setVirtualClock(VirtualClock &aVirtualClock){
	virtualClock=&aVirtualClock;
};
#ifndef USE_JUCE
extern I2c_Codec* gAudioCodec;
#endif
void ClockSyncThread::run(){
	printf("variable=[");
	while(!threadShouldExit()){
		static int count = 0;
		clockSync.sendReceiveLoop();
#ifndef USE_JUCE
//		if (count == 300){
//			printf("0 0 0\n");
//			gAudioCodec->setAudioSamplingRate(44101);
//		}
#endif
		count++;
//		double now=virtualClock->getNow();
//		printf("th(end+1)=%f;\n", now);
//		printf("act(end+1)=%lld;\n", Clock::getTimeUs());
	}
	printf("];\n");
//	printf("Thread is not running \n");
}