IOControl/include/IO/RS485/Controller.h
Go to the documentation of this file.
1 
20 #pragma once
21 
22 #include "../Controller.h"
23 #include "../Serial.h"
24 #include <SimpleTimer.h>
25 #include <Data/BitSet.h>
26 
27 namespace IO::RS485
28 {
29 DECLARE_FSTR(CONTROLLER_CLASSNAME)
30 
31 class Controller : public IO::Controller
32 {
33 public:
34  Controller(Serial& serial, uint8_t instance) : IO::Controller(instance), serial(serial)
35  {
36  }
37 
38  const FlashString& classname() const override
39  {
40  return CONTROLLER_CLASSNAME;
41  }
42 
43  void start() override;
44  void stop() override;
45 
52  using SetDirectionCallback = void (*)(uint8_t segment, Direction direction);
53 
64  {
65  setDirectionCallback = callback;
66  }
67 
73  void IRAM_ATTR setDirection(IO::Direction direction)
74  {
75  if(setDirectionCallback != nullptr) {
76  setDirectionCallback(segment, direction);
77  }
78  }
79 
81  {
82  return serial;
83  }
84 
85  void handleEvent(Request* request, Event event) override;
86 
87  using OnRequestDelegate = Delegate<void(Controller& controller)>;
88 
90  {
91  requestCallback = callback;
92  }
93 
94  void setSegment(uint8_t segment)
95  {
96  this->segment = segment;
97  }
98 
99  void send(const void* data, size_t size);
100 
101 protected:
102  virtual void handleIncomingRequest()
103  {
104  if(requestCallback) {
105  requestCallback(*this);
106  }
107  }
108 
109 private:
110  static void uartCallbackStatic(smg_uart_t* uart, uint32_t status);
111  static void staticTransmitComplete(void* param);
112  static void staticTimerHandler(void* param);
113  void uartCallback(uint32_t status);
114  void timerHandler();
115 
116  enum class Flag {
117  transmit_complete,
118  data_received,
119  };
120 
121 private:
122  Serial& serial;
123  SetDirectionCallback setDirectionCallback{nullptr};
124  Request* request{nullptr};
126  uint8_t segment{0};
127  OnRequestDelegate requestCallback;
128  SimpleTimer timer;
129  Serial::Config savedConfig{};
130 };
131 
132 } // namespace IO::RS485
describes a counted string stored in flash memory
Definition: String.hpp:174
Definition: IOControl/include/IO/RS485/Controller.h:32
Controller(Serial &serial, uint8_t instance)
Definition: IOControl/include/IO/RS485/Controller.h:34
void(*)(uint8_t segment, Direction direction) SetDirectionCallback
Callback to handle hardware transmit/receive selection Typically called from interrupt context so imp...
Definition: IOControl/include/IO/RS485/Controller.h:52
void send(const void *data, size_t size)
void setDirection(IO::Direction direction)
Whilst a port is acquired, call this method to being or end transmission.
Definition: IOControl/include/IO/RS485/Controller.h:73
Serial & getSerial()
Definition: IOControl/include/IO/RS485/Controller.h:80
void stop() override
Stop all controllers.
void handleEvent(Request *request, Event event) override
void onSetDirection(SetDirectionCallback callback)
Set the transmit callback handler.
Definition: IOControl/include/IO/RS485/Controller.h:63
const FlashString & classname() const override
Get the class name for this Controller.
Definition: IOControl/include/IO/RS485/Controller.h:38
void setSegment(uint8_t segment)
Definition: IOControl/include/IO/RS485/Controller.h:94
void onRequest(OnRequestDelegate callback)
Definition: IOControl/include/IO/RS485/Controller.h:89
virtual void handleIncomingRequest()
Definition: IOControl/include/IO/RS485/Controller.h:102
void start() override
Start the controller.
Definition: IOControl/include/IO/RS485/Request.h:28
Wrapper class for the UART driver.
Definition: Libraries/IOControl/include/IO/Serial.h:33
#define DECLARE_FSTR(name)
Declare a global FSTR::String& reference.
Definition: String.hpp:63
Definition: IOControl/include/IO/RS485/Controller.h:28
Definition: IOControl/include/IO/Controller.h:26
Direction
Some controllers specify a transfer direction.
Definition: IOControl/include/IO/Controller.h:32
Event
Definition: Event.h:36