From 846f1edff9c3dadee3ed40523d7b9fd4d792e1e2 Mon Sep 17 00:00:00 2001 From: Hugo Villeneuve Date: Mon, 28 Oct 2024 18:10:59 -0400 Subject: [PATCH] rpi: add hvmpd daemon and service --- .../images/include/image-hvmpd-common.inc | 5 + .../hvmpd-manager/files/hvmpd.service | 10 + .../hvmpd-manager/files/hvmpd.sh | 221 ++++++++++++++++++ .../hvmpd-manager/hvmpd-manager.bb | 31 +++ 4 files changed, 267 insertions(+) create mode 100644 recipes-multimedia/hvmpd-manager/files/hvmpd.service create mode 100644 recipes-multimedia/hvmpd-manager/files/hvmpd.sh create mode 100644 recipes-multimedia/hvmpd-manager/hvmpd-manager.bb diff --git a/recipes-core/images/include/image-hvmpd-common.inc b/recipes-core/images/include/image-hvmpd-common.inc index 33cb43e..2085d6e 100644 --- a/recipes-core/images/include/image-hvmpd-common.inc +++ b/recipes-core/images/include/image-hvmpd-common.inc @@ -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 index 0000000..ee3b41a --- /dev/null +++ b/recipes-multimedia/hvmpd-manager/files/hvmpd.service @@ -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 index 0000000..78fcf8a --- /dev/null +++ b/recipes-multimedia/hvmpd-manager/files/hvmpd.sh @@ -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 index 0000000..ef086a6 --- /dev/null +++ b/recipes-multimedia/hvmpd-manager/hvmpd-manager.bb @@ -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" -- 2.20.1