source: libs/QtGui/src/SgModule.cpp @ 445

Revision 445, 5.4 KB checked in by lmalek, 10 years ago (diff)

Samgar edition by WRUT. Based on Qt. Initial import.

Line 
1#include "SgModule.h"
2#include <iostream>
3
4namespace Sg
5{
6    // static fields declarations
7    SgNameType SgModule::portForModulesName("/PortForModules");
8    SgPortDataType SgModule::portForModules;
9
10
11    SgModule::SgModule(const SgNameType newName, const SgObject * parentObject): SgObject(newName, parentObject), category(""),
12            subCategory(""), active("false"), ports(this)
13    {
14        fullName = SgModule::FullModuleName(*this);
15        //refreshState();
16    }
17
18    SgModule::SgModule(const SgNameType newName, const std::string newCategory,
19                       const std::string newSubCategory, const bool newActive, const SgObject * parentObject):
20             SgObject(newName,parentObject), category(newCategory), subCategory(newSubCategory), active(newActive), ports(this)
21    {
22        fullName = SgModule::FullModuleName(*this);
23        //refreshState();
24    }
25
26    SgModule::~SgModule()
27    {
28        //yarp::os::Network::unregisterName(fullName.c_str());
29    }
30
31    void SgModule::setCategory(const std::string newCategory)
32    {
33        this->category = newCategory;
34        modified();
35    }
36
37    void SgModule::setSubCategory(const std::string newSubCategory)
38    {
39        this->subCategory = newSubCategory;
40        modified();
41    }
42
43    void SgModule::setActive(const bool newActive)
44    {
45        this->active = newActive;
46        modified();
47    }
48
49    const std::string SgModule::getCategory() const
50    {
51        return this->category;
52    }
53
54    const std::string SgModule::getSubCategory() const
55    {
56        return this->subCategory;
57    }
58
59    bool SgModule::getActive() const
60    {
61        return this->active;
62    }
63
64    SgPortContainer& SgModule::getPorts()
65    {
66        return this->ports;
67    }
68
69    /**
70     *  Adds a port to the list and screen also sets its group id to its
71     *  parent module
72     */
73
74    bool SgModule::addPort(const SgNameType &newPortName)
75    {
76        return ports.add(newPortName);
77    }
78
79    bool SgModule::delPort(const SgNameType &portName)
80    {
81        return ports.del(portName);
82    }
83
84
85    bool YARPexists(std::string portName)
86    {
87        static FILE *inpipe;
88        char inbuf[200];
89
90        inpipe =  popen((std::string("yarp exists ")+portName+" ; echo $?").c_str(),"r");
91        //std::cout << (std::string("yarp exists ")+portName+" ; echo $?").c_str() << std::endl;
92        if (!inpipe){ std::cout<<"PING FAILED"<<std::endl;}
93        else
94        {
95            if (fgets(inbuf, sizeof(inbuf), inpipe))
96              {
97                std::string mystring = inbuf;
98                if (inbuf[0]=='0') {
99                    pclose(inpipe);
100                    return true;
101                }
102              }               
103        }
104        pclose(inpipe);
105        return false;
106    }
107
108    bool SgModule::refreshState()
109    {
110        if (SgModule::portForModules.isClosed()) {// AddToLog("Attempting to recover local port \n",2);
111            SgModule::portForModules.open(SgModule::portForModulesName.c_str());
112        }
113
114        std::string fullName = "/Main_" + this->name; // full name of the yarp module to check
115        if (!YARPexists(fullName))
116        {
117            if (this->active)
118                this->setActive(false);
119            //yarp::os::Network::unregisterName(fullName.c_str());
120            //yarp::os::Network::registerName(fullName.c_str());
121            //yarp::os::Network::sync(fullName.c_str(), true);
122            /*
123        for (SgPortContainerIterator iter = ports.begin(); iter != ports.end(); iter++)
124        {
125            if ( (*iter) != NULL)
126            {
127                if ( !yarp::os::Network::queryName((*iter)->getFullName().c_str()).isValid() )
128                {
129                    std::cout << "X: " << (*iter)->getFullName() << std::endl;
130                    //yarp::os::Network::unregisterName((*iter)->getFullName().c_str());
131                    //yarp::os::Network::registerName((*iter)->getFullName().c_str());
132                    //yarp::os::Network::sync((*iter)->getFullName().c_str());
133                }
134            }
135        }
136        */
137            return false;
138    }
139        else
140        //ought to be check for connection and if not connected then reconnect;
141        //check if directional connection betwean our port and other module is down
142        if(yarp::os::Network::isConnected(fullName.c_str(), SgModule::portForModulesName.c_str(),true)==false ||
143           yarp::os::Network::isConnected(SgModule::portForModulesName.c_str(), fullName.c_str(),true)==false)
144        {
145            // try to set up bidirectional TCP connection
146            if(yarp::os::Network::connect(fullName.c_str(),SgModule::portForModulesName.c_str(),"tcp",false)==false ||
147               yarp::os::Network::connect(SgModule::portForModulesName.c_str(), fullName.c_str(),"tcp",false)==false)
148            {
149                if (this->active) // AddToLog("The module Main_" + this->name + " is in error \n",2);
150                    this->setActive(false);
151            }
152            else {
153                if (!this->active) //AddToLog("The module Main_" + this->name + " is working \n",1);
154                {
155                    this->setActive(true);
156                    yarp::os::Bottle& cc = Sg::SgModule::portForModules.prepare();
157                    cc.clear();
158                    cc.addInt(Samgar::ModuleStateInfoCode);
159                    cc.addString(name.c_str());
160                    Sg::SgModule::portForModules.write();
161                }
162            }
163        }
164        return this->active;
165    }
166
167
168} // namespace Sg (END)
Note: See TracBrowser for help on using the repository browser.