/** * Creates an instance of the sensor base and gets an FPGA handle */ SensorBase::SensorBase() { if (!portsInitialized) { for (uint32_t i = 0; i < kDigitalChannels; i++) { void* port = getPort(i); int32_t status = 0; m_digital_ports[i] = initializeDigitalPort(port, &status); wpi_setErrorWithContext(status, getHALErrorMessage(status)); freePort(port); } for (uint32_t i = 0; i < kRelayChannels; i++) { void* port = getPort(i); int32_t status = 0; m_relay_ports[i] = initializeDigitalPort(port, &status); wpi_setErrorWithContext(status, getHALErrorMessage(status)); freePort(port); } for (uint32_t i = 0; i < kPwmChannels; i++) { void* port = getPort(i); int32_t status = 0; m_pwm_ports[i] = initializeDigitalPort(port, &status); wpi_setErrorWithContext(status, getHALErrorMessage(status)); freePort(port); } } }
/* * Class: edu_wpi_first_wpilibj_hal_DIOJNI * Method: initializeDigitalPort * Signature: (J)J; */ JNIEXPORT jlong JNICALL Java_edu_wpi_first_wpilibj_hal_DIOJNI_initializeDigitalPort (JNIEnv * env, jclass, jlong id) { DIOJNI_LOG(logDEBUG) << "Calling DIOJNI initializeDigitalPort"; DIOJNI_LOG(logDEBUG) << "Port Ptr = " << (void*)id; int32_t status = 0; void* dio = initializeDigitalPort((void*)id, &status); DIOJNI_LOG(logDEBUG) << "Status = " << status; DIOJNI_LOG(logDEBUG) << "DIO Ptr = " << dio; CheckStatus(env, status); return (jlong)dio; }
/* * Class: edu_wpi_first_wpilibj_hal_DIOJNI * Method: initializeDigitalPort * Signature: (Ljava/nio/ByteBuffer;Ljava/nio/IntBuffer;)Ljava/nio/ByteBuffer; */ JNIEXPORT jobject JNICALL Java_edu_wpi_first_wpilibj_hal_DIOJNI_initializeDigitalPort (JNIEnv * env, jclass, jobject id, jobject status) { DIOJNI_LOG(logDEBUG) << "Calling DIOJNI initializeDigitalPort"; void ** javaId = (void**)env->GetDirectBufferAddress(id); DIOJNI_LOG(logDEBUG) << "Port Ptr = " << *javaId; jint * statusPtr = (jint*)env->GetDirectBufferAddress(status); DIOJNI_LOG(logDEBUG) << "Status Ptr = " << statusPtr; void** dioPtr = (void**)new unsigned char[4]; *dioPtr = initializeDigitalPort(*javaId, statusPtr); DIOJNI_LOG(logDEBUG) << "Status = " << *statusPtr; DIOJNI_LOG(logDEBUG) << "DIO Ptr = " << *dioPtr; return env->NewDirectByteBuffer( dioPtr, 4); }