[Ovmsdev] boot loop with RegisterCommand
sharkcow
sharkcow at gmx.de
Thu Dec 17 22:02:23 HKT 2020
Sorry, obviously should have included this. The includes are copied from
the twizy files.
In my main header file, I have:
class OvmsVehicleVWeUp : public OvmsVehicle
{
...
protected:
OvmsCommand *cmd_xvu;
...
public:
// Shell commands:
static void shell_obd_request(int verbosity, OvmsWriter* writer,
OvmsCommand* cmd, int argc, const char* const* argv);
...
}
in the main cpp file:
OvmsVehicleVWeUp::OvmsVehicleVWeUp()
{
...
// init commands:
cmd_xvu = MyCommandApp.RegisterCommand("xvu", "VW e-Up");
...
}
in the obd cpp file:
void OvmsVehicleVWeUp::OBDInit()
{
..
// init commands:
OvmsCommand* cmd;
OvmsCommand* obd;
obd = cmd_xvu->RegisterCommand("obd", "OBD2 tools");
cmd = obd->RegisterCommand("request", "Send OBD2 request, output
response");
cmd->RegisterCommand("device", "Send OBD2 request to a device",
shell_obd_request, "<txid> <rxid> <request>", 3, 3);
cmd->RegisterCommand("broadcast", "Send OBD2 request as broadcast",
shell_obd_request, "<request>", 1, 1);
cmd->RegisterCommand("01motelec", "Send OBD2 request to ECU01 motor
electronics", shell_obd_request, "<request>", 1, 1);
}
Am 17.12.20 um 08:54 schrieb Mark Webb-Johnson:
> Can you post an extract of your command registry code?
>
>
>> On 17 Dec 2020, at 2:50 PM, sharkcow <sharkcow at gmx.de> wrote:
>>
>> Hi all,
>>
>> I tried to steal some code from the Twizy module but obviously don't
>> understand how it works... my code results in a boot loop.
>>
>> I would like to have a possibility to test OBD codes in the shell
>> (something I think would be immensely useful as a general function; that
>> way, getting started with a new vehicle would be much easier.)
>>
>> Anyway, the problem seems to be in the lookup of the command name I'm
>> trying to register, see stack trace below. Any help is greatly appreciated!
>>
>> Thanks,
>>
>> sharkcow
>>
>>
>> 0x400fc115 is in std::_Rb_tree<char const*, std::pair<char const* const,
>> OvmsCommand*>, std::_Select1st<std::pair<char const* const,
>> OvmsCommand*> >, CompareCharPtr, std::allocator<std::pair<char const*
>> const, OvmsCommand*> > >::find(char const* const&)
>> (/opt/esp/xtensa-esp32-elf/xtensa-esp32-elf/include/c++/5.2.0/bits/stl_tree.h:663).
>> 658 (this->_M_impl._M_header._M_parent);
>> 659 }
>> 660
>> 661 _Link_type
>> 662 _M_end() _GLIBCXX_NOEXCEPT
>> 663 { return reinterpret_cast<_Link_type>(&this->_M_impl._M_header); }
>> 664
>> 665 _Const_Link_type
>> 666 _M_end() const _GLIBCXX_NOEXCEPT
>> 667 { return
>> reinterpret_cast<_Const_Link_type>(&this->_M_impl._M_header); }
>> 0x400fc15c is in OvmsCommandMap::FindCommand(char const*)
>> (/opt/esp/xtensa-esp32-elf/xtensa-esp32-elf/include/c++/5.2.0/bits/stl_map.h:846).
>> 841 * past-the-end ( @c end() ) iterator.
>> 842 */
>> 843
>> 844 iterator
>> 845 find(const key_type& __x)
>> 846 { return _M_t.find(__x); }
>> 847
>> 848 #if __cplusplus > 201103L
>> 849 template<typename _Kt>
>> 850 auto
>> 0x400fd87e is in OvmsCommand::RegisterCommand(char const*, char const*,
>> void (*)(int, OvmsWriter*, OvmsCommand*, int, char const* const*), char
>> const*, int, int, bool, int (*)(OvmsWriter*, OvmsCommand*, int, char
>> const* const*, bool))
>> (/opt/Open-Vehicle-Monitoring-System-3_Unh/vehicle/OVMS.V3/main/ovms_command.cpp:542).
>> 537 return m_parent;
>> 538 }
>> 539
>> 540 OvmsCommand* OvmsCommand::FindCommand(const char* name)
>> 541 {
>> 542 return m_children.FindCommand(name);
>> 543 }
>> 544
>> 545 void help(int verbosity, OvmsWriter* writer, OvmsCommand* cmd, int
>> argc, const char* const* argv)
>> 546 {
>> 0x401ac67a is in OvmsVehicleVWeUp::OBDInit()
>> (/opt/Open-Vehicle-Monitoring-System-3_Unh/vehicle/OVMS.V3/components/vehicle_vweup_all/src/vweup_obd.cpp:228).
>> 223 // cmd->RegisterCommand("reset", "Reset OVMS DTC statistics",
>> shell_obd_resetdtc,
>> 224 // "Resets internal DTC buffer and presence counters.\n"
>> 225 // "No change is done on the car side.");
>> 226
>> 227 OvmsCommand* obd;
>> 228 obd = cmd_xvu->RegisterCommand("obd", "OBD2 tools");
>> 229 cmd = obd->RegisterCommand("request", "Send OBD2 request, output
>> response");
>> 230 cmd->RegisterCommand("device", "Send OBD2 request to a device",
>> shell_obd_request, "<txid> <rxid> <request>", 3, 3);
>> 231 cmd->RegisterCommand("broadcast", "Send OBD2 request as
>> broadcast", shell_obd_request, "<request>", 1, 1);
>> 232 cmd->RegisterCommand("01motelec", "Send OBD2 request to ECU01
>> motor electronics", shell_obd_request, "<request>", 1, 1);
>> 0x401abd4e is in OvmsVehicleVWeUp::ConfigChanged(OvmsConfigParam*)
>> (/opt/Open-Vehicle-Monitoring-System-3_Unh/vehicle/OVMS.V3/components/vehicle_vweup_all/src/vehicle_vweup_all.cpp:210).
>> 205 if (vweup_enable_t26)
>> 206 T26Init();
>> 207 vweup_con = vweup_enable_obd * 2 + vweup_enable_t26;
>> 208 // ESP_LOGD(TAG,"vweup_con: %i",vweup_con);
>> 209 if (vweup_enable_obd || (vweup_modelyear<2020 &&
>> vweup_modelyear_new>2019) || (vweup_modelyear_new<2020 &&
>> vweup_modelyear>2019)) // switch between generations: reload OBD poll list
>> 210 OBDInit();
>> 211 if (!vweup_enable_obd)
>> 212 OBDDeInit();
>> 213 vweup_modelyear = vweup_modelyear_new;
>> 214 if (!vweup_con)
>> 0x401abf5f is in OvmsVehicleVWeUp::OvmsVehicleVWeUp()
>> (/opt/Open-Vehicle-Monitoring-System-3_Unh/vehicle/OVMS.V3/components/vehicle_vweup_all/src/vehicle_vweup_all.cpp:124).
>> 119 {
>> 120 ESP_LOGI(TAG, "Start VW e-Up vehicle module");
>> 121
>> 122 // init configs:
>> 123 MyConfig.RegisterParam("xvu", "VW e-Up", true, true);
>> 124 ConfigChanged(NULL);
>> 125
>> 126 // if (vweup_con % 2){ // T26A connected
>> 127 // }
>> 128 // if (vweup_con > 1){ // OBD connected
>> 0x401abf9a is in CreateVehicle<OvmsVehicleVWeUp>()
>> (/opt/Open-Vehicle-Monitoring-System-3_Unh/vehicle/OVMS.V3/components/vehicle/vehicle.h:456).
>> 451 virtual bool FormatBmsAlerts(int verbosity, OvmsWriter* writer,
>> bool show_warnings);
>> 452 };
>> 453
>> 454 template<typename Type> OvmsVehicle* CreateVehicle()
>> 455 {
>> 456 return new Type;
>> 457 }
>> 458
>> 459 class OvmsVehicleFactory
>> 460 {
>> 0x401656ff is in OvmsVehicleFactory::NewVehicle(char const*)
>> (/opt/Open-Vehicle-Monitoring-System-3_Unh/vehicle/OVMS.V3/components/vehicle/vehicle.cpp:873).
>> 868 OvmsVehicle* OvmsVehicleFactory::NewVehicle(const char* VehicleType)
>> 869 {
>> 870 OvmsVehicleFactory::map_vehicle_t::iterator iter =
>> m_vmap.find(VehicleType);
>> 871 if (iter != m_vmap.end())
>> 872 {
>> 873 return iter->second.construct();
>> 874 }
>> 875 return NULL;
>> 876 }
>> 877
>> 0x40165737 is in OvmsVehicleFactory::SetVehicle(char const*)
>> (/opt/Open-Vehicle-Monitoring-System-3_Unh/vehicle/OVMS.V3/components/vehicle/vehicle.cpp:900).
>> 895 m_currentvehicle->m_ready = false;
>> 896 delete m_currentvehicle;
>> 897 m_currentvehicle = NULL;
>> 898 m_currentvehicletype.clear();
>> 899 }
>> 900 m_currentvehicle = NewVehicle(type);
>> 901 if (m_currentvehicle)
>> 902 {
>> 903 m_currentvehicle->m_ready = true;
>> 904 }
>> 0x40165825 is in OvmsVehicleFactory::AutoInit()
>> (/opt/Open-Vehicle-Monitoring-System-3_Unh/vehicle/OVMS.V3/components/vehicle/vehicle.cpp:914).
>> 909
>> 910 void OvmsVehicleFactory::AutoInit()
>> 911 {
>> 912 std::string type = MyConfig.GetParamValue("auto", "vehicle.type");
>> 913 if (!type.empty())
>> 914 SetVehicle(type.c_str());
>> 915 }
>> 916
>> 917 OvmsVehicle* OvmsVehicleFactory::ActiveVehicle()
>> 918 {
>> 0x400f80f3 is in Housekeeping::Init(std::__cxx11::basic_string<char,
>> std::char_traits<char>, std::allocator<char> >, void*)
>> (/opt/Open-Vehicle-Monitoring-System-3_Unh/vehicle/OVMS.V3/main/ovms_housekeeping.cpp:208).
>> 203 ESP_LOGI(TAG, "Auto init modem (free: %zu bytes)",
>> heap_caps_get_free_size(MALLOC_CAP_8BIT|MALLOC_CAP_INTERNAL));
>> 204 MyPeripherals->m_simcom->AutoInit();
>> 205 #endif // #ifdef CONFIG_OVMS_COMP_MODEM_SIMCOM
>> 206
>> 207 ESP_LOGI(TAG, "Auto init vehicle (free: %zu bytes)",
>> heap_caps_get_free_size(MALLOC_CAP_8BIT|MALLOC_CAP_INTERNAL));
>> 208 MyVehicleFactory.AutoInit();
>> 209
>> 210 #ifdef CONFIG_OVMS_COMP_OBD2ECU
>> 211 ESP_LOGI(TAG, "Auto init obd2ecu (free: %zu bytes)",
>> heap_caps_get_free_size(MALLOC_CAP_8BIT|MALLOC_CAP_INTERNAL));
>> 212 obd2ecuInit.AutoInit();
>> 0x400f7d06 is in std::_Function_handler<void
>> (std::__cxx11::basic_string<char, std::char_traits<char>,
>> std::allocator<char> >, void*), std::_Bind<std::_Mem_fn<void
>> (Housekeeping::*)(std::__cxx11::basic_string<char,
>> std::char_traits<char>, std::allocator<char> >, void*)> (Housekeeping*,
>> std::_Placeholder<1>, std::_Placeholder<2>)> >::_M_invoke(std::_Any_data
>> const&, std::__cxx11::basic_string<char, std::char_traits<char>,
>> std::allocator<char> >&&, void*&&)
>> (/opt/esp/xtensa-esp32-elf/xtensa-esp32-elf/include/c++/5.2.0/functional:600).
>> 595 template<typename... _Args, typename _Req
>> 596 = _Require<typename _Traits::__lvalue,
>> 597 _CheckArgs<_Pack<_Args...>>>>
>> 598 result_type
>> 599 operator()(_Class* __object, _Args&&... __args) const
>> 600 { return (__object->*_M_pmf)(std::forward<_Args>(__args)...); }
>> 601
>> 602 // Handle smart pointers, references and pointers to derived
>> 603 template<typename _Tp, typename... _Args, typename _Req
>> 604 = _Require<_NotSame<_Class, _Tp>, _NotSame<_Class*, _Tp>,
>> 0x400f457e is in std::function<void (std::__cxx11::basic_string<char,
>> std::char_traits<char>, std::allocator<char> >,
>> void*)>::operator()(std::__cxx11::basic_string<char,
>> std::char_traits<char>, std::allocator<char> >, void*) const
>> (/opt/esp/xtensa-esp32-elf/xtensa-esp32-elf/include/c++/5.2.0/functional:2271).
>> 2266 function<_Res(_ArgTypes...)>::
>> 2267 operator()(_ArgTypes... __args) const
>> 2268 {
>> 2269 if (_M_empty())
>> 2270 __throw_bad_function_call();
>> 2271 return _M_invoker(_M_functor,
>> std::forward<_ArgTypes>(__args)...);
>> 2272 }
>> 2273
>> 2274 #if __cpp_rtti
>> 2275 template<typename _Res, typename... _ArgTypes>
>> 0x400f4711 is in OvmsEvents::HandleQueueSignalEvent(event_queue_t*)
>> (/opt/Open-Vehicle-Monitoring-System-3_Unh/vehicle/OVMS.V3/main/ovms_events.cpp:229).
>> 224 {
>> 225 for (EventCallbackList::iterator itc=el->begin();
>> itc!=el->end(); ++itc)
>> 226 {
>> 227 m_current_started = monotonictime;
>> 228 m_current_callback = *itc;
>> 229 m_current_callback->m_callback(m_current_event,
>> msg->body.signal.data);
>> 230 m_current_callback = NULL;
>> 231 }
>> 232 }
>> 233 }
>> 0x400f47f4 is in OvmsEvents::EventTask()
>> (/opt/Open-Vehicle-Monitoring-System-3_Unh/vehicle/OVMS.V3/main/ovms_events.cpp:187).
>> 182 {
>> 183 case EVENT_none:
>> 184 break;
>> 185 case EVENT_signal:
>> 186 m_current_event = msg.body.signal.event;
>> 187 HandleQueueSignalEvent(&msg);
>> 188 esp_task_wdt_reset(); // Reset WATCHDOG timer for this task
>> 189 m_current_event.clear();
>> 190 break;
>> 191 default:
>> 0x400f4859 is in EventLaunchTask(void*)
>> (/opt/Open-Vehicle-Monitoring-System-3_Unh/vehicle/OVMS.V3/main/ovms_events.cpp:57).
>> 52
>> 53 void EventLaunchTask(void *pvParameters)
>> 54 {
>> 55 OvmsEvents* me = (OvmsEvents*)pvParameters;
>> 56
>> 57 me->EventTask();
>> 58 }
>> 59
>> 60 void event_trace(int verbosity, OvmsWriter* writer, OvmsCommand* cmd,
>> int argc, const char* const* argv)
>> 61 {
>>
>> _______________________________________________
>> OvmsDev mailing list
>> OvmsDev at lists.openvehicles.com
>> http://lists.openvehicles.com/mailman/listinfo/ovmsdev
>
> _______________________________________________
> OvmsDev mailing list
> OvmsDev at lists.openvehicles.com
> http://lists.openvehicles.com/mailman/listinfo/ovmsdev
>
More information about the OvmsDev
mailing list