Linux 笔记本基于“敲打”的命令

时间:2016-09-12来源:网络

xscreensaver 所使用的命令配置

以下设置假设您已经登录到了窗口管理器中并且已经使用您的 userid 启动了xscreensaver 程序例如如果您正在运行 Fedora Core 并且使用 gdm 登录到 KDE 中那么 xscreensaver 就会自动启动因此要激活它则需要将双击命令从

/bin/echo double tap

修改为

xscreensavercommand activate

现在每次识别出有 双击 事件发生时xscreensaver 程序都会使用所指定的内容来激活一旦 screensaver 被激活就可以通过输入密码(如果是这样配置的)对屏幕进行解锁不过我们真正希望的是自己的朋友也可以使用密码解锁代码来解除屏保因此我们需要在 ~/knockFile 文件中将下面的命令

/bin/echo shave the haircut

替换为

killall xscreensaver ; nohup xscreensaver nosplash >/dev/null >/dev/null

这个命令会停止当前运行的所有 xscreensaver 程序然后在后台再重新启动 xscreensaver现在我们可以通过敲打屏幕边来重复加锁和解锁计算机屏保的过程这比蓝牙提供的近似度加锁更加安全或更方便吗?答案可能是否定的它更酷吗?当然!

更多例子

HDAPS 传感器和 knockAgepl 程序提供了另外一种用户输入设备我们可以使用它们以独特的方式进行输入例如

如果计划在一个基础上测试新的 X 配置文件可以将双击条目更改为重新启动配置好的 X 服务器这样就不需要敲任何其他键来强制重启了

在命令区中可以放上我们喜欢使用的任何 shell 脚本这样就可以使用双击来查看 email

以最新的组合节拍进行敲打让 ThinkLight 显示 WWII 代在 Kinakuta 的黄金存储设备的 Morse 密码位置

敲入 Morse 编码防止键盘输入被记录

请参阅 参考资料 部分给出的有关将 ThinkPad 的倾斜度用于游戏显示工具的例子或者直接跳过这部分内容将 Threshold 变量设置为 这样您使劲踢一脚 ThinkPad它就会自动重启了

knockAgepl 代码

历史和策略

Jeff Molofee 所编写的 hdapsglc 是 knockAgepl 代码的基础Hdapsglc 是一个非常好的展示程序可以展示如何使用倾斜传感器来实时地显示有关 ThinkPad 的方向的信息二者之间的区别是本例将时间上隔离的事件组织在一起创建了敲打事件同时提供了相关的代码来创建并监听敲打事件序列

参数配置

下面让我们来使用对时间和传感器敏感的一些参数来启动 knockAgepl

清单 主程序参数

require sys/syscallph; # for subsecond timing my $option = $ARGV[] || ; # simple option handling # filename for hdaps sensor reads my $hdapsFN = /sys/devices/platform/hdaps/position; my $UPDATE_THRESHOLD = ; # threshold of force that indicates a knock my $INTERVAL_THRESHOLD = ; # microseconds of time required between knock # events my $SLEEP_INTERVAL = ; # time to pause between hdaps reads my $MAX_TIMEOUT_LENGTH = ; # maximum length in seconds of knock pattern # length my $MAX_KNOCK_DEV = ; # maximum acceptable deviation between recorded # pattern values and knocking values my $LISTEN_TIMEOUT = ; # timeout value in seconds between knock # events when in listening mode

这些变量及其注释都非常简单它们的用法和配置选项在本文后面部分会进行解释下面是其余的一些全局变量及其描述

清单 敲打模式参数

my @baseKnocks = (); # contains knock intervals currently entered my %knockHash = (); # contains knock patterns associated commands my $prevInterval = ; # previous interval of time my $knockCount = ; # current number of knocks detected my $restX = ; # `resting positiong of X axis accelerometer my $restY = ; # `resting positiong of Y axis accelerometer my $currX = ; # current position of X axis accelerometer my $currY = ; # current position of Y axis accelerometer my $lastX = ; # most recent position of X axis accelerometer my $lastY = ; # most recent position of Y axis accelerometer my $startTime = ; # to manage timeout intervals my $currTime = ; # to manage timeout intervals my $timeOut = ; # perpetual loop variable my $knockAge = ; # count of knocks to cycle time interval

子程序

在我们的子程序清单中首先是一个简单的逻辑块用来检查是否有加速器可读

清单 检查加速器的子程序

sub checkAccelerometer() { my $ret; $ret = readPosition (); if( $ret ){ print no accelerometer data available tis bork edn; exit(); } }#checkAccelerometer

Jeff Molofee 编写的 hdapsglc 代码为 knockAgepl 中的所有代码提供了一个很好的起点在下面的 readPosition 子程序中我们可以看到他的注释这个子程序将打开一个文件从中读取当前的加速器数据然后关闭文件并返回不包含 (逗号) 字符的数据

清单 readPosition subroutine

## comments from Jeff Molofee in hdapsglc #* read_position read the (xy) 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

getEpochSeconds 和 getEpochMicroSeconds 提供了有关敲打模式状态的详细而精确的信息

清单 时间分隔器

sub getEpochMicroSeconds { my $TIMEVAL_T = LL; # LL for microseconds my $timeVal = pack($TIMEVAL_T ()); syscall(SYS_gettimeofday $timeVal ) != or die micro seconds: $!; my @vals = unpack( $TIMEVAL_T $timeVal ); $timeVal = $vals[] $vals[]; $timeVal = substr( $timeVal ); my $padLen = length($timeVal); $timeVal = $timeVal x $padLen; return($timeVal); }#getEpochMicroSeconds sub getEpochSeconds { my $TIMEVAL_T = LL; # LL for microseconds my $start = pack($TIMEVAL_T ()); syscall(SYS_gettimeofday$start ) != or die seconds: $!; return( (unpack($TIMEVAL_T $start))[] ); }#getEpochSeconds

1 2 3 4

关键词: Linux 命令

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版