// This file must compile on ALL PLATFORMS. Be very careful what you put in // here. #include "HAL/HAL.hpp" #include #include "FRC_NetworkCommunication/FRCComm.h" extern "C" { int HALGetControlWord(HALControlWord* data) { return FRC_NetworkCommunication_getControlWord((ControlWord_t*)data); } void HALSetNewDataSem(MULTIWAIT_ID sem) { setNewDataSem(sem->native_handle()); } int HALGetAllianceStation(enum HALAllianceStationID* allianceStation) { return FRC_NetworkCommunication_getAllianceStation( (AllianceStationID_t*)allianceStation); } int HALGetJoystickAxes(uint8_t joystickNum, HALJoystickAxes* axes) { return FRC_NetworkCommunication_getJoystickAxes( joystickNum, (JoystickAxes_t*)axes, kMaxJoystickAxes); } int HALGetJoystickPOVs(uint8_t joystickNum, HALJoystickPOVs* povs) { return FRC_NetworkCommunication_getJoystickPOVs( joystickNum, (JoystickPOV_t*)povs, kMaxJoystickPOVs); } int HALGetJoystickButtons(uint8_t joystickNum, HALJoystickButtons* buttons) { return FRC_NetworkCommunication_getJoystickButtons( joystickNum, &buttons->buttons, &buttons->count); } /** * Retrieve the Joystick Descriptor for particular slot * @param desc [out] descriptor (data transfer object) to fill in. desc is * filled in regardless of success. In other words, if descriptor is not * available, desc is filled in with default values matching the init-values in * Java and C++ Driverstation for when caller requests a too-large joystick * index. * * @return error code reported from Network Comm back-end. Zero is good, * nonzero is bad. */ int HALGetJoystickDescriptor(uint8_t joystickNum, HALJoystickDescriptor* desc) { desc->isXbox = 0; desc->type = -1; desc->name[0] = '\0'; desc->axisCount = kMaxJoystickAxes; /* set to the desc->axisTypes's capacity */ desc->buttonCount = 0; desc->povCount = 0; int retval = FRC_NetworkCommunication_getJoystickDesc( joystickNum, &desc->isXbox, &desc->type, (char*)(&desc->name), &desc->axisCount, (uint8_t*)&desc->axisTypes, &desc->buttonCount, &desc->povCount); /* check the return, if there is an error and the RIOimage predates FRC2017, * then axisCount needs to be cleared */ if (retval != 0) { /* set count to zero so downstream code doesn't decode invalid axisTypes. */ desc->axisCount = 0; } return retval; } int HALGetJoystickIsXbox(uint8_t joystickNum) { HALJoystickDescriptor joystickDesc; if (HALGetJoystickDescriptor(joystickNum, &joystickDesc) < 0) { return 0; } else { return joystickDesc.isXbox; } } int HALGetJoystickType(uint8_t joystickNum) { HALJoystickDescriptor joystickDesc; if (HALGetJoystickDescriptor(joystickNum, &joystickDesc) < 0) { return -1; } else { return joystickDesc.type; } } char* HALGetJoystickName(uint8_t joystickNum) { HALJoystickDescriptor joystickDesc; if (HALGetJoystickDescriptor(joystickNum, &joystickDesc) < 0) { char* name = (char*)std::malloc(1); name[0] = '\0'; return name; } else { size_t len = std::strlen(joystickDesc.name); char* name = (char*)std::malloc(len + 1); std::strcpy(name, joystickDesc.name); return name; } } int HALGetJoystickAxisType(uint8_t joystickNum, uint8_t axis) { HALJoystickDescriptor joystickDesc; if (HALGetJoystickDescriptor(joystickNum, &joystickDesc) < 0) { return -1; } else { return joystickDesc.axisTypes[axis]; } } int HALSetJoystickOutputs(uint8_t joystickNum, uint32_t outputs, uint16_t leftRumble, uint16_t rightRumble) { return FRC_NetworkCommunication_setJoystickOutputs(joystickNum, outputs, leftRumble, rightRumble); } int HALGetMatchTime(float* matchTime) { return FRC_NetworkCommunication_getMatchTime(matchTime); } void HALNetworkCommunicationObserveUserProgramStarting(void) { FRC_NetworkCommunication_observeUserProgramStarting(); } void HALNetworkCommunicationObserveUserProgramDisabled(void) { FRC_NetworkCommunication_observeUserProgramDisabled(); } void HALNetworkCommunicationObserveUserProgramAutonomous(void) { FRC_NetworkCommunication_observeUserProgramAutonomous(); } void HALNetworkCommunicationObserveUserProgramTeleop(void) { FRC_NetworkCommunication_observeUserProgramTeleop(); } void HALNetworkCommunicationObserveUserProgramTest(void) { FRC_NetworkCommunication_observeUserProgramTest(); } } // extern "C"