|
@@ -1,7 +1,13 @@
|
|
|
|
|
+import struct
|
|
|
from abc import abstractmethod, ABCMeta
|
|
from abc import abstractmethod, ABCMeta
|
|
|
|
|
+from typing import Tuple
|
|
|
|
|
+from nbus_hal.nbus_generic_port import NBusPort
|
|
|
|
|
+from nbus_types.nbus_command_type import NBusCommand, NBusInfoParam
|
|
|
from nbus_types.nbus_data_fomat import *
|
|
from nbus_types.nbus_data_fomat import *
|
|
|
from nbus_types.nbus_parameter_type import *
|
|
from nbus_types.nbus_parameter_type import *
|
|
|
-from nbus_types.nbus_address_type import NBusDeviceAddress
|
|
|
|
|
|
|
+from nbus_types.nbus_address_type import NBusDeviceAddress, NBusModuleAddress
|
|
|
|
|
+from nbus_types.nbus_sensor_type import NBusSensorType
|
|
|
|
|
+from nbus_api.nbus_common_parser import NbusCommonParser
|
|
|
|
|
|
|
|
|
|
|
|
|
@beartype
|
|
@beartype
|
|
@@ -9,9 +15,10 @@ class NBusSlaveDevice(metaclass=ABCMeta):
|
|
|
|
|
|
|
|
def __init__(self, address: NBusDeviceAddress):
|
|
def __init__(self, address: NBusDeviceAddress):
|
|
|
self.__address = address
|
|
self.__address = address
|
|
|
|
|
+ self.__module_address = None
|
|
|
|
|
+ self.__port = None
|
|
|
self.__data_format = None
|
|
self.__data_format = None
|
|
|
- self.__parameters = None
|
|
|
|
|
-
|
|
|
|
|
|
|
+ self.__parameters = {}
|
|
|
|
|
|
|
|
@property
|
|
@property
|
|
|
def address(self):
|
|
def address(self):
|
|
@@ -33,14 +40,20 @@ class NBusSlaveDevice(metaclass=ABCMeta):
|
|
|
def parameters(self, values):
|
|
def parameters(self, values):
|
|
|
self.__parameters = values
|
|
self.__parameters = values
|
|
|
|
|
|
|
|
|
|
+ def set_parent_module_address(self, address: NBusModuleAddress):
|
|
|
|
|
+ self.__module_address = address
|
|
|
|
|
+
|
|
|
|
|
+ def set_device_port(self, port: NBusPort):
|
|
|
|
|
+ self.__port = port
|
|
|
|
|
+
|
|
|
"""
|
|
"""
|
|
|
================================================================================================================
|
|
================================================================================================================
|
|
|
- Device Interface
|
|
|
|
|
|
|
+ Abstract Methods
|
|
|
================================================================================================================
|
|
================================================================================================================
|
|
|
"""
|
|
"""
|
|
|
|
|
|
|
|
@abstractmethod
|
|
@abstractmethod
|
|
|
- def data_params_loaded(self) -> bool:
|
|
|
|
|
|
|
+ def data_parameters_loaded(self) -> bool:
|
|
|
"""
|
|
"""
|
|
|
Verify that all necessary parameters are loaded
|
|
Verify that all necessary parameters are loaded
|
|
|
before performing data get/set conversion.
|
|
before performing data get/set conversion.
|
|
@@ -50,7 +63,7 @@ class NBusSlaveDevice(metaclass=ABCMeta):
|
|
|
pass
|
|
pass
|
|
|
|
|
|
|
|
@abstractmethod
|
|
@abstractmethod
|
|
|
- def map_param_get(self, param_id: NBusParameterType, param_value: int) -> NBusParameterValue:
|
|
|
|
|
|
|
+ def map_parameter_get(self, param_id: NBusParameterID, param_value: int) -> NBusParameterValue:
|
|
|
"""
|
|
"""
|
|
|
Convert a parameter from cmd_get_param() to its engineering range.
|
|
Convert a parameter from cmd_get_param() to its engineering range.
|
|
|
|
|
|
|
@@ -61,7 +74,7 @@ class NBusSlaveDevice(metaclass=ABCMeta):
|
|
|
pass
|
|
pass
|
|
|
|
|
|
|
|
@abstractmethod
|
|
@abstractmethod
|
|
|
- def map_param_set(self, param_id: NBusParameterType, param_value: NBusParameterValue) -> int:
|
|
|
|
|
|
|
+ def map_parameter_set(self, param_id: NBusParameterID, param_value: NBusParameterValue) -> int:
|
|
|
"""
|
|
"""
|
|
|
Convert a parameter to its binary range for cmd_set_data().
|
|
Convert a parameter to its binary range for cmd_set_data().
|
|
|
|
|
|
|
@@ -90,3 +103,56 @@ class NBusSlaveDevice(metaclass=ABCMeta):
|
|
|
:return: a list of converted values in binary format
|
|
:return: a list of converted values in binary format
|
|
|
"""
|
|
"""
|
|
|
pass
|
|
pass
|
|
|
|
|
+
|
|
|
|
|
+ """
|
|
|
|
|
+ ================================================================================================================
|
|
|
|
|
+ Device Get Commands
|
|
|
|
|
+ ================================================================================================================
|
|
|
|
|
+ """
|
|
|
|
|
+
|
|
|
|
|
+ def cmd_get_param(self, parameter: NBusParameterID) -> Tuple[NBusParameterID, NBusParameterValue]:
|
|
|
|
|
+ # get response
|
|
|
|
|
+ resp_len, *response = self.__port.request_device(self.__module_address, self.__address,
|
|
|
|
|
+ NBusCommand.CMD_GET_PARAM, bytearray([parameter.value]))
|
|
|
|
|
+
|
|
|
|
|
+ param_id, param_val_raw = NbusCommonParser.parameters_from_response(resp_len, response)[0]
|
|
|
|
|
+ param_val = self.map_parameter_get(param_id, param_val_raw)
|
|
|
|
|
+
|
|
|
|
|
+ self.__parameters[param_id] = param_val
|
|
|
|
|
+
|
|
|
|
|
+ return param_id, param_val
|
|
|
|
|
+
|
|
|
|
|
+ def cmd_get_all_params(self) -> list[Tuple[NBusParameterID, NBusParameterValue]]:
|
|
|
|
|
+ resp_len, *response = self.__port.request_device(self.__module_address, self.__address,
|
|
|
|
|
+ NBusCommand.CMD_GET_PARAM, bytearray([]))
|
|
|
|
|
+
|
|
|
|
|
+ params_raw = NbusCommonParser.parameters_from_response(resp_len, response)
|
|
|
|
|
+
|
|
|
|
|
+ params = []
|
|
|
|
|
+
|
|
|
|
|
+ for param_id, param_val_raw in params_raw:
|
|
|
|
|
+ param_val = self.map_parameter_get(param_id, param_val_raw)
|
|
|
|
|
+
|
|
|
|
|
+ params.append((param_id, param_val))
|
|
|
|
|
+ self.__parameters[param_id] = param_val
|
|
|
|
|
+
|
|
|
|
|
+ return params
|
|
|
|
|
+
|
|
|
|
|
+ def cmd_get_data(self):
|
|
|
|
|
+ _, *resp = self.__port.request_device(self.__module_address, self.__address, NBusCommand.CMD_GET_DATA, bytearray([]))
|
|
|
|
|
+ values, _ = NbusCommonParser.data_from_response(self, resp)
|
|
|
|
|
+ return values
|
|
|
|
|
+
|
|
|
|
|
+ def cmd_get_sensor_type(self):
|
|
|
|
|
+ _, *response = self.__port.request_device(self.__module_address, self.__address, NBusCommand.CMD_GET_SENSOR_TYPE,
|
|
|
|
|
+ bytearray([]))
|
|
|
|
|
+ return NBusSensorType(response[0])
|
|
|
|
|
+
|
|
|
|
|
+ def cmd_get_info(self, parameter: NBusInfoParam):
|
|
|
|
|
+ _, *response = self.__port.request_device(self.__module_address, self.__address, NBusCommand.CMD_GET_INFO,
|
|
|
|
|
+ bytearray([parameter.value]))
|
|
|
|
|
+
|
|
|
|
|
+ if parameter == NBusInfoParam.INFO_FORMAT:
|
|
|
|
|
+
|
|
|
|
|
+ self.data_format = NbusCommonParser.format_from_response(response)
|
|
|
|
|
+ return self.data_format
|