查看: 78848|回复: 118

[教程说明] 详述群晖NAS配置DPF数码相框历程,分享lcd4linux精心配置CONF

  [复制链接]
发表于 2015-9-10 00:57:45 | 显示全部楼层 |阅读模式
本帖最后由 waylon 于 2015-9-10 10:46 编辑

本人于今年(2015)二月份入手万由U-NAS后,一直在隔壁网和U-Share论坛汲取知识,最近终于有点空闲为NAS搞了个数码相框做监视器,期间一波数折,查阅了隔壁网和U-Share上几乎能找到的所有帖子,经过一番努力后,终于有了个几乎完美的结果,现将过程经验总结到这里,一来回报前辈们传承的知识,二来便于后来者能更为系统的掌握整个配置的过程,免得老走弯路。因本人能力有限、设备有限,也只能就目前遇到的问题做些总结,大家如有问题我能帮就帮,帮不了的也希望大家发扬钻研精神去找到答案。

说起液晶屏改造DIY的应用,早在十多年前在单位信息中心工作时,就面临过许多废旧设备拆下来的LCD如何处理的问题,当时找过制造部门负责维修的同事帮忙看看能不能通过单片机来废物利用,无奈大家学识有限,我自己又不善与硬件打交道,最终没能成功,这个心愿却一直没了,自从今年上了NAS之后,看到有前辈通过DPF(数码相框)改造作为NAS的监视器后就决定自己也配一个DPF,隔壁网上好像在2014年4月-8月间曾经一度流行DPF的改造,不过之后好像又逐步归于沉寂,以至于到现在我遇到众多的问题都找不到人帮助解决,只能自己摸索了。当然前辈们留下的文字还是很有帮助,在此先谢过以下各位前辈:superelchi大侠提供的DPF固件破解olderzeus大侠编译的lcd4linuxnonzhe大侠提供的DPF固件破解指导mrqian7188大侠提供的lcd4linux安装指导xjcsuper大侠提供的CONF语法说明及CONF文件amthb大侠提供的界面布局及CONF文件yuko4632大侠提供的开关机脚本及raid配置查询方法,以及其他众多分享DPF经验的前辈们。
DPF.png

下面我分几个部分来总结DPF配置的整个过程:
一、购买DPF
二、破解DPF
三、安装lcd4linux
四、编写CONF配置文件
五、NAS中完善DPF的控制


个人原创主要在第四部分和第五部分,其他的基本上是参考各位大侠的经验总结



一、购买DPF
如众多帖子提到的,购买DPF上淘宝即可,但是就好像DPF改造逐步沉寂一样,淘宝上卖DPF的也少了很多,既找不到那个清仓的东北人,也找不到所谓9元的数码相框了,我就连刚开始都不知道应该在淘宝上输什么关键字来搜索,因为搜出来的要么就是大屏的相框,要么就是工控用的LCD,后来通过“数码相框 1.5寸”或“电子相框 1.5寸”终于找到了目标,可是这些设备是AX206芯片的么?卖家也说不知道,只能在网上搜AX206芯片DPF供应商网站的图片再来与淘宝的进行比较了,就这么选了一款深圳本地卖家的DPF撞运气,本想同城第二天就能拿到货,没想到愣是给我整了三天才快递收货,真是晕啊!由于时效性问题,淘宝的链接我就不贴出来了。(另外除了淘宝,国外ebay等很多网站也都有卖,有些链接至今有效,我是后面破解时才看到的)

这里要说下,因为目前破解的方案都是基于建荣AX206芯片的,因此如果能与店家确认是最好的,否则只能像我这样撞运气了,我在后面寻找破解时就遇到很多无法破解的非AX206芯片的人,如果遇到这种不幸的事只能重新购买。

有关DPF的基础知识可以查看nonzhe大侠的帖子:http://www.gebi1.com/thread-83915-1-1.html

二、破解DPF
DPF买回来后当然就需要破解刷新的固件进去了,前面提到的nonzhe大侠的帖子给了我非常大的帮助,基本上过程就像nonzhe大侠说的:
  • 备份DPF原固件
  • 检测DPF是否支持破解
  • 支持破解直接第4步刷固件,不支持破解找superelchi大侠破解
  • 刷固件

破解前特意把DPF打开看了下芯片,竟然和网上的图片不一样,没看到AX206的字样,瞬间心里就咯噔一下,不会这么衰吧!把DPF接上PC,在DPF的菜单中选择连接USB后,Win 7下会出现一个光驱盘符,这个虚拟光盘中有个DPFMate.exe是用来上传下载照片用的,试了下原固件的功能,就是简单的显示照片、时间之类的信息,接下来立刻尝试破解。


nonzhe大侠的帖子,先在http://sourceforge.net/projects/dpf-ax/files/下载了windows下的工具包,并安装python,然后在windows下备份原固件,在cmd中执行命令:python fulldump.py f:,f:是那个光驱的盘符,这步倒是成功了,生成了fulldump_win_20150902-134439.bin文件,用WinISO打开bin文件看,原来就是那个虚拟光盘的内容,顺便打开了StartInfoUnicode.ini文件看看,其中一段:
FirmwareVer=EDPF1.1_STANDARD_V2.0.0
FlashType=Pm25LV040
FlashSize=512
PID=0x1315
LogoStr=Welcome
Titlename=DPFMate v5.0.2.1
CorpLink=http://www.buildwin.com.cn

www.buildwin.com.cn是建荣科技的网站,果然还是建荣的芯片,只不过Pm25LV040是个啥东东不太清楚,在dpf-ax包中的knowntypes.html文件中没找到Pm25LV040,心里还是悬着。(前面提到的ebay之类的购买网址,可以在knowntypes.html中查到)

