DriverStation::~DriverStation() { m_isRunning = false; m_task.join(); // Unregister our semaphore. HALSetNewDataSem(nullptr); }
DriverStation::~DriverStation() { m_task.Stop(); m_instance = NULL; deleteMultiWait(m_waitForDataSem); // Unregister our semaphore. HALSetNewDataSem(0); deleteMultiWait(m_packetDataAvailableMultiWait); deleteMutex(m_packetDataAvailableMutex); deleteMutex(m_waitForDataMutex); }
/** * DriverStation constructor. * * This is only called once the first time GetInstance() is called */ DriverStation::DriverStation() : m_task ("DriverStation", (FUNCPTR)DriverStation::InitTask) , m_newControlData(0) , m_packetDataAvailableMultiWait(0) , m_waitForDataSem(0) , m_userInDisabled(false) , m_userInAutonomous(false) , m_userInTeleop(false) , m_userInTest(false) , m_nextMessageTime(0) { // All joysticks should default to having zero axes, povs and buttons, so // uninitialized memory doesn't get sent to speed controllers. for(unsigned int i = 0; i < kJoystickPorts; i++) { m_joystickAxes[i].count = 0; m_joystickPOVs[i].count = 0; m_joystickButtons[i].count = 0; m_joystickDescriptor[i].isXbox = 0; m_joystickDescriptor[i].type = -1; m_joystickDescriptor[i].name[0] = '\0'; } // Create a new semaphore m_packetDataAvailableMultiWait = initializeMultiWait(); m_newControlData = initializeSemaphore(SEMAPHORE_EMPTY); 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(); // They need to be identical or it could lead to runtime stack corruption if // the caller and callee push and pop different amounts of data on the stack. static_assert(sizeof(this) == sizeof(uint32_t), "We are passing a pointer through a uint32_t"); if (!m_task.Start((uint32_t)this)) { wpi_setWPIError(DriverStationTaskError); } }
/** * DriverStation constructor. * * This is only called once the first time GetInstance() is called */ DriverStation::DriverStation() { // All joysticks should default to having zero axes, povs and buttons, so // uninitialized memory doesn't get sent to speed controllers. for (unsigned int i = 0; i < kJoystickPorts; i++) { m_joystickAxes[i].count = 0; m_joystickPOVs[i].count = 0; m_joystickButtons[i].count = 0; m_joystickDescriptor[i].isXbox = 0; m_joystickDescriptor[i].type = -1; m_joystickDescriptor[i].name[0] = '\0'; } // Register that semaphore with the network communications task. // It will signal when new packet data is available. HALSetNewDataSem(m_packetDataAvailableCond.native_handle()); AddToSingletonList(); }
/** * DriverStation constructor. * * This is only called once the first time GetInstance() is called */ DriverStation::DriverStation() : m_task ("DriverStation", (FUNCPTR)DriverStation::InitTask) , m_newControlData(0) , m_packetDataAvailableMultiWait(0) , m_waitForDataSem(0) , m_userInDisabled(false) , m_userInAutonomous(false) , m_userInTeleop(false) , m_userInTest(false) , m_nextMessageTime(0) { // All joysticks should default to having zero axes, povs and buttons, so // uninitialized memory doesn't get sent to speed controllers. for(unsigned int i = 0; i < kJoystickPorts; i++) { m_joystickAxes[i].count = 0; m_joystickPOVs[i].count = 0; m_joystickButtons[i].count = 0; } // Create a new semaphore m_packetDataAvailableMultiWait = initializeMultiWait(); m_newControlData = initializeSemaphore(SEMAPHORE_EMPTY); 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)) { wpi_setWPIError(DriverStationTaskError); } }