[Ovmsdev] boot loop with RegisterCommand
sharkcow
sharkcow at gmx.de
Thu Dec 17 22:35:14 HKT 2020
Thank you Michael, that was the right track: I call my OBDInit after
every config change, so that's where the loop came from. All good now :)
Am 17.12.20 um 15:17 schrieb Michael Balzer:
> Do you call OBDInit() after the cmd_xvu init?
>
> Regards,
> Michael
>
>
> Am 17.12.20 um 15:02 schrieb sharkcow:
>> 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
>>>
>> _______________________________________________
>> 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