Matti Borchers / Mbed 2 deprecated mbed_amf_controlsystem

Dependencies:   mbed-rtos mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers SupportSystem.h Source File

SupportSystem.h

00001 #ifndef SUPPORTSYSTEM_H_
00002 #define SUPPORTSYSTEM_H_
00003 
00004 #include <mbed.h>
00005 #include <I2C.h>
00006 
00007 /*
00008  * Necessary for strcut sizes
00009  */
00010 #pragma pack (1)
00011 
00012 
00013 /*
00014  * Data container
00015  */
00016 
00017 typedef struct {
00018     uint8_t i2cDeviceAddress;
00019     uint32_t uptimeMillis;
00020 } Main_MaintenanceRegisterDataBuffer_t;
00021 
00022 typedef struct {
00023 
00024     uint8_t commandRegister;
00025 
00026     int32_t sensorRawXRegister;
00027     int32_t sensorRawYRegister;
00028 
00029     float velocityXRegister;
00030     float velocityXFilteredRegister;
00031     float velocityAngularRegister;
00032     float velocityAngularFilteredRegister;
00033 
00034     float positionXRegister;
00035     float positionYRegister;
00036     float positionAngleRegister;
00037 
00038     float conversionFactorRegister;
00039 
00040     float sensorPositionXRegister;
00041     float sensorPositionYRegister;
00042     float sensorPositionAngleRegister;
00043 
00044     int32_t curveRadiusRegister;
00045 
00046     float distanceXRegister;
00047 
00048     uint16_t squal;
00049 
00050     uint16_t completeChecksum;
00051 //  uint16_t velocityChecksumRegister;
00052 //  uint16_t positionChecksumRegister;
00053 
00054 } IMU_RegisterDataBuffer_t;
00055 
00056 typedef struct {
00057     uint8_t commands;
00058 } LightManager_RegisterDataBuffer_t;
00059 
00060 typedef struct {
00061 
00062     uint8_t  channelValid[3];
00063     uint16_t channelActiveTime[3];
00064     int8_t   channelPercent[3];
00065     uint16_t checksum;
00066 
00067 } RadioDecoder_RegisterDataBuffer_t;
00068 
00069 
00070 
00071 
00072 /*
00073  * Support system - software register
00074  */
00075 
00076 // Maintenance
00077 #define SUPPORT_SYSTEM_REGISTER_ADDRESS_MAINTENANCE_OFFSET                  0
00078 #define SUPPORT_SYSTEM_REGISTER_ADDRESS_MAINTENANCE_ADDRESS                 (SUPPORT_SYSTEM_REGISTER_ADDRESS_MAINTENANCE_OFFSET + 0)
00079 #define SUPPORT_SYSTEM_REGISTER_ADDRESS_MAINTENANCE_UPTIME                  (SUPPORT_SYSTEM_REGISTER_ADDRESS_MAINTENANCE_OFFSET + 1)
00080 
00081 // IMU
00082 #define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET                          sizeof(Main_MaintenanceRegisterDataBuffer_t)
00083 #define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_COMMAND                         (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 0)
00084 
00085 #define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_SENSOR_RAW_X                    (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 1)
00086 #define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_SENSOR_RAW_Y                    (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 5)
00087 
00088 #define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_VELOCITY_X                      (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 9)
00089 #define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_VELOCITY_X_FILTERED             (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 13)
00090 #define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_VELOCITY_ANGULAR                (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 17)
00091 #define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_VELOCITY_ANGULAR_FILTERED       (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 21)
00092 
00093 #define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_POSITION_X                      (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 25)
00094 #define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_POSITION_Y                      (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 29)
00095 #define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_POSITION_ANGLE                  (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 33)
00096 
00097 #define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_CONVERSION_FACTOR               (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 37)
00098 #define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_SENSOR_POSITION_X               (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 41)
00099 #define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_SENSOR_POSITION_Y               (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 45)
00100 #define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_SENSOR_POSITION_ANGLE           (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 49)
00101 
00102 #define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_CURVE_RADIUS                    (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 53)
00103 
00104 #define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_DISTANCE_X                      (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 57)
00105 
00106 #define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_SQUAL                           (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 61)
00107 
00108 #define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_COMPLETE_CHECKSUM               (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 63)
00109 
00110 //#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_VELOCITY_CHECKSUM             (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 63)
00111 //#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_POSITION_CHECKSUM             (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 65)
00112 
00113 // Light manager
00114 #define SUPPORT_SYSTEM_REGISTER_ADDRESS_LIGHTMANAGER_OFFSET                 (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + sizeof(IMU_RegisterDataBuffer_t))
00115 #define SUPPORT_SYSTEM_REGISTER_ADDRESS_LIGHTMANAGER_COMMAND                (SUPPORT_SYSTEM_REGISTER_ADDRESS_LIGHTMANAGER_OFFSET + 0)
00116 
00117 // Radio decoder
00118 #define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET                     (SUPPORT_SYSTEM_REGISTER_ADDRESS_LIGHTMANAGER_OFFSET + sizeof(LightManager_RegisterDataBuffer_t))
00119 #define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_CHANNEL_ONE_VALID          (SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET + 0)
00120 #define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_CHANNEL_TWO_VALID          (SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET + 1)
00121 #define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_CHANNEL_THREE_VALID        (SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET + 2)
00122 
00123 #define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_CHANNEL_ONE_ACTIVE_TIME    (SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET + 3)
00124 #define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_CHANNEL_TWO_ACTIVE_TIME    (SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET + 5)
00125 #define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_CHANNEL_THREE_ACTIVE_TIME  (SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET + 7)
00126 
00127 #define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_CHANNEL_ONE_PERCENTAGE     (SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET + 9)
00128 #define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_CHANNEL_TWO_PERCENTAGE     (SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET + 10)
00129 #define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_CHANNEL_THREE_PERCENTAGE   (SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET + 11)
00130 
00131 #define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_CHECKSUM                   (SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET + 12)
00132 
00133 
00134 
00135 /*
00136  * LightManager
00137  */
00138 #define SUPPORT_SYSTEM_LIGHTMANAGER_BIT_REMOTE_LIGHT    0
00139 #define SUPPORT_SYSTEM_LIGHTMANAGER_BIT_SIGNAL_LEFT     1
00140 #define SUPPORT_SYSTEM_LIGHTMANAGER_BIT_SIGNAL_RIGHT    2
00141 #define SUPPORT_SYSTEM_LIGHTMANAGER_BIT_SIGNAL_BOTH     3
00142 #define SUPPORT_SYSTEM_LIGHTMANAGER_BIT_BRAKE_LIGHT     4
00143 
00144 
00145 class SupportSystem{
00146 
00147 
00148 private:
00149 
00150     uint8_t i2cAddress;
00151     I2C *i2c;
00152     uint32_t transmissionErrorCount;
00153 
00154     uint16_t crc16_update(uint16_t crc, uint8_t a);
00155     uint16_t generateChecksum(void *data, size_t len);
00156 
00157     /*
00158      * IMU
00159      */
00160     uint8_t imuCommand;
00161     IMU_RegisterDataBuffer_t IMU_registerDataBuffer;
00162 
00163     /*
00164      * LightManager
00165      */
00166     uint8_t lightManagerCommand;
00167     void setLightManagerCommandBit(bool value, uint8_t bit);
00168 
00169     /*
00170      * RadioDecoder
00171      */
00172     RadioDecoder_RegisterDataBuffer_t RadioDecoder_registerDataBuffer;
00173 
00174 public:
00175 
00176     SupportSystem();
00177     SupportSystem(uint8_t i2cAddress, I2C *i2c);
00178 
00179     void init(uint8_t i2cAddress, I2C *i2c);
00180 
00181     void readData(uint8_t registerAddress, void *buffer, size_t length);
00182     void writeData(uint8_t registerAddress, void *buffer, size_t length);
00183 
00184     uint32_t getTransmissionErrorCount();
00185 
00186     /*
00187      * Maintenance
00188      */
00189     uint32_t readMaintenanceUptimeMillis();
00190 
00191 
00192     /*
00193      * IMU
00194      */
00195     IMU_RegisterDataBuffer_t *getImuRegisterDataBuffer();
00196     void writeImuConfig(float *config_register, size_t length=4);
00197 
00198 
00199 
00200     /*
00201      * LightManager
00202      */
00203     void writeLightManagerCommand();
00204     void setLightManagerBrakeLight(bool active, bool writeOut=true);
00205     void setLightManagerRemoteLight(bool active, bool writeOut=true);
00206     void setLightManagerSignalLeft(bool active, bool writeOut=true);
00207     void setLightManagerSignalRight(bool active, bool writeOut=true);
00208     void setLightManagerSignalBoth(bool active, bool writeOut=true);
00209 
00210     /*
00211      * RadioDecoder
00212      */
00213     RadioDecoder_RegisterDataBuffer_t *getRadioDecoderRegisterDataBuffer();
00214 
00215 };
00216 
00217 
00218 
00219 #endif /* SUPPORTSYSTEM_H_ */