diff --git a/eclipse-plugins/edu.wpi.first.wpilib.plugins.java/src/main/resources/java-zip/ant/robotCommand b/eclipse-plugins/edu.wpi.first.wpilib.plugins.java/src/main/resources/java-zip/ant/robotCommand index 93d1cad290..a66e68739e 100644 --- a/eclipse-plugins/edu.wpi.first.wpilib.plugins.java/src/main/resources/java-zip/ant/robotCommand +++ b/eclipse-plugins/edu.wpi.first.wpilib.plugins.java/src/main/resources/java-zip/ant/robotCommand @@ -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 diff --git a/eclipse-plugins/edu.wpi.first.wpilib.plugins.java/src/main/resources/java-zip/ant/robotDebugCommand b/eclipse-plugins/edu.wpi.first.wpilib.plugins.java/src/main/resources/java-zip/ant/robotDebugCommand index 5032c29c75..a75d754ec2 100644 --- a/eclipse-plugins/edu.wpi.first.wpilib.plugins.java/src/main/resources/java-zip/ant/robotDebugCommand +++ b/eclipse-plugins/edu.wpi.first.wpilib.plugins.java/src/main/resources/java-zip/ant/robotDebugCommand @@ -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 diff --git a/hal/include/HAL/HAL.hpp b/hal/include/HAL/HAL.hpp index b3771fb422..1b5b7abd97 100644 --- a/hal/include/HAL/HAL.hpp +++ b/hal/include/HAL/HAL.hpp @@ -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(); diff --git a/hal/lib/Athena/HAL.cpp b/hal/lib/Athena/HAL.cpp index 7b47745358..7812e300c7 100644 --- a/hal/lib/Athena/HAL.cpp +++ b/hal/lib/Athena/HAL.cpp @@ -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); } diff --git a/hal/lib/Athena/NetworkCommunication/FRCComm.h b/hal/lib/Athena/NetworkCommunication/FRCComm.h index d542eca14b..87e3ee5291 100644 --- a/hal/lib/Athena/NetworkCommunication/FRCComm.h +++ b/hal/lib/Athena/NetworkCommunication/FRCComm.h @@ -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 diff --git a/hal/lib/Athena/NetworkCommunication/UsageReporting.h b/hal/lib/Athena/NetworkCommunication/UsageReporting.h index 918ac5ae63..0ec2a3a4ea 100644 --- a/hal/lib/Athena/NetworkCommunication/UsageReporting.h +++ b/hal/lib/Athena/NetworkCommunication/UsageReporting.h @@ -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 diff --git a/ni-libraries/libFRC_NetworkCommunication.so.1.5.0 b/ni-libraries/libFRC_NetworkCommunication.so.1.5.0 index 556a49ca79..02fecb81ff 100755 Binary files a/ni-libraries/libFRC_NetworkCommunication.so.1.5.0 and b/ni-libraries/libFRC_NetworkCommunication.so.1.5.0 differ diff --git a/ni-libraries/libFRC_NetworkCommunicationLV.so.1.5.0 b/ni-libraries/libFRC_NetworkCommunicationLV.so.1.5.0 index 9bf208ae28..c9a00e3c49 100755 Binary files a/ni-libraries/libFRC_NetworkCommunicationLV.so.1.5.0 and b/ni-libraries/libFRC_NetworkCommunicationLV.so.1.5.0 differ diff --git a/ni-libraries/libni_emb.so.7.0.0 b/ni-libraries/libni_emb.so.7.0.0 old mode 100644 new mode 100755 diff --git a/ni-libraries/libni_rtlog.so.2.3.0 b/ni-libraries/libni_rtlog.so.2.3.0 old mode 100644 new mode 100755 diff --git a/ni-libraries/libnirio_emb_can.so.14.0.0 b/ni-libraries/libnirio_emb_can.so.14.0.0 old mode 100644 new mode 100755 diff --git a/ni-libraries/libspi.so.1.0.0 b/ni-libraries/libspi.so.1.0.0 index 19870c63d6..fcb0661ee6 100755 Binary files a/ni-libraries/libspi.so.1.0.0 and b/ni-libraries/libspi.so.1.0.0 differ diff --git a/ni-libraries/libvisa.so b/ni-libraries/libvisa.so old mode 100644 new mode 100755 diff --git a/wpilibc/wpilibC++Devices/include/DriverStation.h b/wpilibc/wpilibC++Devices/include/DriverStation.h index 46b9e680c8..927222b2ac 100644 --- a/wpilibc/wpilibC++Devices/include/DriverStation.h +++ b/wpilibc/wpilibC++Devices/include/DriverStation.h @@ -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; diff --git a/wpilibc/wpilibC++Devices/src/DriverStation.cpp b/wpilibc/wpilibC++Devices/src/DriverStation.cpp index fd888e8a10..c5e5f2cb01 100644 --- a/wpilibc/wpilibC++Devices/src/DriverStation.cpp +++ b/wpilibc/wpilibC++Devices/src/DriverStation.cpp @@ -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) diff --git a/wpilibj/wpilibJavaDevices/src/main/java/edu/wpi/first/wpilibj/DriverStation.java b/wpilibj/wpilibJavaDevices/src/main/java/edu/wpi/first/wpilibj/DriverStation.java index dc4d463a3e..940ca4968b 100644 --- a/wpilibj/wpilibJavaDevices/src/main/java/edu/wpi/first/wpilibj/DriverStation.java +++ b/wpilibj/wpilibJavaDevices/src/main/java/edu/wpi/first/wpilibj/DriverStation.java @@ -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(); } diff --git a/wpilibj/wpilibJavaDevices/src/main/java/edu/wpi/first/wpilibj/hal/HALUtil.java b/wpilibj/wpilibJavaDevices/src/main/java/edu/wpi/first/wpilibj/hal/HALUtil.java index ab9e6a5123..bdb2e47cd9 100644 --- a/wpilibj/wpilibJavaDevices/src/main/java/edu/wpi/first/wpilibj/hal/HALUtil.java +++ b/wpilibj/wpilibJavaDevices/src/main/java/edu/wpi/first/wpilibj/hal/HALUtil.java @@ -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); diff --git a/wpilibj/wpilibJavaJNI/lib/FRCNetworkCommunicationsLibrary.cpp b/wpilibj/wpilibJavaJNI/lib/FRCNetworkCommunicationsLibrary.cpp index e4d5b4e6df..f517e87c0c 100644 --- a/wpilibj/wpilibJavaJNI/lib/FRCNetworkCommunicationsLibrary.cpp +++ b/wpilibj/wpilibJavaJNI/lib/FRCNetworkCommunicationsLibrary.cpp @@ -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); } diff --git a/wpilibj/wpilibJavaJNI/lib/HALUtil.cpp b/wpilibj/wpilibJavaJNI/lib/HALUtil.cpp index 1d0bb39a4b..badc0a145b 100644 --- a/wpilibj/wpilibJavaJNI/lib/HALUtil.cpp +++ b/wpilibj/wpilibJavaJNI/lib/HALUtil.cpp @@ -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