OSDN Git Service

Several improvements and bug fixes.
authortkawata <tkawata@users.sourceforge.jp>
Tue, 15 May 2012 15:22:09 +0000 (00:22 +0900)
committertkawata <tkawata@users.sourceforge.jp>
Tue, 15 May 2012 15:22:09 +0000 (00:22 +0900)
- 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.

Samples/Samples/Sample4_Arduino2_PIDControl/Container/1/ui/1_a.xhtml
Samples/Samples/Sample4_Arduino2_PIDControl/Container/3/3_a.xhtml
Samples/Samples/Sample4_Arduino2_PIDControl/Container/4/ar/4_a.xhtml
Source/DNContainerBuilder.cpp
Source/TKCell.cpp
Source/platform/qt/qtdnserialportimpl.cpp
Source/platform/qt/qtdntimekeeperimpl.cpp
Source/platform/qt/qtdntimekeeperimpl.h

index 3a8d944..e995b2a 100644 (file)
@@ -39,6 +39,7 @@
 <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>
index 42226ff..0795928 100644 (file)
@@ -20,7 +20,7 @@
 </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>
@@ -39,7 +39,6 @@ function doInit()
        this.integral = 0;
        this.samplingTimePrev = 0;
 }
-
 function doTick(time)   
 {
        var Kp = this.cell.receptors.Kp;
index 8d3f929..ea34066 100644 (file)
@@ -32,6 +32,13 @@ function doTick(time)
        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)
        {
index 5ed5903..f495b68 100644 (file)
@@ -110,7 +110,16 @@ bool DNContainerBuilder::buildContainerFromXHTML(const char* docRoot)
         
         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
         {
@@ -126,7 +135,7 @@ bool DNContainerBuilder::buildContainerFromXHTML(const char* docRoot)
     }
     mLock.unlock();
 
-    return true;
+    return dnGlobal()->isErrorStatusNormal();
 }
 
 void DNContainerBuilder::defineCellWithoutCellCodeClass(const char *path, std::string name, std::string type, std::string customScript)
index 37cede1..b40cf10 100644 (file)
@@ -78,10 +78,17 @@ bool TKCell::setCellCode(TKCellCode *code, const void *data)
 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)
@@ -90,7 +97,7 @@ TKReceptor* TKCell::createReceptor(std::string name)
     TKReceptorMap::iterator it = mReceptors.find(name);
     if (it != mReceptors.end())
     {
-        receptor = it->second;
+        receptor = NULL;
     }
     else
     {
index 76538e5..3b18940 100644 (file)
@@ -166,20 +166,18 @@ void QtDNSerialPortImpl::serialCommunicationThreadBody(void *_impl)
         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))
@@ -219,7 +217,12 @@ void QtDNSerialPortImpl::serialCommunicationThreadBody(void *_impl)
         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...");
         }
@@ -234,6 +237,7 @@ void QtDNSerialPortImpl::serialCommunicationThreadBody(void *_impl)
         impl->mStartStopLock.lock();
         impl->mStopping = true;
         impl->mStartStopLock.unlock();
+        TKLog::printf("Failed to open the serial port. giving up!");
         return;
     }
 
index e9e2641..72a267f 100644 (file)
@@ -35,7 +35,7 @@ DNTimeKeeperImpl *DNTimeKeeperImpl::create()
     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)
 {
 }
 
@@ -46,7 +46,6 @@ QtDNTimeKeeperImpl::~QtDNTimeKeeperImpl()
 bool  QtDNTimeKeeperImpl::setIntevalSec(float time)
 {
     mIntervalTime = time * 1000;
-    mAvgActualInterval = time * 1000;
     mAdjustTime = 0.0;
     return true;
 }
@@ -59,16 +58,19 @@ bool  QtDNTimeKeeperImpl::sleepUntilNextInterval()
     }
     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;
@@ -85,7 +87,6 @@ bool QtDNTimeKeeperImpl::start()
 {
     mStartTime = QDateTime::currentMSecsSinceEpoch();
     mPrevTime = mStartTime;
-    mAvgActualInterval = mIntervalTime;
     mAdjustTime = 0.0;
     mTickTime = 0.0;
     return true;
index 46ea475..d5386d3 100644 (file)
@@ -37,7 +37,6 @@ public:
     virtual bool    stop();
 private:
     qint64          mIntervalTime;
-    float           mAvgActualInterval;
     float           mAdjustTime;
     qint64          mPrevTime;
     qint64          mStartTime;