Added in new headers and libraries for image version 18. This image contains a change to fix artf3773, which switched setDataSem to be a pthread_cond_t variable instead of a mutex. As a result, a few new HAL functions had to be exposed over JNI, specifically the functions for MultiWait.

Change-Id: I28be07c8102acb078440ee74ded46527328dd271
This commit is contained in:
Fredric Silberberg
2014-11-16 16:57:02 -05:00
parent 6f4d6ed998
commit c6891fc034
19 changed files with 75 additions and 22 deletions

View File

@@ -1,3 +1,2 @@
/usr/local/frc/JRE/bin/java
-jar /home/lvuser/FRCUserProgram.jar
/usr/local/frc/JRE/bin/java -jar /home/lvuser/FRCUserProgram.jar

View File

@@ -1,3 +1,2 @@
/usr/local/frc/JRE/bin/java -XX:+UsePerfData -agentlib:jdwp=transport=dt_socket,address=8348,server=y,suspend=y
-jar /home/lvuser/FRCUserProgram.jar
/usr/local/frc/JRE/bin/java -XX:+UsePerfData -agentlib:jdwp=transport=dt_socket,address=8348,server=y,suspend=y -jar /home/lvuser/FRCUserProgram.jar

View File

@@ -215,7 +215,7 @@ extern "C"
int HALGetJoystickPOVs(uint8_t joystickNum, HALJoystickPOVs *povs);
int HALGetJoystickButtons(uint8_t joystickNum, HALJoystickButtons *buttons, uint8_t *count);
void HALSetNewDataSem(pthread_mutex_t *);
void HALSetNewDataSem(pthread_cond_t *);
int HALInitialize(int mode = 0);
void HALNetworkCommunicationObserveUserProgramStarting();

View File

@@ -205,7 +205,7 @@ int HALGetJoystickButtons(uint8_t joystickNum, HALJoystickButtons *buttons, uint
return FRC_NetworkCommunication_getJoystickButtons(joystickNum, buttons, count);
}
void HALSetNewDataSem(pthread_mutex_t * param)
void HALSetNewDataSem(pthread_cond_t * param)
{
setNewDataSem(param);
}

View File

@@ -91,7 +91,7 @@ extern "C" {
# if defined (__vxworks)
void EXPORT_FUNC setNewDataSem(SEM_ID);
# else
void EXPORT_FUNC setNewDataSem(pthread_mutex_t *);
void EXPORT_FUNC setNewDataSem(pthread_cond_t *);
# endif
#endif

View File

@@ -68,7 +68,11 @@ namespace nUsageReporting
kResourceType_HiTechnicColorSensor,
kResourceType_HiTechnicAccel,
kResourceType_HiTechnicCompass,
kResourceType_SRF08,
kResourceType_SRF08,
kResourceType_AnalogOutput,
kResourceType_VictorSP,
kResourceType_TalonSRX,
kResourceType_CANTalonSRX,
} tResourceType;
typedef enum

0
ni-libraries/libni_emb.so.7.0.0 Normal file → Executable file
View File

0
ni-libraries/libni_rtlog.so.2.3.0 Normal file → Executable file
View File

0
ni-libraries/libnirio_emb_can.so.14.0.0 Normal file → Executable file
View File

Binary file not shown.

0
ni-libraries/libvisa.so Normal file → Executable file
View File

View File

@@ -105,7 +105,8 @@ private:
MUTEX_ID m_statusDataSemaphore;
Task m_task;
SEMAPHORE_ID m_newControlData;
MUTEX_ID m_packetDataAvailableSem;
MULTIWAIT_ID m_packetDataAvailableMultiWait;
MUTEX_ID m_packetDataAvailableMutex;
MULTIWAIT_ID m_waitForDataSem;
MUTEX_ID m_waitForDataMutex;
double m_approxMatchTimeOffset;

View File

