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 
26 namespace IO
27 {
28 namespace RS485
29 {
30 DECLARE_FSTR(CONTROLLER_CLASSNAME)
31 
32 class Controller : public IO::Controller
33 {
34 public:
35  Controller(Serial& serial, uint8_t instance) : IO::Controller(instance), serial(serial)
36  {
37  }
38 
39  const FlashString& classname() const override
40  {
41  return CONTROLLER_CLASSNAME;
42  }
43 
44  void start() override;
45  void stop() override;
46 
53  using SetDirectionCallback = void (*)(uint8_t segment, Direction direction);
54 
65  {
66  setDirectionCallback = callback;
67  }
68 
74  void IRAM_ATTR setDirection(IO::Direction direction)
75  {
76  if(setDirectionCallback != nullptr) {
77  setDirectionCallback(segment, direction);
78  }
79  }
80 
82  {
83  return serial;
84  }
85 
86  void handleEvent(Request* request, Event event) override;
87 
89 
91  {
92  requestCallback = callback;
93  }
94 
95  void setSegment(uint8_t segment)
96  {
97  this->segment = segment;
98  }
99 
100  void send(const void* data, size_t size);
101 
102 protected:
103  virtual void handleIncomingRequest()
104  {
105  if(requestCallback) {
106  requestCallback(*this);
107  }
108  }
109 
110 private:
111  static void IRAM_ATTR uartCallbackStatic(smg_uart_t* uart, uint32_t status);
112  void IRAM_ATTR uartCallback(uint32_t status);
113  void receiveComplete();
114 
115 private:
116  Serial& serial;
117  SetDirectionCallback setDirectionCallback{nullptr};
118  Request* request{nullptr};
119  Request* transmitCompleteRequest{nullptr};
120  uint8_t segment{0};
121  OnRequestDelegate requestCallback;
122  SimpleTimer timer;
123  Serial::Config savedConfig{};
124 };
125 
126 } // namespace RS485
127 } // namespace IO
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:53
void setSegment(uint8_t segment)
Definition: IOControl/include/IO/RS485/Controller.h:95
void onRequest(OnRequestDelegate callback)
Definition: IOControl/include/IO/RS485/Controller.h:90
void onSetDirection(SetDirectionCallback callback)
Set the transmit callback handler.
Definition: IOControl/include/IO/RS485/Controller.h:64
Definition: IOControl/include/IO/Controller.h:25
#define DECLARE_FSTR(name)
Declare a global FSTR::String& reference.
Definition: String.hpp:63
Definition: IOControl/include/IO/RS485/Controller.h:32
Definition: Libraries/IOControl/include/IO/Serial.h:35
Request represents a single user request/response over a bus.
Definition: IOControl/include/IO/Request.h:75
const FlashString & classname() const override
Get the class name for this Controller.
Definition: IOControl/include/IO/RS485/Controller.h:39
describes a counted string stored in flash memory
Definition: String.hpp:173
Direction
Some controllers specify a transfer direction.
Definition: IOControl/include/IO/Controller.h:32
Wrapper class for the UART driver.
Definition: Libraries/IOControl/include/IO/Serial.h:32
virtual void handleIncomingRequest()
Definition: IOControl/include/IO/RS485/Controller.h:103
Event
Definition: Event.h:36
Serial & getSerial()
Definition: IOControl/include/IO/RS485/Controller.h:81
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:74
Controller(Serial &serial, uint8_t instance)
Definition: IOControl/include/IO/RS485/Controller.h:35