This is Unofficial EPICS BASE Doxygen Site
epics::pvDatabase::ChannelArrayLocal Class Reference
+ Inheritance diagram for epics::pvDatabase::ChannelArrayLocal:
+ Collaboration diagram for epics::pvDatabase::ChannelArrayLocal:

Public Member Functions

 POINTER_DEFINITIONS (ChannelArrayLocal)
 
virtual ~ChannelArrayLocal ()
 
virtual void destroy ()
 
virtual void getArray (size_t offset, size_t count, size_t stride)
 
virtual void putArray (PVArrayPtr const &putArray, size_t offset, size_t count, size_t stride)
 
virtual void getLength ()
 
virtual void setLength (size_t length)
 
virtual std::tr1::shared_ptr< ChannelgetChannel ()
 
virtual void cancel ()
 
virtual void lock ()
 
virtual void unlock ()
 
virtual void lastRequest ()
 
- Public Member Functions inherited from epics::pvAccess::ChannelArray
 POINTER_DEFINITIONS (ChannelArray)
 
virtual ~ChannelArray ()
 
virtual void putArray (epics::pvData::PVArray::shared_pointer const &putArray, size_t offset=0, size_t count=0, size_t stride=1)=0
 
- Public Member Functions inherited from epics::pvAccess::ChannelRequest
 POINTER_DEFINITIONS (ChannelRequest)
 
 ChannelRequest ()
 
virtual ~ChannelRequest ()
 
- Public Member Functions inherited from epics::pvAccess::Destroyable
 POINTER_DEFINITIONS (Destroyable)
 
- Public Member Functions inherited from epics::pvAccess::Lockable
 POINTER_DEFINITIONS (Lockable)
 
virtual ~Lockable ()
 

Static Public Member Functions

static ChannelArrayLocalPtr create (ChannelLocalPtr const &channelLocal, ChannelArrayRequester::shared_pointer const &channelArrayRequester, PVStructurePtr const &pvRequest, PVRecordPtr const &pvRecord)
 

Additional Inherited Members

- Public Types inherited from epics::pvAccess::ChannelArray
typedef ChannelArrayRequester requester_type
 
- Static Public Attributes inherited from epics::pvAccess::ChannelRequest
static size_t num_instances
 
- Protected Member Functions inherited from epics::pvAccess::Destroyable
virtual ~Destroyable ()
 

Detailed Description

Definition at line 954 of file channelLocal.cpp.

Constructor & Destructor Documentation

epics::pvDatabase::ChannelArrayLocal::~ChannelArrayLocal ( )
virtual

Definition at line 1090 of file channelLocal.cpp.

1091 {
1092 //cout << "~ChannelArrayLocal()\n";
1093 }

Member Function Documentation

virtual void epics::pvDatabase::ChannelArrayLocal::cancel ( )
inlinevirtual

Cancel any pending request. Completion will be reported via request's response callback:

  • if cancel() request is issued after the request was already complete, request success/failure completion will be reported and cancel() request ignored.
  • if the request was actually canceled, cancellation completion is reported.

Implements epics::pvAccess::ChannelRequest.

Definition at line 974 of file channelLocal.cpp.

974 {}
ChannelArrayLocalPtr epics::pvDatabase::ChannelArrayLocal::create ( ChannelLocalPtr const &  channelLocal,
ChannelArrayRequester::shared_pointer const &  channelArrayRequester,
PVStructurePtr const &  pvRequest,
PVRecordPtr const &  pvRecord 
)
static

Definition at line 1007 of file channelLocal.cpp.

