PIP 5.5.3
Platform-Independent Primitives
Public Types | Public Member Functions | Static Public Member Functions | Protected Member Functions | Related Functions | List of all members
PIIODevice Class Referenceabstract

Base class for input/output devices. More...

#include <piiodevice.h>

Inheritance diagram for PIIODevice:
Inheritance graph
[legend]

Public Types

enum  DeviceMode { ReadOnly = 0x01 , WriteOnly = 0x02 , ReadWrite = 0x03 }
 Open modes for PIIODevice. More...
 
enum  DeviceOption { BlockingRead = 0x01 , BlockingWrite = 0x02 }
 Options for PIIODevice, works with some devices. More...
 
enum  DeviceInfoFlag { Sequential = 0x01 , Reliable = 0x02 }
 Characteristics of PIIODevice channel. More...
 

Public Member Functions

 PIIODevice ()
 Constructs a empty PIIODevice.
 
 PIIODevice (const PIString &path, DeviceMode mode=ReadWrite)
 Constructs PIIODevice with path "path" and open mode "mode".
 
DeviceMode mode () const
 Returns current open mode of device.
 
void setMode (DeviceMode m)
 Set open mode of device. Don`t reopen device.
 
DeviceOptions options () const
 Returns current device options.
 
bool isOptionSet (DeviceOption o) const
 Returns current device option "o" state.
 
void setOptions (DeviceOptions o)
 Set device options.
 
bool setOption (DeviceOption o, bool yes=true)
 Set device option "o" to "yes" and returns previous state.
 
DeviceInfoFlags infoFlags () const
 Returns device characteristic flags.
 
PIString path () const
 Returns current path of device.
 
void setPath (const PIString &path)
 Set path of device. Don`t reopen device.
 
bool isReadable () const
 Returns if mode is ReadOnly or ReadWrite.
 
bool isWriteable () const
 Returns if mode is WriteOnly or ReadWrite.
 
bool isOpened () const
 Returns if device is successfully opened.
 
bool isClosed () const
 Returns if device is closed.
 
virtual bool canRead () const
 Returns if device can read now.
 
virtual bool canWrite () const
 Returns if device can write now.
 
void setReopenEnabled (bool yes=true)
 Set calling of open() enabled while threaded read on closed device.
 
void setReopenTimeout (PISystemTime timeout)
 Set timeout between open() tryings if reopen is enabled.
 
bool isReopenEnabled () const
 Returns reopen enable.
 
PISystemTime reopenTimeout ()
 Returns reopen timeout.
 
void setThreadedReadSlot (ReadRetFunc func)
 Set threaded read callback. More...
 
void setThreadedReadData (void *d)
 Set custom data that will be passed to threaded read callback.
 
void setThreadedReadBufferSize (int new_size)
 Set size of threaded read buffer. More...
 
int threadedReadBufferSize () const
 Returns size of threaded read buffer.
 
const uchar * threadedReadBuffer () const
 Returns content of threaded read buffer.
 
void * threadedReadData () const
 Returns custom data that will be passed to threaded read callback.
 
bool isThreadedRead () const
 Returns if threaded read is started.
 
bool isThreadedReadStopping () const
 Returns if threaded read is stopping.
 
void startThreadedRead ()
 Start threaded read.
 
void startThreadedRead (ReadRetFunc func)
 Start threaded read and assign threaded read callback to "func".
 
void stopThreadedRead ()
 Stop threaded read.
 
void terminateThreadedRead ()
 Terminate threaded read. More...
 
bool waitThreadedReadFinished (PISystemTime timeout={})
 Wait for threaded read finish no longer than "timeout".
 
bool isThreadedWrite () const
 Returns if threaded write is started.
 
void startThreadedWrite ()
 Start threaded write.
 
void stopThreadedWrite ()
 Stop threaded write.
 
void terminateThreadedWrite ()
 Terminate threaded write. More...
 
bool waitThreadedWriteFinished (PISystemTime timeout={})
 Wait for threaded write finish no longer than "timeout".
 
void clearThreadedWriteQueue ()
 Clear threaded write task queue.
 
void start ()
 Start both threaded read and threaded write.
 
void stop ()
 Stop both threaded read and threaded write.
 
void stopAndWait (PISystemTime timeout={})
 Stop both threaded read and threaded write and wait for finish.
 
