//This file must compile on ALL PLATFORMS. Be very careful what you put in here. #include "HAL/HAL.hpp" #include "FRC_NetworkCommunication/FRCComm.h" #include 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"