ºìÁªLinuxÃÅ»§
Linux°ïÖú

Linux ±Ê¼Ç±¾»ùÓÚ¡°Çôò¡±µÄÃüÁî

·¢²¼Ê±¼ä:2006-09-20 12:28:43À´Ô´:ºìÁª×÷Õß:System
¡¡¡¡ÓÐÊ·ÒÔÀ´µÚÒ»´Î£¬Äú¿ÉÒÔÇôòһϼÆËã»ú²¢µÃµ½ÓÐÒâÒåµÄÏìÓ¦£¡Ê¹Óà Linux® ºÍ Hard Drive Active Protection System£¨Ó²Å̻±£»¤ÏµÍ³£¬HDAPS£©ÄÚºËÇý¶¯³ÌÐò£¬ÎÒÃÇ¿ÉÒÔ·ÃÎÊ Lenovo£¨ÒÔǰ³ÆÎª IBM®£©ThinkPads ÉϵÄǶÈëʽ¼ÓËÙÆ÷£¬È»ºó´¦Àí¼ÓËÙÆ÷µÄÊý¾ÝÀ´¶ÁÈ¡ÌØ¶¨ ¡°Çôò¡± ʼþÐòÁУ¨Ò²¾ÍÊÇÄúʹÓùؽÚÇôò±Ê¼Ç±¾µÄʼþÐòÁУ©£¬²¢»ùÓÚÕâЩÇôòʼþÔËÐÐһЩÃüÁ˫»÷Ëø¶¨ÆÁÄ»£¬È»ºóÇÃÈëÃÜÂëÀ´½âËø¡£ÇôòÏÔʾÆÁÒ»´Î¾Í¿ÉÒÔÈà MP3 ²¥·ÅÆ÷ǰ½øÒ»¸öÒô¹ì¡£ÕâÀà¿ÉÄÜÊÂÎïÊÇÎÞÇîÎÞ¾¡µÄ¡£

¡¡¡¡2003 Ä꣬IBM ¿ªÊ¼·¢Ðм¯³ÉÁ˼ÓËÙÆ÷ºÍÏà¹ØÈí¼þµÄ ThinkPad ±Ê¼Ç±¾£¬ÒÔ±ãÔڱʼDZ¾µôµ½µØÉÏʱ¶ÔÓ²Å̽øÐб£»¤¡£À´×Ô IBM ºÍÆäËûµØ·½µÄºÚ¿ÍÒѾ­Îª Linux Äں˿ª·¢ÁËһЩģ¿éÀ´ÀûÓÃÕâЩ´«¸ÐÆ÷µÄÓŵ㡣ÆÁÄ»ÏÔʾ·½Ïò¡¢×ÀÃæÇл»¡¢ÉõÖÁÊÇÓÎÏ·¿ØÖƺÍʵʱµÄ±Ê¼Ç±¾Çãб¶È 3D Ä£¿éÏÖÔÚ¶¼ÒѾ­¿ÉÒÔʹÓÃÁË¡£±¾ÎĽ«Õ¹Ê¾ ¡°Çôò´úÂ롱 ÕâÖÖм¼ÊõºÍÒ»¸ö¼òµ¥³ÌÐò£¬¸Ã³ÌÐòÔÚ¼ì²âµ½Ìض¨µÄÇôò´úÂëʱ»áÔËÐÐһЩÃüÁî¡£

¡¡¡¡Ê¹ÓôøÓÐ HDAPS Çý¶¯µÄÒѸüеÄÄںˣ¬ÎÒÃǾͿÉÒÔÓÃÒ»¸ö¼òµ¥³ÌÐò knockAge À´Éú³ÉÇôò´úÂëÁË¡£ÎÒÃÇÒ²¿ÉÒÔÏÂÔØ²¢Ê¹ÓÃÒ»¸ö Perl ½Å±¾À´¶¨ÖÆ×Ô¼ºµÄÇôòÊäÈë»·¾³¡£Çë²ÎÔı¾ÎÄ×îºóµÄ ÏÂÔØ ºÍ ²Î¿¼×ÊÁÏ ²¿·Ö¸ø³öµÄÁ´½Ó£¬ÆäÖаüÀ¨Á˽â knockAge ²Ù×÷µÄÁ´½Ó¡£

¡¡¡¡Ó²¼þÐèÇó

¡¡¡¡ºÜ¶àÔÚ 2003 ÄêÒÔ¼°ÕâÒÔºóÉú²úµÄ IBM£¨ÏÖÔÚÊÇ Lenovo£©µÄ ThinkPads Öж¼ÓÐ HDAPS Ó²¼þ¡£Èç¹ûÄú²»È·¶¨×Ô¼ºµÄÓ²¼þÅäÖ㬿ÉÒÔ¼ì²é Lenovo µÄ Web Õ¾µãÉϹØÓÚÄú×Ô¼ºÐͺŵĻúÆ÷µÄ¼¼Êõϸ½Ú¡£Èç¹ûÄúµÄ»úÆ÷ÉÏûÓÐ ThinkPad£¬ÄÇôÕâ¶Î´úÂë¿ÉÄÜÎÞ·¨ÔÚÄúµÄ±Ê¼Ç±¾ÉÏÕý³£¹¤×÷¡£

¡¡¡¡±¾ÎÄÊÇÔÚ x86 Ìåϵ¼Ü¹¹ÉϱàдµÄ¡£±¾ÎÄÖеĴúÂëÊÇÔÚ ThinkPad T42p µÄÁ½¸ö²»Í¬Ä£¿éÉϽøÐпª·¢ºÍ²âÊԵġ£ÓÐ¹Ø ThinkPad Ó²¼þµÄÁ´½Ó£¬Çë²ÎÔÄ ²Î¿¼×ÊÁÏ ²¿·Ö¡£

¡¡¡¡Èç¹ûÄúÓÐһ̨ Apple MacBook£¬ÄÇôÄú¿ÉÄÜÒ²ÓÐÕâÖÖ¼ÓËÙÆ÷£¬²¢ÇÒ¿ÉÒÔʹÓÃÏàͬµÄ·½·¨£¬Í¨¹ýÄں˷ÃÎÊËüÃÇ¡£È»¶ø£¬±¾ÎÄÖеĴúÂ벢ûÓÐÔÚ Apple Ó²¼þÉϽøÐвâÊÔ¡£

¡¡¡¡Èí¼þÒªÇó

