Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Diagnose up-to 10 batteries #1711

Merged
merged 3 commits into from
Feb 21, 2022

Conversation

amilcarlucas
Copy link
Contributor

@amilcarlucas amilcarlucas commented Feb 17, 2022

I am open to suggestions to avoid the third commit

@amilcarlucas
Copy link
Contributor Author

Tested to work in hardware, but I do not like the third commit, for obvious reasons.

@amilcarlucas
Copy link
Contributor Author

@vooon can you help me out here?

@vooon
Copy link
Member

vooon commented Feb 18, 2022

I think emplace should construct object, so you should only provide constructor arguments. Also for single-arg it's recommended to use explicit keyword.
Mutex makes class non-copyable, so that's the reason, but what if we use move-semantics?

Also can we use std::unordered_map<id, diag> instead of vector, so we won't be limited by 10 bats.

@amilcarlucas
Copy link
Contributor Author

amilcarlucas commented Feb 18, 2022

Thanks, but the error is still there:

/usr/include/c++/7/ext/new_allocator.h: In instantiation of ‘void __gnu_cxx::new_allocator<_Tp>::construct(_Up*, _Args&& ...) [with _Up = mavros::std_plugins::BatteryStatusDiag; _Args = {mavros::std_plugins::BatteryStatusDiag}; _Tp = mavros::std_plugins::BatteryStatusDiag]’:
/usr/include/c++/7/bits/alloc_traits.h:475:4:   required from ‘static void std::allocator_traits<std::allocator<_CharT> >::construct(std::allocator_traits<std::allocator<_CharT> >::allocator_type&, _Up*, _Args&& ...) [with _Up = mavros::std_plugins::BatteryStatusDiag; _Args = {mavros::std_plugins::BatteryStatusDiag}; _Tp = mavros::std_plugins::BatteryStatusDiag; std::allocator_traits<std::allocator<_CharT> >::allocator_type = std::allocator<mavros::std_plugins::BatteryStatusDiag>]’
/usr/include/c++/7/bits/vector.tcc:100:30:   required from ‘void std::vector<_Tp, _Alloc>::emplace_back(_Args&& ...) [with _Args = {mavros::std_plugins::BatteryStatusDiag}; _Tp = mavros::std_plugins::BatteryStatusDiag; _Alloc = std::allocator<mavros::std_plugins::BatteryStatusDiag>]’
..../mavros/mavros/src/plugins/sys_status.cpp:455:65:   required from here
/usr/include/c++/7/ext/new_allocator.h:136:4: error: use of deleted function ‘mavros::std_plugins::BatteryStatusDiag::BatteryStatusDiag(mavros::std_plugins::BatteryStatusDiag&&)’
  { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
..../mavros/mavros/src/plugins/sys_status.cpp:286:7: note: ‘mavros::std_plugins::BatteryStatusDiag::BatteryStatusDiag(mavros::std_plugins::BatteryStatusDiag&&)’ is implicitly deleted because the default definition would be ill-formed:
 class BatteryStatusDiag : public diagnostic_updater::DiagnosticTask
       ^~~~~~~~~~~~~~~~~
..../mavros/mavros/src/plugins/sys_status.cpp:286:7: error: use of deleted function ‘std::mutex::mutex(const std::mutex&)’
In file included from /usr/include/c++/7/mutex:43:0,
                 from ..../mavros/libmavconn/include/mavconn/interface.h:27,
                 from ..../mavros/mavros/include/mavros/mavros_plugin.h:24,
                 from ..../mavros/mavros/src/plugins/sys_status.cpp:17:
/usr/include/c++/7/bits/std_mutex.h:97:5: note: declared here
     mutex(const mutex&) = delete;
     ^~~~~
In file included from /usr/include/c++/7/vector:62:0,
                 from ..../mavros/mavros/include/mavros/mavros_plugin.h:21,
                 from ..../mavros/mavros/src/plugins/sys_status.cpp:17:
/usr/include/c++/7/bits/stl_construct.h: In instantiation of ‘void std::_Construct(_T1*, _Args&& ...) [with _T1 = mavros::std_plugins::BatteryStatusDiag; _Args = {mavros::std_plugins::BatteryStatusDiag}]’:
/usr/include/c++/7/bits/stl_uninitialized.h:83:18:   required from ‘static _ForwardIterator std::__uninitialized_copy<_TrivialValueTypes>::__uninit_copy(_InputIterator, _InputIterator, _ForwardIterator) [with _InputIterator = std::move_iterator<mavros::std_plugins::BatteryStatusDiag*>; _ForwardIterator = mavros::std_plugins::BatteryStatusDiag*; bool _TrivialValueTypes = false]’
/usr/include/c++/7/bits/stl_uninitialized.h:134:15:   required from ‘_ForwardIterator std::uninitialized_copy(_InputIterator, _InputIterator, _ForwardIterator) [with _InputIterator = std::move_iterator<mavros::std_plugins::BatteryStatusDiag*>; _ForwardIterator = mavros::std_plugins::BatteryStatusDiag*]’
/usr/include/c++/7/bits/stl_uninitialized.h:289:37:   required from ‘_ForwardIterator std::__uninitialized_copy_a(_InputIterator, _InputIterator, _ForwardIterator, std::allocator<_Tp>&) [with _InputIterator = std::move_iterator<mavros::std_plugins::BatteryStatusDiag*>; _ForwardIterator = mavros::std_plugins::BatteryStatusDiag*; _Tp = mavros::std_plugins::BatteryStatusDiag]’
/usr/include/c++/7/bits/stl_vector.h:1263:35:   required from ‘std::vector<_Tp, _Alloc>::pointer std::vector<_Tp, _Alloc>::_M_allocate_and_copy(std::vector<_Tp, _Alloc>::size_type, _ForwardIterator, _ForwardIterator) [with _ForwardIterator = std::move_iterator<mavros::std_plugins::BatteryStatusDiag*>; _Tp = mavros::std_plugins::BatteryStatusDiag; _Alloc = std::allocator<mavros::std_plugins::BatteryStatusDiag>; std::vector<_Tp, _Alloc>::pointer = mavros::std_plugins::BatteryStatusDiag*; std::vector<_Tp, _Alloc>::size_type = long unsigned int]’
/usr/include/c++/7/bits/vector.tcc:73:40:   required from ‘void std::vector<_Tp, _Alloc>::reserve(std::vector<_Tp, _Alloc>::size_type) [with _Tp = mavros::std_plugins::BatteryStatusDiag; _Alloc = std::allocator<mavros::std_plugins::BatteryStatusDiag>; std::vector<_Tp, _Alloc>::size_type = long unsigned int]’
..../mavros/mavros/src/plugins/sys_status.cpp:454:42:   required from here
/usr/include/c++/7/bits/stl_construct.h:75:7: error: use of deleted function ‘mavros::std_plugins::BatteryStatusDiag::BatteryStatusDiag(mavros::std_plugins::BatteryStatusDiag&&)’
     { ::new(static_cast<void*>(__p)) _T1(std::forward<_Args>(__args)...); }
       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/include/c++/7/functional:58:0,
                 from ..../mavros/mavros/include/mavros/mavros_plugin.h:22,
                 from ..../mavros/mavros/src/plugins/sys_status.cpp:17:
/usr/include/c++/7/bits/std_function.h:685:7: error: ‘std::function<_Res(_ArgTypes ...)>::function(_Functor) [with _Functor = mavros::plugin::PluginBase::make_handler(void (_C::*)(const mavlink_message_t*, _T&)) [with _C = mavros::std_plugins::SystemStatusPlugin; _T = mavlink::minimal::msg::HEARTBEAT; mavros::plugin::PluginBase::HandlerInfo = std::tuple<unsigned int, const char*, long unsigned int, std::function<void(const mavlink::__mavlink_message*, mavconn::Framing)> >; mavlink::mavlink_message_t = mavlink::__mavlink_message]::<lambda(const mavlink_message_t*, mavconn::Framing)>; <template-parameter-2-2> = void; <template-parameter-2-3> = void; _Res = void; _ArgTypes = {const mavlink::__mavlink_message*, mavconn::Framing}]’, declared using local type ‘mavros::plugin::PluginBase::make_handler(void (_C::*)(const mavlink_message_t*, _T&)) [with _C = mavros::std_plugins::SystemStatusPlugin; _T = mavlink::minimal::msg::HEARTBEAT; mavros::plugin::PluginBase::HandlerInfo = std::tuple<unsigned int, const char*, long unsigned int, std::function<void(const mavlink::__mavlink_message*, mavconn::Framing)> >; mavlink::mavlink_message_t = mavlink::__mavlink_message]::<lambda(const mavlink_message_t*, mavconn::Framing)>’, is used but never defined [-fpermissive]
       function<_Res(_ArgTypes...)>::
       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/c++/7/bits/std_function.h:685:7: error: ‘std::function<_Res(_ArgTypes ...)>::function(_Functor) [with _Functor = mavros::plugin::PluginBase::make_handler(void (_C::*)(const mavlink_message_t*, _T&)) [with _C = mavros::std_plugins::SystemStatusPlugin; _T = mavlink::common::msg::SYS_STATUS; mavros::plugin::PluginBase::HandlerInfo = std::tuple<unsigned int, const char*, long unsigned int, std::function<void(const mavlink::__mavlink_message*, mavconn::Framing)> >; mavlink::mavlink_message_t = mavlink::__mavlink_message]::<lambda(const mavlink_message_t*, mavconn::Framing)>; <template-parameter-2-2> = void; <template-parameter-2-3> = void; _Res = void; _ArgTypes = {const mavlink::__mavlink_message*, mavconn::Framing}]’, declared using local type ‘mavros::plugin::PluginBase::make_handler(void (_C::*)(const mavlink_message_t*, _T&)) [with _C = mavros::std_plugins::SystemStatusPlugin; _T = mavlink::common::msg::SYS_STATUS; mavros::plugin::PluginBase::HandlerInfo = std::tuple<unsigned int, const char*, long unsigned int, std::function<void(const mavlink::__mavlink_message*, mavconn::Framing)> >; mavlink::mavlink_message_t = mavlink::__mavlink_message]::<lambda(const mavlink_message_t*, mavconn::Framing)>’, is used but never defined [-fpermissive]
/usr/include/c++/7/bits/std_function.h:685:7: error: ‘std::function<_Res(_ArgTypes ...)>::function(_Functor) [with _Functor = mavros::plugin::PluginBase::make_handler(void (_C::*)(const mavlink_message_t*, _T&)) [with _C = mavros::std_plugins::SystemStatusPlugin; _T = mavlink::common::msg::STATUSTEXT; mavros::plugin::PluginBase::HandlerInfo = std::tuple<unsigned int, const char*, long unsigned int, std::function<void(const mavlink::__mavlink_message*, mavconn::Framing)> >; mavlink::mavlink_message_t = mavlink::__mavlink_message]::<lambda(const mavlink_message_t*, mavconn::Framing)>; <template-parameter-2-2> = void; <template-parameter-2-3> = void; _Res = void; _ArgTypes = {const mavlink::__mavlink_message*, mavconn::Framing}]’, declared using local type ‘mavros::plugin::PluginBase::make_handler(void (_C::*)(const mavlink_message_t*, _T&)) [with _C = mavros::std_plugins::SystemStatusPlugin; _T = mavlink::common::msg::STATUSTEXT; mavros::plugin::PluginBase::HandlerInfo = std::tuple<unsigned int, const char*, long unsigned int, std::function<void(const mavlink::__mavlink_message*, mavconn::Framing)> >; mavlink::mavlink_message_t = mavlink::__mavlink_message]::<lambda(const mavlink_message_t*, mavconn::Framing)>’, is used but never defined [-fpermissive]
/usr/include/c++/7/bits/std_function.h:685:7: error: ‘std::function<_Res(_ArgTypes ...)>::function(_Functor) [with _Functor = mavros::plugin::PluginBase::make_handler(void (_C::*)(const mavlink_message_t*, _T&)) [with _C = mavros::std_plugins::SystemStatusPlugin; _T = mavlink::ardupilotmega::msg::MEMINFO; mavros::plugin::PluginBase::HandlerInfo = std::tuple<unsigned int, const char*, long unsigned int, std::function<void(const mavlink::__mavlink_message*, mavconn::Framing)> >; mavlink::mavlink_message_t = mavlink::__mavlink_message]::<lambda(const mavlink_message_t*, mavconn::Framing)>; <template-parameter-2-2> = void; <template-parameter-2-3> = void; _Res = void; _ArgTypes = {const mavlink::__mavlink_message*, mavconn::Framing}]’, declared using local type ‘mavros::plugin::PluginBase::make_handler(void (_C::*)(const mavlink_message_t*, _T&)) [with _C = mavros::std_plugins::SystemStatusPlugin; _T = mavlink::ardupilotmega::msg::MEMINFO; mavros::plugin::PluginBase::HandlerInfo = std::tuple<unsigned int, const char*, long unsigned int, std::function<void(const mavlink::__mavlink_message*, mavconn::Framing)> >; mavlink::mavlink_message_t = mavlink::__mavlink_message]::<lambda(const mavlink_message_t*, mavconn::Framing)>’, is used but never defined [-fpermissive]
/usr/include/c++/7/bits/std_function.h:685:7: error: ‘std::function<_Res(_ArgTypes ...)>::function(_Functor) [with _Functor = mavros::plugin::PluginBase::make_handler(void (_C::*)(const mavlink_message_t*, _T&)) [with _C = mavros::std_plugins::SystemStatusPlugin; _T = mavlink::ardupilotmega::msg::HWSTATUS; mavros::plugin::PluginBase::HandlerInfo = std::tuple<unsigned int, const char*, long unsigned int, std::function<void(const mavlink::__mavlink_message*, mavconn::Framing)> >; mavlink::mavlink_message_t = mavlink::__mavlink_message]::<lambda(const mavlink_message_t*, mavconn::Framing)>; <template-parameter-2-2> = void; <template-parameter-2-3> = void; _Res = void; _ArgTypes = {const mavlink::__mavlink_message*, mavconn::Framing}]’, declared using local type ‘mavros::plugin::PluginBase::make_handler(void (_C::*)(const mavlink_message_t*, _T&)) [with _C = mavros::std_plugins::SystemStatusPlugin; _T = mavlink::ardupilotmega::msg::HWSTATUS; mavros::plugin::PluginBase::HandlerInfo = std::tuple<unsigned int, const char*, long unsigned int, std::function<void(const mavlink::__mavlink_message*, mavconn::Framing)> >; mavlink::mavlink_message_t = mavlink::__mavlink_message]::<lambda(const mavlink_message_t*, mavconn::Framing)>’, is used but never defined [-fpermissive]
/usr/include/c++/7/bits/std_function.h:685:7: error: ‘std::function<_Res(_ArgTypes ...)>::function(_Functor) [with _Functor = mavros::plugin::PluginBase::make_handler(void (_C::*)(const mavlink_message_t*, _T&)) [with _C = mavros::std_plugins::SystemStatusPlugin; _T = mavlink::common::msg::AUTOPILOT_VERSION; mavros::plugin::PluginBase::HandlerInfo = std::tuple<unsigned int, const char*, long unsigned int, std::function<void(const mavlink::__mavlink_message*, mavconn::Framing)> >; mavlink::mavlink_message_t = mavlink::__mavlink_message]::<lambda(const mavlink_message_t*, mavconn::Framing)>; <template-parameter-2-2> = void; <template-parameter-2-3> = void; _Res = void; _ArgTypes = {const mavlink::__mavlink_message*, mavconn::Framing}]’, declared using local type ‘mavros::plugin::PluginBase::make_handler(void (_C::*)(const mavlink_message_t*, _T&)) [with _C = mavros::std_plugins::SystemStatusPlugin; _T = mavlink::common::msg::AUTOPILOT_VERSION; mavros::plugin::PluginBase::HandlerInfo = std::tuple<unsigned int, const char*, long unsigned int, std::function<void(const mavlink::__mavlink_message*, mavconn::Framing)> >; mavlink::mavlink_message_t = mavlink::__mavlink_message]::<lambda(const mavlink_message_t*, mavconn::Framing)>’, is used but never defined [-fpermissive]
/usr/include/c++/7/bits/std_function.h:685:7: error: ‘std::function<_Res(_ArgTypes ...)>::function(_Functor) [with _Functor = mavros::plugin::PluginBase::make_handler(void (_C::*)(const mavlink_message_t*, _T&)) [with _C = mavros::std_plugins::SystemStatusPlugin; _T = mavlink::common::msg::EXTENDED_SYS_STATE; mavros::plugin::PluginBase::HandlerInfo = std::tuple<unsigned int, const char*, long unsigned int, std::function<void(const mavlink::__mavlink_message*, mavconn::Framing)> >; mavlink::mavlink_message_t = mavlink::__mavlink_message]::<lambda(const mavlink_message_t*, mavconn::Framing)>; <template-parameter-2-2> = void; <template-parameter-2-3> = void; _Res = void; _ArgTypes = {const mavlink::__mavlink_message*, mavconn::Framing}]’, declared using local type ‘mavros::plugin::PluginBase::make_handler(void (_C::*)(const mavlink_message_t*, _T&)) [with _C = mavros::std_plugins::SystemStatusPlugin; _T = mavlink::common::msg::EXTENDED_SYS_STATE; mavros::plugin::PluginBase::HandlerInfo = std::tuple<unsigned int, const char*, long unsigned int, std::function<void(const mavlink::__mavlink_message*, mavconn::Framing)> >; mavlink::mavlink_message_t = mavlink::__mavlink_message]::<lambda(const mavlink_message_t*, mavconn::Framing)>’, is used but never defined [-fpermissive]
/usr/include/c++/7/bits/std_function.h:685:7: error: ‘std::function<_Res(_ArgTypes ...)>::function(_Functor) [with _Functor = mavros::plugin::PluginBase::make_handler(void (_C::*)(const mavlink_message_t*, _T&)) [with _C = mavros::std_plugins::SystemStatusPlugin; _T = mavlink::common::msg::BATTERY_STATUS; mavros::plugin::PluginBase::HandlerInfo = std::tuple<unsigned int, const char*, long unsigned int, std::function<void(const mavlink::__mavlink_message*, mavconn::Framing)> >; mavlink::mavlink_message_t = mavlink::__mavlink_message]::<lambda(const mavlink_message_t*, mavconn::Framing)>; <template-parameter-2-2> = void; <template-parameter-2-3> = void; _Res = void; _ArgTypes = {const mavlink::__mavlink_message*, mavconn::Framing}]’, declared using local type ‘mavros::plugin::PluginBase::make_handler(void (_C::*)(const mavlink_message_t*, _T&)) [with _C = mavros::std_plugins::SystemStatusPlugin; _T = mavlink::common::msg::BATTERY_STATUS; mavros::plugin::PluginBase::HandlerInfo = std::tuple<unsigned int, const char*, long unsigned int, std::function<void(const mavlink::__mavlink_message*, mavconn::Framing)> >; mavlink::mavlink_message_t = mavlink::__mavlink_message]::<lambda(const mavlink_message_t*, mavconn::Framing)>’, is used but never defined [-fpermissive]
/usr/include/c++/7/bits/std_function.h:685:7: error: ‘std::function<_Res(_ArgTypes ...)>::function(_Functor) [with _Functor = mavros::plugin::PluginBase::make_handler(void (_C::*)(const mavlink_message_t*, _T&)) [with _C = mavros::std_plugins::SystemStatusPlugin; _T = mavlink::common::msg::ESTIMATOR_STATUS; mavros::plugin::PluginBase::HandlerInfo = std::tuple<unsigned int, const char*, long unsigned int, std::function<void(const mavlink::__mavlink_message*, mavconn::Framing)> >; mavlink::mavlink_message_t = mavlink::__mavlink_message]::<lambda(const mavlink_message_t*, mavconn::Framing)>; <template-parameter-2-2> = void; <template-parameter-2-3> = void; _Res = void; _ArgTypes = {const mavlink::__mavlink_message*, mavconn::Framing}]’, declared using local type ‘mavros::plugin::PluginBase::make_handler(void (_C::*)(const mavlink_message_t*, _T&)) [with _C = mavros::std_plugins::SystemStatusPlugin; _T = mavlink::common::msg::ESTIMATOR_STATUS; mavros::plugin::PluginBase::HandlerInfo = std::tuple<unsigned int, const char*, long unsigned int, std::function<void(const mavlink::__mavlink_message*, mavconn::Framing)> >; mavlink::mavlink_message_t = mavlink::__mavlink_message]::<lambda(const mavlink_message_t*, mavconn::Framing)>’, is used but never defined [-fpermissive]

@vooon
Copy link
Member

vooon commented Feb 18, 2022

I'll try to implement my thoughts, but that might take more than weekend.

@amilcarlucas
Copy link
Contributor Author

Thanks @vooon

@amilcarlucas
Copy link
Contributor Author

amilcarlucas commented Feb 18, 2022

Nevermind, I have fixed and tested it to run fine. I have multiple batteries with running mutexes now!

Copy link
Member

@vooon vooon left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, Thanks!

@vooon vooon added this to the Version 1.14 milestone Feb 21, 2022
@amilcarlucas amilcarlucas force-pushed the diagnose-up-to-n-batteries branch 2 times, most recently from 52af6dc to 56b695f Compare February 21, 2022 11:02
@vooon vooon closed this Feb 21, 2022
@vooon vooon reopened this Feb 21, 2022
@amilcarlucas
Copy link
Contributor Author

No clue why CI is complaining on this one.

Uses as many battery monitors as the user specified in min_voltage parameter.
Add myself as a contributor, this is not my first patch to this file
@amilcarlucas
Copy link
Contributor Author

OK, CI fixed :)

@vooon vooon merged commit 628f1cc into mavlink:master Feb 21, 2022
@amilcarlucas amilcarlucas deleted the diagnose-up-to-n-batteries branch February 21, 2022 15:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants