SLCAN/CAN-USB implementation for mbed targets

Dependencies:   USBDevice mbed

Committer:
devanlai
Date:
Sat Jun 04 04:40:58 2016 +0000
Revision:
0:f2565808eea5
Child:
2:1327e61cc56b
SLCAN implementation working over hardware serial; USBSerial not yet functional

Who changed what in which revision?

UserRevisionLine numberNew contents of line
devanlai 0:f2565808eea5 1 #ifndef SLCAN_H_INCLUDED
devanlai 0:f2565808eea5 2 #define SLCAN_H_INCLUDED
devanlai 0:f2565808eea5 3
devanlai 0:f2565808eea5 4 #include <mbed.h>
devanlai 0:f2565808eea5 5 #include <USBSerial.h>
devanlai 0:f2565808eea5 6
devanlai 0:f2565808eea5 7 class SLCANBase {
devanlai 0:f2565808eea5 8 public:
devanlai 0:f2565808eea5 9 bool update();
devanlai 0:f2565808eea5 10
devanlai 0:f2565808eea5 11 protected:
devanlai 0:f2565808eea5 12 SLCANBase();
devanlai 0:f2565808eea5 13 virtual ~SLCANBase();
devanlai 0:f2565808eea5 14
devanlai 0:f2565808eea5 15 // To be implemented by subclasses
devanlai 0:f2565808eea5 16 virtual bool setBaudrate(int baudrate) = 0;
devanlai 0:f2565808eea5 17 virtual bool setMode(CAN::Mode mode) = 0;
devanlai 0:f2565808eea5 18 virtual bool transmitMessage(CANMessage& msg) = 0;
devanlai 0:f2565808eea5 19
devanlai 0:f2565808eea5 20 virtual bool processCommands() = 0;
devanlai 0:f2565808eea5 21 virtual bool processCANMessages() = 0;
devanlai 0:f2565808eea5 22 virtual bool flush() = 0;
devanlai 0:f2565808eea5 23
devanlai 0:f2565808eea5 24 // Shared amongst subclasses
devanlai 0:f2565808eea5 25 static size_t formatCANMessage(const CANMessage& msg, char* buf, size_t max_len);
devanlai 0:f2565808eea5 26 static size_t formattedCANMessageLength(const CANMessage& msg);
devanlai 0:f2565808eea5 27 bool execCommand(const char* command);
devanlai 0:f2565808eea5 28
devanlai 0:f2565808eea5 29 private:
devanlai 0:f2565808eea5 30 bool execConfigCommand(const char* command);
devanlai 0:f2565808eea5 31 bool execTransmitCommand(const char* command);
devanlai 0:f2565808eea5 32 };
devanlai 0:f2565808eea5 33
devanlai 0:f2565808eea5 34 class USBSLCAN : public SLCANBase {
devanlai 0:f2565808eea5 35 public:
devanlai 0:f2565808eea5 36 USBSLCAN(USBSerial& stream, CAN& can);
devanlai 0:f2565808eea5 37 protected:
devanlai 0:f2565808eea5 38 virtual bool setBaudrate(int baudrate);
devanlai 0:f2565808eea5 39 virtual bool setMode(CAN::Mode mode);
devanlai 0:f2565808eea5 40 virtual bool transmitMessage(CANMessage& msg);
devanlai 0:f2565808eea5 41
devanlai 0:f2565808eea5 42 virtual bool processCommands();
devanlai 0:f2565808eea5 43 virtual bool processCANMessages();
devanlai 0:f2565808eea5 44 virtual bool flush();
devanlai 0:f2565808eea5 45
devanlai 0:f2565808eea5 46 bool getNextCANMessage(CANMessage& msg);
devanlai 0:f2565808eea5 47 private:
devanlai 0:f2565808eea5 48 USBSerial& stream;
devanlai 0:f2565808eea5 49 CAN& can;
devanlai 0:f2565808eea5 50 CANMessage queuedMessage;
devanlai 0:f2565808eea5 51 bool messageQueued;
devanlai 0:f2565808eea5 52 bool commandQueued;
devanlai 0:f2565808eea5 53 bool commandOverflow;
devanlai 0:f2565808eea5 54 char inputCommandBuffer[32];
devanlai 0:f2565808eea5 55 char outputPacketBuffer[64];
devanlai 0:f2565808eea5 56 size_t inputCommandLen;
devanlai 0:f2565808eea5 57 size_t outputPacketLen;
devanlai 0:f2565808eea5 58 };
devanlai 0:f2565808eea5 59
devanlai 0:f2565808eea5 60 class SerialSLCAN : public SLCANBase {
devanlai 0:f2565808eea5 61 public:
devanlai 0:f2565808eea5 62 SerialSLCAN(Serial& stream, CAN& can);
devanlai 0:f2565808eea5 63 protected:
devanlai 0:f2565808eea5 64 virtual bool setBaudrate(int baudrate);
devanlai 0:f2565808eea5 65 virtual bool setMode(CAN::Mode mode);
devanlai 0:f2565808eea5 66 virtual bool transmitMessage(CANMessage& msg);
devanlai 0:f2565808eea5 67
devanlai 0:f2565808eea5 68 virtual bool processCommands();
devanlai 0:f2565808eea5 69 virtual bool processCANMessages();
devanlai 0:f2565808eea5 70 virtual bool flush();
devanlai 0:f2565808eea5 71
devanlai 0:f2565808eea5 72 bool getNextCANMessage(CANMessage& msg);
devanlai 0:f2565808eea5 73 private:
devanlai 0:f2565808eea5 74 Serial& stream;
devanlai 0:f2565808eea5 75 CAN& can;
devanlai 0:f2565808eea5 76 bool commandQueued;
devanlai 0:f2565808eea5 77 bool commandOverflow;
devanlai 0:f2565808eea5 78 char inputCommandBuffer[32];
devanlai 0:f2565808eea5 79 size_t inputCommandLen;
devanlai 0:f2565808eea5 80 };
devanlai 0:f2565808eea5 81
devanlai 0:f2565808eea5 82 #endif