-
Notifications
You must be signed in to change notification settings - Fork 0
/
coms.h
118 lines (71 loc) · 2.69 KB
/
coms.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
/*----------------------------------------------------------------------------*\
| BitBang SPI client library |
\*----------------------------------------------------------------------------*/
#if defined ARDUINO_attiny || defined ARDUINO_AVR_DIGISPARK
#ifndef __coms_h__
#define __coms_h__
#include "defines.h"
//TODO: convert this over to a template instead of using variables.
// this will allow for more compiler optimizations with inlining
class coms {
public:
////////////////////////////////////////////////////////////////////////
// CREATE A SPI COMS OBJECT WITH GIVEN PIN VALUES
////////////////////////////////////////////////////////////////////////
INLINE coms(uint8_t mosi, uint8_t miso, uint8_t clk, uint8_t ss) {
this->_mosi = mosi;
this->_miso = miso;
this->_clk = clk;
this->_ss = ss;
}
////////////////////////////////////////////////////////////////////////
// ENABLE INTERUPT
////////////////////////////////////////////////////////////////////////
INLINE void enable() {
pinMode(this->_miso, INPUT);
pinMode(this->_mosi, INPUT);
pinMode(this->_clk, INPUT);
pinMode(this->_ss, INPUT);
PCMSK |= (1 << this->_ss);
GIMSK |= 0b00100000;
this->miso(0);
}
////////////////////////////////////////////////////////////////////////
// DISABLE INTERUPT
////////////////////////////////////////////////////////////////////////
INLINE void disable() {
PCMSK &= ~(1 << this->_ss);
pinMode(this->_miso, INPUT);
pinMode(this->_mosi, INPUT);
pinMode(this->_clk, INPUT);
pinMode(this->_ss, INPUT);
this->miso(0);
}
////////////////////////////////////////////////////////////////////////
// PROCESS INCOMING DATA
////////////////////////////////////////////////////////////////////////
uint32_b process();
////////////////////////////////////////////////////////////////////////
// READ DATA FROM EACH OF THE INPUT PINS
////////////////////////////////////////////////////////////////////////
INLINE uint8_t mosi() { return !!(PINB & (1 << this->_mosi)); }
INLINE uint8_t clk() { return !!(PINB & (1 << this->_clk)); }
INLINE uint8_t ss() { return !!(PINB & (1 << this->_ss)); }
////////////////////////////////////////////////////////////////////////
// WRITE DATA TO THE OUTPUT PIN
////////////////////////////////////////////////////////////////////////
INLINE void miso(uint8_t bit) {
if (bit) {
PORTB |= (1 << this->_miso);
} else {
PORTB &= ~(1 << this->_miso);
}
}
public:
uint8_t _mosi;
uint8_t _miso;
uint8_t _clk;
uint8_t _ss;
};
#endif //__coms_h__
#endif //ARDUINO_attiny || ARDUINO_AVR_DIGISPARK