rpi: add hvmpd daemon and service
authorHugo Villeneuve <hugo@hugovil.com>
Mon, 28 Oct 2024 22:10:59 +0000 (18:10 -0400)
committerHugo Villeneuve <hugo@hugovil.com>
Wed, 3 Dec 2025 15:38:48 +0000 (10:38 -0500)
recipes-core/images/include/image-hvmpd-common.inc
recipes-multimedia/hvmpd-manager/files/hvmpd.service [new file with mode: 0644]
recipes-multimedia/hvmpd-manager/files/hvmpd.sh [new file with mode: 0644]
recipes-multimedia/hvmpd-manager/hvmpd-manager.bb [new file with mode: 0644]

index 33cb43e..2085d6e 100644 (file)
@@ -23,3 +23,8 @@ IMAGE_INSTALL:append = " \
     ympd \
     shairport-sync \
 "
+
+# RPI board specific features/components:
+IMAGE_INSTALL:append:rpi = " \
+    hvmpd-manager \
+"
diff --git a/recipes-multimedia/hvmpd-manager/files/hvmpd.service b/recipes-multimedia/hvmpd-manager/files/hvmpd.service
new file mode 100644 (file)
index 0000000..ee3b41a
--- /dev/null
@@ -0,0 +1,10 @@
+[Unit]
+Description=HVMPD daemon
+After=network.target
+
+[Service]
+ExecStart=/usr/sbin/hvmpd.sh
+Restart=no
+
+[Install]
+WantedBy=multi-user.target
diff --git a/recipes-multimedia/hvmpd-manager/files/hvmpd.sh b/recipes-multimedia/hvmpd-manager/files/hvmpd.sh
new file mode 100644 (file)
index 0000000..78fcf8a
--- /dev/null
@@ -0,0 +1,221 @@
+#!/bin/bash
+
+. /usr/bin/hvutils-lcd.sh
+
+fill="                    "
+
+l1="HVMPD"
+l2=""
+l3=""
+l4=""
+
+# Previous line variables:
+l1p=""
+l2p=""
+l3p=""
+l4p=""
+
+led_on() {
+    cat /sys/class/leds/status/max_brightness > /sys/class/leds/status/brightness
+}
+
+led_off() {
+    echo 0 > /sys/class/leds/status/brightness
+}
+
+is_mpc_playing() {
+    if mpc | grep -q "\[playing\]"; then
+        return 0
+    else
+        return 1
+    fi
+}
+
+declare -a key_prev=(
+[0]=0
+[1]=0
+[2]=0
+[3]=0
+[4]=0
+[5]=0
+)
+
+# Arg1: key code
+#
+# Return value:
+#   0 -> key pressed
+#   1 -> key NOT pressed
+key_pressed() {
+    local key_code=${1}
+    local dev
+    local evdev
+    local prev
+    local key
+    local id
+    local rc
+
+    case ${key_code} in
+        KEY_UP)
+            id=0
+            dev="0"
+            ;;
+        KEY_DOWN)
+            id=1
+            dev="3"
+            ;;
+        KEY_LEFT)
+            id=2
+            dev="4"
+            ;;
+        KEY_RIGHT)
+            id=3
+            dev="1"
+            ;;
+        KEY_ENTER)
+            id=4
+            dev="2"
+            ;;
+        KEY_PLAYPAUSE)
+            id=5
+            dev="5"
+            ;;
+        *)
+            log_err "Unsupported key: ${key_code}"
+            ;;
+    esac
+
+    evdev="/dev/input/event${dev}"
+
+    #  0 -> key pressed
+    # 10 -> key NOT pressed
+    evtest --query ${evdev} EV_KEY ${key_code}
+    if [ $? -eq 0 ]; then
+        key="1"
+    else
+        key="0"
+    fi
+
+    log_dbg "keycode: ${key_code}"
+    log_dbg "  evdev=$evdev"
+    log_dbg "  id=$id"
+    log_dbg "  key =$key"
+    log_dbg "  prev=$key"
+
+    if [ ${key_prev[${id}]} != "${key}" -a ${key} = "1" ]; then
+        rc=0
+        log_info "key pressed: ${key_code}"
+    else
+        rc=1
+    fi
+
+    key_prev[${id}]=${key}
+
+    return ${rc}
+}
+
+keys_manager() {
+    while true; do
+        if key_pressed KEY_PLAYPAUSE ; then
+            log_info "mpc toggle"
+
+            if is_mpc_playing ; then
+                mpc stop 1> /dev/null
+            else
+                mpc play 1> /dev/null
+            fi
+        fi
+
+        if is_mpc_playing ; then
+           led_on
+            log_dbg "[playing]"
+        else
+           led_off
+            log_dbg "[paused]"
+        fi
+
+        sleep 0.01
+    done
+}
+
+lcd_init
+
+# Start function in the background
+keys_manager &
+
+# Save PID
+pid=$!
+
+while true; do
+    # mpc -f "<%name%> <%title%> <%album%>" current
+    current="$(mpc current)"
+    log_dbg "current = ${current}"
+
+    if is_mpc_playing ; then
+        # | awk '{$1=$1};1' --> trim spaces before and after
+
+        station="${current}"
+
+        if echo "${current}" | grep -q -e "http" ; then
+            station="${current}"
+        elif echo "${current}" | grep -q -e ":" ; then
+            station="$(echo ${current} | awk -F: '{print $1}' | awk '{$1=$1};1')"
+        fi
+
+        song="$(echo ${current} | awk -F: '{print $2}' | awk '{$1=$1};1')"
+
+        if [ "${station}" != "${station_prev}" -o \
+             "${song}" != "${song_prev}" ]; then
+
+            log_dbg "station = ${station}"
+
+            l1="${station}"
+
+            if [ "${song}" != "${station}" ]; then
+                log_dbg "song = ${song}"
+
+                if echo "${song}" | grep -q -e "---" ; then
+                    artist="$(echo ${song} | sed "s@\(^.*\)---.*@\1@")"
+                    song="$(echo ${song} | sed "s@^.*---\(.*\)@\1@")"
+                elif echo "${song}" | grep -q -e " - " ; then
+                    artist="$(echo ${song} | sed "s@\(^.*\) - .*@\1@")"
+                    song="$(echo ${song} | sed "s@^.* - \(.*\)@\1@")"
+                else
+                    artist=""
+                fi
+
+                log_dbg "artist = ${artist}"
+            fi
+        fi
+    else
+        song=""
+        artist=""
+
+        if [ "${station}" = "" ]; then
+            station="HVMPD"
+        fi
+    fi
+
+    station_prev="${station}"
+    song_prev="${song}"
+    artist_prev="${artist}"
+
+    l1="${station}"
+
+    if [ "${artist}" != "" ]; then
+        l2="${artist}"
+        l4="${song}"
+    else
+        l2="${song}${fill}"
+        l4="$(printf "%.20s\n" "${l2:20}")"
+    fi
+
+    # Bug, écran défectueux ligne 3...
+    l3=""
+
+    lcd_update
+
+    sleep 1
+done
+
+# Kill keys_manager
+kill ${pid} >/dev/null 2>&1
diff --git a/recipes-multimedia/hvmpd-manager/hvmpd-manager.bb b/recipes-multimedia/hvmpd-manager/hvmpd-manager.bb
new file mode 100644 (file)
index 0000000..ef086a6
--- /dev/null
@@ -0,0 +1,31 @@
+DESCRIPTION = "hvmpd daemon"
+SECTION = "multimedia"
+LICENSE = "GPL-2.0-or-later"
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/GPL-2.0-or-later;md5=fed54355545ffd980b814dab4a3b312c"
+
+PV = "0.0.1"
+
+SRC_URI = "\
+    file://hvmpd.service \
+    file://hvmpd.sh \
+"
+
+inherit systemd
+
+do_install() {
+        install -d ${D}${sbindir}
+        install -m 0755 ${WORKDIR}/hvmpd.sh ${D}${sbindir}
+
+        install -d ${D}${systemd_unitdir}/system
+        install -m 0644 ${WORKDIR}/hvmpd.service ${D}${systemd_unitdir}/system
+}
+
+FILES:${PN} = " \
+    ${systemd_unitdir}/system/hvmpd.service \
+    ${sbindir}/hvmpd.sh \
+"
+
+SYSTEMD_AUTO_ENABLE = "enable"
+SYSTEMD_SERVICE:${PN} = "hvmpd.service"
+
+RDEPENDS:${PN} += "bash hvutils-lcd"