{ "info": { "author": "Rudolf Cardinal", "author_email": "rudolf@pobox.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Intended Audience :: Science/Research", "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3 :: Only", "Topic :: System :: Hardware", "Topic :: System :: Networking" ], "description": ".. |copy| unicode:: U+000A9 .. COPYRIGHT SIGN\n\n==========================\nWhisker Starfeeder: README\n==========================\n\nPurpose\n~~~~~~~\n\nManages radiofrequency identification (RFID) readers and weighing balances,\nand talks to a Whisker client (http://www.whiskercontrol.com/).\n\nAuthor/licensing\n~~~~~~~~~~~~~~~~\n\nBy Rudolf Cardinal.\nCopyright |copy| 2015-2017 Rudolf Cardinal.\nSee LICENSE.txt.\n\nSingle-folder binary distribution\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nUnzip the distributed file and double-click the ``starfeeder`` program.\nThat's it.\n\nLinux source installation\n~~~~~~~~~~~~~~~~~~~~~~~~~\n\n*End users should consider the single-folder binary distribution instead.*\n\nInstall\n-------\n\nFrom a command prompt:\n\n.. code-block::\n\n sudo apt-get install python3 python3-pip # install Python with pip\n python3 -m virtualenv /PATH/TO/MY/NEW/VIRTUALENV # make a virtualenv\n source /PATH/TO/MY/NEW/VIRTUALENV/bin/activate # activate the virtualenv\n\n pip install starfeeder # install from PyPI\n\nRun\n---\n\n.. code-block::\n\n /PATH/TO/MY/NEW/VIRTUALENV/bin/starfeeder\n\n\nWindows source installation\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n*Deprecated, as it's complex.*\n\nInstall\n-------\n\n1. You need to have Python 3.5 installed (which will come with ``pip``,\n ``pyvenv``, and sometimes ``virtualenv``).\n Obtain it from https://www.python.org/ and install it. We'll suppose you've\n installed Python at ``C:\\Python35``.\n\n2. On Windows 10, install a copy of ``cmake``, because PySide wants it.\n Also Qt. Also Git if you want to work with repositories directly.\n Possibly other things.\n (I have this working on Windows XP but not Windows 10; PySide is not\n building itself happily.)\n\n3. Then fire up a Command Prompt and do:\n\n .. code-block::\n\n C:\\Python34\\Tools\\Scripts\\pyvenv.py C:\\PATH\\TO\\MY\\NEW\\VIRTUALENV\n\n C:\\PATH\\TO\\MY\\NEW\\VIRTUALENV\\Scripts\\activate\n\n pip install starfeeder\n\n\nRun\n---\n\nRun the ``starfeeder`` program from within your virtual environment.\n\n*Windows: just the GUI*\n\n For normal use:\n\n .. code-block::\n\n C:\\PATH\\TO\\MY\\NEW\\VIRTUALENV\\Scripts\\pythonw.exe C:\\PATH\\TO\\MY\\NEW\\VIRTUALENV\\Scripts\\starfeeder-script.py\n\n*Windows: to see command-line output*\n\n Use this for database upgrades, command-line help, and to see debugging output:\n\n .. code-block::\n\n C:\\PATH\\TO\\MY\\NEW\\VIRTUALENV\\Scripts\\starfeeder\n\n You can append ``-v`` for more verbose output, or ``--help``\n for full details.\n\n If you use this method to run the graphical user interface (GUI) application,\n **do not** close the console window (this will close the GUI app).\n\nChangelog\n~~~~~~~~~\n\nv0.1.2 (2015-12-23)\n-------------------\n\n- Initial release.\n- Hardware tested via Windows XP, Windows 10, and Ubuntu 14.04.\n\nv0.1.3 (2015-12-26)\n-------------------\n\n- Ugly ``moveToThread()`` hack fixed by declaring ``QTimer(self)``\n rather than ``QTimer()``.\n- More general updates to declare parents of ``QObject`` objects, except\n in GUI code where it just clutters things up needlessly.\n Note that ``QLayout.addWidget()``, ``QLayout.addLayout()``,\n and ``QWidget.setLayout()`` all take ownership.\n- Bugfix related to using lambdas as slots (PySide causes a segmentation\n fault on exit; https://bugreports.qt.io/browse/PYSIDE-88).\n- Launch PDF manual as help.\n- Retested with hardware on Windows XP and Linux.\n\nv0.1.4 (2015-12-26)\n-------------------\n\n- callback_id set by GUI, not by derived classes of SerialOwner\n\nv0.1.5 (2016-02-27)\n-------------------\n\n- bugfix to BaseWindow.on_rfid_state()\n\nv0.2.0 (2016-04-07)\n-------------------\n\n- GUI log window, for PyInstaller environments.\n- Uses Whisker Python library.\n- Switch to Arrow datetimes internally.\n- Bugfix in error handling when trying to open non-existent serial ports.\n\nv0.2.3 (2016-04-19)\n-------------------\n\nv0.2.4 (2016-04-19)\n-------------------\n\n- Bugfix.\n\nv0.2.5\n------\n\n- Internal changes only?\n\nv0.2.6 (2016-11-24)\n-------------------\n\n- Python type hints.\n- NOTE that to install Python 3.4 (required for this version of PySide) under\n Ubuntu 16.10, you need to:\n - download Python 3.4.4 source, then:\n\n .. code-block::\n\n $ tar xvf Python-3.4.4.tgz\n $ cd Python-3.4.4\n $ configure --enable-shared\n $ make\n $ sudo make install\n\n # now unbreak wrong symlink and replace with old:\n $ sudo rm /usr/bin/python3 # \"make install\" made this point to python3.4\n $ sudo ln -s /usr/bin/python3.5 /usr/bin/python3\n\n # now set up library links\n $ sudo ln -s /usr/local/lib/libpython3.4m.so.1.0 /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0\n\n # this should now work:\n $ python3.4\n\n- Upgraded from pyserial 3.0.1 to 3.2.1\n ... also allows the use of Linux pseudoterminals for testing;\n http://stackoverflow.com/questions/34831131\n\n- Passwords obscured in debug-level database URLs.\n- Top-level exception tracebacks go to log (like all others), not to print()\n using traceback.print_exc().\n- BalanceController could send 'ICRNone', which is wrong; the frequency 10 Hz\n was offered in the dialogue, but should have been 12. Validity check added.\n- Bug workaround:\n\n - PROBLEM\n\n - sometimes, ``WeightWhiskerTask.on_mass()`` received something that was\n not a ``MassEvent``. Not sure why (it doesn't look like anything else\n is ever sent); could this be a PySide signals bug?\n\n - ATTEMPT 1\n\n - Workaround is to verify type on receipt (and complain loudly if wrong\n but ignore/continue).\n - ... no; irremediable bug in PySide (see development notes); it fails to\n keep references to signal parameters, so sometimes they go AWOL.\n\n - ATTEMPT 2\n\n - Switched from PySide to PyQt5, and thus GPLv3 licensing.\n - Generally, this seems much better.\n - Even then, apparent corruption in \"bytes\" object passed from\n\n .. code-block::\n\n SerialController.process_data()\n -> SerialController.line_received\n -> [change thread]\n -> RfidController.on_receive\n\n - Sometimes the received bytes object is b'', not what was sent.\n PyQt does some sort of autoconversion to C++ objects; see\n http://pyqt.sourceforge.net/Docs/PyQt5/signals_slots.html ;\n and the problem appears to go away by using an encapsulating Python\n object... Not ideal!\n Does it also affect str? No, str seems OK.\n BUG REPRODUCED RELIABLY in pyqt5_signal_with_bytes.py.\n Reported to PyQt mailing list on 2016-12-01.\n SO FOR NOW: AVOID bytes OBJECTS IN PyQt5 SIGNALS.\n\nv0.3.0 (2017-06-22 to 2017-06-25)\n---------------------------------\n\nBug fixes / performance improvements:\n\n- Attempts to find/fix crash relating to very heavy multiple serial port\n use, likely relating to hardware serial overflow as devices are not\n properly buffered/flow-controlled.\n- Changes to package structure so that it installs cleanly via\n \"pip install starfeeder\", under Python 3.5 (PyQt5 not happy with Python\n 3.4, or at least its dependency \"sip\" isn't).\n- Extra-space-typo instant-crash bug fixed (introduced since 2.6!).\n- Bugfix: SerialController.__init__(): wasn't stashing self.output_encoding;\n not relevant in actual use as this value was only read by send_bytes(),\n which is in use only for debugging.\n- Bugfix: mis-indexing of the RFID/balance display lines on the main GUI\n page. (Was only relevant when a device, e.g. RFID, is present and\n disabled.)\n- Remove requirement for \"twisted\" in \"whisker\" package, so we can install\n without compilers under Windows.\n- Pin all package version numbers exactly, for consistency. [Note pyserial\n now 3.3 (was 3.2.1).]\n- Fixed a bug in Whisker package: things got stuck when trying to shut down,\n as the immediate socket was waiting for a reply with an EOL in it despite\n being closed (in WhiskerController.getline_immsock).\n- Added two indexes on RfidEventRecord for speed.\n- Moved to a single connection for the Task.\n- Reduce database thrashing substantially by keeping RFID events in Python\n primarily, with checks there, and occasional flushes.\n- Reworked balance reset code to make it more reliable.\n- Trapped CTRL-C and CTRL-BREAK, so it's safe to run from the command line.\n\nNew features:\n\n- Tare balance via command from another Whisker client.\n Use \"Tare BALANCE_NAME\" as the client message; so, in full, send to Whisker\n \"SendToClient CLIENTNUM Tare BALANCENAME\" where CLIENTNUM is the client\n number of Starfeeder (or -1 if you're very lazy and want to broadcast).\n- Record perch duration. For this, \"arrival\" is a mass-lock event, and\n \"departure\" is a mass-unlock event.\n Two options: (a) separate table; (b) extend mass_event table.\n It's a pretty clear choice to extend the mass_event table; half of the\n information is identical, and one would want arrival/departure in the same\n row to make it easy to calculate duration; arrival and departure times have\n an obligatory pairing in the way the balance operates.\n So we'll add \"unlocked_at\".\n\n - rename MassEvent.locked to MassEvent.locked_now\n - add MassEvent.unlocked_now\n - rework WeightWhiskerTask.on_mass\n - add MassEventRecord.unlocked_at\n\n Perch duration is then given by an SQL expression such as\n\n .. code-block::\n\n TIMEDIFF(mass_event.unlocked_at, mass_event.at)\n\n There's a new Whisker broadcast event: BALANCE_UNLOCK_EVENT.\n\n\nv0.3.2 (2017-08)\n----------------\n\n- updated for cardinal_pythonlib 1.0.0\n- faulthandler added to debug segfaults\n- removed \"default=arrow.now\" from MassEventRecord fields \"at\" and\n \"unlocked_at\", and RfidEventRecord fields \"first_detected_at\",\n \"last_detected_at\", and \"n_events\".\n These are mostly changes of no functional consequence, but\n MassEventRecord.unlocked_at may be relevant; we were getting occasional\n warnings of \"Mass unlock event without a matching lock event\" that\n might be relatd to unlocked_at being filled in inappropriately, which\n might have been triggered by flush_mass_records().\n\nv0.3.4 (2017-09-07)\n-------------------\n\n- make SQLAlchemy session use new \"pool_pre_ping\" feature, to avoid problems\n with MySQL timing out", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://www.whiskercontrol.com/", "keywords": "whisker rfid weigh balance starling", "license": "GNU General Public License v3 or later (GPLv3+)", "maintainer": "", "maintainer_email": "", "name": "starfeeder", "package_url": "https://pypi.org/project/starfeeder/", "platform": "", "project_url": "https://pypi.org/project/starfeeder/", "project_urls": { "Homepage": "http://www.whiskercontrol.com/" }, "release_url": "https://pypi.org/project/starfeeder/0.3.4/", "requires_dist": null, "requires_python": "", "summary": "Whisker Starfeeder (starling RFID/balance reader)", "version": "0.3.4" }, "last_serial": 3155716, "releases": { "0.2.10": [ { "comment_text": "", "digests": { "md5": "2d6059d3d837f4d573b3e73c76eee510", "sha256": "b769d584605f2e2f41742924dacd944d2fc356f77ab3db9db714caf40adc7ec0" }, "downloads": -1, "filename": "starfeeder-0.2.10.tar.gz", "has_sig": false, "md5_digest": "2d6059d3d837f4d573b3e73c76eee510", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 511852, "upload_time": "2017-06-22T23:10:50", "url": "https://files.pythonhosted.org/packages/0f/05/cacdc8c55e68ad0c4e6f95a4a1b39d5c8a9e6563641c14326ca2b7cf6309/starfeeder-0.2.10.tar.gz" } ], "0.2.11": [ { "comment_text": "", "digests": { "md5": "eea1a8d17bc9e0be3ca215468a8a60ec", "sha256": "71e3e40fc1dfe6b2a159fd55c6a615a9a7a572e6dcf3552af318888c16dc94f8" }, "downloads": -1, "filename": "starfeeder-0.2.11.tar.gz", "has_sig": false, "md5_digest": "eea1a8d17bc9e0be3ca215468a8a60ec", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 511942, "upload_time": "2017-06-22T23:36:13", "url": "https://files.pythonhosted.org/packages/bb/3e/f32133fba48493956a09565aad7ff468ff1398f3d780f4dfaaf415e162af/starfeeder-0.2.11.tar.gz" } ], "0.2.6": [ { "comment_text": "", "digests": { "md5": "1aa220193bf91a61dbe02074a9a9c871", "sha256": "911c33fc05f1f82ee5df7331b7586f3d6bb765f12675aac77ddf907310fcdf86" }, "downloads": -1, "filename": "starfeeder-0.2.6.tar.gz", "has_sig": false, "md5_digest": "1aa220193bf91a61dbe02074a9a9c871", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 511615, "upload_time": "2017-06-22T22:20:46", "url": "https://files.pythonhosted.org/packages/d6/f9/dbe931b99a1d304fa7bf4a0ab666533d8a83d2d31c93eda1f3873e3894b1/starfeeder-0.2.6.tar.gz" } ], "0.2.7": [ { "comment_text": "", "digests": { "md5": "f5105a6da672c8cf90b317566f9004c1", "sha256": "caf915b3360d27fa92273452d18adb53ef5fd5cca19eba10568eacf34a7a208b" }, "downloads": -1, "filename": "starfeeder-0.2.7.tar.gz", "has_sig": false, "md5_digest": "f5105a6da672c8cf90b317566f9004c1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 511659, "upload_time": "2017-06-22T22:57:21", "url": "https://files.pythonhosted.org/packages/79/e6/28f778e402b65ad932da4b448fc9ac92730fa93080fb58c7819de2070796/starfeeder-0.2.7.tar.gz" } ], "0.2.8": [ { "comment_text": "", "digests": { "md5": "cedb97ea2e86508875f88d93e52d15ee", "sha256": "7c665bec5009a7c9cdc31c8a766860a847d18b89274bc444fb084fb7e9432f89" }, "downloads": -1, "filename": "starfeeder-0.2.8.tar.gz", "has_sig": false, "md5_digest": "cedb97ea2e86508875f88d93e52d15ee", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 511698, "upload_time": "2017-06-22T23:05:01", "url": "https://files.pythonhosted.org/packages/a3/4b/834732122f8a22286bb9e7529d42dca882c9a2a71a02cc17a369aa195500/starfeeder-0.2.8.tar.gz" } ], "0.2.9": [ { "comment_text": "", "digests": { "md5": "8425525ba776fe93c457a3fc7aa8f25e", "sha256": "18d486a67f54e0b19553b284115d6d2c9906a8b9671b18ca7a2b4e1ba6e37a63" }, "downloads": -1, "filename": "starfeeder-0.2.9.tar.gz", "has_sig": false, "md5_digest": "8425525ba776fe93c457a3fc7aa8f25e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 511726, "upload_time": "2017-06-22T23:06:23", "url": "https://files.pythonhosted.org/packages/1f/fa/e5b922f8d503fe2299c4ebb27a43d717d0e28679fa9153de31301d553831/starfeeder-0.2.9.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "a100e89c05637cde118351f2371962dc", "sha256": "1eb7420cd294e4627ca563ee310836ab8efd1b6f41b0e8c9263601b25687247f" }, "downloads": -1, "filename": "starfeeder-0.3.0.tar.gz", "has_sig": false, "md5_digest": "a100e89c05637cde118351f2371962dc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 521645, "upload_time": "2017-06-25T09:53:50", "url": "https://files.pythonhosted.org/packages/e8/b4/8e1e98b826ae10229e634c5926042597f38f138adb90901952c2eb507adc/starfeeder-0.3.0.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "5a6a1aec7df98188178dcf5087e9b4a8", "sha256": "e0ab3763f694369e905280a6f2b93eba53e1c579943826046a5dcdf92b461f38" }, "downloads": -1, "filename": "starfeeder-0.3.2.tar.gz", "has_sig": false, "md5_digest": "5a6a1aec7df98188178dcf5087e9b4a8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 520374, "upload_time": "2017-08-14T11:05:51", "url": "https://files.pythonhosted.org/packages/28/c1/026e3ea84dbdcac6619485e8cfbf956aecc668ab7e0de5094fb56c8951c1/starfeeder-0.3.2.tar.gz" } ], "0.3.3": [ { "comment_text": "", "digests": { "md5": "cb47af8845097020f90e8bef0ca4c3da", "sha256": "1a53fcf640d31775e8958d4f814c2f75b0c3dcd8536dd7bbf75d390b5f46eb37" }, "downloads": -1, "filename": "starfeeder-0.3.3.tar.gz", "has_sig": false, "md5_digest": "cb47af8845097020f90e8bef0ca4c3da", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 520850, "upload_time": "2017-08-14T11:37:16", "url": "https://files.pythonhosted.org/packages/32/ca/e9b13b0a44a61dddef8b7f5dd5efeba0140c23323c53664163b1e9045cd2/starfeeder-0.3.3.tar.gz" } ], "0.3.4": [ { "comment_text": "", "digests": { "md5": "b9eaff8adb6cd114269b4b48346021dc", "sha256": "016adba98f38a23685866686bbf19ff8e55399632e35c7d010488da7cb3ef21c" }, "downloads": -1, "filename": "starfeeder-0.3.4.tar.gz", "has_sig": false, "md5_digest": "b9eaff8adb6cd114269b4b48346021dc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 522995, "upload_time": "2017-09-07T08:32:20", "url": "https://files.pythonhosted.org/packages/79/88/b0fd0aceb954886a730678b0010bb0091257d7b7f477cfd00afe7576e9f4/starfeeder-0.3.4.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "b9eaff8adb6cd114269b4b48346021dc", "sha256": "016adba98f38a23685866686bbf19ff8e55399632e35c7d010488da7cb3ef21c" }, "downloads": -1, "filename": "starfeeder-0.3.4.tar.gz", "has_sig": false, "md5_digest": "b9eaff8adb6cd114269b4b48346021dc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 522995, "upload_time": "2017-09-07T08:32:20", "url": "https://files.pythonhosted.org/packages/79/88/b0fd0aceb954886a730678b0010bb0091257d7b7f477cfd00afe7576e9f4/starfeeder-0.3.4.tar.gz" } ] }