¡¡¡¡HDAPS Çý¶¯³ÌÐò±ØÐë°üÀ¨ÔÚÄÚºËÖвÅÄÜÆôÓöԼÓËÙÆ÷µÄ·ÃÎÊ¡£ÊÔͼ¶ÔÏÖÓÐÄÚºËÔö¼Ó²¹¶¡Ò²²»»á»ñµÃ³É¹¦£¬Òò´ËÎÒÃǽ¨Òé´Ó×Ô¼ºÏ²»¶µÄ¾µÏñÕ¾µãÉÏÏÂÔØ×îеÄÄںˡ£ÐÂÄں˷¢ÐаæÖÐÒѾ­°üº¬ÁË¶Ô HDAPS Çý¶¯³ÌÐòµÄÖ§³Ö¡£

¡¡¡¡Æô¶¯ÄÚºËÅäÖÃÑ¡Ôñ³ÌÐò£¬²¢ÔÚÅäÖÃÖаüº¬ HDAPS Çý¶¯³ÌÐò¡£HDAPS Çý¶¯³ÌÐòλÓÚ Device Drivers > Hardware Monitoring Support > IBM Hard Drive Active Protection System (hdaps) Ñ¡ÏîÖС£¸ü¶àµÄÄÚºËÅäÖúͰ²×°¹ý³ÌÒѾ­³¬³öÁ˱¾Îĵķ¶Î§£¬µ«ÊÇÔÚ Web Õ¾µãÉÏÓкܶà½Ì³Ì¿ÉÒÔÌṩ¾ßÌåµÄ°ïÖú£»ÓйؿÉÒÔ°ïÖúÎÒÃÇÈëÃŵÄÁ´½Ó£¬Çë²ÎÔÄ ²Î¿¼×ÊÁÏ Ò»½ÚµÄÄÚÈÝ¡£

¡¡¡¡±¾ÎÄÊÇÔÚ 2.6.15.1 °æ±¾µÄÄÚºËÉϽøÐпª·¢ºÍ²âÊԵġ£

¡¡¡¡´´½¨¼òµ¥µÄÇôòÐòÁÐ

¡¡¡¡´Ó ÏÂÔØ Ò»½ÚµÄÁ´½ÓÖÐÏÂÔØÔ´´úÂ룬²¢´ÓÖÐÕÒµ½ knockAge.pl ½Å±¾¡£Õâ¾ÍÊÇÈÃÎÒÃÇ¿ÉÒÔ´´½¨ÇôòÐòÁеÄÖ÷Òª Perl ³ÌÐò£¬Ëü»¹ÔÊÐí¼àÌýÌØÊâµÄÇôòÐòÁв¢ÔËÐÐÃüÁî¡£ÏÂÃæÈÃÎÒÃÇÀ´½éÉÜÒ»ÏÂÕâ¸öÓû§¿Õ¼ä³ÌÐòµÄÓ÷¨£¬ÒÔ¼° knockAge.pl ³ÌÐòµÄÅäÖã¬È»ºóÔÙ¶ÔÕâ¸öº¯Êý½øÐлعˡ£

¡¡¡¡Ê¹ÓÃÏÂÃæµÄÃüÁîÔËÐÐ knockAge.pl ³ÌÐò£º

[code]perl knockAge.pl -c[/code]

¡¡¡¡Õâ»áÆô¶¯ Perl ³ÌÐòÀ´¼àÌýÇôòʼþ²¢¼Ç¼ÏÂËüÃÇÖ®¼äµÄ¼ä¾àÒÔ¹©½«À´Ê¹Óá£Ò»µ©³ÌÐò¿ªÊ¼ÔËÐÐÖ®ºó£¬¶Ô±Ê¼Ç±¾½øÐеÄÇôò²Ù×÷¾Í»á²úÉúЧ¹û¡£ÎÒÃDz¢²»ÐèÒªÔÚÎïÀíÉÏÒÆ¶¯×Ô¼ºµÄ ThinkPad À´×¢²áÇôòʼþ£¬Èç¹û ThinkPad ÔÚÒ»¸öÆ½ÃæÉÏ£¬Ö»Òª¶ÔÆä½øÐÐÒ»Ð©ÒÆ¶¯ºÍ»¬Ðм´¿É¡£ÎÒ½¨ÒéÄúÓÃ×óÓÒÎÕס ThinkPad ×ó±ß½Ó½üÁ¬½ÓÖáµÄµØ·½£¬Í¬Ê±ÓÃÓÒÊÖÔÚ¾àÀë LCD µ×²¿ 3 Ó¢´çµÄµØ·½ÇôòÏÔʾÆÁ¼´¿É¡£Çë²ÎÔÄ ÏÂÔØ ²¿·Ö¸ø³öµÄÊÓÆµÕ¹Ê¾£¬»ò²ÎÔÄ ²Î¿¼×ÊÁÏ ÖÐÓÃÀ´´´½¨ÇôòÐòÁеÄÀý×Ó¡£

¡¡¡¡ÌåÑ鲻ͬµÄÇôò·ù¶ÈºÍÁ¦¶È£¬´Ó¶øÁ˽â knockAge ³ÌÐòÄܹ»²¶»ñµÄʼþÅжÏÂÊ¡£¶ÔÓÚ´´½¨¸´ÔÓµÄÇôòʼþÀ´Ëµ£¬Õâ·Ç³£ÖØÒª¡£

¡¡¡¡µÚÒ»´ÎÕæÕý³¢ÊÔÇôòÓ¦¸Ã·Ç³£¼òµ¥£¬Á½´ÎË«»÷Ö®¼äÍ£Áô 0.5 Ã룬ȻºóÔÙ´ÎÔËÐÐ perl knockAge.pl -c£¬ÔÚ¿´µ½ ¡°enter a knock sequence¡± ʱÎȶ¨µØÇôò LCD ±ßÉÏÁ½´Î£¬ÖмäÍ£Áô 0.5 Ãë¡£ÔÚ 4 ÃëÖ®ºó»á×Ô¶¯³¬Ê±£¨ÕâÊÇ¿ÉÒÔÅäÖõģ©£¬ÄúËùÇôòµÄÐòÁлᱻ´òÓ¡³öÀ´£¬ÕâÀàËÆÓÚÏÂÃæµÄÀý×Ó£º

[code]0 540031 _#_ (command here) _#_ [/code]

