Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of mbed_amf_controlsystem by
Diff: Periphery/SupportSystem.h
- Revision:
- 0:8a6003b8bb5b
- Child:
- 13:34f7f783ad24
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Periphery/SupportSystem.h Wed Feb 03 17:19:21 2016 +0000 @@ -0,0 +1,218 @@ +#ifndef SUPPORTSYSTEM_H_ +#define SUPPORTSYSTEM_H_ + +#include <mbed.h> +#include <I2C.h> + +/* + * Necessary for strcut sizes + */ +#pragma pack (1) + + +/* + * Data container + */ + +typedef struct { + uint8_t i2cDeviceAddress; + uint32_t uptimeMillis; +} Main_MaintenanceRegisterDataBuffer_t; + +typedef struct { + + uint8_t commandRegister; + + int32_t sensorRawXRegister; + int32_t sensorRawYRegister; + + float velocityXRegister; + float velocityXFilteredRegister; + float velocityAngularRegister; + float velocityAngularFilteredRegister; + + float positionXRegister; + float positionYRegister; + float positionAngleRegister; + + float conversionFactorRegister; + + float sensorPositionXRegister; + float sensorPositionYRegister; + float sensorPositionAngleRegister; + + int32_t curveRadiusRegister; + + float distanceXRegister; + + uint16_t squal; + + uint16_t completeChecksum; +// uint16_t velocityChecksumRegister; +// uint16_t positionChecksumRegister; + +} IMU_RegisterDataBuffer_t; + +typedef struct { + uint8_t commands; +} LightManager_RegisterDataBuffer_t; + +typedef struct { + + uint8_t channelValid[3]; + uint16_t channelActiveTime[3]; + int8_t channelPercent[3]; + uint16_t checksum; + +} RadioDecoder_RegisterDataBuffer_t; + + + + +/* + * Support system - software register + */ + +// Maintenance +#define SUPPORT_SYSTEM_REGISTER_ADDRESS_MAINTENANCE_OFFSET 0 +#define SUPPORT_SYSTEM_REGISTER_ADDRESS_MAINTENANCE_ADDRESS (SUPPORT_SYSTEM_REGISTER_ADDRESS_MAINTENANCE_OFFSET + 0) +#define SUPPORT_SYSTEM_REGISTER_ADDRESS_MAINTENANCE_UPTIME (SUPPORT_SYSTEM_REGISTER_ADDRESS_MAINTENANCE_OFFSET + 1) + +// IMU +#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET sizeof(Main_MaintenanceRegisterDataBuffer_t) +#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_COMMAND (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 0) + +#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_SENSOR_RAW_X (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 1) +#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_SENSOR_RAW_Y (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 5) + +#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_VELOCITY_X (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 9) +#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_VELOCITY_X_FILTERED (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 13) +#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_VELOCITY_ANGULAR (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 17) +#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_VELOCITY_ANGULAR_FILTERED (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 21) + +#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_POSITION_X (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 25) +#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_POSITION_Y (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 29) +#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_POSITION_ANGLE (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 33) + +#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_CONVERSION_FACTOR (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 37) +#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_SENSOR_POSITION_X (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 41) +#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_SENSOR_POSITION_Y (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 45) +#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_SENSOR_POSITION_ANGLE (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 49) + +#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_CURVE_RADIUS (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 53) + +#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_DISTANCE_X (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 57) + +#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_SQUAL (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 61) + +#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_COMPLETE_CHECKSUM (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 63) + +//#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_VELOCITY_CHECKSUM (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 63) +//#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_POSITION_CHECKSUM (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 65) + +// Light manager +#define SUPPORT_SYSTEM_REGISTER_ADDRESS_LIGHTMANAGER_OFFSET (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + sizeof(IMU_RegisterDataBuffer_t)) +#define SUPPORT_SYSTEM_REGISTER_ADDRESS_LIGHTMANAGER_COMMAND (SUPPORT_SYSTEM_REGISTER_ADDRESS_LIGHTMANAGER_OFFSET + 0) + +// Radio decoder +#define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET (SUPPORT_SYSTEM_REGISTER_ADDRESS_LIGHTMANAGER_OFFSET + sizeof(LightManager_RegisterDataBuffer_t)) +#define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_CHANNEL_ONE_VALID (SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET + 0) +#define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_CHANNEL_TWO_VALID (SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET + 1) +#define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_CHANNEL_THREE_VALID (SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET + 2) + +#define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_CHANNEL_ONE_ACTIVE_TIME (SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET + 3) +#define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_CHANNEL_TWO_ACTIVE_TIME (SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET + 5) +#define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_CHANNEL_THREE_ACTIVE_TIME (SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET + 7) + +#define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_CHANNEL_ONE_PERCENTAGE (SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET + 9) +#define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_CHANNEL_TWO_PERCENTAGE (SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET + 10) +#define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_CHANNEL_THREE_PERCENTAGE (SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET + 11) + +#define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_CHECKSUM (SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET + 12) + + + +/* + * LightManager + */ +#define SUPPORT_SYSTEM_LIGHTMANAGER_BIT_REMOTE_LIGHT 0 +#define SUPPORT_SYSTEM_LIGHTMANAGER_BIT_SIGNAL_LEFT 1 +#define SUPPORT_SYSTEM_LIGHTMANAGER_BIT_SIGNAL_RIGHT 2 +#define SUPPORT_SYSTEM_LIGHTMANAGER_BIT_SIGNAL_BOTH 3 +#define SUPPORT_SYSTEM_LIGHTMANAGER_BIT_BRAKE_LIGHT 4 + + +class SupportSystem{ + + +private: + + uint8_t i2cAddress; + I2C *i2c; + uint32_t transmissionErrorCount; + + uint16_t crc16_update(uint16_t crc, uint8_t a); + uint16_t generateChecksum(void *data, size_t len); + + /* + * IMU + */ + uint8_t imuCommand; + IMU_RegisterDataBuffer_t IMU_registerDataBuffer; + + /* + * LightManager + */ + uint8_t lightManagerCommand; + void setLightManagerCommandBit(bool value, uint8_t bit); + + /* + * RadioDecoder + */ + RadioDecoder_RegisterDataBuffer_t RadioDecoder_registerDataBuffer; + +public: + + SupportSystem(); + SupportSystem(uint8_t i2cAddress, I2C *i2c); + + void init(uint8_t i2cAddress, I2C *i2c); + + void readData(uint8_t registerAddress, void *buffer, size_t length); + void writeData(uint8_t registerAddress, void *buffer, size_t length); + + uint32_t getTransmissionErrorCount(); + + /* + * Maintenance + */ + uint32_t readMaintenanceUptimeMillis(); + + + /* + * IMU + */ + IMU_RegisterDataBuffer_t *getImuRegisterDataBuffer(); + + + + /* + * LightManager + */ + void writeLightManagerCommand(); + void setLightManagerBrakeLight(bool active, bool writeOut=true); + void setLightManagerRemoteLight(bool active, bool writeOut=true); + void setLightManagerSignalLeft(bool active, bool writeOut=true); + void setLightManagerSignalRight(bool active, bool writeOut=true); + void setLightManagerSignalBoth(bool active, bool writeOut=true); + + /* + * RadioDecoder + */ + RadioDecoder_RegisterDataBuffer_t *getRadioDecoderRegisterDataBuffer(); + +}; + + + +#endif /* SUPPORTSYSTEM_H_ */