/*----------------------------------------------------------------------------*/ /* Copyright (c) FIRST 2016. All Rights Reserved. */ /* Open Source Software - may be modified and shared by FRC teams. The code */ /* must be accompanied by the FIRST BSD license file in the root directory of */ /* the project. */ /*----------------------------------------------------------------------------*/ // This file must compile on ALL PLATFORMS. Be very careful what you put in // here. #include "HAL/HAL.h" #include #include "FRC_NetworkCommunication/FRCComm.h" struct HALJoystickAxesInt { uint16_t count; int16_t axes[kMaxJoystickAxes]; }; 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) { HALJoystickAxesInt axesInt; int retVal = FRC_NetworkCommunication_getJoystickAxes( joystickNum, (JoystickAxes_t*)&axesInt, kMaxJoystickAxes); // copy int values to float values axes->count = axesInt.count; // current scaling is -128 to 127, can easily be patched in the future by // changing this function. for (unsigned int i = 0; i < axesInt.count; i++) { int8_t value = axesInt.axes[i]; if (value < 0) { axes->axes[i] = value / 128.0f; } else { axes->axes[i] = value / 127.0f; } } return retVal; } 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"