¡¡¡¡ÈÃÎÒÃÇÀ´·ÖÎöÒ»ÏÂÕâÒ»ÐеÄÄÚÈÝ£ºÇôòÐòÁУ¬·Ö¸ô·û£¬ÃüÁîÇø£¬·Ö¸ô·û£¬×îºóÊÇ×¢ÊÍÇø¡£ÎÒÃǵÄÏÂÒ»¸ö²½ÖèÊǽ«ÕâÐÐÄÚÈݸ´ÖƵ½ knockAge.pl ³ÌÐòʹÓõÄĬÈÏÅäÖÃÎļþ {$HOME}/.knockFile ÖУ¬¸ÃÅäÖÃÎļþÒ²¿ÉÄÜÊÇ /home//.knockFile Îļþ¡£ÔÚʹÓÃÉÏÃæµÄÇôòÐòÁÐÐд´½¨ºÃ .knockFile ÎļþÖ®ºó£¬¾Í¿ÉÒÔ¶ÔÕâÐнøÐÐÐÞ¸ÄÀ´ÔËÐгÌÐòÁË¡£½« (command here) Îı¾ÐÞ¸Ä³É /bin/echo "double tap"£¬²¢½«×¢ÊÍÇøµÄÄÚÈÝÐ޸ijɸüÓÐÒâÒåµÄÄÚÈÝ£¬ÀýÈ磺

[code]0 540031 _#_ /bin/echo "double tap" _#_ Double tap event[/code]

¡¡¡¡ÏÖÔÚÎÒÃÇÒѾ­Ð޸ĺÃÕâ¸öÅäÖÃÎļþ£¬¿ÉÒÔ´òÓ¡Ò»Ìõ֪ͨÁË£¬½ÓÏÂÀ´Ê¹ÓÃÏÂÃæµÄÃüÁîÔÚÊØ»¤Ä£Ê½ÏÂÔËÐÐ knockAge ½Å±¾£º

[code]perl knockAge.pl[/code]

¡¡¡¡Õâ¸ö³ÌÐò»áÔÚºǫ́°²¾²µØ¼àÌý ~/.knockFile ËùÂÞÁеÄʼþ¡£ÇëʹÓÃÏàͬµÄ¼ä¸ôÔÙ´ÎË«»÷ÆÁÄ»£¬Äú»á¿´µ½ÔÚÆÁÄ»ÉÏ´òÓ¡³öÁË ¡°double tap¡± ÏûÏ¢¡£Èç¹ûÎÒÃÇÏ£Íû¸üÏêϸµØÁ˽â knockAge.pl ½Å±¾ÊÇÈçºÎ¹¤×÷µÄ£¬ÄÇôÎÒÃÇ¿ÉÒÔʹÓÃÏÂÃæµÄÃüÁîÔÚÊØ»¤Ä£Ê½ÏÂÔËÐÐËü£º

[code]perl knockAge.pl -v[/code]

¡¡¡¡Ê¹Óà xscreensaver Ëø¶¨ÆÁÄ»»ò´ò¿ªÆÁÄ»

¡¡¡¡´´½¨ ¡°password¡± ÐòÁÐ

¡¡¡¡Ê¹ÓÃÏÂÃæµÄÃüÁîÔÚ ¡°create¡± ģʽÏÂÔËÐÐ knockAge.pl ³ÌÐò£º

[code]perl knockAge.pl -c[/code]

¡¡¡¡ÏÖÔÚÎÒÃÇÐèÒª´´½¨Ò»¸ö½âËøµÄÃÜÂëÐòÁУ»ÎÒ½¨ÒéʹÓà ¡°¹ÎÁ³ºÍÀí·¢µÄ¶¯×÷¡±¡£ÇëÈ·±£Ã¿´ÎÄú¶¼¿ÉÒÔÒÔÒ»¹á¾«È·µÄ·½Ê½Ö´ÐÐÕâ¸ö¶¯×÷¡£¾¡¹ÜÄú¿ÉÒÔͨ¹ýÐ޸IJÎÊýÀ´¿ØÖÆÊäÈëÃÜÂëÇôò²Ù×÷ËùÐèÒªµÄ¾«¶È£¬µ«ÊÇÕâÈÔÈ»ºÜÄÑÆ¥Å侫ȷµÄʱ¼ä¡£¡°¹ÎÁ³ºÍÀí·¢¶¯×÷¡± ³ýÁË¿ÉÒÔÌṩÎȶ¨µÄ»÷´ò˳ÐòÖ®Í⣬Æä¸´ÔÓÐԺͼòµ¥ÐÔ¶ÔÓÚÆÁ±£½âËøÃÜÂëÀ´ËµÒ²·Ç³£Êʺϡ£ÏÂÃæÊÇÒ»¸ö ¡°¹ÎÁ³ºÍÀí·¢¶¯×÷¡± µÄ»÷´òÐòÁÐʾÀý£º

[code]0 564025 1185795 621350 516038 960035 444421 _#_ /bin/echo "shave the haircut" _#_ two bits[/code]

¡¡¡¡ÔÚ½øÐÐÏÂÒ»²½²Ù×÷֮ǰ£¬ÄúÓ¦¸ÃÌåÑéÒ»ÏÂÉÏÃæµÄÃüÁîºÍ ~/.knockFile ÅäÖÃÎļþÖеÄË«»÷ÃüÁî¡£Õâ¿ÉÒÔÔÚÆÁ±£ÔËÐÐʱÌṩºÜºÃµÄ°ïÖú£¬Ëü¸üÄѼì²â³öÇôòÊÇ·ñÕýÈ·¡£

¡¡¡¡xscreensaver ËùʹÓõÄÃüÁîÅäÖÃ

¡¡¡¡ÒÔÏÂÉèÖüÙÉèÄúÒѾ­µÇ¼µ½ÁË´°¿Ú¹ÜÀíÆ÷ÖУ¬²¢ÇÒÒѾ­Ê¹ÓÃÄúµÄ userid Æô¶¯ÁËxscreensaver ³ÌÐò¡£ÀýÈ磬Èç¹ûÄúÕýÔÚÔËÐÐ Fedora Core 4£¬²¢ÇÒʹÓà gdm µÇ¼µ½ KDE ÖУ¬ÄÇô xscreensaver ¾Í»á×Ô¶¯Æô¶¯¡£Òò´Ë£¬Òª¼¤»îËü£¬ÔòÐèÒª½«Ë«»÷ÃüÁî´Ó£º

