Difference between revisions of "V4 View Generated Code"

From EPICSWIKI
(First attempt, based on old DataAccess interfaces)
 
 
Line 16: Line 16:
  }
  }


This very simple record type defines a single value view with 5 properties, of which 4 are subordinate to the main value property. The following code would be generated from the above DBD definition to implement the view as a property catalog for use by the Data Access interface to the CA Server:
This very simple record type defines a single value view with 5 properties, of which 4 are subordinate to the main value property. The following code would be generated from the above DBD definition to implement the view as a property catalog for use by the Data Access interface to the CA Server. I am using a simplified form of the old Data Access interface because of a lack of documentation on the new version.


  class rdouble_view_value_value : public propertyCatalog {
  class rdouble_view_value_value : public propertyCatalog {
  public:
  public:
     rdouble_view_value_value(rdoubleRecord &record);
     rdouble_view_value_value(rdoubleRecord &);
     void traverse(dataViewer &);
     void traverse(dataViewer &);
    void find(const propertyId &, dataViewer &);
     // this isn't exactly Jeff's interface, but it shows the idea
     // this isn't exactly Jeff's interface, but it shows the idea
  private:
  private:
Line 35: Line 36:
     v.reveal(pidAlarmSeverity, r.alarmSeverity);
     v.reveal(pidAlarmSeverity, r.alarmSeverity);
     v.reveal(pidAlarmStatus, r.alarmStatus);
     v.reveal(pidAlarmStatus, r.alarmStatus);
}
void rdouble_cat_value_value::find(const propertyId & p, dataViewer & v) {
    if (p == pidUnits)
        v.reveal(pidUnits, r.units);
    else if (p == pidTimestamp)
        v.reveal(pidTimestamp, r.timestamp);
    else if (p == pidAlarmSeverity)
        v.reveal(pidAlarmSeverity, r.alarmSeverity);
    else if (p == pidAlarmStatus)
        v.reveal(pidAlarmStatus, r.alarmStatus);
    else
        // ... ?
  }
  }


Line 41: Line 55:
     rdouble_view_value(rdoubleRecord &record);
     rdouble_view_value(rdoubleRecord &record);
     void traverse(dataViewer &);
     void traverse(dataViewer &);
    void find(const propertyId &, dataViewer &);
     // this isn't exactly Jeff's interface, but it shows the idea
     // this isn't exactly Jeff's interface, but it shows the idea
  private:
  private:
Line 52: Line 67:
  void rdouble_cat_value::traverse(dataViewer & v) {
  void rdouble_cat_value::traverse(dataViewer & v) {
     v.reveal(pidValue, r.value, view_value_value);
     v.reveal(pidValue, r.value, view_value_value);
}
void rdouble_cat_value_value::find(const propertyId & p, dataViewer & v) {
    if (p == pidValue)
        v.reveal(pidValue, r.value, view_value_value);
    else
        // ... ?
  }
  }

Latest revision as of 14:17, 13 July 2005

This page shows the code that will be generated from a Record View.

Each view maps to a separate property catalog that gives access to a particular set of fields of the record as a hierarchy. Taking as a simple example the following record definition:

record(rdouble) extends iocRecord {
    field(value, float64)
    field(units, string)
    view(value) {
        property(value, value) {
            property(units, units)
            property(timestamp, timeStamp)
            property(alarmSeverity, alarmSeverity)
            property(alarmStatus, alarmStatus)
        }
    }
}

This very simple record type defines a single value view with 5 properties, of which 4 are subordinate to the main value property. The following code would be generated from the above DBD definition to implement the view as a property catalog for use by the Data Access interface to the CA Server. I am using a simplified form of the old Data Access interface because of a lack of documentation on the new version.

class rdouble_view_value_value : public propertyCatalog {
public:
    rdouble_view_value_value(rdoubleRecord &);
    void traverse(dataViewer &);
    void find(const propertyId &, dataViewer &);
    // this isn't exactly Jeff's interface, but it shows the idea
private:
    rdoubleRecord &r;
};
rdouble_view_value_value::rdouble_view_value_value(rdoubleRecord &r_in)
    : r(r_in) {}
void rdouble_cat_value_value::traverse(dataViewer & v) {
    v.reveal(pidUnits, r.units);
    v.reveal(pidTimestamp, r.timestamp);
    v.reveal(pidAlarmSeverity, r.alarmSeverity);
    v.reveal(pidAlarmStatus, r.alarmStatus);
}
void rdouble_cat_value_value::find(const propertyId & p, dataViewer & v) {
    if (p == pidUnits)
        v.reveal(pidUnits, r.units);
    else if (p == pidTimestamp)
        v.reveal(pidTimestamp, r.timestamp);
    else if (p == pidAlarmSeverity)
        v.reveal(pidAlarmSeverity, r.alarmSeverity);
    else if (p == pidAlarmStatus)
        v.reveal(pidAlarmStatus, r.alarmStatus);
    else
        // ... ?
}
class rdouble_view_value : public propertyCatalog {
public:
    rdouble_view_value(rdoubleRecord &record);
    void traverse(dataViewer &);
    void find(const propertyId &, dataViewer &);
    // this isn't exactly Jeff's interface, but it shows the idea
private:
    rdoubleRecord &r;
    rdouble_view_value_value view_value_value;
};
rdouble_view_value::rdouble_view_value(rdoubleRecord &r_in)
    : r(r_in), view_value_value(r_in) {}
void rdouble_cat_value::traverse(dataViewer & v) {
    v.reveal(pidValue, r.value, view_value_value);
}
void rdouble_cat_value_value::find(const propertyId & p, dataViewer & v) {
    if (p == pidValue)
        v.reveal(pidValue, r.value, view_value_value);
    else
        // ... ?
}