110 lines
2.7 KiB
Python
110 lines
2.7 KiB
Python
from PySide6.QtCore import Signal, QObject
|
||
from convert import int16_to_float, float_to_int16
|
||
|
||
|
||
class Reg(QObject):
|
||
signal_val_updated = Signal()
|
||
def __init__(self, addr, com_interface):
|
||
# 通信地址
|
||
super().__init__()
|
||
self.addr = addr
|
||
self.val = 0
|
||
self.interface = com_interface
|
||
|
||
# 从读取命令发送到消息队列
|
||
def read(self):
|
||
self.interface.put(self.addr)
|
||
|
||
# 将write命令发送到消息队列
|
||
def write(self, val):
|
||
self.interface.put(self.addr, val)
|
||
|
||
def update(self, val):
|
||
self.val = val
|
||
self.signal_val_updated.emit()
|
||
|
||
|
||
class RegProxy(object):
|
||
signal_val_updated = Signal()
|
||
def __init__(self, name, start_id):
|
||
self.name = name
|
||
self.val = 0
|
||
self.set_val = 0
|
||
# 默认所有参数都是float型的,16-bits * 2
|
||
self.regs: list[Reg] =list([
|
||
Reg(start_id + i) for i in range(2)]
|
||
)
|
||
|
||
for item_reg in self.regs:
|
||
item_reg.signal_val_updated.connect(self.__compute)
|
||
|
||
def set(self, val):
|
||
self.set_val = val
|
||
# unpack() 然后写入各个寄存器
|
||
# self.reg.write(self.set_val)
|
||
|
||
def get(self):
|
||
# self.reg.read()
|
||
pass
|
||
|
||
def __compute(self):
|
||
self.val = int16_to_float(self.regs[0].val, self.regs[1].val)
|
||
self.signal_val_updated.emit()
|
||
|
||
def val(self):
|
||
return self.val
|
||
|
||
|
||
|
||
class Param(object):
|
||
signal_val_updated = Signal()
|
||
def __init__(self, name, _id, length):
|
||
self.name = name
|
||
self.id = _id
|
||
self.len = length
|
||
self.ele: [RegProxy] = []
|
||
|
||
def elements(self) -> list[RegProxy]:
|
||
return self.ele
|
||
|
||
def on_reg_proxy_updated(self):
|
||
self.signal_val_updated.emit()
|
||
|
||
# 从设备获取每个reg的值
|
||
def refresh(self):
|
||
pass
|
||
|
||
# 更新update的指
|
||
def update(self, val_list):
|
||
pass
|
||
|
||
# 更新指定的值
|
||
def update_one(self, idx, val):
|
||
pass
|
||
|
||
# 普通参数 - 单元素
|
||
class ParamNormal(Param):
|
||
def __init__(self, name, _id):
|
||
super().__init__(name, _id, 1)
|
||
self.ele = [
|
||
RegProxy(name, self.id)
|
||
]
|
||
|
||
# 数组参数 - 多元素
|
||
class ParamArray(Param):
|
||
def __init__(self, name, _id, length):
|
||
super().__init__(name, _id, length)
|
||
self.len = length
|
||
self.ele = [
|
||
RegProxy(f'{name}-{i}', self.id + (i*2)) for i in range(length)
|
||
]
|
||
|
||
|
||
if __name__ == '__main__':
|
||
array1 = ParamArray('test', 1000, 10)
|
||
array2 = ParamArray('2', 2000, 125)
|
||
for item in array1.elements():
|
||
print(item.name)
|
||
print(item.val)
|
||
for reg in item.regs:
|
||
print(reg.addr) |