1012 {
1013  PVFieldPtrArray const & pvFields = pvRequest->getPVFields();
1014  if(pvFields.size()!=1) {
1015  Status status(
1016  Status::STATUSTYPE_ERROR,"invalid pvRequest");
1017  ChannelArrayLocalPtr channelArray;
1018  ArrayConstPtr array;
1019  channelArrayRequester->channelArrayConnect(status,channelArray,array);
1020  return channelArray;
1021  }
1022  PVFieldPtr pvField = pvFields[0];
1023  string fieldName("");
1024  while(true) {
1025  string name = pvField->getFieldName();
1026  if(fieldName.size()>0) fieldName += '.';
1027  fieldName += name;
1029  PVFieldPtrArray const & pvfs = pvs->getPVFields();
1030  if(pvfs.size()!=1) break;
1031  pvField = pvfs[0];
1032  }
1033  size_t indfield = fieldName.find_first_of("field.");
1034  if(indfield==0) {
1035  fieldName = fieldName.substr(6);
1036  }
1037  pvField = pvRecord->getPVRecordStructure()->getPVStructure()->getSubField(fieldName);
1038  if(!pvField) {
1039  Status status(
1040  Status::STATUSTYPE_ERROR,fieldName +" not found");
1041  ChannelArrayLocalPtr channelArray;
1042  ArrayConstPtr array;
1043  channelArrayRequester->channelArrayConnect(
1044  status,channelArray,array);
1045  return channelArray;
1046  }
1047  if(pvField->getField()->getType()!=scalarArray
1048  && pvField->getField()->getType()!=structureArray
1049  && pvField->getField()->getType()!=unionArray)
1050  {
1051  Status status(
1052  Status::STATUSTYPE_ERROR,fieldName +" not array");
1053  ChannelArrayLocalPtr channelArray;
1054  ArrayConstPtr array;
1055  channelArrayRequester->channelArrayConnect(
1056  status,channelArray,array);
1057  return channelArray;
1058  }
1059  PVArrayPtr pvArray = static_pointer_cast<PVArray>(pvField);
1060  PVArrayPtr pvCopy;
1061  if(pvField->getField()->getType()==scalarArray) {
1063  pvCopy = getPVDataCreate()->createPVScalarArray(
1064  xxx->getScalarArray()->getElementType());
1065  } else if(pvField->getField()->getType()==structureArray) {
1067  pvCopy = getPVDataCreate()->createPVStructureArray(
1068  xxx->getStructureArray()->getStructure());
1069  } else {
1071  pvCopy = getPVDataCreate()->createPVUnionArray(
1072  xxx->getUnionArray()->getUnion());
1073  }
1074  ChannelArrayLocalPtr array(new ChannelArrayLocal(
1075  channelLocal,
1076  channelArrayRequester,
1077  pvArray,
1078  pvCopy,
1079  pvRecord));
1080  if(pvRecord->getTraceLevel()>0)
1081  {
1082  cout << "ChannelArrayLocal::create";
1083  cout << " recordName " << pvRecord->getRecordName() << endl;
1084  }
1085  channelArrayRequester->channelArrayConnect(
1086  Status::Ok, array, pvCopy->getArray());
1087  return array;
1088 }
const PVFieldPtrArray & getPVFields() const
Definition: pvData.h:736
Data class for a unionArray.
Definition: pvData.h:1335
pvd::Status status
shared_ptr< T > static_pointer_cast(shared_ptr< U > const &r) BOOST_NOEXCEPT
Definition: shared_ptr.hpp:788
std::tr1::shared_ptr< const Array > ArrayConstPtr
Definition: pvIntrospect.h:154
std::tr1::shared_ptr< PVArray > PVArrayPtr
std::tr1::shared_ptr< PVStructureArray > PVStructureArrayPtr
Definition: pvData.h:100
Base class for a scalarArray.
Definition: pvData.h:618
std::tr1::shared_ptr< PVUnionArray > PVUnionArrayPtr
Definition: pvData.h:120
std::vector< PVFieldPtr > PVFieldPtrArray
Definition: pvData.h:70
Data interface for a structure,.
Definition: pvData.h:712
std::tr1::shared_ptr< ChannelArrayLocal > ChannelArrayLocalPtr
std::tr1::shared_ptr< PVStructure > PVStructurePtr
Definition: pvData.h:87
Data class for a structureArray.
Definition: pvData.h:1236
std::tr1::shared_ptr< PVField > PVFieldPtr
Definition: pvData.h:66
PVArray is the base class for all array types.
Definition: pvData.h:551
std::tr1::shared_ptr< PVScalarArray > PVScalarArrayPtr
Definition: pvData.h:82
FORCE_INLINE const PVDataCreatePtr & getPVDataCreate()
Definition: pvData.h:1648
virtual void epics::pvDatabase::ChannelArrayLocal::destroy ( )
inlinevirtual

Destroy this instance.

Implements epics::pvAccess::Destroyable.

Definition at line 961 of file channelLocal.cpp.

961 {} // DEPRECATED
void epics::pvDatabase::ChannelArrayLocal::getArray ( size_t  offset,
size_t  count,
size_t  stride 
)
virtual

get from the remote array.

Ownership of the PVArray previously passed to ChannelArrayRequester::getArrayDone() is returned to the ChannelArray from the ChannelArrayRequester.