virtual void interrupt ()
 Interrupt blocking operation.
 
ssize_t read (void *read_to, ssize_t max_size)
 Read from device maximum "max_size" bytes to "read_to".
 
ssize_t read (PIMemoryBlock mb)
 Read from device to memory block "mb".
 
PIByteArray read (ssize_t max_size)
 Read from device maximum "max_size" bytes and returns them as PIByteArray.
 
virtual ssize_t bytesAvailable () const
 Returns the number of bytes that are available for reading. More...
 
ssize_t write (const void *data, ssize_t max_size)
 Write maximum "max_size" bytes of "data" to device.
 
PIByteArray readForTime (PISystemTime timeout)
 Read from device for "timeout" and return readed data as PIByteArray.
 
ullong writeThreaded (const void *data, ssize_t max_size)
 Add task to threaded write queue and return task ID.
 
ullong writeThreaded (const PIByteArray &data)
 Add task to threaded write queue and return task ID.
 
bool configure (const PIString &config_file, const PIString &section, bool parent_section=false)
 Configure device from section "section" of file "config_file", if "parent_section" parent section also will be read.
 
virtual PIConstChars fullPathPrefix () const
 Returns full unambiguous string prefix. Creating devices by unambiguous string.
 
PIString constructFullPath () const
 Returns full unambiguous string, describes this device, fullPathPrefix() + "://" + ...
 
void configureFromFullPath (const PIString &full_path)
 Configure device with parameters of full unambiguous string.
 
PIVariantTypes::IODevice constructVariant () const
 Returns PIVariantTypes::IODevice, describes this device.
 
void configureFromVariant (const PIVariantTypes::IODevice &d)
 Configure device from PIVariantTypes::IODevice.
 
ssize_t write (const PIMemoryBlock &mb)
 Write memory block "mb" to device.
 
- Public Member Functions inherited from PIObject
 PIObject (const PIString &name=PIString())
 Contructs PIObject with name "name".
 
PIString name () const
 Returns object name.
 
virtual const char * className () const
 Returns object class name.
 
virtual const char * parentClassName () const
 Returns parent class name.
 
bool debug () const
 Return if piCoutObj of this object is active.
 
void setName (const PIString &name)
 Set object name.
 
void setDebug (bool debug)
 Set object piCoutObj active.
 
PIVariant property (const char *name) const
 Returns property with name "name".
 
void setProperty (const char *name, const PIVariant &value)
 Set property with name "name" to "value". If there is no such property in object it will be added.
 
bool isPropertyExists (const char *name) const
 Returns if property with name "name" exists.
 
PIStringList scopeList () const
 Returns subclass scope of this object (including this class name)
 
void piDisconnect (const PIString &sig, PIObject *dest, void *ev_h)
 Disconnect object from all connections with event name "sig", connected to destination object "dest" and handler "ev_h".
 
void piDisconnect (const PIString &sig, PIObject *dest)
 Disconnect object from all connections with event name "sig", connected to destination object "dest".
 
void piDisconnect (const PIString &sig)
 Disconnect object from all connections with event name "sig".
 
bool isPIObject () const
 Returns if this is valid PIObject (check signature)
 
template<typename T >
bool isTypeOf () const
 Returns if this is valid PIObject subclass "T" (check signature and classname)
 
template<typename T >
T * cast () const
 Returns cast to T if this is valid subclass "T" (check by isTypeOf()) or "nullptr".
 
void callQueuedEvents ()
 Execute all posted events from CONNECTU_QUEUED connections.
 
bool maybeCallQueuedEvents ()
 Check if any CONNECTU_QUEUED connections to this object and execute them. More...
 
void deleteLater ()
 Mark object to delete. More...
 
void deleted (PIObject *o)
 Raise before object delete. More...
 

Static Public Member Functions

static PIIODevicecreateFromFullPath (const PIString &full_path)
 Try to create new device by prefix, configure it with configureFromFullPath() and returns it. More...
 
static PIIODevicecreateFromVariant (const PIVariantTypes::IODevice &d)
 Try to create new device by prefix, configure it with configureFromVariant() and returns it.
 
static PIStringList availablePrefixes ()
 Returns fullPath prefixes of all registered devices.
 
static PIStringList availableClasses ()
 Returns class names of all registered devices.
 
