示例#1
0
/*----------------------------------------------------------------------------*\
   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;
}
示例#2
0
/*----------------------------------------------------------------------------*\
  
\*----------------------------------------------------------------------------*/
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;
}
示例#3
0
/*----------------------------------------------------------------------------*\

\*----------------------------------------------------------------------------*/
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;
}
示例#4
0
/*----------------------------------------------------------------------------*\
  
\*----------------------------------------------------------------------------*/
static pwr_tStatus IoCardRead (
  io_tCtx	ctx,
  io_sAgent	*ap,
  io_sRack	*rp,
  io_sCard	*cp  
) 
{
  io_sLocal 		*local;
  io_sRackLocal		*r_local = (io_sRackLocal *)(rp->Local);
  pwr_tInt16		data = 0;
  pwr_sClass_Ssab_BaseACard *op;
  pwr_sClass_Ssab_RemoteRack	*rrp;
  int			i;
  pwr_tFloat32		actvalue;
  io_sChannel		*chanp;
  pwr_sClass_ChanAi	*cop;
  pwr_sClass_Ai		*sop;
  int			sts;
  qbus_io_read 		rb;
  int			bfb_error = 0;
  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;
}