Whisker Starfeeder(鸽巢RFID/平衡称读卡器)
项目描述
目的
管理射频识别(RFID)读卡器和称重平衡器,并与Whisker客户端(http://www.whiskercontrol.com/)通信。
单文件夹二进制分布
解压缩分发文件,然后双击starfeeder程序。就这样。
Linux源安装
最终用户应考虑使用单文件夹二进制分布。
安装
从命令提示符
sudo apt-get install python3 python3-pip # install Python with pip
python3 -m virtualenv /PATH/TO/MY/NEW/VIRTUALENV # make a virtualenv
source /PATH/TO/MY/NEW/VIRTUALENV/bin/activate # activate the virtualenv
pip install starfeeder # install from PyPI
运行
/PATH/TO/MY/NEW/VIRTUALENV/bin/starfeeder
Windows源安装
已弃用,因为它很复杂。
安装
您需要安装Python 3.5(它将包含pip、pyvenv,有时还有virtualenv)。从https://pythonlang.cn/获取并安装它。我们假设您已将Python安装于C:\Python35。
在Windows 10上,安装一个cmake副本,因为PySide需要它。还要安装Qt。如果您想直接与仓库一起工作,还需要安装Git。可能还需要其他东西。(我在Windows XP上运行过此程序,但在Windows 10上无法运行;PySide构建时并不快乐。)
然后打开命令提示符并执行以下操作:
C:\Python34\Tools\Scripts\pyvenv.py C:\PATH\TO\MY\NEW\VIRTUALENV C:\PATH\TO\MY\NEW\VIRTUALENV\Scripts\activate pip install starfeeder
运行
在您的虚拟环境中运行starfeeder程序。
Windows: 仅图形用户界面(GUI)
常规使用
C:\PATH\TO\MY\NEW\VIRTUALENV\Scripts\pythonw.exe C:\PATH\TO\MY\NEW\VIRTUALENV\Scripts\starfeeder-script.py
Windows: 查看命令行输出
用于数据库升级、命令行帮助和查看调试输出
C:\PATH\TO\MY\NEW\VIRTUALENV\Scripts\starfeeder
您可以使用 -v 添加更多详细输出,或使用 --help 获取完整详细信息。
如果您使用此方法运行图形用户界面(GUI)应用程序,不要 关闭控制台窗口(这将关闭GUI应用程序)。
更新日志
v0.1.2 (2015-12-23)
初始发布。
在Windows XP、Windows 10和Ubuntu 14.04上测试的硬件。
v0.1.3 (2015-12-26)
修复了通过声明 QTimer(self) 而不是 QTimer() 来修复丑陋的 moveToThread() 漏洞。
更通用的更新,用于声明 QObject 对象的父对象,除了在GUI代码中,这会无谓地使事情变得混乱。注意,QLayout.addWidget()、QLayout.addLayout() 和 QWidget.setLayout() 都会接管所有权。
与使用lambda作为插槽相关的错误修复(PySide在退出时引发段错误;https://bugreports.qt.io/browse/PYSIDE-88)。
作为帮助启动PDF手册。
在Windows XP和Linux上重新测试硬件。
v0.1.4 (2015-12-26)
GUI设置callback_id,而不是SerialOwner的派生类
v0.1.5 (2016-02-27)
修复了BaseWindow.on_rfid_state()的错误
v0.2.0 (2016-04-07)
GUI日志窗口,适用于PyInstaller环境。
使用Whisker Python库。
内部切换到Arrow日期时间。
修复了尝试打开不存在的串行端口时的错误处理错误。
v0.2.3 (2016-04-19)
v0.2.4 (2016-04-19)
错误修复。
v0.2.5
仅内部更改?
v0.2.6 (2016-11-24)
Python类型提示。
注意,要在Ubuntu 16.10下安装Python 3.4(此版本PySide所需的版本),您需要: - 下载Python 3.4.4源代码,然后
$ tar xvf Python-3.4.4.tgz $ cd Python-3.4.4 $ configure --enable-shared $ make $ sudo make install # now unbreak wrong symlink and replace with old: $ sudo rm /usr/bin/python3 # "make install" made this point to python3.4 $ sudo ln -s /usr/bin/python3.5 /usr/bin/python3 # now set up library links $ sudo ln -s /usr/local/lib/libpython3.4m.so.1.0 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0 # this should now work: $ python3.4
从pyserial 3.0.1升级到3.2.1 … 也允许使用Linux伪终端进行测试; http://stackoverflow.com/questions/34831131
在调试级别的数据库URL中隐藏密码。
顶级异常跟踪回溯进入日志(如所有其他跟踪回溯),而不是使用 traceback.print_exc() 使用print()。
BalanceController可能会发送错误的‘ICRNone’;在对话框中提供的频率是10 Hz,但应该是12 Hz。添加了有效性检查。
错误修复
问题
有时,WeightWhiskerTask.on_mass() 收到的东西不是 MassEvent。不确定为什么(看起来好像没有其他东西被发送);这可能是PySide信号错误?
尝试1
解决方案是验证接收到的类型(如果错误则大声抱怨,但忽略/继续)。
… 不行;PySide中的不可修复错误(请参阅开发笔记);它未能保持对信号参数的引用,因此有时它们会消失。
尝试2
从PySide切换到PyQt5,因此使用GPLv3许可。
总的来说,这似乎要好得多。
即使这样,从
SerialController.process_data() -> SerialController.line_received -> [change thread] -> RfidController.on_receive
Sometimes the received bytes object is b’’, not what was sent. PyQt执行某种自动转换为C++对象;请参阅 http://pyqt.sourceforge.net/Docs/PyQt5/signals_slots.html ;并且通过使用封装的Python对象,问题似乎消失了… 这并不理想!它是否也影响str?没有,str看起来没问题。BUG在 pyqt5_signal_with_bytes.py 中可靠地重现。已于2016年12月1日报告给PyQt邮件列表。因此,现在:避免在PyQt5信号中使用bytes对象。
v0.3.0 (2017-06-22至2017-06-25)
错误修复/性能改进
尝试查找/修复与非常重多串口使用相关的崩溃,可能是因为硬件串口溢出,因为设备没有正确地缓冲/流控制。
更改包结构,以便通过“pip install starfeeder”干净地安装,在Python 3.5下(PyQt5对Python 3.4不满意,至少其依赖项“sip”不满意)。
修复了额外空格错别字即时崩溃错误(自2.6以来引入)。
修复了错误:SerialController.__init__():没有保存self.output_encoding;在实际使用中不相关,因为这个值只由send_bytes()读取,而send_bytes()只在调试中使用。
修复了错误:主GUI页面上RFID/平衡显示行的错误索引。(仅在存在并禁用设备,例如RFID时相关。)
从“whisker”包中删除对“twisted”的要求,这样我们就可以在Windows下不使用编译器进行安装。
精确固定所有包版本号,以保持一致性。[注意:pyserial现在为3.3(之前为3.2.1)]
修复了Whisker包中的一个错误:尝试关闭时事物卡住,因为即时的套接字在关闭后仍在等待包含EOL的回复(在WhiskerController.getline_immsock中)。
为RfidEventRecord添加了两个索引以提高速度。
将Task移动到单个连接。
通过主要在Python中保留RFID事件、在那里进行检查以及偶尔刷新,大大减少了数据库的颠簸。
重新设计了平衡重置代码,使其更可靠。
捕获CTRL-C和CTRL-BREAK,因此可以从命令行安全运行。
新功能
通过另一个Whisker客户端的命令进行称重平衡。使用“Tare BALANCE_NAME”作为客户端消息;因此,完整地,向Whisker发送“SendToClient CLIENTNUM Tare BALANCENAME”,其中CLIENTNUM是Starfeeder的客户端编号(如果非常懒惰并希望广播,则为-1)。
记录栖息时间。为此,“到达”是一个质量锁定事件,“离开”是一个质量解锁事件。两个选项:(a)单独的表;(b)扩展mass_event表。显然,扩展mass_event表是更好的选择;一半的信息是相同的,并且希望将到达/离开放在同一行中,以便易于计算持续时间;到达和离开时间在平衡的操作方式中有义务配对。因此,我们将添加“unlocked_at”。
将MassEvent.locked重命名为MassEvent.locked_now
添加MassEvent.unlocked_now
重新设计WeightWhiskerTask.on_mass
添加MassEventRecord.unlocked_at
栖息时间由以下SQL表达式给出
TIMEDIFF(mass_event.unlocked_at, mass_event.at)
有一个新的Whisker广播事件:BALANCE_UNLOCK_EVENT。
v0.3.2 (2017-08)
针对cardinal_pythonlib 1.0.0进行了更新
添加faulthandler以调试段错误
从MassEventRecord字段的“at”和“unlocked_at”以及RfidEventRecord字段的“first_detected_at”、“last_detected_at”和“n_events”中删除“default=arrow.now”。这些更改大多不影响功能,但MassEventRecord.unlocked_at可能相关;我们偶尔会收到有关“没有匹配锁定事件的Mass解锁事件”的警告,这可能与unlocked_at不恰当地填充有关,这可能是由于flush_mass_records()触发的。
v0.3.4 (2017-09-07)
使SQLAlchemy会话使用新的“pool_pre_ping”功能,以避免MySQL超时问题