예제 #1
0
bool wb_session::clone(const char* vname, pwr_tVid vid, wb_vrepmem** vmem)
{
  wb_vrepmem* mem;

  m_sts = LDH__SUCCESS;
  int cnt = 0;
  for (wb_object o = object(); ODD(o.sts()); o = o.after())
    cnt++;

  pwr_tAttrRef* arp = (pwr_tAttrRef*)calloc(cnt + 1, sizeof(*arp));

  cnt = 0;
  for (wb_object o = object(); ODD(o.sts()); o = o.after()) {
    arp[cnt++] = cdh_ObjidToAref(o.oid());
  }
  copyOset(arp, true, true, false, vid, vname, &mem);

  pwr_tOid voloid;
  voloid.oix = 0;
  voloid.vid = m_vrep->vid();

  wb_object vo = object(voloid);

  mem->createClonedVolumeObject(vo, vname);
  *vmem = mem;

  return true;
}
예제 #2
0
/*----------------------------------------------------------------------------*\
  Check if class is an IO-type.
\*----------------------------------------------------------------------------*/
int io_CheckClassIoType( 
  io_eType	type,
  pwr_tCid 	cid
)
{
  pwr_tStatus 	sts;
  pwr_sClassDef cdef;
  pwr_sAttrRef aref;

  aref = cdh_ObjidToAref( cdh_ClassIdToObjid( cid));
  sts = gdh_GetObjectInfoAttrref( &aref, &cdef, sizeof(cdef));
  if ( EVEN(sts)) return 0;

  switch ( type) {
  case io_eType_Agent:
    if ( cdef.Flags.b.IOAgent)
      return 1;
    break;
  case io_eType_Rack:
    if ( cdef.Flags.b.IORack)
      return 1;
    break;
  case io_eType_Card:
    if ( cdef.Flags.b.IOCard)
      return 1;
    break;
  default: ;
  }
  return 0;
}
예제 #3
0
pwr_tStatus EvEve::set_view(pwr_tOid view)
{
  pwr_tStatus sts;

  sts = ala->set_view( view);
  if ( ODD(sts)) {
    pwr_tString80 name;

    if ( cdh_ObjidIsNull( view)) {
      strcpy( name, "Event List");
    }
    else {
      pwr_tAttrRef name_ar, ar;

      ar = cdh_ObjidToAref( view);
      sts = gdh_ArefANameToAref( &ar, "Name", &name_ar);
      if (EVEN(sts)) return sts;

      sts = gdh_GetObjectInfoAttrref( &name_ar, name, sizeof(name));
      if (EVEN(sts)) return sts;
    }
    set_title_ala( name);
  }
  return sts;
}
예제 #4
0
JNIEXPORT jobject JNICALL Java_jpwr_rt_RtSecurity_checkUser
  (JNIEnv *env , jclass object, jstring jsystemgroup, jstring juser, 
	jstring jpassword)
{
  int sts;
  const char *systemgroup;
  char *csystemgroup;
  const char *user;
  char *cuser;
  const char *password;
  char *cpassword;
  jclass cdhrInt_id;
  jmethodID cdhrInt_cid;
  jobject return_obj;
  unsigned int priv;
  jint jsts;
  jint jpriv;
  pwr_tObjid	oid;
  pwr_sSecurity	sec;	
  pwr_tAttrRef aref;

  cdhrInt_id = (*env)->FindClass( env, "jpwr/rt/CdhrInt");
  cdhrInt_cid = (*env)->GetMethodID( env, cdhrInt_id,
    	"<init>", "(II)V");

  systemgroup = (*env)->GetStringUTFChars( env, jsystemgroup, 0);
  csystemgroup = (char *)systemgroup;
  user = (*env)->GetStringUTFChars( env, juser, 0);
  cuser = (char *)user;
  password = (*env)->GetStringUTFChars( env, jpassword, 0);
  cpassword = (char *)password;

  sts = gdh_GetClassList ( pwr_eClass_Security, &oid);
  if (ODD(sts)) {
    aref = cdh_ObjidToAref( oid);
    sts = gdh_GetObjectInfoAttrref( &aref, &sec, sizeof(sec));
    if ( ODD(sts)){
      sts = user_CheckUser( sec.WebSystemGroup, cuser, cpassword, &priv);
    }
  }
  (*env)->ReleaseStringUTFChars( env, jsystemgroup, csystemgroup);
  (*env)->ReleaseStringUTFChars( env, juser, cuser);
  (*env)->ReleaseStringUTFChars( env, jpassword, cpassword);

  jsts = (jint) sts;
  if ( sts % 2 == 0)
    priv = pwr_mPrv_RtRead;
  jpriv = priv;
  return_obj = (*env)->NewObject( env, cdhrInt_id,
  	cdhrInt_cid, jpriv, jsts);
  return return_obj; 
}
예제 #5
0
/*----------------------------------------------------------------------------*\
  Find classes belonging to an specific IO-type.
\*----------------------------------------------------------------------------*/
pwr_tStatus io_GetIoTypeClasses( 
  io_eType	type,
  pwr_tClassId 	**classes,
  int		*size
)
{
  pwr_tStatus 	sts;
  pwr_sClassDef cdef;
  pwr_tOid	oid;
  int		add_class;
  pwr_sAttrRef  aref;

  *size = 0;
  *classes = calloc( IO_CLASSES_SIZE, sizeof(pwr_tCid));

  for ( sts = gdh_GetClassList( pwr_eClass_ClassDef, &oid);
	ODD(sts);
	sts = gdh_GetNextObject( oid, &oid)) {
    
    aref = cdh_ObjidToAref( oid);
    sts = gdh_GetObjectInfoAttrref( &aref, &cdef, sizeof(cdef));
    if ( EVEN(sts)) return sts;

    add_class = 0;
    switch ( type) {
    case io_eType_Agent:
      if ( cdef.Flags.b.IOAgent)
	add_class = 1;
      break;
    case io_eType_Rack:
      if ( cdef.Flags.b.IORack)
	add_class = 1;
      break;
    case io_eType_Card:
      if ( cdef.Flags.b.IOCard)
	add_class = 1;
      break;
    default:
      return IO__NOMETHOD;
    }

    if ( add_class) {
      if ( *size >= IO_CLASSES_SIZE)
	return IO__CLASSEXCEED;

      (*classes)[ *size] = cdh_ClassObjidToId( oid);
      (*size)++;
    }
  }
  return IO__SUCCESS;
}
예제 #6
0
void rt_sysmon::open()
{
  pwr_tStatus sts;
  pwr_sAttrRef aref;
  pwr_tObjid oid;

  // Open server configuration object SysMonConfig
  sts = gdh_GetClassList( pwr_cClass_SysMonConfig, &oid);
  if ( ODD(sts)) {
    aref = cdh_ObjidToAref( oid);
    sts = gdh_DLRefObjectInfoAttrref( &aref, (void **)&conf, &conf_dlid); 
    if ( EVEN(sts)) throw co_error(sts);
  }

  if ( ODD(sts)) {
    scan_time = 1.0 / conf->ScanTime;
  }
  else {
    scan_time = 1;
    errh_Info( "No sysmon configuration, using base frequency 1 Hz");
    oid = pwr_cNObjid;
    conf = 0;
  }

  aproc_RegisterObject( oid);

  // Open DiskSup objects
  for ( sts = gdh_GetClassListAttrRef( pwr_cClass_DiskSup, &aref);
	ODD(sts);
	sts = gdh_GetNextAttrRef( pwr_cClass_DiskSup, &aref, &aref)) {
    disksup_object *o = new disksup_object( &aref);
    objects.push_back( o);
    try {
      o->open( scan_time);
      if ( conf)
	conf->DiskSupObjects[sysmon_cnt] = aref.Objid;
      sysmon_cnt++;
    }    
    catch ( co_error& e) {
      delete o;
      objects.pop_back();
      errh_Error( "DiskSup configuration error: &s", (char *)e.what().c_str());
    }
  }
}
예제 #7
0
void
wb_dbs::classInsert(sOentry *oep)
{
  pwr_tStatus  sts;
  sCentry     *cep;
  pwr_sAttrRef aref = cdh_ObjidToAref( oep->o.oid);

  cidInsert(&sts, oep->o.cid, &aref, &cep);
  if (sts == TREE__INSERTED) {
    /* was inserted now */

    cep->o_lh = cep->o_lt = oep;
  } else {
    /* was allready present */
    if ( !cep->o_lt)
      cep->o_lh = cep->o_lt = oep;
    else {
      cep->o_lt->o_ll = oep;
      cep->o_lt = oep;
    }
  }    
}
예제 #8
0
static pwr_tStatus OpenTemplate (
  ldh_sMenuCall *ip
) {
  pwr_tStatus sts;
  pwr_tOName Name;
  pwr_tObjid Template;  
  pwr_sAttrRef Aref;
  int size;

  sts = ldh_ObjidToName(ip->PointedSession, ip->Pointed.Objid, 
    ldh_eName_Default, Name, sizeof(Name), &size); 
  if (EVEN(sts))
    return sts;

  strncat(Name, "-Template", sizeof(Name));
  sts = ldh_NameToObjid(ip->PointedSession, &Template, Name); 
  if (EVEN(sts))
    return sts;
  
  Aref = cdh_ObjidToAref( Template);
  ip->wtt->watt_new( Aref);

  return sts;
}
예제 #9
0
/*----------------------------------------------------------------------------*\
  
\*----------------------------------------------------------------------------*/
static pwr_tStatus IoCardRead (
  io_tCtx	ctx,
  io_sAgent	*ap,
  io_sRack	*rp,
  io_sCard	*cp  
) 
{
  io_sLocal 		*local;
  io_sRackLocal		*r_local = (io_sRackLocal *)(rp->Local);
  pwr_tUInt16		data = 0;
  pwr_sClass_Ssab_BaseDiCard	*op;
  pwr_sClass_Ssab_RemoteRack	*rrp;
  pwr_tUInt16		invmask;
  pwr_tUInt16		convmask;
  int			i;
  int			sts;
  qbus_io_read 		rb;
  int			bfb_error = 0;

  local = (io_sLocal *) cp->Local;
  op = (pwr_sClass_Ssab_BaseDiCard *) cp->op;

  for ( i = 0; i < 2; i++)
  { 
    if ( i == 0)
    {
      convmask = op->ConvMask1;
      invmask = op->InvMask1;
    }
    else
    {
      convmask = op->ConvMask2;
      invmask = op->InvMask2;
      if ( !convmask)
        break;
      if ( op->MaxNoOfChannels == 16)
        break;
    }

    if (r_local->Qbus_fp != 0 && r_local->s == 0) {
      /* Read from local Q-bus */
      rb.Address = local->Address[i];
      sts = read( local->Qbus_fp, &rb, sizeof(rb));
      data = (unsigned short) rb.Data;
    }
    else {
      /* Ethernet I/O, Get data from current address */
      data = bfbeth_get_data(r_local, (pwr_tUInt16) local->Address[i], &sts);
      /* Yes, we want to read this address the next time aswell */
      bfbeth_set_read_req(r_local, (pwr_tUInt16) local->Address[i]);

      if (sts == -1) {
	/* Error handling for ethernet Qbus-I/O */
  	rrp = (pwr_sClass_Ssab_RemoteRack *) rp->op;
	if (bfb_error == 0) {
          op->ErrorCount++;
	  bfb_error = 1;
          if ( op->ErrorCount == op->ErrorSoftLimit) {
            errh_Error( "IO Error soft limit reached on card '%s'", cp->Name);
	    ctx->IOHandler->CardErrorSoftLimit = 1;
	    ctx->IOHandler->ErrorSoftLimitObject = cdh_ObjidToAref( cp->Objid);
	  }
          if ( op->ErrorCount == op->ErrorHardLimit) {
            errh_Error( "IO Error hard limit reached on card '%s', stall action %d", cp->Name, rrp->StallAction);
	    ctx->IOHandler->CardErrorHardLimit = 1;
	    ctx->IOHandler->ErrorHardLimitObject = cdh_ObjidToAref( cp->Objid);
	  }
          if ( op->ErrorCount >= op->ErrorHardLimit && rrp->StallAction == pwr_eSsabStallAction_ResetInputs )
	  {
	    data = 0;
	    sts = 1;
          }
          if ( op->ErrorCount >= op->ErrorHardLimit && rrp->StallAction == pwr_eSsabStallAction_EmergencyBreak )
	  {
            ctx->Node->EmergBreakTrue = 1;
            return IO__ERRDEVICE;
          }
	}
	if (sts == -1) continue;
      }
      else {
	op->ErrorCount = 0;
      }
    }
    
    if ( sts == -1)
    /* Error handling for local Qbus-I/O */
    {
      /* Increase error count and check error limits */
      op->ErrorCount++;

      if ( op->ErrorCount == op->ErrorSoftLimit) {
        errh_Error( "IO Error soft limit reached on card '%s'", cp->Name);
	ctx->IOHandler->CardErrorSoftLimit = 1;
	ctx->IOHandler->ErrorSoftLimitObject = cdh_ObjidToAref( cp->Objid);
      }
      if ( op->ErrorCount >= op->ErrorHardLimit)
      {
        errh_Error( "IO Error hard limit reached on card '%s', IO stopped", cp->Name);
        ctx->Node->EmergBreakTrue = 1;
	ctx->IOHandler->CardErrorHardLimit = 1;
	ctx->IOHandler->ErrorHardLimitObject = cdh_ObjidToAref( cp->Objid);
        return IO__ERRDEVICE;
      }
      continue;
    }

    /* Invert */
    data = data ^ invmask;

    /* Filter ... */
    if ( local->Filter[i].Found)
      io_DiFilter( local->Filter[i].sop, &data, local->Filter[i].Data);

    /* Move data to valuebase */
    io_DiUnpackWord( cp, data, convmask, i);
  }

  /* Fix for qbus errors */
  local->ErrScanCnt++;
  if ( local->ErrScanCnt >= local->ErrReset) {
    local->ErrScanCnt = 0;
    if ( op->ErrorCount > op->ErrorSoftLimit)
      op->ErrorCount--;
  }

  return 1;
}
예제 #10
0
static pwr_tStatus IoCardRead( io_tCtx ctx,
                               io_sAgent *ap,
                               io_sRack	*rp,
                               io_sCard	*cp)
{
    io_sLocalAiDevice *local = (io_sLocalAiDevice *)cp->Local;
    pwr_sClass_OneWire_AiDevice *op = (pwr_sClass_OneWire_AiDevice *)cp->op;
    char str[256];
    char *s;
    pwr_tUInt32 error_count = op->Super.ErrorCount;

    if ( op->ScanInterval > 1) {
        if ( local->interval_cnt != 0) {
            local->interval_cnt++;
            if ( local->interval_cnt >= op->ScanInterval)
                local->interval_cnt = 0;
            return IO__SUCCESS;
        }
        local->interval_cnt++;
    }

    if ( cp->chanlist[0].cop && cp->chanlist[0].sop) {
        io_sChannel *chanp = &cp->chanlist[0];
        pwr_sClass_ChanAi *cop = (pwr_sClass_ChanAi *)chanp->cop;
        pwr_sClass_Ai *sop = (pwr_sClass_Ai *)chanp->sop;
        pwr_tFloat32 actvalue;

        if ( cop->CalculateNewCoef)
            // Request to calculate new coefficients
            io_AiRangeToCoef( chanp);

        fflush( local->value_fp);
        fgets( str, sizeof(str), local->value_fp);
        fgets( str, sizeof(str), local->value_fp);
        rewind( local->value_fp);

        if ( strcmp( op->ValueSearchString, "") == 0)
            s = str;
        else
            s = strstr( str, op->ValueSearchString);
        if ( s) {
            switch ( op->ChAi.Representation) {

            case pwr_eDataRepEnum_Float32:
            case pwr_eDataRepEnum_Float64: {
                pwr_tFloat32 fvalue;

                sscanf( s+strlen(op->ValueSearchString), "%f", &fvalue);

                if ( op->ErrorValue != 0 && fabs( op->ErrorValue - fvalue) > FLT_EPSILON ) {
                    /* TODO Check CRC Probably power loss...
                       op->Super.ErrorCount++; */
                }

                actvalue = cop->SensorPolyCoef0 + cop->SensorPolyCoef1 * fvalue;

                // Filter
                if ( sop->FilterType == 1 &&
                        sop->FilterAttribute[0] > 0 &&
                        sop->FilterAttribute[0] > ctx->ScanTime) {
                    actvalue = *(pwr_tFloat32 *)chanp->vbp + ctx->ScanTime / sop->FilterAttribute[0] *
                               (actvalue - *(pwr_tFloat32 *)chanp->vbp);
                }

                *(pwr_tFloat32 *)chanp->vbp = actvalue;
                sop->SigValue = cop->SigValPolyCoef1 * fvalue + cop->SigValPolyCoef0;
                sop->RawValue = fvalue;
                op->Status = IO__SUCCESS;
                break;
            }
            default: {
                pwr_tInt32 ivalue;

                sscanf( s+strlen(op->ValueSearchString), "%d", &ivalue);

                io_ConvertAi32( cop, ivalue, &actvalue);

                if ( op->ErrorValue != 0 && fabs( op->ErrorValue - ivalue) > FLT_EPSILON ) {
                    /* TODO Check CRC Probably power loss...
                       op->Super.ErrorCount++; */
                }

                // Filter
                if ( sop->FilterType == 1 &&
                        sop->FilterAttribute[0] > 0 &&
                        sop->FilterAttribute[0] > ctx->ScanTime) {
                    actvalue = *(pwr_tFloat32 *)chanp->vbp + ctx->ScanTime / sop->FilterAttribute[0] *
                               (actvalue - *(pwr_tFloat32 *)chanp->vbp);
                }

                *(pwr_tFloat32 *)chanp->vbp = actvalue;
                sop->SigValue = cop->SigValPolyCoef1 * ivalue + cop->SigValPolyCoef0;
                sop->RawValue = ivalue;
                op->Status = IO__SUCCESS;
            }
            }
        }
        else {
            op->Super.ErrorCount++;
            op->Status = IO__SEARCHSTRING;
        }
    }

    if ( op->Super.ErrorCount >= op->Super.ErrorSoftLimit &&
            error_count < op->Super.ErrorSoftLimit) {
        errh_Warning( "IO Card ErrorSoftLimit reached, '%s'", cp->Name);
        ctx->IOHandler->CardErrorSoftLimit = 1;
        ctx->IOHandler->ErrorSoftLimitObject = cdh_ObjidToAref( cp->Objid);
    }
    if ( op->Super.ErrorCount >= op->Super.ErrorHardLimit) {
        errh_Error( "IO Card ErrorHardLimit reached '%s', IO stopped", cp->Name);
        ctx->Node->EmergBreakTrue = 1;
        op->Status = IO__ERRDEVICE;
        ctx->IOHandler->CardErrorHardLimit = 1;
        ctx->IOHandler->ErrorHardLimitObject = cdh_ObjidToAref( cp->Objid);
        return IO__ERRDEVICE;
    }

    return IO__SUCCESS;
}
예제 #11
0
pwr_tStatus sev_db::tree_update()
{
  int new_item = 0;
  int num;
  pwr_tAName hname;
  pwr_tStatus sts;
  pwr_tOid oid;
  pwr_tCid cid = 0;
  char* s;
  pwr_sClass_SevItem ritem;
  char oname_array[20][pwr_cSizObjName + 1];
  pwr_tObjName itemname;
  char root[] = "pwrNode-sev";

  // Check root object
  sts = gdh_NameToObjid(root, &oid);
  if (EVEN(sts)) {
    sts = gdh_CreateObject(
        root, pwr_eClass_NodeHier, 0, &oid, pwr_cNObjid, 0, pwr_cNObjid);
    if (EVEN(sts))
      return sts;
  }

  for (unsigned int i = 0; i < m_items.size(); i++) {
    if (m_items[i].deleted)
      continue;

    printf("Tree update item %s\n", m_items[i].oname);
    switch (m_items[i].attr[0].type) {
    case pwr_eType_Float32:
    case pwr_eType_Float64:
    case pwr_eType_Int8:
    case pwr_eType_Int16:
    case pwr_eType_Int32:
    case pwr_eType_Int64:
    case pwr_eType_UInt8:
    case pwr_eType_UInt16:
    case pwr_eType_UInt32:
    case pwr_eType_UInt64:
    case pwr_eType_Boolean:
      break;
    default:
      continue;
    }

    new_item = 0;

    if ((s = strchr(m_items[i].oname, ':')))
      s++;
    else
      s = m_items[i].oname;

    num = dcli_parse(s, "-", "", (char*)oname_array,
        sizeof(oname_array) / sizeof(oname_array[0]), sizeof(oname_array[0]),
        0);

    strcpy(hname, root);
    for (int j = 0; j < num; j++) {
      strcat(hname, "-");
      strcat(hname, oname_array[j]);

      if (!new_item)
        sts = gdh_NameToObjid(hname, &oid);
      if (new_item || EVEN(sts)) {
        // Create object
        sts = gdh_CreateObject(
            hname, pwr_eClass_NodeHier, 0, &oid, pwr_cNObjid, 0, pwr_cNObjid);
        if (EVEN(sts))
          return sts;

        new_item = 1;
      }
    }
    sprintf(itemname, "%sItem", m_items[i].attrnum > 1 ? "O" : "");
    strcat(hname, "-");
    strcat(hname, itemname);
    if (!new_item)
      sts = gdh_NameToObjid(hname, &oid);
    if (new_item || EVEN(sts)) {
      switch (m_items[i].attr[0].type) {
      case pwr_eType_Float32:
      case pwr_eType_Float64:
        cid = pwr_cClass_SevItemFloat;
        break;
      case pwr_eType_Int8:
      case pwr_eType_Int16:
      case pwr_eType_Int32:
      case pwr_eType_Int64:
      case pwr_eType_UInt8:
      case pwr_eType_UInt16:
      case pwr_eType_UInt32:
      case pwr_eType_UInt64:
        cid = pwr_cClass_SevItemInt;
        break;
      case pwr_eType_Boolean:
        cid = pwr_cClass_SevItemBoolean;
        break;
      default:;
      }
      sts = gdh_CreateObject(hname, cid, 0, &oid, pwr_cNObjid, 0, pwr_cNObjid);
      if (EVEN(sts))
        return sts;

      memset(&ritem, 0, sizeof(ritem));
      strncpy(ritem.TableName, m_items[i].tablename, sizeof(ritem.TableName));
      strncpy(ritem.ObjectName, m_items[i].oname, sizeof(ritem.ObjectName));
      strncpy(ritem.Attr, m_items[i].attr[0].aname, sizeof(ritem.Attr));
      ritem.AttrType = m_items[i].attr[0].type;
      ritem.NoOfAttr = m_items[i].attrnum;
      ritem.Oid = m_items[i].oid;
      ritem.Id = m_items[i].id;
      ritem.Options = m_items[i].options;
      ritem.Deadband = m_items[i].deadband;
      ritem.ScanTime = m_items[i].scantime;
      ritem.StorageTime = m_items[i].storagetime;
      strncpy(
          ritem.Description, m_items[i].description, sizeof(ritem.Description));

      sts = gdh_SetObjectInfo(hname, &ritem, sizeof(ritem));
      if (EVEN(sts))
        return sts;
    }

    if (!m_items[i].ip) {
      // Get pointer to object
      pwr_tAttrRef aref = cdh_ObjidToAref(oid);
      sts = gdh_DLRefObjectInfoAttrref(
          &aref, (void**)&m_items[i].ip, &m_items[i].refid);
      if (EVEN(sts))
        return sts;
    }
  }
  return SEV__SUCCESS;
}
예제 #12
0
void wb_crrgen::load(pwr_tStatus* rsts, int sim, int graph)
{
  pwr_tStatus sts;

  for (int i = 0; i < int(sizeof(reflist) / sizeof(reflist[0])); i++) {
    if (!sim && reflist[i].table == crrgen_eTable_SimSignal)
      continue;

    for (wb_object o = m_sp->object(reflist[i].cid); o; o = o.next()) {
      pwr_tAttrRef aref;

      // Skip if in LibHier
      bool in_libhier = false;
      for (wb_object p = o.parent(); p; p = p.parent()) {
        if (p.cid() == pwr_eClass_LibHier) {
          in_libhier = true;
          break;
        }
      }
      if (in_libhier)
        continue;

      wb_attribute a
          = m_sp->attribute(o.oid(), reflist[i].body, reflist[i].attr);

      if (reflist[i].is_oid) {
        // Objid reference
        pwr_tOid oid;
        a.value(&oid);
        aref = cdh_ObjidToAref(oid);
      } else
        // AttrRef reference
        a.value(&aref);

      if (cdh_ObjidIsNotNull(aref.Objid)) {
        sCrrKey key;

        wb_utl::utl_replace_symbol((ldh_tSesContext)m_sp, o.oid(), &aref);

        key.target = aref;
        key.reference = cdh_ObjidToAref(o.oid());
        key.type = reflist[i].type;
        switch (reflist[i].table) {
        case crrgen_eTable_Signal:
        case crrgen_eTable_SimSignal:
          tree_Insert(&sts, m_signal_th, &key);
          break;
        case crrgen_eTable_Object:
          tree_Insert(&sts, m_object_th, &key);
          break;
        default:;
        }
      }
    }
  }

  if (graph) {
    // Ge references
    for (wb_object o = m_sp->object(pwr_cClass_XttGraph); o; o = o.next()) {
      pwr_tString80 action;
      pwr_tFileName fname;
      char line[512];
      char linep[2][512];
      int tag;
      int nr;
      char* s;

      wb_attribute a = m_sp->attribute(o.oid(), "RtBody", "Action");

      a.value(action);
      if (strstr(action, ".pwg")) {
        sprintf(fname, "$pwrp_exe/%s", cdh_Low(action));

        dcli_translate_filename(fname, fname);

        std::ifstream fpg(fname);
        if (!fpg)
          continue;

        while (fpg.getline(line, sizeof(line))) {
          nr = dcli_parse(line, " ", "", (char*)linep,
              sizeof(linep) / sizeof(linep[0]), sizeof(linep[0]), 0);
          if (nr != 2)
            continue;

          nr = sscanf(linep[0], "%d", &tag);
          if (nr != 1)
            continue;

          switch (tag) {
          case ge_eSave_DigLowColor_attribute:
          case ge_eSave_DigColor_attribute:
          case ge_eSave_DigError_attribute:
          case ge_eSave_DigWarning_attribute:
          case ge_eSave_Invisible_attribute:
          case ge_eSave_DigBorder_attribute:
          case ge_eSave_DigText_attribute:
          case ge_eSave_Value_decimals_attr:
          case ge_eSave_ValueInput_minvalue_attr:
          case ge_eSave_ValueInput_maxvalue_attr:
          case ge_eSave_Rotate_attribute:
          case ge_eSave_Move_move_x_attribute:
          case ge_eSave_Move_move_y_attribute:
          case ge_eSave_Move_scale_x_attribute:
          case ge_eSave_Move_scale_y_attribute:
          case ge_eSave_AnalogShift_attribute:
          case ge_eSave_DigShift_attribute:
          case ge_eSave_Animation_attribute:
          case ge_eSave_Bar_attribute:
          case ge_eSave_Bar_minvalue_attr:
          case ge_eSave_Bar_maxvalue_attr:
          case ge_eSave_Trend_attribute1:
          case ge_eSave_Trend_attribute2:
          case ge_eSave_Trend_minvalue_attr1:
          case ge_eSave_Trend_maxvalue_attr1:
          case ge_eSave_Trend_minvalue_attr2:
          case ge_eSave_Trend_maxvalue_attr2:
          case ge_eSave_Trend_mark1_attr:
          case ge_eSave_Trend_mark2_attr:
          case ge_eSave_DigFlash_attribute:
          case ge_eSave_FillLevel_attribute:
          case ge_eSave_FillLevel_minvalue_attr:
          case ge_eSave_FillLevel_maxvalue_attr:
          case ge_eSave_Table_attribute1:
          case ge_eSave_Table_sel_attribute1:
          case ge_eSave_StatusColor_attribute:
          case ge_eSave_DigSound_attribute:
          case ge_eSave_XY_Curve_x_attr:
          case ge_eSave_XY_Curve_y_attr:
          case ge_eSave_XY_Curve_y_minvalue_attr:
          case ge_eSave_XY_Curve_y_maxvalue_attr:
          case ge_eSave_XY_Curve_x_minvalue_attr:
          case ge_eSave_XY_Curve_x_maxvalue_attr:
          case ge_eSave_XY_Curve_x_mark1_attr:
          case ge_eSave_XY_Curve_x_mark2_attr:
          case ge_eSave_XY_Curve_y_mark1_attr:
          case ge_eSave_XY_Curve_y_mark2_attr:
          case ge_eSave_Pie_attribute1:
          case ge_eSave_Pie_attribute2:
          case ge_eSave_Pie_attribute3:
          case ge_eSave_Pie_attribute4:
          case ge_eSave_Pie_attribute5:
          case ge_eSave_Pie_attribute6:
          case ge_eSave_Pie_attribute7:
          case ge_eSave_Pie_attribute8:
          case ge_eSave_Pie_attribute9:
          case ge_eSave_Pie_attribute10:
          case ge_eSave_Pie_attribute11:
          case ge_eSave_Pie_attribute12:
          case ge_eSave_BarChart_attribute1:
          case ge_eSave_BarChart_attribute2:
          case ge_eSave_BarChart_attribute3:
          case ge_eSave_BarChart_attribute4:
          case ge_eSave_BarChart_attribute5:
          case ge_eSave_BarChart_attribute6:
          case ge_eSave_BarChart_attribute7:
          case ge_eSave_BarChart_attribute8:
          case ge_eSave_BarChart_attribute9:
          case ge_eSave_BarChart_attribute10:
          case ge_eSave_BarChart_attribute11:
          case ge_eSave_BarChart_attribute12:
          case ge_eSave_Axis_minvalue_attr:
          case ge_eSave_Axis_maxvalue_attr:
          case ge_eSave_DigFourShift_attribute1:
          case ge_eSave_DigFourShift_attribute2:
          case ge_eSave_DigFourShift_attribute3:
          case ge_eSave_ScrollingText_attribute:
          case ge_eSave_DigBackgroundColor_attribute:
          case ge_eSave_DigSwap_attribute:
          case ge_eSave_DigScript_attribute:
          case ge_eSave_DigCommand_attribute:
          case ge_eSave_Slider_minvalue_attr:
          case ge_eSave_Slider_maxvalue_attr:
          case ge_eSave_Slider_insensitive_attr:
          case ge_eSave_AnalogColor_attribute:
          case ge_eSave_DigSound_soundobject:
          case ge_eSave_PopupMenu_ref_object: {
            if ((s = strchr(linep[1], '#')))
              *s = 0;

            if (linep[1][0] == '!')
              strcpy(&linep[1][0], &linep[1][1]);

            wb_attribute al = m_sp->attribute(linep[1]);
            if (!al)
              break;

            int len = strlen(linep[1]);
            if (len > 12
                && str_NoCaseStrcmp(&linep[1][len - 12], ".ActualValue") == 0) {
              linep[1][len - 12] = 0;
              al = m_sp->attribute(linep[1]);
              if (!al)
                break;
            }
            switch (al.tid()) {
            case pwr_cClass_Di:
            case pwr_cClass_Do:
            case pwr_cClass_Dv:
            case pwr_cClass_Ai:
            case pwr_cClass_Ao:
            case pwr_cClass_Av:
            case pwr_cClass_Co:
            case pwr_cClass_Ii:
            case pwr_cClass_Io:
            case pwr_cClass_Iv:
            case pwr_cClass_Sv:
            case pwr_cClass_ATv:
            case pwr_cClass_DTv: {
              sCrrKey key;

              key.target = al.aref();
              key.reference = cdh_ObjidToAref(o.oid());
              key.type = crrgen_eType_Read;
              tree_Insert(&sts, m_signal_th, &key);
              break;
            }
            default: {
              sCrrKey key;

              key.target = al.aref();
              key.reference = cdh_ObjidToAref(o.oid());
              key.type = crrgen_eType_Read;
              tree_Insert(&sts, m_object_th, &key);
            }
            }
            break;
          }
          case ge_eSave_Value_attribute:
          case ge_eSave_SetDig_attribute:
          case ge_eSave_ResetDig_attribute:
          case ge_eSave_ToggleDig_attribute:
          case ge_eSave_StoDig_attribute:
          case ge_eSave_IncrAnalog_attribute:
          case ge_eSave_RadioButton_attribute:
          case ge_eSave_Slider_attribute:
          case ge_eSave_OptionMenu_attribute:
          case ge_eSave_SetValue_attribute: {
            if ((s = strchr(linep[1], '#')))
              *s = 0;

            if (linep[1][0] == '!')
              strcpy(&linep[1][0], &linep[1][1]);

            wb_attribute al = m_sp->attribute(linep[1]);
            if (!al)
              break;

            int len = strlen(linep[1]);
            if (len > 12
                && str_NoCaseStrcmp(&linep[1][len - 12], ".ActualValue") == 0) {
              linep[1][len - 12] = 0;
              al = m_sp->attribute(linep[1]);
              if (!al)
                break;
            }
            switch (al.tid()) {
            case pwr_cClass_Di:
            case pwr_cClass_Do:
            case pwr_cClass_Dv:
            case pwr_cClass_Ai:
            case pwr_cClass_Ao:
            case pwr_cClass_Av:
            case pwr_cClass_Co:
            case pwr_cClass_Ii:
            case pwr_cClass_Io:
            case pwr_cClass_Iv:
            case pwr_cClass_Sv:
            case pwr_cClass_ATv:
            case pwr_cClass_DTv: {
              sCrrKey key;

              key.target = al.aref();
              key.reference = cdh_ObjidToAref(o.oid());
              key.type = crrgen_eType_Write;
              tree_Insert(&sts, m_signal_th, &key);
              break;
            }
            default: {
              sCrrKey key;

              key.target = al.aref();
              key.reference = cdh_ObjidToAref(o.oid());
              key.type = crrgen_eType_Write;
              tree_Insert(&sts, m_object_th, &key);
            }
            }

            break;
          }
          default:;
          }
        }
        fpg.close();
      }
    }
  }

  *rsts = 1;
}
예제 #13
0
pwr_tStatus wsx_CheckVolume( 
	ldh_tSesContext	sesctx,
	pwr_tObjid	objid,
	int		*errorcount,
	int		*warningcount	
)
{
	pwr_tStatus sts;
	pwr_tUInt32 *opsys_ptr;
	pwr_tUInt32 opsys;
	pwr_tUInt32 opsys_sum;
	int size;
	int i;
	pwr_tClassId cid;
	pwr_tClassId	class_vect[2];
	int node_object_count;  
	
	sts = ldh_GetObjectClass ( sesctx, objid, &cid);
	if ( EVEN(sts)) return sts;

	/* Check number of $Node objects in the volume */
	class_vect[0] = pwr_cClass_Node;
	class_vect[1] = 0;
	node_object_count = 0;
	sts = trv_get_objects_hier_class_name( sesctx, pwr_cNObjid,
		class_vect, NULL,
		&wsx_object_count,
		&node_object_count, 0, 0, 0, 0);
	if (EVEN(sts)) return sts;

#if 0
	/* Dynamic size of valuebase objects !!! */
	int di_object_count;  
	int do_object_count;  
	int dv_object_count;  
	int ai_object_count;  
	int ao_object_count;  
	int av_object_count;  
	int co_object_count;  

	pwr_sClass_di_value_base *di_valuebase;
	pwr_sClass_do_value_base *do_valuebase;
	pwr_sClass_dv_value_base *dv_valuebase;
	pwr_sClass_ai_value_base *ai_valuebase;
	pwr_sClass_ao_value_base *ao_valuebase;
	pwr_sClass_av_value_base *av_valuebase;
	pwr_sClass_co_value_base *co_valuebase;


	/* Check number of signals objects in the volume */
	class_vect[0] = pwr_cClass_Di;
	class_vect[1] = 0;
	di_object_count = 0;
	sts = trv_get_objects_hier_class_name( sesctx, pwr_cNObjid,
		class_vect, NULL,
		&wsx_object_count,
		&di_object_count, 0, 0, 0, 0);
	if (EVEN(sts)) return sts;
	if ( di_object_count > 
	    sizeof( di_valuebase->DIValue) / sizeof( di_valuebase->DIValue[0]))
  	  wsx_error_msg( sesctx, WSX__DICOUNT, objid, errorcount, warningcount);

	class_vect[0] = pwr_cClass_Do;
	class_vect[1] = 0;
	do_object_count = 0;
	sts = trv_get_objects_hier_class_name( sesctx, pwr_cNObjid,
		class_vect, NULL,
		&wsx_object_count,
		&do_object_count, 0, 0, 0, 0);
	if (EVEN(sts)) return sts;
	if ( do_object_count > 
	    sizeof( do_valuebase->DOValue) / sizeof( do_valuebase->DOValue[0]))
  	  wsx_error_msg( sesctx, WSX__DOCOUNT, objid, errorcount, warningcount);

	class_vect[0] = pwr_cClass_Dv;
	class_vect[1] = 0;
	dv_object_count = 0;
	sts = trv_get_objects_hier_class_name( sesctx, pwr_cNObjid,
		class_vect, NULL,
		&wsx_object_count,
		&dv_object_count, 0, 0, 0, 0);
	if (EVEN(sts)) return sts;
	if ( dv_object_count > 
	    sizeof( dv_valuebase->DVValue) / sizeof( dv_valuebase->DVValue[0]))
  	  wsx_error_msg( sesctx, WSX__DVCOUNT, objid, errorcount, warningcount);

	class_vect[0] = pwr_cClass_Ai;
	class_vect[1] = 0;
	ai_object_count = 0;
	sts = trv_get_objects_hier_class_name( sesctx, pwr_cNObjid,
		class_vect, NULL,
		&wsx_object_count,
		&ai_object_count, 0, 0, 0, 0);
	if (EVEN(sts)) return sts;
	if ( ai_object_count > 
	    sizeof( ai_valuebase->AIValue) / sizeof( ai_valuebase->AIValue[0]))
  	  wsx_error_msg( sesctx, WSX__AICOUNT, objid, errorcount, warningcount);

	class_vect[0] = pwr_cClass_Ao;
	class_vect[1] = 0;
	ao_object_count = 0;
	sts = trv_get_objects_hier_class_name( sesctx, pwr_cNObjid,
		class_vect, NULL,
		&wsx_object_count,
		&ao_object_count, 0, 0, 0, 0);
	if (EVEN(sts)) return sts;
	if ( ao_object_count > 
	    sizeof( ao_valuebase->AOValue) / sizeof( ao_valuebase->AOValue[0]))
  	  wsx_error_msg( sesctx, WSX__AOCOUNT, objid, errorcount, warningcount);

	class_vect[0] = pwr_cClass_Av;
	class_vect[1] = 0;
	av_object_count = 0;
	sts = trv_get_objects_hier_class_name( sesctx, pwr_cNObjid,
		class_vect, NULL,
		&wsx_object_count,
		&av_object_count, 0, 0, 0, 0);
	if (EVEN(sts)) return sts;
	if ( av_object_count > 
	    sizeof( av_valuebase->AVValue) / sizeof( av_valuebase->AVValue[0]))
  	  wsx_error_msg( sesctx, WSX__AVCOUNT, objid, errorcount, warningcount);

	class_vect[0] = pwr_cClass_Co;
	class_vect[1] = 0;
	co_object_count = 0;
	sts = trv_get_objects_hier_class_name( sesctx, pwr_cNObjid,
		class_vect, NULL,
		&wsx_object_count,
		&co_object_count, 0, 0, 0, 0);
	if (EVEN(sts)) return sts;
	if ( co_object_count > 
	    sizeof( co_valuebase->COValue) / sizeof( co_valuebase->COValue[0]))
  	  wsx_error_msg( sesctx, WSX__COCOUNT, objid, errorcount, warningcount);
#endif
	switch (cid)
 	{
	  case pwr_cClass_RootVolume:
	  case pwr_cClass_SubVolume:

	    if ( cid == pwr_cClass_RootVolume)
	    {
	      if ( node_object_count != 1)
  	        wsx_error_msg( sesctx, WSX__NODECOUNT, cdh_ObjidToAref(objid), errorcount, warningcount);
	    }
	    else
	    {
	      if ( node_object_count != 0)
  	        wsx_error_msg( sesctx, WSX__NODECOUNT, cdh_ObjidToAref(objid), errorcount, warningcount);
	    }

	    /* Check OperatingSystem */
	    sts = ldh_GetObjectPar( sesctx,
  			objid,
			"SysBody",
			"OperatingSystem",
			(char **)&opsys_ptr, &size);
	    if ( EVEN(sts)) return sts;

	    opsys_sum = 0;
	    for ( i = 0;; i++)
	    {
    	      opsys = 1 << i;
	      opsys_sum |= opsys;
  	      if ( opsys >= pwr_mOpSys_)
  	        break;
	    }

  	    if ( *opsys_ptr & ~opsys_sum)
  	      wsx_error_msg( sesctx, WSX__OSINVALID, cdh_ObjidToAref(objid), errorcount, warningcount);

  	    free( (char *) opsys_ptr);
	    break;

	  default:
	    if ( node_object_count != 0)
  	      wsx_error_msg( sesctx, WSX__NODECOUNT, cdh_ObjidToAref(objid), errorcount, warningcount);
	}
	return WSX__SUCCESS;
}
예제 #14
0
pwr_tStatus wsx_CheckCard( 
	ldh_tSesContext	sesctx,
	pwr_tAttrRef	aref,
	int		*errorcount,
	int		*warningcount,
	wsx_mCardOption options
)
{
	int		sts;
	int		size;
	char		*buf_ptr;
	pwr_tUInt16	chan_max;
	int		chan_number_array[256];
	int		chan_count;
	pwr_tUInt16 	number;
	pwr_tObjid	chan_objid;
	pwr_tClassId	cid;

	/* Check ErrorSoftLimit */
	sts = ldh_GetAttrObjectPar( sesctx,
			&aref, 
			"RtBody",
			"ErrorSoftLimit",
			(char **)&buf_ptr, &size);
	if (EVEN(sts)) return sts;
	if ( *(int *) buf_ptr == 0)
	  wsx_error_msg( sesctx, WSX__CARDERRSOFTLIM, aref, errorcount, warningcount);
	free((char *) buf_ptr);
	
	/* Check ErrorHardLimit */
	sts = ldh_GetAttrObjectPar( sesctx,
			&aref, 
			"RtBody",
			"ErrorHardLimit",
			(char **)&buf_ptr, &size);
	if (EVEN(sts)) return sts;
	if ( *(int *) buf_ptr == 0)
	  wsx_error_msg( sesctx, WSX__CARDERRHARDLIM, aref, errorcount, warningcount);
	free((char *) buf_ptr);

	/* Get MaxNoOfChannels */
	sts = ldh_GetAttrObjectPar( sesctx,
			&aref, 
			"RtBody",
			"MaxNoOfChannels",
			(char **)&buf_ptr, &size);
	if (EVEN(sts)) return sts;
	
	chan_max = *(pwr_tUInt16 *) buf_ptr;
	free((char *) buf_ptr);

	if ( chan_max > 256)
	{
	  wsx_error_msg( sesctx, WSX__MAXCHAN, aref, errorcount, warningcount);
	  return WSX__SUCCESS;
	}
	/* Check that Number in channel-objects are unique within the card */
	memset( chan_number_array, 0, sizeof( chan_number_array));
	chan_count = 0;
	sts = ldh_GetChild( sesctx, aref.Objid, &chan_objid);
	while (ODD(sts))
	{
	  sts = ldh_GetObjectClass ( sesctx, chan_objid, &cid);
	  if ( EVEN(sts)) return sts;
	  switch ( cid)
	  {
	    case pwr_cClass_ChanDi:
	    case pwr_cClass_ChanDo:
	    case pwr_cClass_ChanAi:
	    case pwr_cClass_ChanAit:
	    case pwr_cClass_ChanAo:
	      chan_count++;
	      sts = ldh_GetObjectPar( sesctx,
			chan_objid, 
			"RtBody",
			"Number",
			(char **)&buf_ptr, &size);
	      if (EVEN(sts)) return sts;
	      number = * (pwr_tUInt16 *) buf_ptr;
	      free((char *) buf_ptr);
	      /* Check than number is within limits */
	      if ( number >= chan_max)
	      {
	        wsx_error_msg( sesctx, WSX__NUMRANGE, cdh_ObjidToAref(chan_objid), 
			       errorcount, warningcount);
	        break;
	      }
	      if ( chan_number_array[ number])
	        /* Number is occupied */
	        wsx_error_msg( sesctx, WSX__NUMNOTUNIQUE, cdh_ObjidToAref(chan_objid), 
			       errorcount, warningcount);
	      else
	        chan_number_array[ number] = 1;
	      break;
	    default:
	      wsx_error_msg( sesctx, WSX__MISPLACED, aref, errorcount, warningcount);
	  }
	  sts = ldh_GetNextSibling( sesctx, chan_objid, &chan_objid);
	}
	if ( chan_count > chan_max)
	  wsx_error_msg( sesctx, WSX__CHANCOUNT, aref, errorcount, warningcount);
	
	return WSX__SUCCESS;
}
예제 #15
0
int XNav::getAllMenuItems( xmenu_sMenuCall	*ip,
			   xmenu_sMenuItem	**Item,
			   pwr_tObjid		objid,
			   pwr_tUInt32		Level,
			   int			*nItems,
			   int			AddSeparator,
			   pwr_sAttrRef		*CurrentObject)
{
  int                   sts;
  pwr_tCid	        classid;
  pwr_tObjid            child;
  pwr_sMenuButton	*mbp;
  pwr_sMenuCascade	*mcp;
  pwr_sMenuRef		*mrp;
  pwr_tStatus           (*filter)( xmenu_sMenuCall *);
  int                   sensitive;
  int                   i;


  Level++;
  memset(*Item, 0, sizeof(**Item));

  if(AddSeparator) {
    (*Item)->Level = Level;
    (*Item)->Item = xmenu_eMenuItem_Separator;
    (*Item)->MenuObject = pwr_cNObjid;
    (*Item)++;
    (*nItems)++;
  } 
  else {
    sts = gdh_GetObjectClass( objid, &classid);
    if ( EVEN(sts)) return sts;

    if ( classid == pwr_eClass_MenuButton) {
      sts = gdh_ObjidToPointer( objid, (void **) &mbp);
      if ( EVEN(sts)) return sts;

      
      ip->ChosenItem = *nItems;
      for ( i = 0; i < 5; i++) {
        strcpy( (*Item)->FilterArguments[i], mbp->FilterArguments[i]);
      }

      // Call any filter method
      (*Item)->CurrentObject = *CurrentObject;
      sensitive = 1;
      if ( strcmp( mbp->FilterName, "") != 0) {
        sts = GetMethod( mbp->FilterName, &filter);
        if ( ODD(sts)) {
          sts = (filter) ( ip);
	  if ( sts == XNAV__INSENSITIVE) 
            sensitive = 0;
        }
      }
      else
        sts = XNAV__SUCCESS;

      if ( ODD(sts)) {
        (*Item)->Level = Level;
        (*Item)->Item = xmenu_eMenuItem_Button;
        (*Item)->MenuObject = objid;

        (*Item)->Flags.f.Sensitive = sensitive;
        if (strcmp( mbp->MethodName, "")  == 0)
          (*Item)->Flags.f.Sensitive = 0;

        strcpy((*Item)->Name, mbp->ButtonName);
        strcpy( (*Item)->Method, mbp->MethodName);
        strcpy( (*Item)->Filter, mbp->FilterName);
        for ( i = 0; i < 5; i++) {
          strcpy( (*Item)->MethodArguments[i], mbp->MethodArguments[i]);
        }
        (*Item)++;
        (*nItems)++;
      }
    } 
    else if ( classid == pwr_eClass_MenuSeparator) {
      (*Item)->Level = Level;
      (*Item)->Item = xmenu_eMenuItem_Separator;
      (*Item)->MenuObject = objid;
      (*Item)++;
      (*nItems)++;
    } 
    else if ( classid == pwr_eClass_MenuCascade) {
      sts = gdh_ObjidToPointer( objid, (void **) &mcp);
      if ( EVEN(sts)) return sts;

      // Call any filter method
      (*Item)->CurrentObject = *CurrentObject;
      if ( strcmp( mcp->FilterName, "") != 0) {
        sts = GetMethod( mcp->FilterName, &filter);
        if ( ODD(sts)) {
          sts = (filter) ( ip);
        }
      }
      else
        sts = XNAV__SUCCESS;

      if ( ODD(sts)) {
        (*Item)->Level = Level;
        (*Item)->Item = xmenu_eMenuItem_Cascade;
        (*Item)->Flags.f.Sensitive = 1;
        strcpy((*Item)->Name, mcp->ButtonName);
        (*Item)->MenuObject = objid;
        (*Item)++;
        (*nItems)++;
     
        sts = gdh_GetChild( objid, &child);
        while( ODD(sts)) {
          sts = getAllMenuItems(ip, Item, child, Level, nItems, 0, CurrentObject);
          if ( EVEN(sts)) return sts;
          sts = gdh_GetNextSibling( child, &child);
        }
      }
    }
    else if ( classid == pwr_eClass_MenuRef && 
	      cdh_ObjidIsNull( CurrentObject->Objid)) {
      pwr_tAName aname;
      pwr_sAttrRef currentar;
      pwr_tCid current_cid;
      pwr_tTid a_tid;
      pwr_tUInt32 a_size, a_offs, a_elem;

      sts = gdh_ObjidToPointer( objid, (void **) &mrp);
      if ( EVEN(sts)) return sts;

      // Call any filter method
      (*Item)->CurrentObject = *CurrentObject;
      if ( strcmp( mrp->FilterName, "") != 0) {
        sts = GetMethod( mrp->FilterName, &filter);
        if ( ODD(sts)) {
          sts = (filter) ( ip);
        }
      }
      else
        sts = XNAV__SUCCESS;

      if ( ODD(sts)) {
	int create_object_button = 0;

	if ( strcmp( mrp->RefAttribute, "_SelfObject") == 0) {
	  // Object entry for attributes
	  char *s;

	  sts = gdh_AttrrefToName( &ip->Pointed, aname, sizeof(aname), cdh_mName_volumeStrict);
	  if ( EVEN(sts)) return sts;
	  if ( (s = strrchr( aname, '.')))
	    *s = 0;

	  sts = gdh_NameToAttrref( pwr_cNOid, aname, &currentar);
	  if ( EVEN(sts)) return sts;
	}
	else {
	  sts = gdh_AttrrefToName( &ip->Pointed, aname, sizeof(aname), cdh_mName_volumeStrict);
	  if ( EVEN(sts)) return sts;
	  strcat( aname, ".");
	  strcat( aname, mrp->RefAttribute);
	  
	  sts = gdh_GetAttributeCharacteristics( aname, &a_tid, &a_size,
						 &a_offs, &a_elem);
	  if ( ODD(sts)) {
	    switch ( a_tid) {
	    case pwr_eType_AttrRef:
	      sts = gdh_GetObjectInfo( aname, &currentar, sizeof(currentar));
	      break;
	    case pwr_eType_Objid: {
	      pwr_tOid oid;
	      
	      currentar = pwr_cNAttrRef;
	      sts = gdh_GetObjectInfo( aname, &oid, sizeof(oid));
	      currentar = cdh_ObjidToAref( oid);
	      break;
	    }
	    default:
	      sts = 0;
	  }
	  }
	  create_object_button = 0;
	}
	if ( ODD(sts) && cdh_ObjidIsNotNull( currentar.Objid)) {
	  (*Item)->Level = Level;
	  (*Item)->Item = xmenu_eMenuItem_Ref;
	  (*Item)->Flags.f.Sensitive = 1;
	  strcpy((*Item)->Name, mrp->ButtonName);
	  (*Item)->MenuObject = objid;
	  (*Item)++;
	  (*nItems)++;

	  // Create a label with current object name
	  sts = gdh_AttrrefToName( &currentar, aname, sizeof(aname), 
				   cdh_mNName);
	  if ( ODD(sts) && create_object_button) {
	    (*Item)->Level = Level;
	    (*Item)->Item = xmenu_eMenuItem_Button;
	    (*Item)->MenuObject = pwr_cNObjid;
	    strncpy((*Item)->Name, aname, sizeof((*Item)->Name));
	    (*Item)->Name[sizeof((*Item)->Name)-1] = 0;
	    (*Item)->MenuObject = pwr_cNObjid;
	    (*Item)->CurrentObject = currentar;
	    (*Item)->Flags.f.Sensitive = 1;
	    strcpy( (*Item)->Method, "$Object-OpenObject");
	    (*Item)++;
	    (*nItems)++;
	  }

	  sts = gdh_GetAttrRefTid( &currentar, &current_cid);
	  if ( EVEN(sts)) return sts;

	  xmenu_eItemType item_type = ip->ItemType;
	  if ( currentar.Flags.b.Object)
	    ip->ItemType =  xmenu_eItemType_Object;
	  else
	    ip->ItemType =  xmenu_eItemType_AttrObject;

	  sts = GetObjectMenu(ip, current_cid, Item, Level, nItems, 0, &currentar);
	  if ( EVEN(sts)) return sts;

	  ip->ItemType = item_type;
        }
      }
    }
  }
  return XNAV__SUCCESS;
}
예제 #16
0
/*----------------------------------------------------------------------------*\

\*----------------------------------------------------------------------------*/
static pwr_tStatus IoCardWrite (
    io_tCtx	ctx,
    io_sAgent	*ap,
    io_sRack	*rp,
    io_sCard	*cp
)
{
    io_sLocal 		*local;
    io_sRackLocal		*r_local = (io_sRackLocal *)(rp->Local);
    pwr_sClass_Ao_HVAO4	*op;
    int			i;
    io_sChannel		*chanp;
    pwr_sClass_ChanAo	*cop;
    pwr_sClass_Ao		*sop;
    pwr_tFloat32		value;
    int			fixout;
    pwr_tUInt16		data;
    pwr_tFloat32		rawvalue;
    qbus_io_write		wb;
    int			sts;

    local = (io_sLocal *) cp->Local;
    op = (pwr_sClass_Ao_HVAO4 *) cp->op;

    fixout = ctx->Node->EmergBreakTrue && ctx->Node->EmergBreakSelect == FIXOUT;

    chanp = &cp->chanlist[0];
    for ( i = 0; i < cp->ChanListSize; i++)
    {
        if ( !chanp->cop)
        {
            chanp++;
            continue;
        }
        cop = (pwr_sClass_ChanAo *) chanp->cop;
        sop = (pwr_sClass_Ao *) chanp->sop;

        if ( *(pwr_tFloat32 *)chanp->vbp != local->OldValue[i] ||
                local->WriteFirst > 0 ||
                cop->CalculateNewCoef ||
                fixout ||
                cop->TestOn || local->OldTestOn[i] != cop->TestOn)
        {
            if ( fixout)
                value = cop->FixedOutValue;
            else if ( cop->TestOn)
                value = cop->TestValue;
            else
                value = *(pwr_tFloat32 *) chanp->vbp;

            if ( cop->CalculateNewCoef)
                AoRangeToCoef( chanp);


            /* Convert to rawvalue */
            if ( value > cop->ActValRangeHigh)
                value = cop->ActValRangeHigh;
            else if ( value < cop->ActValRangeLow)
                value = cop->ActValRangeLow;

            rawvalue = cop->OutPolyCoef1 * value + cop->OutPolyCoef0;
            if ( rawvalue > 0)
                sop->RawValue = rawvalue + 0.5;
            else
                sop->RawValue = rawvalue - 0.5;
            data = sop->RawValue;

#if defined(OS_ELN)
            vaxc$establish(machfailwrite);
#endif
            if (r_local->Qbus_fp != 0 && r_local->s == 0) {
                wb.Data = data;
                wb.Address = local->Address + 2*i;
                sts = write( local->Qbus_fp, &wb, sizeof(wb));
            }
            else {
                /* Ethernet I/O, Request a write to current address */
                bfbeth_set_write_req(r_local, (pwr_tUInt16) (local->Address + 2*i), data);
                sts = 1;
            }

            if ( sts == -1)
            {
                /* Exceptionhandler was called */
#if 0
                if ( io_fatal_error)
                {
                    /* Activate emergency break */
                    errh_Error( "Fatal write error, card '%s', IO is stopped", cp->Name);
                    ctx->Node->EmergBreakTrue = 1;
                    return IO__ERRDEVICE;
                }
#endif
                /* Increase error count and check error limits */
                op->ErrorCount++;

                if ( op->ErrorCount == op->ErrorSoftLimit) {
                    errh_Error( "IO Error soft limit reached on card '%s'", cp->Name);
                    ctx->IOHandler->CardErrorSoftLimit = 1;
                    ctx->IOHandler->ErrorSoftLimitObject = cdh_ObjidToAref( cp->Objid);
                }
                if ( op->ErrorCount >= op->ErrorHardLimit)
                {
                    errh_Error( "IO Error hard limit reached on card '%s', IO stopped", cp->Name);
                    ctx->Node->EmergBreakTrue = 1;
                    ctx->IOHandler->CardErrorHardLimit = 1;
                    ctx->IOHandler->ErrorHardLimitObject = cdh_ObjidToAref( cp->Objid);
                    return IO__ERRDEVICE;
                }
                chanp++;
                continue;
            }
            else
                local->OldValue[i] = value;
        }
        local->OldTestOn[i] = cop->TestOn;
        chanp++;
    }
    if ( local->WriteFirst)
        local->WriteFirst--;

    /* Fix for qbus errors */
    local->ErrScanCnt++;
    if ( local->ErrScanCnt >= local->ErrReset) {
        local->ErrScanCnt = 0;
        if ( op->ErrorCount > op->ErrorSoftLimit)
            op->ErrorCount--;
    }

    return 1;
}
예제 #17
0
/*----------------------------------------------------------------------------*\

\*----------------------------------------------------------------------------*/
static pwr_tStatus IoCardWrite(
    io_tCtx ctx, io_sAgent* ap, io_sRack* rp, io_sCard* cp)
{
  io_sLocal* local;
  io_sRackLocal* r_local = (io_sRackLocal*)(rp->Local);
  pwr_tUInt16 data = 0;
  pwr_sClass_Ssab_BaseDoCard* op;
  pwr_tUInt16 invmask;
  pwr_tUInt16 testmask;
  pwr_tUInt16 testvalue;
  int i;
  qbus_io_write wb;
  int sts;
  int bfb_error = 0;
  pwr_sClass_Ssab_RemoteRack* rrp;

  local = (io_sLocal*)cp->Local;
  op = (pwr_sClass_Ssab_BaseDoCard*)cp->op;

  for (i = 0; i < 2; i++) {
    if (i == 1 && op->MaxNoOfChannels <= 16)
      break;

    if (ctx->Node->EmergBreakTrue && ctx->Node->EmergBreakSelect == FIXOUT) {
      if (i == 0)
        data = op->FixedOutValue1;
      else
        data = op->FixedOutValue2;
    } else
      io_DoPackWord(cp, &data, i);

    if (i == 0) {
      testmask = op->TestMask1;
      invmask = op->InvMask1;
    } else {
      testmask = op->TestMask2;
      invmask = op->InvMask2;
      if (op->MaxNoOfChannels == 16)
        break;
    }

    /* Invert */
    data = data ^ invmask;

    /* Filter Po signals */
    if (local->Filter[i].Found)
      io_PoFilter(local->Filter[i].sop, &data, local->Filter[i].Data);

    /* Testvalues */
    if (testmask) {
      if (i == 0)
        testvalue = op->TestValue1;
      else
        testvalue = op->TestValue2;
      data = (data & ~testmask) | (testmask & testvalue);
    }

    if (r_local->Qbus_fp != 0 && r_local->s == 0) {
      /* Write to local Q-bus */
      wb.Data = data;
      wb.Address = local->Address[i];
      sts = write(local->Qbus_fp, &wb, sizeof(wb));
    } else {
      /* Ethernet I/O, Request a write to current address */
      sts = 0;
      if (!local->FirstScan)
        bfbeth_get_write_status(r_local, (pwr_tUInt16)local->Address[i], &sts);

      bfbeth_set_write_req(r_local, (pwr_tUInt16)local->Address[i], data);

      if (sts == -1) {
        /* Error handling for ethernet Qbus-I/O */
        rrp = (pwr_sClass_Ssab_RemoteRack*)rp->op;
        if (bfb_error == 0) {
          op->ErrorCount++;
          bfb_error = 1;
          if (op->ErrorCount == op->ErrorSoftLimit) {
            ctx->IOHandler->CardErrorSoftLimit = 1;
            ctx->IOHandler->ErrorSoftLimitObject = cdh_ObjidToAref(cp->Objid);
            errh_Error("IO Error soft limit reached on card '%s'", cp->Name);
          }
          if (op->ErrorCount == op->ErrorHardLimit) {
            errh_Error(
                "IO Error hard limit reached on card '%s', stall action %d",
                cp->Name, rrp->StallAction);
            ctx->IOHandler->CardErrorHardLimit = 1;
            ctx->IOHandler->ErrorHardLimitObject = cdh_ObjidToAref(cp->Objid);
          }
          if (op->ErrorCount >= op->ErrorHardLimit
              && rrp->StallAction == pwr_eSsabStallAction_ResetInputs) {
            sts = 1;
          }
          if (op->ErrorCount >= op->ErrorHardLimit
              && rrp->StallAction == pwr_eSsabStallAction_EmergencyBreak) {
            ctx->Node->EmergBreakTrue = 1;
            return IO__ERRDEVICE;
          }
        }
        if (sts == -1)
          continue;
      } else if (sts == 1) {
        op->ErrorCount = 0;
      }
    }

    /* Error handling for local Qbus-I/O */
    if (sts == -1) {
      /* Increase error count and check error limits */
      op->ErrorCount++;

      if (op->ErrorCount == op->ErrorSoftLimit) {
        errh_Error("IO Error soft limit reached on card '%s'", cp->Name);
        ctx->IOHandler->CardErrorSoftLimit = 1;
        ctx->IOHandler->ErrorSoftLimitObject = cdh_ObjidToAref(cp->Objid);
      }
      if (op->ErrorCount >= op->ErrorHardLimit) {
        errh_Error(
            "IO Error hard limit reached on card '%s', IO stopped", cp->Name);
        ctx->Node->EmergBreakTrue = 1;
        ctx->IOHandler->CardErrorHardLimit = 1;
        ctx->IOHandler->ErrorHardLimitObject = cdh_ObjidToAref(cp->Objid);
        return IO__ERRDEVICE;
      }
      continue;
    }
  }
  if (local->FirstScan)
    local->FirstScan = 0;

  /* Fix for qbus errors */
  local->ErrScanCnt++;
  if (local->ErrScanCnt >= local->ErrReset) {
    local->ErrScanCnt = 0;
    if (op->ErrorCount > op->ErrorSoftLimit)
      op->ErrorCount--;
  }

  return 1;
}
예제 #18
0
void wb_volume::aref(pwr_tCid cid, pwr_sAttrRef *arp)
{
  tree_sTable *catt_tt = m_vrep->merep()->buildCatt(&m_sts);

  // Look in classlist
  wb_orep *o = m_vrep->object(&m_sts, cid);
  if (oddSts()) {
    o->ref();
    *arp = cdh_ObjidToAref(o->oid());
    o->unref();
    return;
  }
  else {
    // Find attribute object
    pwr_tCid hostCid = 0;
    merep_sClassAttrKey key;
    merep_sClassAttr *item;

    key.subCid = cid;
    key.hostCid = 0;
    key.idx = 0;
    for (item = (merep_sClassAttr*) tree_FindSuccessor(&m_sts, catt_tt, &key);
	  item;
	  item = (merep_sClassAttr*) tree_FindSuccessor(&m_sts, catt_tt, &item->key)) {
      if ( item->key.subCid != cid) {
	m_sts = LDH__CLASSLIST;
	break;
      }
      if (hostCid && item->key.hostCid == hostCid)
	// Same class with other index
	continue;

      hostCid = item->key.hostCid;

      wb_orep *o = m_vrep->object(&m_sts, item->key.hostCid);
      if (oddSts()) {
	o->ref();

	wb_cdrep *cd = m_vrep->merep()->cdrep(&m_sts, cid);
	if (evenSts()) return;

	int bd_size;
	wb_bdrep *bd = cd->bdrep(&m_sts, pwr_eBix_rt);
	if (oddSts()) {
	  bd_size = bd->size();
	  delete bd;
	}
	else
	  bd_size = 0;
	delete cd;

	*arp = pwr_cNAttrRef;
	arp->Objid = o->oid();
	arp->Flags.b.ObjectAttr = 1;
	arp->Offset = item->offset[0];
	arp->Size = bd_size;
	arp->Body = cdh_cidToBid( cid, pwr_eBix_rt);
	o->unref();
	return;
      }      
    }
  }
}
예제 #19
0
int pndevice_save_cb(void* sctx)
{
  device_sCtx* ctx = (device_sCtx*)sctx;
  pwr_tStatus sts;
  pwr_tOName name;
  int size;
  pwr_tOid oid;
  pwr_tStatus rsts = PB__SUCCESS;

  // Syntax check
  if (ctx->attr->attrnav->device_num == 0) {
    MsgWindow::message('E', "Device type not selected");
    return PB__SYNTAX;
  }

  for (unsigned int i = 1; i < ctx->attr->attrnav->dev_data.slot_data.size();
       i++) {
    if (ctx->attr->attrnav->dev_data.slot_data[i]->module_enum_number == 0
        && ctx->attr->attrnav->dev_data.slot_data[i]->module_class != 0) {
      // Module class selected but not module type
      char msg[20];

      sprintf(msg, "Slot %d", i);
      MsgWindow::message('E', "Module type not selected, ", msg);
      rsts = PB__MODULETYPE;
    }
    if (ctx->attr->attrnav->dev_data.slot_data[i]->module_class == 0
        && ctx->attr->attrnav->dev_data.slot_data[i]->module_enum_number != 0) {
      // Module type selected but not module class
      char msg[20];

      sprintf(msg, "Slot %d", i);
      MsgWindow::message('E', "Module class not selected, ", msg);
      rsts = PB__MODULECLASS;
    }
  }

  // Save configuration
  ((WNav*)ctx->editor_ctx)->set_nodraw();

  sts = ldh_ObjidToName(ctx->ldhses, ctx->aref.Objid, ldh_eName_Hierarchy, name,
      sizeof(name), &size);
  if (EVEN(sts))
    goto return_now;

  // Check that Slot attribute corresponds to the and module_oid
  for (unsigned int i = 1; i < ctx->attr->attrnav->dev_data.slot_data.size();
       i++)
    ctx->attr->attrnav->dev_data.slot_data[i]->module_oid = pwr_cNOid;

  for (sts = ldh_GetChild(ctx->ldhses, ctx->aref.Objid, &oid); ODD(sts);
       sts = ldh_GetNextSibling(ctx->ldhses, oid, &oid)) {
    unsigned int *slotnumberp, slotnumber;

    sts = ldh_GetObjectPar(
        ctx->ldhses, oid, "RtBody", "Slot", (char**)&slotnumberp, &size);
    if (EVEN(sts)) {
      MsgWindow::message(
          'E', "Not a Profinet module object", msgw_ePop_Yes, oid);
      continue;
    }
    slotnumber = *slotnumberp;
    free(slotnumberp);

    if (slotnumber >= ctx->attr->attrnav->dev_data.slot_data.size()) {
      MsgWindow::message('E', "Slot too large", msgw_ePop_Yes, oid);
      continue;
    }

    if (cdh_ObjidIsNotNull(
            ctx->attr->attrnav->dev_data.slot_data[slotnumber]->module_oid)) {
      MsgWindow::message('E', "Slot already used", msgw_ePop_Yes, oid);
      continue;
    }

    if (ctx->attr->attrnav->dev_data.slot_data[slotnumber]->module_class
        == pwr_cNCid)
      // Should be removed
      continue;

    ctx->attr->attrnav->dev_data.slot_data[slotnumber]->module_oid = oid;
  }

  // Remove modules that wasn't configured any more
  pwr_tOid moid[100];
  int mcnt;
  int found;
  mcnt = 0;
  for (sts = ldh_GetChild(ctx->ldhses, ctx->aref.Objid, &oid); ODD(sts);
       sts = ldh_GetNextSibling(ctx->ldhses, oid, &oid)) {
    found = 0;
    for (unsigned int i = 0; i < ctx->attr->attrnav->dev_data.slot_data.size();
         i++) {
      if (cdh_ObjidIsEqual(
              ctx->attr->attrnav->dev_data.slot_data[i]->module_oid, oid)) {
        found = 1;
        break;
      }
    }
    if (!found) {
      moid[mcnt++] = oid;
      if (mcnt > (int)(sizeof(moid) / sizeof(moid[0])))
        break;
    }
  }

  for (int i = 0; i < mcnt; i++)
    sts = ldh_DeleteObjectTree(ctx->ldhses, moid[i], 0);

  // Create new module objects
  for (unsigned int i = 0; i < ctx->attr->attrnav->dev_data.slot_data.size();
       i++) {
    GsdmlSlotData* slot = ctx->attr->attrnav->dev_data.slot_data[i];

    if (cdh_ObjidIsNull(slot->module_oid) && slot->module_class != pwr_cNCid) {
      char mname[20];
      sprintf(mname, "M%d", i);

      if (i == 1)
        sts = ldh_CreateObject(ctx->ldhses, &slot->module_oid, mname,
            slot->module_class, ctx->aref.Objid, ldh_eDest_IntoFirst);
      else {
        // Find sibling
        pwr_tOid dest_oid = pwr_cNOid;
        int dest_found = 0;
        for (int j = i - 1; j > 0; j--) {
          if (cdh_ObjidIsNotNull(
                  ctx->attr->attrnav->dev_data.slot_data[j]->module_oid)) {
            dest_oid = ctx->attr->attrnav->dev_data.slot_data[j]->module_oid;
            dest_found = 1;
            break;
          }
        }
        if (!dest_found)
          sts = ldh_CreateObject(ctx->ldhses, &slot->module_oid, mname,
              slot->module_class, ctx->aref.Objid, ldh_eDest_IntoFirst);
        else
          sts = ldh_CreateObject(ctx->ldhses, &slot->module_oid, mname,
              slot->module_class, dest_oid, ldh_eDest_After);
      }
      if (EVEN(sts)) {
        MsgWindow::message('E', "Error creating module object", mname);
        sts = 0;
        goto return_now;
      }

      pwr_tAttrRef aaref;
      pwr_tAttrRef modulearef = cdh_ObjidToAref(slot->module_oid);

      // Set Slot
      pwr_tUInt32 slotnumber = i;
      sts = ldh_ArefANameToAref(ctx->ldhses, &modulearef, "Slot", &aaref);
      if (EVEN(sts))
        goto return_now;

      sts = ldh_WriteAttribute(
          ctx->ldhses, &aaref, &slotnumber, sizeof(slotnumber));
      if (EVEN(sts))
        goto return_now;
    }
  }

  for (unsigned int i = 0; i < ctx->attr->attrnav->dev_data.slot_data.size();
       i++) {
    GsdmlSlotData* slot = ctx->attr->attrnav->dev_data.slot_data[i];

    if (i == 0) {
      std::vector<ChanItem> input_vect;
      std::vector<ChanItem> output_vect;

      sts = pndevice_check_io(ctx,
          ctx->attr->attrnav->device_item->VirtualSubmoduleList, input_vect,
          output_vect);
      if (sts == PB__CREATECHAN) {
        char msg[20];
        sprintf(msg, "Slot %d", i);
        MsgWindow::message(
            'W', "Unexpected datatype, channel not created, ", msg);
      }
    } else {
      if (slot->module_class == pwr_cClass_PnModule) {
        std::vector<ChanItem> input_vect;
        std::vector<ChanItem> output_vect;
        gsdml_UseableModules* um
            = ctx->gsdml->ApplicationProcess->DeviceAccessPointList
                  ->DeviceAccessPointItem[ctx->attr->attrnav->device_num - 1]
                  ->UseableModules;

        if (!um)
          continue;
        gsdml_ModuleItem* mi
            = (gsdml_ModuleItem*)um->ModuleItemRef[slot->module_enum_number - 1]
                  ->Body.ModuleItemTarget.p;

        sts = pndevice_check_io(
            ctx, mi->VirtualSubmoduleList, input_vect, output_vect);
        if (sts == PB__CREATECHAN) {
          char msg[20];
          sprintf(msg, "Slot %d", i);
          MsgWindow::message(
              'W', "Unexpected datatype, channel not created, ", msg);
        }

        // Create the channels
        if (EVEN(ldh_GetChild(ctx->ldhses, slot->module_oid, &oid))) {
          unsigned int chan_cnt = 0;
          for (unsigned int j = 0; j < input_vect.size(); j++) {
            char name[80];
            sprintf(name, "Ch%02u", chan_cnt++);
            sts = ldh_CreateObject(ctx->ldhses, &oid, name, input_vect[j].cid,
                slot->module_oid, ldh_eDest_IntoLast);
            if (EVEN(sts))
              goto return_now;

            pwr_tAttrRef aaref;
            pwr_tAttrRef chanaref = cdh_ObjidToAref(oid);

            // Set Representation
            pwr_tEnum representation = input_vect[j].representation;
            sts = ldh_ArefANameToAref(
                ctx->ldhses, &chanaref, "Representation", &aaref);
            if (EVEN(sts))
              goto return_now;

            sts = ldh_WriteAttribute(
                ctx->ldhses, &aaref, &representation, sizeof(representation));
            if (EVEN(sts))
              goto return_now;

            // Set Number
            pwr_tUInt16 number = input_vect[j].number;
            sts = ldh_ArefANameToAref(ctx->ldhses, &chanaref, "Number", &aaref);
            if (EVEN(sts))
              goto return_now;

            sts = ldh_WriteAttribute(
                ctx->ldhses, &aaref, &number, sizeof(number));
            if (EVEN(sts))
              goto return_now;

            // Set Description
            pwr_tString80 description;
            strncpy(
                description, input_vect[j].description, sizeof(description));
            sts = ldh_ArefANameToAref(
                ctx->ldhses, &chanaref, "Description", &aaref);
            if (EVEN(sts))
              goto return_now;

            sts = ldh_WriteAttribute(
                ctx->ldhses, &aaref, description, sizeof(description));
            if (EVEN(sts))
              goto return_now;
          }
          for (unsigned int j = 0; j < output_vect.size(); j++) {
            char name[80];
            sprintf(name, "Ch%02u", chan_cnt++);
            sts = ldh_CreateObject(ctx->ldhses, &oid, name, output_vect[j].cid,
                slot->module_oid, ldh_eDest_IntoLast);
            if (EVEN(sts))
              goto return_now;

            pwr_tAttrRef aaref;
            pwr_tAttrRef chanaref = cdh_ObjidToAref(oid);

            // Set Representation
            pwr_tEnum representation = output_vect[j].representation;
            sts = ldh_ArefANameToAref(
                ctx->ldhses, &chanaref, "Representation", &aaref);
            if (EVEN(sts))
              goto return_now;

            sts = ldh_WriteAttribute(
                ctx->ldhses, &aaref, &representation, sizeof(representation));
            if (EVEN(sts))
              goto return_now;

            // Set Number
            pwr_tUInt16 number = output_vect[j].number;
            sts = ldh_ArefANameToAref(ctx->ldhses, &chanaref, "Number", &aaref);
            if (EVEN(sts))
              goto return_now;

            sts = ldh_WriteAttribute(
                ctx->ldhses, &aaref, &number, sizeof(number));
            if (EVEN(sts))
              goto return_now;

            // Set Description
            pwr_tString80 description;
            strncpy(
                description, output_vect[j].description, sizeof(description));
            sts = ldh_ArefANameToAref(
                ctx->ldhses, &chanaref, "Description", &aaref);
            if (EVEN(sts))
              goto return_now;

            sts = ldh_WriteAttribute(
                ctx->ldhses, &aaref, description, sizeof(description));
            if (EVEN(sts))
              goto return_now;
          }
        }
      } else {
        // Remove existing channels
        std::vector<pwr_tOid> chanvect;
        pwr_tCid cid;

        for (sts = ldh_GetChild(ctx->ldhses, slot->module_oid, &oid); ODD(sts);
             sts = ldh_GetNextSibling(ctx->ldhses, oid, &oid)) {
          sts = ldh_GetObjectClass(ctx->ldhses, oid, &cid);
          if (EVEN(sts))
            goto return_now;

          switch (cid) {
          case pwr_cClass_ChanDi:
          case pwr_cClass_ChanDo:
          case pwr_cClass_ChanAi:
          case pwr_cClass_ChanAo:
          case pwr_cClass_ChanIi:
          case pwr_cClass_ChanIo:
            chanvect.push_back(oid);
            break;
          default:;
          }
        }
        for (unsigned int i = 0; i < chanvect.size(); i++) {
          sts = ldh_DeleteObject(ctx->ldhses, chanvect[i]);
          if (EVEN(sts))
            goto return_now;
        }
      }
    }
  }

  // Write data of all devices for profinet viewer
  // Data is device name, IP and MAC address
  sts = generate_viewer_data(ctx);

  sts = rsts;

return_now:
  ((WNav*)ctx->editor_ctx)->reset_nodraw();
  return sts;
}
예제 #20
0
/*----------------------------------------------------------------------------*\
  
\*----------------------------------------------------------------------------*/
static pwr_tStatus IoCardRead (
  io_tCtx	ctx,
  io_sAgent	*ap,
  io_sRack	*rp,
  io_sCard	*cp  
) 
{
  io_sLocal 		*local;
  io_sRackLocal		*r_local = (io_sRackLocal *)(rp->Local);
  pwr_tInt16		data = 0;
  pwr_sClass_Ssab_BaseACard *op;
  pwr_sClass_Ssab_RemoteRack	*rrp;
  int			i;
  pwr_tFloat32		actvalue;
  io_sChannel		*chanp;
  pwr_sClass_ChanAi	*cop;
  pwr_sClass_Ai		*sop;
  int			sts;
  qbus_io_read 		rb;
  int			bfb_error = 0;

  local = (io_sLocal *) cp->Local;
  op = (pwr_sClass_Ssab_BaseACard *) cp->op;

  chanp = &cp->chanlist[0];
  for ( i = 0; i < cp->ChanListSize; i++)
  { 
    if ( !chanp->cop || !chanp->sop)
    {
      chanp++;
      continue;
    }
    cop = (pwr_sClass_ChanAi *) chanp->cop;
    sop = (pwr_sClass_Ai *) chanp->sop;

    if ( cop->CalculateNewCoef)
      AiRangeToCoef( chanp);

    if ( cop->ConversionOn)
    {
      if ( local->ScanCount[i] <= 1)
      {

#if defined(OS_ELN)
        vaxc$establish(machfailread);
#endif
        if (r_local->Qbus_fp != 0 && r_local->s == 0) {
          rb.Address = local->Address + 2*i;
          sts = read( local->Qbus_fp, &rb, sizeof(rb));
          data = (unsigned short) rb.Data;
	}
        else {
          /* Ethernet I/O, Get data from current address */
          data = bfbeth_get_data(r_local, (pwr_tUInt16) (local->Address + 2*i), &sts);
          /* Yes, we want to read this address the next time aswell */
          bfbeth_set_read_req(r_local, (pwr_tUInt16) (local->Address + 2*i));	 

          if (sts == -1) {
	    /* Error handling for ethernet Qbus-I/O */
  	    rrp = (pwr_sClass_Ssab_RemoteRack *) rp->op;
	    if (bfb_error == 0) {
              op->ErrorCount++;
	      bfb_error = 1;
              if ( op->ErrorCount == op->ErrorSoftLimit) {
                errh_Error( "IO Error soft limit reached on card '%s'", cp->Name);
		ctx->IOHandler->CardErrorSoftLimit = 1;
		ctx->IOHandler->ErrorSoftLimitObject = cdh_ObjidToAref( cp->Objid);
	      }
              if ( op->ErrorCount == op->ErrorHardLimit) {
                errh_Error( "IO Error hard limit reached on card '%s', stall action %d", cp->Name, rrp->StallAction);
		ctx->IOHandler->CardErrorHardLimit = 1;
		ctx->IOHandler->ErrorHardLimitObject = cdh_ObjidToAref( cp->Objid);
	      }
              if ( op->ErrorCount >= op->ErrorHardLimit && rrp->StallAction == pwr_eSsabStallAction_ResetInputs )
	      {
	        data = 0;
	        sts = 1;
              }
              if ( op->ErrorCount >= op->ErrorHardLimit && rrp->StallAction == pwr_eSsabStallAction_EmergencyBreak )
	      {
                ctx->Node->EmergBreakTrue = 1;
                return IO__ERRDEVICE;
              }
	    }
	    if (sts == -1) {
	      chanp++;
	      continue;
	    }
          }
          else {
	    op->ErrorCount = 0;
          }
        }
	
        if ( sts == -1)
	/* Error handling for local Qbus-I/O */
        {
#if 0
          /* Exceptionhandler was called */
          if ( io_fatal_error)
          {
            /* Activate emergency break */
            errh_Error( "Fatal read error, card '%s', IO is stopped", cp->Name);
            ctx->Node->EmergBreakTrue = 1;
            return IO__ERRDEVICE;
          }
#endif
          /* Increase error count and check error limits */
	  op->ErrorCount++;

          if ( op->ErrorCount == op->ErrorSoftLimit) {
            errh_Error( "IO Error soft limit reached on card '%s'", cp->Name);
	    ctx->IOHandler->CardErrorSoftLimit = 1;
	    ctx->IOHandler->ErrorSoftLimitObject = cdh_ObjidToAref( cp->Objid);
	  }
          if ( op->ErrorCount >= op->ErrorHardLimit)
          {
            errh_Error( "IO Error hard limit reached on card '%s', IO stopped", cp->Name);
            ctx->Node->EmergBreakTrue = 1;
	    ctx->IOHandler->CardErrorHardLimit = 1;
	    ctx->IOHandler->ErrorHardLimitObject = cdh_ObjidToAref( cp->Objid);
            return IO__ERRDEVICE;
          }
	  chanp++;
          continue;
        }
	
        /* Convert rawvalue to sigvalue and actualvalue */
	sop->RawValue = data;
        sop->SigValue = data * cop->SigValPolyCoef1 + cop->SigValPolyCoef0;
	switch ( chanp->ChanClass)
        {
          case pwr_cClass_ChanAi:
	    io_ConvertAi( cop, data, &actvalue);
	    break;
          case pwr_cClass_ChanAit:
	    io_ConvertAit( (pwr_sClass_ChanAit *) cop, data, &actvalue);
	    break;
	}

        /* Filter */
	if ( sop->FilterType == 1 &&
	   sop->FilterAttribute[0] > 0 &&
	   sop->FilterAttribute[0] > ctx->ScanTime)
        {
	  actvalue = *(pwr_tFloat32 *)chanp->vbp +
	  ctx->ScanTime / sop->FilterAttribute[0] *
	  (actvalue - *(pwr_tFloat32 *)chanp->vbp);
        }

	*(pwr_tFloat32 *) chanp->vbp = actvalue;
        local->ScanCount[i] = cop->ScanInterval + 1;
	  
      }
      local->ScanCount[i]--;
    }
    chanp++;
  }

  /* Fix for qbus errors */
  local->ErrScanCnt++;
  if ( local->ErrScanCnt >= local->ErrReset) {
    local->ErrScanCnt = 0;
    if ( op->ErrorCount > op->ErrorSoftLimit)
      op->ErrorCount--;
  }

  return 1;
}
예제 #21
0
/*----------------------------------------------------------------------------*\
  
\*----------------------------------------------------------------------------*/
static pwr_tStatus IoCardRead (
  io_tCtx	ctx,
  io_sAgent	*ap,
  io_sRack	*rp,
  io_sCard	*cp  
) 
{
  io_sLocal 		*local;
  pwr_sClass_Ssab_PIDuP *op;
  int			sts, ii;
  card_stat             c_stat;
  unsigned short        *datap;
  unsigned short        diff;

  local = (io_sLocal *) cp->Local;
  op = (pwr_sClass_Ssab_PIDuP *) cp->op;

  sts = ssabpid_read(0, &local->Istat[0], local);
  if (sts != -1) {
    sts = ssabpid_read(1, &local->Istat[1], local);
  }

  if (sts == -1) {
    op->ErrorCount++;
    local->Valid = 0;
  } else local->Valid = 1;

  diff = local->Istat[0] ^ local->Istat[1];

  memset(&c_stat, 0, sizeof(c_stat));

  if (local->Valid && (diff & act_dat_mask)) {
    for (ii = local->stat_ind, datap = (unsigned short *) &c_stat; ii < local->ran_ind; ii++, datap++) {

      sts = ssabpid_read(ii, datap, local);

      if ( sts == -1) {
        /* Increase error count and check error limits */
	op->ErrorCount++;

        if ( op->ErrorCount == op->ErrorSoftLimit) {
          errh_Error( "IO Error soft limit reached on card '%s'", cp->Name);
	  ctx->IOHandler->CardErrorSoftLimit = 1;
	  ctx->IOHandler->ErrorSoftLimitObject = cdh_ObjidToAref( cp->Objid);
	}
        continue;
      }
    } 

    /* Move data to PidX-object */

    swap_word((unsigned int *) &local->objP->ProcVal, (unsigned int *) &c_stat.ProcVal);
    swap_word((unsigned int *) &local->objP->PosVal, (unsigned int *) &c_stat.PosVal);
    swap_word((unsigned int *) &local->objP->OutVal, (unsigned int *) &c_stat.OutVal);
    swap_word((unsigned int *) &local->objP->ControlDiff, (unsigned int *) &c_stat.ControlDiff);
    if (local->objP->BiasGain != 0) swap_word((unsigned int *) &local->objP->Bias, (unsigned int *) &c_stat.Bias);
    local->objP->EndMin = c_stat.EndMin;
    local->objP->EndMax = c_stat.EndMax;
//    local->objP->ScanTime = c_stat.ScanTime;

    local->Istat[0] ^= act_dat_mask;

  }

  if ( op->ErrorCount >= op->ErrorHardLimit)
  {
     errh_Error( "IO Error hard limit reached on card '%s', IO stopped", cp->Name);
     ctx->Node->EmergBreakTrue = 1;
     ctx->IOHandler->CardErrorHardLimit = 1;
     ctx->IOHandler->ErrorHardLimitObject = cdh_ObjidToAref( cp->Objid);
     return IO__ERRDEVICE;
  }

  return 1;
}
예제 #22
0
static pwr_tStatus xtt_pb_dp_slave_load_modules( xtt_slave_sCtx *ctx)
{
  pwr_tOid oid;
  pwr_tCid cid;
  int found;
  pwr_tObjName name;
  pwr_tString40 module_name;
  int sts;
  pwr_tAttrRef maref, aaref;

  for ( sts = gdh_GetChild( ctx->aref.Objid, &oid);
	ODD(sts);
	sts = gdh_GetNextSibling( oid, &oid)) {

    // Check that this is a module
    sts = gdh_GetObjectClass( oid, &cid);
    if ( EVEN(sts)) return sts;

    found = 0;
    for ( int i = 0; ; i++) {
      if ( ctx->gsd->module_classlist[i].cid == 0)
	break;
      if ( ctx->gsd->module_classlist[i].cid == cid) {
	found = 1;
	break;
      }
    }
    if ( !found)
      // This is not a known module object
      continue;

    // Get name
    sts = gdh_ObjidToName( oid, name, sizeof(name), cdh_mName_object);
    if ( EVEN(sts)) return sts;

    maref = cdh_ObjidToAref( oid);

    // Get ModuleName attribute
    sts = gdh_ArefANameToAref( &maref, "ModuleName", &aaref);
    if ( EVEN(sts)) return sts;
      
    sts = gdh_GetObjectInfoAttrref( &aaref, module_name, sizeof(module_name));
    if ( EVEN(sts)) return sts;

    ctx->gsd->add_module_conf( cid, oid, name, module_name);
  }

  // Set address
  pwr_tUInt16 address;
  
  sts = gdh_ArefANameToAref( &ctx->aref, "SlaveAddress", &aaref);
  if ( EVEN(sts)) return sts;

  sts = gdh_GetObjectInfoAttrref( &aaref, &address, sizeof(address));
  if ( EVEN(sts)) return sts;

  ctx->gsd->address = address;

  // Set byte order
  pwr_tByteOrderingEnum byte_order;
  
  sts = gdh_ArefANameToAref( &ctx->aref, "ByteOrdering", &aaref);
  if ( EVEN(sts)) return sts;

  sts = gdh_GetObjectInfoAttrref( &aaref, &byte_order, sizeof(byte_order));
  if ( EVEN(sts)) return sts;

  ctx->gsd->byte_order = byte_order;

  // Set Ext_User_Prm_Data
  pwr_tUInt8 prm_user_data[256];
  pwr_tUInt16 prm_user_data_len;
  int len;
  
  sts = gdh_ArefANameToAref( &ctx->aref, "PrmUserData", &aaref);
  if ( EVEN(sts)) return sts;

  sts = gdh_GetObjectInfoAttrref( &aaref, prm_user_data, sizeof(prm_user_data));
  if ( EVEN(sts)) return sts;

  sts = gdh_ArefANameToAref( &ctx->aref, "PrmUserDataLen", &aaref);
  if ( EVEN(sts)) return sts;

  sts = gdh_GetObjectInfoAttrref( &aaref, &prm_user_data_len, sizeof(prm_user_data_len));
  if ( EVEN(sts)) return sts;

  len = prm_user_data_len;
  if ( len != 0) {
    sts = ctx->gsd->unpack_ext_user_prm_data( (char *)prm_user_data, len);
    if ( EVEN(sts)) return sts;
  }
  return 1;
}
예제 #23
0
static pwr_tStatus IoCardRead( io_tCtx ctx,
			       io_sAgent *ap,
			       io_sRack	*rp,
			       io_sCard	*cp)
{
  io_sLocalUSB_Joystick *local = (io_sLocalUSB_Joystick *)cp->Local;
  pwr_sClass_USB_Joystick *op = (pwr_sClass_USB_Joystick *)cp->op;
  struct js_event js;
  int idx;
  int value;


  while ( read( local->fd, &js, sizeof(struct js_event)) == sizeof(struct js_event))  {
    // printf("Event: type %d, time %d, number %d, value %d\n", js.type, js.time, js.number, js.value);

    switch ( js.type) {
    case 129:
    case 1:
      /* Buttons */
      idx = js.number;

      if ( js.number < KEY_MAX - BTN_MISC)
	idx = local->button_map[js.number];
      else
	break;
	  
      *(pwr_tBoolean *)cp->chanlist[idx].vbp = (js.value != 0);

      break;
    case 130:
    case 2: {
      io_sChannel *chanp;
      pwr_sClass_ChanAi *cop;
      pwr_sClass_Ai *sop;
      pwr_tFloat32 actvalue;
      int ivalue;

      /* Axes */
      idx = js.number;
      value = js.value;

      if ( js.number < ABS_MAX) {
	idx = local->axis_map[js.number];
	ivalue = js.value;
      }
      else
	break;
      
      chanp = &cp->chanlist[idx];
      cop = (pwr_sClass_ChanAi *)chanp->cop;
      sop = (pwr_sClass_Ai *)chanp->sop;

      if ( cop->CalculateNewCoef)
	// Request to calculate new coefficients
	io_AiRangeToCoef( chanp);

      io_ConvertAi( cop, ivalue, &actvalue);

      // Filter
      if ( sop->FilterType == 1 &&
	   sop->FilterAttribute[0] > 0 &&
	   sop->FilterAttribute[0] > ctx->ScanTime) {
	actvalue = *(pwr_tFloat32 *)chanp->vbp + ctx->ScanTime / sop->FilterAttribute[0] *
	  (actvalue - *(pwr_tFloat32 *)chanp->vbp);
      }

      *(pwr_tFloat32 *)chanp->vbp = actvalue;
      sop->SigValue = cop->SigValPolyCoef1 * ivalue + cop->SigValPolyCoef0;
      sop->RawValue = ivalue;
      
      break;
    }
    }
  }
    
  if (errno != EAGAIN) {
    op->ErrorCount++;
  }

  if ( op->ErrorCount == op->ErrorSoftLimit) {
    errh_Warning( "IO Card ErrorSoftLimit reached, '%s'", cp->Name);
    ctx->IOHandler->CardErrorSoftLimit = 1;
    ctx->IOHandler->ErrorSoftLimitObject = cdh_ObjidToAref( cp->Objid);
  }
  if ( op->ErrorCount >= op->ErrorHardLimit) {
    errh_Error( "IO Card ErrorHardLimit reached '%s', IO stopped", cp->Name);
    ctx->Node->EmergBreakTrue = 1;
    ctx->IOHandler->CardErrorHardLimit = 1;
    ctx->IOHandler->ErrorHardLimitObject = cdh_ObjidToAref( cp->Objid);
    return IO__ERRDEVICE;
  }    

  return IO__SUCCESS;
}
예제 #24
0
int main (int argc, char **argv)
{
  pwr_tStatus sts;
  char *c;
  int cidopt = 0;
  pwr_tObjName cidstr;
  pwr_tAName astr;
  int i;

  if ( argc <= 1) {
    usage();
    exit(1);
  }

  sts = gdh_Init("rt_gdhget");
  if ( EVEN(sts)) {
    exit(sts);
  }

  for ( i = 1; i < argc; i++) {
    c = argv[i];
    if ( *c == '-') {
      c++;
      switch ( *c) {
      case 'h':
	usage();
	exit(0);
     
      case 'c':
	if ( argc <= i+1) {
	  usage();
	  exit(1);
	}
	strncpy( cidstr, argv[i+1], sizeof(cidstr));
	cidopt = 1;
	i++;
	break;
      }
    }
    else
      strcpy( astr, argv[i]);
  }
  
  if ( cidopt) {
    // Get the first object of class cidstr, and print the value of attribute 
    // astr in this object

    pwr_tCid cid;
    pwr_tOid oid;
    pwr_tAttrRef aref, aaref;
    pwr_tTid a_tid;
    unsigned int a_size, a_offs, a_dim;
    void *a_valp;
    char str[256];

    sts = gdh_ClassNameToId( cidstr, &cid);
    if ( EVEN(sts)) {
      exit(sts);
    }

    sts = gdh_GetClassList( cid, &oid);
    if ( EVEN(sts)) {
      exit(sts);
    }

    aref = cdh_ObjidToAref( oid);
    sts = gdh_ArefANameToAref( &aref, astr, &aaref);
    if ( EVEN(sts)) {
      exit(sts);
    }

    sts = gdh_GetAttributeCharAttrref( &aaref, &a_tid, &a_size, &a_offs, &a_dim);
    if ( EVEN(sts)) {
      exit(sts);
    }
    a_valp = calloc( 1, a_size);
    sts = gdh_GetObjectInfoAttrref( &aaref, a_valp, a_size);
    if ( EVEN(sts)) {
      free( a_valp);
      exit(sts);
    }
    
    sts = cdh_AttrValueToString( a_tid, a_valp, str, sizeof(str));
    if ( EVEN(sts)) {
      free( a_valp);
      exit(sts);
    }

    printf( "%s\n", str);
    free( a_valp);

    exit(0);

  }
  else {
    // Print the value of the attriute in astr

    pwr_tTypeId a_tid;
    pwr_tUInt32 a_size, a_offs, a_elem;
    void *a_valp;
    char str[256];
    
    sts = gdh_GetAttributeCharacteristics( astr,
					 &a_tid, &a_size, &a_offs, &a_elem);
    if ( EVEN(sts)) {
      exit(sts);
    }
    a_valp = calloc( 1, a_size);

    sts = gdh_GetObjectInfo( astr, a_valp, a_size);
    if ( EVEN(sts)) {
      free( a_valp);
      exit(sts);
    }
    
    sts = cdh_AttrValueToString( a_tid, a_valp, str, sizeof(str));
    if ( EVEN(sts)) {
      free( a_valp);
      exit(sts);
    }

    printf( "%s\n", str);
    free( a_valp);

    exit(0);
  }    
  exit(1);
}
예제 #25
0
/*----------------------------------------------------------------------------*\
  
\*----------------------------------------------------------------------------*/
static pwr_tStatus IoCardWrite (
  io_tCtx	ctx,
  io_sAgent	*ap,
  io_sRack	*rp,
  io_sCard	*cp  
) 
{
  io_sLocal 		*local;
  pwr_sClass_Ssab_PIDuP	*op;
  int			ii;
  int			sts;
  unsigned short        diff;
  card_dyn		c_dyn;
  card_par		c_par;
  int			paramc = 0;		
  int			dynparc = 0;	
  unsigned short	*datap;		

  local = (io_sLocal *) cp->Local;
  op = (pwr_sClass_Ssab_PIDuP *) cp->op;

  if (!local->Valid) return 1;

  diff = local->Istat[0] ^ local->Istat[1];

  if (diff & setup_req_mask) paramc = 1, dynparc = 1;

  /* Check if static parameters has changed */
  if ((local->objP->PidAlg != local->Par.PidAlg) ||
      (local->objP->Inverse != local->Par.Inverse) ||
      (local->objP->PidGain != local->Par.PidGain) ||
      (local->objP->IntTime != local->Par.IntTime) ||
      (local->objP->DerTime != local->Par.DerTime) ||
      (local->objP->DerGain != local->Par.DerGain) ||
      (local->objP->BiasGain != local->Par.BiasGain) ||
      (local->objP->MinOut != local->Par.MinOut) ||
      (local->objP->MaxOut != local->Par.MaxOut) ||
      (local->objP->EndHys != local->Par.EndHys) ||
      (local->objP->ProcFiltTime != local->Par.ProcFiltTime) ||
      (local->objP->ProcMax != local->ProcRange.Max) ||
      (local->objP->ProcMin != local->ProcRange.Min) ||
      (local->objP->AoMax != local->AoRange.Max) ||
      (local->objP->AoMin != local->AoRange.Min) ||
      (local->Par.inc3pGain != local->objP->Inc3pGain) ||
      (local->Par.MinTim != local->objP->MinTim) ||
      (local->Par.MaxTim != local->objP->MaxTim) ||
      (local->Par.MaxInteg != local->objP->MaxInteg)) paramc = 1;

  /* Check if dynamic parameters has changed */
  if ((local->objP->SetVal != local->Dyn.SetVal) ||
      (local->objP->Bias != local->Dyn.BiasD) ||
      (local->objP->ForcVal != local->Dyn.ForcVal) ||
      (local->objP->IntOff != local->Dyn.IntOff) ||
      (local->objP->Force != local->Dyn.Force)) dynparc = 1;

  /* Move parameters to local */
  if (paramc && ((diff & setup_mask) == 0)) {

    local->Par.inc3pGain = local->objP->Inc3pGain;
    local->Par.MinTim = local->objP->MinTim;
    local->Par.MaxTim = local->objP->MaxTim;
    local->Par.MaxInteg = local->objP->MaxInteg;

    local->ProcRange.Max = local->objP->ProcMax;
    local->ProcRange.Min = local->objP->ProcMin;
    local->ProcRange.RawMax = local->objP->ProcRawMax;
    local->ProcRange.RawMin = local->objP->ProcRawMin;
    if (local->ProcRange.RawMax != local->ProcRange.RawMin) {
      local->Par.AVcoeff[0] = (local->ProcRange.Max - local->ProcRange.Min) /
		(local->ProcRange.RawMax - local->ProcRange.RawMin);
      local->Par.AVcoeff[1] = local->ProcRange.Min -
		local->ProcRange.RawMin * local->Par.AVcoeff[0];
    }
    local->BiasRange.Max = local->objP->BiasMax;
    local->BiasRange.Min = local->objP->BiasMin;
    local->BiasRange.RawMax = local->objP->BiasRawMax;
    local->BiasRange.RawMin = local->objP->BiasRawMin;
    if (local->BiasRange.RawMax != local->BiasRange.RawMin) {
      local->Par.BVcoeff[0] = (local->BiasRange.Max - local->BiasRange.Min) /
		(local->BiasRange.RawMax - local->BiasRange.RawMin);
      local->Par.BVcoeff[1] = local->BiasRange.Min -
		local->BiasRange.RawMin * local->Par.BVcoeff[0];
    }
    local->AoRange.Max = local->objP->AoMax;
    local->AoRange.Min = local->objP->AoMin;
    local->AoRange.RawMax = local->objP->AoRawMax;
    local->AoRange.RawMin = local->objP->AoRawMin;
    if (local->AoRange.Max != local->AoRange.Min)
    {
      local->Par.OVcoeff[0] = (local->AoRange.RawMax - local->AoRange.RawMin) /
		(local->AoRange.Max - local->AoRange.Min);
      local->Par.OVcoeff[1] = local->AoRange.RawMin -
		local->AoRange.Min * local->Par.OVcoeff[0];
    }
    local->PosRange.Max = local->objP->PosMax;
    local->PosRange.Min = local->objP->PosMin;
    local->PosRange.RawMax = local->objP->PosRawMax;
    local->PosRange.RawMin = local->objP->PosRawMin;
    if (local->PosRange.RawMax != local->PosRange.RawMin) {
      local->Par.PVcoeff[0] = (local->PosRange.Max - local->PosRange.Min) /
		(local->PosRange.RawMax - local->PosRange.RawMin);
      local->Par.PVcoeff[1] = local->PosRange.Min -
		local->PosRange.RawMin * local->Par.PVcoeff[0];
    }

    local->Par.PidAlg = local->objP->PidAlg;
    local->Par.Inverse = local->objP->Inverse;
    local->Par.PidGain = local->objP->PidGain;
    local->Par.IntTime = local->objP->IntTime;
    local->Par.DerTime = local->objP->DerTime;
    local->Par.DerGain = local->objP->DerGain;
    local->Par.BiasGain = local->objP->BiasGain;
    local->Par.MinOut = local->objP->MinOut;
    local->Par.MaxOut = local->objP->MaxOut;
    local->Par.EndHys = local->objP->EndHys;
    local->Par.ErrSta = local->objP->ErrSta;
    local->Par.ErrSto = local->objP->ErrSto;
    local->Par.pos3pGain = local->objP->Pos3pGain;
    local->Par.ProcFiltTime = local->objP->ProcFiltTime;
    local->Par.BiasFiltTime = local->objP->BiasFiltTime;
    local->Par.PosFiltTime = local->objP->PosFiltTime;

    /* Write parameters to card */
    c_par.PidAlg = local->Par.PidAlg;
    c_par.Inverse = local->Par.Inverse;
    swap_word((unsigned int *) &c_par.inc3pGain, (unsigned int *) &local->Par.inc3pGain);
    swap_word((unsigned int *) &c_par.MinTim, (unsigned int *) &local->Par.MinTim);
    swap_word((unsigned int *) &c_par.MaxTim, (unsigned int *) &local->Par.MaxTim);
    swap_word((unsigned int *) &c_par.MaxInteg, (unsigned int *) &local->Par.MaxInteg);
    swap_word((unsigned int *) &c_par.AVcoeff[0], (unsigned int *) &local->Par.AVcoeff[0]);
    swap_word((unsigned int *) &c_par.AVcoeff[1], (unsigned int *) &local->Par.AVcoeff[1]);
    swap_word((unsigned int *) &c_par.BVcoeff[0], (unsigned int *) &local->Par.BVcoeff[0]);
    swap_word((unsigned int *) &c_par.BVcoeff[1], (unsigned int *) &local->Par.BVcoeff[1]);
    swap_word((unsigned int *) &c_par.OVcoeff[0], (unsigned int *) &local->Par.OVcoeff[0]);
    swap_word((unsigned int *) &c_par.OVcoeff[1], (unsigned int *) &local->Par.OVcoeff[1]);
    swap_word((unsigned int *) &c_par.PidGain, (unsigned int *) &local->Par.PidGain);
    swap_word((unsigned int *) &c_par.IntTime, (unsigned int *) &local->Par.IntTime);
    swap_word((unsigned int *) &c_par.DerTime, (unsigned int *) &local->Par.DerTime);
    swap_word((unsigned int *) &c_par.DerGain, (unsigned int *) &local->Par.DerGain);
    swap_word((unsigned int *) &c_par.BiasGain, (unsigned int *) &local->Par.BiasGain);
    swap_word((unsigned int *) &c_par.MinOut, (unsigned int *) &local->Par.MinOut);
    swap_word((unsigned int *) &c_par.MaxOut, (unsigned int *) &local->Par.MaxOut);
    swap_word((unsigned int *) &c_par.EndHys, (unsigned int *) &local->Par.EndHys);
    swap_word((unsigned int *) &c_par.PVcoeff[0], (unsigned int *) &local->Par.PVcoeff[0]);
    swap_word((unsigned int *) &c_par.PVcoeff[1], (unsigned int *) &local->Par.PVcoeff[1]);
    swap_word((unsigned int *) &c_par.ErrSta, (unsigned int *) &local->Par.ErrSta);
    swap_word((unsigned int *) &c_par.ErrSto, (unsigned int *) &local->Par.ErrSto);
    swap_word((unsigned int *) &c_par.pos3pGain, (unsigned int *) &local->Par.pos3pGain);
    swap_word((unsigned int *) &c_par.ProcFiltTime, (unsigned int *) &local->Par.ProcFiltTime);
    swap_word((unsigned int *) &c_par.BiasFiltTime, (unsigned int *) &local->Par.BiasFiltTime);
    swap_word((unsigned int *) &c_par.PosFiltTime, (unsigned int *) &local->Par.PosFiltTime);


    for (ii = local->par_ind, datap = (unsigned short *)&c_par; ii < local->stat_ind; ii++, datap++) {

      sts = ssabpid_write(ii, datap, local);

      if ( sts == -1) {
        /* Increase error count and check error limits */
	op->ErrorCount++;

        if ( op->ErrorCount == op->ErrorSoftLimit) {
          errh_Error( "IO Error soft limit reached on card '%s'", cp->Name);
	  ctx->IOHandler->CardErrorSoftLimit = 1;
	  ctx->IOHandler->ErrorSoftLimitObject = cdh_ObjidToAref( cp->Objid);
	}
        continue;
      }
    } 

    /* Update status word */
    if ((diff & setup_req_mask) != 0) local->Istat[0] ^= setup_req_mask;
    local->Istat[0] ^= setup_mask;

  } /* End - if new parameters */

  /* Send dynamic parameters ? */
  if (dynparc && ((diff & dyn_mask) == 0)) {

    /* Move parameters to local */

    local->Dyn.SetVal = local->objP->SetVal;
    local->Dyn.BiasD = local->objP->Bias;
    local->Dyn.ForcVal = local->objP->ForcVal;
    local->Dyn.IntOff = local->objP->IntOff;
    local->Dyn.Force = local->objP->Force;

    /* Write parameters to card */

    swap_word((unsigned int *) &c_dyn.SetVal, (unsigned int *) &local->Dyn.SetVal);
    swap_word((unsigned int *) &c_dyn.BiasD, (unsigned int *) &local->Dyn.BiasD);
    swap_word((unsigned int *) &c_dyn.ForcVal, (unsigned int *) &local->Dyn.ForcVal);
    c_dyn.Force = local->Dyn.Force;
    c_dyn.IntOff = local->Dyn.IntOff;

    for (ii = local->dyn_ind, datap = (unsigned short *)&c_dyn; ii < local->par_ind; ii++, datap++) {

      sts = ssabpid_write(ii, datap, local);

      if ( sts == -1) {
        /* Increase error count and check error limits */
	op->ErrorCount++;

        if ( op->ErrorCount == op->ErrorSoftLimit) {
          errh_Error( "IO Error soft limit reached on card '%s'", cp->Name);
	  ctx->IOHandler->CardErrorSoftLimit = 1;
	  ctx->IOHandler->ErrorSoftLimitObject = cdh_ObjidToAref( cp->Objid);
	}
        continue;
      }
    } 

    /* Update status word */
    local->Istat[0] ^= dyn_mask;
  } /* End if nya dyn par */

  /* Update status-word */
  local->Istat[0] &= typ_mask;
  local->Istat[0] |= ao_mask;
  if (local->objP->UseInc3p) local->Istat[0] |= inc3p_mask;
  if (local->objP->UsePos3p) local->Istat[0] |= pos3p_mask;
  if (local->objP->UseDynBias) local->Istat[0] |= dyn_bias_mask;
  if (local->objP->UseAo) local->Istat[0] |= stall_freeze_mask;
  else local->Istat[0] |= stall_cont_mask;

  datap = &local->Istat[0];

  sts = ssabpid_write(0, datap, local);

  if ( sts == -1)
    op->ErrorCount++;

  if ( op->ErrorCount >= op->ErrorHardLimit)
  {
     errh_Error( "IO Error hard limit reached on card '%s', IO stopped", cp->Name);
     ctx->Node->EmergBreakTrue = 1;
     ctx->IOHandler->CardErrorHardLimit = 1;
     ctx->IOHandler->ErrorHardLimitObject = cdh_ObjidToAref( cp->Objid);
     return IO__ERRDEVICE;
  }

  /* Fix for qbus errors */
  local->ErrScanCnt++;
  if ( local->ErrScanCnt >= local->ErrReset) {
    local->ErrScanCnt = 0;
    if ( op->ErrorCount > op->ErrorSoftLimit)
      op->ErrorCount--;
  }

  return 1;
  
}