157 lines
6.9 KiB
C
157 lines
6.9 KiB
C
|
#ifndef __CAN_DEVICE_INTERFACE_H__
|
||
|
#define __CAN_DEVICE_INTERFACE_H__
|
||
|
|
||
|
#define MAX_STRING_LEN 64
|
||
|
|
||
|
#define SUPPORT_UNIQUE_ID (1) /* depends entirely on old vs new build */
|
||
|
#define USE_NTH_ORDER (0) /* zero to user deviceId */
|
||
|
#define SUPPORT_MOTOR_CONTROLLER_PROFILE (1)
|
||
|
namespace CANDeviceInterface1
|
||
|
{
|
||
|
|
||
|
struct PIDSlot
|
||
|
{
|
||
|
// Proportional gain
|
||
|
float pGain;
|
||
|
// Integral gain
|
||
|
float iGain;
|
||
|
// Differential gain
|
||
|
float dGain;
|
||
|
// Feed-forward gain
|
||
|
float fGain;
|
||
|
// Integral zone
|
||
|
float iZone;
|
||
|
// Closed-loop ramp rate
|
||
|
float clRampRate;
|
||
|
};
|
||
|
|
||
|
struct DeviceDescriptor
|
||
|
{
|
||
|
// The full device ID, including the device number, manufacturer, and device type.
|
||
|
// The mask of a message the device supports is 0x1FFF003F.
|
||
|
unsigned int deviceID;
|
||
|
#if SUPPORT_UNIQUE_ID != 0
|
||
|
// This is the ID that uniquely identifies the device node in the UI.
|
||
|
// The purpose of this is to be able to track the device across renames or deviceID changes.
|
||
|
unsigned int uniqueID;
|
||
|
#endif
|
||
|
// An dynamically assigned ID that will make setting deviceIDs robust,
|
||
|
// Never again will you need to isolate a CAN node just to fix it's ID.
|
||
|
unsigned int dynamicID;
|
||
|
// User visible name. This can be customized by the user, but should have a
|
||
|
// reasonable default.
|
||
|
char name[MAX_STRING_LEN];
|
||
|
// This is a user visible model name that should match the can_devices.ini section.
|
||
|
char model[MAX_STRING_LEN];
|
||
|
// This is a version number that represents the version of firmware currently
|
||
|
// installed on the device.
|
||
|
char currentVersion[MAX_STRING_LEN];
|
||
|
// Hardware revision.
|
||
|
char hardwareRev[MAX_STRING_LEN];
|
||
|
// Bootloader version. Will not change for the life of the product, but additional
|
||
|
// field upgrade features could be added in newer hardware.
|
||
|
char bootloaderRev[MAX_STRING_LEN];
|
||
|
// Manufacture Date. Could be a calender date or just the FRC season year.
|
||
|
// Also helps troubleshooting "old ones" vs "new ones".
|
||
|
char manufactureDate[MAX_STRING_LEN];
|
||
|
// General status of the hardware. For example if the device is in bootloader
|
||
|
// due to a bad flash UI could emphasize that.
|
||
|
char softwareStatus[MAX_STRING_LEN];
|
||
|
// Is the LED currently on?
|
||
|
bool led;
|
||
|
// Reserved fields for future use by CTRE. Not touched by frccansae
|
||
|
unsigned int dynFlags;
|
||
|
unsigned int flags; /* bitfield */
|
||
|
unsigned int ptrToString;
|
||
|
//unsigned int reserved0;
|
||
|
//unsigned int reserved1;
|
||
|
//unsigned int reserved2;
|
||
|
#if SUPPORT_MOTOR_CONTROLLER_PROFILE != 0
|
||
|
// Motor controller properties (ignored if SupportsMotorControllerProperties is false or unset for this model)
|
||
|
unsigned int brakeMode; // 0=Coast, 1=Brake
|
||
|
unsigned int limitSwitchFwdMode; // 0=disabled, 1=Normally Closed, 2=Normally Open
|
||
|
unsigned int limitSwitchRevMode; // 0=disabled, 1=Normally Closed, 2=Normally Open
|
||
|
// Limit-switch soft limits
|
||
|
bool bFwdSoftLimitEnable;
|
||
|
bool bRevSoftLimitEnable;
|
||
|
float softLimitFwd;
|
||
|
float softLimitRev;
|
||
|
// PID constants for slot 0
|
||
|
struct PIDSlot slot0;
|
||
|
// PID constants for slot 1
|
||
|
struct PIDSlot slot1;
|
||
|
#endif
|
||
|
};
|
||
|
|
||
|
#define kLimitSwitchMode_Disabled (0)
|
||
|
#define kLimitSwitchMode_NormallyClosed (1)
|
||
|
#define kLimitSwitchMode_NormallyOpen (2)
|
||
|
|
||
|
// Interface functions that must be implemented by the CAN Firmware Update Library
|
||
|
|
||
|
// Returns the number of devices that will be returned in a call to
|
||
|
// getListOfDevices(). The calling library will use this info to allocate enough
|
||
|
// memory to accept all device info.
|
||
|
int getNumberOfDevices();
|
||
|
|
||
|
// Return info about discovered devices. The array of structs should be
|
||
|
// populated before returning. The numDescriptors input describes how many
|
||
|
// elements were allocated to prevent memory corruption. The number of devices
|
||
|
// populated should be returned from this function as well.
|
||
|
int getListOfDevices(DeviceDescriptor *devices, int numDescriptors);
|
||
|
|
||
|
// When the user requests to update the firmware of a device a thread will be
|
||
|
// spawned and this function is called from that thread. This function should
|
||
|
// complete the firmware update process before returning. The image
|
||
|
// contents and size are directly from the file selected by the user. The
|
||
|
// error message string can be filled with a NULL-terminated message to show the
|
||
|
// user if there was a problem updating firmware. The error message is only
|
||
|
// displayed if a non-zero value is returned from this function.
|
||
|
int updateFirmware(const DeviceDescriptor *device, const unsigned char *imageContents, unsigned int imageSize, char *errorMessage, int errorMessageMaxSize);
|
||
|
|
||
|
// This function is called periodically from the UI thread while the firmware
|
||
|
// update is in progress. The percentComplete parameter should the filled in
|
||
|
// with the current progress of the firmware update process to update a progress
|
||
|
// bar in the UI.
|
||
|
void checkUpdateProgress(const DeviceDescriptor *device, int *percentComplete);
|
||
|
|
||
|
// This is called when the user selects a new ID to assign on the bus and
|
||
|
// chooses to save. The newDeviceID is really just the device number. The
|
||
|
// manufacturer and device type will remain unchanged. If a problem is detected
|
||
|
// when assigning a new ID, this function should return a non-zero value.
|
||
|
int assignBroadcastDeviceID(unsigned int newDeviceID);
|
||
|
// The device descriptor should be updated with the new device ID. The name may
|
||
|
// also change in the descriptor and will be updated in the UI immediately.
|
||
|
// Be sure to modify the descriptor first since the refresh from the UI is
|
||
|
// asynchronous.
|
||
|
int assignDeviceID(DeviceDescriptor *device, unsigned int newDeviceID);
|
||
|
|
||
|
// This entry-point will get called when the user chooses to change the value
|
||
|
// of the device's LED. This will allow the user to identify devices which
|
||
|
// support dynamic addresses or are otherwise unknown. If this function returns
|
||
|
// a non-zero value, the UI will report an error.
|
||
|
int saveLightLed(const DeviceDescriptor *device, bool newLEDStatus);
|
||
|
|
||
|
// This entry-point will get called when the user chooses to change the alias
|
||
|
// of the device with the device specified. If this function returns a non-
|
||
|
// zero value, the UI will report an error. The device descriptor must be
|
||
|
// updated with the new name that was selected. If a different name is saved
|
||
|
// to the descriptor than the user specified, this will require a manual
|
||
|
// refresh by the user. This is reported as CAR #505139
|
||
|
int saveDeviceName(DeviceDescriptor *device, const char *newName);
|
||
|
|
||
|
// This entry-point will get called when the user changes any of the motor
|
||
|
// controller specific properties. If this function returns a non-zero value,
|
||
|
// the UI will report an error. The device descriptor may be updated with
|
||
|
// coerced values.
|
||
|
int saveMotorParameters(DeviceDescriptor *device);
|
||
|
|
||
|
// Run some sort of self-test functionality on the device. This can be anything
|
||
|
// and the results will be displayed to the user. A non-zero return value
|
||
|
// indicates an error.
|
||
|
int selfTest(const DeviceDescriptor *device, char *detailedResults, int detailedResultsMaxSize);
|
||
|
|
||
|
} /* CANDeviceInterface */
|
||
|
|
||
|
#endif /* __CAN_DEVICE_INTERFACE_H__ */
|