-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathlin.h
64 lines (54 loc) · 2.77 KB
/
lin.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/*
Copyright 2011 G. Andrew Stone
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Neither the name of the copyright holder nor the
names of its contributors may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <inttypes.h>
#include "Arduino.h"
#include <HardwareSerial.h>
#define LIN_SERIAL HardwareSerial
#define LIN_BREAK_DURATION 15 // Number of bits in the break.
#define LIN_TIMEOUT_IN_FRAMES 2 // Wait this many max frame times before declaring a read timeout.
enum
{
Lin1Frame = 0,
Lin2Frame = 1,
LinWriteFrame = 0,
LinReadFrame = 2,
};
class Lin
{
protected:
void serialBreak(void);
// For Lin 1.X "start" should = 0, for Lin 2.X "start" should be the addr byte.
static uint8_t dataChecksum(const uint8_t* message, char nBytes,uint16_t start=0);
static uint8_t addrParity(uint8_t addr);
public:
Lin(LIN_SERIAL& ser=Serial,uint8_t txPin=1);
LIN_SERIAL& serial;
uint8_t txPin; // what pin # is used to transmit (needed to generate the BREAK signal)
int serialSpd; // in bits/sec. Also called baud rate
uint8_t serialOn; // whether the serial port is "begin"ed or "end"ed. Optimization so we don't begin twice.
unsigned long int timeout; // How long to wait for a slave to fully transmit when doing a "read". You can modify this after calling "begin"
void begin(int speed);
// Send a message right now, ignoring the schedule table.
void send(uint8_t addr, const uint8_t* message,uint8_t nBytes,uint8_t proto=2);
// Receive a message right now, returns 0xff if good checksum, # bytes received (including checksum) if checksum is bad.
uint8_t recv(uint8_t addr, uint8_t* message, uint8_t nBytes,uint8_t proto=2);
};