Sharpsoft/include/pros/device.hpp
2024-04-29 13:51:34 -04:00

163 lines
3.7 KiB
C++

/**
* \file pros/device.hpp
*
* Base class for all smart devices.
*
* This file should not be modified by users, since it gets replaced whenever
* a kernel upgrade occurs.
*
* \copyright (c) 2017-2021, Purdue University ACM SIGBots.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* \defgroup cpp-device VEX Generic Device C++ API (For Advanced Users)
*/
#ifndef _PROS_DEVICE_HPP_
#define _PROS_DEVICE_HPP_
#include "pros/misc.hpp"
#include "pros/rtos.hpp"
namespace pros {
inline namespace v5 {
/**
* \ingroup cpp-device
* \note These functions can be used for dynamic device instantiation.
*/
/**
* \addtogroup cpp-device
* @{
*/
/**
* \enum DeviceType
* \brief
* Enum of possible v5 devices.
*
* Contains all current V5 Devices.
*/
enum class DeviceType {
none = 0, ///< No device is plugged into the port
motor = 2, ///< A motor is plugged into the port
rotation = 4, ///< A rotation sensor is plugged into the port
imu = 6, ///< An inertial sensor is plugged into the port
distance = 7, ///< A distance sensor is plugged into the port
radio = 8, ///< A radio is plugged into the port
vision = 11, ///< A vision sensor is plugged into the port
adi = 12, ///< This port is an ADI expander
optical = 16, ///< An optical sensor is plugged into the port
gps = 20, ///< A GPS sensor is plugged into the port
serial = 129, ///< A serial device is plugged into the port
undefined = 255 ///< The device type is not defined, or is not a valid device
};
class Device {
public:
/**
* Creates a Device object.
*
* \param port The V5 port number from 1-21
*
* \b Example
* \code
* #define DEVICE_PORT 1
*
* void opcontrol() {
* Device device(DEVICE_PORT);
* }
* \endcode
*/
explicit Device(const std::uint8_t port);
/**
* Gets the port number of the Smart Device.
*
* \return The smart device's port number.
*
* \b Example
* \code
* void opcontrol() {
* #define DEVICE_PORT 1
* while (true) {
* Device device(DEVICE_PORT);
* printf("device plugged type: {port: %d}\n", device.get_port());
* delay(20);
* }
* }
* \endcode
*/
std::uint8_t get_port(void);
/**
* Checks if the device is installed.
*
* \return true if the corresponding device is installed, false otherwise.
* \b Example
*
* \code
* #define DEVICE_PORT 1
*
* void opcontrol() {
* Device device(DEVICE_PORT);
* while (true) {
* printf("device plugged type: {is_installed: %d}\n", device.is_installed());
* delay(20);
* }
* }
* \endcode
*/
virtual bool is_installed();
/**
* Gets the type of device.
*
* This function uses the following values of errno when an error state is
* reached:
* EACCES - Mutex of port cannot be taken (access denied).
*
* \return The device type as an enum.
*
* \b Example
* \code
* #define DEVICE_PORT 1
*
* void opcontrol() {
Device device(DEVICE_PORT);
* while (true) {
* DeviceType dt = device.get_plugged_type();
* printf("device plugged type: {plugged type: %d}\n", dt);
* delay(20);
* }
* }
* \endcode
*/
pros::DeviceType get_plugged_type() const;
protected:
/**
* Creates a Device object.
*
* \param port The V5 port number from 1-21
*
* \param deviceType The type of the constructed device
*/
Device(const std::uint8_t port, const enum DeviceType deviceType) :
_port(port),
_deviceType(deviceType) {}
protected:
const std::uint8_t _port;
const enum DeviceType _deviceType = pros::DeviceType::none;
///@}
};
} // namespace v5
} // namespace pros
#endif