st-ten-1/src/components/dummies/Automation/BDaq/DeviceCtrl.py
2023-03-30 12:06:45 +02:00

204 lines
6.9 KiB
Python

#!/usr/bin/python
# -*- coding:utf-8 -*-
from ctypes import c_int32, c_byte, c_uint8
from ctypes import create_unicode_buffer
from ctypes import pointer
from dummies.Automation.BDaq.BDaqApi import TArray, TerminalBoard
from dummies.Automation.BDaq.BDaqApi import TDeviceCtrl, BioFailed
from dummies.Automation.BDaq import ErrorCode
from dummies.Automation.BDaq import Utils
class DeviceCtrl(object):
def __init__(self, nativeDev):
self._nativeDev = nativeDev
# method
def refresh(self):
return ErrorCode.lookup(TDeviceCtrl.Refresh(self._nativeDev))
def readRegister(self, space, offset, length):
dataArr = (c_byte * length)()
data = []
ret = TDeviceCtrl.ReadRegister(self._nativeDev, space, offset, length, dataArr)
if not BioFailed(ret):
for i in range(length):
data.append(dataArr[i])
return ErrorCode.lookup(ret), data
def writeRegister(self, space, offset, length, data):
if not isinstance(data, list):
raise TypeError('a list is required')
if length != len(data):
raise ValueError('Length mismatch: length:%d, len(data):%d' % (length, len(data)))
dataArr = (c_byte * length)()
for i in range(length):
dataArr[i] = data[i]
ret = TDeviceCtrl.WriteRegister(self._nativeDev, space, offset, length, dataArr)
return ErrorCode.lookup(ret)
def readPrivateRegion(self, signature, length):
dataArr = (c_uint8 * length)()
data = []
ret = TDeviceCtrl.ReadPrivateRegion(self._nativeDev, signature, length, dataArr)
if not BioFailed(ret):
for i in range(length):
data.append(dataArr[i])
return ErrorCode.lookup(ret), data
def writePrivateRegion(self, signature, length, data):
if not isinstance(data, list):
raise TypeError('a list is required')
if length != len(data):
raise ValueError('Length mismatch: length:%d, len(data):%d' % (length, len(data)))
dataArr = (c_uint8 * length)()
for i in range(length):
dataArr[i] = data[i]
ret = TDeviceCtrl.WritePrivateRegion(self._nativeDev, signature, length, dataArr)
return ErrorCode.lookup(ret)
def synchronizeTimeBase(self):
return ErrorCode.lookup(TDeviceCtrl.SynchronizeTimebase(self._nativeDev))
def calculateAbsoluteTime(self, relativeTime):
if not isinstance(relativeTime, float):
raise TypeError('a float is required')
return TDeviceCtrl.CalculateAbsoluteTime(self._nativeDev, relativeTime)
# properties
@property
def deviceNumber(self):
return TDeviceCtrl.getDeviceNumber(self._nativeDev)
@property
def description(self):
descr = create_unicode_buffer(256)
TDeviceCtrl.getDescription(self._nativeDev, 256, descr)
return descr.value.encode()
@description.setter
def description(self, desc):
ret = ErrorCode.lookup(TDeviceCtrl.setDescription(self._nativeDev, len(desc), desc))
if BioFailed(ret):
raise ValueError('set description is failed, the error code is 0x%X' % (ret.value))
@property
def accessMode(self):
return Utils.toAccessMode(TDeviceCtrl.getAccessMode(self._nativeDev))
@property
def productId(self):
return Utils.toProductId(TDeviceCtrl.getProductId(self._nativeDev))
@property
def boardId(self):
return TDeviceCtrl.getBoardId(self._nativeDev)
@boardId.setter
def boardId(self, value):
ret = ErrorCode.lookup(TDeviceCtrl.setBoardId(self._nativeDev, value))
if BioFailed(ret):
raise ValueError('set boardId is failed, the error code is 0x%X' % (ret.value))
@property
def boardVersion(self):
version = create_unicode_buffer(256)
TDeviceCtrl.getBoardVersion(self._nativeDev, 256, version)
return version.value.encode()
@property
def driverVersion(self):
version = create_unicode_buffer(256)
TDeviceCtrl.getDriverVersion(self._nativeDev, 256, version)
return version.value.encode()
@property
def dllVersion(self):
version = create_unicode_buffer(256)
TDeviceCtrl.getDllVersion(self._nativeDev, 256, version)
return version.value.encode()
@property
def location(self):
version = create_unicode_buffer(256)
TDeviceCtrl.getLocation(self._nativeDev, 256, version)
return version.value.encode()
@property
def privateRegionLength(self):
return TDeviceCtrl.getPrivateRegionLength(self._nativeDev)
@property
def hotResetPreventable(self):
return TDeviceCtrl.getHotResetPreventable(self._nativeDev)
@property
def baseAddresses(self):
nativeArray = TDeviceCtrl.getBaseAddresses(self._nativeDev)
return TArray.ToInt64(nativeArray, True)
@property
def interrupts(self):
nativeArray = TDeviceCtrl.getInterrupts(self._nativeDev)
return TArray.ToInt32(nativeArray, True)
@property
def supportedTerminalBoard(self):
nativeArray = TDeviceCtrl.getSupportedTerminalBoard(self._nativeDev)
return TArray.ToTerminalBoard(nativeArray, True)
@property
def supportedEvents(self):
nativeArray = TDeviceCtrl.getSupportedEvents(self._nativeDev)
return TArray.ToEventId(nativeArray, True)
@property
def supportedScenarios(self):
return TDeviceCtrl.getSupportedScenarios(self._nativeDev)
@property
def terminalBoard(self):
return Utils.toTerminalBoard(TDeviceCtrl.getTerminalBoard(self._nativeDev))
@terminalBoard.setter
def terminalBoard(self, value):
if not isinstance(value, TerminalBoard):
raise TypeError("a TerminalBoard is required")
ret = ErrorCode.lookup(TDeviceCtrl.setTerminalBoard(self._nativeDev, value))
if BioFailed(ret):
raise ValueError('set terminalBoard is failed, the error code is 0x%X' % (ret.value))
def setLocateEnabled(self, value):
if not isinstance(value, bool):
raise TypeError('a bool is required')
return ErrorCode.lookup(TDeviceCtrl.setLocateEnabled(self._nativeDev, value))
@property
def installedDevices(self):
nativeArray = TDeviceCtrl.getInstalledDevices()
arr = TArray.toDeviceTreeNode(nativeArray, True)
return arr
def getHwSpecific(self, name):
dataArr = (c_int32 * 1)()
size = c_int32(4)
pSize = pointer(size)
data = None
ret = ErrorCode.lookup(TDeviceCtrl.getHwSpecific(self._nativeDev, name, pSize, dataArr))
if ret == ErrorCode.Success:
data = dataArr[0]
return ret, data
def setHwSpecific(self, name, data):
dataArr = (c_int32 * 1)()
dataArr[0] = data
ret = TDeviceCtrl.setHwSpecific(self._nativeDev, name, 4, dataArr)
return ErrorCode.lookup(ret)