SLCAN/CAN-USB implementation for mbed targets

Dependencies:   USBDevice mbed

Committer:
devanlai
Date:
Sat Feb 04 09:49:57 2017 +0000
Revision:
3:bc163d555ddc
Parent:
2:1327e61cc56b
Send z/Z response as expected for T/t/R/r commands.; Add minimal support for F/M/m/s commands for compatibility

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 2:1327e61cc56b 24 virtual uint8_t getFirmwareVersion();
devanlai 2:1327e61cc56b 25 virtual uint8_t getHardwareVersion();
devanlai 2:1327e61cc56b 26 virtual const char* getSerialString();
devanlai 2:1327e61cc56b 27
devanlai 0:f2565808eea5 28 // Shared amongst subclasses
devanlai 0:f2565808eea5 29 static size_t formatCANMessage(const CANMessage& msg, char* buf, size_t max_len);
devanlai 0:f2565808eea5 30 static size_t formattedCANMessageLength(const CANMessage& msg);
devanlai 2:1327e61cc56b 31 static size_t commandResponseLength(const char* command);
devanlai 2:1327e61cc56b 32 bool execCommand(const char* command, char* response=NULL);
devanlai 0:f2565808eea5 33
devanlai 0:f2565808eea5 34 private:
devanlai 0:f2565808eea5 35 bool execConfigCommand(const char* command);
devanlai 3:bc163d555ddc 36 bool execTransmitCommand(const char* command, char* response);
devanlai 2:1327e61cc56b 37 bool execDiagnosticCommand(const char *command, char* response);
devanlai 0:f2565808eea5 38 };
devanlai 0:f2565808eea5 39
devanlai 0:f2565808eea5 40 class USBSLCAN : public SLCANBase {
devanlai 0:f2565808eea5 41 public:
devanlai 0:f2565808eea5 42 USBSLCAN(USBSerial& stream, CAN& can);
devanlai 0:f2565808eea5 43 protected:
devanlai 0:f2565808eea5 44 virtual bool setBaudrate(int baudrate);
devanlai 0:f2565808eea5 45 virtual bool setMode(CAN::Mode mode);
devanlai 0:f2565808eea5 46 virtual bool transmitMessage(CANMessage& msg);
devanlai 0:f2565808eea5 47
devanlai 0:f2565808eea5 48 virtual bool processCommands();
devanlai 0:f2565808eea5 49 virtual bool processCANMessages();
devanlai 0:f2565808eea5 50 virtual bool flush();
devanlai 0:f2565808eea5 51
devanlai 0:f2565808eea5 52 bool getNextCANMessage(CANMessage& msg);
devanlai 0:f2565808eea5 53 private:
devanlai 0:f2565808eea5 54 USBSerial& stream;
devanlai 0:f2565808eea5 55 CAN& can;
devanlai 0:f2565808eea5 56 CANMessage queuedMessage;
devanlai 0:f2565808eea5 57 bool messageQueued;
devanlai 0:f2565808eea5 58 bool commandQueued;
devanlai 0:f2565808eea5 59 bool commandOverflow;
devanlai 0:f2565808eea5 60 char inputCommandBuffer[32];
devanlai 0:f2565808eea5 61 char outputPacketBuffer[64];
devanlai 0:f2565808eea5 62 size_t inputCommandLen;
devanlai 0:f2565808eea5 63 size_t outputPacketLen;
devanlai 0:f2565808eea5 64 };
devanlai 0:f2565808eea5 65
devanlai 0:f2565808eea5 66 class SerialSLCAN : public SLCANBase {
devanlai 0:f2565808eea5 67 public:
devanlai 0:f2565808eea5 68 SerialSLCAN(Serial& stream, CAN& can);
devanlai 0:f2565808eea5 69 protected:
devanlai 0:f2565808eea5 70 virtual bool setBaudrate(int baudrate);
devanlai 0:f2565808eea5 71 virtual bool setMode(CAN::Mode mode);
devanlai 0:f2565808eea5 72 virtual bool transmitMessage(CANMessage& msg);
devanlai 0:f2565808eea5 73
devanlai 0:f2565808eea5 74 virtual bool processCommands();
devanlai 0:f2565808eea5 75 virtual bool processCANMessages();
devanlai 0:f2565808eea5 76 virtual bool flush();
devanlai 0:f2565808eea5 77
devanlai 0:f2565808eea5 78 bool getNextCANMessage(CANMessage& msg);
devanlai 0:f2565808eea5 79 private:
devanlai 0:f2565808eea5 80 Serial& stream;
devanlai 0:f2565808eea5 81 CAN& can;
devanlai 0:f2565808eea5 82 bool commandQueued;
devanlai 0:f2565808eea5 83 bool commandOverflow;
devanlai 0:f2565808eea5 84 char inputCommandBuffer[32];
devanlai 0:f2565808eea5 85 size_t inputCommandLen;
devanlai 0:f2565808eea5 86 };
devanlai 0:f2565808eea5 87
devanlai 0:f2565808eea5 88 #endif