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; }
/*----------------------------------------------------------------------------*\ 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; }
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; }
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; }
/*----------------------------------------------------------------------------*\ 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; }
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()); } } }
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; } } }
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; }
/*----------------------------------------------------------------------------*\ \*----------------------------------------------------------------------------*/ 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; }
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; }
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; }
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; }
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; }
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; }
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, ¤tar); 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, ¤tar, 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( ¤tar, 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( ¤tar, ¤t_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, ¤tar); if ( EVEN(sts)) return sts; ip->ItemType = item_type; } } } } return XNAV__SUCCESS; }
/*----------------------------------------------------------------------------*\ \*----------------------------------------------------------------------------*/ 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; }
/*----------------------------------------------------------------------------*\ \*----------------------------------------------------------------------------*/ 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; }
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; } } } }
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; }
/*----------------------------------------------------------------------------*\ \*----------------------------------------------------------------------------*/ 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; }
/*----------------------------------------------------------------------------*\ \*----------------------------------------------------------------------------*/ 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; }
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; }
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; }
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); }
/*----------------------------------------------------------------------------*\ \*----------------------------------------------------------------------------*/ 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; }