接着识别DPF是否支持破解,执行python identify.py f:,得到的却是:
Running on windows - unable to detect flash size
Reading 100000 bytes from flash...
Flash written to file 'fulldump_win_20150903-000212.bin'.

Looking for firmware.............: Not found.

This in no known firmware!

Sorry, no matching dpf found.

顿时心里泼凉泼凉的,这是要废掉的节奏啊,果断决定按nonzhe大侠的提示去找superelchi大侠破解,注册并登录http://forum.doozan.com/read.php?9,10026后发现superelchi大侠在8月份还回过帖,这下遇到活菩萨了。接着把我的情况发帖说明并请求破解,因为之前得到的bin文件是1024KB的,无法传上去,只好把StartInfoUnicode.ini文件上传做参考,后面只能等待superelchi大侠回复了,superelchi大侠很快就回复了,告诉我就像程序提示的那样,unknow的firmware无法支持,不过他还是让我把bin文件想办法给他检查一下,于是把百度云盘的链接回复给了他。

继续等待回复期间查看了其他人与superelchi大侠的对话,果然很多AX208或者其他芯片是无法支持的,又仔细查看了superelchi大侠在篇首的说明,推荐在linux下检测DPF破解的支持性,于是想到直接在NAS的DSM系统中执行identify.py,可是问题来了,有段时间我的DSM无法识别USB设备,外接USB硬盘也无法在外接设备中显示,U-Share的QQ群中问过也没得到答复,再查各论坛的帖子,初步判断是DSM升级到5.1-5022.3时,XPEnoboot引导程序没有成功挂载USB驱动,看来得升级到5.2才能解决这个问题,可是现在DPF还没破解,暂时我还不准备升级,于是打算第二天用VirturalBox搭个Linux环境。

次日下载Ubuntu,安装虚拟机等过程按下不表,OS环境终于搭建好了,按照nonzhe大侠的介绍,一步一步下载源码编译,却遇到这个错误:
waylon@ubuntn-vm:~/dpf-ax$ cd trunk
waylon@ubuntn-vm:~/dpf-ax/trunk$ cd dpflib
waylon@ubuntn-vm:~/dpf-ax/trunk/dpflib$ make
cc -Wall -fPIC -I../include -g -c -o dpflib.o dpflib.c
In file included from dpflib.c:14:0:
dpf.h:8:17: fatal error: usb.h: 没有那个文件或目录
#include <usb.h>
^
compilation terminated.
<builtin>: recipe for target 'dpflib.o' failed
make: *** [dpflib.o] Error 1


网上搜了一通没找到答案,只能放弃....,这时superelchi大侠有了回复:
Hi waylon,

good news. I'm getting:
$ ./identify.py fulldump_win_20150903-000212.bin
Looking for firmware.............: Found (buildwin, 128x128 px).
Looking for Openwin..............: Found.
Looking for LcdIniTbl............: Found.
Looking for backlight & contrast.: Found, Found.
Looking for known signatures.....: Found.

Your dpf is compatible with model ['dx27893'].

So: this dump is compatible with dx27893. You can use the custom firmware fw_dx27893.bin.

superelchi


这个回复终于让我看到了希望,我顺便又将ubuntu下的编译问题咨询了他,并得到他的指导,执行sudo apt-get install libusb-dev后顺利编译,在ubuntu下执行identify.py,终于成功的得到了一样的提示:
Detecting & reading dpf flash...
Opening generic SCSI device '/dev/sg2'
Manufacturer: Apple
Size : 1 MB
Reading 100000 bytes from flash...
Flash written to file 'fulldump_20150904-212909.bin'.

Looking for firmware.............: Found (buildwin, 128x128 px).
Looking for Openwin..............: Found.
Looking for LcdIniTbl............: Found.
Looking for backlight & contrast.: Found, Found.
Looking for known signatures.....: Found.

Your dpf is compatible with model ['dx27893'].

看来windows下的确不如linux下的识别率高,难怪superelchi大侠之前推荐在linux环境下运行工具,如果后续大家出现windows下无法识别DPF的问题不要灰心,可以努力尝试一下linux下是否OK!在这里还是要再次感谢一下superelchi大侠,这么多年来一直在做dpf-ax的支持,这个德国人真棒!

字数限制,后文转到二楼
游客,如果您要查看本帖隐藏内容请回复

回复

使用道具 举报

 楼主| 发表于 2015-9-10 01:01:01 | 显示全部楼层
本帖最后由 waylon 于 2015-9-10 01:13 编辑

接着从http://sourceforge.net/projects/dpf-ax/files/下载包含各种破解固件的dpf-ax_firmware_20140926.zip文件,根据dpf-ax工具包中README.windows的提示,从http://openschemes.com/2011/08/24/ax206-hardware-bootloader-well-that-was-easy/下载刷机工具AX206_HW_Bootflasher.zip,刷机中果然遇到README.windows中描述的“Can't find flash info, please add its info to flash library according to the flash ID”问题,按照提示,继续去superelchi大侠的帖子找到最新的FlashLib.ini文件,替换后顺利刷新固件。

