Menu

Tree [e3e8c9] master /
 History

HTTPS access


File Date Author Commit
 99-libftdi.rules 2016-10-27 Alexey Filin Alexey Filin [b6e1ad] udev rule
 README 2016-10-25 Alexey Filin Alexey Filin [48ae2a] Initial commit
 mantigorahvps 2016-10-25 Alexey Filin Alexey Filin [48ae2a] Initial commit
 mantigorahvps.py 2017-02-08 Alexey Filin Alexey Filin [e3e8c9] fix for write_data in libftdi-python-1.3
 my_transfer_data_done.c 2016-10-25 Alexey Filin Alexey Filin [48ae2a] Initial commit

Read Me

This program implements a GUI interface to Mantigora high voltage power supply
for Linux.

Features:

  * Work with some devices is provided from one application. No interface
    freezes can happen, each device is served by own I/O thread for background
    and calibration reads.

  * Calibration of built-in voltmeter can be performed for each device
    separately with a reference voltmeter. The saved calibration is loaded
    for initialization of each device automatically.

  * GUI layout and settings can be saved as a profile. Any number of profiles
    can be saved and required one can be loaded at any time.

Dependencies: python-2.7, libftdi (libftdi-1), libftdi-python
(libftdi-python-1), PyQt4 (can be installed e.g. from repository of Fedora)

Copy 99-libftdi.rules to /etc/udev/rules.d/ to allow user access to devices.

-----------------------------------------------------------------------------
Scalability as of number of open devices

By default the application uses synchronous reads and is not scalable
because python GIL is not released for reads so all devices are read
sequentially.

With asynchronous reads the application is scalable but libFTDI contains a bug.
Loop in ftdi_transfer_data_done() can run indefinitely long thanks to:

     1. lost/not sent bytes from modem line, so read callback can't read data
        and set flag 'completed'

     2. regular generation of modem status bytes each 40 msec, so read callback
        restarts transfer and timeout in
	libusb_handle_events_timeout_completed() can't happen

So asynchronous reads can block application indefinitely long.
To solve the problem ftdi_transfer_data_done() is to be replaced in such a way:

  1. build shared object my_transfer_data_done.so (install libftdi-devel if
     required):

    > gcc -Wall -O6 -fPIC -shared -lusb-1.0 -o my_transfer_data_done.so my_transfer_data_done.c

  2. set environment variable LD_LIBRARY_PATH (in bash):

   > export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:<path to my_transfer_data_done.so>

  3. set LD_PRELOAD and run application (in bash):

   > LD_PRELOAD=my_transfer_data_done.so ./mantigorahvps.py

Timeout of ftdi_transfer_data_done() is set as float number in seconds
in file my_transfer_data_done.c:

#define MY_TRANSFER_DATA_DONE_TOUT_SEC 1.0

If timeout happens the replacement of ftdi_transfer_data_done() outputs
message to stderr:

ERROR: ftdi_transfer_data_done timed out after 1.012927 s

-----------------------------------------------------------------------------
There is a bug in mantigora HVPS hardware. Sometimes try to read built-in
voltmeter hangs. Next reads succeed usually.
Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.