CANController.cpp
1 // Copyright (c) Sandeep Mistry. All rights reserved. 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information. 3 4 #include "CANController.h" 5 6 CANControllerClass::CANControllerClass() : 7 _onReceive(NULL), 8 9 _packetBegun(false), 10 _txId(-1), 11 _txExtended(-1), 12 _txRtr(false), 13 _txDlc(0), 14 _txLength(0), 15 16 _rxId(-1), 17 _rxExtended(false), 18 _rxRtr(false), 19 _rxDlc(0), 20 _rxLength(0), 21 _rxIndex(0) 22 { 23 // overide Stream timeout value 24 setTimeout(0); 25 } 26 27 CANControllerClass::~CANControllerClass() 28 { 29 } 30 31 int CANControllerClass::begin(long /*baudRate*/) 32 { 33 _packetBegun = false; 34 _txId = -1; 35 _txRtr =false; 36 _txDlc = 0; 37 _txLength = 0; 38 39 _rxId = -1; 40 _rxRtr = false; 41 _rxDlc = 0; 42 _rxLength = 0; 43 _rxIndex = 0; 44 45 return 1; 46 } 47 48 void CANControllerClass::end() 49 { 50 } 51 52 int CANControllerClass::beginPacket(int id, int dlc, bool rtr) 53 { 54 if (id < 0 || id > 0x7FF) { 55 return 0; 56 } 57 58 if (dlc > 8) { 59 return 0; 60 } 61 62 _packetBegun = true; 63 _txId = id; 64 _txExtended = false; 65 _txRtr = rtr; 66 _txDlc = dlc; 67 _txLength = 0; 68 69 memset(_txData, 0x00, sizeof(_txData)); 70 71 return 1; 72 } 73 74 int CANControllerClass::beginExtendedPacket(long id, int dlc, bool rtr) 75 { 76 if (id < 0 || id > 0x1FFFFFFF) { 77 return 0; 78 } 79 80 if (dlc > 8) { 81 return 0; 82 } 83 84 _packetBegun = true; 85 _txId = id; 86 _txExtended = true; 87 _txRtr = rtr; 88 _txDlc = dlc; 89 _txLength = 0; 90 91 memset(_txData, 0x00, sizeof(_txData)); 92 93 return 1; 94 } 95 96 int CANControllerClass::endPacket() 97 { 98 if (!_packetBegun) { 99 return 0; 100 } 101 _packetBegun = false; 102 103 if (_txDlc >= 0) { 104 _txLength = _txDlc; 105 } 106 107 return 1; 108 } 109 110 int CANControllerClass::parsePacket() 111 { 112 return 0; 113 } 114 115 long CANControllerClass::packetId() 116 { 117 return _rxId; 118 } 119 120 bool CANControllerClass::packetExtended() 121 { 122 return _rxExtended; 123 } 124 125 bool CANControllerClass::packetRtr() 126 { 127 return _rxRtr; 128 } 129 130 int CANControllerClass::packetDlc() 131 { 132 return _rxDlc; 133 } 134 135 size_t CANControllerClass::write(uint8_t byte) 136 { 137 return write(&byte, sizeof(byte)); 138 } 139 140 size_t CANControllerClass::write(const uint8_t *buffer, size_t size) 141 { 142 if (!_packetBegun) { 143 return 0; 144 } 145 146 if (size > (sizeof(_txData) - _txLength)) { 147 size = sizeof(_txData) - _txLength; 148 } 149 150 memcpy(&_txData[_txLength], buffer, size); 151 _txLength += size; 152 153 return size; 154 } 155 156 int CANControllerClass::available() 157 { 158 return (_rxLength - _rxIndex); 159 } 160 161 int CANControllerClass::read() 162 { 163 if (!available()) { 164 return -1; 165 } 166 167 return _rxData[_rxIndex++]; 168 } 169 170 int CANControllerClass::peek() 171 { 172 if (!available()) { 173 return -1; 174 } 175 176 return _rxData[_rxIndex]; 177 } 178 179 void CANControllerClass::flush() 180 { 181 } 182 183 void CANControllerClass::onReceive(void(*callback)(int)) 184 { 185 _onReceive = callback; 186 } 187 188 int CANControllerClass::filter(int /*id*/, int /*mask*/) 189 { 190 return 0; 191 } 192 193 int CANControllerClass::filterExtended(long /*id*/, long /*mask*/) 194 { 195 return 0; 196 } 197 198 int CANControllerClass::observe() 199 { 200 return 0; 201 } 202 203 int CANControllerClass::loopback() 204 { 205 return 0; 206 } 207 208 int CANControllerClass::sleep() 209 { 210 return 0; 211 } 212 213 int CANControllerClass::wakeup() 214 { 215 return 0; 216 }