[Ovmsdev] boot loop with RegisterCommand
Mark Webb-Johnson
mark at webb-johnson.net
Thu Dec 17 15:54:17 HKT 2020
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
More information about the OvmsDev
mailing list