[code]/bin/echo "double tap"[/code]

¡¡¡¡ÐÞ¸ÄΪ£º

[code]xscreensaver-command -activate &[/code]

¡¡¡¡ÏÖÔÚ£¬Ã¿´Îʶ±ð³öÓÐ ¡°Ë«»÷¡± ʼþ·¢Éúʱ£¬xscreensaver ³ÌÐò¶¼»áʹÓÃËùÖ¸¶¨µÄÄÚÈÝÀ´¼¤»î¡£Ò»µ© screensaver ±»¼¤»î£¬¾Í¿ÉÒÔͨ¹ýÊäÈëÃÜÂ루Èç¹ûÊÇÕâÑùÅäÖõģ©¶ÔÆÁÄ»½øÐнâËø¡£²»¹ýÎÒÃÇÕæÕýÏ£ÍûµÄÊÇ×Ô¼ºµÄÅóÓÑÒ²¿ÉÒÔʹÓÃÃÜÂë½âËø´úÂëÀ´½â³ýÆÁ±£¡£Òò´Ë£¬ÎÒÃÇÐèÒªÔÚ ~/.knockFile ÎļþÖн«ÏÂÃæµÄÃüÁ

[code]/bin/echo "shave the haircut"[/code]

¡¡¡¡Ì滻Ϊ£º

[code]killall xscreensaver ; nohup xscreensaver -nosplash >/dev/null 2>/dev/null &[/code]

¡¡¡¡Õâ¸öÃüÁî»áÍ£Ö¹µ±Ç°ÔËÐеÄËùÓÐ xscreensaver ³ÌÐò£¬È»ºóÔÚºǫ́ÔÙÖØÐÂÆô¶¯ xscreensaver¡£ÏÖÔÚÎÒÃÇ¿ÉÒÔͨ¹ýÇôòÆÁÄ»±ßÀ´Öظ´¼ÓËøºÍ½âËø¼ÆËã»úÆÁ±£µÄ¹ý³Ì¡£Õâ±ÈÀ¶ÑÀÌṩµÄ½üËÆ¶È¼ÓËø¸ü¼Ó°²È«»ò¸ü·½±ãÂ𣿴𰸿ÉÄÜÊÇ·ñ¶¨µÄ¡£Ëü¸ü¿áÂ𣿵±È»£¡

¡¡¡¡¸ü¶àÀý×Ó

¡¡¡¡HDAPS ´«¸ÐÆ÷ºÍ knockAge.pl ³ÌÐòÌṩÁËÁíÍâÒ»ÖÖÓû§ÊäÈëÉ豸£¬ÎÒÃÇ¿ÉÒÔʹÓÃËüÃÇÒÔ¶ÀÌØµÄ·½Ê½½øÐÐÊäÈë¡£ÀýÈ磺

¡¡¡¡Èç¹û¼Æ»®ÔÚÒ»¸ö»ù´¡ÉϲâÊÔÐ嵀 X ÅäÖÃÎļþ£¬¿ÉÒÔ½«Ë«»÷ÌõÄ¿¸ü¸ÄÎªÖØÐÂÆô¶¯ÅäÖÃºÃµÄ X ·þÎñÆ÷¡£ÕâÑù¾Í²»ÐèÒªÇÃÈÎºÎÆäËû¼üÀ´Ç¿ÖÆÖØÆôÁË¡£
¡¡¡¡ÔÚÃüÁîÇøÖпÉÒÔ·ÅÉÏÎÒÃÇϲ»¶Ê¹ÓõÄÈκΠshell ½Å±¾£¬ÕâÑù¾Í¿ÉÒÔʹÓÃË«»÷À´²é¿´ e-mail¡£
¡¡¡¡ÒÔ×îеÄ×éºÏ½ÚÅĽøÐÐÇôò£¬Èà ThinkLight ÏÔʾ WWII ´úÔÚ Kinakuta µÄ»Æ½ð´æ´¢É豸µÄ Morse ÃÜÂëλÖá£
¡¡¡¡ÇÃÈë Morse ±àÂ룬·ÀÖ¹¼üÅÌÊäÈë±»¼Ç¼¡£
¡¡¡¡Çë²ÎÔÄ ²Î¿¼×ÊÁÏ ²¿·Ö¸ø³öµÄÓйؽ« ThinkPad µÄÇãб¶ÈÓÃÓÚÓÎÏ·¡¢ÏÔʾ¹¤¾ßµÄÀý×Ó¡£»òÕßÖ±½ÓÌø¹ýÕⲿ·ÖÄÚÈÝ£¬½« Threshold ±äÁ¿ÉèÖÃΪ 15£¬ÕâÑùÄúʹ¾¢ÌßÒ»½Å ThinkPad£¬Ëü¾Í»á×Ô¶¯ÖØÆôÁË¡£

¡¡¡¡knockAge.pl ´úÂë

¡¡¡¡ÀúÊ·ºÍ²ßÂÔ

¡¡¡¡Jeff Molofee Ëù±àдµÄ hdaps-gl.c ÊÇ knockAge.pl ´úÂëµÄ»ù´¡¡£Hdaps-gl.c ÊÇÒ»¸ö·Ç³£ºÃµÄչʾ³ÌÐò£¬¿ÉÒÔչʾÈçºÎʹÓÃÇãб´«¸ÐÆ÷À´ÊµÊ±µØÏÔʾÓÐ¹Ø ThinkPad µÄ·½ÏòµÄÐÅÏ¢¡£¶þÕßÖ®¼äµÄÇø±ðÊDZ¾Àý½«Ê±¼äÉϸôÀëµÄʼþ×éÖ¯ÔÚÒ»Æð´´½¨ÁËÇôòʼþ£¬Í¬Ê±ÌṩÁËÏà¹ØµÄ´úÂëÀ´´´½¨²¢¼àÌýÇôòʼþÐòÁС£

¡¡¡¡²ÎÊýÅäÖÃ

¡¡¡¡ÏÂÃæÈÃÎÒÃÇÀ´Ê¹ÓöÔʱ¼äºÍ´«¸ÐÆ÷Ãô¸ÐµÄһЩ²ÎÊýÀ´Æô¶¯ knockAge.pl£º

Çåµ¥ 1. Ö÷³ÌÐò²ÎÊý
[code]require 'sys/syscall.ph'; # for subsecond timing

