static pwr_tStatus IoCardInit ( io_tCtx ctx, io_sAgent *ap, io_sRack *rp, io_sCard *cp ) { pwr_sClass_Ai_AI32uP *op; io_sLocal *local; int i; io_sChannel *chanp; op = (pwr_sClass_Ai_AI32uP *) cp->op; local = calloc( 1, sizeof(*local)); cp->Local = local; local->Address = op->RegAddress; local->Qbus_fp = ((io_sRackLocal *)(rp->Local))->Qbus_fp; errh_Info( "Init of ai card '%s'", cp->Name); /* Caluclate polycoeff */ chanp = cp->chanlist; for ( i = 0; i < cp->ChanListSize; i++) { AiRangeToCoef( chanp); chanp++; } return 1; }
static pwr_tStatus IoCardInit ( io_tCtx ctx, io_sAgent *ap, io_sRack *rp, io_sCard *cp ) { pwr_sClass_Ssab_BaseACard *op; io_sLocal *local; int i; io_sChannel *chanp; op = (pwr_sClass_Ssab_BaseACard *) cp->op; local = calloc( 1, sizeof(*local)); cp->Local = local; local->Address = op->RegAddress; local->Qbus_fp = ((io_sRackLocal *)(rp->Local))->Qbus_fp; errh_Info( "Init of ai card '%s'", cp->Name); /* Caluclate polycoeff */ chanp = cp->chanlist; for ( i = 0; i < cp->ChanListSize; i++) { if ( chanp->sop) AiRangeToCoef( chanp); chanp++; } local->ErrReset = 1.0 / ctx->ScanTime + 0.5; if ( local->ErrReset < 2) local->ErrReset = 2; return 1; }
static pwr_tStatus IoCardInit ( io_tCtx ctx, io_sAgent *ap, io_sRack *rp, io_sCard *cp ) { pwr_tStatus sts; pwr_sClass_Ai_7436 *op; io_sLocal *local; int i; io_sChannel *chanp; op = (pwr_sClass_Ai_7436 *) cp->op; local = calloc( 1, sizeof(*local)); cp->Local = local; local->RackAddress = ((pwr_sClass_Rack_RTP *) rp->op)->RackAddress; local->Address = (op->CardAddress | 0xf0); /* Keep from being 0 */ errh_Info( "Init of ai card '%s'", cp->Name); /* Caluclate polycoeff */ chanp = cp->chanlist; for ( i = 0; i < cp->ChanListSize; i++) { local->CardType[i] = RTP_AI_7436; if ( op->DiffInput) local->CardType[i] |= RTP_DIFFR; local->CardType[i] |= (io_get_rtp_ai_gain( ((pwr_sClass_ChanAi *)chanp->cop)->ChannelSigValRangeHigh) << 12); AiRangeToCoef( chanp); chanp++; } for ( i = 0; i < cp->ChanListSize; i++) { sts = io_InitAiFilter( cp->chanlist[i].cop, cp->chanlist[i].sop, &local->FilterData[i], ctx->ScanTime); } return 1; }
/*----------------------------------------------------------------------------*\ \*----------------------------------------------------------------------------*/ static pwr_tStatus IoCardRead ( io_tCtx ctx, io_sAgent *ap, io_sRack *rp, io_sCard *cp ) { io_sLocal *local; pwr_tInt16 data = 0; pwr_sClass_Ai_AI32uP *op; int i; pwr_tFloat32 actvalue; io_sChannel *chanp; pwr_sClass_ChanAi *cop; pwr_sClass_Ai *sop; int sts; qbus_io_read rb; local = (io_sLocal *) cp->Local; op = (pwr_sClass_Ai_AI32uP *) cp->op; chanp = &cp->chanlist[0]; for ( i = 0; i < cp->ChanListSize; i++) { if ( !chanp->cop) { 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 rb.Address = local->Address + 2*i; sts = read( local->Qbus_fp, &rb, sizeof(rb)); data = (unsigned short) rb.Data; if ( sts == -1) { #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); if ( op->ErrorCount >= op->ErrorHardLimit) { errh_Error( "IO Error hard limit reached on card '%s', IO stopped", cp->Name); ctx->Node->EmergBreakTrue = 1; 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++; } return 1; }
/*----------------------------------------------------------------------------*\ \*----------------------------------------------------------------------------*/ static pwr_tStatus IoCardRead ( io_tCtx ctx, io_sAgent *ap, io_sRack *rp, io_sCard *cp ) { pwr_tStatus sts; io_sLocal *local; pwr_tUInt16 data = 0; pwr_sClass_Ai_7436 *op; int i; pwr_tFloat32 actvalue; pwr_tFloat32 *polycoef_p; io_sChannel *chanp; pwr_sClass_ChanAi *cop; pwr_sClass_Ai *sop; if ( cp->AgentControlled) return IO__SUCCESS; local = (io_sLocal *) cp->Local; op = (pwr_sClass_Ai_7436 *) cp->op; chanp = &cp->chanlist[0]; for ( i = 0; i < cp->ChanListSize; i++) { if ( !chanp->cop) { 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) { data = rtpai_read( local->RackAddress, (local->Address & 0xf), i, /* mask out fix bits */ local->CardType[i]); if (io_readerr || io_fatal_error) { /* 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; } /* 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); if ( op->ErrorCount >= op->ErrorHardLimit) { errh_Error( "IO Error hard limit reached on card '%s', IO stopped", cp->Name); ctx->Node->EmergBreakTrue = 1; return IO__ERRDEVICE; } chanp++; continue; } /* Convert rawvalue to sigvalue and actualvalue */ sop->RawValue = data; switch ( chanp->ChanClass) { case pwr_cClass_ChanAi: io_ConvertAi( cop, (pwr_tInt16) data, &actvalue); break; case pwr_cClass_ChanAit: io_ConvertAit( (pwr_sClass_ChanAit *) cop, (pwr_tInt16) data, &actvalue); break; } /* Filter */ sts = io_AiFilter( (void *) op, &actvalue, local->FilterData[i]); *(pwr_tFloat32 *) chanp->vbp = actvalue; local->ScanCount[i] = cop->ScanInterval + 1; } local->ScanCount[i]--; } chanp++; } return 1; }
/*----------------------------------------------------------------------------*\ \*----------------------------------------------------------------------------*/ 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; pwr_tTime now; 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); if ( op->ErrorCount == op->ErrorHardLimit) errh_Error( "IO Error hard limit reached on card '%s', stall action %d", cp->Name, rrp->StallAction); 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 */ time_GetTime( &now); if (op->ErrorCount > op->ErrorSoftLimit) { /* Ignore if some time has expired */ if (now.tv_sec - local->ErrTime.tv_sec < 600) op->ErrorCount++; } else op->ErrorCount++; local->ErrTime = now; if ( op->ErrorCount == op->ErrorSoftLimit) 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', IO stopped", cp->Name); ctx->Node->EmergBreakTrue = 1; 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++; } return 1; }