9 #ifndef CscEntityDetectionState_h
10 #define CscEntityDetectionState_h
21 using std::chrono_literals::operator
""s, std::chrono_literals::operator
""ms, std::chrono_literals::operator
""h;
22 using std::prev, std::recursive_mutex, std::chrono::system_clock, std::chrono::duration, std::remove_if, std::chrono::duration_cast, std::chrono::milliseconds, std::function;
38 TrackHit(
unsigned long long timestampMillis,
const CscRect2d &rectangle,
bool actualDetection);
44 inline static int counter = 0;
45 vector<TrackHit *> trackingHistory;
50 const float motionIouThreshold = 0.35;
55 vector<const TrackHit *> getRecentHits(
long lastMillis)
const;
58 const int uid = counter++;
61 const system_clock::time_point firstDetectionTime = system_clock::now();
62 system_clock::time_point lastDetectionTime = system_clock::now();
63 system_clock::time_point lastActualDetectionTime = system_clock::now();
64 system_clock::time_point lastMotionTime = system_clock::now();
72 void onDetected(
const CscRect2d & newDetectionBox,
float updatedCertitude,
bool actualDetection,
const CscPoint3d * position =
nullptr,
const CscPoint3d * rotation =
nullptr);
74 operator string()
const;
76 const CscRect2d &getLastDetectionBox()
const;
77 bool isLastHitAnActualDetection()
const;
79 unsigned long long getImmobileSinceMilliseconds()
const;
85 vector<CscRect2d> getLastDetectionBoxes(optional<int> count = {})
const;
91 CscRect2d getAverageBox(optional<int> count = {})
const;
96 float getCertitude()
const;
101 int countActualDetections(
long lastMillis)
const;
106 float getActualDetectionsRatio(
long lastMillis)
const;
111 float getMotionRatio(
long lastMillis)
const;
113 bool isOlderThan(
long millis)
const;
118 int getHitsCount(
long lastMillis)
const;
123 unsigned long long getMaxDurationBetweenHits(
long observationPeriodMillis)
const;
125 CscDetectedAlert *toAlert(CscAlertTypeBuiltin alertType, optional<float> forcedCertitude = {})
const;
134 unsigned long long lastFramesWithPersonRatioCheckMillis =
nowMillis();
141 operator string()
const;
144 bool pulseDisconnectedAlertSent =
false;
145 bool redonDisconnectedAlertSent =
false;
146 bool hasReceivedCareSureValues =
false;
147 bool hasReceivedCarePulseValues =
false;
148 unsigned long long lastRedonSensorTimestamp = 0;
149 unsigned long long lastPulseSensorTimestamp = 0;
154 system_clock::time_point lastUpdateTime = system_clock::now();
156 const vector<ptr<TrackedObject>> & getTrackedObjects()
const;
165 vector<ptr<TrackedObject>> clear();
169 template <
class Rep,
class Period>
171 system_clock::time_point now = system_clock::now();
173 vector<ptr<TrackedObject>> removedObjects;
174 vector<ptr<TrackedObject>> updatedTrackedObjects;
176 if (now < (trackedObject->lastDetectionTime + maxAbsenceDuration)) {
177 updatedTrackedObjects.push_back(trackedObject);
179 removedObjects.push_back(trackedObject);
183 trackedObjects = updatedTrackedObjects;
185 return removedObjects;
192 template <
class Rep,
class Period>
194 system_clock::time_point now = system_clock::now();
196 vector<ptr<TrackedObject>> removedObjects;
197 vector<ptr<TrackedObject>> updatedTrackedObjects;
200 if (now < (trackedObject->lastActualDetectionTime + maxDuration)) {
201 updatedTrackedObjects.push_back(trackedObject);
203 removedObjects.push_back(trackedObject);
207 trackedObjects = updatedTrackedObjects;
209 return removedObjects;
214 static constexpr
unsigned long long framesWithPersonRatioPeriodMillis = 60
'000;
216 ptr<TrackedObject> getCurrentPersonFall();
221 CscEntityAlertIdentificationState &getAlertIdentificationState();
222 void resetIdentificationState();
225 milliseconds trackingMaxActualDetectionMissingDuration = 200ms;
226 milliseconds trackingMaxAbsenceDuration = 100ms;
227 vector<ptr<TrackedObject>> trackedObjects;
229 CscEntityAlertIdentificationState alertIdentificationState;
231 ptr<TrackedObject> currentPersonFall = nullptr;
232 ptr<TrackedObject> currentPersonOutsideBed = nullptr;
233 std::unique_ptr<CscLogger> logger;
238 #endif /* CscEntityDetectionState_h */