|
- package utils
-
- import (
- "math"
- "strconv"
-
- "github.com/AFASystems/presence/internal/pkg/model"
- )
-
- func CalculateDistance(adv model.BeaconAdvertisement) float64 {
- rssi := adv.RSSI
- power := adv.TXPower
- ratio := float64(rssi) * (1.0 / float64(twosComp(power)))
- distance := 100.0
- if ratio < 1.0 {
- distance = math.Pow(ratio, 10)
- } else {
- distance = (0.89976)*math.Pow(ratio, 7.7095) + 0.111
- }
- return distance
- }
-
- // TwosComp converts a two's complement hexadecimal string to int64
- func twosComp(inp string) int64 {
- i, _ := strconv.ParseInt("0x"+inp, 0, 64)
- return i - 256
- }
-
- // ValidateRSSI validates if RSSI value is within reasonable bounds
- func ValidateRSSI(rssi int64) bool {
- return rssi >= -120 && rssi <= 0
- }
-
- // ValidateTXPower validates if TX power is within reasonable bounds
- func ValidateTXPower(txPower string) bool {
- power := twosComp(txPower)
- return power >= -128 && power <= 127
- }
|