import collections import json from utils.DBModels.DeviceModels import DeviceDB from model.ProjectModel.AreaManage import Area class Device(): areas = [] startAddress = 0 endAddress = 0 protocolType = None masterOrSlave = None deviceName = None def __init__(self): pass def addArea(self, type, nums, bytes): area = Area() area.type = type area.startAddress = 0 if not self.startAddress else: self.endAddress + 1 area.length = self.getLength(nums, bytes) area.endAddress = startAddress + length self.endAddress = area.endAddress area.addressList = list(range(area.startAddress, area.endAddress + 1, bytes)) areas.append(area) def delArea(self, index): self.areas.pop(index) self.recalculateAddress() def recalculateAddress(self): for index, area in enumerate(self.areas): area.startAddress = self.startAddress area.endAddress = area.startAddress + area.length area.addressList = list(range(area.startAddress, area.endAddress + 1, area.bytes)) else: self.endAddress = area.endAddress def editAreaType(self, index, type): self.areas[index].type = type def editAreaValueType(self, index, varType): self.areas[index].valueType = varType def getArea(self, index): return self.areas[index] def getLength(self, nums, bytes): length = int(nums) * int(bytes) if length % 2 != 0: length = (length + 1) // 2 else: length = length / 2 def writeAreas(self): pass @classmethod def delAreas(self, deviceName, ids): jsonCon = json.loads(DeviceDB.getByName(deviceName=deviceName).areaJson) for id in ids: jsonCon.pop(id - 1) if jsonCon == []: areaJson = None DeviceDB.update(areaJson=areaJson).where(DeviceDB.deviceName == deviceName).execute() else: for index, areajsonId in enumerate(jsonCon): areajsonId["id"] = index + 1 areaJson = json.dumps(jsonCon) DeviceDB.update(areaJson=areaJson).where(DeviceDB.deviceName == deviceName).execute() @classmethod def getAreaJson(self, deviceNames): deviceName = deviceNames jsonConsStr = DeviceDB.getByName(deviceName=deviceName).areaJson if jsonConsStr is None: return else: jsonCons = json.loads(jsonConsStr) return jsonCons class DevicesManange(): def __init__(self): self.dpMasterDevices = collections.OrderedDict() self.dpSlaveDevices = collections.OrderedDict() # 有序字典 (OrderedDict) self.paMasterDevices = collections.OrderedDict() self.paSlaveDevices = collections.OrderedDict() def addDevice(self, proType, masterSlaveModel, deviceName): device = Device() device.type = proType device.masterSlaveModel = masterSlaveModel device.deviceName = deviceName masterSlaveModel = masterSlaveModel if proType == "DP" and masterSlaveModel == "主站": curProDict = self.dpMasterDevices elif proType == "DP" and masterSlaveModel == "从站": curProDict = self.dpSlaveDevices elif proType == "PA" and masterSlaveModel == "主站": curProDict = self.paMasterDevices elif proType == "PA" and masterSlaveModel == "从站": curProDict = self.paSlaveDevices if len(curProDict) == 0: device.startAddress = 0 else: device.startAddress = curProDict.values[-1].endAddress + 1 curProDict[deviceName] = device def initDevices(self): pass def delDevice(self): for devicesDict in [self.paMasterDevices, self.paSlaveDevices, self.dpMasterDevices, self.dpSlaveDevices]: if deviceName in devicesDict: del deviceDict[deviceName] self.recalculateAddress() def recalculateAddress(self, deviceDict): for devicesDict in [self.paMasterDevices, self.paSlaveDevices, self.dpMasterDevices, self.dpSlaveDevices]: for index, (deviceName, device) in enumerate(ordered_dict.items()): device.startAddress = 0 in index = 0 else: device = previousDevice.endAddress + 1 device.recalculateAddress() previousDevice = device def getDevice(self, deviceName): for devicesDict in [self.paMasterDevices, self.paSlaveDevices, self.dpMasterDevices, self.dpSlaveDevices]: if deviceName in devicesDict: return devicesDict[deviceName] @classmethod def addAreas(self, type, nums, bytes, deviceName): if DeviceDB.getByName(deviceName=deviceName).areaJson is None: jsonCon = ([{ "id": 1, "type": type, "nums": nums, "bytes": bytes, }]) else: jsonCon = json.loads(DeviceDB.getByName(deviceName=deviceName).areaJson) id = jsonCon[-1]["id"] + 1 jsonCon.append({ "id": id, "type": type, "nums": nums, "bytes": bytes, }) areaJson = json.dumps(jsonCon) DeviceDB.update(areaJson=areaJson).where(DeviceDB.deviceName == deviceName).execute() @classmethod def getAreaID(self, deviceNames): deviceName = deviceNames jsonConsStr = DeviceDB.getByName(deviceName=deviceName).areaJson if jsonConsStr is None: return else: jsonCons = json.loads(jsonConsStr) id = [] for jsonCon in jsonCons: id.append(jsonCon["id"]) return id @classmethod def getChannelLength(self, deviceName): number = 0 if DeviceDB.getByName(deviceName=deviceName).areaJson is None: return number else: numbers = json.loads(DeviceDB.getByName(deviceName=deviceName).areaJson) for i in numbers: number += int(i['nums']) return number def editDevies(self): pass @classmethod def getAllDevice(self): # 查询所有设备 devices = DeviceDB.get_all() if devices is 'error': return l = [] for x in devices: l.append([x.deviceName, x.proType, x.masterSlaveModel, x.areaJson]) return l