## vsi::device This provides direct access to a hardware device or software shared memory using posix compliant calls. ### Function Reference #### Command to Write number of bytes to the device `int write(const void *buff, size_t count)` ###### Parameters - `buff`: Raw buffer containing the data to write. - `count`: Size of bytes to write. Should be equal to or smaller than the buff size. - return: the size of actual bytes written. ##### Usage in C/C++ ##### Usage in Python ``` # dev = VsiDevice buf_in = vsi_runtime.Buffer(256) buf_in.fill("abcd0123") dev.write(buf_in) ``` #### Command to read specified number of bytes from the vsi::device `int read (void *buff, size_t count)` ###### Parameters - `buff`: Target raw buffer. - `count`: size of the data to read. - return: the size of actual bytes read. ##### Usage in C/C++ ##### Usage in Python ``` # dev = VsiDevice buf_out = vsi_runtime.Buffer(256) dev.read(buf_out) ``` #### Command to write specified number of bytes `int pwrite(const void *buff, size_t count, int offset)`: ###### Parameters - `buff`: Raw buffer containing the data to write. - `count`: Size of bytes to write. Should be equal to or smaller than the buff size. - `offset`: Specify the offset to write. - return: the size of actual bytes written. ##### Usage in C/C++ ##### Usage in Python ``` # dev = VsiDevice OFFSET = 0 buf_in = vsi_runtime.Buffer(256) buf_in.fill("abcd0123") dev.pwrite(buf_in, OFFSET) ``` #### Command to read specified number of bytes `int pread(void *buff, size_t count, int offset)`: ###### Parameters - `buff`: Target raw buffer. - `count`: size of the data to read. - `offset`: Specify the offset to read. - return: the size of actual bytes read. ##### Usage in C/C++ ##### Usage in Python ``` # dev = VsiDevice OFFSET = 0 buf_out = vsi_runtime.Buffer(256) dev.pread(buf_out, OFFSET) ``` #### Command that blocks until an interrupt or till timeout expires `int poll(int timeout)` ###### Parameters - `timeout`: Timeout to wait for an interrupt. ##### Usage in C/C++ ##### Usage in Python ``` # dev = VsiDevice dev.poll() ``` #### Command to return the underlying operating system device descriptor `int device_fd()` ##### Usage in C/C++ ##### Usage in Python ``` # dev = VsiDevice FD = dev.device_fd() ``` #### Language Specific notes and code snippets Since python has no `void*` type, in order to use read, write, pread and pwrite from Python, the pointer and size needs to be wrapped into a VsiDevice type. A typical example of it is as following: ``` def process_device(dev): global COUNT, OFFSET COUNT += 1 buf_in = vsi_runtime.Buffer(256) buf_out = vsi_runtime.Buffer(256) buf_in.fill("abcd0123") dev.pwrite(buf_in, OFFSET) dev.pread(buf_out, OFFSET) if (COUNT % 20) == 0: print 'Matched:{}, COUNT:{}, OFFSET:{}'.format(buf_in.compare(buf_out), COUNT, OFFSET) OFFSET += 1 ``` When reading from a file, the alternative method of Buffer can be used to reuse the same memory: ``` def process_device_file(dev): global COUNT, OFFSET, file_name create_file(file_name) buf_in = vsi_runtime.Buffer(256) buf_out = vsi_runtime.Buffer(256) file_size = os.stat(file_name).st_size f = open(file_name, "rb") try: buf_in.set(f.read(256)) while file_size > (256 * COUNT): dev.pwrite(buf_in, OFFSET) dev.pread(buf_out, OFFSET) # if (COUNT % 10) == 0: print 'Matched:{}, COUNT:{}, OFFSET:{}'.format(buf_in.compare(buf_out), COUNT, OFFSET) OFFSET += 1 COUNT += 1 buf_in.set(f.read(256)) finally: f.close() ```