Widora-NEO:热插拔自动播放U盘里的MP3 && 识别鼠标 && 用鼠标控制音量



  • 学习了一下Openwrt的热插拔机制,编了个脚本在Widora-NEO上试验,可以实现自动播放U盘中的MP3文件,在播放的时候热插拔一下,居然也OK.
    分享一下代码,一般第一个u盘的设备名总是sda, 在/etc/hotplug.d/block目录下建立一个名称为20-usb-storage的脚本文件,内容如下:

     usbdev="sda"
     case "$ACTION" in
         add)
                if [ -b "/dev/$usbdev" ]; then
                        mkdir /mnt/music
                        mount /dev/$usbdev /mnt/music
                        ls /mnt/music/*.mp3 >/mnt/mp3.list
                        screen -dmS MPLAYER mplayer -slave -input file=/mplayer/slave -playlist /mnt/mp3.list
                fi
                ;;
        remove)
                if [ ! -b "/dev/$usbdev" ]; then
                        rm -r /mnt/music
                fi
                ;;
     esac
    

    保存好文件后就会立即生效,可以拿个U盘来试验下。播放器可以根据自己喜好选择, 用mplayer的好处就是可以在slave模式下对其进行各种控制。

    同样原理, 鼠标插拔的事件也可以被检测到,并启动自己的相关程序,不过这个相关脚本要放在/etc/hotplug.d/usb目录下。



  • 做了2点改进:

    1. 自动获得设备名。
    2. 拔出时自动kill掉相关进程。
    case "$ACTION" in
            add)
                    if [ -b "/dev/$DEVNAME" ]; then
                            mkdir /mnt/music
                            mount /dev/$DEVNAME /mnt/music
                            ls /mnt/music/*.mp3 >/mnt/mp3.list
                            screen -dmS U_MPLAYER mplayer -slave -input file=/mplayer/slave -playlist /mnt/mp3.list
                    fi
                    ;;
            remove)
                    if [ ! -b "/dev/$DEVNAME" ]; then
                            sync
                            runpid=`pgrep -f U_MPLAYER`
                            kill $runpid
                            rm -r /mnt/music
                    fi
                    ;;
    esac
    
    


  • ------------- 鼠标的热插拔脚本 ------------
    鼠标的热插拔脚本本来放在usb目录下,后来觉得放在hid (Human Interface Device) 目录下比较恰当。

    1. 修改/etc/hotplug.json文件,在SUBSYSTME设置中增加hid ,见下:
    ...  
            [ "if",
                    [ "eq", "SUBSYSTEM",
                            [ "net", "input", "hid", "usb", "usbmisc", "ieee1394", "block", "atm", "zaptel", "tty", "button" ]
                    ],
                    [ "exec", "/sbin/hotplug-call", "%SUBSYSTEM%" ]
            ],
    ...
    

    完成后需要重启一下widora。

    1. 在/etc/hotplug.json目录下建立一个hid目录,在其中建立一个 名为readmouse的文件,内容如下:
    case "$ACTION" in
            add)
                    if [ "$HID_NAME"x = "Logitech USB-PS/2 Optical Mouse"x ];then
                            #--------- 以是鼠标数据的处理程序 
                            screen -dmS READMOUSE /home/readmouse /dev/input/mouse0
                    fi
                    ;;
            remove)
                    if [ ! -c "/dev/input/mouse0" ];then
                            killall readmouse
                    fi
                    ;;
    esac
    

    HID_NAME根据你的鼠标具体设置。

    1. 插拔一下鼠标试验一下。

    另外,发现放在hid目录里的脚本在开机的时候也能自动加载,当然,前提是你的usb设备已经插入了。



  • -------------- 用鼠标滚轮控制音量 --------------
    参考了网上“Linux鼠标数据读取操作”的文章,稍做修改就可以用来调节alsa播放的音量大小了。
    mouse的默认驱动是没有鼠标滚轮数值的,你需要增加下面的代码,将鼠标设置为Miscrosft Intellimouse类型鼠标:
    ... ...
    unsigned char setbuf[6]={0xf3,200,0xf3,100,0xf3,80};
    .... ...
    /* set mouse type to Miscrosft Intellimouse */
    nwrite=write(fd,setbuf,6);
    参考: https://github.com/widora/ctest/blob/master/readmouse.c

    把编译出来的readmouse程序放在上面的鼠标热插拔脚本里面,就会自动加载了。用鼠标滚轮来调节音量, 手感还真不错!
    另外,你也可以把左/右/中按键分别用来控制后退/前进/暂停操作,使用起来也很方便。

    如果你使用无线鼠标的话就相当于一个遥控器了。
    0_1511683149855_mouse_remote.JPG



  • 使用udev的时候发现一个问题,hid目录下的热插拔脚本会被执行2次,看来udev和hotplug有重复的部分。