# -*- coding: utf-8 -*- #!/usr/bin/env python import logging from typing import TYPE_CHECKING from apps.web.core.models import DriverAdapter, DriverEventer logger = logging.getLogger(__name__) if TYPE_CHECKING: from apps.web.device.models import DeviceDict from apps.web.core.adapter.base import SmartBox from apps.web.eventer import EventBuilder def arguments(): """Returns tuple containing dictionary of calling function's named arguments and a list of calling function's unnamed positional arguments. """ from inspect import getargvalues, stack positional_name, keyword_name, args = getargvalues(stack()[1][0])[-3:] positional_args = args.pop(positional_name, []) args.update(args.pop(keyword_name, [])) return args, positional_args def named_arguments(): from inspect import getargvalues, stack positional_name, keyword_name, args = getargvalues(stack()[1][0])[-3:] args.pop(positional_name, []) args.update(args.pop(keyword_name, [])) return args class ActionDeviceBuilder(object): @staticmethod def create_action_device(dev, typeCode = None): from apps.web.device.define import DeviceChannelType assert dev.channelType != DeviceChannelType.Channel_BT, u'蓝牙设备不能调用该接口' if not typeCode: devType = dev.get('devType', None) if not devType: return None typeCode = devType.get('code', None) if typeCode is None: return None is_online = devType.get('online', True) else: is_online = True return DriverAdapter.get_driver_adapter(typeCode, dev, is_online) @staticmethod def create_eventer(dev, typeCode = None): from apps.web.device.define import DeviceChannelType assert dev.channelType != DeviceChannelType.Channel_BT, u'蓝牙设备不能调用该接口' adapter = ActionDeviceBuilder.create_action_device(dev, typeCode) if not typeCode: devType = dev.get('devType', None) if not devType: return None typeCode = devType.get('code', None) if typeCode is None: return None is_online = devType.get('online', True) else: is_online = True return DriverEventer.get_driver_eventer(typeCode, adapter, is_online) @staticmethod def create_eventer_by_adapter(adapter): # type: (SmartBox)->EventBuilder dev = adapter.device # type: DeviceDict devType = dev.get('devType', None) if not devType: return None typeCode = devType.get('code', None) if typeCode is None: return None is_online = devType.get('online', True) return DriverEventer.get_driver_eventer(typeCode, adapter, is_online)