Beispiel #1
0
pwr_tStatus
proc_Start (
  proc_sProcess *p
)
{
  pwr_tStatus sts = PROC__SUCCESS;
  char **argv;

  p->pid = fork();
  if (p->pid) {
    if (p->pid == -1) {
      errh_Error("Could not start %s, %m\nfile: %s", p->name, errno_GetStatus(), p->file);	
    } else {
      errh_Info("Started %s, prio: %d, pid: %d\nfile: %s", p->name, p->p_prio, (int)p->pid, p->file);	
    }
  } else {
    sts = proc_SetPriority(p->p_prio);
    if (EVEN(sts)) errh_Warning("%s: error setprio, %m\nfile: %s", p->name, sts, p->file);
    argv = co_StrToArgv(p->file, p->arg);
    execvp(p->file, argv);
    errh_Error("%s: error execvp, %m\nfile: %s", p->name, errno_GetStatus(), p->file);
    exit(EXIT_FAILURE);
  }

  return sts;
}
Beispiel #2
0
static gdb_sNode *
node (
  net_sMessage		*mp
)
{
  pwr_tStatus		sts;
  gdb_sNode		*np;

  if (mp->nid == pwr_cNNodeId) {
    errh_Error("Message from pwr_cNNodeId received");
    return NULL;
  }

  gdb_ScopeLock {
    np = hash_Search(&sts, gdbroot->nid_ht, &mp->nid);
  } gdb_ScopeUnlock;

  if (np == NULL) {
    errh_Error("Message about unknown node: (%s) received\n",
      cdh_NodeIdToString(NULL, mp->nid, 0, 0));
    return NULL;
  }
  
  return np;
}
Beispiel #3
0
static void *
receive (
  qcom_sQid		*qid,
  qcom_sGet		*get
)
{
  pwr_tStatus		sts;
  void			*mp;


  for (;;) {
    get->data = NULL;
    /* Loop until receiving a valid message.  */
    mp = qcom_Get(&sts, &qcom_cQnacp, get, qcom_cTmoEternal);
    if (mp == NULL) {
      errh_Error("qcom_Get, %m", sts);
      continue;
    }

    if (get->type.b == qcom_eBtype_event) {
        event(get);
        qcom_Free(&sts, mp);
	continue;
    }

    else if (get->type.b != net_cMsgClass) {
      errh_Error("Received bad message, type: <%d>, subtype: <%d>", get->type.b, get->type.s);
      qcom_Free(&sts, mp);
      continue;
    }

    return mp;
  }
}
Beispiel #4
0
static pwr_tBoolean
checkQ	(
  pool_sHead		*php,
  pool_sQlink		*item
)
{
  pool_sQlink		*link;

  if (item == NULL) {
    errh_Error("checkQ in pool: %s, item == NULL", php->gphp->name);
    return NO;
  }
  if (item->self == pool_cNRef) {
    errh_Error("checkQ in pool: %s, item->self == pool_cNRef, item: %u", php->gphp->name, item);
    return NO;
  }

  link = pool_Address(NULL, php, item->self);
  if (item != link) {
    errh_Error("checkQ in pool: %s, item != pool_Address(NULL, php, item->self),\n item: %u != %u",
      php->gphp->name, item, link);
    return NO;
  }

  return YES;
#if 0
  return item == pool_Address(NULL, php, item->self);
#endif
}
Beispiel #5
0
static void
create_thread (
  plc_sThread	*tp,
  plc_sProctbl	*ptp,
  plc_sProcess	*pp
)
{
  pwr_tStatus	sts;
  long int phase;

  tp->aref.Objid = ptp->thread;
  tp->init = ptp->init;
  tp->exec = ptp->exec;
  tp->first_scan = 1;

  tp->PlcThread = pwrb_PlcThread_Init(&sts, tp);
  tp->csup_lh = csup_Init(&sts, ptp->thread, tp->f_scan_time);

  tp->i_scan_time = tp->f_scan_time * 1000.0 + 0.5;

  time_FloatToD(&tp->scan_time, tp->f_scan_time);

  tp->pp = pp;
 
  plc_inittimer(tp);
  tp->exit = FALSE;
  link_io_copy_areas(tp);

  que_Create(&sts, &tp->q_in);
  que_Create(&sts, &tp->q_out);

  sts = gdh_ObjidToName(ptp->thread, tp->name, sizeof(tp->name), cdh_mNName);
  if (EVEN(sts)) {
    errh_Error("Get name of thread object %s, %m", cdh_ObjidToString(NULL, ptp->thread, 1), sts);
    return;
  }

  sts = gdh_ObjidToPointer(ptp->thread, (void *)&tp->PlcThread);
  if (EVEN(sts)) {
    errh_Error("Direct link to thread object \"%s\", %m", tp->name, sts);
    return;
  }

#if defined OS_LYNX && USE_RT_TIMER
  sem_init(&tp->ScanSem, 0, 0);
  tp->ScanMultiple = tp->i_scan_time / (CLK_TCK/1000);
  tp->IntervalCount = tp->ScanMultiple; 
#endif


  sts = thread_Create(&tp->tid, tp->name, (void *(*)())&plc_thread, tp);
  if (EVEN(sts)) {
    errh_Error("Creating thread \"%s\", %m", tp->name, sts);
    return;
  }

  /* Wait for thread to initialize.  */
  phase = (long int)que_Get(&sts, &tp->q_out, NULL, NULL);
  pwr_Assert(phase == 1);
}
Beispiel #6
0
static pwr_tStatus IoCardWrite( io_tCtx ctx,
				io_sAgent *ap,
				io_sRack	*rp,
				io_sCard	*cp)
{
  io_sLocalSPI_Slave *local = (io_sLocalSPI_Slave *)cp->Local;
  pwr_sClass_SPI_Slave *op = (pwr_sClass_SPI_Slave *)cp->op;
  int sts;
  int i;

  io_bus_card_write( ctx, cp, local->output_area,
		     local->byte_ordering, pwr_eFloatRepEnum_FloatIEEE);
    
  // sts = write( local->fd, local->output_area, local->output_area_size);
  for ( i = 0; i < local->output_area_size; i++) {
    sts = write( local->fd, &local->output_area[i], 1);
    if ( sts != 1)
      break;
  }
  if ( sts < 0) {
    op->ErrorCount++;
    if ( !local->writeerror_logged) {
      errh_Error( "SPI write error errno %d, '%s'", errno, cp->Name);
      local->writeerror_logged = 1;
    }
    op->Status = IOM__SPI_WRITEERROR;
  }
  // else if ( sts != local->output_area_size) {
  else if ( sts == 0) {
    op->ErrorCount++;
    if ( !local->writeerror_logged) {
      errh_Error( "SPI write buffer unexpected size %d, '%s'", sts, cp->Name);
      local->writeerror_logged = 1;
    }
    op->Status = IOM__SPI_WRITEERROR;
  }
  else {
    local->writeerror_logged = 0;
    op->Status = IOM__SPI_NORMAL;
  }

  if ( op->ErrorSoftLimit && 
       op->ErrorCount == op->ErrorSoftLimit && !local->softlimit_logged) {
    errh_Warning( "IO Card ErrorSoftLimit reached, '%s'", cp->Name);
    local->softlimit_logged = 1;
  }
  if ( op->ErrorHardLimit && op->ErrorCount >= op->ErrorHardLimit) {
    errh_Error( "IO Card ErrorHardLimit reached '%s', IO stopped", cp->Name);
    ctx->Node->EmergBreakTrue = 1;
    return IO__ERRDEVICE;
  }    

  return IO__SUCCESS;
}
Beispiel #7
0
static pwr_tStatus AoRangeToCoef( 
  io_sChannel 	*chanp)
{
  pwr_sClass_ChanAo	*cop;
  char			buf[120];
  pwr_tStatus		sts;
  int			i;
  pwr_tFloat32		PolyCoef1;
  pwr_tFloat32		PolyCoef0;

  cop = chanp->cop;

  if ( cop)
  {
    cop->CalculateNewCoef = 0;

    /* Coef for ActualValue to RawValue conversion */
    if ( cop->ActValRangeHigh != cop->ActValRangeLow)
    {
      cop->SigValPolyCoef1 = (cop->SensorSigValRangeHigh - cop->SensorSigValRangeLow)/
		(cop->ActValRangeHigh - cop->ActValRangeLow);
      cop->SigValPolyCoef0 = cop->SensorSigValRangeHigh - cop->ActValRangeHigh *
		cop->SigValPolyCoef1;
    }
    else
    {
      sts = gdh_ObjidToName( chanp->ChanObjid, buf, sizeof(buf), 
			cdh_mName_volumeStrict);
      if ( EVEN(sts)) return sts;
      errh_Error( "Invalid ActValueRange in Ao channel %s", buf);
      return IO__CHANRANGE;
    }
    /* Coef for ActualValue to SignalValue conversion */
    if ( cop->ChannelSigValRangeHigh != 0)
    {
      PolyCoef0 = 0;
      PolyCoef1 = 2047. / cop->ChannelSigValRangeHigh;
      cop->OutPolyCoef1 = cop->SigValPolyCoef1 * PolyCoef1;
      cop->OutPolyCoef0 = PolyCoef0 + PolyCoef1*
		cop->SigValPolyCoef0;
    }
    else
    {
      sts = gdh_ObjidToName( chanp->ChanObjid, buf, sizeof(buf), 
			cdh_mName_volumeStrict);
      if ( EVEN(sts)) return sts;
      errh_Error( "Invalid SigValueRange in Ao channel %s", buf);
      return IO__CHANRANGE;
    }
  }
  return IO__SUCCESS;
}
Beispiel #8
0
static void lockMountServers(gdb_sNode* np)
{
  pwr_tStatus sts;
  pool_sQlink* msl;
  pool_sQlink* vl;
  gdb_sVolume* vp;
  gdb_sMountServer* msp;
  gdb_sObject* op;

  gdb_AssumeLocked;

  for (vl = pool_Qsucc(NULL, gdbroot->pool, &np->own_lh); vl != &np->own_lh;
       vl = pool_Qsucc(NULL, gdbroot->pool, vl)) {
    vp = pool_Qitem(vl, gdb_sVolume, l.own_ll);

    if (vl->self == vl->flink) {
      /* Connection lost and volume removed from own list */
      errh_Error("Volume not owned any more, %s", vp->g.name.orig);
      return;
    }
    if (!vp->l.flags.b.isConnected) {
      /* !!! Todo !!! How do we make this known ?  */
      errh_Error("Volume not connected, %s", vp->g.name.orig);
      continue;
    }

    for (msl = pool_Qsucc(NULL, gdbroot->pool, &vp->l.volms_lh);
         msl != &vp->l.volms_lh; msl = pool_Qsucc(NULL, gdbroot->pool, msl)) {
      msp = pool_Qitem(msl, gdb_sMountServer, volms_ll);
      op = hash_Search(&sts, gdbroot->oid_ht, &msp->oid);
      if (op == NULL) {
        op = cvolc_OidToObject(
            &sts, vp, msp->oid, vol_mTrans_none, cvol_eHint_none);
        if (op == NULL) {
          errh_Error("Can't fetch the mount server's object, %s",
              cdh_ObjidToString(msp->oid, 0));
          /* !!! Todo !!! How do we make this error known ?  */
          continue;
        }
      }
      msp->msor = pool_ItemReference(NULL, gdbroot->pool, op);
      op->l.flags.b.isMountServer = 1;
      if (msp->nodms_ll.self == msp->nodms_ll.flink
          && msp->nodms_ll.self == msp->nodms_ll.blink)
        pool_QinsertPred(NULL, gdbroot->pool, &msp->nodms_ll, &np->nodms_lh);

      /* if (0)
        errh_Info("Locking object %s", op->g.f.name.orig); */
      cvolc_LockObject(&sts, op);
    }
  }
}
static bool status_check(pwr_sClass_Hilscher_cifX_PnController* op,
    io_sAgent* ap, int sts, const char* text)
{
  if (sts == CIFX_NO_ERROR)
    return true;

  xDriverGetErrorDescription(sts, op->ErrorStr, sizeof(op->ErrorStr));
  op->Status = sts;
  if (text)
    errh_Error("IO init %s, '%s', %s", ap->Name, op->ErrorStr, text);
  else
    errh_Error("IO init %s, '%s'", ap->Name, op->ErrorStr);
  return false;
}
/*----------------------------------------------------------------------------*\

\*----------------------------------------------------------------------------*/
static pwr_tStatus IoRackInitSwap(io_tCtx ctx, io_sAgent* ap, io_sRack* rp)
{
  io_sRackLocal* local;
  pwr_sClass_Ssab_RemoteRack* op;
  int sts;

  op = (pwr_sClass_Ssab_RemoteRack*)rp->op;
  local = calloc(1, sizeof(*local));
  rp->Local = local;

  /* Create socket, store in local struct */

  local->s = socket(AF_INET, SOCK_DGRAM, 0);
  if (local->s < 0) {
    errh_Error(
        "Error creating socket for IO remote rack %s, %d", rp->Name, local->s);
    op->Status = IO__INITFAIL;
    return IO__ERRINIDEVICE;
  }

  /* Initialize remote address structure */

  local->rem_addr.sin_family = AF_INET;
  local->rem_addr.sin_port = htons(op->RemotePort);
  local->rem_addr.sin_addr.s_addr = inet_addr((char*)&(op->Address));

  /* Connect to remote address */

  sts = connect(
      local->s, (struct sockaddr*)&local->rem_addr, sizeof(local->rem_addr));
  if (sts != 0) {
    errh_Error(
        "Error binding remote socket for IO remote rack %s, %d", rp->Name, sts);
    op->Status = IO__INITFAIL;
    return IO__ERRINIDEVICE;
  }

  local->next_read_req_item = 0;
  local->next_write_req_item = 0;

  op->RX_packets = 0;
  op->TX_packets = 0;

  /* Log initialization */

  errh_Info("Init of IO remote rack %s/%s:%d", rp->Name,
      inet_ntoa(local->rem_addr.sin_addr), ntohs(local->rem_addr.sin_port));
  op->Status = IO__NORMAL;
  return IO__SUCCESS;
}
Beispiel #11
0
static void
stop_threads (
  plc_sProcess	*pp
)
{
  pwr_tInt32	i;
  pwr_tStatus	sts;
  plc_sThread	*tp;

  for (i = 0, tp = pp->thread; i < pp->thread_count ; i++, tp++) {
    tp->exit = TRUE;
    /* Tell thread it is time for phase 4, stop.  */

#if defined OS_LYNX && USE_RT_TIMER
    sem_post(&tp->ScanSem);   
#else
    que_Put(&sts, &tp->q_in, &tp->event, (void *)4);
#endif


#if 0
  pwr_tStatus	t_sts;
    sts = thread_Join(&tp->tid, &t_sts);
    if (EVEN(sts))
      errh_Error("thread_Join, thread %n, %m", tp->name, sts);
#endif
  }
}
Beispiel #12
0
int main()
{
  pwr_tStatus sts;
  rt_sysmon sysmon;
  int tmo;
  char mp[2000];
  qcom_sQid qid = qcom_cNQid;
  qcom_sGet get;
  int swap = 0;
  bool first_scan = true;

  init( &qid);

  try {
    sysmon.open();
  }
  catch ( co_error& e) {
    errh_Error( (char *)e.what().c_str());
    errh_Fatal( "rt_sysmon aborting");
    errh_SetStatus( PWR__SRVTERM);
    exit(0);
  }

  aproc_TimeStamp( sysmon.scantime(), 5);
  errh_SetStatus( PWR__SRUN);

  first_scan = true;
  for (;;) {
    if ( first_scan) {
      tmo = (int) (sysmon.scantime() * 1000 - 1);
    }

    get.maxSize = sizeof(mp);
    get.data = mp;
    qcom_Get( &sts, &qid, &get, tmo);
    if (sts == QCOM__TMO || sts == QCOM__QEMPTY) {
      if ( !swap)
	sysmon.scan();
    } 
    else {
      ini_mEvent  new_event;
      qcom_sEvent *ep = (qcom_sEvent*) get.data;

      new_event.m  = ep->mask;
      if (new_event.b.oldPlcStop && !swap) {
	errh_SetStatus( PWR__SRVRESTART);
        swap = 1;
	sysmon.close();
      } else if (new_event.b.swapDone && swap) {
        swap = 0;
	sysmon.open();
	errh_SetStatus( PWR__SRUN);
      } else if (new_event.b.terminate) {
	exit(0);
      }
    }
    first_scan = false;
  }

}
Beispiel #13
0
static pwr_tStatus IoCardInit (
  io_tCtx	ctx,
  io_sAgent	*ap,
  io_sRack	*rp,
  io_sCard	*cp  
) 
{
  pwr_sClass_Ssab_PIDuP *op;
  io_sLocal 		*local;
  pwr_tStatus		sts;

  op = (pwr_sClass_Ssab_PIDuP *) 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 pid card '%s'", cp->Name);

  sts = gdh_ObjidToPointer(op->PidXCon, (void *) &local->objP);

  if ( EVEN(sts)) {
    errh_Error( "PID-card not properly connected, %s", cp->Name);
    return IO__ERRDEVICE;
  }

  /* Calculate indexes in I/O-area */

  local->dyn_ind = ((char *) &local->Dyn - (char *) local) / 2;
  local->par_ind = ((char *) &local->Par - (char *) local) / 2;
  local->stat_ind = ((char *) &local->Stat - (char *) local) / 2;
  local->ran_ind = ((char *) &local->AoRange - (char *) local) / 2;

  return 1;
}
static pwr_tStatus IoAgentWrite(io_tCtx ctx, io_sAgent* ap)
{
  io_sLocalHilscher_cifX_PnController* local
      = (io_sLocalHilscher_cifX_PnController*)ap->Local;
  pwr_sClass_Hilscher_cifX_PnController* op
      = (pwr_sClass_Hilscher_cifX_PnController*)ap->op;
  int32_t sts;

  if (local->output_area_size) {
    sts = xChannelIOWrite(
        local->chan, 0, 0, local->output_area_size, local->output_area, 10);
    op->Status = sts;
    if (sts != CIFX_NO_ERROR) {
      if (!local->dev_init) {
        op->ErrorCount++;
        xDriverGetErrorDescription(sts, op->ErrorStr, sizeof(op->ErrorStr));
      }

      if (op->ErrorCount == op->ErrorSoftLimit && !local->softlimit_logged) {
        errh_Error("IO Error soft limit reached on agent '%s'", ap->Name);
        local->softlimit_logged = 1;
      }
      if (op->ErrorCount >= op->ErrorHardLimit) {
        ctx->Node->EmergBreakTrue = 1;
        return IO__ERRDEVICE;
      }
    }
  }
  return IO__SUCCESS;
}
static pwr_tStatus IoAgentInit( io_tCtx ctx,
				io_sAgent *ap)
{
  io_sLocalUSB_Agent *local;
  int sts;
  pwr_sClass_USB_Agent *op = (pwr_sClass_USB_Agent *)ap->op;

  local = (io_sLocalUSB_Agent *) calloc( 1, sizeof(io_sLocalUSB_Agent));
  ap->Local = local;

  sts = libusb_init( &local->libusb_ctx);
  if ( sts != 0) {
    if ( sts == io_cLibDummy)
      op->Status = IO__DUMMYBUILD;
    else
      op->Status = IO__INITFAIL;
    errh_Error( "Init of USB agent failed '%s', error status %d", ap->Name, sts);

    local->libusb_ctx = 0;
    return op->Status;
  }
  else {
    op->Status = IO__SUCCESS;
    errh_Info( "Init of USBIO agent '%s'", ap->Name);
  }

  return IO__SUCCESS;
}
Beispiel #16
0
pwr_tStatus
ini_PlcStart (
    pwr_tUInt32	    plcversion,
    char		    *plcfile,
    pwr_tUInt32	    busid
)
{
    pwr_tUInt32	    sts;
    unsigned int	    flags;
    char		    command[128];
    char		    procname[20];
    $DESCRIPTOR(commanddsc, "");
    $DESCRIPTOR(procnamedsc, "");

    commanddsc.dsc$a_pointer  = command;
    commanddsc.dsc$w_length   = sprintf(command, "run %s", plcfile);
    procnamedsc.dsc$a_pointer = procname;
    procnamedsc.dsc$w_length  = sprintf(procname, "PWR_PLC_%d", busid);

    flags = 1; /* Nowait and Notify */
    sts = lib$spawn(&commanddsc, NULL, NULL, &flags, &procnamedsc);
    if (EVEN(sts)) errh_Error("lib$spawn %s\n%m", command, sts);

    return sts;
}
Beispiel #17
0
/*----------------------------------------------------------------------------*\
   Swap method for the Pb_profiboard agent  
\*----------------------------------------------------------------------------*/
static pwr_tStatus IoAgentSwap (
  io_tCtx	ctx,
  io_sAgent	*ap,
  io_eEvent	event
) 
{

  switch ( event) {
  case io_eEvent_IoCommSwapInit:
  case io_eEvent_IoCommSwap: {
    pwr_sClass_Pb_Profiboard *op;
    char DeviceName[64];
    io_sAgentLocal *local;
  
    if (ap->Local == NULL) {
      /* Allocate area for local data structure */
      ap->Local = calloc(1, sizeof(io_sAgentLocal));
      if (!ap->Local) {
	errh_Error( "ERROR swap init Profibus DP Master %s - %s", ap->Name, "calloc");
	return IO__ERRINIDEVICE;
      }
    
      local = (io_sAgentLocal *) ap->Local;
      
      errh_Info( "Swap init interface for Profibus DP Master %s", ap->Name);

      op = (pwr_sClass_Pb_Profiboard *) ap->op;
    
      sprintf(DeviceName, "/dev/pbboard%u", op->BusNumber - 1);
      local->hDpsBoardDevice = open(DeviceName, O_RDONLY | O_NONBLOCK);
    
      if (local->hDpsBoardDevice == -1) {
	errh_Error( "ERROR swap init Profibus DP Master %s - %s", ap->Name, "open");
	return IO__ERRINIDEVICE;
      }
    }
    break;
  }
  case io_eEvent_EmergencyBreak:
  case io_eEvent_IoCommEmergencyBreak:
    IoAgentClose( ctx, ap);
    break;
  }

    
  return IO__SUCCESS;
}
Beispiel #18
0
pwr_tBoolean
sect_InitLock (
  pwr_tStatus		*sts,
  sect_sHead		*shp,
  sect_sMutex		*mp
)
{
  pwr_tStatus		lsts = 1;

#ifdef	OS_ELN
  ELN$INITIALIZE_AREA_LOCK((AREA)shp->area, *mp, &lsts);

#elif defined(OS_VMS)
  {
    pwr_tUInt32		i;

    /* Clear mutex variable and build free list.  */

    memset(mp, 0, sizeof(*mp));
    lsts = sys$ascefc(64, &shp->namedsc, 0, 0);
    if (ODD(lsts)) {
      for (i=0; i<32; i++) {
	while (_INSQTI(&mp->list[i].entry, &mp->freeroot) == 1);
	mp->list[i].flag = 64+i;
	lsts = sys$clref(mp->list[i].flag);
	if (EVEN(lsts)) break;
      }
    }
  }

#elif defined(OS_LYNX)
  if (sem_init(mp, 1, 1) != 0) {
    errh_Error("sect_InitLock: sem_init, errno: %d", errno);
    lsts = 2;
  }
#elif defined OS_POSIX
  if (posix_sem_init_shared(mp, ftok(shp->name, 'P'), 1) != 0) {
    errh_Error("sect_InitLock: sem_init(%s), errno: %d", shp->name, errno);
    lsts = 2;
  }  
#endif

  errh_ReturnOrBugcheck(ODD(lsts), sts, lsts, "");
}
static bool cmd_check(pwr_sClass_Hilscher_cifX_PnController* op, io_sAgent* ap,
    unsigned int cmd1, unsigned int cmd2)
{
  if (cmd1 == cmd2)
    return true;

  strcpy(op->ErrorStr, "Unexpected message received");
  errh_Error("IO init %s, '%s'", ap->Name, op->ErrorStr);
  return false;
}
Beispiel #20
0
JNIEXPORT void JNICALL Java_jpwr_rt_Errh_error
  (JNIEnv *env, jobject object, jstring jmsg)
{
  char		*cstr;
  const char 	*msg;

  msg = (*env)->GetStringUTFChars( env, jmsg, 0);
  cstr = (char *)msg;

  errh_Error( cstr);
  (*env)->ReleaseStringUTFChars( env, jmsg, cstr);
}
Beispiel #21
0
static void
clean_all (
  plc_sProcess	*pp
)
{
  pwr_tStatus	sts;

  sts = gdh_UnrefObjectInfoAll();
  if (EVEN(sts))
    errh_Error("gdh_UnrefObjectInfoAll, %m", sts);

}
Beispiel #22
0
unsigned int rmq_send(remnode_item* remnode, pwr_sClass_RemTrans* remtrans,
    char* buf, int buf_size)
{
  int sts;
  amqp_basic_properties_t prop;
  amqp_bytes_t msg;
  char* tmpbuf;
  unsigned int tmpbuf_size;

  if (rn_rmq->DisableHeader) {
    msg.bytes = buf;
    msg.len = buf_size;
  } else {
    tmpbuf_size = sizeof(rabbit_header) + buf_size;
    tmpbuf = malloc(tmpbuf_size);
    memcpy(tmpbuf + sizeof(rabbit_header), buf, buf_size);

    ((rabbit_header*)tmpbuf)->msg_size = htons(tmpbuf_size);
    ((rabbit_header*)tmpbuf)->msg_id[0] = htons(remtrans->Address[0]);
    ((rabbit_header*)tmpbuf)->msg_id[1] = htons(remtrans->Address[1]);

    msg.bytes = tmpbuf;
    msg.len = tmpbuf_size;
  }

  if ( remtrans->Address[3] == 2)
    prop.delivery_mode = 2;
  else
    prop.delivery_mode = 1;
  prop._flags = AMQP_BASIC_DELIVERY_MODE_FLAG;

  // 0 mandatory 0 immediate
  if (!streq(ctx->op->Exchange, ""))
    sts = amqp_basic_publish(ctx->conn, ctx->channel,
        amqp_cstring_bytes(ctx->op->Exchange), amqp_cstring_bytes(""), 0, 0,
        &prop, msg);
  else
    sts = amqp_basic_publish(ctx->conn, ctx->channel,
        amqp_cstring_bytes(ctx->op->Exchange),
        amqp_cstring_bytes(ctx->op->SendQueue), 0, 0, &prop, msg);
  if (sts) {
    remtrans->ErrCount++;
    errh_Error("Send failed, queue %s, RabbitMQ status %d",
        rn_rmq->SendQueue, sts, 0);
    if (debug)
      printf("Send failed sts:%d\n", (int)sts);
  }
  if (!rn_rmq->DisableHeader)
    free(tmpbuf);

  return STATUS_OK;
}
static unsigned int Receive()
{
  static int   			sts;
  unsigned char         	received_char = NUL;
  static unsigned char  	snak[2] = {NAK, NUL};
  static unsigned char  	sdle[2] = {DLE, NUL};
  //static int			error_logged = 0;

  fd_set read_fd;
  struct timeval tv;

/**** set up timeout ****/

  load_timeval(&tv, 0);		// poll
//  load_timeval(&tv, rn_3964R->ScanTime);
//  tv.tv_sec = TIMEOUT_REC_ANSWER_SEC;
//  tv.tv_usec = TIMEOUT_REC_ANSWER_USEC;

/**routine**/  

  FD_ZERO(&read_fd);
  FD_SET(ser_fd, &read_fd);
  sts=select(ser_fd+1, &read_fd, NULL, NULL, &tv);
  sts=read(ser_fd, &received_char, 1);

  if (sts > 0)
  {
    if (received_char == STX)
    {
      /* Write DLE to respond */
      if(!write(ser_fd, sdle, 1))
        return 0;
      sts = ReceiveHandler(ser_fd);
    }
    else
    {
      /* We don't understand, Send NAK unless NAK is received */
      if (received_char != NAK)
        write(ser_fd, snak, 1);
      errh_Error("3964R felaktigt meddelande i mottagning, annat starttecken än STX (0x%x)", received_char);
      sts=0;			//felstatus
    }

    if (sts < 1)
    {
      rn_3964R->ErrCount++;
    }
  }
  return(1);
}
static pwr_tStatus IoRackInit( io_tCtx ctx,
			       io_sAgent *ap,
			       io_sRack *rp)
{
  io_sLocalUSB *local;
  int status;
  int i;
  unsigned int snum;
  int found;
  io_sCard *cp;
  pwr_sClass_MotionControl_USB *op = (pwr_sClass_MotionControl_USB *)rp->op;

  local = (io_sLocalUSB *) calloc( 1, sizeof(io_sLocalUSB));
  rp->Local = local;

  for ( i = 0; i < (int)sizeof(local->USB_Handle); i++) {
    status = USBIO_Open( &local->USB_Handle[i]);
    if ( status) {
      if ( i == 0)
	op->Status = status;
      break;
    }

    /* Check is this card is configured */
    status = USBIO_GetSerialNr( &local->USB_Handle[i], &snum);
    if ( !status) {
      found = 0;
      for ( cp = rp->cardlist; cp; cp = cp->next) {
	if ( ((pwr_sClass_MotionControl_USBIO *)cp->op)->Super.Address == snum) {
	  local->snum[i] = snum;
	  found = 1;
	  break;
	}
      }
      if ( !found) {
	errh_Info( "USBIO Serial number %d not configured", snum);
	op->Status = USBIO_Close( &local->USB_Handle[i]);
	i--;
	continue;
      }
    }
    else
      errh_Error( "USBIO Serial number error '%s'", rp->Name);
  }

  errh_Info( "Init of USBIO rack '%s'", rp->Name);

  return IO__SUCCESS;
}
Beispiel #25
0
static void init(qcom_sQid* myQid)
{
  pwr_tStatus sts;

  sts = gdh_Init("pwr_nacp");
  if (EVEN(sts)) {
    errh_Fatal("gdh_Init, %m", sts);
    errh_SetStatus(PWR__SRVTERM);
    exit(sts);
  }

#if defined OS_CYGWIN
  qcom_sQattr qAttr;
  qcom_sQid qid = qcom_cQnacp;

  qAttr.type = qcom_eQtype_private;
  qAttr.quota = 100;
  if (!qcom_CreateQ(&sts, &qid, &qAttr, "nacp")) {
    errh_Error("Failed to create QCOM que\n%m", sts);
    errh_SetStatus(PWR__SRVTERM);
    exit(sts);
  }
#else
  if (!qcom_AttachQ(&sts, &qcom_cQnacp)) {
    errh_Fatal("qcom_AttachQ, %m", sts);
    errh_SetStatus(PWR__SRVTERM);
    exit(sts);
  }
#endif
  *myQid = qcom_cQnacp;

  if (!qcom_Bind(&sts, myQid, &qcom_cQini)) {
    errh_Fatal("qcom_Bind, %m", sts);
    errh_SetStatus(PWR__SRVTERM);
    exit(-1);
  }

  /* Activate all subscriptions that were requested before we started!  */

  gdb_ScopeLock
  {
    gdbroot->db->neth_acp = *myQid;
    subc_ActivateList(&gdbroot->my_node->subc_lh, pwr_cNObjid);
    subc_ActivateList(&gdbroot->no_node->subc_lh, pwr_cNObjid);
  }
  gdb_ScopeUnlock;
}
Beispiel #26
0
/*----------------------------------------------------------------------------*\
   Init method for the mb_master agent
\*----------------------------------------------------------------------------*/
static pwr_tStatus IoAgentInit(io_tCtx ctx, io_sAgent* ap)
{
  io_sAgentLocal* local;

  /* Allocate area for local data structure */
  ap->Local = calloc(1, sizeof(io_sAgentLocal));
  if (!ap->Local) {
    errh_Error("ERROR config Modbus Master %s - %s", ap->Name, "calloc");
    return IO__ERRINIDEVICE;
  }

  local = ap->Local;

  local->initialized = TRUE;

  return IO__SUCCESS;
}
Beispiel #27
0
static void
dlink_area (
  plc_sDlink *dp,
  char *name,
  int size
)
{
  pwr_tStatus	sts;

  if ((dp->size = size) == 0) return; /* We have no objects of this type.  */

  sts = gdh_RefObjectInfo(name, &dp->p, &dp->sid, dp->size);
  if (EVEN(sts)) {
    errh_Error("Direct link object %s, %m", name, sts);
    exit(sts);
  }
}
Beispiel #28
0
static pwr_tStatus AiRangeToCoef( 
  io_sChannel 		*chanp)
{
  pwr_sClass_ChanAi	*cop;
  char			buf[120];
  pwr_tStatus		sts;
  pwr_tFloat32		PolyCoef1;
  pwr_tFloat32		PolyCoef0;

  cop = chanp->cop;

  if ( cop)
  {
    cop->CalculateNewCoef = 0;


    /* Coef for RawValue to SignalValue conversion */
    cop->SigValPolyCoef0 = 0;
    cop->SigValPolyCoef1 = cop->ChannelSigValRangeHigh / 30000;

    /* Coef for SignalValue to ActualValue conversion */
    if ( chanp->ChanClass != pwr_cClass_ChanAit && cop->SensorPolyType == 1)
    {
      if ( cop->SensorSigValRangeHigh != cop->SensorSigValRangeLow)
      {
        PolyCoef1 = (cop->ActValRangeHigh - cop->ActValRangeLow)/
		(cop->SensorSigValRangeHigh - cop->SensorSigValRangeLow);
        PolyCoef0 = cop->ActValRangeHigh - cop->SensorSigValRangeHigh *
		PolyCoef1;
        cop->SensorPolyCoef1 = cop->SigValPolyCoef1 * PolyCoef1;
        cop->SensorPolyCoef0 = PolyCoef0 + PolyCoef1*
		cop->SigValPolyCoef0;
      }
      else
      {
        sts = gdh_ObjidToName( chanp->ChanAref.Objid, buf, sizeof(buf), 
			cdh_mName_volumeStrict);
        if ( EVEN(sts)) return sts;
        errh_Error( "Invalid SigValueRange in Ai channel %s", buf);
        return IO__CHANRANGE;
      }
    }
  }
  return IO__SUCCESS;
}
Beispiel #29
0
void rt_sysmon::open()
{
  pwr_tStatus sts;
  pwr_sAttrRef aref;
  pwr_tObjid oid;

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

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

  aproc_RegisterObject( oid);

  // Open DiskSup objects
  for ( sts = gdh_GetClassListAttrRef( pwr_cClass_DiskSup, &aref);
	ODD(sts);
	sts = gdh_GetNextAttrRef( pwr_cClass_DiskSup, &aref, &aref)) {
    disksup_object *o = new disksup_object( &aref);
    objects.push_back( o);
    try {
      o->open( scan_time);
      if ( conf)
	conf->DiskSupObjects[sysmon_cnt] = aref.Objid;
      sysmon_cnt++;
    }    
    catch ( co_error& e) {
      delete o;
      objects.pop_back();
      errh_Error( "DiskSup configuration error: &s", (char *)e.what().c_str());
    }
  }
}
static pwr_tStatus IoCardInit( io_tCtx ctx,
                               io_sAgent *ap,
                               io_sRack *rp,
                               io_sCard *cp)
{
    pwr_sClass_OneWire_AiDevice *op = (pwr_sClass_OneWire_AiDevice *)cp->op;
    io_sLocalAiDevice *local;
    pwr_tStatus sts;
    char name[40];
    pwr_tFileName fname, tmp;
    int name_len;
    char *s;

    if ( cp->chanlist[0].cop) {
        local = (io_sLocalAiDevice *) calloc( 1, sizeof(io_sLocalAiDevice));
        cp->Local = local;

        sprintf( name, "%d-%012x", op->Family, op->Super.Address);
        name_len = strlen(name);
        strncpy( fname, op->DataFile, sizeof(fname));

        // Replace all '%s' with 'family-serialnumber'
        s = fname;
        while ( (s = strstr( s, "%s"))) {
            strncpy( tmp, s+2, sizeof(tmp));
            strcpy( s, name);
            strncat( fname, tmp, sizeof(fname));
        }
        local->value_fp = fopen( fname, "r");
        if (!local->value_fp) {
            errh_Error( "OneWire_AiDevice Unable op open %s, '%ux'", cp->Name,
                        op->Super.Address);
            sts = IO__INITFAIL;
            op->Status = sts;
            return sts;
        }

        io_AiRangeToCoef( &cp->chanlist[0]);

        errh_Info( "Init of OneWire_AiDevice '%s'", cp->Name);
    }
    op->Status = IO__SUCCESS;
    return IO__SUCCESS;
}