blob: aa647bea259532d2cbb945eb50ba239cf5d541d1 (
plain)
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
|
#ifndef IO_EXTENDER_H_
#define IO_EXTENDER_H_
#include "pcf8574.h"
#include "util.h"
enum ioext_bits {
EXTOUT_VALVE0,
EXTOUT_VALVE1,
EXTOUT_VALVE2,
EXTOUT_VALVE3,
EXTOUT_VALVE4,
EXTOUT_VALVE5,
};
#define EXTOUT_NR_CHIPS 1
struct ioext_context {
struct pcf8574_chip chips[EXTOUT_NR_CHIPS];
uint8_t old_states[EXTOUT_NR_CHIPS];
uint8_t states[EXTOUT_NR_CHIPS];
};
extern struct ioext_context ioext_ctx;
static inline bool ioext_bit_is_set(uint8_t bit_number)
{
uint8_t chip = bit_number / 8;
uint8_t bit = bit_number % 8;
return (ioext_ctx.states[chip] >> bit) & 1;
}
static inline bool ioext_bit_is_clear(uint8_t bit_number)
{
return !ioext_bit_is_set(bit_number);
}
static inline void ioext_set_bit(uint8_t bit_number)
{
uint8_t chip = bit_number / 8;
uint8_t bit = bit_number % 8;
ioext_ctx.states[chip] |= BITMASK8(bit);
}
static inline void ioext_clear_bit(uint8_t bit_number)
{
uint8_t chip = bit_number / 8;
uint8_t bit = bit_number % 8;
ioext_ctx.states[chip] &= ~BITMASK8(bit);
}
static inline void ioext_write_bit(uint8_t bit_number, bool set)
{
if (set)
ioext_set_bit(bit_number);
else
ioext_clear_bit(bit_number);
}
void ioext_commit(void);
void ioext_init(bool all_ones);
#endif /* IO_EXTENDER_H_ */
|