18 #include "start-inspect.h"
19 #include <yarp/os/Log.h>
20 #include <yarp/os/LogStream.h>
23 bool STARTModule::configure(yarp::os::ResourceFinder &rf)
25 moduleName = rf.check(
"name", yarp::os::Value(
"interpretSTART"),
"module name (string)").asString();
27 setName(moduleName.c_str());
29 handlerPortName =
"/";
30 handlerPortName += getName();
31 handlerPortName +=
"/rpc:i";
33 if (!rpcPort.open(handlerPortName.c_str()))
35 yError(
"%s : Unable to open port %s\n", getName().c_str(), handlerPortName.c_str());
42 startManager =
new STARTManager( moduleName );
51 bool STARTModule::interruptModule()
58 bool STARTModule::close()
61 yInfo(
"starting the shutdown procedure\n");
62 startManager->interrupt();
63 startManager->close();
64 yInfo(
"deleting thread\n");
66 yInfo(
"done deleting thread\n");
71 bool STARTModule::updateModule()
77 double STARTModule::getPeriod()
83 STARTManager::~STARTManager()
89 STARTManager::STARTManager(
const std::string &moduleName )
91 yInfo(
"initialising Variables\n");
92 this->moduleName = moduleName;
97 bool STARTManager::open()
102 inSpeechPortName =
"/" + moduleName +
"/speech:i";
103 BufferedPort<yarp::os::Bottle >::open( inSpeechPortName.c_str() );
105 outSTARTPortName =
"/" + moduleName +
"/start:o";
106 startOutPort.open( outSTARTPortName.c_str() );
108 yarp::os::Network::connect(
"/start-speech/start:o", inSpeechPortName);
114 void STARTManager::close()
116 yInfo(
"now closing ports...\n");
117 startOutPort.close();
118 BufferedPort<yarp::os::Bottle >::close();
119 yInfo(
"finished closing the read port...\n");
123 void STARTManager::interrupt()
125 yInfo(
"cleaning up...\n");
126 yInfo(
"attempting to interrupt ports\n");
127 BufferedPort<yarp::os::Bottle >::interrupt();
128 yInfo(
"finished interrupt ports\n");
132 void STARTManager::onRead(yarp::os::Bottle &bot)
134 yarp::os::Bottle &
final = startOutPort.prepare();
137 yInfo(
"bot size = %d", bot.size());
139 std::vector<std::string> action;
140 std::string query = bot.get(0).asList()->toString();
145 yInfo(
"Got a special query: %s ", query.c_str());
146 action.push_back( bot.get(0).asList()->get(0).asString().c_str());
147 yarp::os::Bottle &list =
final.addList();
148 yarp::os::Bottle &actList = list.addList();
149 actList.addString(
"verb");
150 action[0][0] = toupper(action[0][0]);
151 actList.addString(action[0].c_str());
156 yInfo(
"Got a new query: %s ", query.c_str());
158 size_t sizeBot = bot.get(1).asList()->size();
160 objectDetails =
new Object [bot.get(0).asList()->size()];
162 std::vector<std::string> subject;
166 std::string tmpString;
167 std::string location;
168 std::string tmpAction;
172 for (
size_t i=0; i< sizeBot; i++)
175 std::string param1 = bot.get(1).asList()->get(i).asList()->get(1).asString().c_str();
176 std::string param2 = bot.get(1).asList()->get(i).asList()->get(2).asString().c_str();
178 if (strcmp(param1.c_str(),
"hasdet") == 0 && (strcmp(param2.c_str(),
"definite") == 0 || strcmp(param2.c_str(),
"indefinite") == 0) ){
179 objectDetails[numObjects].name = bot.get(1).asList()->get(i).asList()->get(0).asString().c_str();
183 if (strcmp(param1.c_str(),
"ismain") == 0 && strcmp(param2.c_str(),
"Yes") == 0){
184 action.push_back(bot.get(1).asList()->get(i).asList()->get(0).asString().c_str());
185 tmpString = action[numActions].c_str();
188 for (
int y=0; y<numActions; y++){
190 if (strcmp(action[y].c_str(),
"be" ) == 0){
191 for (
size_t i=0; i< sizeBot; i++){
192 std::string param1 = bot.get(1).asList()->get(i).asList()->get(0).asString().c_str();
193 std::string param2 = bot.get(1).asList()->get(i).asList()->get(1).asString().c_str();
194 if (strcmp(param1.c_str(), action[y].c_str()) == 0 && strcmp(param2.c_str(),
"haslocation") == 0){
195 action.erase(std::remove(action.begin(), action.end(), tmpString), action.end());
196 action.push_back(bot.get(1).asList()->get(i).asList()->get(2).asString().c_str());
200 if (strcmp(action[y].c_str(),
"isa" ) == 0){
201 for (
size_t i=0; i< sizeBot; i++){
202 std::string param1 = bot.get(1).asList()->get(i).asList()->get(1).asString().c_str();
203 std::string param2 = bot.get(1).asList()->get(i).asList()->get(2).asString().c_str();
204 if (strcmp(param1.c_str(), action[y].c_str()) == 0){
205 action.erase(std::remove(action.begin(), action.end(), tmpString), action.end());
206 action.push_back(param2.c_str());
211 for (
size_t i=0; i< sizeBot; i++){
212 std::string param1 = bot.get(1).asList()->get(i).asList()->get(0).asString().c_str();
213 std::string param2 = bot.get(1).asList()->get(i).asList()->get(1).asString().c_str();
214 std::string param3 = bot.get(1).asList()->get(i).asList()->get(2).asString().c_str();
216 if (strcmp(param1.c_str(), action[y].c_str()) == 0 && (strcmp(param2.c_str(),
"to") == 0 || (strcmp(param2.c_str(),
"on") == 0) || (strcmp(param2.c_str(),
"from") == 0))){
217 yInfo(
" action %s param1 %s param2 %s param3 %s", action[y].c_str(), param1.c_str(), param2.c_str(), param3.c_str());
219 tmpAction = action[y].c_str();
221 tmpAction[0] = toupper(tmpAction[0]);
222 location = param3.c_str();
232 if (numActions > numObjects){
234 objectDetails[numObjects-(numObjects/2)].name = objectDetails[numObjects-numObjects].name.c_str();
237 for (
int y=0; y< numActions; y++){
238 for (
size_t i=0; i< sizeBot; i++){
239 std::string param1 = bot.get(1).asList()->get(i).asList()->get(0).asString().c_str();
240 std::string param2 = bot.get(1).asList()->get(i).asList()->get(1).asString().c_str();
241 std::string param3 = bot.get(1).asList()->get(i).asList()->get(2).asString().c_str();
243 if (strcmp(param2.c_str(), action[y].c_str()) == 0 && strcmp(param3.c_str(), objectDetails[y].name.c_str()) == 0){
244 subject.push_back(param1.c_str());
252 if (subject.size() < 1)
253 subject.push_back(
"you");
255 subject.erase(std::remove(subject.begin(), subject.end(),
""), subject.end());
256 subject.push_back(
"you");
258 for (
size_t y=0; y< subject.size(); y++){
259 for (
size_t i=0; i< sizeBot; i++){
260 std::string param1 = bot.get(1).asList()->get(i).asList()->get(0).asString().c_str();
261 std::string param2 = bot.get(1).asList()->get(i).asList()->get(1).asString().c_str();
262 std::string param3 = bot.get(1).asList()->get(i).asList()->get(2).asString().c_str();
265 if (strcmp(param1.c_str(), subject[y].c_str()) == 0 && strcmp(param2.c_str(),
"hasproperty") == 0){
267 std::string adj = param3.c_str();
269 for (
size_t i=0; i< sizeBot; i++){
270 std::string param1 = bot.get(1).asList()->get(i).asList()->get(0).asString().c_str();
271 std::string param2 = bot.get(1).asList()->get(i).asList()->get(1).asString().c_str();
272 std::string param3 = bot.get(1).asList()->get(i).asList()->get(2).asString().c_str();
274 if (strcmp(param1.c_str(), adj.c_str()) == 0 && strcmp(param2.c_str(),
"hascategory") == 0 && strcmp(param3.c_str(),
"adj") == 0){
284 for (
size_t i=0; i< sizeBot; i++){
285 std::string param1 = bot.get(1).asList()->get(i).asList()->get(1).asString().c_str();
287 if ( strcmp(param1.c_str(),
"hasproperty") == 0 ){
288 objectDetails[numObjects].name = bot.get(1).asList()->get(i).asList()->get(0).asString().c_str();
295 for (
int y=0; y< numObjects; y++){
296 for (
int i=0; i< sizeBot; i++)
298 std::string param1 = bot.get(1).asList()->get(i).asList()->get(0).asString().c_str();
299 std::string param2 = bot.get(1).asList()->get(i).asList()->get(1).asString().c_str();
300 std::string param3 = bot.get(1).asList()->get(i).asList()->get(2).asString().c_str();
302 if (strcmp(param1.c_str(), objectDetails[y].name.c_str()) == 0 && strcmp(param2.c_str(),
"hasproperty") == 0){
304 objectDetails[y].property.push_back(param3.c_str());
310 bool isProperty =
false;
311 for (
size_t i=0; i< sizeBot; i++){
312 std::string param1 = bot.get(1).asList()->get(i).asList()->get(0).asString().c_str();
313 std::string param2 = bot.get(1).asList()->get(i).asList()->get(1).asString().c_str();
314 std::string param3 = bot.get(1).asList()->get(i).asList()->get(2).asString().c_str();
315 if (strcmp(param2.c_str(),
"relatedto") == 0 )
321 for (
size_t i=0; i<numActions; i++){
322 yarp::os::Bottle &list =
final.addList();
323 yarp::os::Bottle &subjList = list.addList();
324 yarp::os::Bottle &actList = list.addList();
326 subjList.addString(
"subject");
327 subject[i][0] = toupper(subject[i][0]);
328 subjList.addString(subject[i].c_str());
330 actList.addString(
"verb");
331 action[i][0] = toupper(action[i][0]);
332 actList.addString(action[i].c_str());
334 yDebug() <<
"location is" << location.c_str() <<
"tmpAction is " << tmpAction.c_str() <<
"action is " << action[i].c_str();
336 if (location.size()>0 && strcmp(tmpAction.c_str(), action[i].c_str()) == 0 ){
337 yarp::os::Bottle &posList = list.addList();
338 posList.addString(
"location");
340 posList.addString(location.c_str());
343 for (
int i=0; i<numObjects; i++){
346 if (strcmp(location.c_str(), objectDetails[i].name.c_str()) == 0 ){
347 yInfo(
"AVOIDING object as location is equal to object %s", objectDetails[i].name.c_str());
351 yarp::os::Bottle &objList = list.addList();
353 objList.addString(
"property");
357 objList.addString(
"object");
359 objectDetails[i].name[0] = toupper(objectDetails[i].name[0]);
360 objList.addString(objectDetails[i].name.c_str());
362 if (objectDetails[i].property.size() > 0){
363 yarp::os::Bottle &propList = list.addList();
364 propList.addString(
"properties");
365 yarp::os::Bottle &propElem = propList.addList();
366 for (
size_t y=0; y<objectDetails[i].property.size(); y++){
367 objectDetails[i].property[y][0] = toupper(objectDetails[i].property[y][0]);
368 propElem.addString(objectDetails[i].property[y].c_str());
378 if (
final.size() < 1)
379 yError(
"Something is wrong with the reply from START");
381 yInfo(
"output is: %s \n",
final.toString().c_str());
384 startOutPort.write();