-
Notifications
You must be signed in to change notification settings - Fork 1
/
j1850vpw.h
149 lines (121 loc) · 4.24 KB
/
j1850vpw.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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/*
* The MIT License (MIT)
*
* Copyright (c) 2017,Konstantin Grjznov
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
* and associated documentation files (the “Software”), to deal in the Software without restriction,
* including without limitation the rights to use, copy, modify, merge, publish, distribute,
* sublicense, and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or
* substantial portions of the Software.
*
*THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
*INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
*FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
*IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
*DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
*ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
*IN THE SOFTWARE.
*
* Created on: 11/26/2017 ã. v.1.0
*/
#ifndef J1850VPW_H_
#define J1850VPW_H_
#include "Arduino.h"
#if (F_CPU == 48000000)
#define ACTIVE 1
#define PASSIVE 0
#define DIV 5 // 2^5=32 => 48'000'000/32 = 1.5 MHz
#define F_TIC 15 // 1.5*10
// Timing for a long bit pulse uS
#define LONGBIT_TIME 128 // Nominal
#define LONGBIT_TIME_R (LONGBIT_TIME * F_TIC/10)
#define LONGBIT_DEV 16 //Deviation
#define LONGBIT_DEV_R (LONGBIT_DEV * F_TIC/10)
// Timing for short bit pulse uS
#define SHORTBIT_TIME 64 //Nominal
#define SHORTBIT_TIME_R (SHORTBIT_TIME * F_TIC/10)
#define SHORTBIT_DEV 15 //Deviation
#define SHORTBIT_DEV_R (SHORTBIT_DEV * F_TIC/10)
// Timing for start of frame uS
#define SOF_TIME 200 //Nominal
#define SOF_TIME_R (SOF_TIME * F_TIC/10 )
#define SOF_DEV 18 //Deviation
#define SOF_DEV_R (SOF_DEV * F_TIC/10 )
// Timing for end of data frame uS
#define EOD_TIME 200 //Nominal
#define EOD_TIME_R (EOD_TIME * F_TIC/10 )
#define EOD_DEV 18 //Deviation
#define EOD_DEV_R (EOD_DEV * F_TIC/10) )
// Timing for end of frame uS
#define EOF_TIME 280 //Nominal
#define EOF_TIME_R (EOF_TIME * F_TIC/10 )
#define EOF_DEV 18 //Deviation
#define EOF_DEV_R (EOF_DEV * F_TIC/10 )
// Timing for IN-FRAME RESPONSE uS
#define IFS_TIME 300 //Nominal
#define IFS_TIME_R (IFS_TIME * F_TIC/10 )
#define IFS_DEV 20 //Deviation
#define IFS_DEV_R (IFS_DEV)
// Timing for BREAK uS
#define BREAK_TIME 300 //Nominal
#define BREAK_TIME_R (BREAK_TIME * F_TIC/10 )
#define BREAK_DEV 20 //Deviation
#define BREAK_DEV_R (BREAK_DEV * F_TIC/10) )
// Storage, max 11 data bytes + CRC
#define MAX_SIZE 12
#define MAX_FIFO 8
typedef struct{
size_t Len;
uint8_t Data[MAX_SIZE];
}Str_J1850;
class J1850_VPW
{
#define F_SIZE 4
public:
J1850_VPW():
LastTime(0),_tx_Len(0),error_rx(0),_start(0),_end(0)
{
pElems = new Str_J1850[F_SIZE];
_instance = this;
};
void Init(size_t pin_In,size_t pin_Out);
size_t Tx_J1850(uint8_t *data,size_t len);
inline int isEmpty() { return (_end == _start);}
Str_J1850 Rx_J1850(void){
Str_J1850 _t = pElems[_start & (F_SIZE-1)];
_start = inc(_start);
return _t;
}
private:
static J1850_VPW* _instance;
uint16_t LastTime;
volatile uint8_t *_p_tx,*_pin_rx;
size_t _tx_Len;
uint8_t _buftx[MAX_SIZE];
size_t error_rx;
Str_J1850 _bufrx;
static void ftm1_isr(void);
void Time(void);
static void pin_isr(void);
void PinRx(void);
uint8_t Crc8_J1850(uint8_t *buffer, size_t len);
//=========== fifo =======
int _start;
int _end;
Str_J1850 *pElems;
inline int isFull() { return (_end == (_start ^ F_SIZE));}
inline void write(Str_J1850 &value) {
pElems[_end & (F_SIZE-1)] = value;
if (isFull()) { /* full, overwrite moves start pointer */
_start = inc(_start);
}
_end = inc(_end);
}
inline int inc(int p) {return (p + 1)&(2 * F_SIZE-1);}
};
#endif
#endif /* J1850VPW_H_ */