Usage of write_pipe in pytango

Hello,

I’m successfully using and TANGO pipe to write a binary bitstream to a device server using a DeviceProxy in C++, but I’m having trouble getting the equivalent code to work in Python.

Here is the working C++ code that writes an DevULong size followed by a number of DevVarCharArrays.


fpga = new DeviceProxy( "some/tango/device" );

ifstream bitfile(argv[1], std::ios::binary | std::ios::ate );
if( bitfile.good() ) {
  uint32_t size = bitfile.tellg();
  bitfile.seekg(0, std::ios::beg);

  DevicePipe bsize;
  bsize.set_name("bitstream");
  vector<std::string> blobnames {"bitstreamInfo"};
  bsize.set_data_elt_names(blobnames);
  bsize << size;
  fpga->write_pipe(bsize);
  cout << "Bitstream size is " << size << " bytes." << endl;

  for( unsigned i = 0; i < size; i += sendSize ) {
    unsigned bufSize = (i+sendSize > size) ? size-i : sendSize;

    DevVarCharArray *buf = new DevVarCharArray();
    buf->length(bufSize);
    if( bitfile.read(reinterpret_cast<char*>(buf->get_buffer()), bufSize) ) {
      DevicePipe bdata;
      bdata.set_name("bitstream");
      bdata.set_data_elt_names(blobnames);
      bdata << buf;
      fpga->write_pipe(bdata);
      cout << "Sent " << bufSize << " bytes" << endl;
    }
    else {
      cout << "Error while reading in bitstream file" << endl;
    }
  }

}

In PyTango, I can’t get the first write_pipe() to work where I write a single DevULong value.
Is there something wrong with how I’m assembling that ‘blob’ variable for write_pipe input argument? Are there any exmaples of write_pipe() usage out there I can follow?


blob = ("bitstream", ("bitstreamInfo", {"dtype":CmdArgType.DevULong, "value":fileSize}))
DeviceProxy.write_pipe(blob)

Traceback (most recent call last):
  File "C:\test\util_loadBitstream.py", line 44, in <module>
    DeviceProxy.write_pipe(blob)
  File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\lib\site-packages\tango\green.py", line 195, in greener
    return executor.run(fn, args, kwargs, wait=wait, timeout=timeout)
  File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\lib\site-packages\tango\green.py", line 109, in run
    return fn(*args, **kwargs)
  File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\lib\site-packages\tango\device_proxy.py", line 1481, in __DeviceProxy__write_pipe
    pipe_name, (blob_name, blob_data) = args
ValueError: not enough values to unpack (expected 2, got 0)

Thanks in advance for your help.

Mike