/** * * Version : $Id$ * This file was generated by Aldebaran Robotics ModuleGenerator */ #include "onfacedetection.h" #include #include #include #include #include OnFaceDetection::OnFaceDetection( boost::shared_ptr broker, const std::string& name): AL::ALModule(broker, name), fMemoryProxy(getParentBroker()), fFaces(AL::ALValue()), fFacesCount(0), fCallbackMutex(AL::ALMutex::createALMutex()) { setModuleDescription("This is an autogenerated module, this descriptio needs to be updated."); functionName("callback", getName(), ""); BIND_METHOD(OnFaceDetection::callback); } OnFaceDetection::~OnFaceDetection() {} void OnFaceDetection::init() { try { /** See if there is any face already detected at initialization. */ fFaces = fMemoryProxy.getData("FaceDetected"); if (fFaces.getSize() < 2) { qiLogInfo("module.example") << "No face detected" << std::endl; fTtsProxy.say("No face detected"); } /** Subscribe to the event FaceDetected, with appropriate callback function. */ fMemoryProxy.subscribeToEvent("FaceDetected", "OnFaceDetection", "callback"); } catch (const AL::ALError& e) { qiLogError("module.name") << e.what() << std::endl; } } void OnFaceDetection::callback() { /** Use a mutex to make it all thread safe. */ AL::ALCriticalSection section(fCallbackMutex); try { /** Retrieve the data raised by the event. */ fFaces = fMemoryProxy.getData("FaceDetected"); /** Check that there are faces effectively detected. */ if (fFaces.getSize() < 2 ) { if (fFacesCount != 0) { qiLogInfo("module.example") << "No face detected" << std::endl; fTtsProxy.say("No face detected."); fFacesCount = 0; } return; } /** Check the number of faces from the FaceInfo field, and check that it has * changed from the last event.*/ if (fFaces[1].getSize() - 1 != fFacesCount) { qiLogInfo("module.name") << fFaces[1].getSize() - 1 << " face(s) detected." << std::endl; char buffer[50]; sprintf(buffer, "%d faces detected.", fFaces[1].getSize() - 1); fTtsProxy.say(std::string(buffer)); /** Update the current number of detected faces. */ fFacesCount = fFaces[1].getSize() - 1; } } catch (const AL::ALError& e) { qiLogError("module.name") << e.what() << std::endl; } }