25 #ifndef GRBL_PLATFORM_HPP__
26 #define GRBL_PLATFORM_HPP__
37 #include <ccut/Queue.hpp>
38 #include <ccut/Thread.hpp>
39 #include <ccut/yml.hpp>
41 #include "GrblAxis.hpp"
42 #include "GrblGpio.hpp"
43 #include "GrblTrigger.hpp"
44 #include "platform/PlatformBase.hpp"
45 #include "util/grbl/GrblParser.hpp"
46 #include "util/grbl/GrblTypes.hpp"
65 typedef std::shared_ptr<GrblPlatform> Shared;
67 typedef std::size_t Line;
70 typedef std::map<std::string, LocalSettingHandler> LocalSettingMap;
74 typedef std::map<std::string, grbl::GrblParser::SettingDesc> SettingMap;
84 static inline PlatformBase::Shared
create(
const ccut::yml::NodeRef &config)
91 inline std::shared_ptr<GrblPlatform> shared_from_this()
93 return std::static_pointer_cast<GrblPlatform>(
94 PlatformBase::shared_from_this());
97 inline std::shared_ptr<const GrblPlatform> shared_from_this()
const
99 return std::static_pointer_cast<const GrblPlatform>(
100 PlatformBase::shared_from_this());
104 DeviceTypeList getSupportedDevices()
const override;
105 DeviceList generateDevices(
const DeviceTypeList &deviceType)
override;
107 void stop()
override;
108 void wake()
override;
110 static const std::chrono::milliseconds defaultInterval;
114 std::future<T> run(std::function<
void(
ImmediateCmd &, Context &)> fun);
125 std::future<void>
send(
const std::string &cmd,
126 std::function<
bool(
const std::string &)> msg = {},
127 const std::chrono::milliseconds &timeout =
128 std::chrono::milliseconds{1000});
130 void updateAxisSetting(
const std::string &axis,
131 grbl::SettingId settingId,
132 const std::string &value);
133 units::Value getLastAxisPosition(
const std::string &axis)
const;
134 units::Value getLastAxisResolution(
const std::string &axis)
const;
136 uint8_t getTrigger(
const std::string &uid);
137 uint8_t getGpio(
const std::string &uid);
138 grbl::Axis getAxis(
const std::string &uid);
139 void clearQueues(
const std::string &msg,
bool clearImmediates =
true);
141 static const std::string s_loggerCat;
144 friend class MGrblPlatform;
145 friend class MFEPlatform;
146 explicit GrblPlatform(
const ccut::yml::NodeRef &node);
151 mutable std::mutex m_lock;
152 std::queue<MotionCmd> m_queue;
153 std::queue<ImmediateCmd> m_immediate;
154 std::queue<MotionCmd> m_pending;
155 std::map<std::string, AxisData> m_axisMap;
156 std::pair<std::string, uint8_t> m_trigger;
157 std::map<std::string, uint8_t> m_gpioMap;
158 ccut::Connection m_dataConn;
160 std::unique_ptr<Context> m_ctx;
169 explicit GrblPlatform(
const std::string &prefix,
170 const std::string &
id,
171 std::unique_ptr<grbl::GrblDeviceBase> &&device);
174 void processMessage(
const std::string &message);
175 bool processMotion();
176 bool processImmediate();
177 void onStateMessage();
180 void loadSettingsDesc();
184 void generateGpios(
const Context &ctx,
185 const std::list<grbl::GrblParser::PinInfo> &pins,
186 std::list<GrblGpio::Shared> &out);
187 void generateTriggers(Context &ctx,
188 const std::list<grbl::GrblParser::PinInfo> &pins,
189 std::list<GrblTrigger::Shared> &out);
190 void generateAxes(
const Context &ctx,
192 std::list<GrblAxis::Shared> &out);
194 void thread_func()
override;
196 static constexpr std::size_t maxQueueSize = 1024;
204 #include "GrblPlatform.hxx"
main motion-lib namespace