@@ -35,7 +35,7 @@ DriverStation::DriverStation()
: m_statusDataSemaphore (initializeMutexNormal())
, m_task ("DriverStation", (FUNCPTR)DriverStation::InitTask)
, m_newControlData(0)
, m_packetDataAvailableSem (0)
, m_packetDataAvailableMultiWait(0)
, m_waitForDataSem(0)
, m_approxMatchTimeOffset(-1.0)
, m_userInDisabled(false)
@@ -53,16 +53,19 @@ DriverStation::DriverStation()
}
// Create a new semaphore
m_packetDataAvailableSem = initializeMutexNormal();
m_packetDataAvailableMultiWait = initializeMultiWait();
m_newControlData = initializeSemaphore(SEMAPHORE_EMPTY);
// Register that semaphore with the network communications task.
// It will signal when new packet data is available.
HALSetNewDataSem(m_packetDataAvailableSem);
m_waitForDataSem = initializeMultiWait();
m_waitForDataMutex = initializeMutexNormal();
m_packetDataAvailableMultiWait = initializeMultiWait();
m_packetDataAvailableMutex = initializeMutexNormal();
// Register that semaphore with the network communications task.
// It will signal when new packet data is available.
HALSetNewDataSem(m_packetDataAvailableMultiWait);
AddToSingletonList();
if (!m_task.Start((int32_t)this))
@@ -79,7 +82,8 @@ DriverStation::~DriverStation()
deleteMultiWait(m_waitForDataSem);
// Unregister our semaphore.
HALSetNewDataSem(0);
deleteMutex(m_packetDataAvailableSem);
deleteMultiWait(m_packetDataAvailableMultiWait);
deleteMutex(m_packetDataAvailableMutex);
deleteMutex(m_waitForDataMutex);
}
@@ -93,7 +97,7 @@ void DriverStation::Run()
int period = 0;
while (true)
{
takeMutex(m_packetDataAvailableSem);
takeMultiWait(m_packetDataAvailableMultiWait, m_packetDataAvailableMutex, 0);
GetData();
giveMultiWait(m_waitForDataSem);
if (++period >= 4)

View File

@@ -8,14 +8,12 @@ package edu.wpi.first.wpilibj;
import java.nio.IntBuffer;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import edu.wpi.first.wpilibj.communication.FRCNetworkCommunicationsLibrary;
import edu.wpi.first.wpilibj.communication.HALControlWord;
import edu.wpi.first.wpilibj.communication.HALAllianceStationID;
import edu.wpi.first.wpilibj.hal.HALUtil;
import edu.wpi.first.wpilibj.hal.PowerJNI;
import edu.wpi.first.wpilibj.Timer;
/**
* Provide access to the network communication data to / from the Driver Station.
@@ -73,6 +71,7 @@ public class DriverStation implements RobotState.Interface {
private boolean m_userInTeleop = false;
private boolean m_userInTest = false;
private boolean m_newControlData;
private final ByteBuffer m_packetDataAvailableMutex;
private final ByteBuffer m_packetDataAvailableSem;
/**
@@ -94,7 +93,8 @@ public class DriverStation implements RobotState.Interface {
m_semaphore = new Object();
m_dataSem = new Object();
m_packetDataAvailableSem = HALUtil.initializeMutexNormal();
m_packetDataAvailableMutex = HALUtil.initializeMutexNormal();
m_packetDataAvailableSem = HALUtil.initializeMultiWait();
FRCNetworkCommunicationsLibrary.setNewDataSem(m_packetDataAvailableSem);
m_thread = new Thread(new DriverStationTask(this), "FRCDriverStation");
@@ -116,7 +116,7 @@ public class DriverStation implements RobotState.Interface {
private void task() {
int safetyCounter = 0;
while (m_thread_keepalive) {
HALUtil.takeMutex(m_packetDataAvailableSem);
HALUtil.takeMultiWait(m_packetDataAvailableSem, m_packetDataAvailableMutex, 0);
synchronized (this) {
getData();
}

View File

@@ -23,6 +23,9 @@ public class HALUtil extends JNIWrapper {
//public static native ByteBuffer initializeSemaphore(int initialValue);
//public static native void deleteSemaphore(ByteBuffer sem);
//public static native byte takeSemaphore(ByteBuffer sem, int timeout);
public static native ByteBuffer initializeMultiWait();
public static native void deleteMultiWait(ByteBuffer sem);
public static native byte takeMultiWait(ByteBuffer sem, ByteBuffer m, int timeOut);
public static native short getFPGAVersion(IntBuffer status);
public static native int getFPGARevision(IntBuffer status);
public static native long getFPGATime(IntBuffer status);

View File

@@ -342,7 +342,7 @@ JNIEXPORT jint JNICALL Java_edu_wpi_first_wpilibj_communication_FRCNetworkCommun
JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_communication_FRCNetworkCommunicationsLibrary_setNewDataSem
(JNIEnv * env, jclass, jobject id )
{
MUTEX_ID* javaId = (MUTEX_ID*)env->GetDirectBufferAddress(id);
MULTIWAIT_ID* javaId = (MULTIWAIT_ID*)env->GetDirectBufferAddress(id);
NETCOMM_LOG(logDEBUG) << "Mutex Ptr = " << *javaId;
HALSetNewDataSem(*javaId);
}

View File

@@ -69,6 +69,49 @@ JNIEXPORT jbyte JNICALL Java_edu_wpi_first_wpilibj_hal_HALUtil_takeMutex
return returnValue;
}
/*
* Class: edu_wpi_first_wpilibj_hal_HALUtil
* Method: initializeMultiWait
* Signature: ()Ljava/nio/ByteBuffer;
*/
JNIEXPORT jobject JNICALL Java_edu_wpi_first_wpilibj_hal_HALUtil_initializeMultiWait
(JNIEnv * env, jclass)
{
HALUTIL_LOG(logDEBUG) << "Calling HALUtil initializeMultiWait";
MULTIWAIT_ID* multiWaitPtr = (MULTIWAIT_ID*)new unsigned char[4];
*multiWaitPtr = initializeMultiWait();
HALUTIL_LOG(logDEBUG) << "MultiWait Ptr = " << *multiWaitPtr;
return env->NewDirectByteBuffer( multiWaitPtr, 4);
}
/*
* Class: edu_wpi_first_wpilibj_hal_HALUtil
* Method: deleteMultiWait
* Signature: (Ljava/nio/ByteBuffer;)V
*/
JNIEXPORT void JNICALL Java_edu_wpi_first_wpilibj_hal_HALUtil_deleteMultiWait
(JNIEnv * env, jclass, jobject id)
{
HALUTIL_LOG(logDEBUG) << "Calling HALUtil deleteMultiWait";
MULTIWAIT_ID* javaId = (MULTIWAIT_ID*)env->GetDirectBufferAddress(id);
HALUTIL_LOG(logDEBUG) << "MultiWait Ptr = " << *javaId;
deleteMultiWait( *javaId );
}
/*
* Class: edu_wpi_first_wpilibj_hal_HALUtil
* Method: takeMultiWait
* Signature: (Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;I)B
*/
JNIEXPORT jbyte JNICALL Java_edu_wpi_first_wpilibj_hal_HALUtil_takeMultiWait
(JNIEnv * env, jclass, jobject multiWaitId, jobject mutexId, jint timeout)
{
MULTIWAIT_ID* javaMultiWaitId = (MULTIWAIT_ID*)env->GetDirectBufferAddress(multiWaitId);
MUTEX_ID* javaMutexId = (MUTEX_ID*)env->GetDirectBufferAddress(mutexId);
jbyte returnValue = takeMultiWait(*javaMultiWaitId, *javaMutexId, (int32_t) timeout);
return returnValue;
}
/*
* Class: edu_wpi_first_wpilibj_hal_HALUtil
* Method: getFPGAVersion