strat des robots

Fork of CRAC-Strat_2017 by CRAC Team

Committer:
ClementBreteau
Date:
Fri May 19 17:14:07 2017 +0000
Revision:
17:d1594579eec6
Parent:
0:ad97421fb1fb
strat du robot, 19-05-2017, 19h

Who changed what in which revision?

UserRevisionLine numberNew contents of line
antbig 0:ad97421fb1fb 1 /* mbed Microcontroller Library - can
antbig 0:ad97421fb1fb 2 * Copyright (c) 2009-2011 ARM Limited. All rights reserved.
antbig 0:ad97421fb1fb 3 */
antbig 0:ad97421fb1fb 4
antbig 0:ad97421fb1fb 5 #ifndef MBED_CAN_H
antbig 0:ad97421fb1fb 6 #define MBED_CAN_H
antbig 0:ad97421fb1fb 7
antbig 0:ad97421fb1fb 8 #include "device.h"
antbig 0:ad97421fb1fb 9
antbig 0:ad97421fb1fb 10 #if DEVICE_CAN
antbig 0:ad97421fb1fb 11
antbig 0:ad97421fb1fb 12 #include "Base.h"
antbig 0:ad97421fb1fb 13 #include "platform.h"
antbig 0:ad97421fb1fb 14 #include "PinNames.h"
antbig 0:ad97421fb1fb 15 #include "PeripheralNames.h"
antbig 0:ad97421fb1fb 16
antbig 0:ad97421fb1fb 17 #include "can_helper.h"
antbig 0:ad97421fb1fb 18 #include "FunctionPointer.h"
antbig 0:ad97421fb1fb 19
antbig 0:ad97421fb1fb 20 #include <string.h>
antbig 0:ad97421fb1fb 21
antbig 0:ad97421fb1fb 22 namespace mbed {
antbig 0:ad97421fb1fb 23
antbig 0:ad97421fb1fb 24 /* Class: CANMessage
antbig 0:ad97421fb1fb 25 *
antbig 0:ad97421fb1fb 26 */
antbig 0:ad97421fb1fb 27 class CANMessage : public CAN_Message {
antbig 0:ad97421fb1fb 28
antbig 0:ad97421fb1fb 29 public:
antbig 0:ad97421fb1fb 30
antbig 0:ad97421fb1fb 31 /* Constructor: CANMessage
antbig 0:ad97421fb1fb 32 * Creates empty CAN message.
antbig 0:ad97421fb1fb 33 */
antbig 0:ad97421fb1fb 34 CANMessage() {
antbig 0:ad97421fb1fb 35 len = 8;
antbig 0:ad97421fb1fb 36 type = CANData;
antbig 0:ad97421fb1fb 37 format = CANStandard;
antbig 0:ad97421fb1fb 38 id = 0;
antbig 0:ad97421fb1fb 39 memset(data, 0, 8);
antbig 0:ad97421fb1fb 40 }
antbig 0:ad97421fb1fb 41
antbig 0:ad97421fb1fb 42 /* Constructor: CANMessage
antbig 0:ad97421fb1fb 43 * Creates CAN message with specific content.
antbig 0:ad97421fb1fb 44 */
antbig 0:ad97421fb1fb 45 CANMessage(int _id, const char *_data, char _len = 8, CANType _type = CANData, CANFormat _format = CANStandard) {
antbig 0:ad97421fb1fb 46 len = _len & 0xF;
antbig 0:ad97421fb1fb 47 type = _type;
antbig 0:ad97421fb1fb 48 format = _format;
antbig 0:ad97421fb1fb 49 id = _id;
antbig 0:ad97421fb1fb 50 memcpy(data, _data, _len);
antbig 0:ad97421fb1fb 51 }
antbig 0:ad97421fb1fb 52
antbig 0:ad97421fb1fb 53 /* Constructor: CANMessage
antbig 0:ad97421fb1fb 54 * Creates CAN remote message.
antbig 0:ad97421fb1fb 55 */
antbig 0:ad97421fb1fb 56 CANMessage(int _id, CANFormat _format = CANStandard) {
antbig 0:ad97421fb1fb 57 len = 0;
antbig 0:ad97421fb1fb 58 type = CANRemote;
antbig 0:ad97421fb1fb 59 format = _format;
antbig 0:ad97421fb1fb 60 id = _id;
antbig 0:ad97421fb1fb 61 memset(data, 0, 8);
antbig 0:ad97421fb1fb 62 }
antbig 0:ad97421fb1fb 63 #if 0 // Inhereted from CAN_Message, for documentation only
antbig 0:ad97421fb1fb 64
antbig 0:ad97421fb1fb 65 /* Variable: id
antbig 0:ad97421fb1fb 66 * The message id.
antbig 0:ad97421fb1fb 67 *
antbig 0:ad97421fb1fb 68 * If format is CANStandard it must be an 11 bit long id
antbig 0:ad97421fb1fb 69 * If format is CANExtended it must be an 29 bit long id
antbig 0:ad97421fb1fb 70 */
antbig 0:ad97421fb1fb 71 unsigned int id;
antbig 0:ad97421fb1fb 72
antbig 0:ad97421fb1fb 73 /* Variable: data
antbig 0:ad97421fb1fb 74 * Space for 8 byte payload.
antbig 0:ad97421fb1fb 75 *
antbig 0:ad97421fb1fb 76 * If type is CANData data can store up to 8 byte data.
antbig 0:ad97421fb1fb 77 */
antbig 0:ad97421fb1fb 78 unsigned char data[8];
antbig 0:ad97421fb1fb 79
antbig 0:ad97421fb1fb 80 /* Variable: len
antbig 0:ad97421fb1fb 81 * Length of data in bytes.
antbig 0:ad97421fb1fb 82 *
antbig 0:ad97421fb1fb 83 * If type is CANData data can store up to 8 byte data.
antbig 0:ad97421fb1fb 84 */
antbig 0:ad97421fb1fb 85 unsigned char len;
antbig 0:ad97421fb1fb 86
antbig 0:ad97421fb1fb 87 /* Variable: format
antbig 0:ad97421fb1fb 88 * Defines if the message has standard or extended format.
antbig 0:ad97421fb1fb 89 *
antbig 0:ad97421fb1fb 90 * Defines the type of message id:
antbig 0:ad97421fb1fb 91 * Default is CANStandard which implies 11 bit id.
antbig 0:ad97421fb1fb 92 * CANExtended means 29 bit message id.
antbig 0:ad97421fb1fb 93 */
antbig 0:ad97421fb1fb 94 CANFormat format;
antbig 0:ad97421fb1fb 95
antbig 0:ad97421fb1fb 96 /* Variable: type
antbig 0:ad97421fb1fb 97 * Defines the type of a message.
antbig 0:ad97421fb1fb 98 *
antbig 0:ad97421fb1fb 99 * The message type can rather be CANData for a message with data (default).
antbig 0:ad97421fb1fb 100 * Or CANRemote for a request of a specific CAN message.
antbig 0:ad97421fb1fb 101 */
antbig 0:ad97421fb1fb 102 CANType type; // 0 - DATA FRAME, 1 - REMOTE FRAME
antbig 0:ad97421fb1fb 103 #endif
antbig 0:ad97421fb1fb 104 };
antbig 0:ad97421fb1fb 105
antbig 0:ad97421fb1fb 106 /* Class: CAN
antbig 0:ad97421fb1fb 107 * A can bus client, used for communicating with can devices
antbig 0:ad97421fb1fb 108 */
antbig 0:ad97421fb1fb 109 class CAN : public Base {
antbig 0:ad97421fb1fb 110
antbig 0:ad97421fb1fb 111 public:
antbig 0:ad97421fb1fb 112
antbig 0:ad97421fb1fb 113 /* Constructor: CAN
antbig 0:ad97421fb1fb 114 * Creates an CAN interface connected to specific pins.
antbig 0:ad97421fb1fb 115 *
antbig 0:ad97421fb1fb 116 * Example:
antbig 0:ad97421fb1fb 117 * > #include "mbed.h"
antbig 0:ad97421fb1fb 118 * >
antbig 0:ad97421fb1fb 119 * > Ticker ticker;
antbig 0:ad97421fb1fb 120 * > DigitalOut led1(LED1);
antbig 0:ad97421fb1fb 121 * > DigitalOut led2(LED2);
antbig 0:ad97421fb1fb 122 * > CAN can1(p9, p10);
antbig 0:ad97421fb1fb 123 * > CAN can2(p30, p29);
antbig 0:ad97421fb1fb 124 * >
antbig 0:ad97421fb1fb 125 * > char counter = 0;
antbig 0:ad97421fb1fb 126 * >
antbig 0:ad97421fb1fb 127 * > void send() {
antbig 0:ad97421fb1fb 128 * > if(can1.write(CANMessage(1337, &counter, 1))) {
antbig 0:ad97421fb1fb 129 * > printf("Message sent: %d\n", counter);
antbig 0:ad97421fb1fb 130 * > counter++;
antbig 0:ad97421fb1fb 131 * > }
antbig 0:ad97421fb1fb 132 * > led1 = !led1;
antbig 0:ad97421fb1fb 133 * > }
antbig 0:ad97421fb1fb 134 * >
antbig 0:ad97421fb1fb 135 * > int main() {
antbig 0:ad97421fb1fb 136 * > ticker.attach(&send, 1);
antbig 0:ad97421fb1fb 137 * > CANMessage msg;
antbig 0:ad97421fb1fb 138 * > while(1) {
antbig 0:ad97421fb1fb 139 * > if(can2.read(msg)) {
antbig 0:ad97421fb1fb 140 * > printf("Message received: %d\n\n", msg.data[0]);
antbig 0:ad97421fb1fb 141 * > led2 = !led2;
antbig 0:ad97421fb1fb 142 * > }
antbig 0:ad97421fb1fb 143 * > wait(0.2);
antbig 0:ad97421fb1fb 144 * > }
antbig 0:ad97421fb1fb 145 * > }
antbig 0:ad97421fb1fb 146 *
antbig 0:ad97421fb1fb 147 * Variables:
antbig 0:ad97421fb1fb 148 * rd - read from transmitter
antbig 0:ad97421fb1fb 149 * td - transmit to transmitter
antbig 0:ad97421fb1fb 150 */
antbig 0:ad97421fb1fb 151 CAN(PinName rd, PinName td);
antbig 0:ad97421fb1fb 152 virtual ~CAN();
antbig 0:ad97421fb1fb 153
antbig 0:ad97421fb1fb 154 /* Function: frequency
antbig 0:ad97421fb1fb 155 * Set the frequency of the CAN interface
antbig 0:ad97421fb1fb 156 *
antbig 0:ad97421fb1fb 157 * Variables:
antbig 0:ad97421fb1fb 158 * hz - The bus frequency in hertz
antbig 0:ad97421fb1fb 159 * returns - 1 if successful, 0 otherwise
antbig 0:ad97421fb1fb 160 */
antbig 0:ad97421fb1fb 161 int frequency(int hz);
antbig 0:ad97421fb1fb 162
antbig 0:ad97421fb1fb 163 /* Function: write
antbig 0:ad97421fb1fb 164 * Write a CANMessage to the bus.
antbig 0:ad97421fb1fb 165 *
antbig 0:ad97421fb1fb 166 * Variables:
antbig 0:ad97421fb1fb 167 * msg - The CANMessage to write.
antbig 0:ad97421fb1fb 168 *
antbig 0:ad97421fb1fb 169 * Returns:
antbig 0:ad97421fb1fb 170 * 0 - If write failed.
antbig 0:ad97421fb1fb 171 * 1 - If write was successful.
antbig 0:ad97421fb1fb 172 */
antbig 0:ad97421fb1fb 173 int write(CANMessage msg);
antbig 0:ad97421fb1fb 174
antbig 0:ad97421fb1fb 175 /* Function: read
antbig 0:ad97421fb1fb 176 * Read a CANMessage from the bus.
antbig 0:ad97421fb1fb 177 *
antbig 0:ad97421fb1fb 178 * Variables:
antbig 0:ad97421fb1fb 179 * msg - A CANMessage to read to.
antbig 0:ad97421fb1fb 180 *
antbig 0:ad97421fb1fb 181 * Returns:
antbig 0:ad97421fb1fb 182 * 0 - If no message arrived.
antbig 0:ad97421fb1fb 183 * 1 - If message arrived.
antbig 0:ad97421fb1fb 184 */
antbig 0:ad97421fb1fb 185 int read(CANMessage &msg);
antbig 0:ad97421fb1fb 186
antbig 0:ad97421fb1fb 187 /* Function: reset
antbig 0:ad97421fb1fb 188 * Reset CAN interface.
antbig 0:ad97421fb1fb 189 *
antbig 0:ad97421fb1fb 190 * To use after error overflow.
antbig 0:ad97421fb1fb 191 */
antbig 0:ad97421fb1fb 192 void reset();
antbig 0:ad97421fb1fb 193
antbig 0:ad97421fb1fb 194 /* Function: monitor
antbig 0:ad97421fb1fb 195 * Puts or removes the CAN interface into silent monitoring mode
antbig 0:ad97421fb1fb 196 *
antbig 0:ad97421fb1fb 197 * Variables:
antbig 0:ad97421fb1fb 198 * silent - boolean indicating whether to go into silent mode or not
antbig 0:ad97421fb1fb 199 */
antbig 0:ad97421fb1fb 200 void monitor(bool silent);
antbig 0:ad97421fb1fb 201
antbig 0:ad97421fb1fb 202 /* Function: rderror
antbig 0:ad97421fb1fb 203 * Returns number of read errors to detect read overflow errors.
antbig 0:ad97421fb1fb 204 */
antbig 0:ad97421fb1fb 205 unsigned char rderror();
antbig 0:ad97421fb1fb 206
antbig 0:ad97421fb1fb 207 /* Function: tderror
antbig 0:ad97421fb1fb 208 * Returns number of write errors to detect write overflow errors.
antbig 0:ad97421fb1fb 209 */
antbig 0:ad97421fb1fb 210 unsigned char tderror();
antbig 0:ad97421fb1fb 211
antbig 0:ad97421fb1fb 212 /* Function: attach
antbig 0:ad97421fb1fb 213 * Attach a function to call whenever a CAN frame received interrupt is
antbig 0:ad97421fb1fb 214 * generated.
antbig 0:ad97421fb1fb 215 *
antbig 0:ad97421fb1fb 216 * Variables:
antbig 0:ad97421fb1fb 217 * fptr - A pointer to a void function, or 0 to set as none
antbig 0:ad97421fb1fb 218 */
antbig 0:ad97421fb1fb 219 void attach(void (*fptr)(void));
antbig 0:ad97421fb1fb 220
antbig 0:ad97421fb1fb 221 /* Function attach
antbig 0:ad97421fb1fb 222 * Attach a member function to call whenever a CAN frame received interrupt
antbig 0:ad97421fb1fb 223 * is generated.
antbig 0:ad97421fb1fb 224 *
antbig 0:ad97421fb1fb 225 * Variables:
antbig 0:ad97421fb1fb 226 * tptr - pointer to the object to call the member function on
antbig 0:ad97421fb1fb 227 * mptr - pointer to the member function to be called
antbig 0:ad97421fb1fb 228 */
antbig 0:ad97421fb1fb 229 template<typename T>
antbig 0:ad97421fb1fb 230 void attach(T* tptr, void (T::*mptr)(void)) {
antbig 0:ad97421fb1fb 231 if((mptr != NULL) && (tptr != NULL)) {
antbig 0:ad97421fb1fb 232 _rxirq.attach(tptr, mptr);
antbig 0:ad97421fb1fb 233 setup_interrupt();
antbig 0:ad97421fb1fb 234 } else {
antbig 0:ad97421fb1fb 235 remove_interrupt();
antbig 0:ad97421fb1fb 236 }
antbig 0:ad97421fb1fb 237 }
antbig 0:ad97421fb1fb 238
antbig 0:ad97421fb1fb 239 private:
antbig 0:ad97421fb1fb 240
antbig 0:ad97421fb1fb 241 CANName _id;
antbig 0:ad97421fb1fb 242 FunctionPointer _rxirq;
antbig 0:ad97421fb1fb 243
antbig 0:ad97421fb1fb 244 void setup_interrupt(void);
antbig 0:ad97421fb1fb 245 void remove_interrupt(void);
antbig 0:ad97421fb1fb 246 };
antbig 0:ad97421fb1fb 247
antbig 0:ad97421fb1fb 248 } // namespace mbed
antbig 0:ad97421fb1fb 249
antbig 0:ad97421fb1fb 250 #endif // MBED_CAN_H
antbig 0:ad97421fb1fb 251
antbig 0:ad97421fb1fb 252 #endif