{"id":313,"date":"2013-05-18T21:35:51","date_gmt":"2013-05-18T13:35:51","guid":{"rendered":"http:\/\/www.freezhongzi.info\/?p=313"},"modified":"2019-09-29T10:08:43","modified_gmt":"2019-09-29T02:08:43","slug":"mini2440%e4%b8%8a%e5%ae%9e%e7%8e%b0%e7%bd%91%e7%bb%9c%e7%94%b5%e5%8f%b0%e6%92%ad%e6%94%be","status":"publish","type":"post","link":"https:\/\/bl4kraven.com\/index.php\/2013\/05\/18\/mini2440%e4%b8%8a%e5%ae%9e%e7%8e%b0%e7%bd%91%e7%bb%9c%e7%94%b5%e5%8f%b0%e6%92%ad%e6%94%be\/","title":{"rendered":"mini2440\u4e0a\u5b9e\u73b0\u7f51\u7edc\u7535\u53f0\u64ad\u653e"},"content":{"rendered":"<p>\u4e0a\u6b21\u8bf4\u5230\u8981\u5b9e\u73b0\u4e00\u4e2a\u65e0\u7ebf\u9f20\u6807\u63a7\u5236\u7684\u7f51\u7edc\u7535\u53f0\u64ad\u653e\u7a0b\u5e8f\uff08\u8fdc\u7a0b\u63a7\u5236:)\uff09\uff0c\u4eca\u5929\u6709\u7a7a\u5c31\u5b9e\u73b0\u4e86\u3002\u4e3b\u8981\u7684\u96be\u70b9\u5c31\u662f\u8bfb\u53d6\u9f20\u6807\u6570\u636e\uff0c\u6628\u5929\u82b1\u4e86\u4e00\u5929\u65f6\u95f4\u770b\u4e86linux kernel\u7684driver\/input\/mousedev.c\u6e90\u4ee3\u7801\uff0c\u770b\u61c2\u4e86\u6570\u636e\u683c\u5f0f\u548c\u63a7\u5236\u539f\u7406\uff0c\u5c31\u5f88\u7b80\u5355\u4e86:)\u3002<\/p>\n<p>\u9f20\u6807\u7684\u8bbe\u5907\u6587\u4ef6\u662f\/dev\/input\/mice\uff0c\u9ed8\u8ba4\u8bfb\u53d6\u7684\u662fPS2\u6570\u636e\uff0c\u52063\u4e2a\u5b57\u8282\uff0c\u5206\u522b\u662f3\u4e2a\u6309\u952e\u3001X\u3001Y\u5750\u6807\u3002\u4e0d\u8fc7\u8981\u6ce8\u610f\u7684\u662fXY\u5750\u6807\u90fd\u662f\u76f8\u5bf9\u5750\u6807\uff08<strong>\u4e0d\u8d85\u8fc7127\uff0c\u6709\u7b26\u53f7<\/strong>\uff09\uff0c\u5982\u679c\u8981\u83b7\u5f97\u6eda\u8f6e\u6570\u636e\u9700\u8981\u6253\u5f00im\u6269\u5c55\uff0c\u76f4\u63a5\u5411mice\u5199\u6570\u636e\u4e32{ 0xf3, 200, 0xf3, 100, 0xf3, 80 }\u5c31\u884c\u4e86\uff0c\u8fd9\u4e2a\u5728mousedev.c\u5199\u7684\u5f88\u6e05\u695a\u4e86\uff0cPS2\u683c\u5f0f\u53c2\u8003\u770b<a href=\"http:\/\/www.computer-engineering.org\/ps2mouse\/\">\u8fd9\u91cc<\/a>\u3002<\/p>\n<p>\u89e3\u51b3\u4e86\u9f20\u6807\u63a7\u5236\uff0c\u5177\u4f53\u64ad\u653e\u5c31\u5f00\u4e2a\u8fdb\u7a0b\u653emplayer\uff0c\u628a\u6240\u6709\u7535\u53f0URL\u653e\u5728playlist\u91cc\u5c31\u884c\u4e86\uff0cmplayer\u652f\u6301\u4ece\u6807\u51c6\u8f93\u5165\u7684\u6309\u952e\u63a7\u5236\uff0c0\u548c9\u63a7\u5236\u97f3\u91cf\uff0c&lt;\u548c&gt;\u5bf9\u5e94\u524d\u8fdb\u548c\u540e\u9000\uff0cp\u662f\u6682\u505c\u3002\u8fdb\u7a0b\u95f4\u901a\u4fe1\u5c31\u7528pipe\uff0c\u4e0d\u8fc7\u5efapipe\uff0c\u7ed1\u5b9astdin\u6709\u70b9\u9ebb\u70e6\uff0c\u6709\u73b0\u6210\u7684API\u505a\u4e86\u8fd9\u4e9b\u4e86\uff0cpopen\u548cpclose\u5c31\u53ef\u4ee5\u641e\u5b9a\u8fd9\u4e9b\u3002\u6700\u540e\u7528\u9f20\u6807\u5de6\u952e\u524d\u7ffb\uff0c\u53f3\u952e\u540e\u7ffb\uff0c\u4e2d\u952e\u6682\u505c\uff0c\u6eda\u8f6e\u63a7\u5236\u97f3\u91cf\u3002<\/p>\n<p>Talk is cheap, show me the code: <a href=\"https:\/\/github.com\/bl4kraven\/mini2440-network-radio\">github<\/a><\/p>\n<pre><code>\/\/ @author: bl4kraven\n\/\/ @brief:  just a network radio player and control by mouse.\n\/\/          using mplayer as backend, left button previous, right button forward and middle button pause.\n\/\/ @see  linux kernel drivers\/input\/mousedev.c\n\/\/       http:\/\/www.computer-engineering.org\/ps2mouse\/\n\/\/       \n#include &lt;cstdio&gt;\n#include &lt;sys\/stat.h&gt;\n#include &lt;sys\/types.h&gt;\n#include &lt;fcntl.h&gt;\n#include &lt;errno.h&gt;\n#include &lt;unistd.h&gt;\n\ntypedef unsigned char BYTE;\n\n#pragma pack(1)\nstruct imps2_data\n{\n    BYTE btn_left:1;\n    BYTE btn_right:1;\n    BYTE btn_middle:1;\n    BYTE NONE:1;\n    BYTE x_sign:1;  \/\/ x offset sign\n    BYTE y_sign:1;  \/\/ y offset sign\n    BYTE x_overflow:1; \/\/ x offset is overflow\n    BYTE y_overflow:1; \/\/ y offset is overflow\n\n    \/\/ x\/y movement offset relative to its position\n    signed char x;\n    signed char y;\n    signed char z;\n};\n#pragma pack()\n\nint main(int argc, char *argv[])\n{\n    BYTE mousedev_imps_seq[] = { 0xf3, 200, 0xf3, 100, 0xf3, 80 };\n    int mice_fd = open(\"\/dev\/input\/mice\", O_RDWR|O_NONBLOCK);\n    if (mice_fd == -1)\n    {\n        fprintf(stderr, \"Open mice fail\");\n        return 1;\n    }\n\n    \/\/ set mice mode, so can read rolling wheels\n    int nRet = write(mice_fd, mousedev_imps_seq, sizeof(mousedev_imps_seq));\n    if (nRet &lt; 0)\n    {\n        fprintf(stderr, \"set mice imps2 fail\\n\");\n        return 1;\n    }\n\n\n    FILE *stream = popen(\"mplayer -quiet -softvol -softvol-max 300 -playlist channel.txt\", \"w\");\n    if (stream == NULL || stream &lt; 0)\n    {\n        fprintf(stderr, \"popen mplayer fail\\n\");\n        return 1;\n    }\n\n    while (true)\n    {\n        fd_set fdset;\n        \/\/struct timeval tv;\n        \/\/tv.tv_sec = 0;\n        \/\/tv.tv_usec = 200000;\n\n        FD_ZERO(&amp;fdset);\n        FD_SET(mice_fd, &amp;fdset);\n\n        int ret = select(mice_fd+1, &amp;fdset, NULL, NULL, NULL);\n        if (ret &lt; 0)\n        {\n            fprintf(stderr, \"select return error\\n\");\n            return 1;\n        }\n        else\n        {\n            if (FD_ISSET(mice_fd, &amp;fdset))\n            {\n                imps2_data data;\n                while (true)\n                {\n                    int nLen = read(mice_fd, &amp;data, sizeof(data));\n                    if (nLen == 0)\n                    {\n                        fprintf(stderr, \"End of file \\n\");\n                        return 1;\n                    }\n                    else if (nLen == -1)\n                    {\n                        if (errno != EAGAIN)\n                        {\n                            fprintf(stderr, \"read fail\\n\");\n                            return 1;\n                        }\n                        break;\n                    }\n                    else\n                    {\n                        \/\/ nLen = 1 is ack\n                        if (nLen == sizeof(data))\n                        {\n                            \/\/printf(\"nLen:%d, left:%d right:%d middle:%d X:%d Y:%d Z:%d\\n\",\n                            \/\/        nLen, data.btn_left, data.btn_right, data.btn_middle, data.x, data.y, data.z);\n                            if (data.btn_left)\n                            {\n                                if (data.btn_right)\n                                {\n                                    \/\/ OK quit\n                                    close(mice_fd);\n\n                                    fprintf(stream, \"q\");\n                                    fflush(stream);\n\n                                    \/\/ wait process exit\n                                    pclose(stream);\n                                    return 0;\n                                }\n\n                                \/\/ preivous\n                                fprintf(stream, \"&lt;\");\n                                fflush(stream);\n                            }\n                            else if (data.btn_right)\n                            {\n                                \/\/ forword\n                                fprintf(stream, \"&gt;\");\n                                fflush(stream);\n                            }\n                            else if (data.btn_middle)\n                            {\n                                \/\/ pause\n                                fprintf(stream, \"p\");\n                                fflush(stream);\n                            }\n                            else if (data.z != 0)\n                            {\n                                if (data.z &gt; 0)\n                                {\n                                    \/\/ rolling down\n                                    fprintf(stream, \"9\");\n                                    fflush(stream);\n                                }\n                                else\n                                {\n                                    \/\/ rolling up\n                                    fprintf(stream, \"0\");\n                                    fflush(stream);\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    return 0;\n}\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u4e0a\u6b21\u8bf4\u5230\u8981\u5b9e\u73b0\u4e00\u4e2a\u65e0\u7ebf\u9f20\u6807\u63a7\u5236\u7684\u7f51\u7edc\u7535\u53f0\u64ad\u653e\u7a0b\u5e8f\uff08\u8fdc\u7a0b\u63a7\u5236:)\uff09\uff0c\u4eca\u5929\u6709\u7a7a\u5c31\u5b9e\u73b0 &hellip; <a href=\"https:\/\/bl4kraven.com\/index.php\/2013\/05\/18\/mini2440%e4%b8%8a%e5%ae%9e%e7%8e%b0%e7%bd%91%e7%bb%9c%e7%94%b5%e5%8f%b0%e6%92%ad%e6%94%be\/\">\u7ee7\u7eed\u9605\u8bfb <span class=\"meta-nav\">&rarr;<\/span><\/a> <a href=\"https:\/\/bl4kraven.com\/index.php\/2013\/05\/18\/mini2440%e4%b8%8a%e5%ae%9e%e7%8e%b0%e7%bd%91%e7%bb%9c%e7%94%b5%e5%8f%b0%e6%92%ad%e6%94%be\/\">\u7ee7\u7eed\u9605\u8bfb <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-313","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/bl4kraven.com\/index.php\/wp-json\/wp\/v2\/posts\/313","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bl4kraven.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bl4kraven.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bl4kraven.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bl4kraven.com\/index.php\/wp-json\/wp\/v2\/comments?post=313"}],"version-history":[{"count":2,"href":"https:\/\/bl4kraven.com\/index.php\/wp-json\/wp\/v2\/posts\/313\/revisions"}],"predecessor-version":[{"id":585,"href":"https:\/\/bl4kraven.com\/index.php\/wp-json\/wp\/v2\/posts\/313\/revisions\/585"}],"wp:attachment":[{"href":"https:\/\/bl4kraven.com\/index.php\/wp-json\/wp\/v2\/media?parent=313"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bl4kraven.com\/index.php\/wp-json\/wp\/v2\/categories?post=313"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bl4kraven.com\/index.php\/wp-json\/wp\/v2\/tags?post=313"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}