- Static Public Member Functions inherited from PIObject
static void piDisconnect (PIObject *src, const PIString &sig, PIObject *dest, void *ev_h)
 Disconnect object "src" from all connections with event name "sig", connected to destination object "dest" and handler "ev_h".
 
static void piDisconnect (PIObject *src, const PIString &sig, PIObject *dest)
 Disconnect object "src" from all connections with event name "sig", connected to destination object "dest".
 
static void piDisconnect (PIObject *src, const PIString &sig)
 Disconnect object "src" from all connections with event name "sig".
 
static PIObjectfindByName (const PIString &name)
 Returns PIObject* with name "name" or 0, if there is no object found.
 
static bool isPIObject (const PIObject *o)
 Returns if "o" is valid PIObject (check signature)
 
template<typename T >
static bool isTypeOf (const PIObject *o)
 Returns if "o" is valid PIObject subclass "T" (check signature and classname)
 

Protected Member Functions

virtual bool configureDevice (const void *e_main, const void *e_parent=0)
 Reimplement to configure device from entries "e_main" and "e_parent", cast arguments to PIConfig::Entry*.
 
virtual bool openDevice ()=0
 Reimplement to open device, return value will be set to "opened_" variable. Don't call this function in subclass, use open()!
 
virtual bool closeDevice ()
 Reimplement to close device, inverse return value will be set to "opened_" variable.
 
virtual ssize_t readDevice (void *read_to, ssize_t max_size)
 Reimplement this function to read from your device.
 
virtual ssize_t writeDevice (const void *data, ssize_t max_size)
 Reimplement this function to write to your device.
 
virtual bool threadedRead (const uchar *readed, ssize_t size)
 Function executed when thread read some data, default implementation execute external callback "ret_func_".
 
virtual PIString constructFullPathDevice () const
 Reimplement to construct full unambiguous string, describes this device. Default implementation returns path()
 
virtual void configureFromFullPathDevice (const PIString &full_path)
 Reimplement to configure your device with parameters of full unambiguous string. Default implementation call setPath()
 
virtual PIPropertyStorage constructVariantDevice () const
 Reimplement to construct device properties. Default implementation return PIPropertyStorage with "path" entry.
 
virtual void configureFromVariantDevice (const PIPropertyStorage &d)
 Reimplement to configure your device from PIPropertyStorage. Options and mode already applied. Default implementation apply "path" entry.
 
virtual void optionsChanged ()
 Reimplement to apply new device options.
 
virtual DeviceInfoFlags deviceInfoFlags () const
 Reimplement to return correct DeviceInfoFlags. Default implementation returns 0.
 
virtual void threadedReadBufferSizeChanged ()
 Reimplement to apply new threadedReadBufferSize()
 
- Protected Member Functions inherited from PIObject
PIObjectemitter () const
 Returns PIObject* which has raised an event. This value is correct only in definition of some event handler.
 
virtual void propertyChanged (const char *name)
 Virtual function executes after property with name "name" has been changed.
 

Related Functions

(Note that these are not member functions.)

template<typename T >
readDeviceSetting (const PIString &name, const T &def, const PIConfig::Entry *em, const PIConfig::Entry *ep)
 Service function. useful for configuring devices. More...
 
#define REGISTER_DEVICE(class)
 Enable device instances creation with PIIODevice::createFromFullPath() function. More...
 
#define PIIODEVICE(class, prefix)
 Use this macro instead of PIOBJECT when describe your own PIIODevice. More...
 

Configurable parameters

bool reopenEnabled
 setReopenEnabled, default "true"
 
int reopenTimeout
 setReopenTimeout, default 1_s
 
int threadedReadBufferSize
 setThreadedReadBufferSize in bytes, default 4096
 

Handlers

bool open ()
 Open device.
 
bool open (const PIString &_path)
 Open device with path "path".
 
bool close ()
 Close device.
 
ssize_t write (PIByteArray data)
 Write "data" to device.
 

Virtual handlers

virtual void flush ()
 Immediate write all buffers.
 

Events

void opened ()
 Raise if succesfull open.
 
void closed ()
 Raise if succesfull close.
 
void threadedReadEvent (const uchar *readed, ssize_t size)
 Raise if read thread succesfull read some data.
 
