Source code for spinnman.model.adc_info
# Copyright (c) 2015 The University of Manchester
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import struct
from spinnman import constants
_PATTERN = struct.Struct(
"<" # Little-endian
"8H" # uint16_t adc[8]
"4h" # int16_t t_int[4]
"4h" # int16_t t_ext[4]
"4h" # int16_t fan[4]
"I" # uint32_t warning
"I") # uint32_t shutdown
[docs]class ADCInfo(object):
"""
Container for the ADC data thats been retrieved from an FPGA.
"""
__slots__ = [
"_fan_0",
"_fan_1",
"_temp_btm",
"_temp_ext_0",
"_temp_ext_1",
"_temp_top",
"_voltage_1_2a",
"_voltage_1_2b",
"_voltage_1_2c",
"_voltage_1_8",
"_voltage_3_3",
"_voltage_supply"]
def __init__(self, adc_data, offset):
"""
:param bytes adc_data:
bytes from an SCP packet containing ADC information
:raise SpinnmanInvalidParameterException:
If the message does not contain valid ADC information
"""
data = _PATTERN.unpack_from(adc_data, offset)
self._voltage_1_2c = data[1] * constants.BMP_V_SCALE_2_5
self._voltage_1_2b = data[2] * constants.BMP_V_SCALE_2_5
self._voltage_1_2a = data[3] * constants.BMP_V_SCALE_2_5
self._voltage_1_8 = data[4] * constants.BMP_V_SCALE_2_5
self._voltage_3_3 = data[6] * constants.BMP_V_SCALE_3_3
self._voltage_supply = data[7] * constants.BMP_V_SCALE_12
self._temp_top = float(data[8]) * constants.BMP_TEMP_SCALE
self._temp_btm = float(data[9]) * constants.BMP_TEMP_SCALE
if data[12] != constants.BMP_MISSING_TEMP:
self._temp_ext_0 = (float(data[12]) * constants.BMP_TEMP_SCALE)
else:
self._temp_ext_0 = None
if data[13] != constants.BMP_MISSING_TEMP:
self._temp_ext_1 = (float(data[13]) * constants.BMP_TEMP_SCALE)
else:
self._temp_ext_1 = None
if data[16] != constants.BMP_MISSING_FAN:
self._fan_0 = float(data[16])
else:
self._fan_0 = None
if data[17] != constants.BMP_MISSING_FAN:
self._fan_1 = float(data[17])
else:
self._fan_1 = None
@property
def voltage_1_2c(self):
"""
Actual voltage of the 1.2V c supply rail.
:rtype: float
"""
return self._voltage_1_2c
@property
def voltage_1_2b(self):
"""
Actual voltage of the 1.2V b supply rail.
:rtype: float
"""
return self._voltage_1_2b
@property
def voltage_1_2a(self):
"""
Actual voltage of the 1.2V a supply rail.
:rtype: float
"""
return self._voltage_1_2a
@property
def voltage_1_8(self):
"""
Actual voltage of the 1.8V supply rail.
:rtype: float
"""
return self._voltage_1_8
@property
def voltage_3_3(self):
"""
Actual voltage of the 3.3V supply rail.
:rtype: float
"""
return self._voltage_3_3
@property
def voltage_supply(self):
"""
Actual voltage of the main power supply (nominally 12V).
:rtype: float
"""
return self._voltage_supply
@property
def temp_top(self):
"""
Temperature top.
:rtype: float
"""
return self._temp_top
@property
def temp_btm(self):
"""
Temperature bottom.
:rtype: float
"""
return self._temp_btm
@property
def temp_ext_0(self):
"""
Temperature external 0.
:rtype: float or None
"""
return self._temp_ext_0
@property
def temp_ext_1(self):
"""
Temperature external 1.
:rtype: float or None
"""
return self._temp_ext_1
@property
def fan_0(self):
"""
Fan 0.
:rtype: float or None
"""
return self._fan_0
@property
def fan_1(self):
"""
Fan 1.
:rtype: float or None
"""
return self._fan_1