my $option = $ARGV[0] || ""; # simple option handling

# filename for hdaps sensor reads
my $hdapsFN = "/sys/devices/platform/hdaps/position";

my $UPDATE_THRESHOLD = 4; # threshold of force that indicates a knock
my $INTERVAL_THRESHOLD = 100000; # microseconds of time required between knock
# events
my $SLEEP_INTERVAL = 0.01; # time to pause between hdaps reads

my $MAX_TIMEOUT_LENGTH = 4; # maximum length in seconds of knock pattern
# length
my $MAX_KNOCK_DEV = 100000; # maximum acceptable deviation between recorded
# pattern values and knocking values

my $LISTEN_TIMEOUT = 2; # timeout value in seconds between knock
# events when in listening mode[/code]

¡¡¡¡ÕâЩ±äÁ¿¼°Æä×¢ÊͶ¼·Ç³£¼òµ¥¡£ËüÃǵÄÓ÷¨ºÍÅäÖÃÑ¡ÏîÔÚ±¾ÎĺóÃæ²¿·Ö»á½øÐнâÊÍ¡£ÏÂÃæÊÇÆäÓàµÄһЩȫ¾Ö±äÁ¿¼°ÆäÃèÊö¡£

Çåµ¥ 2. Çôòģʽ²ÎÊý
[code]my @baseKnocks = (); # contains knock intervals currently entered
my %knockHash = (); # contains knock patterns, associated commands

my $prevInterval = 0; # previous interval of time
my $knockCount = 0; # current number of knocks detected

my $restX = 0; # `resting' positiong of X axis accelerometer
my $restY = 0; # `resting' positiong of Y axis accelerometer
my $currX = 0; # current position of X axis accelerometer
my $currY = 0; # current position of Y axis accelerometer
my $lastX = 0; # most recent position of X axis accelerometer
my $lastY = 0; # most recent position of Y axis accelerometer


my $startTime = 0; # to manage timeout intervals
my $currTime = 0; # to manage timeout intervals
my $timeOut = 0; # perpetual loop variable
my $knockAge = 0; # count of knocks to cycle time interval[/code]

¡¡¡¡×Ó³ÌÐò

¡¡¡¡ÔÚÎÒÃǵÄ×Ó³ÌÐòÇåµ¥ÖÐÊ×ÏÈÊÇÒ»¸ö¼òµ¥µÄÂß¼­¿é£¬ÓÃÀ´¼ì²éÊÇ·ñÓмÓËÙÆ÷¿É¶Á£º

Çåµ¥ 3. ¼ì²é¼ÓËÙÆ÷µÄ×Ó³ÌÐò
[code]sub checkAccelerometer() {

my $ret;
$ret = readPosition ();
if( $ret ){
print "no accelerometer data available - tis bork ed\n";
exit(1);
}

}#checkAccelerometer[/code]

¡¡¡¡Jeff Molofee ±àдµÄ hdaps-gl.c ´úÂëΪ knockAge.pl ÖеÄËùÓдúÂëÌṩÁËÒ»¸öºÜºÃµÄÆðµã¡£ÔÚÏÂÃæµÄ readPosition ×Ó³ÌÐòÖУ¬ÎÒÃÇ¿ÉÒÔ¿´µ½ËûµÄ×¢ÊÍ¡£Õâ¸ö×Ó³ÌÐò½«´ò¿ªÒ»¸öÎļþ£¬´ÓÖжÁÈ¡µ±Ç°µÄ¼ÓËÙÆ÷Êý¾Ý£¬È»ºó¹Ø±ÕÎļþ£¬²¢·µ»Ø²»°üº¬ ¡°,£¨¶ººÅ£©¡± ×Ö·ûµÄÊý¾Ý¡£

Çåµ¥ 4. readPosition subroutine
[code]## comments from Jeff Molofee in hdaps-gl.c
#* read_position - read the (x,y) position pair from hdaps.
#*
#* We open and close the file on every invocation, which is lame but due to
#* several features of sysfs files:
#*
#* (a) Sysfs files are seekable.
#* (b) Seeking to zero and then rereading does not seem to work.
##
sub readPosition() {

my ($posX, $posY) = "";
my $fd = open(FH," $hdapsFN");

while( ){
s/\(//g;
s/\)//g;
($posX, $posY) = split ",";

}# while read

close(FH);

return( $posX, $posY );

}#readPosition[/code]

¡¡¡¡getEpochSeconds ºÍ getEpochMicroSeconds ÌṩÁËÓйØÇôòģʽ״̬µÄÏêϸ¶ø¾«È·µÄÐÅÏ¢¡£

Çåµ¥ 5. ʱ¼ä·Ö¸ôÆ÷
[code]sub getEpochMicroSeconds {

my $TIMEVAL_T = "LL"; # LL for microseconds
my $timeVal = pack($TIMEVAL_T, ());

syscall(&SYS_gettimeofday, $timeVal, 0) != -1 or die "micro seconds: $!";
my @vals = unpack( $TIMEVAL_T, $timeVal );
$timeVal = $vals[0] . $vals[1];
$timeVal = substr( $timeVal, 6);

my $padLen = 10 - length($timeVal);
$timeVal = $timeVal . "0" x $padLen;

return($timeVal);
}#getEpochMicroSeconds


sub getEpochSeconds {
my $TIMEVAL_T = "LL"; # LL for microseconds
my $start = pack($TIMEVAL_T, ());
syscall(&SYS_gettimeofday, $start, 0) != -1 or die "seconds: $!";
return( (unpack($TIMEVAL_T, $start))[0] );
}#getEpochSeconds[/code]

