/*----------------------------------------------------------------------------*\ Read method for the Pb Ai card \*----------------------------------------------------------------------------*/ static pwr_tStatus IoCardRead ( io_tCtx ctx, io_sAgent *ap, io_sRack *rp, io_sCard *cp ) { io_sCardLocal *local; pwr_sClass_Pb_Ai *op; io_sChannel *chanp; pwr_sClass_ChanAi *cop; pwr_sClass_Ai *sop; pwr_tInt16 data = 0; pwr_tUInt16 udata = 0; pwr_tFloat32 actvalue; int i; local = (io_sCardLocal *) cp->Local; op = (pwr_sClass_Pb_Ai *) cp->op; if (op->Status >= 1) { for (i=0; i<cp->ChanListSize; i++) { chanp = &cp->chanlist[i]; if (!chanp->cop) continue; cop = (pwr_sClass_ChanAi *) chanp->cop; sop = (pwr_sClass_Ai *) chanp->sop; if (cop->CalculateNewCoef) io_AiRangeToCoef(chanp); if (cop->ConversionOn) { if (local->scancount[i] <= 1) { memcpy(&udata, local->input_area + op->OffsetInputs + 2*i, 2); if (local->byte_swap == 1) udata = swap16(udata); data = (pwr_tInt16) udata; 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]--; } // if ...ConversionOn } // for } // if ...op->Status 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; }
static pwr_tStatus IoCardRead( io_tCtx ctx, io_sAgent *ap, io_sRack *rp, io_sCard *cp) { io_sLocal_K8055 *local = (io_sLocal_K8055 *)cp->Local; pwr_sClass_Velleman_K8055_Board *op = (pwr_sClass_Velleman_K8055_Board *)cp->op; unsigned char data[9]; char endpoint = 0x81; int size = 8; int tsize; unsigned char m; int sts; int i; pwr_tUInt32 error_count = op->Super.ErrorCount; // You have to read twice to get the latest ????? sts = libusb_interrupt_transfer( local->libusb_device, endpoint, data, 8, &tsize, 100); sts = libusb_interrupt_transfer( local->libusb_device, endpoint, data, 8, &tsize, 100); if ( sts != 0 || tsize != size) { op->Super.ErrorCount++; if ( sts != 0 && sts != last_usblib_sts) { errh_Error( "K8055 libusb transfer error %d", sts); last_usblib_sts = sts; } return IO__SUCCESS; } else { // Handle Ai for ( i = 0; i < 2; i++) { if ( cp->chanlist[i].sop) { io_sChannel *chanp = &cp->chanlist[i]; pwr_sClass_ChanAi *cop = (pwr_sClass_ChanAi *)chanp->cop; pwr_sClass_Ai *sop = (pwr_sClass_Ai *)chanp->sop; pwr_tFloat32 actvalue; int ivalue = data[i+2]; 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; } } // Handle Di for ( i = 0; i < 5; i++) { switch ( i) { case 0: m = 16; break; case 1: m = 32; break; case 2: m = 1; break; case 3: m = 64; break; case 4: m = 128; break; } if ( cp->chanlist[i+2].sop) *(pwr_tBoolean *)cp->chanlist[i+2].vbp = ((data[0] & m) != 0); } } if ( op->Super.ErrorCount >= op->Super.ErrorSoftLimit && error_count < op->Super.ErrorSoftLimit) { errh_Warning( "IO Card ErrorSoftLimit reached, '%s'", cp->Name); } if ( op->Super.ErrorCount >= op->Super.ErrorHardLimit) { errh_Error( "IO Card ErrorHardLimit reached '%s', IO stopped", cp->Name); ctx->Node->EmergBreakTrue = 1; return IO__ERRDEVICE; } return IO__SUCCESS; }
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; }