Parameters
offsetThe offset in the remote array, i.e. the PVArray returned by ChannelArrayRequester::channelArrayConnect.
countThe number of elements to get, 0 means "till the end of an array".
stride1 means all the elements from offset to count, 2 means every other, 3 means every third, etc.

Implements epics::pvAccess::ChannelArray.

Definition at line 1114 of file channelLocal.cpp.

1115 {
1116  ChannelArrayRequester::shared_pointer requester = channelArrayRequester.lock();
1117  if(!requester) return;
1118  PVRecordPtr pvr(pvRecord.lock());
1119  if(!pvr) throw std::logic_error("pvRecord is deleted");
1120  if(pvr->getTraceLevel()>1)
1121  {
1122  cout << "ChannelArrayLocal::getArray" << endl;
1123  }
1124  const char *exceptionMessage = NULL;
1125  try {
1126  bool ok = false;
1127  epicsGuard <PVRecord> guard(*pvr);
1128  while(true) {
1129  size_t length = pvArray->getLength();
1130  if(length<=0) break;
1131  if(count<=0) {
1132  count = (length -offset + stride -1)/stride;
1133  if(count>0) ok = true;
1134  break;
1135  }
1136  size_t maxcount = (length -offset + stride -1)/stride;
1137  if(count>maxcount) count = maxcount;
1138  ok = true;
1139  break;
1140  }
1141  if(ok) {
1142  pvCopy->setLength(count);
1143  copy(pvArray,offset,stride,pvCopy,0,1,count);
1144  }
1145  } catch(std::exception& e) {
1146  exceptionMessage = e.what();
1147  }
1148  Status status = Status::Ok;
1149  if(exceptionMessage!=NULL) {
1150  status = Status(Status::STATUSTYPE_ERROR,exceptionMessage);
1151  }
1152  requester->getArrayDone(status,getPtrSelf(),pvCopy);
1153 }
pvd::Status status
#define NULL
Definition: catime.c:38
void copy(PVValueArray< T > &pvFrom, size_t fromOffset, size_t fromStride, PVValueArray< T > &pvTo, size_t toOffset, size_t toStride, size_t count)
Copy a subarray from one scalar array to another.
const ChannelProcessRequester::weak_pointer requester
Definition: pvAccess.cpp:68
std::tr1::shared_ptr< PVRecord > PVRecordPtr
Definition: pvDatabase.h:21
std::tr1::shared_ptr< Channel > epics::pvDatabase::ChannelArrayLocal::getChannel ( )
virtual

Get a channel instance this request belongs to.

Returns
the channel instance.

Implements epics::pvAccess::ChannelRequest.

Definition at line 1095 of file channelLocal.cpp.

1096 {
1097  ChannelLocalPtr channel(channelLocal.lock());
1098  return channel;
1099 }
std::tr1::shared_ptr< ChannelLocal > ChannelLocalPtr
void epics::pvDatabase::ChannelArrayLocal::getLength ( )
virtual

Get the length.

Implements epics::pvAccess::ChannelArray.

Definition at line 1182 of file channelLocal.cpp.

1183 {
1184  ChannelArrayRequester::shared_pointer requester = channelArrayRequester.lock();
1185  if(!requester) return;
1186  PVRecordPtr pvr(pvRecord.lock());
1187  if(!pvr) throw std::logic_error("pvRecord is deleted");
1188  size_t length = 0;
1189  const char *exceptionMessage = NULL;
1190  try {
1191  epicsGuard <PVRecord> guard(*pvr);
1192  length = pvArray->getLength();
1193  } catch(std::exception& e) {
1194  exceptionMessage = e.what();
1195  }
1196  Status status = Status::Ok;
1197  if(exceptionMessage!=NULL) {
1198  status = Status(Status::STATUSTYPE_ERROR,exceptionMessage);
1199  }
1200  requester->getLengthDone(status,getPtrSelf(),length);
1201 }
pvd::Status status
#define NULL
Definition: catime.c:38
const ChannelProcessRequester::weak_pointer requester
Definition: pvAccess.cpp:68
std::tr1::shared_ptr< PVRecord > PVRecordPtr
Definition: pvDatabase.h:21
virtual void epics::pvDatabase::ChannelArrayLocal::lastRequest ( )
inlinevirtual

Announce next request as last request. When last request will be completed (regardless of completion status) the remote and local instance will be destroyed.

Implements epics::pvAccess::ChannelRequest.

