From 0c333fcf0cccd7787662e4d2c97a249272b4e05b Mon Sep 17 00:00:00 2001 From: MK13 Date: Sun, 7 Aug 2022 22:49:09 +0200 Subject: [PATCH] Initial --- README.md | 14 ++ pom.xml | 151 ++++++++++++ .../de/cloud/flight/tray/CloudFlightTray.java | 121 ++++++++++ .../java/de/cloud/flight/tray/Images.java | 21 ++ .../java/de/cloud/flight/tray/Packet.java | 220 ++++++++++++++++++ .../de/cloud/flight/tray/PacketMatcher.java | 5 + .../java/de/cloud/flight/tray/Reader.java | 61 +++++ .../java/de/cloud/flight/tray/Sender.java | 27 +++ .../de/cloud/flight/tray/TrayUpdater.java | 73 ++++++ src/main/resources/images/charging.png | Bin 0 -> 22470 bytes src/main/resources/images/default.png | Bin 0 -> 7358 bytes src/main/resources/images/low.png | Bin 0 -> 12170 bytes src/main/resources/images/muted.png | Bin 0 -> 15451 bytes src/main/resources/images/off.png | Bin 0 -> 20026 bytes src/main/resources/logback.xml | 11 + tools/install.sh | 16 ++ tools/template-cloud-flight-tray.service | 9 + 17 files changed, 729 insertions(+) create mode 100644 README.md create mode 100644 pom.xml create mode 100644 src/main/java/de/cloud/flight/tray/CloudFlightTray.java create mode 100644 src/main/java/de/cloud/flight/tray/Images.java create mode 100644 src/main/java/de/cloud/flight/tray/Packet.java create mode 100644 src/main/java/de/cloud/flight/tray/PacketMatcher.java create mode 100644 src/main/java/de/cloud/flight/tray/Reader.java create mode 100644 src/main/java/de/cloud/flight/tray/Sender.java create mode 100644 src/main/java/de/cloud/flight/tray/TrayUpdater.java create mode 100644 src/main/resources/images/charging.png create mode 100644 src/main/resources/images/default.png create mode 100644 src/main/resources/images/low.png create mode 100644 src/main/resources/images/muted.png create mode 100644 src/main/resources/images/off.png create mode 100644 src/main/resources/logback.xml create mode 100644 tools/install.sh create mode 100644 tools/template-cloud-flight-tray.service diff --git a/README.md b/README.md new file mode 100644 index 0000000..7dae58a --- /dev/null +++ b/README.md @@ -0,0 +1,14 @@ +# cloud-flight-tray +A tray service for the HyperX Cloud Flight headset + +## Prerequisites +Requires at least Java `>=18`. + +## Install +First, build the project by invoking `mvn package`. Then copy the result artifact `target/cloud-flight-tray-X.jar` to +`~/.local/share/java/cloud_flight_tray/cloud-flight-tray.jar`. After that copy the systemd template service from +`tools/template-cloud-flight-tray.service` to `~/.config/systemd/user/cloud-flight-tray.service`. Finally, reload the +systemd services via `systemctl --user daemon-reload` and start the service via `systemctl --user enable --now cloud-flight-tray` + +## Links +This project was heavily inspired by [kondinskis/hyperx-cloud-flight](https://github.com/kondinskis/hyperx-cloud-flight) \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..572ae44 --- /dev/null +++ b/pom.xml @@ -0,0 +1,151 @@ + + + 4.0.0 + + de.77zzcx7 + cloud-flight-tray + 1-SNAPSHOT + jar + Tray icon for HyperX Cloud Flight Wireless headset that shows e.g. the battery state + cloud-flight-tray + + + UTF-8 + 18 + + + + + + 77zzcx7-snapshots + http://192.168.10.4:8100/snapshots/ + + + 77zzcx7-releases + http://192.168.10.4:8100/releases/ + + + + + scm:git:https://77zzcx7.de/gitea/MK13/CloudFlightTray.git + ${scmDeveloperConnectionProp} + https://77zzcx7.de/gitea/MK13/CloudFlightTray + v1 + + + + + ch.qos.logback + logback-core + 1.2.11 + + + ch.qos.logback + logback-classic + 1.2.11 + + + org.slf4j + slf4j-api + 1.7.36 + + + com.github.taksan + native-tray-adapter + 1.1 + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 18 + 18 + + + + fr.jcgay.maven.plugins + buildplan-maven-plugin + 1.5 + + + build-plan + initialize + + list + + + + + + + + + + fr.jcgay.maven.plugins + buildplan-maven-plugin + + + org.apache.maven.plugins + maven-compiler-plugin + + 16 + 16 + + + + org.apache.maven.plugins + maven-release-plugin + 3.0.0-M5 + + v@{project.version} + true + true + + + + maven-jar-plugin + + + default-jar + none + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.4.2 + + + package + + single + + + + + + de.cloud.flight.tray.CloudFlightTray + + + + + jar-with-dependencies + + cloud-flight-tray-${project.version} + false + + + + + + + + \ No newline at end of file diff --git a/src/main/java/de/cloud/flight/tray/CloudFlightTray.java b/src/main/java/de/cloud/flight/tray/CloudFlightTray.java new file mode 100644 index 0000000..b904fd2 --- /dev/null +++ b/src/main/java/de/cloud/flight/tray/CloudFlightTray.java @@ -0,0 +1,121 @@ +package de.cloud.flight.tray; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import tray.SystemTrayAdapter; +import tray.SystemTrayProvider; +import tray.TrayIconAdapter; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.io.*; +import java.net.MalformedURLException; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.channels.AsynchronousFileChannel; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; +import java.util.concurrent.*; +import java.util.regex.Pattern; + +public class CloudFlightTray { + private static final Logger logger = LoggerFactory.getLogger(CloudFlightTray.class); + private static final String VENDOR_ID = "0951"; // Kingston HyperX + private static final String PRODUCT_ID = "16C4"; // Cloud Flight Wireless + private static final String HIDRAW_DEVICE_NAME_PATTERN = "hidraw\\d"; + + public static void main(String[] args) throws MalformedURLException { + logger.info("Starting CloudFlightTray"); + + final String hidrawDeviceName; + + try { + hidrawDeviceName = findHidrawDeviceName(); + } catch (Exception e) { + logger.error("Could not get hidraw device name", e); + + System.exit(-55); + + return; + } + + final Path hidrawPath = Paths.get("/dev/" + hidrawDeviceName); + final ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1); + final BlockingQueue queue = new ArrayBlockingQueue<>(1024); + final SystemTrayAdapter tray = new SystemTrayProvider().getSystemTray(); + final TrayIconAdapter trayIcon; + + trayIcon = tray.createAndAddTrayIcon(Images.OFF.getUrl(), "", new PopupMenu()); + + // We need to use an Async channel, so we can read and send at the same time. + // ByteChannel, for example, blocks if an operation is ongoing but reading + // may block indefinitely + try (AsynchronousFileChannel channel = AsynchronousFileChannel.open(hidrawPath, StandardOpenOption.READ, StandardOpenOption.WRITE)) { + executorService.schedule(new Sender(channel, executorService), 0, TimeUnit.SECONDS); + + Thread reader = new Thread(new Reader(channel, queue)); + Thread trayUpdater = new Thread(new TrayUpdater(queue, trayIcon)); + + trayUpdater.start(); + reader.start(); + + trayUpdater.join(); + reader.join(); + } catch (Exception ex) { + logger.error("Unknown error while reading/sending", ex); + + System.exit(-98); + + return; + } + } + + /** + * This method finds the hidraw device name + * + * @return The device name of the hidraw device to use + * + * @throws Exception if the device name is not in the expected format or the runtime cannot be executed + */ + private static String findHidrawDeviceName() throws Exception { + final String hidrawGlob = buildHidrawGlob(); + + logger.info("Query {}", hidrawGlob); + + // We use shell globbing functionality + final Process process = Runtime.getRuntime() + .exec(new String[]{"sh", "-c", "ls " + hidrawGlob}); + final String hidrawDevice = new BufferedReader(new InputStreamReader(process.getInputStream())).readLine(); + + process.destroy(); + + if (Pattern.compile(HIDRAW_DEVICE_NAME_PATTERN).matcher(hidrawDevice).matches()) { + logger.info("Found device {}", hidrawDevice); + + return hidrawDevice; + } + + throw new Exception("Unknown device name: " + hidrawDevice); + } + + /** + * @return a glob path identifying the hid raw device to use + */ + private static final String buildHidrawGlob() { + final StringBuilder sb = new StringBuilder(); + + // The important part is the vendor + product ID in the path + // that makes the result unique. + // But if, e.g. the wireless dongle is inserted to another port on the host, + // the PCI IDs are different, so we have to use globs. + sb.append("/sys/devices/pci*/*/*/*/*/*"); + sb.append(VENDOR_ID); + sb.append("\\:"); + sb.append(PRODUCT_ID); + // This is actually a folder containing the real name of the device + sb.append("*/hidraw"); + + return sb.toString(); + } +} diff --git a/src/main/java/de/cloud/flight/tray/Images.java b/src/main/java/de/cloud/flight/tray/Images.java new file mode 100644 index 0000000..73bfbfa --- /dev/null +++ b/src/main/java/de/cloud/flight/tray/Images.java @@ -0,0 +1,21 @@ +package de.cloud.flight.tray; + +import java.net.URL; + +public enum Images { + DEFAULT("/images/default.png"), + CHARGING("/images/charging.png"), + LOW("/images/low.png"), + MUTED("/images/muted.png"), + OFF("/images/off.png"); + + private final String name; + + Images(String name) { + this.name = name; + } + + public URL getUrl() { + return this.getClass().getResource(this.name); + } +} diff --git a/src/main/java/de/cloud/flight/tray/Packet.java b/src/main/java/de/cloud/flight/tray/Packet.java new file mode 100644 index 0000000..04179ce --- /dev/null +++ b/src/main/java/de/cloud/flight/tray/Packet.java @@ -0,0 +1,220 @@ +package de.cloud.flight.tray; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.nio.ByteBuffer; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; +import java.util.Optional; + +public enum Packet { + /** + * Packet that triggers a response from the device that contains the battery percentage info + */ + TRIGGER_PACKET(999, -1, new byte[]{0x21, (byte) 0xff, 0x05}), + + /** + * Sent by the device if it is powered on + */ + POWER_ON(1, 2, (bb) -> bb[0] == 0x64 && bb[1] == 0x01), + + /** + * Sent by the device if it is powered off + */ + POWER_OFF(2, 2, (bb) -> bb[0] == 0x64 && bb[1] == 0x03), + + /** + * Sent if the mute button has been pressed + */ + MUTED(3, 2, (bb) -> bb[0] == 0x65 && bb[1] == 0x04), + + /** + * Sent if the mute button has been pressed + */ + UNMUTED(4, 2, (bb) -> bb[0] == 0x65), + + /** + * Sent if the volume control wheel has been used to increase the volume + */ + VOLUME_UP(5, 5, (bb) -> bb[1] == 0x01), + + /** + * Sent if the volume control wheel has been used to decrease the volume + */ + VOLUME_DOWN(6, 5, (bb) -> bb[1] == 0x02), + + /** + * Sent if the device has been connected to the charging cable + */ + BATTERY_CHARGING(7, 20, (bb) -> (bb[3] == 0x10 || bb[3] == 0x11) && bb[4] >= 20), + + /** + * Sent by the device in response to a trigger packet + */ + BATTERY_STATE(8, 20, (bb) -> !BATTERY_CHARGING.matcher.match(bb)), + + /** + * If a packet has been received that does not match any other packet + */ + UNDEFINED(1000, -1); + + private static final Logger logger = LoggerFactory.getLogger(Packet.class); + + private int length; + private PacketMatcher matcher; + private byte[] proto; + private int order; + private int batteryPercent; + + Packet(int order, int length) { + this.length = length; + this.matcher = null; + this.proto = null; + this.order = order; + } + + Packet(int order, int length, PacketMatcher matcher) { + this.length = length; + this.matcher = matcher; + this.proto = null; + this.order = order; + } + + Packet(int order, int length, byte[] proto) { + this.length = length; + this.matcher = null; + this.proto = proto; + this.order = order; + } + + /** + * This method gets the packed matching the given buffer + * + * @param bb to get the packet for + * @param length the amount of bytes read + * @return the packet, never null + */ + public static Packet getPacket(ByteBuffer bb, int length) { + final int bbLength = bb.hasArray() ? bb.array().length : -1; + final Optional optBuffer = bb.hasArray() ? Optional.of(bb.array()) : Optional.empty(); + Packet retPack = UNDEFINED; + + if(bbLength != -1 && optBuffer.isPresent()) { + for(Packet p : ordered()) { // ordering required for UNMUTED + // The packages have different lengths, so it is the first criteria to filter for + if(length == p.length && p.matcher.match(optBuffer.get())) { + retPack = p; + + if(retPack == BATTERY_STATE) { + retPack.batteryPercent = retPack.parse(bb); + } + + break; + } + } + } + + return retPack; + } + + private int getOrder() { + return this.order; + } + + /** + * @return the current battery percent, only applicable to {@link #BATTERY_STATE} packet + */ + public int getBatteryPercent() { + return batteryPercent; + } + + private static List ordered() { + List retList = Arrays.asList(values()); + + retList.sort(Comparator.comparing(Packet::getOrder)); + + return retList; + } + + /** + * @return the prototype for this packet + */ + public ByteBuffer getProto() { + return ByteBuffer.wrap(this.proto); + } + + private int parse(ByteBuffer bb) { + if(this != BATTERY_STATE) { + return -1; + } + + byte chargeState = bb.get(3); + int value = Byte.toUnsignedInt(bb.get(4)); + + if(chargeState == 0x0E) { + if(value >= 0 && value < 89) { + return 10; + } + if(value >= 90 && value < 119) { + return 15; + } + if(value >= 120 && value < 148) { + return 20; + } + if(value >= 149 && value < 159) { + return 25; + } + if(value >= 160 && value < 169) { + return 30; + } + if(value >= 170 && value < 179) { + return 35; + } + if(value >= 180 && value < 189) { + return 40; + } + if(value >= 190 && value < 199) { + return 45; + } + if(value >= 200 && value < 209) { + return 50; + } + if(value >= 210 && value < 219) { + return 55; + } + if(value >= 220 && value < 239) { + return 60; + } + if(value >= 240 && value < 255) { + return 65; + } + } + else if(chargeState == 0x0F) { + if(value >= 0 && value < 19) { + return 70; + } + if(value >= 20 && value < 49) { + return 75; + } + if(value >= 50 && value < 69) { + return 80; + } + if(value >= 70 && value < 99) { + return 85; + } + if(value >= 100 && value < 119) { + return 90; + } + if(value >= 120 && value < 129) { + return 95; + } + if(value >= 130 && value < 255) { + return 100; + } + } + + return 0; + } +} diff --git a/src/main/java/de/cloud/flight/tray/PacketMatcher.java b/src/main/java/de/cloud/flight/tray/PacketMatcher.java new file mode 100644 index 0000000..f016efd --- /dev/null +++ b/src/main/java/de/cloud/flight/tray/PacketMatcher.java @@ -0,0 +1,5 @@ +package de.cloud.flight.tray; + +public interface PacketMatcher { + boolean match(byte[] buffer); +} diff --git a/src/main/java/de/cloud/flight/tray/Reader.java b/src/main/java/de/cloud/flight/tray/Reader.java new file mode 100644 index 0000000..4b96bf6 --- /dev/null +++ b/src/main/java/de/cloud/flight/tray/Reader.java @@ -0,0 +1,61 @@ +package de.cloud.flight.tray; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.nio.ByteBuffer; +import java.nio.channels.AsynchronousFileChannel; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; + +/** + * A reader that reads from the given channel, waiting until data arrives + */ +record Reader(AsynchronousFileChannel channel, BlockingQueue queue) implements Runnable { + private static final Logger logger = LoggerFactory.getLogger(Reader.class); + + @Override + public void run() { + while (true) { + ByteBuffer bb = ByteBuffer.allocate(32); + + try { + final Future read = channel.read(bb, 0); + final Packet packet = Packet.getPacket(bb, read.get()); + + if(packet != Packet.UNDEFINED) { + dumpBuffer(bb, read.get()); + + queue.offer(packet); + } + } catch (ExecutionException e) { + logger.error("Error while reading", e); + } catch (InterruptedException e) { + logger.error("Interrupted while reading", e); + + break; + } + } + } + + /** + * This method logs the given buffer. + * + * @param bb to log + * @param length to log + */ + private static void dumpBuffer(ByteBuffer bb, int length) { + final StringBuilder sb = new StringBuilder(); + + sb.append(String.format("%d: ", length)); + + for (byte b : bb.array()) { + sb.append(String.format("%02X ", b)); + } + + sb.append("\n"); + + logger.debug(sb.toString()); + } +} \ No newline at end of file diff --git a/src/main/java/de/cloud/flight/tray/Sender.java b/src/main/java/de/cloud/flight/tray/Sender.java new file mode 100644 index 0000000..8a34c45 --- /dev/null +++ b/src/main/java/de/cloud/flight/tray/Sender.java @@ -0,0 +1,27 @@ +package de.cloud.flight.tray; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.nio.channels.AsynchronousFileChannel; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +/** + * A sender that writes data to the given channel, running every + */ +record Sender(AsynchronousFileChannel channel, + ScheduledExecutorService executor) implements Runnable { + private static final Logger logger = LoggerFactory.getLogger(Sender.class); + + @Override + public void run() { + logger.debug("Write trigger packet..."); + + channel.write(Packet.TRIGGER_PACKET.getProto(), 0); + + logger.debug("Schedule next trigger..."); + + executor.schedule(new Sender(channel, executor), 180, TimeUnit.SECONDS); + } +} diff --git a/src/main/java/de/cloud/flight/tray/TrayUpdater.java b/src/main/java/de/cloud/flight/tray/TrayUpdater.java new file mode 100644 index 0000000..be7c7f5 --- /dev/null +++ b/src/main/java/de/cloud/flight/tray/TrayUpdater.java @@ -0,0 +1,73 @@ +package de.cloud.flight.tray; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import tray.TrayIconAdapter; + +import java.util.concurrent.BlockingQueue; + +record TrayUpdater(BlockingQueue queue, TrayIconAdapter trayIcon) implements Runnable { + private static final Logger logger = LoggerFactory.getLogger(TrayUpdater.class); + + private static boolean muted; + private static boolean powered = true; + private static boolean charging; + private static int batteryPercent; + + @Override + public void run() { + while (true) { + final Packet packet; + + try { + packet = queue.take(); + } catch (InterruptedException e) { + logger.error("Tray updater was interrupted", e); + + break; + } + + switch (packet) { + case MUTED -> muted = true; + case UNMUTED -> muted = false; + case POWER_ON -> powered = true; + case POWER_OFF -> powered = false; + case BATTERY_CHARGING -> charging = true; + case BATTERY_STATE -> batteryPercent = packet.getBatteryPercent(); + } + + final StringBuilder sb = new StringBuilder(); + + sb.append("Power: "); + sb.append(powered ? "on" : "off"); + sb.append(" | "); + sb.append("Charging: "); + sb.append(charging ? "yes" : "no"); + sb.append(" | "); + sb.append("Battery: "); + sb.append(batteryPercent); + sb.append("% | "); + sb.append("Muted: "); + sb.append(muted ? "yes" : "no"); + + logger.info(sb.toString()); + + Images image = Images.DEFAULT; + + if(!powered) { + image = Images.OFF; + } + else if(charging) { + image = Images.CHARGING; + } + else if(batteryPercent < 30) { + image = Images.LOW; + } + else if(muted) { + image = Images.MUTED; + } + + trayIcon.setImage(image.getUrl()); + } + } +} diff --git a/src/main/resources/images/charging.png b/src/main/resources/images/charging.png new file mode 100644 index 0000000000000000000000000000000000000000..0974640c511c3732520103db5efcfedd235a3757 GIT binary patch literal 22470 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/images/default.png b/src/main/resources/images/default.png new file mode 100644 index 0000000000000000000000000000000000000000..9ff10b56c0f560516ff03b1049b23657eadd479c GIT binary patch literal 7358 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/images/muted.png b/src/main/resources/images/muted.png new file mode 100644 index 0000000000000000000000000000000000000000..13c7445d44a911a224c5e64182ef0c648be77b45 GIT binary patch literal 15451 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/images/off.png b/src/main/resources/images/off.png new file mode 100644 index 0000000000000000000000000000000000000000..8feb27a65447dd63ebe4d5b8d1023a608ab7d96a GIT binary patch literal 20026 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 RGysExXdXW9cirgc{tu7YCrtnV literal 0 HcmV?d00001 diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml new file mode 100644 index 0000000..6eea430 --- /dev/null +++ b/src/main/resources/logback.xml @@ -0,0 +1,11 @@ + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + \ No newline at end of file diff --git a/tools/install.sh b/tools/install.sh new file mode 100644 index 0000000..29c8a2f --- /dev/null +++ b/tools/install.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +version=$1 + +echo "Create required directories" +mkdir -p ~/.local/share/java/cloud_flight_tray/ + +echo "Download cloud-flight-tray version $version to ~/.local/share/java/cloud_flight_tray/cloud-flight-tray.jar" +wget -qO ~/.local/share/java/cloud_flight_tray/cloud-flight-tray.jar http://192.168.10.4:8100/releases/de/77zzcx7/cloud-flight-tray/"$version"/cloud-flight-tray-"$version".jar + +echo "Install service to ~/.config/systemd/user/cloud-flight-tray.service" +cp "template-cloud-flight-tray.service" ~/.config/systemd/user/cloud-flight-tray.service + +echo "Reload and restart service" +systemctl --user daemon-reload +systemctl --user restart cloud-flight-tray \ No newline at end of file diff --git a/tools/template-cloud-flight-tray.service b/tools/template-cloud-flight-tray.service new file mode 100644 index 0000000..8ed38b2 --- /dev/null +++ b/tools/template-cloud-flight-tray.service @@ -0,0 +1,9 @@ +[Unit] +Description=Cloud Flight tray - A tray service for the HyperX Cloud Flight headset + +[Service] +Type=simple +ExecStart=java -jar %h/.local/share/java/cloud_flight_tray/cloud-flight-tray.jar + +[Install] +WantedBy=multi-user.target \ No newline at end of file