void threadedWriteEvent (ullong id, ssize_t written_size)
 Raise if write thread successfull write some data of task with ID "id".
 

Detailed Description

Base class for input/output devices.

Synopsis

This class provide open/close logic, threaded read/write and virtual input/output functions read() and write(). You should implement pure virtual function openDevice() in your subclass.

Open and close

PIIODevice have boolean variable indicated open status. Returns of functions openDevice() and closeDevice() change this variable.

Threaded read

PIIODevice based on PIThread, so it`s overload run() to exec read() in background thread. If read is successful virtual function threadedRead() is executed. Default implementation of this function execute external static function set by setThreadedReadSlot() with data set by setThreadedReadData(). Extrenal static function should have format
bool func_name(void * Threaded_read_data, uchar * readed_data, int readed_size)
Threaded read starts with function startThreadedRead().

Threaded write

PIIODevice aggregate another PIThread to perform a threaded write by function writeThreaded(). This function add task to internal queue and return queue entry ID. You should start write thread by function startThreadedWrite. On successful write event threadedWriteEvent is raised with two arguments - task ID and written bytes count.

Internal buffer

PIIODevice have internal buffer for threaded read, and threadedRead() function receive pointer to this buffer in first argument. You can adjust size of this buffer by function setThreadedReadBufferSize()
Default size of this buffer is 4096 bytes.

Reopen

When threaded read is begin its call open() if device is closed. While threaded read running PIIODevice check if device opened every read and if not call open() every reopen timeout if reopen enabled. Reopen timeout is set by setReopenTimeout(), reopen enable is set by setReopenEnabled().

Configuration

This is virtual function configureDevice() which executes when configure() executes. This function takes two arguments: "e_main" and "e_parent" as void*. There are pointers to PIConfig::Entry entries of section "section" and their parent. If there is no parent "e_parent" = 0. Function configure() set three parameters of device: "reopenEnabled", "reopenTimeout" and "threadedReadBufferSize", then execute function configureDevice().
Each ancestor of PIIODevice reimlements configureDevice() function to be able to be confured from configuration file. This parameters described at section "Configurable parameters" in the class reference.
Usage example:

// file example.conf
dev.reopenEnabled = false
dev.device = /dev/ttyS0
dev.speed = 9600
// end example.conf
// code
ser.configure("example.conf", "dev");
bool configure(const PIString &config_file, const PIString &section, bool parent_section=false)
Configure device from section "section" of file "config_file", if "parent_section" parent section als...
Definition: piiodevice.cpp:471
Serial device.
Definition: piserial.h:37

Implementation example:

class SomeIO: public PIIODevice {
...
bool configureDevice(const void * e_main, const void * e_parent) override {
PIConfig::Entry * em = (PIConfig::Entry * )e_main;
PIConfig::Entry * ep = (PIConfig::Entry * )e_parent;
setStringParam(readDeviceSetting<PIString>("stringParam", stringParam(), em, ep));
setIntParam(readDeviceSetting<int>("intParam", intParam(), em, ep));
return true;
}
...
};
Entry of configuration file
Definition: piconfig.h:141
Base class for input/output devices.
Definition: piiodevice.h:87
virtual bool configureDevice(const void *e_main, const void *e_parent=0)
Reimplement to configure device from entries "e_main" and "e_parent", cast arguments to PIConfig::Ent...
Definition: piiodevice.h:508

Creating devices by unambiguous string

There are some virtual functions to describe child class without its declaration.
constructFullPath() should returns full unambiguous string, contains prefix and all device parameters
configureFromFullPath() provide configuring device from full unambiguous string without prefix and "://"
Macro PIIODEVICE should be used instead of PIOBJECT
Macro REGISTER_DEVICE should be used after declaration of class, i.e. at the last line of *.h file

If custom I/O device corresponds there rules, it can be returned by function createFromFullPath().
Each PIP I/O device has custom unambiguous string description:

Example

class SomeIO: public PIIODevice {
PIIODEVICE(SomeIO, "myio")
public:
SomeIO(): PIIODevice() {}
protected:
bool openDevice() override {
// open your device here
return if_success;
}
ssize_t readDevice(void * read_to, ssize_t max_size) override {
// read from your device here
return readed_bytes;
}
ssize_t writeDevice(const void * data, ssize_t max_size) override {
// write to your device here
return written_bytes;
}
void configureFromFullPathDevice(const PIString & full_path) override {
// parse full_path and configure device here
}
};
virtual void configureFromFullPathDevice(const PIString &full_path)
Reimplement to configure your device with parameters of full unambiguous string. Default implementati...
Definition: piiodevice.h:548
virtual ssize_t readDevice(void *read_to, ssize_t max_size)
Reimplement this function to read from your device.
Definition: piiodevice.h:522
virtual ssize_t writeDevice(const void *data, ssize_t max_size)
Reimplement this function to write to your device.
Definition: piiodevice.h:529
#define REGISTER_DEVICE(class)
Enable device instances creation with PIIODevice::createFromFullPath() function.
Definition: piiodevice.h:46
#define PIIODEVICE(class, prefix)
Use this macro instead of PIOBJECT when describe your own PIIODevice.
Definition: piiodevice.h:55
virtual bool openDevice()=0
Reimplement to open device, return value will be set to "opened_" variable. Don't call this function ...
String class.
Definition: pistring.h:42

Member Enumeration Documentation

◆ DeviceMode

Open modes for PIIODevice.

Enumerator
ReadOnly 

Device can only read

WriteOnly 

Device can only write

ReadWrite 

Device can both read and write

◆ DeviceOption

Options for PIIODevice, works with some devices.

Enumerator
BlockingRead 

read() block until data is received, default off

BlockingWrite 

write() block until data is sent, default off

◆ DeviceInfoFlag

Characteristics of PIIODevice channel.

Enumerator
Sequential 

Continuous bytestream without packets

Reliable 

Channel without data errors or corruptions

Member Function Documentation

◆ setThreadedReadSlot()

void PIIODevice::setThreadedReadSlot ( ReadRetFunc  func)

Set threaded read callback.

Set external static function of threaded read that will be executed at every successful threaded read. Function should have format "bool func(void * data, uchar * readed, int size)"

◆ setThreadedReadBufferSize()

void PIIODevice::setThreadedReadBufferSize ( int  new_size)

Set size of threaded read buffer.

Default size is 4096 bytes. If your device can read at single read more than 4096 bytes you should use this function to adjust buffer size

◆ terminateThreadedRead()

void PIIODevice::terminateThreadedRead ( )

Terminate threaded read.

Warning
Try not to use! This method may cause memory corruption!

◆ terminateThreadedWrite()

void PIIODevice::terminateThreadedWrite ( )

Terminate threaded write.

Warning
Try not to use! This method may cause memory corruption!

◆ bytesAvailable()

virtual ssize_t PIIODevice::bytesAvailable ( ) const
inlinevirtual

Returns the number of bytes that are available for reading.

This function is commonly used with sequential devices to determine the number of bytes to allocate in a buffer before reading. If function returns -1 it mean that number of bytes undefined.

Reimplemented in PICloudClient, PIFile, PIIOByteArray, PIIOString, PITransparentDevice, and PIPacketExtractor.

◆ createFromFullPath()

PIIODevice * PIIODevice::createFromFullPath ( const PIString full_path)
static

Try to create new device by prefix, configure it with configureFromFullPath() and returns it.

To function configureFromFullPath() "full_path" passed without fullPathPrefix() and "://". See Creating devices by unambiguous string

Friends And Related Function Documentation

◆ readDeviceSetting()

template<typename T >
T readDeviceSetting ( const PIString name,
const T &  def,
const PIConfig::Entry em,
const PIConfig::Entry ep 
)
related

Service function. useful for configuring devices.

Function takes entry name "name", default value "def" and two PIConfig::Entry sections: "em" and their parent "ep". If there is no parent ep = 0. If "ep" is not null and entry "name" exists in "ep" function returns this value. Else returns value of entry "name" in section "em" or "def" if entry doesn`t exists.
This function useful to read settings from configuration file in implementation PIIODevice::configureDevice() function

◆ REGISTER_DEVICE

#define REGISTER_DEVICE (   class)
related

Enable device instances creation with PIIODevice::createFromFullPath() function.

This macro may be placed in cpp or header file, but preferred place is header

◆ PIIODEVICE

#define PIIODEVICE (   class,
  prefix 
)
related

Use this macro instead of PIOBJECT when describe your own PIIODevice.

Parameters
prefixUnique device prefix in quotes, may be ""