38 lines
1.2 KiB
Go
38 lines
1.2 KiB
Go
package fall
|
|
|
|
type policy struct {
|
|
suspectWindowSeconds float64
|
|
requireRapidDrop bool
|
|
rapidDropAt map[string]float64
|
|
}
|
|
|
|
func newPolicy(suspectWindowSeconds float64, requireRapidDrop bool) *policy {
|
|
return &policy{
|
|
suspectWindowSeconds: suspectWindowSeconds,
|
|
requireRapidDrop: requireRapidDrop,
|
|
rapidDropAt: make(map[string]float64),
|
|
}
|
|
}
|
|
|
|
func (policy *policy) evaluate(trackID string, poseEvidence PoseEvidence, now float64, state State) Evidence {
|
|
if !poseEvidence.Accepted {
|
|
delete(policy.rapidDropAt, trackID)
|
|
return Evidence{}
|
|
}
|
|
if poseEvidence.RapidVerticalChange {
|
|
policy.rapidDropAt[trackID] = now
|
|
}
|
|
candidate := false
|
|
if state == Suspect {
|
|
candidate = poseEvidence.HorizontalPose
|
|
} else if poseEvidence.HorizontalPose {
|
|
if !policy.requireRapidDrop {
|
|
candidate = true
|
|
} else if droppedAt, found := policy.rapidDropAt[trackID]; found {
|
|
candidate = now-droppedAt <= policy.suspectWindowSeconds
|
|
}
|
|
}
|
|
recovery := (state == Confirmed || state == Recovering) && !poseEvidence.HorizontalPose && !poseEvidence.RapidVerticalChange
|
|
return Evidence{Accepted: true, IsFallCandidate: candidate, IsRecoveryCandidate: recovery}
|
|
}
|