JNIEXPORT void JNICALL Java_jpwr_rt_Errh_success (JNIEnv *env, jobject object, jstring jmsg) { char *cstr; const char *msg; msg = (*env)->GetStringUTFChars( env, jmsg, 0); cstr = (char *)msg; errh_Success( cstr); (*env)->ReleaseStringUTFChars( env, jmsg, cstr); }
/*----------------------------------------------------------------------------*\ Init method for the Powerlink module \*----------------------------------------------------------------------------*/ static pwr_tStatus IoAgentInit (io_tCtx ctx, io_sAgent *ap) { io_sLocalEpl_MN *local; int sts; pwr_sClass_Epl_MN *op = (pwr_sClass_Epl_MN *)ap->op; local = (io_sLocalEpl_MN *) calloc( 1, sizeof(io_sLocalEpl_MN)); ap->Local = local; local->inputResetEnabled = 0; op->NumberOfSlaves = 0; static tEplApiInitParam EplApiInitParam; tEplKernel EplRet = kEplSuccessful; pwr_tFileName cdc_file; char* sHostname = malloc(1023); if ( strchr(op->CDCfile, '/') != 0) strcpy( cdc_file, op->CDCfile); else { strcpy( cdc_file, "$pwrp_load/"); strcat( cdc_file, op->CDCfile); } dcli_translate_filename( cdc_file, cdc_file); gethostname(sHostname, 1023); if( op->StallAction == pwr_eStallActionEnum_ResetInputs) local->inputResetEnabled = 1; // Init the I/O area unsigned int input_area_offset = 0; unsigned int input_area_chansize = 0; unsigned int output_area_offset = 0; unsigned int output_area_chansize = 0; io_sRack *rp; io_sCard *cp; pwr_tCid cid; for ( rp = ap->racklist; rp; rp = rp->next) { rp->Local = calloc( 1, sizeof(io_sLocalEpl_CN)); rp->MethodDisabled = 1; op->NumberOfSlaves++; if( ((pwr_sClass_Epl_CN *)rp->op)->StallAction == pwr_eStallActionEnum_ResetInputs) local->inputResetEnabled = 1; // Show device offset and size if ( rp->Class == pwr_cClass_Epl_CN && rp->op) { ((pwr_sClass_Epl_CN *)rp->op)->InputAreaOffset = input_area_offset + input_area_chansize; ((pwr_sClass_Epl_CN *)rp->op)->OutputAreaOffset = output_area_offset + output_area_chansize; } // Get byte ordering pwr_tAName name; pwr_tEnum byte_ordering; strcpy( name, rp->Name); strcat( name, ".ByteOrdering"); sts = gdh_GetObjectInfo( name, &byte_ordering, sizeof(byte_ordering)); if ( ODD(sts)) ((io_sLocalEpl_CN *)rp->Local)->byte_ordering = byte_ordering; else ((io_sLocalEpl_CN *)rp->Local)->byte_ordering = pwr_eByteOrderingEnum_LittleEndian; for ( cp = rp->cardlist; cp; cp = cp->next) { cid = cp->Class; while ( ODD( gdh_GetSuperClass( cid, &cid, cp->Objid))) ; cp->MethodDisabled = 1; // Show module offset and size if ( cid == pwr_cClass_Epl_Module && cp->op) { ((pwr_sClass_Epl_Module *)cp->op)->InputAreaOffset = input_area_offset + input_area_chansize; ((pwr_sClass_Epl_Module *)cp->op)->OutputAreaOffset = output_area_offset + output_area_chansize; } io_bus_card_init( ctx, cp, &input_area_offset, &input_area_chansize, &output_area_offset, &output_area_chansize, byte_ordering, io_eAlignment_Powerlink); // Show module offset and size if ( cid == pwr_cClass_Epl_Module && cp->op) { ((pwr_sClass_Epl_Module *)cp->op)->InputAreaSize = input_area_offset + input_area_chansize - ((pwr_sClass_Epl_Module *)cp->op)->InputAreaOffset; ((pwr_sClass_Epl_Module *)cp->op)->OutputAreaSize = output_area_offset + output_area_chansize - ((pwr_sClass_Epl_Module *)cp->op)->OutputAreaOffset; } if(rp->next == NULL) { if(cp->next == NULL) { ((pwr_sClass_Epl_Module *)cp->op)->InputAreaSize += pwr_Align(input_area_offset + input_area_chansize, 4) - (input_area_offset + input_area_chansize); ((pwr_sClass_Epl_Module *)cp->op)->OutputAreaSize += pwr_Align(output_area_offset + output_area_chansize, 4) - (output_area_offset + output_area_chansize); } } } // Show slave offset and size if ( rp->Class == pwr_cClass_Epl_CN && rp->op) { ((pwr_sClass_Epl_CN *)rp->op)->InputAreaSize = input_area_offset + input_area_chansize - ((pwr_sClass_Epl_CN *)rp->op)->InputAreaOffset; ((pwr_sClass_Epl_CN *)rp->op)->OutputAreaSize = output_area_offset + output_area_chansize - ((pwr_sClass_Epl_CN *)rp->op)->OutputAreaOffset; if(rp->next == NULL) { ((pwr_sClass_Epl_CN *)rp->op)->InputAreaSize += pwr_Align(input_area_offset + input_area_chansize, 4) - (input_area_offset + input_area_chansize); ((pwr_sClass_Epl_CN *)rp->op)->OutputAreaSize += pwr_Align(output_area_offset + output_area_chansize, 4) - (output_area_offset + output_area_chansize); } } } // This is the calculated in- and outputarea size local->input_area_size = pwr_Align(input_area_offset + input_area_chansize, 4); local->output_area_size = pwr_Align(output_area_offset + output_area_chansize, 4); // Show agent in- and output area size op->InputAreaSize = local->input_area_size; op->OutputAreaSize = local->output_area_size; struct sched_param schedParam; // adjust process priority // push nice level in case we have no RTPreempt if (nice (-20) == -1) { errh_Error("%s() couldn't set nice value! (%s)", __func__, strerror(errno)); } //schedParam.sched_priority = MIN(sched_get_priority_max(SCHED_FIFO), // sched_get_priority_min(SCHED_FIFO) + op->Priority); schedParam.__sched_priority = op->Priority; if (pthread_setschedparam(pthread_self(), SCHED_RR, &schedParam) != 0) { errh_Error("%s() couldn't set thread scheduling parameters! %d", __func__, schedParam.__sched_priority); } // binds all openPOWERLINK threads to the second CPU core cpu_set_t affinity; CPU_ZERO(&affinity); CPU_SET(1, &affinity); sched_setaffinity(0, sizeof(cpu_set_t), &affinity); // Initialize target specific stuff EplTgtInit(); EPL_MEMSET(&EplApiInitParam, 0, sizeof (EplApiInitParam)); EplApiInitParam.m_uiSizeOfStruct = sizeof (EplApiInitParam); EplApiInitParam.m_pEventUserArg = ap; // Get devicename from attribute in agent EplApiInitParam.m_HwParam.m_pszDevName = op->Device; // Get nodeid from attribute in agent EplApiInitParam.m_uiNodeId = op->NodeId; EplApiInitParam.m_dwIpAddress = ntohl( inet_addr( op->IpAddress)); // write 00:00:00:00:00:00 to MAC address, so that the driver uses the real hardware address EPL_MEMCPY(EplApiInitParam.m_abMacAddress, abMacAddr, sizeof (EplApiInitParam.m_abMacAddress)); EplApiInitParam.m_fAsyncOnly = FALSE; EplApiInitParam.m_dwFeatureFlags = -1; // required for error detection EplApiInitParam.m_dwCycleLen = uiCycleLen_g; // const EplApiInitParam.m_uiIsochrTxMaxPayload = 256; // const EplApiInitParam.m_uiIsochrRxMaxPayload = 256; // const; only required for IdentRes EplApiInitParam.m_dwPresMaxLatency = 50000; // required for initialisation (+28 bytes) EplApiInitParam.m_uiPreqActPayloadLimit = 36; // required for initialisation of Pres frame (+28 bytes) EplApiInitParam.m_uiPresActPayloadLimit = 36; // const; only required for IdentRes EplApiInitParam.m_dwAsndMaxLatency = 150000; // required for error detection EplApiInitParam.m_uiMultiplCycleCnt = 0; // required to set up max frame size EplApiInitParam.m_uiAsyncMtu = 1500; // required for sync EplApiInitParam.m_uiPrescaler = 2; EplApiInitParam.m_dwLossOfFrameTolerance = 500000; EplApiInitParam.m_dwAsyncSlotTimeout = 3000000; EplApiInitParam.m_dwWaitSocPreq = 150000; // NMT_DeviceType_U32 EplApiInitParam.m_dwDeviceType = -1; // NMT_IdentityObject_REC.VendorId_U32 EplApiInitParam.m_dwVendorId = -1; // NMT_IdentityObject_REC.ProductCode_U32 EplApiInitParam.m_dwProductCode = -1; // NMT_IdentityObject_REC.RevisionNo_U32 EplApiInitParam.m_dwRevisionNumber = -1; // NMT_IdentityObject_REC.SerialNo_U32 EplApiInitParam.m_dwSerialNumber = -1; EplApiInitParam.m_dwSubnetMask = ntohl( inet_addr( op->IpNetmask)); EplApiInitParam.m_dwDefaultGateway = 0; EPL_MEMCPY(EplApiInitParam.m_sHostname, sHostname, sizeof(EplApiInitParam.m_sHostname)); EplApiInitParam.m_uiSyncNodeId = EPL_C_ADR_SYNC_ON_SOA; EplApiInitParam.m_fSyncOnPrcNode = FALSE; // set callback functions EplApiInitParam.m_pfnCbEvent = (tEplApiCbEvent)AppCbEvent; EplApiInitParam.m_pfnObdInitRam = EplObdInitRam; EplApiInitParam.m_pfnCbSync = AppCbSync; // initialize POWERLINK stack EplRet = EplApiInitialize(&EplApiInitParam); if(EplRet != kEplSuccessful) { errh_Error("EplApiInitialize() failed (Error:0x%x!", EplRet); goto Exit; } EplRet = EplApiSetCdcFilename(cdc_file); if(EplRet != kEplSuccessful) { goto Exit; } // Allocate memory for the in- and outputareas if( local->output_area_size > 0) AppProcessImageIn_g = malloc(local->output_area_size); if( local->input_area_size > 0) { AppProcessImageOut_g = malloc(local->input_area_size); } // Save pointer to in- and outputareas in THIS agent object local->input_area = AppProcessImageOut_g; local->output_area = AppProcessImageIn_g; if( local->inputResetEnabled && local->input_area_size > 0) local->tmp_area = malloc(local->input_area_size); else local->tmp_area = local->input_area; AppProcessImageCopyJob_g.m_fNonBlocking = FALSE; AppProcessImageCopyJob_g.m_uiPriority = 0; AppProcessImageCopyJob_g.m_In.m_pPart = AppProcessImageIn_g; AppProcessImageCopyJob_g.m_In.m_uiOffset = 0; AppProcessImageCopyJob_g.m_In.m_uiSize = local->output_area_size; AppProcessImageCopyJob_g.m_Out.m_pPart = AppProcessImageOut_g; AppProcessImageCopyJob_g.m_Out.m_uiOffset = 0; AppProcessImageCopyJob_g.m_Out.m_uiSize = local->input_area_size; EplRet = EplApiProcessImageAlloc(local->output_area_size, local->input_area_size, 2, 2); if (EplRet != kEplSuccessful) { goto Exit; } EplRet = EplApiProcessImageSetup(); if (EplRet != kEplSuccessful) { goto Exit; } // start processing EplRet = EplApiExecNmtCommand(kEplNmtEventSwReset); if (EplRet != kEplSuccessful) { IoAgentClose(NULL, NULL); goto Exit; } errh_Success ("Powerlink init successfull"); return IO__SUCCESS; Exit: errh_Error("IoCardInit: returns 0x%X", EplRet); return IO__SUCCESS; }