AceRoutine  1.0.1
A low-memory, fast-switching, cooperative multitasking library using stackless coroutines on Arduino platforms.
Channel.h
1 #ifndef ACE_ROUTINE_CHANNEL
2 #define ACE_ROUTINE_CHANNEL
3 
4 #include <stdint.h>
5 #include "Coroutine.h"
6 
8 #define COROUTINE_CHANNEL_WRITE(channel, x) \
9 do { \
10  (channel).setValue(x); \
11  COROUTINE_AWAIT((channel).write()); \
12 } while (false)
13 
15 #define COROUTINE_CHANNEL_READ(channel, x) \
16  COROUTINE_AWAIT((channel).read(x))
17 
18 namespace ace_routine {
19 
42 template<typename T>
43 class Channel {
44  public:
46  Channel() {}
47 
53  void setValue(const T& value) {
54  mValueToWrite = value;
55  }
56 
62  bool write() {
63  switch (mChannelState) {
64  case kWriterReady:
65  return false;
66  case kReaderReady:
67  mValue = mValueToWrite;
68  mChannelState = kDataProduced;
69  return false;
70  case kDataProduced:
71  return false;
72  case kDataConsumed:
73  mChannelState = kWriterReady;
74  return true;
75  default:
76  return false;
77  }
78  }
79 
84  bool write(const T& value) {
85  switch (mChannelState) {
86  case kWriterReady:
87  return false;
88  case kReaderReady:
89  mValue = value;
90  mChannelState = kDataProduced;
91  return false;
92  case kDataProduced:
93  return false;
94  case kDataConsumed:
95  mChannelState = kWriterReady;
96  return true;
97  default:
98  return false;
99  }
100  }
101 
106  bool read(T& value) {
107  switch (mChannelState) {
108  case kWriterReady:
109  mChannelState = kReaderReady;
110  return false;
111  case kReaderReady:
112  return false;
113  case kDataProduced:
114  value = mValue;
115  mChannelState = kDataConsumed;
116  return true;
117  case kDataConsumed:
118  return false;
119  default:
120  return false;
121  }
122  }
123 
124  private:
125  // Disable copy-constructor and assignment operator
126  Channel(const Channel&) = delete;
127  Channel& operator=(const Channel&) = delete;
128 
129  static const uint8_t kWriterReady = 0;
130  static const uint8_t kReaderReady = 1;
131  static const uint8_t kDataProduced = 2;
132  static const uint8_t kDataConsumed = 3;
133 
134  uint8_t mChannelState = kWriterReady;
135  T mValue;
136  T mValueToWrite;
137 };
138 
139 }
140 
141 #endif
ace_routine::Channel::write
bool write(const T &value)
Write the given value to the channel through the COROUTINE_AWAIT() if value is a static variable.
Definition: Channel.h:84
ace_routine::Channel::Channel
Channel()
Constructor.
Definition: Channel.h:46
ace_routine::Channel::setValue
void setValue(const T &value)
Used by COROUTINE_CHANNEL_WRITE() to preserve the value of the write across multiple COROUTINE_YIELD(...
Definition: Channel.h:53
ace_routine::Channel
An unbuffered synchronized channel.
Definition: Channel.h:43
ace_routine::Channel::read
bool read(T &value)
Read the value through the COROUTINE_AWAIT() macro or the COROUTINE_CHANNEL_READ() macro.
Definition: Channel.h:106
Coroutine.h
ace_routine::Channel::write
bool write()
Same as write(constT& value) except use the value of setValue().
Definition: Channel.h:62