MotionLib  1.0.0
SamBuCa motion library
MGrblPlatformData.hpp
1 /*
2 ** Copyright (C) 2025 CERN
3 **
4 ** This software is provided 'as-is', without any express or implied
5 ** warranty. In no event will the authors be held liable for any damages
6 ** arising from the use of this software.
7 **
8 ** Permission is granted to anyone to use this software for any purpose,
9 ** including commercial applications, and to alter it and redistribute it
10 ** freely, subject to the following restrictions:
11 **
12 ** 1. The origin of this software must not be misrepresented; you must not
13 ** claim that you wrote the original software. If you use this software
14 ** in a product, an acknowledgment in the product documentation would be
15 ** appreciated but is not required.
16 ** 2. Altered source versions must be plainly marked as such, and must not be
17 ** misrepresented as being the original software.
18 ** 3. This notice may not be removed or altered from any source distribution.
19 **
20 ** Created on: 2025-04-17T13:04:55
21 ** Author: Sylvain Fargier <sylvain.fargier@cern.ch>
22 */
23 
24 #ifndef MGRBLPLATFORMDATA_HPP__
25 #define MGRBLPLATFORMDATA_HPP__
26 
27 #if !defined(GCC_LINT)
28 #pragma once
29 #endif
30 
31 #include "MGrblPlatform.hpp"
32 #include "util/grbl/GrblDeviceBase.hpp"
33 
34 namespace smc {
35 namespace internal {
36 
38 {
39  Context(const std::string &prefix, const ccut::yml::NodeRef &ref);
40  virtual ~Context() = default;
41 
42  const std::string prefix;
43  const std::string id;
44 
45  std::chrono::steady_clock::time_point nextPoll;
46 
47  void checkReply(grbl::ErrorCode rc);
48 
49  std::set<mgrbl::Instance> used;
50 
51  std::shared_ptr<grbl::GrblDeviceBase> device;
52 };
53 
55 {
56  typedef std::function<void(ImmediateCmd &, Context &)> Function;
57 
58  explicit ImmediateCmd(Function run, PromiseBase *prom) :
59  run(run),
60  prom(prom)
61  {}
62  Function run;
63  std::unique_ptr<PromiseBase> prom;
64 };
65 
66 template<typename T>
67 std::future<T> MGrblPlatform::run(
68  std::function<void(ImmediateCmd &, Context &)> run)
69 {
70  ImmediateCmd cmd{run, new Promise<T>()};
71  std::future<T> ret = cmd.prom->get<T>().get_future();
72 
73  std::unique_lock<std::mutex> lock(m_lock);
74  if (m_started)
75  {
76  m_immediate.push(std::move(cmd));
77  lock.unlock();
78  wake();
79  }
80  else
81  cmd.prom->set_exception(
82  Exception(ErrorCode::Canceled, "platform stopped"));
83  return ret;
84 }
85 
86 } // namespace internal
87 } // namespace smc
88 
89 #endif
Exception thrown by MotionController in case of issues with command.
Definition: Exception.hpp:61
main motion-lib namespace
Definition: Client.cpp:30
base structure for promise handline
Definition: Promise.hpp:44
a typed promise
Definition: Promise.hpp:57