Definition at line 977 of file channelLocal.cpp.

977 {}
void epics::pvDatabase::ChannelArrayLocal::lock ( )
virtual

Reimplemented from epics::pvAccess::Lockable.

Definition at line 1101 of file channelLocal.cpp.

1102 {
1103  PVRecordPtr pvr(pvRecord.lock());
1104  if(!pvr) throw std::logic_error("pvRecord is deleted");
1105  pvr->lock();
1106 }
std::tr1::shared_ptr< PVRecord > PVRecordPtr
Definition: pvDatabase.h:21
epics::pvDatabase::ChannelArrayLocal::POINTER_DEFINITIONS ( ChannelArrayLocal  )
void epics::pvDatabase::ChannelArrayLocal::putArray ( PVArrayPtr const &  putArray,
size_t  offset,
size_t  count,
size_t  stride 
)
virtual

Definition at line 1155 of file channelLocal.cpp.

1157 {
1158  ChannelArrayRequester::shared_pointer requester = channelArrayRequester.lock();
1159  if(!requester) return;
1160  PVRecordPtr pvr(pvRecord.lock());
1161  if(!pvr) throw std::logic_error("pvRecord is deleted");
1162  if(pvr->getTraceLevel()>1)
1163  {
1164  cout << "ChannelArrayLocal::putArray" << endl;
1165  }
1166  size_t newLength = offset + count*stride;
1167  if(newLength<pvArray->getLength()) pvArray->setLength(newLength);
1168  const char *exceptionMessage = NULL;
1169  try {
1170  epicsGuard <PVRecord> guard(*pvr);
1171  copy(pvArray,0,1,this->pvArray,offset,stride,count);
1172  } catch(std::exception& e) {
1173  exceptionMessage = e.what();
1174  }
1175  Status status = Status::Ok;
1176  if(exceptionMessage!=NULL) {
1177  status = Status(Status::STATUSTYPE_ERROR,exceptionMessage);
1178  }
1179  requester->putArrayDone(status,getPtrSelf());
1180 }
pvd::Status status
#define NULL
Definition: catime.c:38
void copy(PVValueArray< T > &pvFrom, size_t fromOffset, size_t fromStride, PVValueArray< T > &pvTo, size_t toOffset, size_t toStride, size_t count)
Copy a subarray from one scalar array to another.
const ChannelProcessRequester::weak_pointer requester
Definition: pvAccess.cpp:68
std::tr1::shared_ptr< PVRecord > PVRecordPtr
Definition: pvDatabase.h:21
void epics::pvDatabase::ChannelArrayLocal::setLength ( size_t  length)
virtual

Set the length and/or the capacity.

Parameters
lengthThe new length.

Implements epics::pvAccess::ChannelArray.

Definition at line 1203 of file channelLocal.cpp.

1204 {
1205  ChannelArrayRequester::shared_pointer requester = channelArrayRequester.lock();
1206  if(!requester) return;
1207  PVRecordPtr pvr(pvRecord.lock());
1208  if(!pvr) throw std::logic_error("pvRecord is deleted");
1209  if(pvr->getTraceLevel()>1)
1210  {
1211  cout << "ChannelArrayLocal::setLength" << endl;
1212  }
1213  try {
1214  {
1215  epicsGuard <PVRecord> guard(*pvr);
1216  if(pvArray->getLength()!=length) pvArray->setLength(length);
1217  }
1218  requester->setLengthDone(Status::Ok,getPtrSelf());
1219  } catch(std::exception& e) {
1220  string exceptionMessage = e.what();
1221  Status status = Status(Status::STATUSTYPE_ERROR,exceptionMessage);
1222  requester->setLengthDone(status,getPtrSelf());
1223  }
1224 }
pvd::Status status
const ChannelProcessRequester::weak_pointer requester
Definition: pvAccess.cpp:68
std::tr1::shared_ptr< PVRecord > PVRecordPtr
Definition: pvDatabase.h:21
void epics::pvDatabase::ChannelArrayLocal::unlock ( )
virtual

Reimplemented from epics::pvAccess::Lockable.

Definition at line 1107 of file channelLocal.cpp.

1108 {
1109  PVRecordPtr pvr(pvRecord.lock());
1110  if(!pvr) throw std::logic_error("pvRecord is deleted");
1111  pvr->unlock();
1112 }
std::tr1::shared_ptr< PVRecord > PVRecordPtr
Definition: pvDatabase.h:21

The documentation for this class was generated from the following file: