diff --git a/modules/workspace/i3blocks/scripts/bluetooth.nix b/modules/workspace/i3blocks/scripts/bluetooth.nix index 988347e..6071c39 100644 --- a/modules/workspace/i3blocks/scripts/bluetooth.nix +++ b/modules/workspace/i3blocks/scripts/bluetooth.nix @@ -1,21 +1,37 @@ -{ iconfont, bash, bluez, pulseaudio, utillinux, ... }: +{ iconfont, bash, bluez, pulseaudio, utillinux, python3, ... }: '' #!${bash}/bin/bash if ${utillinux}/bin/rfkill | grep bluetooth > /dev/null; then if ${utillinux}/bin/rfkill | grep bluetooth | grep blocked > /dev/null; then if ${bluez}/bin/bluetoothctl info > /dev/null; then if ${pulseaudio}/bin/pactl list sinks | grep bluez > /dev/null; then - echo "" - exit 33 + echo -n "" else - echo "" + echo -n "" fi else - echo "" + echo -n "" fi else - echo "" - exit 33 + echo -n "" fi fi + DEVICE=$(${bluez}/bin/bluetoothctl info | grep -o "[0-9A-F][0-9A-F]:[0-9A-F][0-9A-F]:[0-9A-F][0-9A-F]:[0-9A-F][0-9A-F]:[0-9A-F][0-9A-F]:[0-9A-F][0-9A-F]" | head -1) + CHARGE=$(${python3.withPackages (ps: [ ps.pybluez ])}/bin/python3 ${./bluetooth_battery.py} $DEVICE) + code=0 + case $CHARGE in + 1?) icon=; code=33;; + 2?) icon=; code=33;; + 3?) icon=;; + 4?) icon=;; + 5?) icon=;; + 6?) icon=;; + 7?) icon=;; + 8?) icon=;; + 9?) icon=;; + 100) icon=;; + *) ; code=33;; + esac + echo "$icon" + exit $code '' diff --git a/modules/workspace/i3blocks/scripts/bluetooth_battery.py b/modules/workspace/i3blocks/scripts/bluetooth_battery.py new file mode 100755 index 0000000..efb34b0 --- /dev/null +++ b/modules/workspace/i3blocks/scripts/bluetooth_battery.py @@ -0,0 +1,91 @@ +#!/usr/bin/env python3 + +""" +A python script to get battery level from Bluetooth headsets + +Shamelessly stolen from https://github.com/TheWeirdDev/Bluetooth_Headset_Battery_Level +""" + +# License: GPL-3.0 +# Author: @TheWeirdDev +# 29 Sept 2019 + +import errno +import bluetooth +import sys + + +def send(sock, message): + sock.send(b"\r\n" + message + b"\r\n") + + +def getATCommand(sock, line, device): + blevel = -1 + + if b"BRSF" in line: + send(sock, b"+BRSF: 1024") + send(sock, b"OK") + elif b"CIND=" in line: + send(sock, b"+CIND: (\"battchg\",(0-5))") + send(sock, b"OK") + elif b"CIND?" in line: + send(sock, b"+CIND: 5") + send(sock, b"OK") + elif b"BIND=?" in line: + # Announce that we support the battery level HF indicator + # https://www.bluetooth.com/specifications/assigned-numbers/hands-free-profile/ + send(sock, b"+BIND: (2)") + send(sock, b"OK") + elif b"BIND?" in line: + # Enable battery level HF indicator + send(sock, b"+BIND: 2,1") + send(sock, b"OK") + elif b"XAPL=" in line: + send(sock, b"+XAPL: iPhone,7") + send(sock, b"OK") + elif b"IPHONEACCEV" in line: + parts = line.strip().split(b',')[1:] + if len(parts) > 1 and (len(parts) % 2) == 0: + parts = iter(parts) + params = dict(zip(parts, parts)) + if b'1' in params: + blevel = (int(params[b'1']) + 1) * 10 + elif b"BIEV=" in line: + params = line.strip().split(b"=")[1].split(b",") + if params[0] == b"2": + blevel = int(params[1]) + else: + send(sock, b"OK") + + if blevel != -1: + print(blevel) + return False + + return True + + +def main(): + if (len(sys.argv) < 2): + print("Usage: bl_battery.py [.PORT] ...") + print(" Port number is optional (default = 4)") + exit() + else: + for device in sys.argv[1:]: + i = device.find('.') + if i == -1: + port = 10 + else: + port = int(device[i+1:]) + device = device[:i] + try: + s = bluetooth.BluetoothSocket(bluetooth.RFCOMM) + s.connect((device, port)) + while getATCommand(s, s.recv(128), device): + pass + s.close() + except OSError as e: + print(f"{device} is offline", e) + + +if __name__ == "__main__": + main() diff --git a/modules/workspace/i3blocks/scripts/sound.nix b/modules/workspace/i3blocks/scripts/sound.nix index e021a96..7f6eda4 100644 --- a/modules/workspace/i3blocks/scripts/sound.nix +++ b/modules/workspace/i3blocks/scripts/sound.nix @@ -1,4 +1,4 @@ -{ pamixer, lxqt, iconfont, ... }: '' +{ pamixer, lxqt, iconfont, config, lib, ... }: '' case $BLOCK_BUTTON in 2) ${pamixer}/bin/pamixer -t;; 4) ${pamixer}/bin/pamixer -i 5;; @@ -26,7 +26,7 @@ fi fi fi - [[ -n $BLOCK_BUTTON ]] && text=" $volume$end" + ${lib.optionalString (! config.deviceSpecific.bigScreen) "[[ -n $BLOCK_BUTTON ]] &&"} text=" $volume$end" echo "$icon$text" exit $code ''