- The calculation for the doTick interval time was not correct. Fixed it.
- Improved the container file checking. Tell the error when engine detected duplicated receptors in a cell.
- Don't open Serial port setting dialog when container file had errors.
- Improved the retry logic for the initialization of the serial port.
- Fixed a bug in the sample content Sample4_Arduino2_PIDControl.
<a parameter="connection" href="1_b.xhtml#m1Ki" receptor="uiInitialized"></a>
<a parameter="connection" href="1_b.xhtml#m1Kd" receptor="uiInitialized"></a>
<a parameter="connection" href="1_b.xhtml#m1offset" receptor="uiInitialized"></a>
+<a parameter="connection" href="../../3/3_a.xhtml#UIInitialized" receptor="input"></a>
</a>
</body>
</a>
<a define="cell" name="UIInitialized"><a parameter="cellcode" href="../util/util.xhtml#SimpleConnector"> </a>
-<a parameter="connection" href="../4/ar/4_a.xhtml#M1controlValueController" receptor="controlValue"></a>
+<a parameter="connection" href="../4/ar/4_a.xhtml#M1controlValueController" receptor="uiInitialized"></a>
</a>
<h1>core cells for controlling motors</h1>
this.integral = 0;
this.samplingTimePrev = 0;
}
-
function doTick(time)
{
var Kp = this.cell.receptors.Kp;
var samplingTime = this.cell.receptors.samplingTime;
var currentRawPosition = this.cell.receptors.currentRawPosition;
var offset = this.cell.receptors.offset;
+ var uiInitialized = this.cell.receptors.uiInitialized;
+
+ if (uiInitialized != 1)
+ {
+ print("waiting for the initialization of UI..");
+ return;
+ }
if (samplingTime != this.prevSamplingTime && controlValue != 0 && Math.abs(currentRawPosition - this.prevRawPosition) <= 1 && Math.abs(controlValue) < offset)
{
if (orgCell && tgtCell)
{
- orgCell->connectTo(connInfo->connectionName, tgtCell);
+ if (!orgCell->connectTo(connInfo->connectionName, tgtCell))
+ {
+ std::string message = std::string("Failed to make connection. Receptor name for the target cell may be duplicated. (").append(connInfo->connectionName).append(" cell:").append(connInfo->originCellName).append(" - > ").append(connInfo->targetCellName);
+ TKLog::printf("%s", message.c_str());
+ if (dnGlobal()->updateErrorStatus(DNGlobal::ERROR))
+ {
+ dnGlobal()->setMessage1("Initialization failed");
+ dnGlobal()->setMessage2(message);
+ }
+ }
}
else
{
}
mLock.unlock();
- return true;
+ return dnGlobal()->isErrorStatusNormal();
}
void DNContainerBuilder::defineCellWithoutCellCodeClass(const char *path, std::string name, std::string type, std::string customScript)
bool TKCell::connectTo(std::string connectionName, TKCell *targetCell)
{
TKReceptor *receptor = targetCell->createReceptor(connectionName);
- TKAxonTerminal *terminal = mAxon->addTerminal();
- receptor->setTarget(terminal);
+ if (receptor)
+ {
+ TKAxonTerminal *terminal = mAxon->addTerminal();
+ receptor->setTarget(terminal);
- return true;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
}
TKReceptor* TKCell::createReceptor(std::string name)
TKReceptorMap::iterator it = mReceptors.find(name);
if (it != mReceptors.end())
{
- receptor = it->second;
+ receptor = NULL;
}
else
{
return;
}
- SerialPort *port = new SerialPort(impl->mPortName);
- if (port == NULL)
- {
- impl->mStartStopLock.lock();
- impl->mStopping = true;
- impl->mStartStopLock.unlock();
- return;
- }
-
+ SerialPort *port = NULL;
bool r = true;
int retry = 6;
do
{
- r = port->open(QIODevice::ReadWrite | QIODevice::Unbuffered);
+ port = new SerialPort(impl->mPortName);
+ r = port != NULL;
+
+ if (r)
+ {
+ r = port->open(QIODevice::ReadWrite | QIODevice::Unbuffered);
+ }
if (r)
{
if (!port->setRate(impl->mBaudRate))
if (!r)
{
SleeperThread::msleep(500);
- port->close();
+ if (port)
+ {
+ port->close();
+ delete port;
+ port = NULL;
+ }
retry--;
TKLog::printf("Failed to open the serial port. retrying...");
}
impl->mStartStopLock.lock();
impl->mStopping = true;
impl->mStartStopLock.unlock();
+ TKLog::printf("Failed to open the serial port. giving up!");
return;
}
return new QtDNTimeKeeperImpl;
}
-QtDNTimeKeeperImpl::QtDNTimeKeeperImpl() : mIntervalTime(1000),mAvgActualInterval(1000),mAdjustTime(0),mPrevTime(0),mStartTime(0),mTickTime(0)
+QtDNTimeKeeperImpl::QtDNTimeKeeperImpl() : mIntervalTime(1000),mAdjustTime(0),mPrevTime(0),mStartTime(0),mTickTime(0)
{
}
bool QtDNTimeKeeperImpl::setIntevalSec(float time)
{
mIntervalTime = time * 1000;
- mAvgActualInterval = time * 1000;
mAdjustTime = 0.0;
return true;
}
}
qint64 currentTime = QDateTime::currentMSecsSinceEpoch();
qint64 dt = currentTime - mPrevTime;
- qint64 wt = mIntervalTime + dt + (int)mAdjustTime;
-
- if (wt < 5) // wait at least 5ms.
+ qint64 wt = mIntervalTime - dt + (int)mAdjustTime;
+ if (wt < 1) // wait at least 1ms.
{
- wt = 5;
+ wt = 1;
}
SleeperThread::msleep(wt);
qint64 t = QDateTime::currentMSecsSinceEpoch();
- mAvgActualInterval = (float)mAvgActualInterval * 0.9 + ((float)(t - mPrevTime) * 0.1);
- mAdjustTime += (mIntervalTime - mAvgActualInterval);
+
+ mAdjustTime += mIntervalTime - (t - mPrevTime);
+ if (mAdjustTime < -mIntervalTime * 0.3)
+ {
+ mAdjustTime = -mIntervalTime * 0.3;
+ }
mPrevTime = t;
mTickTime = (mPrevTime - mStartTime)/1000.0;
{
mStartTime = QDateTime::currentMSecsSinceEpoch();
mPrevTime = mStartTime;
- mAvgActualInterval = mIntervalTime;
mAdjustTime = 0.0;
mTickTime = 0.0;
return true;
virtual bool stop();
private:
qint64 mIntervalTime;
- float mAvgActualInterval;
float mAdjustTime;
qint64 mPrevTime;
qint64 mStartTime;