Files
cdev-1.7.2n/include/cdevDevice.h
2022-12-13 12:44:04 +01:00

162 lines
5.9 KiB
C++

//-----------------------------------------------------------------------------
// Copyright (c) 1994,1995 Southeastern Universities Research Association,
// Continuous Electron Beam Accelerator Facility
//
// This software was developed under a United States Government license
// described in the NOTICE file included as part of this distribution.
//
//-----------------------------------------------------------------------------
//
// Description:
// cdevDevice: a virtual control device
//
// Author: Jie Chen & Chip Watson
//
// Revision History:
// cdevDevice.h,v
// Revision 1.4 1996/11/21 17:03:13 akers
// Ongoing Developement of CDEV 1.5
//
// Revision 1.3 1995/07/05 18:39:43 chen
// change interface
//
// Revision 1.2 1995/06/30 15:59:27 chen
// remove all unnecessary files
//
// Revision 1.1.1.1 1995/06/16 17:14:06 epics
// initial import of cdev
//
//
#ifndef _CDEV_DEVICE_H
#define _CDEV_DEVICE_H
#include <cdevSpec.h>
#include <cdevSlist.h>
#include <cdevSystem.h>
#include <cdevData.h>
#include <cdevCallback.h>
#include <cdevIOcontext.h>
class cdevRequestObject;
class CDEV_CLASS_SPEC cdevDevice: public cdevIOcontext
{
public:
//===================================================================
// Public Interface for Clients
//===================================================================
static cdevDevice& attachRef (char *name);
static cdevDevice* attachPtr (char *name);
// PURPOSE: create a reference or pointer for device of a given name
// within the default system
// REQUIRE: name != 0
// PROMISE: a cdevDevice
static void detach (cdevDevice& dev);
static void detach (cdevDevice* dev);
// PURPOSE: destroy a cdevDevice
// REQUIRE: dev != 0
// PROMISE: memory will be freed if no more attachment on this device
const char *name (void) const;
// PURPOSE: return device name
// REQUIRE: nothing
// PROMISE: a name
cdevSystem& system (void) const;
// PURPOSE: return system associated with this device
// REQUIRE: nothing
// PROMISE: return reference of the system
virtual int send (char *msg, cdevData &out, cdevData& result);
virtual int send (char *msg, cdevData *out, cdevData& result);
virtual int send (char *msg, cdevData &out, cdevData* result);
virtual int send (char *msg, cdevData *out, cdevData* result);
// PURPOSE: synchronous IO operations
// REQUIRE: when set, provide out, when get, provide result
// PROMISE: return CDEV_SUCCESS: success. Check cdevErrCode.h for error info
virtual int sendNoBlock (char *msg, cdevData &out, cdevData &result);
virtual int sendNoBlock (char *msg, cdevData *out, cdevData &result);
virtual int sendNoBlock (char *msg, cdevData &out, cdevData *result);
virtual int sendNoBlock (char *msg, cdevData *out, cdevData *result);
// PURPOSE: asynchronous IO operations
// REQUIRE: same as the above and one may use cdevGroup to group these
// PROMISE: return CDEV_SUCCESS: success. Check cdevErrCode.h for error info
virtual int sendCallback (char *msg, cdevData &out, cdevCallback &callback);
virtual int sendCallback (char *msg, cdevData *out, cdevCallback &callback);
// PURPOSE: asynchronous IO operations with user supplied callback function
// REQUIRE: out != 0
// PROMISE: return CDEV_SUCCESS: request sendout success.
// check cdevErrCode.h for error info
// setIOcontext function, pass cxt to requestObject int the list
virtual int setContext (cdevData& cxt);
// PURPOSE: set context to this device
// REQUIRE: nothing
// PROMISE: always return 0, set constext to all request objects
// in this device
//========================================================================
// Public Interface for cdevRequestObject
//========================================================================
virtual cdevRequestObject* getRequestObject (char *msg);
// PURPOSE: get a requestObject based on message 'msg'
// REQUIRE: msg != 0
// PROMISE: return a pointer to requestObject
virtual int getRequestObject (char *msg, cdevRequestObject* &reqobj);
// PURPOSE: get right requestObject
// REQUIRE: msg != 0, callers provide pointer only.
// PROMISE: always return CDEV_SUCCESS. reqobj may be an errorRequestObject
virtual int registerReqObject (cdevRequestObject *obj);
// PURPOSE: register a requestObject into this device
// REQUIRE: obj != 0
// PROMISE: return CDEV_SUCCESS: success, CDEV_ERROR: already here
virtual int removeReqObject (cdevRequestObject *obj);
// PURPOSE: remove a requestObject from the device
// REQUIRE: obj != 0
// PROMISE: return CDEV_SUCCESS: success, CDEV_ERROR: not here
virtual const char *className (void) const {return "cdevDevice";}
protected:
//constructors and destructor
cdevDevice (char *name, cdevSystem& system = cdevSystem::defaultSystem() );
virtual ~cdevDevice (void);
// attach pointer or reference with system as second argument
// protected to prevent application from using multiple systems
static cdevDevice& attachRef (char *name, cdevSystem& system);
static cdevDevice* attachPtr (char *name, cdevSystem& system);
// PURPOSE: create a reference or pointer for device of a given name
// REQUIRE: name != 0
// PROMISE: a cdevDevice
cdevRequestObject* findRequestObject(char *msg);
// PURPOSE: find an existing requestObject
// REQUIRE: name != 0, callers provide pointer only.
// PROMISE: return valid request object or NULL if not found
// Protected data items
char *deviceName_;
cdevSystem& system_;
cdevSlist reqObjList_;
int unregOn_; // unregister self from system on delete
int refCount_;
private:
// hide assignment and copy operator since the device is
// a memory manager for requestObject
cdevDevice& operator = (const cdevDevice &);
cdevDevice (const cdevDevice &);
// friend class declaration
friend class cdevSystem;
friend class cdevRequestObject;
};
#endif