Dependents:   ConfigurationVerifier

Files at this revision

API Documentation at this revision

Comitter:
lmarketin
Date:
Fri May 07 13:50:33 2021 +0000
Commit message:
MonitoringExecutor

Changed in this revision

monitoringExecutor.cpp Show annotated file Show diff for this revision Revisions of this file
monitoringExecutor.h Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r a75c834f4441 monitoringExecutor.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/monitoringExecutor.cpp	Fri May 07 13:50:33 2021 +0000
@@ -0,0 +1,116 @@
+#include <iterator>
+#include "monitoringExecutor.h"
+#include "circleMonitoringStrategy.h"
+#include "squareMonitoringStrategy.h"
+#include "monitoringContext.h"
+
+
+MonitoringExecutor::MonitoringExecutor(Configuration* config, Serial* pc, SRF05* ranger, PwmOut* rangerServo, PwmOut* fan, PwmOut* fanServo, DigitalOut* greenLed, DigitalOut* redLed):
+        m_config(config), m_pc(pc), m_ranger(ranger), m_rangerServo(rangerServo), m_fan(fan), m_fanServo(fanServo), m_greenLed(greenLed), m_redLed(redLed)
+{
+}
+
+MonitoringExecutor::~MonitoringExecutor()
+{
+}
+
+void MonitoringExecutor::startMonitoring()
+{
+    MonitoringContext* monitoringContext;
+    MonitoringStrategyIf* strategy;
+    ObjectPosition* objPos = new ObjectPosition(0,0);
+    
+    m_moitoringDurationTimer.start();
+    m_greenLed->write(1);
+    m_redLed->write(0);
+    
+    if(m_config->getMode() == 0) { //circle
+            strategy = new CircleMonitoringStrategy(m_config);
+        } else if(m_config->getMode() == 1) { //squere
+            strategy = new SquereMonitoringStrategy(m_config);
+        }
+    monitoringContext = new MonitoringContext(strategy);
+
+    while(checkMonitoringDurationTimer()) {
+        m_distancesMap.clear();
+        m_pc->printf("Monitoring start\n\r");
+        // m_pc->printf("----Map size: %d\n\r", m_distancesMap.size()); 
+        findObjects();
+        //m_pc->printf("----TIMER: %f\n\r", m_moitoringDurationTimer.read());
+        if(monitoringContext->executePresenceCheck(m_distancesMap, objPos)) {
+            //m_pc->printf("INFO: Object founded into monitoring area, on position -> distance:%f, angle:%f\n\r", objPos->getDistance(), objPos->getAngle());
+            m_greenLed->write(0);
+            m_redLed->write(1);
+            activateFan(objPos);
+            delete[] objPos;
+        }
+        else {
+            m_greenLed->write(1);
+            m_redLed->write(0);
+            }
+    }
+    m_moitoringDurationTimer.stop();
+    m_pc->printf("Monitoring timer exceeded. \n\r");
+    delete[] monitoringContext;
+    delete[] strategy;
+    m_greenLed->write(0);
+    m_redLed->write(0);
+}
+
+void MonitoringExecutor::findObjects()
+{
+    m_pc->printf("Find objects. \n\r");
+    for (int i = 1500; i <= 2500; i+=50) {
+        m_rangerServo->pulsewidth_us(i);
+        wait(0.2);
+        float angle = toDeeg(i-1500);
+        float dis = m_ranger->read();//-
+        m_distancesMap.insert(std::pair<float, float>(angle, dis));//for each object found set the corresponding angle and distance
+        m_pc->printf("Angle = %1.f ; Distance = %.1f; xxx: %d\n\r", toDeeg(i-1500), m_ranger->read(), i);
+    }
+    m_rangerServo->pulsewidth_us(500);
+}
+
+void MonitoringExecutor::activateFan(ObjectPosition* objPos)
+{
+    float angle;
+    float dist;
+    Timer fanDuration;
+    ObjectPosition fanPos(0, m_config->getFanYCoordinate());
+    dist = fanPos.getDistanceFromOtherObj(objPos);
+    wait(2);
+    m_pc->printf("Activate Fan.\n\r");
+    
+    if(objPos->getYCoordinate() > fanPos.getYCoordinate()) {
+        angle = 90 + (acos(objPos->getXCoordinate() / dist) *180/PI);
+    } else {
+        angle = 90 - (acos(objPos->getXCoordinate() / dist)*180/PI);
+    }
+    
+    m_fanServo->pulsewidth_us(500 + (2000 * (angle / 180)));//-
+    //m_pc->printf("---angle_pwm: %f,  angle: %f, dist_from_fan: %f \n\r", 500 + (2000 * (angle / 180)), angle, dist);//-
+    
+    wait(2);
+    m_fanWorkingDurationTimer.start();
+    m_fan->pulsewidth_us((dist/m_config->getDistance()) * 20000);//fan rotation speed depend on distance between fan and object//-
+    //m_pc->printf("---fan = %f\n\r", (dist/m_config->getDistance()) * 10000);
+    while(checkFanWorkingDurationTimer()) {
+        }
+    m_fan->pulsewidth_us(0);
+    m_fanServo->pulsewidth_us(500);
+    m_fanWorkingDurationTimer.stop();
+    m_fanWorkingDurationTimer.reset();
+}
+
+float MonitoringExecutor::toDeeg(int angle)
+{
+    return angle/50*4.5;//4.5 should be seted by config value
+}
+
+bool MonitoringExecutor::checkMonitoringDurationTimer(){
+    return m_config->getMonitoringDuration() > m_moitoringDurationTimer.read();
+}
+
+bool MonitoringExecutor::checkFanWorkingDurationTimer(){
+    return m_config->getFanWorkingDuration() > m_fanWorkingDurationTimer.read();
+}
\ No newline at end of file
diff -r 000000000000 -r a75c834f4441 monitoringExecutor.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/monitoringExecutor.h	Fri May 07 13:50:33 2021 +0000
@@ -0,0 +1,62 @@
+#ifndef MONITORINGEXECUTOR_H
+#define MONITORINGEXECUTOR_H
+
+#include <map>
+#include "mbed.h"
+#include "SRF05.h"
+#include "configuration.h"
+#include "objectPosition.h"
+
+
+using namespace std;
+
+/*
+* This class is used to execute area monitoring operation
+*/
+class MonitoringExecutor
+{
+public:
+    /**Constructor for MonitoringExecutor*/
+    MonitoringExecutor(Configuration* config, Serial* pc, SRF05* ranger, PwmOut* rangerServo, PwmOut* fan, PwmOut* fanServo, DigitalOut* greenLed, DigitalOut* redLed);
+    
+    /**Destructor for Monitoring executor*/ 
+    ~MonitoringExecutor();
+    
+    /**Start and execute monitoring process*/
+    void startMonitoring();
+
+private :
+    /**Used to monitor area. Saves the distance and position of all found objects*/
+    void findObjects();
+    
+    /**Directs the fan in the direction of the nearest object in restricted area and activates it.
+      *The operating time of the fan is determined by the configuration parameter and the rotation speed of the object distance.
+      */
+    void activateFan(ObjectPosition* objPos);
+    
+    /**Converts the servo motor positioning parameter into degrees according to the value set by the configuration*/
+    float toDeeg(int angle);
+    
+    /**Checks if the monitoring duration timer has expired*/
+    bool checkMonitoringDurationTimer();
+    
+    /**Checks if the fan working duration timer has expired*/
+    bool checkFanWorkingDurationTimer();
+
+    Configuration* m_config;
+    
+    map<float, float> m_distancesMap;// <angle, distance>
+    Timer m_moitoringDurationTimer;
+    Timer m_fanWorkingDurationTimer;
+
+    const static double PI  =3.141592653589793238463;
+    
+    Serial* m_pc;
+    SRF05* m_ranger;
+    PwmOut* m_rangerServo;
+    PwmOut* m_fan;
+    PwmOut* m_fanServo ;
+    DigitalOut* m_greenLed ;
+    DigitalOut* m_redLed ;
+};
+#endif