YAHAL
Yet Another Hardware Abstraction Library
Loading...
Searching...
No Matches
soft_i2c_slave_states.h
1// ---------------------------------------------
2// This file is part of
3// _ _ __ _ _ __ __
4// ( \/ ) /__\ ( )_( ) /__\ ( )
5// \ / /(__)\ ) _ ( /(__)\ )(__
6// (__)(__)(__)(_) (_)(__)(__)(____)
7//
8// Yet Another HW Abstraction Library
9// Copyright (C) Andreas Terstegge
10// BSD Licensed (see file LICENSE)
11//
12// ---------------------------------------------
13//
14// This class is used by the soft_i2c_slave driver.
15// It implements all necessary states for the state
16// machine, which processes the SDA and SCL line
17// changes. The state pattern (GoF) is used!
18
19#ifndef _SOFT_I2C_SLAVE_STATES_H_
20#define _SOFT_I2C_SLAVE_STATES_H_
21
22#include <cstdint>
23
24class soft_i2c_slave;
25
26namespace I2C
27{
28
29class STATE {
30public:
31 STATE(soft_i2c_slave & c) : _context(c) {}
32
33 virtual void enter() { }
34 virtual void leave() { }
35
36 void start();
37 void stop();
38 virtual void high() { }
39 virtual void low() { }
40 virtual void scl_falling() { }
41
42 virtual ~STATE() { }
43
44protected:
45 soft_i2c_slave & _context;
46};
47
48class IDLE : public STATE {
49public:
50 IDLE(soft_i2c_slave & c) : STATE(c) {}
51 void enter() override;
52};
53
54class READ_ADDR : public STATE {
55public:
56 READ_ADDR(soft_i2c_slave & c) : STATE(c), _data(0), _bit_mask(0) {}
57 void enter() override;
58 void high() override;
59 void low() override;
60 void scl_falling() override;
61private:
62 uint8_t _data;
63 int _bit_mask;
64};
65
66class WRITE_ACK : public STATE {
67public:
68 WRITE_ACK(soft_i2c_slave & c) : STATE(c) {}
69 void enter() override;
70 void scl_falling() override;
71};
72
73class READ_DATA : public STATE {
74public:
75 READ_DATA(soft_i2c_slave & c) : STATE(c), _data(0), _bit_mask(0) {}
76 void enter() override;
77 void high() override;
78 void low() override;
79 void scl_falling() override;
80private:
81 uint8_t _data;
82 int _bit_mask;
83};
84
85class WRITE_DATA : public STATE {
86public:
87 WRITE_DATA(soft_i2c_slave & c) : STATE(c), _data(0), _bit_mask(0) {}
88 void enter() override;
89 void scl_falling() override;
90private:
91 uint8_t _data;
92 int _bit_mask;
93};
94
95class READ_ACK : public STATE {
96public:
97 READ_ACK(soft_i2c_slave & c) : STATE(c) {}
98 void high() override;
99 void low() override;
100 void scl_falling() override;
101};
102
103} // namespace I2C
104
105#endif // _SOFT_I2C_SLAVE_STATES_H_