¡¡¡¡½ÓÏÂÀ´ÊÇ knockListen ×Ó³ÌÐò£¬Ç° 5 ÐиºÔð¶ÁÈ¡µ±Ç°µÄ¼ÓËÙÆ÷Êý¾ÝÖµ£¬²¢¶Ô»ù±¾µÄÖµ¶ÁÈ¡½øÐе÷Õû¡£Èç¹û¼ÓËÙÆ÷µÄÊýÁ¿ÔÚijһά¶ÈÉÏ´óÓÚ¸üÐÂÉÏÏÞÖµ£¬ÄÇô checkKnock ±äÁ¿¾Í±»ÉèÖÃΪ 1¡£ÎªÁ˵÷ÕûÕâ¸ö³ÌÐò£¬Ê¹ËüÖ»ÏìÓ¦ÎÒÃÇÐèÒªµÄÇôòʼþ»òÀàËÆµÄ¼ÓËÙÖµ£¬ÎÒÃÇÐèÒªÀ©´ó¸üÐÂÉÏÏÞ¡£ÀýÈ磬ÎÒÃÇ¿ÉÒÔ½« ThinkPad ·Åµ½×Ô¼ºµÄÆû³µÖУ¬²¢ÈÃËüÔÚ¼ì²âµ½Ó²¼ÓËÙ£¨»ò¼õËÙ£©Ê±¸ü¸Ä MP3 ²¥·ÅÁÐ±í¡£

¡¡¡¡Èç¹ûÇôò±Ê¼Ç±¾µÄÁ¦¶È×ã¹»´ó£¬²¢ÇÒ´óÓÚÁ˸üÐÂÉÏÏÞ£¬ÄÇô¾Í»áµ¼Öµ÷Óà getEpochMicroSeconds ×Ó³ÌÐò¡£È»ºó diffInterval ±äÁ¿»áÔÚÁ½´ÎÇôòʼþÖ®¼ä±»¸³Öµ¡£Õâ¸öÖµ½«ºÜ¶à»÷´òÁ¦¶È´óÓÚ¸üÐÂÉÏÏ޵ĺܶà¿ìËÙ¼ÓËÙ¶ÁȡѹËõµ½Ò»¸öʱ¼äÖС£Èç¹ûûÓмä¸ôÉÏÏÞ¼ì²é£¬Ò»´ÎÓ²Çôò¾Í»á±»×¢²á³ÉºÜ¶àʼþ£¬¾Í·Â·ðÊǼÓËÙÆ÷Á¬ÐøÒ»¶Îʱ¼ä²úÉú´óÁ¿Ê¼þÒ»Ñù¡£ÕâÖÖÐÐΪ¶ÔÓÚÓû§µÄÊÓÁ¦ºÍ´¥¾õÀ´Ëµ¶¼ÊÇÎÞ·¨¸ÐÖªµ½µÄ£¬µ«¶ÔÓÚ HDAPS À´ËµÏÔÈ»²¢·ÇÈç´Ë¡£Èç¹ûÒѾ­´ïµ½Á˼ä¸ôÉÏÏÞ£¬ÄÇôÇôò¼ä¸ô»á±»¼Ç¼ÔÚ baseKnocks Êý×éÖУ¬È»ºó½«Á½´ÎÇôòÖ®¼äµÄ¼ä¸ôÖØÖá£

¡¡¡¡×ÐϸÐÞ¸ÄÕâЩ±äÁ¿¿ÉÒÔ°ïÖú¶Ô³ÌÐò½øÐÐÓÅ»¯£¬´Ó¶øÊ¶±ð³öÄúÌØÓеÄÇôò·ç¸ñ¡£ËõС¸üÐÂÉÏÏÞ²¢À©´óÖÜÆÚÉÏÏÞ¿ÉÒÔ¼ì²â³ö¸ü¶à¼ä¸ôµÄÇá΢Çôò¡£»úеÇôòÉ豸»òÌØ¶¨µÄÇôò·½·¨¿ÉÄÜ»áÐèÒª½µµÍ¼ä¸ôÉÏÏÞ£¬´Ó¶øÊ¶±ð³ö¶ÀÌØµÄÇôòʼþ¡£

Çåµ¥ 6. knockListen ×Ó³ÌÐò
[code]sub knockListen() {

my $checkKnock = 0;
($currX, $currY) = readPosition();

$currX -= $restX; # adjust for rest data state
$currY -= $restY; # adjust for rest data state


# require a high threshold of acceleration to ignore non-events like
# bashing the enter key or hitting the side with the mouse
if( abs ($currX) > $UPDATE_THRESHOLD) {
$checkKnock = 1;
}

if( abs ($currY) > $UPDATE_THRESHOLD) {
$checkKnock = 1;
}


if( $checkKnock == 1 ){

my $currVal = getEpochMicroSeconds();
my $diffInterval = abs($prevInterval - $currVal);

# hard knock events can create continuous acceleration across a large time
# threshold. requiring an elapsed time between knock events effectively
# reduces what appear as multiple events according to sleep_interval and
# update_threshold into a singular event.
if( $diffInterval > $INTERVAL_THRESHOLD ){

if( $knockCount == 0 ){ $diffInterval = 0 }

if( $option ){
print "Knock: $knockCount ## last: [$currVal] curr: [$prevInterval] ";
print "difference is: $diffInterval\n";
}

push @baseKnocks, $diffInterval;
$knockCount++;

}# if the difference interval is greater than the threshold

$prevInterval = $currVal;

}#if checkknock passed

}#knockListen[/code]

¡¡¡¡ÔÚ´´½¨Çôòģʽʱ£¬¸Ãģʽ»á±»·ÅÈë ~/.knockFile ÎļþÖУ¬²¢Ê¹ÓÃÏÂÃæµÄ×Ó³ÌÐò½øÐжÁÈ¡£º

Çåµ¥ 7. ¶ÁÈ¡ÇôòÎļþ
[code]sub readKnockFile {

open(KNCKFILE,"$ENV{HOME}/.knockFile") or die "no knock file: $!";

while(){

if( !/^#/ ){

my @arrLine = split "_#_";
$knockHash{ $arrLine[0] }{ cmd } = $arrLine[1];
$knockHash{ $arrLine[0] }{ comment } = $arrLine[2];

}#if not a comment line

}#for each line in file

close(KNCKFILE);

}#readKnockFile[/code]

¡¡¡¡µ± knockListen »ñµÃÇôòģʽʱ£¬Ëü»á½«¸ÃģʽÓë´Ó readKnockFile ÖжÁÈ¡µÄÇôòģʽ½øÐбȽϡ£ÏÂÃæµÄ compareKnockSequences ×Ó³ÌÐò»á¶ÔÇôòÖ®¼äµÄʱ¼ä½øÐмòµ¥µÄÇø±ð¼ì²é¡£×¢Ò⣬ÇôòÖ®¼äµÄ²î±ð²¢²»ÊǼòµ¥»ìºÏÔÚÒ»ÆðµÄ£ººÜ¶à´ÎÇôòʱµÄÉÙÁ¿Ê±¼ä²î±ð²¢²»»áÀÛ»ý³É×ÜÌåµÄÆ¥ÅäʧЧ¡£

