package utils import ( "math" "strconv" "github.com/AFASystems/presence/internal/pkg/model" ) // CalculateDistance calculates the approximate distance from RSSI and TX power // Uses a hybrid approach combining logarithmic and polynomial models func CalculateDistance(adv model.BeaconAdvertisement) float64 { txPower := twosComp(adv.TXPower) ratio := float64(adv.RSSI) / float64(txPower) if ratio < 1.0 { return math.Pow(ratio, 10) } else { return (0.89976)*math.Pow(ratio, 7.7095) + 0.111 } } // TwosComp converts a two's complement hexadecimal string to int64 func twosComp(inp string) int64 { i, err := strconv.ParseInt("0x"+inp, 0, 64) if err != nil { return 0 } if i >= 128 { return i - 256 } return i } // 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 }