顺便说下,刷固件过程比较简单,windows中执行AX206_HW_Bootflasher.zipProgSPI.exe程序,Setting中有说选Update,有说选Program,好像哪个都可以,我选了Update,同时Reset选上,固件路径选上dpf-ax_firmware_20140926.zip中的兼容固件(我的是fw_dx27893.bin,然后Execute即可,很快就刷入完成并在DPF中见到两个大眼睛了。
SPI.png

三.安装lcd4linux
DPF破解成功了,开始进入激动人心的数据展示阶段,可却一开始就遇到困难,olderzeus大侠的网盘已经失效,他编译的lcd4linux找不到了,翻遍隔壁网论坛都找不到下载地址了,据olderzeus大侠说lcd4linux的编译是个浩大工程,而且还没有提供编译的教程,正好那几天https://lcd4linux.bulix.org/又宕机,索性放弃自行编译的念头,只能上网去搜索,找到一个lcd4linux.x86.r1197.rar,里面的lcd4linux可以识别DPF设备,也许就是olderzeus大侠编译的文件吧,但是没有看到olderzeus大侠说的安装脚本,只能自己直接在linux下调用了。(写此文时找到一个百度网盘比较完整,见附录

前面说了我的DSM无法支持USB设备,在Ubuntu下测试成功lcd4linux后,果断的将DSM从5.1升级到5.2-5592.2(如何在虚拟机中先测试升级就不说了,毕竟NAS中数据宝贵),顺利解决了USB设备的驱动问题,我的DPF终于可以正常连接到NAS上了。

执行过程中遇到的问题基本上在mrqian7188大侠的http://www.gebi1.com/forum.php?mod=viewthread&tid=83997中已经解决,主要注意两个问题:
  • libgd.so.2通过lib/libgd.so.3libgd.so.3.0.0复制一份即可
  • CONF配置文件需要修改权限为600

我将lcd4linux及其配置文件都放在/volume1/homes/xxx/lcd4linux下,也就是DSM登录后的home共享文件夹下,主要是为了方便在windows中通过文件共享来编辑配置文件及更新lcd4linux程序,后面CONF中的配置及任务计划中的路径请记得修改为自己的个人配置。

四、编写CONF配置文件

终于可以将数据输出到DPF了,在参考了olderzeus大侠、xjcsuper大侠、amthb大侠的界面后,决定以amthb大侠的http://www.gebi1.com/forum.php?mod=viewthread&tid=239237&highlight=LCD界面为基础加以优化改造重写CONF,一来是128*128界面比较小,空间有限,amthb大侠的界面比较紧凑,二来毕竟是作为NAS的监视器,天气及时间等大图片没有必要,这些信息现在任何手机中都唾手可得,没必要占用这么宝贵的屏幕资源。

首先通xjcsuper大侠的http://www.gebi1.com/thread-84267-1-1.html学习了CONF文件的基本语法,然后自己拉下了lcd4linux的源代码来查看各种支持的plugin,无奈olderzeus大侠编译的版本好像比较老,icon类型的widget竟然不支持,hddtemp插件也不支持,大大约束了CONF的表现能力,甚是遗憾!

其次整体的思路是:
  • NAS最为核心的是存储设备,因此磁盘的读写是重点,我放在最中间的区域;
  • 由于展示信息的较少,CPU状态、网络状态放左侧(左侧宽度较小)
  • 相对的展示信息较为丰富的存储空间状态、内存状态放右侧;
  • 所有数据单位能精简的都精简,例如GB就只写G,部分KB甚至忽略掉;
  • 所有数据能换算减少宽度的就换算,例如>1024GB就转换为TB,>1024KB就转换为MB;
  • 头部时间到秒精度没有必要,改造为到分钟即可;
  • CONF中所有颜色都统一改为变量,方便大家自行配置;
  • 屏幕亮度精简olderzeus大侠的文件,只保留一个值,通过DSM的任务计划手工或自动调整。

LCD.png

本来温度是NAS的重要数据,但是我的U-NAS主板不支持i2c传感器,这个版本的lcd4linux又不支持hddtemp,只能放弃温度的显示,有需要的朋友可以自行修改增加温度信息,下面详细讲下改造的情况。

1.Disk区
我的U-NAS是四盘位机型,四块硬盘中第一和第二块硬盘做了raid1,因此DPF中需要显示出disk1/2的读写情况,以及disk3、disk4的读写情况,我对amthb大侠这块的界面改动最大,将两盘符改为三盘符显示,整个Disk分区及读写类型形成纵横交叉的表格状态,任何磁盘读都会在行首显示“<-”标志,任何磁盘写都会在行首显示“->”标志,任何磁盘读或写都会变更列头的颜色。本来准备在widget的前景色或背景色中通过表达式来动态修改颜色,测试过程中发现widget每次update时都无法更新前景色、背景色、小数位,后来只能引入图片来作为背景色进行处理。

另外raid设备不用sda、sdb这种配置,根据yuko4632大侠的提示,直接查看/tmp/space/space_mapping.xml就知道了,我的是分别是md2为disk1和disk2的raid1,md3是disk3,md4是disk4,即便disk3和disk4没做raid,一样可以读取数据,所以我统一改为md2、md3、md4,并在代码中将diskpath及diskname都设为变量,方便朋友们自行根据自己的设备进行修改。

2.CPU区
基本上直接引用官方的配置,原本Load希望改为>1.0时显红字,如前所述update无法更新前景色,只能作罢。还有如前所述根据个人情况删除了温度数据。

3.Volume区
根据olderzeus大侠的代码,新增一个三相状态变量的timer,将Volume1、2、3的使用及空闲情况轮询显示,百分比为已使用空间占比,数值为剩余空间大小。

4.Network区
amthb大侠的一图双条看着很不清晰,分拆为upload和download为两个独立的进度条,因为现在一般都是百兆网络,因此最大值改为100Mbps,如果有需要可以自行修改最大值,代码中100/8的意思是将网络的计算方法转换为计算机的计算方法,基本上100Mbps的百兆网络等于12.5MB/s的每秒传输12.5兆数据。

5.Memory区
内存区是一开始最困扰我的问题,我准备上DPF也是因为拜读了xjcsuper大侠的http://www.gebi1.com/thread-84333-1-1.html,linux的内存分为used、cached、buffers、free等几种,进度条只能显示二值,所以有的大侠的配置显示的是used、cached+free,有的显示的是used+cached、freebuffers因为比较小一般都忽略不计了),那么有没有办法能将进度条显示出二值以上的多值呢?就像DSM的系统监控中一样显示,这样会更加清晰的了解当前内存的使用状况。

于是我想到了两个进度条叠加的方法,上面的进度条显示为used、cached+free,背景改为透明,下面的进度条显示为used+cached、free,背景正常,但是试了老半天都没法实现,总是上面的透明背景直接显示为黑色覆盖了下面的进度条,动态计算上面的进度条宽度来避免覆盖也失败了,正在准备放弃的时候,想起是不是可以用layer把两个进度条分层分开了,一试果然成功,上面的进度条背景变为透明,显示出了下面进度条的内容,于是成功实现一图三值。

顺便说一句,Layout中支持3层Layer,默认的是Layer 1,Layer 0位于Layer 1的上面,Layer 2位于Layer 1的下面,除了内存状态我使用了分层实现三值之外,Disk区的列头背景色也是通过分层来综合Text和Image两种widget。

好了,CONF文件的编写就讲这么多,再重复一遍,详细的语法看xjcsuper大侠的http://www.gebi1.com/thread-84267-1-1.html,已经足够详细,我就不累述了,我的CONF内容附于本文最后。

五、NAS中完善DPF的控制
最后来说下NAS中如何完善DPF的控制,首先是这么好的东东,必须要开机自动启动lcd4linux啊,我直接使用了yuko4632大侠http://www.gebi1.com/forum.php?mod=viewthread&tid=84004&highlight=lcd4linux中的脚本实现开关机的处理。但是日常可能要根据时间动态修改DPF的背光强度,更新CONF文件时也需要重启lcd4linux,每次登录SSH挺麻烦的,我们可以通过DSM的任务计划来实现这些控制,我增加了三个控制DPF状态的自定义脚本,五个控制背光强度的自定义脚本,其中三个背光脚本是自动执行的,分别为:
  • 每天0点关闭背光,脚本:echo 0 > /volume1/homes/xxx/lcd4linux/light.conf
  • 每天7点开白天背光,脚本:echo 5 > /volume1/homes/xxx/lcd4linux/light.conf
  • 每天19点开夜晚背光,脚本echo 3 > /volume1/homes/xxx/lcd4linux/light.conf

其中xxx是本机的用户名,CONF中定义了每5秒会去读light.conf取背光控制,另外两个背光脚本就是手动控制最亮写入7,最暗写入1即可。

task.png

启动、关闭的脚本参考yuko4632大侠的开关机脚本即可,重启的脚本为:
  1. killall lcd4linux
  2. sleep 1s
  3. chown root:root /volume1/homes/xxx/lcd4linux/lcd4linux
  4. chown root:root /volume1/homes/xxx/lcd4linux/128.conf
  5. chmod 777 /volume1/homes/xxx/lcd4linux/lcd4linux
  6. chmod 600 /volume1/homes/xxx/lcd4linux/128.conf
  7. /volume1/homes/xxx/lcd4linux/lcd4linux -f /volume1/homes/xxx/lcd4linux/128.conf
复制代码

执行前重新修改own和mod的原因是因为windows中通过共享修改的文件会变更该文件的own和mod,如果有误可能启动不会成功。



希望以上的内容能够帮到你成功实现DPF监视器,下一步我有空的话将把DPF装到U-NAS机器上,另外lcd4linux即将发布0.11.0,找个时间研究下是否能编译一个新版本,以便支持更多的特性。

附录花絮:刚刚写本帖子时突然在一个百度空间中找到了olderzeus大侠的那个文件包,包括lcd4linux、简易安装说明、conf文件、主题资源等,还包括DPF工具包共享出来免得后人再去到处寻找:http://pan.baidu.com/s/1o60q99S#render-type=list-view&path=%252F,盘主arthasqian不知道是不是隔壁网的朋友,在此一并谢过!

为免该网盘资源再度丢失,我做了个备份,并与前述相关工具及我个人配置的CONF和资源文件一并分享在百度网盘中,该链接地址在主帖最后的隐藏区。

字数限制,CONF文件的内容分享在四楼、五楼


回复 支持 反对

使用道具 举报

发表于 2015-9-10 01:07:34 | 显示全部楼层
{:soso_e179:}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-10 01:12:11 | 显示全部楼层
CONF文件配置内容一:
  1. # Create by waylon (waylon.bbs@gmail.com)
  2. # Create date: 2015/9/9

  3. Display dpf {
  4.     Driver 'DPF'
  5.     Port 'usb0'
  6.     Font '6x8'
  7.     Foreground FG_Default
  8.     Background BG_Default
  9.     Basecolor BG_Default
  10.     Orientation 0   # 0 = standard, 1 = rotate 90° CW, 2 = rotate 180°, 3 = rotate 90° CCW
  11.     Backlight 3   # Backlight variable control, 0..7 (0=off, 7=max)
  12. }

  13. # Head

  14. Widget Machine {
  15.     class 'Text'
  16.     expression uname('nodename')
  17.     width 8
  18.     align 'L'
  19.     update minute
  20.     Background BG_Head
  21.     Foreground FG_Head
  22. }

  23. Widget Date {
  24.     class 'Text'
  25.     expression flagOnOff?(strftime('%m-%d %H:%M',time())):(uptime('Run %dd %H:%M'))
  26.     width 13
  27.     align 'R'
  28.     update tick
  29.     Background BG_Head
  30.     Foreground FG_Head
  31. }

  32. # CPU status

  33. Widget CPU {
  34.     class 'Text'
  35.     expression proc_stat::cpu('busy', 500)
  36.     prefix 'CPU '
  37.     postfix '%'
  38.     width 9
  39.     precision 1
  40.     align 'R'
  41.     update tick
  42. }

  43. Widget CPUBar {
  44.     class 'Bar'
  45.     expression proc_stat::cpu('busy',   500)
  46.     length 9
  47.     max 100
  48.     direction 'E'  #E,W,N,S
  49.     style 'H'
  50.     update tick
  51.     Foreground FG_BarFrame
  52.     Background BG_BarGreen
  53.     BarColor0 BC_Red
  54.     BarColor1 BC_Red
  55. }

  56. Widget Load {
  57.     class 'Text'
  58.     expression loadavg(1)
  59.     prefix 'Load'
  60.     postfix loadavg(1)>1.0?'!':' '
  61.     width 9
  62.     precision 1
  63.     align 'R'
  64.     update second
  65.     Foreground FG_Blue
  66. }

  67. # Volume Status

  68. Widget Vol {
  69.     class 'Text'
  70.     expression (statfs('/volume'.flagState, 'blocks') - statfs('/volume'.flagState, 'bavail')) / statfs('/volume'.flagState, 'blocks')  * 100
  71.     prefix 'Vol'.flagState
  72.     postfix '%'
  73.     precision 1
  74.     width 11
  75.     align 'R'
  76.     update tick
  77. }

  78. Widget VolBar {
  79.     class 'Bar'
  80.     expression (statfs('/volume'.flagState, 'blocks') - statfs('/volume'.flagState, 'bavail')) / statfs('/volume'.flagState, 'blocks')
  81.     #expression2  statfs('/volume1', 'bavail') / statfs('/volume1', 'blocks')
  82.     max 1
  83.     length 11
  84.     direction 'E'
  85.     style 'H'
  86.     update tick
  87.     Foreground FG_BarFrame
  88.     Background BG_BarGreen
  89.     BarColor0 BG_BarRed
  90.     BarColor1 BG_BarRed
  91. }

  92. Widget VolU {
  93.     class 'Text'
  94.     expression (statfs('/volume'.flagState, 'blocks') - statfs('/volume'.flagState, 'bavail')) * statfs('/volume'.flagState, 'bsize') / 1024 / 1024 / 1024
  95.     precision 1
  96.     prefix 'U'
  97.     postfix 'GB'
  98.     width 11
  99.     align 'R'
  100.     update tick
  101.     Foreground FG_Red
  102. }

  103. Widget VolF {
  104.     class 'Text'
  105.     expression statfs('/volume'.flagState, 'bavail') * statfs('/volume'.flagState, 'bsize') / 1024 / 1024 / 1024 / ((statfs('/volume'.flagState, 'bavail') * statfs('/volume'.flagState, 'bsize')> 1024*1024*1024*1024)?1024:1)
  106.     precision 1
  107.     prefix 'Free'
  108.     postfix (statfs('/volume'.flagState, 'bavail') * statfs('/volume'.flagState, 'bsize')> 1024*1024*1024*1024)?'T':'G'
  109.     width 11
  110.     align 'R'
  111.     update tick
  112.     Foreground BG_BarGreen
  113. }

  114. # Disk status

  115. Widget Disk {
  116.     class 'Text'
  117.     expression  'Disk'
  118.     width 5
  119.     align 'L'
  120.     update minute
  121. }

  122. Widget Disk1 {
  123.     class 'Text'
  124.     expression diskname1
  125.     width 5
  126.     align 'C'
  127.     update tick
  128.     Background BG_Transparency
  129. }

  130. Widget Disk1BG {
  131.         class 'Image'
  132.         file imgpath . 'diskhead' . (diskstats(diskpath1, 'read_sectors',  500)|diskstats(diskpath1, 'write_sectors',  500)?'1':'0') . '.png'
  133.         reload 1
  134.         update tick
  135.         inverted 0
  136.         visible 1
  137. }

  138. Widget Disk2 {
  139.     class 'Text'
  140.     expression  diskname2
  141.     width 5
  142.     align 'C'
  143.     update tick
  144.     Background BG_Transparency
  145. }

  146. Widget Disk2BG {
  147.         class 'Image'
  148.         file imgpath . 'diskhead' . (diskstats(diskpath2, 'read_sectors',  500)|diskstats(diskpath2, 'write_sectors',  500)?'1':'0') . '.png'
  149.         reload 1
  150.         update tick
  151.         inverted 0
  152.         visible 1
  153. }

  154. Widget Disk3 {
  155.     class 'Text'
  156.     expression  diskname3
  157.     width 5
  158.     align 'C'
  159.     update tick
  160.     Background BG_Transparency
  161. }

  162. Widget Disk3BG {
  163.         class 'Image'
  164.         file imgpath . 'diskhead' . (diskstats(diskpath3, 'read_sectors',  500)|diskstats(diskpath3, 'write_sectors',  500)?'1':'0') . '.png'
  165.         reload 1
  166.         update tick
  167.         inverted 0
  168.         visible 1
  169. }

  170. Widget Disk1BarR {
  171.     class 'Bar'
  172.     expression diskstats(diskpath1, 'read_sectors',  500)
  173.     max 8
  174.     length 1
  175.     direction 'N'
  176.     style 'H'
  177.     update tick
  178.     Foreground FG_DiskFrame
  179.     Background BG_Disk
  180.     BarColor0 BC_Yellow
  181.     BarColor1 BC_Yellow
  182. }

  183. Widget Disk1BarW {
  184.     class 'Bar'
  185.     expression diskstats(diskpath1, 'write_sectors', 500)
  186.     max 8
  187.     length 1
  188.     direction 'N'
  189.     style 'H'
  190.     update tick
  191.     Foreground FG_DiskFrame
  192.     Background BG_Disk
  193.     BarColor0 BC_Red
  194.     BarColor1 BC_Red
  195. }

  196. Widget Disk2BarR {
  197.     class 'Bar'
  198.     expression diskstats(diskpath2, 'read_sectors',  500)
  199.     max 8
  200.     length 1
  201.     direction 'N'
  202.     style 'H'
  203.     update tick
  204.     Foreground FG_DiskFrame
  205.     Background BG_Disk
  206.     BarColor0 BC_Yellow
  207.     BarColor1 BC_Yellow
  208. }

  209. Widget Disk2BarW {
  210.     class 'Bar'
  211.     expression diskstats(diskpath2, 'write_sectors', 500)
  212.     max 8
  213.     length 1
  214.     direction 'N'
  215.     style 'H'
  216.     update tick
  217.     Foreground FG_DiskFrame
  218.     Background BG_Disk
  219.     BarColor0 BC_Red
  220.     BarColor1 BC_Red
  221. }

  222. Widget Disk3BarR {
  223.     class 'Bar'
  224.     expression diskstats(diskpath3, 'read_sectors',  500)
  225.     max 8
  226.     length 1
  227.     direction 'N'
  228.     style 'H'
  229.     update tick
  230.     Foreground FG_DiskFrame
  231.     Background BG_Disk
  232.     BarColor0 BC_Yellow
  233.     BarColor1 BC_Yellow
  234. }

  235. Widget Disk3BarW {
  236.     class 'Bar'
  237.     expression diskstats(diskpath3, 'write_sectors', 500)
  238.     max 8
  239.     length 1
  240.     direction 'N'
  241.     style 'H'
  242.     update tick
  243.     Foreground FG_DiskFrame
  244.     Background BG_Disk
  245.     BarColor0 BC_Red
  246.     BarColor1 BC_Red
  247. }

  248. Widget DiskR {
  249.     class 'Text'
  250.     expression 'R ' . (diskstats(diskpath1, 'read_sectors',  500)|diskstats(diskpath2, 'read_sectors',  500)|diskstats(diskpath3, 'read_sectors',  500)?'\177':'')
  251.     width 4
  252.     align 'L'
  253.     update tick
  254.     Foreground FG_Yellow
  255. }

  256. Widget DiskW {
  257.     class 'Text'
  258.     expression 'W ' . (diskstats(diskpath1, 'write_sectors',  500)|diskstats(diskpath2, 'write_sectors',  500)|diskstats(diskpath3, 'write_sectors',  500)?'\176':'')
  259.     width 4
  260.     align 'L'
  261.     update tick
  262.     Foreground FG_Red
  263. }

  264. Widget Disk1R {
  265.     class 'Text'
  266.     expression diskstats(diskpath1, 'read_sectors', 500)/2/(diskstats(diskpath1, 'read_sectors', 500)/2>1024?1024:1)
  267.     postfix diskstats(diskpath1, 'read_sectors', 500)/2>1024?'M':''
  268.     precision  0
  269.     width 4
  270.     align 'R'
  271.     update tick
  272.     Foreground FG_Disk
  273.     Background BG_Disk
  274. }

  275. Widget Disk1W {
  276.     class 'Text'
  277.     expression diskstats(diskpath1, 'write_sectors', 500)/2/(diskstats(diskpath1, 'write_sectors', 500)/2>1024?1024:1)
  278.     postfix diskstats(diskpath1, 'write_sectors', 500)/2>1024?'M':''
  279.     precision  0
  280.     width 4
  281.     align 'R'
  282.     update tick
  283.     Foreground FG_Disk
  284.     Background BG_Disk
  285. }

  286. Widget Disk2R {
  287.     class 'Text'
  288.     expression diskstats(diskpath2, 'read_sectors', 500)/2/(diskstats(diskpath2, 'read_sectors', 500)/2>1024?1024:1)
  289.     postfix diskstats(diskpath2, 'read_sectors', 500)/2>1024?'M':''
  290.     precision  0
  291.     width 4
  292.     align 'R'
  293.     update tick
  294.     Foreground FG_Disk
  295.     Background BG_Disk
  296. }

  297. Widget Disk2W {
  298.     class 'Text'
  299.     expression diskstats(diskpath2, 'write_sectors', 500)/2/(diskstats(diskpath2, 'write_sectors', 500)/2>1024?1024:1)
  300.     postfix diskstats(diskpath2, 'write_sectors', 500)/2>1024?'M':''
  301.     precision  0
  302.     width 4
  303.     align 'R'
  304.     update tick
  305.     Foreground FG_Disk
  306.     Background BG_Disk
  307. }

  308. Widget Disk3R {
  309.     class 'Text'
  310.     expression diskstats(diskpath3, 'read_sectors', 500)/2/(diskstats(diskpath3, 'read_sectors', 500)/2>1024?1024:1)
  311.     postfix diskstats(diskpath3, 'read_sectors', 500)/2>1024?'M':''
  312.     precision  0
  313.     width 4
  314.     align 'R'
  315.     update tick
  316.     Foreground FG_Disk
  317.     Background BG_Disk
  318. }

  319. Widget Disk3W {
  320.     class 'Text'
  321.     expression diskstats(diskpath3, 'write_sectors', 500)/2/(diskstats(diskpath3, 'write_sectors', 500)/2>1024?1024:1)
  322.     postfix diskstats(diskpath3, 'write_sectors', 500)/2>1024?'M':''
  323.     precision  0
  324.     width 4
  325.     align 'R'
  326.     update tick
  327.     Foreground FG_Disk
  328.     Background BG_Disk
  329. }

  330. # Network status

  331. Widget Net {
  332.     class 'Text'
  333.     expression 'Network'
  334.     width 9
  335.     align 'L'
  336.     update minute
  337. }

  338. Widget NetUpBar {
  339.     class 'Bar'
  340.     expression netdev(netdev, 'Tx_bytes', 500)/1024/1024
  341.     max 100/8  #100Mbps:12.5MB/s
  342.     length 9
  343.     direction 'E'
  344.     style 'H'
  345.     update second
  346.     Foreground FG_BarFrame
  347.     Background '666666'
  348.     BarColor0 BC_Yellow
  349.     BarColor1 BC_Yellow
  350. }

  351. Widget NetDwBar {
  352.     class 'Bar'
  353.     expression netdev(netdev, 'Rx_bytes', 500)/1024/1024
  354.     max 100/8  #100Mbps:12.5MB/s
  355.     length 9
  356.     direction 'E'
  357.     style 'H'
  358.     update second
  359.     Foreground FG_BarFrame
  360.     Background '666666'
  361.     BarColor0 BC_Blue
  362.     BarColor1 BC_Blue
  363. }

  364. Widget NetUp {
  365.     class 'Text'
  366.     expression netdev::fast('eth0', 'Tx_bytes', 500)/1024/(netdev::fast('eth0', 'Tx_bytes', 500)/1024>1024?1024:1)
  367.     prefix 'U'
  368.     postfix (netdev::fast('eth0', 'Tx_bytes', 500)/1024>1024?'M':'K').'B/s'
  369.     width 9
  370.     precision 0
  371.     align 'R'
  372.     update second
  373.     Foreground FG_Yellow
  374. }

  375. Widget NetDw {
  376.     class 'Text'
  377.     expression netdev::fast('eth0', 'Rx_bytes', 500)/1024/(netdev::fast('eth0', 'Rx_bytes', 500)/1024>1024?1024:1)
  378.     prefix 'D'
  379.     postfix (netdev::fast('eth0', 'Rx_bytes', 500)/1024>1024?'M':'K').'B/s'
  380.     precision 0
  381.     width 9
  382.     align 'R'
  383.     update second
  384.     Foreground FG_Blue
  385. }

  386. # Memory status

  387. Widget RAM {
  388.     class 'Text'
  389.     expression 'Memory'
  390.     width 11
  391.     align 'L'
  392.     update minute
  393. }

  394. Widget RAMBar {
  395.     class 'Bar'
  396.     expression  (meminfo('MemTotal') - meminfo('MemFree'))/meminfo('MemTotal')
  397.     min 0
  398.     max 1
  399.     length 11
  400.     direction 'E'
  401.     style 'H'
  402.     update second
  403.     Foreground FG_BarFrame
  404.     Background BG_BarGreen
  405.     BarColor0 BC_Yellow
  406.     BarColor1 BC_Yellow
  407. }

  408. Widget RAMBarU {
  409.     class 'Bar'
  410.     expression  (meminfo('MemTotal') - meminfo('MemFree') - meminfo('Cached'))/meminfo('MemTotal')
  411.     min 0
  412.     max 1
  413.     length 11
  414.     direction 'E'
  415.     style 'H'
  416.     update second
  417.     Foreground FG_BarFrame
  418.     Background BG_Transparency
  419.     BarColor0 BC_Red
  420.     BarColor1 BC_Red
  421. }

  422. Widget RAMFp {
  423.     class 'Text'
  424.     expression meminfo('MemFree')/meminfo('MemTotal') * 100
  425.     postfix '%'
  426.     precision 0
  427.     width 3
  428.     align 'R'
  429.     update second
  430.     Foreground FG_Green
  431. }

  432. Widget RAMUp {
  433.     class 'Text'
  434.     expression (meminfo('MemTotal') - meminfo('MemFree') - meminfo('Cached'))/meminfo('MemTotal') * 100
  435.     postfix '%'
  436.     precision 0
  437.     width 3
  438.     align 'R'
  439.     update second
  440.     Foreground FG_Red
  441. }

  442. Widget RAMCp {
  443.     class 'Text'
  444.     expression meminfo('Cached')/meminfo('MemTotal') * 100
  445.     postfix '%'
  446.     precision 0
  447.     width 3
  448.     align 'R'
  449.     update second
  450.     Foreground FG_Yellow
  451. }   

  452. Widget RAMF {
  453.     class 'Text'
  454.     expression meminfo('MemFree')/1024/(meminfo('MemFree')/1024>1024?1024:1)
  455.     prefix 'F'
  456.     postfix meminfo('MemFree')/1024>1024?'G':'M'
  457.     precision meminfo('MemFree')/1024>1024?2:0
  458.     width 7
  459.     align 'R'
  460.     update second
  461.     Foreground FG_Green
  462. }

  463. Widget RAMU {
  464.     class 'Text'
  465.     expression (meminfo('MemTotal') - meminfo('MemFree') - meminfo('Cached'))/1024/((meminfo('MemTotal') - meminfo('MemFree') - meminfo('Cached'))/1024>1024?1024:1)
  466.     prefix 'U'
  467.     postfix (meminfo('MemTotal') - meminfo('MemFree') - meminfo('Cached'))/1024>1024?'G':'M'
  468.     precision (meminfo('MemTotal') - meminfo('MemFree') - meminfo('Cached'))/1024>1024?2:0
  469.     width 7
  470.     align 'R'
  471.     update second
  472.     Foreground FG_Red
  473. }

  474. Widget RAMC {
  475.     class 'Text'
  476.     expression meminfo('Cached')/1024/(meminfo('Cached')/1024>1024?1024:1)
  477.     prefix 'C'
  478.     postfix meminfo('Cached')/1024>1024?'G':'M'
  479.     precision meminfo('Cached')/1024>1024?2:0
  480.     width 7
  481.     align 'R'
  482.     update second
  483.     Foreground FG_Yellow
  484. }

  485. Widget Foot {
  486.     class 'Text'
  487.     expression '-= waylon.wang =-'
  488.     align 'C'
  489.     width 21
  490.     update minute
  491.     Foreground FG_BarFrame
  492. }

  493. # Timer

  494. Widget FlagOnOffTimer {
  495.     class 'Timer'
  496.     expression flagOnOff=(time() % 10 < 5)?0:1
  497.     active 1
  498.     update tick
  499. }

  500. Widget FlagStateTimer {
  501.     class 'Timer'
  502.     expression flagState=(time() % 15 < 5)?1:((time() % 15 > 9)?3:2)
  503.     active 1
  504.     update tick
  505. }

  506. Widget LcdLightTimer{
  507.     class 'Timer'
  508.     expression LCD::backlight(file::readline(cfgpath . 'light.conf', 1))
  509.     active 1
  510.     update second * 5
  511. }

  512. Display 'DPF'

  513. Layout layout_128x128 {
  514. # Title
  515.     Row01.Col01 'Machine'
  516.     Row01.Col09 'Date'

  517. # CPU & Volume
  518.     Row03.Col01 'CPU'
  519.     Row03.Col11 'Vol'

  520.     Row04.Col01 'CPUBar'
  521.     Row04.Col11 'VolBar'

  522.     Row05.Col01 'Load'
  523.     Row05.Col11 'VolF'

  524. # Disks
  525.     Row07.Col01 'Disk'

  526.     Row08.Col01 'DiskR'
  527.     Row08.Col05 'Disk1BarR'
  528.     Row08.Col06 'Disk1R'
  529.     Row08.Col11 'Disk2BarR'
  530.     Row08.Col12 'Disk2R'
  531.     Row08.Col17 'Disk3BarR'
  532.     Row08.Col18 'Disk3R'

  533.     Row09.Col01 'DiskW'
  534.     Row09.Col05 'Disk1BarW'
  535.     Row09.Col06 'Disk1W'
  536.     Row09.Col11 'Disk2BarW'
  537.     Row09.Col12 'Disk2W'
  538.     Row09.Col17 'Disk3BarW'
  539.     Row09.Col18 'Disk3W'

  540. # Network & Memory
  541.     Row11.Col01 'Net'
  542.     Row11.Col11 'RAM'

  543.     Row12.Col01 'NetUpBar'
  544.     Row12.Col11 'RAMBar'

  545.     Row13.Col01 'NetUp'
  546.     Row13.Col11 'RAMU'
  547.     Row13.Col19 'RAMUp'

  548.     Row14.Col01 'NetDwBar'
  549.     Row14.Col11 'RAMC'
  550.     Row14.Col19 'RAMCp'

  551.     Row15.Col01 'NetDw'
  552.     Row15.Col11 'RAMF'
  553.     Row15.Col19 'RAMFp'

  554. # Foot
  555.     Row16.Col01 'Foot'

  556. # Layer
  557.     Layer 1{
  558.         X49.Y25 'Disk1BG'
  559.         X49.Y61 'Disk2BG'
  560.         X49.Y97 'Disk3BG'
  561.     }

  562.     Layer 0 {
  563.         Row07.Col05 'Disk1'    #Overlap Disk1BG
  564.         Row07.Col11 'Disk2'    #Overlap Disk2BG
  565.         Row07.Col17 'Disk3'    #Overlap Disk3BG
  566.         Row12.Col11 'RAMBarU'  #Overlap RAMBar
  567.     }

  568. # Timer
  569.     Timer1 'FlagOnOffTimer'
  570.     Timer2 'FlagStateTimer'
  571.     Timer3 'LcdLightTimer'
  572. }
复制代码


回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-10 01:12:48 | 显示全部楼层
CONF文件配置内容二:

  1. Layout 'layout_128x128'

  2. Variables {
  3. # Time variables
  4.     tick 500
  5.     second 1000
  6.     minute 60000

  7. # Disk variables
  8.     diskname1 '1/2'
  9.     diskname2 '3'
  10.     diskname3 '4'
  11.     diskpath1 'md2'
  12.     diskpath2 'md3'
  13.     diskpath3 'md4'

  14. # File path
  15.     cfgpath '/volume1/homes/waylon/lcd4linux/'
  16.     imgpath '/volume1/homes/waylon/lcd4linux/'

  17. # Background color
  18.     BG_Default '000000'
  19.     BG_Head '336699'
  20.     BG_Disk '333333'
  21.     BG_BarRed 'FF0000'
  22.     BG_BarGreen '00FF00'
  23.     BG_Transparency '00000000'

  24. # Foreground color
  25.     FG_Default 'FFFFFF'
  26.     FG_Head 'FFFFFF'
  27.     FG_Disk 'CCCCCC'
  28.     FG_BarFrame '6F6F6F'
  29.     FG_DiskFrame '666666'
  30.     FG_Red 'FF0000'
  31.     FG_Blue '99CCFF'
  32.     FG_Green '00FF00'
  33.     FG_Yellow 'FFCC33'

  34. # Bar color
  35.     BC_Red 'FF0000'
  36.     BC_Blue '99CCFF'
  37.     BC_Yellow 'FFCC33'
  38. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2015-9-10 02:15:47 | 显示全部楼层
回复看看,找好久了。
回复 支持 反对

使用道具 举报

发表于 2015-9-10 08:15:16 | 显示全部楼层
,学习一下吧,。。
回复 支持 反对

使用道具 举报

发表于 2015-9-10 08:40:03 | 显示全部楼层
太强大了,我开始也看了一下这个东西,在淘宝也没搜到就放弃了,也没有好的指导,感觉有点复杂
回复 支持 反对

使用道具 举报

发表于 2015-9-10 08:51:20 | 显示全部楼层
这个是真复杂呀,不是一般人玩得转的,得懂硬件和软件。
回复 支持 反对

使用道具 举报

发表于 2015-9-10 14:21:10 | 显示全部楼层
厉害
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|万由科技 ( 浙ICP备10004788号-13 )

GMT+8, 2024-4-20 08:50 , Processed in 0.075029 second(s), 36 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表