¡¡¡¡µÚÒ»¸öÒª±È½ÏµÄÊÇÇôòµÄ´ÎÊý£¬ÒòΪÎÒÃÇûÓбØÒª½«Ò»¸öÆß´ÎÇôòµÄÐòÁÐÓëÒ»¸öÁ½´ÎÇôòµÄÐòÁнøÐбȽϡ£Èç¹ûÇôòµÄ´ÎÊýÓë ~/.knockFile ÖÐÏÖÓеÄÇôòÐòÁÐÆ¥Å䣬ÿ´ÎÇôòÖ®¼äµÄ²î±ðÒ²ÉÙÓÚ×î´óÇôòÆ«²î£¬ÄÇôÕâ´ÎÇôò¾Í¿ÉÒÔÈÏΪÊÇÍêȫƥÅäµÄ¡£ÔÚÔÊÐíÇôòÐòÁнøÐв»¾«È·Æ¥Åäʱ£¬×î´óÇôòÆ«²î·Ç³£¹Ø¼ü¡£ÎÒÃÇ¿ÉÒÔÔö´ó×î´óÇôòÆ«²îÀ´Ê¹Çôò½Ú×à¸ü¼Ó×ÔÓÉ£¬µ«ÊÇҪעÒ⣬Õâ¿ÉÄܻᵼÖÂÇôòģʽƥÅä²»ÕýÈ·¡£ÀýÈ磬ÎÒÃÇ¿ÉÒÔÔÚËùÆÚÍûµÄʱ¼ä֮ǰ»òÖ®ºó°ëÃëÖÓÔÊÐí×Ô¼ºµÄÇôòģʽ·¢ÉúÆ«À룬µ«ÕâÈÔÈ»¿ÉÒÔÆ¥Åä¡£ÕâÑù¾Í¿ÉÒÔÓÐЧµØËµÃ÷ ¡°¹ÎÁ³ºÍÀí·¢¡± ¿ÉÒÔÓë ¡°Mary ÐÕ Little Lamb¡± Æ¥Å䣬Òò´ËÔÚÐÞ¸ÄÕâ¸ö²ÎÊýʱһ¶¨ÒªÐ¡ÐÄ¡£

¡¡¡¡Èç¹ûÍêÕûµÄģʽ¿ÉÒÔÆ¥Å䣬¾Í»áÔËÐÐ ~/.knockFile ÖÐÖ¸¶¨µÄÃüÁÈç¹ûÆôÓÃÁËÈßÓàģʽ£¬Ôò»á´òÓ¡½á¹û¡£ÏÂÒ»¸ö²½ÖèÊÇÈç¹ûûÓÐÕÒµ½Æ¥ÅäÏ¾ÍÍ˳öÕâ¸ö×Ó³ÌÐò£»Èç¹ûÕÒµ½ÁËÆ¥ÅäÏ¾ÍÖØÖÃËù¼Ç¼µÄÇôòÐòÁС£Õâ¸ö²½Öè»áÖ´ÐÐ compareKnockSequences ×Ó³ÌÐò£º

Çåµ¥ 8. ±È½ÏÇôòÐòÁÐ
[code]sub compareKnockSequences {

my $countMatch = 0; # record how many knocks matched

# for each knock sequence in the config file
for( keys %knockHash ){

# get the timings between knocks
my @confKnocks = split;

# if the count of knocks match
if( $knockCount eq @confKnocks ){

my $knockDiff = 0;
my $counter = 0;

for( $counter=0; $counter<$knockCount; $counter++ ){

$knockDiff = abs($confKnocks[$counter] - $baseKnocks[$counter]);
my $knkStr = "k $counter b $baseKnocks[$counter] ".
"c $confKnocks[$counter] d $knockDiff\n";

# if it's an exact match, increment the matching counter
if( $knockDiff < $MAX_KNOCK_DEV ){

if( $option ){ print "MATCH $knkStr" }
$countMatch++;

# if the knocks don't match, move on to the next pattern in the list
}else{

if( $option ){ print "DISSONANCE $knkStr" }
last;

}# deviation check

}#for each knock

}#if number of knocks matches

# if the count of knocks is an exact match, run the command
if( $countMatch eq @confKnocks ){
my $cmd = system( $knockHash{"@confKnocks "}{ cmd } );
if( $option ){ print "$cmd\n" }
last;

# otherwise, make the count of matches zero, in order to not reset
}else{
$countMatch = 0;
}

}#for keys

# if the match count is zero, exit and don't reset variables so a longer
# knock sequence can be entered and checked
if( $countMatch == 0 ){ return() }

# if a match occurred, reset the variables so it won't match another pattern
$knockCount = 0;
@baseKnocks = ();

}#compareKnockSequences[/code]

¡¡¡¡Ö÷³ÌÐòµÄÂß¼­

¡¡¡¡ÀûÓÃÕâЩ×Ó³ÌÐò£¬Ö÷³ÌÐòµÄÂß¼­ÔÊÐíÓû§´´½¨ÇôòÐòÁУ¬»òÔÚÊØ»¤Ä£Ê½Ï¼àÌýÇôòÐòÁв¢Ö´ÐÐÃüÁî¡£µÚÒ»²¿·ÖÊÇÔÚÓû§Ö¸¶¨ -c Ñ¡ÏÓÃÓÚ´´½¨Ä£Ê½£©Ê±Ö´Ðеġ£¿ÉÒÔÓüòµ¥µÄ³¬Ê±½ø³ÌÀ´½áÊøÇôòÐòÁС£Ôö´ó×î´ó³¬Ê±³¤¶È±äÁ¿µÄÖµ¿ÉÒÔÈÃÁ½´ÎÇôòÐòÁÐÖ®¼äÔÝÍ£ 4 ÃëÒÔÉÏ¡£Èç¹ûÎÒÃDZ£Áô×î´ó³¬Ê±³¤¶ÈΪ 4 Ã룬ÄÇô³ÌÐòÔËÐе½Õâ¸öʱ¼äʱ¾Í»á½áÊø£¬²¢´òÓ¡µ±Ç°ÊäÈëµÄÇôòÐòÁС£

