From 3a468e7521425a347168f44030ac25acbbd7d3ac Mon Sep 17 00:00:00 2001 From: Richard Hughes Date: Wed, 13 Aug 2008 08:08:29 +0100 Subject: [PATCH] only match on USB HID devices so we don't try to connect to every USB device on the system at startup --- src/.gitignore | 1 + ...-power.rules => 95-devkit-power-csr.rules} | 1 - src/95-devkit-power-hid.rules | 46 +++++++++++++++++++ src/Makefile.am | 16 ++++--- src/dkp-hid.c | 29 ++++++++++-- tools/.gitignore | 1 + 6 files changed, 82 insertions(+), 12 deletions(-) rename src/{95-devkit-power.rules => 95-devkit-power-csr.rules} (99%) create mode 100644 src/95-devkit-power-hid.rules diff --git a/src/.gitignore b/src/.gitignore index d76cf23..7d8db05 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -6,4 +6,5 @@ devkit-power-daemon *-marshal.h *.conf *.service +.libs diff --git a/src/95-devkit-power.rules b/src/95-devkit-power-csr.rules similarity index 99% rename from src/95-devkit-power.rules rename to src/95-devkit-power-csr.rules index a1790d5..48db8a5 100644 --- a/src/95-devkit-power.rules +++ b/src/95-devkit-power-csr.rules @@ -1,4 +1,3 @@ - ############################################################################################################## # Logitech Mice with CSR battery readouts # diff --git a/src/95-devkit-power-hid.rules b/src/95-devkit-power-hid.rules new file mode 100644 index 0000000..0058957 --- /dev/null +++ b/src/95-devkit-power-hid.rules @@ -0,0 +1,46 @@ +############################################################################################################## +# Uninterruptable Power Supplies with USBHID interface +# +SYSFS{idVendor}=="0463", ENV{ID_VENDOR}="MGE Systems" +SYSFS{idVendor}=="051d", ENV{ID_VENDOR}="APC" +SYSFS{idVendor}=="0764", ENV{ID_VENDOR}="CyberPower" +SYSFS{idVendor}=="09ae", ENV{ID_VENDOR}="Tripp Lite" +SYSFS{idVendor}=="050d", ENV{ID_VENDOR}="Belkin" +SYSFS{idVendor}=="06da", ENV{ID_VENDOR}="Liebert" +SYSFS{idVendor}=="0925", ENV{ID_VENDOR}="Kebo" + +# MGE UPS SYSTEMS +SYSFS{idVendor}=="0463", SYSFS{idProduct}=="0001", ENV{ID_BATTERY_TYPE}="ups" +SYSFS{idVendor}=="0463", SYSFS{idProduct}=="0xffff", ENV{ID_BATTERY_TYPE}="ups" + +# APC +SYSFS{idVendor}=="051d", SYSFS{idProduct}=="0002", ENV{ID_BATTERY_TYPE}="ups" + +# CyberPower +SYSFS{idVendor}=="0764", SYSFS{idProduct}=="0005", ENV{ID_BATTERY_TYPE}="ups" +SYSFS{idVendor}=="0764", SYSFS{idProduct}=="0x0501", ENV{ID_BATTERY_TYPE}="ups" + +# Tripp Lite +SYSFS{idVendor}=="09ae", SYSFS{idProduct}=="1003", ENV{ID_BATTERY_TYPE}="ups" +SYSFS{idVendor}=="09ae", SYSFS{idProduct}=="0x2005", ENV{ID_BATTERY_TYPE}="ups" +SYSFS{idVendor}=="09ae", SYSFS{idProduct}=="0x2007", ENV{ID_BATTERY_TYPE}="ups" +SYSFS{idVendor}=="09ae", SYSFS{idProduct}=="0x3012", ENV{ID_BATTERY_TYPE}="ups" +SYSFS{idVendor}=="09ae", SYSFS{idProduct}=="0x4002", ENV{ID_BATTERY_TYPE}="ups" +SYSFS{idVendor}=="09ae", SYSFS{idProduct}=="0x4003", ENV{ID_BATTERY_TYPE}="ups" + +# Belkin +SYSFS{idVendor}=="050d", SYSFS{idProduct}=="0375", ENV{ID_BATTERY_TYPE}="ups" +SYSFS{idVendor}=="050d", SYSFS{idProduct}=="0x0551", ENV{ID_BATTERY_TYPE}="ups" +SYSFS{idVendor}=="050d", SYSFS{idProduct}=="0x0751", ENV{ID_BATTERY_TYPE}="ups" +SYSFS{idVendor}=="050d", SYSFS{idProduct}=="0x0900", ENV{ID_BATTERY_TYPE}="ups" +SYSFS{idVendor}=="050d", SYSFS{idProduct}=="0x0910", ENV{ID_BATTERY_TYPE}="ups" +SYSFS{idVendor}=="050d", SYSFS{idProduct}=="0x0912", ENV{ID_BATTERY_TYPE}="ups" +SYSFS{idVendor}=="050d", SYSFS{idProduct}=="0x0980", ENV{ID_BATTERY_TYPE}="ups" +SYSFS{idVendor}=="050d", SYSFS{idProduct}=="0x1100", ENV{ID_BATTERY_TYPE}="ups" + +# Liebert +SYSFS{idVendor}=="06da", SYSFS{idProduct}=="ffff", ENV{ID_BATTERY_TYPE}="ups" + +# Kebo +SYSFS{idVendor}=="0925", SYSFS{idProduct}=="1234", ENV{ID_BATTERY_TYPE}="ups" + diff --git a/src/Makefile.am b/src/Makefile.am index 1effc54..b3db722 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -82,19 +82,21 @@ $(dbusconf_DATA): $(dbusconf_in_files) Makefile cp $< $@ udevrulesdir = $(sysconfdir)/udev/rules.d -udevrules_DATA = 95-devkit-power.rules +udevrules_DATA = \ + 95-devkit-power-hid.rules \ + 95-devkit-power-csr.rules install-data-hook: $(mkinstalldirs) $(DESTDIR)$(localstatedir)/lib/DeviceKit-power CLEANFILES = $(BUILT_SOURCES) -EXTRA_DIST = \ - org.freedesktop.DeviceKit.Power.xml \ - org.freedesktop.DeviceKit.Power.Device.xml \ - dkp-marshal.list \ - 95-devkit-power.rules \ - $(service_in_files) \ +EXTRA_DIST = \ + org.freedesktop.DeviceKit.Power.xml \ + org.freedesktop.DeviceKit.Power.Device.xml \ + dkp-marshal.list \ + 95-devkit-power.rules \ + $(service_in_files) \ $(dbusconf_in_files) clean-local : diff --git a/src/dkp-hid.c b/src/dkp-hid.c index 949bc7d..e154c7f 100644 --- a/src/dkp-hid.c +++ b/src/dkp-hid.c @@ -277,6 +277,7 @@ dkp_hid_coldplug (DkpDevice *device) DevkitDevice *d; gboolean ret = FALSE; const gchar *device_file; + const gchar *type; DkpObject *obj = dkp_device_get_obj (device); /* detect what kind of device we are */ @@ -284,6 +285,13 @@ dkp_hid_coldplug (DkpDevice *device) if (d == NULL) dkp_error ("could not get device"); + /* get the type */ + type = devkit_device_get_property (d, "ID_BATTERY_TYPE"); + if (type == NULL || strcmp (type, "ups") != 0) { + dkp_debug ("not a UPS device"); + goto out; + } + /* get the device file */ device_file = devkit_device_get_device_file (d); if (device_file == NULL) { @@ -311,11 +319,16 @@ dkp_hid_coldplug (DkpDevice *device) obj->power_supply = TRUE; obj->battery_is_present = TRUE; + /* try and get from udev if UPS is being difficult */ + if (obj->vendor == NULL) + obj->vendor = g_strdup (devkit_device_get_property (d, "ID_VENDOR")); + /* coldplug everything */ dkp_hid_get_all_data (hid); /* coldplug */ ret = dkp_hid_refresh (device); + out: return ret; } @@ -326,6 +339,7 @@ out: static gboolean dkp_hid_refresh (DkpDevice *device) { + gboolean set = FALSE; gboolean ret = FALSE; GTimeVal time; guint i; @@ -338,14 +352,21 @@ dkp_hid_refresh (DkpDevice *device) g_get_current_time (&time); obj->update_time = time.tv_sec; - /* read any data */ + /* read any data -- it's okay if there's nothing as we are non-blocking */ rd = read (hid->priv->fd, ev, sizeof (ev)); - if (rd < (int) sizeof (ev[0])) + if (rd < (int) sizeof (ev[0])) { + ret = TRUE; goto out; + } /* process each event */ - for (i=0; i < rd / sizeof (ev[0]); i++) - ret = dkp_hid_set_obj (hid, ev[i].hid, ev[i].value); + for (i=0; i < rd / sizeof (ev[0]); i++) { + set = dkp_hid_set_obj (hid, ev[i].hid, ev[i].value); + + /* if only takes one match to make refresh a success */ + if (set) + ret = TRUE; + } out: return ret; } diff --git a/tools/.gitignore b/tools/.gitignore index ea46275..81c8a0c 100644 --- a/tools/.gitignore +++ b/tools/.gitignore @@ -5,4 +5,5 @@ devkit-power-on-battery *.o *-marshal.c *-marshal.h +.libs