Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions examples/core_temp_scan.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

from openant.easy.node import Node
from openant.devices import ANTPLUS_NETWORK_KEY
from openant.devices.core_temp import CoreTemperature, CoteTemperatureData
from openant.devices.core_temp import CoreTemperature, CoreTemperatureData


def main(device_id=0):
Expand All @@ -16,7 +16,7 @@ def on_found():
print(f"Device {device} found and receiving")

def on_device_data(page: int, page_name: str, data):
# if isinstance(data, CoteTemperatureData):
# if isinstance(data, CoreTemperatureData):
print(f"Data: ", data)

device.on_found = on_found
Expand Down
2 changes: 2 additions & 0 deletions openant/devices/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
from . import lev
from . import bike_speed_cadence
from . import environment
from . import core_temp

# standard ANT+ network key
ANTPLUS_NETWORK_KEY = [0xB9, 0xA5, 0x21, 0xFB, 0xBD, 0x72, 0xC3, 0x45]
Expand All @@ -28,6 +29,7 @@
common.DeviceType.BikeSpeed: bike_speed_cadence.BikeSpeed,
common.DeviceType.BikeCadence: bike_speed_cadence.BikeCadence,
common.DeviceType.BikeSpeedCadence: bike_speed_cadence.BikeSpeedCadence,
common.DeviceType.CoreTemp: core_temp.CoreTemperature,
}

__all__ = [
Expand Down
1 change: 1 addition & 0 deletions openant/devices/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ class DeviceType(Enum):
Radar = 40
Shifting = 34
DropperSeatpost = 115
CoreTemp = 127

@classmethod
def _missing_(cls, _): # type: ignore
Expand Down
62 changes: 48 additions & 14 deletions openant/devices/core_temp.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,29 +7,43 @@
from ..easy.node import Node
from .common import DeviceData, AntPlusDevice, DeviceType, BatteryStatus

# Since these are used as data values, they must be floats

HEAT_STRAIN_INDEX_INVALID = float(0xFF)

CORE_TEMP_INVALID = float(0x8000)

SKIN_TEMP_INVALID = float(0x800)

RESERVED_INVALID = float(0x800)

_logger = logging.getLogger(__name__)


class CoreTempDataQuality(Enum):
Poor = 0
Fair = 1
Good = 2
Excelent = 3
Excellent = 3

Unused = 0xFF

@classmethod
def _missing_(cls, _):
return PressureSensorAlarm.Unknown
return CoreTempDataQuality.Unused


@dataclass
class CoteTemperatureData(DeviceData):
class CoreTemperatureData(DeviceData):
"""ANT+ core temp data"""

quality: CoreTempDataQuality = None
skin_temp: float = field(default=0, metadata={"unit": "°C"})
core_temp: float = field(default=0, metadata={"unit": "°C"})
quality: CoreTempDataQuality = CoreTempDataQuality.Unused
skin_temp: float = field(default=SKIN_TEMP_INVALID, metadata={"unit": "°C"})
core_temp: float = field(default=CORE_TEMP_INVALID, metadata={"unit": "°C"})
heat_strain_index: float = field(
default=HEAT_STRAIN_INDEX_INVALID, metadata={"unit": "a.u."}
)
reserved: int = field(default=RESERVED_INVALID, metadata={"unit": ""})


class CoreTemperature(AntPlusDevice):
Expand All @@ -51,7 +65,7 @@ def __init__(

self._event_count = [0, 0]

self.data = {**self.data, "core_temp": CoteTemperatureData()}
self.data = {**self.data, "core_temp": CoreTemperatureData()}

def on_data(self, data):
page = data[0]
Expand All @@ -64,12 +78,32 @@ def on_data(self, data):

# core temp main page
elif page == 0x01:
self._event_cout = data[1]
self.data["core_temp"].skin_temp = (
data[3] | ((data[4] & 0xF0) << 4)
) * 0.05
self.data["core_temp"].core_temp = (
int.from_bytes(data[6:8], byteorder="little") * 0.01
)
self._event_count[0] = self._event_count[1]
self._event_count[1] = data[2]

heat_strain_index_value = data[1]
skin_temp_value = data[3] | ((data[4] & 0xF0) << 4)
core_temp_value = int.from_bytes(data[6:8], byteorder="little")
reserved_value = int((data[5] << 4) | (data[4] & 0x0F))

if skin_temp_value == SKIN_TEMP_INVALID:
self.data["core_temp"].skin_temp = SKIN_TEMP_INVALID
else:
self.data["core_temp"].skin_temp = skin_temp_value * 0.05

if core_temp_value == CORE_TEMP_INVALID:
self.data["core_temp"].core_temp = CORE_TEMP_INVALID
else:
self.data["core_temp"].core_temp = core_temp_value * 0.01

if heat_strain_index_value == HEAT_STRAIN_INDEX_INVALID:
self.data["core_temp"].heat_strain_index = HEAT_STRAIN_INDEX_INVALID
else:
self.data["core_temp"].heat_strain_index = heat_strain_index_value * 0.1

if reserved_value == RESERVED_INVALID:
self.data["core_temp"].reserved = RESERVED_INVALID
else:
self.data["core_temp"].reserved = reserved_value

self.on_device_data(page, "core_temp", self.data["core_temp"])