Çåµ¥ 9. ´´½¨ÐòÁÐÖ÷Âß¼­
[code]if( $option eq "-c" ){

print "create a knock pattern:\n";

$startTime = getEpochSeconds(); # reset time out start

while( $timeOut == 0 ){

$currTime = getEpochSeconds();

# check if there has not been a knock in a while
if( $currTime - $startTime > $MAX_TIMEOUT_LENGTH ){

$timeOut = 1; # exit the loop

}else{

# if a knock has been entered before timeout, reset timers so
# more knocks can be entered

if( $knockCount != $knockAge ){
$startTime = $currTime; # reset timer for longer delay
$knockAge = $knockCount; # synchronize knock counts
}# if a new knock came in

}# if timer not reached

knockListen();
select(undef, undef, undef, $SLEEP_INTERVAL);

}#timeOut =0

if( @baseKnocks ){
print "place the following line in $ENV{HOME}/.knockFile\n\n";
for( @baseKnocks ){ print "$_ " }
print "_#_ (command here) _#_ \n\n";
}#if knocks entered[/code]

¡¡¡¡µÚ¶þ²¿·ÖÊÇÓÃÀ´ÔÚÒ»¸öÎÞÏÞÑ­»·ÖмàÌýÇôòÐòÁеÄÖ÷Âß¼­£¬ËüÔÚÒ»¸öÑ­»·ÖдóԼҪ˯Ãß 1/100 Ãë¡£ÔÚÕâ¸öÑ­»·Öл¹Ê¹ÓÃÁËÒ»¸ö»ùÓÚÃëµÄ³¬Ê±£¬ÔÚ×ã¹»µÄÑÓʱ֮ºóÖØÖÃÇôòÐòÁС£×¢Ò⣬ÔÚÕâ¸öÀý×ÓÖУ¬Çôò¼àÌý³¬Ê±Ê±¼äΪ 2 Ã룬¶ø×î´ó³¬Ê±Ê±¼äΪ 4 Ãë¡£ÕâÑù¾ÍÌṩÁËÔÚÇôò´´½¨Ä£Ê½Ï½øÐмòµ¥²âÊÔÉèÖõŦÄÜ£¬²¢ÎªÇôòÐòÁеļàÌýģʽÌṩÁËÒ»¸ö¿ìËÙÖØÖÃÑ¡Ïî¡£

Çåµ¥ 10. Ö÷³ÌÐòÖеÄÇôò¼àÌý´úÂë
[code]}else{

# main code loop to listen for knocking and run commands
readKnockFile();

$startTime = getEpochSeconds();

while( $timeOut == 0 ){

$currTime = getEpochSeconds();

if( $currTime - $startTime > $LISTEN_TIMEOUT ){

$knockCount = 0;
@baseKnocks = ();
$startTime = $currTime;
if( $option ){ print "listen timeout - resetting knocks \n" }

}else{

if( $knockCount != $knockAge ){
$startTime = $currTime; # reset timer for longer delay
$knockAge = $knockCount; # synchronize knock counts
}# if a new knock came in

compareKnockSequences();

}#if not reset timeout

knockListen();

select(undef, undef, undef, $SLEEP_INTERVAL);

}#main knock listen loop

}# if create or listen for knocks[/code]

¡¡¡¡¾¯¸æ£º°²È«ÐÔ

¡¡¡¡knockAge ³ÌÐò·Ç³£ÊʺÏÓÃÓÚΪϵͳÌṩһÖÖ¶îÍâµÄÓû§ÊäÈëͨµÀ¡£È»¶ø£¬ÐèҪעÒâµÄÊÇʹÓà knockAge À´×öÈκÎʶ¼ÐèÒªÔÚϵͳÉϽøÐÐÈÏÖ¤¡£Êǵģ¬Ëü¿ÉÒÔ·ÀÖ¹ÃÜÔ¿¼Ç¼³ÌÐò¼àÌýÃÜÂëµÄÎÊÌ⣬µ«ÊǺܶàÓë ¡°ÇôòÈÏÖ¤¡± ÓйصÄÒòËØ¶¼±íÃ÷ÔÚ¶Ô°²È«ÐÔÃô¸ÐµÄ»·¾³ÖÐʹÓÃÕâÖÖ¼¼Êõ»¹²»¹»³ÉÊì¡£ÇôòÐòÁÐĿǰÊÇÒÔ 4 µ½ 9 ¸öÊý×ÖÔÚ ~/.knockFile ÖнøÐд洢µÄ£¬ËüÃÇÒÔºÁÃëΪµ¥Î»À´±íʾÑÓʱ¡£Õâ¸ö ¡°ÃÜÂ롱 Îļþ·Ç³£ÈÝÒ×¶ÁÈ¡£¬²¢ÇÒͨ¹ý³¢ÊÔºÍÆ¥ÅäÇôòģʽ£¬¿ÉÒÔ»ñµÃ¶ÔϵͳµÄ·ÃÎÊȨÏÞ¡£ÅųýºÁÃëÖµÖÐһЩ¾«¶ÈÊÇÒ»ÖÖ¿ÉÓõķ½·¨£¬µ«ÊÇÕâÖÖÁ·Ï°¾ÍÁô¸øÄÇЩϣÍû×ÔÐжÔϵͳ·çÏÕ½øÐÐÆÀ¹ÀµÄ¶ÁÕߺÃÁË¡£

¡¡¡¡ÔÚÈκÎÃô¸Ð»·¾³ÖУ¬ÎÒÃǶ¼Ó¦¸Ã½øÐÐһЩÑо¿£¬ÅжÏÓû§ÊÇ·ñÓÐ×ã¹»µÄÓ¦±äÄÜÁ¦²¢Äܹ»¾«È·µØÖØÏÖÇôòÐòÁС£ÀýÈ磬ÎÒÃÇÊÇ·ñ¾ßÓÐÄÜÁ¦´´½¨²¢Á¬ÐøÊäÈë¿É½ÓÊܳ¤¶ÈµÄÇôòÃÜÂ룿¾ßÓÐÆÕͨÖÇÉ̵ÄÈËÊÇ·ñ¿ÉÒÔÖ±¹ÛµØÊ¹ÓÃÕâÖÖÇôòÐòÁУ¿»òÕßÎÒÃÇÊÇ·ñ×¼±¸Ê¹Óà ¡°¹ÎÁ³ºÍÀí·¢²Ù×÷¡± À´×÷ΪÃÜÂ룿
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 0 ÌõÆÀÂÛ