def _battery_line(dev): battery = _hidpp20.get_battery(dev) if battery is None: battery = _hidpp10.get_battery(dev) if battery is not None: level, status, nextLevel = battery text = _battery_text(level) nextText = '' if nextLevel is None else ', next level ' + _battery_text(nextLevel) print(' Battery: %s, %s%s.' % (text, status, nextText)) else: battery_voltage = _hidpp20.get_voltage(dev) if battery_voltage: (level, status, voltage, charge_sts, charge_type) = battery_voltage print(' Battery: %smV, %s, %s.' % (voltage, status, level)) else: print(' Battery status unavailable.')
def _print_device(dev): assert dev # check if the device is online dev.ping() print(' %d: %s' % (dev.number, dev.name)) print(' Codename :', dev.codename) print(' Kind :', dev.kind) print(' Wireless PID :', dev.wpid) if dev.protocol: print(' Protocol : HID++ %1.1f' % dev.protocol) else: print(' Protocol : unknown (device is offline)') if dev.polling_rate: print(' Polling rate :', dev.polling_rate, 'ms (%dHz)' % (1000 // dev.polling_rate)) print(' Serial number:', dev.serial) if dev.firmware: for fw in dev.firmware: print(' %11s:' % fw.kind, (fw.name + ' ' + fw.version).strip()) if dev.power_switch_location: print(' The power switch is located on the %s.' % dev.power_switch_location) if dev.online: notification_flags = _hidpp10.get_notification_flags(dev) if notification_flags is not None: if notification_flags: notification_names = _hidpp10.NOTIFICATION_FLAG.flag_names( notification_flags) print(' Notifications: %s (0x%06X).' % (', '.join(notification_names), notification_flags)) else: print(' Notifications: (none).') device_features = _hidpp10.get_device_features(dev) if device_features is not None: if device_features: device_features_names = _hidpp10.DEVICE_FEATURES.flag_names( device_features) print(' Features: %s (0x%06X)' % (', '.join(device_features_names), device_features)) else: print(' Features: (none)') if dev.online and dev.features: print(' Supports %d HID++ 2.0 features:' % len(dev.features)) dev.persister = None # Give the device a fake persister dev_settings = [] _settings_templates.check_feature_settings(dev, dev_settings) for index, feature in enumerate(dev.features): feature = dev.features[index] flags = dev.request(0x0000, feature.bytes(2)) flags = 0 if flags is None else ord(flags[1:2]) flags = _hidpp20.FEATURE_FLAG.flag_names(flags) print(' %2d: %-22s {%04X} %s' % (index, feature, feature, ', '.join(flags))) if feature == _hidpp20.FEATURE.HIRES_WHEEL: wheel = _hidpp20.get_hires_wheel(dev) if wheel: multi, has_invert, has_switch, inv, res, target, ratchet = wheel print(' Multiplier: %s' % multi) if has_invert: print(' Has invert') if inv: print(' Inverse wheel motion') else: print(' Normal wheel motion') if has_switch: print(' Has ratchet switch') if ratchet: print(' Normal wheel mode') else: print(' Free wheel mode') if res: print(' High resolution mode') else: print(' Low resolution mode') if target: print(' HID++ notification') else: print(' HID notification') elif feature == _hidpp20.FEATURE.MOUSE_POINTER: mouse_pointer = _hidpp20.get_mouse_pointer_info(dev) if mouse_pointer: print(' DPI: %s' % mouse_pointer['dpi']) print(' Acceleration: %s' % mouse_pointer['acceleration']) if mouse_pointer['suggest_os_ballistics']: print(' Use OS ballistics') else: print(' Override OS ballistics') if mouse_pointer['suggest_vertical_orientation']: print(' Provide vertical tuning, trackball') else: print(' No vertical tuning, standard mice') if feature == _hidpp20.FEATURE.VERTICAL_SCROLLING: vertical_scrolling_info = _hidpp20.get_vertical_scrolling_info( dev) if vertical_scrolling_info: print(' Roller type: %s' % vertical_scrolling_info['roller']) print(' Ratchet per turn: %s' % vertical_scrolling_info['ratchet']) print(' Scroll lines: %s' % vertical_scrolling_info['lines']) elif feature == _hidpp20.FEATURE.HI_RES_SCROLLING: scrolling_mode, scrolling_resolution = _hidpp20.get_hi_res_scrolling_info( dev) if scrolling_mode: print(' Hi-res scrolling enabled') else: print(' Hi-res scrolling disabled') if scrolling_resolution: print(' Hi-res scrolling multiplier: %s' % scrolling_resolution) elif feature == _hidpp20.FEATURE.POINTER_SPEED: pointer_speed = _hidpp20.get_pointer_speed_info(dev) if pointer_speed: print(' Pointer Speed: %s' % pointer_speed) elif feature == _hidpp20.FEATURE.LOWRES_WHEEL: wheel_status = _hidpp20.get_lowres_wheel_status(dev) if wheel_status: print(' Wheel Reports: %s' % wheel_status) elif feature == _hidpp20.FEATURE.NEW_FN_INVERSION: inverted, default_inverted = _hidpp20.get_new_fn_inversion(dev) print(' Fn-swap:', 'enabled' if inverted else 'disabled') print(' Fn-swap default:', 'enabled' if default_inverted else 'disabled') elif feature == _hidpp20.FEATURE.HOSTS_INFO: host_names = _hidpp20.get_host_names(dev) for host, (paired, name) in host_names.items(): print(' Host %s (%s): %s' % (host, 'paired' if paired else 'unpaired', name)) for setting in dev_settings: if setting.feature == feature: v = setting.read(False) print(' %s: %s' % (setting.label, v)) if dev.online and dev.keys: print(' Has %d reprogrammable keys:' % len(dev.keys)) for k in dev.keys: flags = _special_keys.KEY_FLAG.flag_names(k.flags) # TODO: add here additional variants for other REPROG_CONTROLS if dev.keys.keyversion == 1: print(' %2d: %-26s => %-27s %s' % (k.index, k.key, k.task, ', '.join(flags))) if dev.keys.keyversion == 4: print(' %2d: %-26s, default: %-27s => %-26s' % (k.index, k.key, k.task, k.remapped)) print(' %s, pos:%d, group:%1d, gmask:%d' % (', '.join(flags), k.pos, k.group, k.group_mask)) if dev.online: battery = _hidpp20.get_battery(dev) if battery is None: battery = _hidpp10.get_battery(dev) if battery is not None: level, status, nextLevel = battery text = _battery_text(level) nextText = '' if nextLevel is None else ', next level ' + _battery_text( nextLevel) print(' Battery: %s, %s%s.' % (text, status, nextText)) else: battery_voltage = _hidpp20.get_voltage(dev) if battery_voltage: (level, status, voltage, charge_sts, charge_type) = battery_voltage print(' Battery: %smV, %s, %s.' % (voltage, status, level)) else: print(' Battery status unavailable.') else: print(' Battery: unknown (device is offline).')
def _print_device(dev): assert dev # check if the device is online dev.ping() print(' %d: %s' % (dev.number, dev.name)) print(' Codename :', dev.codename) print(' Kind :', dev.kind) print(' Wireless PID :', dev.wpid) if dev.protocol: print(' Protocol : HID++ %1.1f' % dev.protocol) else: print(' Protocol : unknown (device is offline)') if dev.polling_rate: print(' Polling rate :', dev.polling_rate, 'ms (%dHz)' % (1000 // dev.polling_rate)) print(' Serial number:', dev.serial) for fw in dev.firmware: print(' %11s:' % fw.kind, (fw.name + ' ' + fw.version).strip()) if dev.power_switch_location: print(' The power switch is located on the %s.' % dev.power_switch_location) if dev.online: notification_flags = _hidpp10.get_notification_flags(dev) if notification_flags is not None: if notification_flags: notification_names = _hidpp10.NOTIFICATION_FLAG.flag_names( notification_flags) print(' Notifications: %s (0x%06X).' % (', '.join(notification_names), notification_flags)) else: print(' Notifications: (none).') if dev.online and dev.features: print(' Supports %d HID++ 2.0 features:' % len(dev.features)) for index, feature in enumerate(dev.features): feature = dev.features[index] flags = dev.request(0x0000, feature.bytes(2)) flags = 0 if flags is None else ord(flags[1:2]) flags = _hidpp20.FEATURE_FLAG.flag_names(flags) print(' %2d: %-22s {%04X} %s' % (index, feature, feature, ', '.join(flags))) if feature == _hidpp20.FEATURE.HIRES_WHEEL: wheel = _hidpp20.get_hires_wheel(dev) if wheel: multi, has_invert, has_switch, inv, res, target, ratchet = wheel print(" Multiplier: %s" % multi) if has_invert: print(" Has invert") if inv: print(" Inverse wheel motion") else: print(" Normal wheel motion") if has_switch: print(" Has ratchet switch") if ratchet: print(" Normal wheel mode") else: print(" Free wheel mode") if res: print(" High resolution mode") else: print(" Low resolution mode") if target: print(" HID++ notification") else: print(" HID notification") if feature == _hidpp20.FEATURE.MOUSE_POINTER: mouse_pointer = _hidpp20.get_mouse_pointer_info(dev) if mouse_pointer: print(" DPI: %s" % mouse_pointer['dpi']) print(" Acceleration: %s" % mouse_pointer['acceleration']) if mouse_pointer['suggest_os_ballistics']: print(" Use OS ballistics") else: print(" Override OS ballistics") if mouse_pointer['suggest_vertical_orientation']: print(" Provide vertical tuning, trackball") else: print(" No vertical tuning, standard mice") if feature == _hidpp20.FEATURE.VERTICAL_SCROLLING: vertical_scrolling_info = _hidpp20.get_vertical_scrolling_info( dev) if vertical_scrolling_info: print(" Roller type: %s" % vertical_scrolling_info['roller']) print(" Ratchet per turn: %s" % vertical_scrolling_info['ratchet']) print(" Scroll lines: %s" % vertical_scrolling_info['lines']) if feature == _hidpp20.FEATURE.HI_RES_SCROLLING: scrolling_mode, scrolling_resolution = _hidpp20.get_hi_res_scrolling_info( dev) if scrolling_mode: print(" Hi-res scrolling enabled") else: print(" Hi-res scrolling disabled") if scrolling_resolution: print(" Hi-res scrolling multiplier: %s" % scrolling_resolution) if feature == _hidpp20.FEATURE.POINTER_SPEED: pointer_speed = _hidpp20.get_pointer_speed_info(dev) if pointer_speed: print(" Pointer Speed: %s" % pointer_speed) if feature == _hidpp20.FEATURE.LOWRES_WHEEL: wheel_status = _hidpp20.get_lowres_wheel_status(dev) if wheel_status: print(" Wheel Reports: %s" % wheel_status) if dev.online and dev.keys: print(' Has %d reprogrammable keys:' % len(dev.keys)) for k in dev.keys: flags = _special_keys.KEY_FLAG.flag_names(k.flags) # TODO: add here additional variants for other REPROG_CONTROLS if dev.keys.keyversion == 1: print(' %2d: %-26s => %-27s %s' % (k.index, k.key, k.task, ', '.join(flags))) if dev.keys.keyversion == 4: print(' %2d: %-26s, default: %-27s => %-26s' % (k.index, k.key, k.task, k.remapped)) print(' %s, pos:%d, group:%1d, gmask:%d' % (', '.join(flags), k.pos, k.group, k.group_mask)) if dev.online: battery = _hidpp20.get_battery(dev) if battery is None: battery = _hidpp10.get_battery(dev) if battery is not None: from logitech_receiver.common import NamedInt as _NamedInt level, status = battery if level is not None: if isinstance(level, _NamedInt): text = str(level) else: text = '%d%%' % level else: text = 'N/A' print(' Battery: %s, %s.' % (text, status)) else: battery_voltage = _hidpp20.get_voltage(dev) if battery_voltage: (voltage, charging, charge_sts, charge_lvl, charge_type) = battery_voltage print(' Battery: %smV, %s.' % (voltage, 'Charging' if charging else 'Discharging')) else: print(' Battery status unavailable.') else: print(' Battery: unknown (device is offline).')
from logitech_receiver import Receiver, hidpp20 from logitech_receiver.base import receivers receiver = None for dev_info in receivers(): if dev_info.path == MY_RECEIVER: receiver = Receiver.open(dev_info) if receiver is None: print("Receiver not connected") exit() for dev in receiver: dev.ping() if dev.online: battery = hidpp20.get_voltage(dev) voltage, charging, charge_sts, charge_lvl, charge_type = battery charge_filepath = os.path.join(os.path.dirname(__file__), 'g703_charge.csv') with open(charge_filepath) as file: charge_table = list(csv.DictReader(file)) percent = 0 for charge in charge_table: if float(charge['volt']) * 1000 <= float(voltage): percent = charge['percent'] print(f"G703: {percent}%") else: print("Mouse not connected")